From: Kilian Saffran Date: Thu, 29 Mar 2018 06:07:59 +0000 (+0200) Subject: v3 sat demo copy X-Git-Tag: 3.19.1~3 X-Git-Url: http://cloud.dks.lu/git/?a=commitdiff_plain;h=e8869a0b5df9911f1d7011c6dc4ccd7c304fad1d;p=creorga.git v3 sat demo copy --- diff --git a/app_v3satdemo/application.ini b/app_v3satdemo/application.ini new file mode 100644 index 0000000..d040848 --- /dev/null +++ b/app_v3satdemo/application.ini @@ -0,0 +1,12 @@ +[App] +Vendor=DKS +Name=Creorga +Version=DEV +BuildID=XXX +Copyright=Copyright (c) 2017 DKS sarl +ID=creorga@dks.lu +Profile=Creorga + +[Gecko] +MinVersion=24.* +MaxVersion=100.* diff --git a/app_v3satdemo/chrome.manifest b/app_v3satdemo/chrome.manifest new file mode 100644 index 0000000..5a2ee01 --- /dev/null +++ b/app_v3satdemo/chrome.manifest @@ -0,0 +1,12 @@ +content creorga chrome/content/ +locale branding fr-FR chrome/branding/locale/ +overlay chrome://creorga/content/creorga.xul chrome://creorga/content/modules/default_standard/default_standard.xul +overlay chrome://creorga/content/creorga.xul chrome://creorga/content/modules/presences/presences.xul +overlay chrome://creorga/content/creorga.xul chrome://creorga/content/modules/multisite/multisite.xul +overlay chrome://creorga/content/creorga.xul chrome://creorga/content/modules/accounting/accounting.xul +overlay chrome://creorga/content/creorga.xul chrome://creorga/content/modules/staff/staff.xul +overlay chrome://creorga/content/creorga.xul chrome://creorga/content/modules/forms/forms.xul +overlay chrome://creorga/content/creorga.xul chrome://creorga/content/modules/support/support.xul +overlay chrome://creorga/content/creorga.xul chrome://creorga/content/modules/reports/reports.xul +overlay chrome://creorga/content/creorga.xul chrome://creorga/content/modules/calendar/calendar.xul +overlay chrome://creorga/content/creorga.xul chrome://creorga/content/modules/logbook/logbook.xul diff --git a/app_v3satdemo/chrome.manifest_basic b/app_v3satdemo/chrome.manifest_basic new file mode 100644 index 0000000..c33db3e --- /dev/null +++ b/app_v3satdemo/chrome.manifest_basic @@ -0,0 +1,12 @@ +content creorga chrome/content/ +locale branding fr-FR chrome/branding/locale/ +overlay chrome://creorga/content/creorga.xul chrome://creorga/content/modules/presences/presences.xul +overlay chrome://creorga/content/creorga.xul chrome://creorga/content/modules/multisite/multisite.xul +overlay chrome://creorga/content/creorga.xul chrome://creorga/content/modules/staff/staff_basic.xul +overlay chrome://creorga/content/creorga.xul chrome://creorga/content/modules/forms/forms_basic.xul +overlay chrome://creorga/content/creorga.xul chrome://creorga/content/modules/support/support.xul +overlay chrome://creorga/content/creorga.xul chrome://creorga/content/modules/reports/reports.xul +overlay chrome://creorga/content/creorga.xul chrome://creorga/content/modules/calendar/calendar_basic.xul +overlay chrome://creorga/content/creorga.xul chrome://creorga/content/modules/logbook/logbook_basic.xul + + diff --git a/app_v3satdemo/chrome.manifest_localmanager b/app_v3satdemo/chrome.manifest_localmanager new file mode 100644 index 0000000..2696733 --- /dev/null +++ b/app_v3satdemo/chrome.manifest_localmanager @@ -0,0 +1,11 @@ +content creorga chrome/content/ +locale branding fr-FR chrome/branding/locale/ +overlay chrome://creorga/content/creorga.xul chrome://creorga/content/modules/presences/presences.xul +overlay chrome://creorga/content/creorga.xul chrome://creorga/content/modules/multisite/multisite.xul +overlay chrome://creorga/content/creorga.xul chrome://creorga/content/modules/staff/staff.xul +overlay chrome://creorga/content/creorga.xul chrome://creorga/content/modules/forms/forms_basic.xul +overlay chrome://creorga/content/creorga.xul chrome://creorga/content/modules/support/support.xul +overlay chrome://creorga/content/creorga.xul chrome://creorga/content/modules/reports/reports.xul +overlay chrome://creorga/content/creorga.xul chrome://creorga/content/modules/calendar/calendar.xul +overlay chrome://creorga/content/creorga.xul chrome://creorga/content/modules/logbook/logbook_basic.xul + diff --git a/app_v3satdemo/chrome/branding/locale/brand.dtd b/app_v3satdemo/chrome/branding/locale/brand.dtd new file mode 100644 index 0000000..ea88596 --- /dev/null +++ b/app_v3satdemo/chrome/branding/locale/brand.dtd @@ -0,0 +1,5 @@ + + + + + diff --git a/app_v3satdemo/chrome/branding/locale/brand.properties b/app_v3satdemo/chrome/branding/locale/brand.properties new file mode 100644 index 0000000..7176cfd --- /dev/null +++ b/app_v3satdemo/chrome/branding/locale/brand.properties @@ -0,0 +1,3 @@ +brandShortName=Creorga +brandFullName="Creorga - Creche Organisation Software" +vendorShortName=DKS s.à r.l. diff --git a/app_v3satdemo/chrome/content/3rdpartylicenses.html b/app_v3satdemo/chrome/content/3rdpartylicenses.html new file mode 100644 index 0000000..aa3261c --- /dev/null +++ b/app_v3satdemo/chrome/content/3rdpartylicenses.html @@ -0,0 +1,735 @@ + + + + + 3rd Party Licenses + + + +

Twitter Bootstrap

+

The MIT License (MIT)

+ +

Copyright (c) 2011-2016 Twitter, Inc.

+ +

Permission is hereby granted, free of charge, to any person obtaining a copy

+

of this software and associated documentation files (the "Software"), to deal

+

in the Software without restriction, including without limitation the rights

+

to use, copy, modify, merge, publish, distribute, sublicense, and/or sell

+

copies of the Software, and to permit persons to whom the Software is

+

furnished to do so, subject to the following conditions:

+ +

The above copyright notice and this permission notice shall be included in

+

all copies or substantial portions of the Software.

+ +

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

+

IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,

+

FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE

+

AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER

+

LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,

+

OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN

+

THE SOFTWARE.

+
+

JQuery

+

The MIT License (MIT)

+ +

Copyright (c) 2005, 2014 jQuery Foundation, Inc.

+ +

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

+ +

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

+ +

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+ +
+

DataTables

+

MIT license

+ +

Copyright (C) 2008-2016, SpryMedia Ltd.

+ +

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"),

+

to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,

+

and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

+ +

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

+ +

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,

+

FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,

+

WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+
+

Bootstrap Multiselect

+ +

Apache License, Version 2.0:

+ +

Copyright (c) 2012 - 2015 David Stutz

+ +

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0

+ +

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

+ +

BSD 3-Clause License:

+ +

Copyright (c) 2012 - 2015 David Stutz All rights reserved.

+ +

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

+ +

Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

+

Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

+

Neither the name of David Stutz nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

+ +

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

+
+

Bootstrap Timepicker

+

The MIT license

+ +

Permission is hereby granted, free of charge, to any person obtaining a copy

+

of this software and associated documentation files (the "Software"), to deal

+

in the Software without restriction, including without limitation the rights

+

to use, copy, modify, merge, publish, distribute, sublicense, and/or sell

+

copies of the Software, and to permit persons to whom the Software is furnished

+

to do so, subject to the following conditions:

+ +

The above copyright notice and this permission notice shall be included in all

+

copies or substantial portions of the Software.

+ +

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

+

IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,

+

FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE

+

AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER

+

LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,

+

OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN

+

THE SOFTWARE.

+
+

PDF-API2

+

This software is Copyright (c) 2015 by Steve Simms.

+ +

This is free software, licensed under:

+ +

The GNU Lesser General Public License, Version 2.1, February 1999

+ +

The GNU Lesser General Public License (LGPL)

+

Version 2.1, February 1999

+ +

(The master copy of this license lives on the GNU website.)

+ +

Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59

+

51 Franklin St, Suite 500, Boston, MA 02110-1335 USA

+ +

Everyone is permitted to copy and distribute verbatim copies

+

of this license document, but changing it is not allowed.

+ +

[This is the first released version of the Lesser GPL. It also

+

counts as the successor of the GNU Library Public License,

+

version 2, hence the version number 2.1.]

+ +

Preamble

+ +

The licenses for most software are designed to take away

+

your freedom to share and change it. By contrast, the GNU

+

General Public Licenses are intended to guarantee your

+

freedom to share and change free software--to make sure the

+

software is free for all its users.

+ +

This license, the Lesser General Public License, applies to

+

some specially designated software packages--typically

+

libraries--of the Free Software Foundation and other authors

+

who decide to use it. You can use it too, but we suggest you

+

first think carefully about whether this license or the ordinary

+

General Public License is the better strategy to use in any

+

particular case, based on the explanations below.

+ +

When we speak of free software, we are referring to freedom

+

of use, 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 this service if you wish); that

+

you receive source code or can get it if you want it; that you

+

can change the software and use pieces of it in new free

+

programs; and that you are informed that you can do these

+

things.

+ +

To protect your rights, we need to make restrictions that

+

forbid distributors to deny you these rights or to ask you to

+

surrender these rights. These restrictions translate to certain

+

responsibilities for you if you distribute copies of the library

+

or if you modify it.

+ +

For example, if you distribute copies of the library, whether

+

gratis or for a fee, you must give the recipients all the rights

+

that we gave you. You must make sure that they, too,

+

receive or can get the source code. If you link other code

+

with the library, you must provide complete object files to the

+

recipients, so that they can relink them with the library after

+

making changes to the library and recompiling it. And you

+

must show them these terms so they know their rights.

+ +

We protect your rights with a two-step method: (1) we

+

copyright the library, and (2) we offer you this license, which

+

gives you legal permission to copy, distribute and/or modify

+

the library.

+ +

To protect each distributor, we want to make it very clear

+

that there is no warranty for the free library. Also, if the

+

library is modified by someone else and passed on, the

+

recipients should know that what they have is not the original

+

version, so that the original author's reputation will not be

+

affected by problems that might be introduced by others.

+ +

Finally, software patents pose a constant threat to the

+

existence of any free program. We wish to make sure that a

+

company cannot effectively restrict the users of a free

+

program by obtaining a restrictive license from a patent

+

holder. Therefore, we insist that any patent license obtained

+

for a version of the library must be consistent with the full

+

freedom of use specified in this license.

+ +

Most GNU software, including some libraries, is covered by

+

the ordinary GNU General Public License. This license, the

+

GNU Lesser General Public License, applies to certain

+

designated libraries, and is quite different from the ordinary

+

General Public License. We use this license for certain

+

libraries in order to permit linking those libraries into non-free

+

programs.

+ +

When a program is linked with a library, whether statically or

+

using a shared library, the combination of the two is legally

+

speaking a combined work, a derivative of the original library.

+

The ordinary General Public License therefore permits such

+

linking only if the entire combination fits its criteria of

+

freedom. The Lesser General Public License permits more

+

lax criteria for linking other code with the library.

+ +

We call this license the "Lesser" General Public License

+

because it does Less to protect the user's freedom than the

+

ordinary General Public License. It also provides other free

+

software developers Less of an advantage over competing

+

non-free programs. These disadvantages are the reason we

+

use the ordinary General Public License for many libraries.

+

However, the Lesser license provides advantages in certain

+

special circumstances.

+ +

For example, on rare occasions, there may be a special

+

need to encourage the widest possible use of a certain

+

library, so that it becomes a de-facto standard. To achieve

+

this, non-free programs must be allowed to use the library. A

+

more frequent case is that a free library does the same job

+

as widely used non-free libraries. In this case, there is little

+

to gain by limiting the free library to free software only, so we

+

use the Lesser General Public License.

+ +

In other cases, permission to use a particular library in

+

non-free programs enables a greater number of people to use

+

a large body of free software. For example, permission to

+

use the GNU C Library in non-free programs enables many

+

more people to use the whole GNU operating system, as

+

well as its variant, the GNU/Linux operating system.

+ +

Although the Lesser General Public License is Less

+

protective of the users' freedom, it does ensure that the user

+

of a program that is linked with the Library has the freedom

+

and the wherewithal to run that program using a modified

+

version of the Library.

+ +

The precise terms and conditions for copying, distribution

+

and modification follow. Pay close attention to the difference

+

between a "work based on the library" and a "work that uses

+

the library". The former contains code derived from the

+

library, whereas the latter must be combined with the library

+

in order to run.

+ +

TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION

+

AND MODIFICATION

+ +

0. This License Agreement applies to any software library or

+

other program which contains a notice placed by the

+

copyright holder or other authorized party saying it may be

+

distributed under the terms of this Lesser General Public

+

License (also called "this License"). Each licensee is

+

addressed as "you".

+ +

A "library" means a collection of software functions and/or

+

data prepared so as to be conveniently linked with

+

application programs (which use some of those functions

+

and data) to form executables.

+ +

The "Library", below, refers to any such software library or

+

work which has been distributed under these terms. A "work

+

based on the Library" means either the Library or any

+

derivative work under copyright law: that is to say, a work

+

containing the Library or a portion of it, either verbatim or with

+

modifications and/or translated straightforwardly into another

+

language. (Hereinafter, translation is included without

+

limitation in the term "modification".)

+ +

"Source code" for a work means the preferred form of the

+

work for making modifications to it. For a library, complete

+

source code means all the source code for all modules it

+

contains, plus any associated interface definition files, plus

+

the scripts used to control compilation and installation of the

+

library.

+ +

Activities other than copying, distribution and modification

+

are not covered by this License; they are outside its scope.

+

The act of running a program using the Library is not

+

restricted, and output from such a program is covered only if

+

its contents constitute a work based on the Library

+

(independent of the use of the Library in a tool for writing it).

+

Whether that is true depends on what the Library does and

+

what the program that uses the Library does.

+ +

1. You may copy and distribute verbatim copies of the

+

Library's complete source code as you receive it, in any

+

medium, provided that you conspicuously and appropriately

+

publish on each copy an appropriate copyright notice and

+

disclaimer of warranty; keep intact all the notices that refer

+

to this License and to the absence of any warranty; and

+

distribute a copy of this License along with the Library.

+ +

You may charge a fee for the physical act of transferring a

+

copy, and you may at your option offer warranty protection in

+

exchange for a fee.

+ +

2. You may modify your copy or copies of the Library or any

+

portion of it, thus forming a work based on the Library, and

+

copy and distribute such modifications or work under the

+

terms of Section 1 above, provided that you also meet all of

+

these conditions:

+ +

a) The modified work must itself be a software

+

library.

+

b) You must cause the files modified to carry

+

prominent notices stating that you changed the

+

files and the date of any change.

+

c) You must cause the whole of the work to be

+

licensed at no charge to all third parties under

+

the terms of this License.

+

d) If a facility in the modified Library refers to a

+

function or a table of data to be supplied by an

+

application program that uses the facility, other

+

than as an argument passed when the facility

+

is invoked, then you must make a good faith

+

effort to ensure that, in the event an application

+

does not supply such function or table, the

+

facility still operates, and performs whatever

+

part of its purpose remains meaningful.

+ +

(For example, a function in a library to

+

compute square roots has a purpose that is

+

entirely well-defined independent of the

+

application. Therefore, Subsection 2d requires

+

that any application-supplied function or table

+

used by this function must be optional: if the

+

application does not supply it, the square root

+

function must still compute square roots.)

+ +

These requirements apply to the modified work

+

as a whole. If identifiable sections of that work

+

are not derived from the Library, and can be

+

reasonably considered independent and

+

separate works in themselves, then this

+

License, and its terms, do not apply to those

+

sections when you distribute them as separate

+

works. But when you distribute the same

+

sections as part of a whole which is a work

+

based on the Library, the distribution of the

+

whole must be on the terms of this License,

+

whose permissions for other licensees extend

+

to the entire whole, and thus to each and every

+

part regardless of who wrote it.

+ +

Thus, it is not the intent of this section to claim

+

rights or contest your rights to work written

+

entirely by you; rather, the intent is to exercise

+

the right to control the distribution of derivative

+

or collective works based on the Library.

+ +

In addition, mere aggregation of another work

+

not based on the Library with the Library (or

+

with a work based on the Library) on a volume

+

of a storage or distribution medium does not

+

bring the other work under the scope of this

+

License.

+ +

3. You may opt to apply the terms of the ordinary GNU

+

General Public License instead of this License to a given

+

copy of the Library. To do this, you must alter all the notices

+

that refer to this License, so that they refer to the ordinary

+

GNU General Public License, version 2, instead of to this

+

License. (If a newer version than version 2 of the ordinary

+

GNU General Public License has appeared, then you can

+

specify that version instead if you wish.) Do not make any

+

other change in these notices.

+ +

Once this change is made in a given copy, it is irreversible

+

for that copy, so the ordinary GNU General Public License

+

applies to all subsequent copies and derivative works made

+

from that copy.

+ +

This option is useful when you wish to copy part of the code

+

of the Library into a program that is not a library.

+ +

4. You may copy and distribute the Library (or a portion or

+

derivative of it, under Section 2) in object code or executable

+

form under the terms of Sections 1 and 2 above provided that

+

you accompany it with the complete corresponding

+

machine-readable source code, which must be distributed

+

under the terms of Sections 1 and 2 above on a medium

+

customarily used for software interchange.

+ +

If distribution of object code is made by offering access to

+

copy from a designated place, then offering equivalent

+

access to copy the source code from the same place

+

satisfies the requirement to distribute the source code, even

+

though third parties are not compelled to copy the source

+

along with the object code.

+ +

5. A program that contains no derivative of any portion of the

+

Library, but is designed to work with the Library by being

+

compiled or linked with it, is called a "work that uses the

+

Library". Such a work, in isolation, is not a derivative work of

+

the Library, and therefore falls outside the scope of this

+

License.

+ +

However, linking a "work that uses the Library" with the

+

Library creates an executable that is a derivative of the

+

Library (because it contains portions of the Library), rather

+

than a "work that uses the library". The executable is

+

therefore covered by this License. Section 6 states terms for

+

distribution of such executables.

+ +

When a "work that uses the Library" uses material from a

+

header file that is part of the Library, the object code for the

+

work may be a derivative work of the Library even though the

+

source code is not. Whether this is true is especially

+

significant if the work can be linked without the Library, or if

+

the work is itself a library. The threshold for this to be true is

+

not precisely defined by law.

+ +

If such an object file uses only numerical parameters, data

+

structure layouts and accessors, and small macros and

+

small inline functions (ten lines or less in length), then the

+

use of the object file is unrestricted, regardless of whether it

+

is legally a derivative work. (Executables containing this

+

object code plus portions of the Library will still fall under

+

Section 6.)

+ +

Otherwise, if the work is a derivative of the Library, you may

+

distribute the object code for the work under the terms of

+

Section 6. Any executables containing that work also fall

+

under Section 6, whether or not they are linked directly with

+

the Library itself.

+ +

6. As an exception to the Sections above, you may also

+

combine or link a "work that uses the Library" with the

+

Library to produce a work containing portions of the Library,

+

and distribute that work under terms of your choice, provided

+

that the terms permit modification of the work for the

+

customer's own use and reverse engineering for debugging

+

such modifications.

+ +

You must give prominent notice with each copy of the work

+

that the Library is used in it and that the Library and its use

+

are covered by this License. You must supply a copy of this

+

License. If the work during execution displays copyright

+

notices, you must include the copyright notice for the Library

+

among them, as well as a reference directing the user to the

+

copy of this License. Also, you must do one of these things:

+ +

a) Accompany the work with the complete

+

corresponding machine-readable source code

+

for the Library including whatever changes were

+

used in the work (which must be distributed

+

under Sections 1 and 2 above); and, if the work

+

is an executable linked with the Library, with

+

the complete machine-readable "work that

+

uses the Library", as object code and/or

+

source code, so that the user can modify the

+

Library and then relink to produce a modified

+

executable containing the modified Library. (It

+

is understood that the user who changes the

+

contents of definitions files in the Library will

+

not necessarily be able to recompile the

+

application to use the modified definitions.)

+ +

b) Use a suitable shared library mechanism for

+

linking with the Library. A suitable mechanism

+

is one that (1) uses at run time a copy of the

+

library already present on the user's computer

+

system, rather than copying library functions

+

into the executable, and (2) will operate

+

properly with a modified version of the library, if

+

the user installs one, as long as the modified

+

version is interface-compatible with the version

+

that the work was made with.

+ +

c) Accompany the work with a written offer,

+

valid for at least three years, to give the same

+

user the materials specified in Subsection 6a,

+

above, for a charge no more than the cost of

+

performing this distribution.

+ +

d) If distribution of the work is made by offering

+

access to copy from a designated place, offer

+

equivalent access to copy the above specified

+

materials from the same place.

+ +

e) Verify that the user has already received a

+

copy of these materials or that you have

+

already sent this user a copy.

+ +

For an executable, the required form of the "work that uses

+

the Library" must include any data and utility programs

+

needed for reproducing the executable from it. However, as a

+

special exception, the materials to be distributed need not

+

include anything that is normally distributed (in either source

+

or binary form) with the major components (compiler, kernel,

+

and so on) of the operating system on which the executable

+

runs, unless that component itself accompanies the

+

executable.

+ +

It may happen that this requirement contradicts the license

+

restrictions of other proprietary libraries that do not normally

+

accompany the operating system. Such a contradiction

+

means you cannot use both them and the Library together in

+

an executable that you distribute.

+ +

7. You may place library facilities that are a work based on

+

the Library side-by-side in a single library together with other

+

library facilities not covered by this License, and distribute

+

such a combined library, provided that the separate

+

distribution of the work based on the Library and of the other

+

library facilities is otherwise permitted, and provided that you

+

do these two things:

+ +

a) Accompany the combined library with a

+

copy of the same work based on the Library,

+

uncombined with any other library facilities.

+

This must be distributed under the terms of the

+

Sections above.

+ +

b) Give prominent notice with the combined

+

library of the fact that part of it is a work based

+

on the Library, and explaining where to find the

+

accompanying uncombined form of the same

+

work.

+ +

8. You may not copy, modify, sublicense, link with, or

+

distribute the Library except as expressly provided under this

+

License. Any attempt otherwise to copy, modify, sublicense,

+

link with, or distribute the Library is void, and will

+

automatically terminate your rights under this License.

+

However, parties who have received copies, or rights, from

+

you under this License will not have their licenses terminated

+

so long as such parties remain in full compliance.

+ +

9. You are not required to accept this License, since you

+

have not signed it. However, nothing else grants you

+

permission to modify or distribute the Library or its derivative

+

works. These actions are prohibited by law if you do not

+

accept this License. Therefore, by modifying or distributing

+

the Library (or any work based on the Library), you indicate

+

your acceptance of this License to do so, and all its terms

+

and conditions for copying, distributing or modifying the

+

Library or works based on it.

+ +

10. Each time you redistribute the Library (or any work

+

based on the Library), the recipient automatically receives a

+

license from the original licensor to copy, distribute, link with

+

or modify the Library subject to these terms and conditions.

+

You may not impose any further restrictions on the

+

recipients' exercise of the rights granted herein. You are not

+

responsible for enforcing compliance by third parties with this

+

License.

+ +

11. If, as a consequence of a court judgment or allegation of

+

patent infringement or for any other reason (not limited to

+

patent issues), 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 distribute so as to

+

satisfy simultaneously your obligations under this License

+

and any other pertinent obligations, then as a consequence

+

you may not distribute the Library at all. For example, if a

+

patent license would not permit royalty-free redistribution of

+

the Library by all those who receive copies directly or

+

indirectly through you, then the only way you could satisfy

+

both it and this License would be to refrain entirely from

+

distribution of the Library.

+ +

If any portion of this section is held invalid or unenforceable

+

under any particular circumstance, the balance of the

+

section is intended to apply, and the section as a whole is

+

intended to apply in other circumstances.

+ +

It is not the purpose of this section to induce you to infringe

+

any patents or other property right claims or to contest

+

validity of any such claims; this section has the sole purpose

+

of protecting the integrity of the free software distribution

+

system which is implemented by public license practices.

+

Many people have made generous contributions to the wide

+

range of software distributed through that system in reliance

+

on consistent application of that system; it is up to the

+

author/donor to decide if he or she is willing to distribute

+

software through any other system and a licensee cannot

+

impose that choice.

+ +

This section is intended to make thoroughly clear what is

+

believed to be a consequence of the rest of this License.

+ +

12. If the distribution and/or use of the Library is restricted in

+

certain countries either by patents or by copyrighted

+

interfaces, the original copyright holder who places the

+

Library under this License may add an explicit geographical

+

distribution limitation excluding those countries, so that

+

distribution is permitted only in or among countries not thus

+

excluded. In such case, this License incorporates the

+

limitation as if written in the body of this License.

+ +

13. The Free Software Foundation may publish revised

+

and/or new versions of the Lesser 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

+

Library specifies a version number of this License which

+

applies to it and "any later version", you have the option of

+

following the terms and conditions either of that version or of

+

any later version published by the Free Software Foundation.

+

If the Library does not specify a license version number, you

+

may choose any version ever published by the Free Software

+

Foundation.

+ +

14. If you wish to incorporate parts of the Library into other

+

free programs whose distribution conditions are incompatible

+

with these, write to the author to ask for permission. For

+

software which is copyrighted by the Free Software

+

Foundation, write to the Free Software Foundation; we

+

sometimes make exceptions for this. Our decision will be

+

guided by the two goals of preserving the free status of all

+

derivatives of our free software and of promoting the sharing

+

and reuse of software generally.

+ +

NO WARRANTY

+ +

15. BECAUSE THE LIBRARY IS LICENSED FREE OF

+

CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY,

+

TO THE EXTENT PERMITTED BY APPLICABLE LAW.

+

EXCEPT WHEN OTHERWISE STATED IN WRITING THE

+

COPYRIGHT HOLDERS AND/OR OTHER PARTIES

+

PROVIDE THE LIBRARY "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 LIBRARY IS WITH

+

YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU

+

ASSUME THE COST OF ALL NECESSARY SERVICING,

+

REPAIR OR CORRECTION.

+ +

16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE

+

LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT

+

HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY

+

AND/OR REDISTRIBUTE THE LIBRARY 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 LIBRARY (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

+

LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE),

+

EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN

+

ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

+ +

END OF TERMS AND CONDITIONS

+
+

pdftotext

+

Copyright (c) 2015 Joshua Peek

+ +

Permission is hereby granted, free of charge, to any person obtaining

+

a copy of this software and associated documentation files (the

+

"Software"), to deal in the Software without restriction, including

+

without limitation the rights to use, copy, modify, merge, publish,

+

distribute, sublicense, and/or sell copies of the Software, and to

+

permit persons to whom the Software is furnished to do so, subject to

+

the following conditions:

+ +

The above copyright notice and this permission notice shall be

+

included in all copies or substantial portions of the Software.

+ +

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,

+

EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF

+

MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND

+

NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE

+

LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION

+

OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION

+

WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+
+

RRule.js

+

rrule.js: Library for working with recurrence rules for calendar dates.

+

=======================================================================

+ +

Copyright 2010, Jakub Roztocil and Lars Schöning

+ +

Redistribution and use in source and binary forms, with or without

+

modification, are permitted provided that the following conditions are met:

+ +

1. Redistributions of source code must retain the above copyright notice,

+

this list of conditions and the following disclaimer.

+ +

2. Redistributions in binary form must reproduce the above copyright

+

notice, this list of conditions and the following disclaimer in the

+

documentation and/or other materials provided with the distribution.

+ +

3. Neither the name of The author nor the names of its contributors may

+

be used to endorse or promote products derived from this software

+

without specific prior written permission.

+ +

THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND

+

ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED

+

WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE

+

DISCLAIMED. IN NO EVENT SHALL THE AUTHOR AND CONTRIBUTORS BE LIABLE FOR

+

ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES

+

(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;

+

LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON

+

ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT

+

(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS

+

SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

+ + + +

./rrule.js and ./test/tests.js is based on python-dateutil. LICENCE:

+ +

python-dateutil - Extensions to the standard Python datetime module.

+

====================================================================

+ +

Copyright (c) 2003-2011 - Gustavo Niemeyer

+

Copyright (c) 2012 - Tomi Pieviläinen

+ +

All rights reserved.

+ +

Redistribution and use in source and binary forms, with or without

+

modification, are permitted provided that the following conditions are met:

+ +

* Redistributions of source code must retain the above copyright notice,

+

this list of conditions and the following disclaimer.

+

* Redistributions in binary form must reproduce the above copyright notice,

+

this list of conditions and the following disclaimer in the documentation

+

and/or other materials provided with the distribution.

+

* Neither the name of the copyright holder nor the names of its

+

contributors may be used to endorse or promote products derived from

+

this software without specific prior written permission.

+ +

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS

+

"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT

+

LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR

+

A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR

+

CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,

+

EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,

+

PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR

+

PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF

+

LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING

+

NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS

+

SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

+
+ + diff --git a/app_v3satdemo/chrome/content/creorga.css b/app_v3satdemo/chrome/content/creorga.css new file mode 100644 index 0000000..65b4382 --- /dev/null +++ b/app_v3satdemo/chrome/content/creorga.css @@ -0,0 +1,174 @@ +@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"); + +* { + background-color: #fff; +} + +toolbarbutton { + -moz-appearance: none; + +} + +toolbarbutton > .button-text { + -moz-appearance: none; +} + +.tlbpopup { + -moz-appearance: none; + border: 1px solid #8c8c8c; +} + +.button-text { + background-color: transparent; +} + +.btn { + display: inline-block; + padding: 6px 6px; + margin-bottom: 0; + margin: 0px; + font-size: 14px; + font-weight: normal; + line-height: 1.42857143; + text-align: center; + white-space: nowrap; + vertical-align: middle; + touch-action: manipulation; + cursor: pointer; + -moz-user-select: none; + user-select: none; + background-image: none; + border: 1px solid transparent; + border-radius: 0px; +} +.btn:focus, +.btn:active:focus, +.btn.active:focus, +.btn.focus, +.btn:active.focus, +.btn.active.focus { + outline: thin dotted; + outline-offset: -2px; +} +.btn:hover, +.btn:focus, +.btn.focus { + color: #333; + text-decoration: none; +} + +.btn:active, +.btn.active { + background-image: none; + outline: 0; + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn.disabled, +.btn[disabled], +fieldset[disabled] .btn { + cursor: not-allowed; + filter: alpha(opacity=65); + box-shadow: none; + opacity: .65; +} + +.btn-default { + color: #333; + background-color: #fff; + border-color: #ccc; +} +.btn-default:focus, +.btn-default.focus { + color: #333; + background-color: #fff; + border-color: #8c8c8c; +} +.btn-default:hover { + color: #333; + background-color: #fff; + border-color: #adadad; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + color: #333; + background-color: transparent; + border-color: #adadad; +} +.btn-default:active:hover, +.btn-default.active:hover, +.open > .dropdown-toggle.btn-default:hover, +.btn-default:active:focus, +.btn-default.active:focus, +.open > .dropdown-toggle.btn-default:focus, +.btn-default:active.focus, +.btn-default.active.focus, +.open > .dropdown-toggle.btn-default.focus { + color: #333; + background-color: #fff; + border-color: #8c8c8c; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + background-image: none; +} +.btn-default.disabled, +.btn-default[disabled], +fieldset[disabled] .btn-default, +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled.focus, +.btn-default[disabled].focus, +fieldset[disabled] .btn-default.focus, +.btn-default.disabled:active, +.btn-default[disabled]:active, +fieldset[disabled] .btn-default:active, +.btn-default.disabled.active, +.btn-default[disabled].active, +fieldset[disabled] .btn-default.active { + background-color: #fff; + border-color: #ccc; +} +.btn-default .badge { + color: #fff; + background-color: #333; +} + +.button-icon { + background-color: transparent; +} + +menuitem { + -moz-appearance: none; + padding-top: 3px; + padding-bottom: 3px; +} + +menuitem:hover { + background-color: #7DC9F3; + color: #000; +} + +menu { + -moz-appearance: none; + padding-top: 3px; + padding-bottom: 3px; +} + +menu:hover { + background-color: #7DC9F3; + color: #000; +} + +menupopup { + -moz-appearance: none; +} + +.menu-text { + background-color: transparent; +} diff --git a/app_v3satdemo/chrome/content/creorga.xul b/app_v3satdemo/chrome/content/creorga.xul new file mode 100644 index 0000000..522bc29 --- /dev/null +++ b/app_v3satdemo/chrome/content/creorga.xul @@ -0,0 +1,119 @@ + + + + + + + + diff --git a/app_v3satdemo/chrome/content/dlg/dlgsqlerror.xul b/app_v3satdemo/chrome/content/dlg/dlgsqlerror.xul new file mode 100644 index 0000000..cd9abb4 --- /dev/null +++ b/app_v3satdemo/chrome/content/dlg/dlgsqlerror.xul @@ -0,0 +1,29 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app_v3satdemo/chrome/content/img/accounting.png b/app_v3satdemo/chrome/content/img/accounting.png new file mode 100644 index 0000000..e733078 Binary files /dev/null and b/app_v3satdemo/chrome/content/img/accounting.png differ diff --git a/app_v3satdemo/chrome/content/img/back.png b/app_v3satdemo/chrome/content/img/back.png new file mode 100644 index 0000000..1eeef24 Binary files /dev/null and b/app_v3satdemo/chrome/content/img/back.png differ diff --git a/app_v3satdemo/chrome/content/img/child.png b/app_v3satdemo/chrome/content/img/child.png new file mode 100644 index 0000000..a867f76 Binary files /dev/null and b/app_v3satdemo/chrome/content/img/child.png differ diff --git a/app_v3satdemo/chrome/content/img/creche.png b/app_v3satdemo/chrome/content/img/creche.png new file mode 100644 index 0000000..9196a18 Binary files /dev/null and b/app_v3satdemo/chrome/content/img/creche.png differ diff --git a/app_v3satdemo/chrome/content/img/creorga16.png b/app_v3satdemo/chrome/content/img/creorga16.png new file mode 100644 index 0000000..c0c9c42 Binary files /dev/null and b/app_v3satdemo/chrome/content/img/creorga16.png differ diff --git a/app_v3satdemo/chrome/content/img/creorga32.png b/app_v3satdemo/chrome/content/img/creorga32.png new file mode 100644 index 0000000..521076f Binary files /dev/null and b/app_v3satdemo/chrome/content/img/creorga32.png differ diff --git a/app_v3satdemo/chrome/content/img/info.png b/app_v3satdemo/chrome/content/img/info.png new file mode 100644 index 0000000..335fe25 Binary files /dev/null and b/app_v3satdemo/chrome/content/img/info.png differ diff --git a/app_v3satdemo/chrome/content/img/info2.png b/app_v3satdemo/chrome/content/img/info2.png new file mode 100644 index 0000000..e0d0ab9 Binary files /dev/null and b/app_v3satdemo/chrome/content/img/info2.png differ diff --git a/app_v3satdemo/chrome/content/img/logo.png b/app_v3satdemo/chrome/content/img/logo.png new file mode 100644 index 0000000..9332701 Binary files /dev/null and b/app_v3satdemo/chrome/content/img/logo.png differ diff --git a/app_v3satdemo/chrome/content/img/logosmall.png b/app_v3satdemo/chrome/content/img/logosmall.png new file mode 100644 index 0000000..b6717a8 Binary files /dev/null and b/app_v3satdemo/chrome/content/img/logosmall.png differ diff --git a/app_v3satdemo/chrome/content/img/presence.png b/app_v3satdemo/chrome/content/img/presence.png new file mode 100644 index 0000000..545d90b Binary files /dev/null and b/app_v3satdemo/chrome/content/img/presence.png differ diff --git a/app_v3satdemo/chrome/content/img/stats.png b/app_v3satdemo/chrome/content/img/stats.png new file mode 100644 index 0000000..4feb271 Binary files /dev/null and b/app_v3satdemo/chrome/content/img/stats.png differ diff --git a/app_v3satdemo/chrome/content/img/waitlist.png b/app_v3satdemo/chrome/content/img/waitlist.png new file mode 100644 index 0000000..b76b07a Binary files /dev/null and b/app_v3satdemo/chrome/content/img/waitlist.png differ diff --git a/app_v3satdemo/chrome/content/js/data.js b/app_v3satdemo/chrome/content/js/data.js new file mode 100644 index 0000000..7b9c4aa --- /dev/null +++ b/app_v3satdemo/chrome/content/js/data.js @@ -0,0 +1,54 @@ +//Source-code licensed under EUPL v1.1 ( Copyright 2016 By DKS s.à r.l. - Kilian Saffran - Luxembourg ) + +var globalreq = { + listen_request: function(callback) { + document.addEventListener("creorga-query", function(event) { + var node = event.target; + if (!node || node.nodeType != Node.TEXT_NODE) + return; + + var doc = node.ownerDocument; + callback(JSON.parse(node.nodeValue), doc, function(response) { + node.nodeValue = JSON.stringify(response); + + var event = doc.createEvent("HTMLEvents"); + event.initEvent("creorga-response", true, false); + return node.dispatchEvent(event); + }); + }, false, true); + }, + + callback: function(request, sender, callback) { + if (request.page) { + if (!request.module) { + request.module =null; + } + if (request.page=='preview') { + printmanager.onprint(request.data); + }else if (request.page=='updatesiteslist') { + try { + if (multisite_reader){ + multisite_reader.getsites(); + }else { + document.getElementById("curcreche").value = ""; + } + } catch (Exception) { + if (request.data.curname){ + document.getElementById("curcreche").value = request.data.curname; + } + } + }else if (request.page=='infoheader') { + navigation.set_infoheader(request.header); + } + else { + navigation.load_appview(request.page,request.module,request.data,request.header); + } + + return ""; + } + + return callback(null); + } +} + +globalreq.listen_request(globalreq.callback); diff --git a/app_v3satdemo/chrome/content/js/database.js b/app_v3satdemo/chrome/content/js/database.js new file mode 100644 index 0000000..a9716f0 --- /dev/null +++ b/app_v3satdemo/chrome/content/js/database.js @@ -0,0 +1,321 @@ +//Source-code licensed under EUPL v1.1 ( Copyright 2016 By DKS s.à r.l. - Kilian Saffran - Luxembourg ) + +Components.utils["import"]("resource://gre/modules/Sqlite.jsm"); +Components.utils["import"]("resource://gre/modules/Services.jsm"); +Components.utils["import"]("resource://gre/modules/FileUtils.jsm"); + +var appdb = { + dbFile: ((apppref.getpreference("support.database.currentdb.db"))?FileUtils.File(apppref.getpreference("support.database.currentdb.db")):null), + dbConn: null, + aTableData: null, + aTableType: null, + aColumns: null, + keywords: ['ABORT','ACTION','ADD','AFTER','ALL','ALTER','ANALYZE','AND','AS','ASC','ATTACH','AUTOINCREMENT','BEFORE','BEGIN','BETWEEN','BY','CASCADE','CASE','CAST','CHECK','COLLATE','COLUMN','COMMIT','CONFLICT','CONSTRAINT','CREATE','CROSS','CURRENT_DATE','CURRENT_TIME','CURRENT_TIMESTAMP','DATABASE','DEFAULT','DEFERRABLE','DEFERRED','DELETE','DESC','DETACH','DISTINCT','DROP','EACH','ELSE','END','ESCAPE','EXCEPT','EXCLUSIVE','EXISTS','EXPLAIN','FAIL','FOR','FOREIGN','FROM','FULL','GLOB','GROUP','HAVING','IF','IGNORE','IMMEDIATE','IN','INDEX','INDEXED','INITIALLY','INNER','INSERT','INSTEAD','INTERSECT','INTO','IS','ISNULL','JOIN','KEY','LEFT','LIKE','LIMIT','MATCH','NATURAL','NO','NOT','not','null','NOTNULL','NULL','OF','OFFSET','ON','OR','ORDER','OUTER','PLAN','PRAGMA','PRIMARY','QUERY','RAISE','RECURSIVE','REFERENCES','REGEXP','REINDEX','RELEASE','RENAME','REPLACE','RESTRICT','RIGHT','ROLLBACK','ROW','SAVEPOINT','SELECT','SET','TABLE','TEMP','TEMPORARY','THEN','TO','TRANSACTION','TRIGGER','UNION','UNIQUE','UPDATE','USING','VACUUM','VALUES','VIEW','VIRTUAL','WHEN','WHERE','WITH','WITHOUT'], + setdbFile: function(fname){ + this.dbFile=FileUtils.File(fname); + }, + openDatabase: function() { + this.closeConnection(); + try { + this.dbConn = Services.storage.openDatabase(this.dbFile); + + } + catch (e) { + //dump("Connection Failed: " +e.message + '-'+ curcfg.dbfile.local + " - "+ this.dbFile.path + "\n"); + return false; + } + if(this.dbConn == null) return false; + return true; + }, + closeConnection: function() { + if (this.dbConn != null) { + try { + this.dbConn.close(); + } catch (e) { + this.dbConn = null; + } + } + this.dbConn = null; + this.aTableData = null; + this.aTableType = null; + this.aColumns = null; + }, + dbexec: function(sql){ + //dump("EXEC sql: " + sql + "\n"); + if (this.dbConn == null) { + this.openDatabase(); + } + try{ + var statement = this.dbConn.createStatement(sql); + statement.executeAsync({ + handleError: function(aError) { + if (sql != ""){ + //dump("Error:" + aError.message + "\nFailed SQL: " + sql + "\n"); + var params = { in : {msg:aError.message + "\nFailed SQL: " + sql},out: null}; + var dlg = window.openDialog("chrome://creorga/content/dlg/dlgsqlerror.xul", "dlgsqlerror","chrome,centerscreen,modal", params).focus(); + if (params.out) { + appdb.dbexec( sql); + } + } + }, + handleCompletion: function(aReason) { + //if (aReason != Components.interfaces.mozIStorageStatementCallback.REASON_FINISHED) + //dump("Query canceled or aborted!"); + } + }); + if (curcfg.sync){ + sync.up(sql); + } + + } catch(e){ + if (sql != ""){ + //dump("Error:" + e.message + "\nFailed SQL: " + sql + "\n"); + var params = { in : {msg:e.message + "\nFailed SQL: " + sql},out: null}; + var dlg = window.openDialog("chrome://creorga/content/dlg/dlgsqlerror.xul", "dlgsqlerror","chrome,centerscreen,modal", params).focus(); + if (params.out) { + appdb.dbexec( sql); + } + } + return false; + } + return true; + }, + dbquery: function(sQuery) { + if (this.dbConn == null) { + var r = this.openDatabase(); + } + + var xdata = { + sqldata : [] + }; + this.aTableData = new Array(); + this.aTableType = new Array(); + this.aColumns = null; + var bResult = false; + try { + var stmt = this.dbConn.createStatement(sQuery); + } + catch (e) { + + //dump("ERROR " + e.message + " " + sQuery +" - Statement ERROR!\n"); + return false; + } + var iCols = 0; + var iType, colName; + try { + iCols = stmt.columnCount; + this.aColumns = new Array(); + var aTemp; + for (var i = 0; i < iCols; i++) { + colName = stmt.getColumnName(i); + aTemp = [colName]; + this.aColumns.push(aTemp); + } + } catch (e) { + stmt.finalize(); + //dump("Column ERROR!\n"); + return false; + } + + var cell; + var bFirstRow = true; + try { + var r = 0; + while (stmt.executeStep()) { + var rowdata = {}; + for (i = 0; i < iCols; i++) { + iType = stmt.getTypeOfIndex(i); + switch (iType) { + case stmt.VALUE_TYPE_NULL: + rowdata[this.aColumns[i]] = ''; + break; + case stmt.VALUE_TYPE_INTEGER: + rowdata[this.aColumns[i]] = stmt.getInt64(i); + break; + case stmt.VALUE_TYPE_FLOAT: + rowdata[this.aColumns[i]] = stmt.getDouble(i); + break; + case stmt.VALUE_TYPE_TEXT: + rowdata[this.aColumns[i]] = stmt.getString(i); + break; + default: sData = ""; + } + r = r+1; + } + xdata.sqldata.push(rowdata); + r = r+1; + } + } catch (e) { + stmt.finalize(); + //dump("Statement Result ERROR!\n"); + return false; + } + stmt.finalize(); + return xdata; + }, + dbqueryarray: function(sQuery) { + if (this.dbConn == null) { + this.openDatabase(); + } + var xdata = { + sqldata : [], + sqlhead : [] + }; + + this.aTableData = new Array(); + this.aTableType = new Array(); + this.aColumns = null; + var bResult = false; + try { + var stmt = this.dbConn.createStatement(sQuery); + } + catch (e) { + return false; + } + + var iCols = 0; + var iType, colName; + try { + iCols = stmt.columnCount; + this.aColumns = new Array(); + var aTemp; + for (var i = 0; i < iCols; i++) { + colName = stmt.getColumnName(i); + this.aColumns.push(colName); + } + } catch (e) { + stmt.finalize(); + return false; + } + + var cell; + var bFirstRow = true; + try { + var r = 0; + while (stmt.executeStep()) { + var rowdata = new Array(); + for (i = 0; i < iCols; i++) { + iType = stmt.getTypeOfIndex(i); + switch (iType) { + case stmt.VALUE_TYPE_NULL: + rowdata.push(''); + break; + case stmt.VALUE_TYPE_INTEGER: + rowdata.push(stmt.getInt64(i)); + break; + case stmt.VALUE_TYPE_FLOAT: + rowdata.push(stmt.getDouble(i)); + break; + case stmt.VALUE_TYPE_TEXT: + rowdata.push(stmt.getString(i)); + break; + default: sData = ""; + } + r = r+1; + } + xdata.sqldata.push(rowdata); + + r = r+1; + } + xdata.sqlhead = this.aColumns; + } catch (e) { + stmt.finalize(); + //dump("Query 2: " + sQuery + " - executeStep failed"); + return false; + } + stmt.finalize(); + return xdata; + }, + strreplace: function(mytext){ + mytext = mytext.toString().replace("'","''",'g'); + return mytext; + }, + generate_uuid: function(){ + var uuidGenerator = Components.classes["@mozilla.org/uuid-generator;1"] + .getService(Components.interfaces.nsIUUIDGenerator); + var uuid = uuidGenerator.generateUUID(); + var xuuid = uuid.toString(); + xuuid = xuuid.replace('}',''); + xuuid = xuuid.replace('{',''); + return xuuid; + }, + getdatabases: function(){ + var childnames = apppref.branch.getChildList("",{}); + var curdbfiles = new Array(); + for (var i in childnames){ + if ((childnames[i].substring(0,16) == 'support.database') && (childnames[i].indexOf("currentdb") == -1) && (childnames[i].indexOf("currentsite") == -1)) { + var sitecfg = JSON.parse(apppref.getpreference(childnames[i])); + curdbfiles.push(sitecfg.path.local + system.sep() + sitecfg.uuid + ".sqlite"); + } + } + return curdbfiles; + }, + getaccessibledatabases: function(){ + var childnames = apppref.branch.getChildList("",{}); + var curdbfiles = {}; + for (var i in childnames){ + if ((childnames[i].substring(0,16) == 'support.database') && (childnames[i].indexOf("currentdb") == -1) && (childnames[i].indexOf("currentsite") == -1)) { + var sitecfg = JSON.parse(apppref.getpreference(childnames[i])); + if (system.fileexists(sitecfg.path.local + system.sep() + sitecfg.uuid + ".sqlite")){ + + curdbfiles[sitecfg.dbnum] = sitecfg; + } + + } + } + return curdbfiles; + }, + + check_schema: function(){ + + var defdb = system.appdir() + system.sep() + 'defaults'+ system.sep() + 'profile' + system.sep() + 'creorga.sqlite'; + + var dbfiles = appdb.getdatabases(); + + for (var cdb in dbfiles){ + if (system.fileexists(dbfiles[cdb])){ + + var args = ["-db",dbfiles[cdb],"-t",defdb]; + + var bincheck = system.toolsdir() + system.sep() + "creorgadb.exe"; + if (system.os != "WINNT") { + bincheck = system.toolsdir() + system.sep() + "creorgadb"; + } + system.runcmdline(bincheck,args,null); + + } + } + OS.File.remove(system.profilerootdir() + system.sep() + '/checkschema.txt',{ignoreAbsent:true}); + + }//, + +} + +var sync = { + //TODO: dynamic url and dynamic (curcfg) schema -> ident + + //url: "http://localhost:6060/localsyncup", + up: function(ddlquery){ + //dump("dbfile" + + "\n"); + /*var request = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(); + request.onload = function(aEvent) { + //dump("Response Text: " + aEvent.target.responseText + "\n"); + }; + request.onerror = function(aEvent) { + //dump("Error Msg:" + aEvent.target.responseText + "\n"); + //dump("Error Status: " + aEvent.target.status + "\n"); + }; + request.open("POST", sync.url, true); + request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");*/ + var cts = new Date(); + var milli = cts.getMilliseconds(); + if (milli < 10){ + milli = "00" + milli; + } else if (milli < 100){ + milli = "0" + milli; + } + var dbident = system.getFileName(appdb.dbFile.path).replace(/\.sqlite/,''); + dump("SQL;;"+ cts.toLocaleFormat('%Y%m%d%H%M%S')+ milli +";;" + dbident +";;"+ddlquery+ "\n"); + //request.send("ts="+ cts.toLocaleFormat('%Y-%m-%d %H:%M:%S') +"&q=" +encodeURIComponent(ddlquery)+ "&ident="+dbident+"&rh="+ system.hostname()); + } +} diff --git a/app_v3satdemo/chrome/content/js/encrypt.js b/app_v3satdemo/chrome/content/js/encrypt.js new file mode 100644 index 0000000..37ab16b --- /dev/null +++ b/app_v3satdemo/chrome/content/js/encrypt.js @@ -0,0 +1,200 @@ +var MD5 = function (string) { + + function RotateLeft(lValue, iShiftBits) { + return (lValue<>>(32-iShiftBits)); + } + + function AddUnsigned(lX,lY) { + var lX4,lY4,lX8,lY8,lResult; + lX8 = (lX & 0x80000000); + lY8 = (lY & 0x80000000); + lX4 = (lX & 0x40000000); + lY4 = (lY & 0x40000000); + lResult = (lX & 0x3FFFFFFF)+(lY & 0x3FFFFFFF); + if (lX4 & lY4) { + return (lResult ^ 0x80000000 ^ lX8 ^ lY8); + } + if (lX4 | lY4) { + if (lResult & 0x40000000) { + return (lResult ^ 0xC0000000 ^ lX8 ^ lY8); + } else { + return (lResult ^ 0x40000000 ^ lX8 ^ lY8); + } + } else { + return (lResult ^ lX8 ^ lY8); + } + } + + function F(x,y,z) { return (x & y) | ((~x) & z); } + function G(x,y,z) { return (x & z) | (y & (~z)); } + function H(x,y,z) { return (x ^ y ^ z); } + function I(x,y,z) { return (y ^ (x | (~z))); } + + function FF(a,b,c,d,x,s,ac) { + a = AddUnsigned(a, AddUnsigned(AddUnsigned(F(b, c, d), x), ac)); + return AddUnsigned(RotateLeft(a, s), b); + }; + + function GG(a,b,c,d,x,s,ac) { + a = AddUnsigned(a, AddUnsigned(AddUnsigned(G(b, c, d), x), ac)); + return AddUnsigned(RotateLeft(a, s), b); + }; + + function HH(a,b,c,d,x,s,ac) { + a = AddUnsigned(a, AddUnsigned(AddUnsigned(H(b, c, d), x), ac)); + return AddUnsigned(RotateLeft(a, s), b); + }; + + function II(a,b,c,d,x,s,ac) { + a = AddUnsigned(a, AddUnsigned(AddUnsigned(I(b, c, d), x), ac)); + return AddUnsigned(RotateLeft(a, s), b); + }; + + function ConvertToWordArray(string) { + var lWordCount; + var lMessageLength = string.length; + var lNumberOfWords_temp1=lMessageLength + 8; + var lNumberOfWords_temp2=(lNumberOfWords_temp1-(lNumberOfWords_temp1 % 64))/64; + var lNumberOfWords = (lNumberOfWords_temp2+1)*16; + var lWordArray=Array(lNumberOfWords-1); + var lBytePosition = 0; + var lByteCount = 0; + while ( lByteCount < lMessageLength ) { + lWordCount = (lByteCount-(lByteCount % 4))/4; + lBytePosition = (lByteCount % 4)*8; + lWordArray[lWordCount] = (lWordArray[lWordCount] | (string.charCodeAt(lByteCount)<>>29; + return lWordArray; + }; + + function WordToHex(lValue) { + var WordToHexValue="",WordToHexValue_temp="",lByte,lCount; + for (lCount = 0;lCount<=3;lCount++) { + lByte = (lValue>>>(lCount*8)) & 255; + WordToHexValue_temp = "0" + lByte.toString(16); + WordToHexValue = WordToHexValue + WordToHexValue_temp.substr(WordToHexValue_temp.length-2,2); + } + return WordToHexValue; + }; + + function Utf8Encode(string) { + string = string.replace(/\r\n/g,"\n"); + var utftext = ""; + + for (var n = 0; n < string.length; n++) { + + var c = string.charCodeAt(n); + + if (c < 128) { + utftext += String.fromCharCode(c); + } + else if((c > 127) && (c < 2048)) { + utftext += String.fromCharCode((c >> 6) | 192); + utftext += String.fromCharCode((c & 63) | 128); + } + else { + utftext += String.fromCharCode((c >> 12) | 224); + utftext += String.fromCharCode(((c >> 6) & 63) | 128); + utftext += String.fromCharCode((c & 63) | 128); + } + + } + + return utftext; + }; + + var x=Array(); + var k,AA,BB,CC,DD,a,b,c,d; + var S11=7, S12=12, S13=17, S14=22; + var S21=5, S22=9 , S23=14, S24=20; + var S31=4, S32=11, S33=16, S34=23; + var S41=6, S42=10, S43=15, S44=21; + + string = Utf8Encode(string); + + x = ConvertToWordArray(string); + + a = 0x67452301; b = 0xEFCDAB89; c = 0x98BADCFE; d = 0x10325476; + + for (k=0;k= 0) { + document.getElementById("tbb_print").setAttribute("disabled",true); + }else { + document.getElementById("tbb_print").removeAttribute("disabled"); + } + var url = "chrome://creorga/content/web/"+viewname+".html"; + if (module) { + url = "chrome://creorga/content/modules/"+module+"/"+viewname+".html"; + } + document.getElementById("brw_application").loadURI(url,null,"UTF-8"); + }, + load_deck: function(num){ + if (document.getElementById("deckglobal")){ + document.getElementById("deckglobal").selectedIndex = num; + }else { + setTimeout(function(){ navigation.load_deck(num); }, 3000); + } + } +} diff --git a/app_v3satdemo/chrome/content/js/preferences.js b/app_v3satdemo/chrome/content/js/preferences.js new file mode 100644 index 0000000..b0b9e40 --- /dev/null +++ b/app_v3satdemo/chrome/content/js/preferences.js @@ -0,0 +1,168 @@ +//Source-code licensed under EUPL v1.1 ( Copyright 2016 By DKS s.à r.l. - Kilian Saffran - Luxembourg ) + +var curcfg = { + name: null, + uuid: null, + dbnum: null, + path: {local:null,remote:null}, + dbfile: {local:null,remote:null}, + lastsync:{}, + local:{importpath:null,reportpath:null}, + remote:{importpath:null,reportpath:null}, + + loadconfig: function(num){ + if (!num) { + num = 1; + } + var tcfg = JSON.parse(apppref.getpreference("support.database." + num)); + curcfg.name = tcfg.name; + curcfg.path.local = tcfg.path.local; + curcfg.uuid = tcfg.uuid; + curcfg.dbnum = tcfg.dbnum; + curcfg.dbfile.local = curcfg.path.local + system.sep() + curcfg.uuid + ".sqlite"; + if (!system.fileexists(curcfg.dbfile.local)){ + return false; + } + apppref.setpreference("support.database.currentdb.db",curcfg.dbfile.local); + if (system.fileexists(system.profilerootdir() + system.sep() + "sync.conf")){ + curcfg.sync = true; + var syncdir = FileUtils.File(system.profilerootdir() + system.sep() + 'syncup'); + if (!system.fileexists(syncdir.path)){ + syncdir.create(1,0755); + } + var syncdirdb = FileUtils.File(system.profilerootdir() + system.sep() + 'syncup' + system.sep() + curcfg.uuid); + if (!system.fileexists(syncdirdb.path)){ + syncdirdb.create(1,0755); + } + var syncdirdb2 = FileUtils.File(system.profilerootdir() + system.sep() + 'syncdown' + system.sep() + curcfg.uuid); + if (!system.fileexists(syncdirdb2.path)){ + syncdirdb2.create(1,0755); + } + var todaydate = new Date(); + var milli = todaydate.getMilliseconds(); + if (milli < 10){ + milli = "00" + milli; + } else if (milli < 100){ + milli = "0" + milli; + } + apppref.setbrowserpreference("dom.window.dump.file", syncdirdb.path + system.sep() + system.hostname()+ "_" + todaydate.toLocaleFormat('%Y%m%d%H%M%S') + milli +".log"); + } + appdb.dbFile=FileUtils.File(curcfg.dbfile.local); + curcfg.local.importpath = curcfg.path.local + system.sep() + 'imports' + system.sep() + curcfg.uuid; + curcfg.local.reportpath = curcfg.path.local + system.sep() + 'reports' + system.sep() + curcfg.uuid; + curcfg.lastsync = null; + if (tcfg.path.remote) { + curcfg.path.remote = tcfg.path.remote; + curcfg.dbfile.remote = curcfg.path.remote + system.sep() + curcfg.uuid + ".sqlite"; + curcfg.remote.importpath = curcfg.path.remote + system.sep() + 'imports' + system.sep() + curcfg.uuid; + curcfg.remote.reportpath = curcfg.path.remote + system.sep() + 'reports' + system.sep() +curcfg.uuid; + curcfg.lastsync = tcfg.lastsync; + } + + return true; + }, + addsite: function(name,siteclone){ + if (!siteclone) { + var cfg = {name:"Nouvelle Crèche",uuid:appdb.generate_uuid(),dbnum:1,ldbpath:curcfg.dbfile,rdbpath:curcfg.rdbfile,lastsync:curcfg.lastsync}; + apppref.setpreference("support.database." + curcfg.dbnum,cfg); + } else { + //TODO: + } + + }, + saveconfig: function(data){ + if (data) { + apppref.setpreference("support.database." + data.dbnum,data); + }else{ + var cfg = {name:curcfg.name,uuid:curcfg.uuid,dbnum:curcfg.dbnum,path:{local:curcfg.path.local,remote:curcfg.path.remote},lastsync:curcfg.lastsync}; + apppref.setpreference("support.database." + curcfg.dbnum,cfg); + } + }, + updateconfigs: function(){ + var childnames = apppref.branch.getChildList("",{}); + for (var i in childnames){ + var re = /support.database_\d+.db/; + if (childnames[i].match(re)) { + var num = childnames[i].substring(childnames[i].indexOf('_')+1).replace(/.db/,'').replace(/.name/,''); + var appx = apppref.getpreference("support.database." + num); + + if (!appx) { + var nobj = {name:null,uuid:null,dbnum:null,path:{local:null,remote:null},lastsync:null}; + nobj.name = apppref.getpreference('support.database_'+num+'.name'); + nobj.dbnum = num; + nobj.path.local = system.getDirectory(apppref.getpreference('support.database_'+num+'.db')); + appdb.closeConnection(); + appdb.dbFile = FileUtils.File(apppref.getpreference('support.database_'+num+'.db')); + var cuuid = appdb.dbquery("select uuid from creche LIMIT 1;"); + nobj.uuid = cuuid.sqldata[0].uuid; + var cfname = system.getFileName(appdb.dbFile.path); + if (cfname != nobj.uuid + ".sqlite") { + appdb.closeConnection(); + if (cfname == 'creorga.sqlite') { + system.renamefile(appdb.dbFile.path,nobj.path.local,nobj.uuid + ".sqlite"); + }else{ + system.renamefile(appdb.dbFile.path,nobj.path.local,nobj.uuid + ".sqlite"); + } + } + + curcfg.saveconfig(nobj); + apppref.deletepreference('support.database_'+num+'.name'); + apppref.deletepreference('support.database_'+num+'.db'); + + } + } + } + appdb.closeConnection(); + appdb.dbFile = null; + } +} + +var apppref = { + branch: Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("creorga."), + browser: Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("browser."), + getpreference: function(keyname){ + //dump(keyname + "\n"); + var ptype = this.branch.getPrefType(keyname); + var keyvalue = null; + if (ptype == 32) { + keyvalue = this.branch.getCharPref(keyname); + } else if (ptype == 64) { + keyvalue = this.branch.getIntPref(keyname); + } else if (ptype == 128) { + keyvalue = this.branch.getBoolPref(keyname); + } + return keyvalue; + }, + setpreference: function(keyname,keyvalue){ + if (typeof keyvalue == "string") { + this.branch.setCharPref(keyname,keyvalue); + } else if (typeof keyvalue == "number") { + this.branch.setIntPref(keyname,keyvalue); + } else if (typeof keyvalue == "boolean") { + this.branch.setBoolPref(keyname,keyvalue); + } else { + this.branch.setCharPref(keyname,JSON.stringify(keyvalue)); + } + + }, + setbrowserpreference: function(keyname,keyvalue){ + //if (typeof keyvalue == "string") { + this.browser.setCharPref(keyname,keyvalue); + /*} else if (typeof keyvalue == "number") { + this.branch.setIntPref(keyname,keyvalue); + } else if (typeof keyvalue == "boolean") { + this.branch.setBoolPref(keyname,keyvalue); + } else { + this.branch.setCharPref(keyname,JSON.stringify(keyvalue)); + }*/ + + }, + deletepreference: function(keyname){ + this.branch.clearUserPref(keyname); + }, + savepreferences: function(){ + var prefService = Components.classes["@mozilla.org/preferences-service;1"] + .getService(Components.interfaces.nsIPrefService); + prefService.savePrefFile(null); + } +} diff --git a/app_v3satdemo/chrome/content/js/sync.js b/app_v3satdemo/chrome/content/js/sync.js new file mode 100644 index 0000000..e69de29 diff --git a/app_v3satdemo/chrome/content/js/system.js b/app_v3satdemo/chrome/content/js/system.js new file mode 100644 index 0000000..6baf4aa --- /dev/null +++ b/app_v3satdemo/chrome/content/js/system.js @@ -0,0 +1,386 @@ +//Source-code licensed under EUPL v1.1 ( Copyright 2016 By DKS s.à r.l. - Kilian Saffran - Luxembourg ) + +Components.utils["import"]("resource://gre/modules/FileUtils.jsm"); +Components.utils["import"]("resource://gre/modules/Services.jsm"); +Components.utils["import"]("resource://gre/modules/NetUtil.jsm"); +Components.utils["import"]("resource://gre/modules/osfile.jsm"); +var system = { + os: Components.classes["@mozilla.org/xre/app-info;1"].getService(Components.interfaces.nsIXULRuntime).OS, + sep: function() { + if (this.os == 'WINNT') { + return '\\'; + } else { + return "/"; + } + }, + appdir: function() { + var mypath = Components.classes["@mozilla.org/file/directory_service;1"]. + getService(Components.interfaces.nsIProperties). + get("CurProcD", Components.interfaces.nsIFile).path; + + + return mypath; + }, + tmpdir: function(){ + var mypath = Components.classes["@mozilla.org/file/directory_service;1"]. + getService(Components.interfaces.nsIProperties). + get("TmpD", Components.interfaces.nsIFile).path; + return mypath; + }, + homedir: function(){ + var mypath = Components.classes["@mozilla.org/file/directory_service;1"]. + getService(Components.interfaces.nsIProperties). + get("Home", Components.interfaces.nsIFile).path; + return mypath; + }, + toolsdir: function() { + var mypath = Components.classes["@mozilla.org/file/directory_service;1"]. + getService(Components.interfaces.nsIProperties). + get("CurProcD", Components.interfaces.nsIFile).path; + + + return mypath + this.sep() + 'Tools'; + }, + commondir: function(){ + if (this.os == 'WINNT') { + return "C:" + system.sep() + 'ProgramData' + system.sep() + 'Creorga'; + } else { + return '/Library/Application Support/Creorga'; + } + }, + profiledir: function() { + var mypath = Components.classes["@mozilla.org/file/directory_service;1"]. + getService(Components.interfaces.nsIProperties). + get("ProfD", Components.interfaces.nsIFile).path; + return mypath; + }, + profilerootdir: function(){ + var mypath = Components.classes["@mozilla.org/file/directory_service;1"]. + getService(Components.interfaces.nsIProperties). + get("DefProfRt", Components.interfaces.nsIFile).path; + return mypath; + + }, + getFileName: function (filePath) { + if (filePath.indexOf('http') == 0 ) { + return filePath.substring(filePath.lastIndexOf('/')+1); + } + else if (this.os == 'WINNT') { // windows + return filePath.substring(filePath.lastIndexOf('\\')+1); + } + else { // unix + return filePath.substring(filePath.lastIndexOf('/')+1); + } + }, + getDirectory: function(filePath){ + if (this.os == 'WINNT') { // windows + return filePath.substring(0,filePath.lastIndexOf('\\')); + } + else { // unix + return filePath.substring(0,filePath.lastIndexOf('/')); + } + }, + + gotoUrl: function(url) { + var nsioservice = Components.classes["@mozilla.org/network/io-service;1"] + .getService(Components.interfaces.nsIIOService); + + var uri = nsioservice.newURI(url, null, null); + + var eps = Components.classes["@mozilla.org/uriloader/external-protocol-service;1"] + .getService(Components.interfaces.nsIExternalProtocolService); + + eps.loadURI(uri, null); + }, + openFile: function(filepath) { + if (system.os == "WINNT") { + system.runcmdline(filepath,[],null); + } else { + system.runcmdline("/usr/bin/open",[filepath],null); + } + }, + showdlgabout: function() { + window.openDialog('chrome://creorga/content/dlg/dlgabout.xul', 'dlgabout', 'chrome,modal,centerscreen,close=0'); + }, +// dlgupdate: function() { +// window.openDialog('chrome://creorga/content/modules/support/dlg/dlgupdate.xul', 'dlgupdate', 'chrome,modal,centerscreen'); +// }, + fileexists: function(filefrom) { + if (!filefrom) { + return false; + } + if (this.os == 'WINNT') { + filefrom = filefrom.replace('/', '\\'); + } + var file = new FileUtils.File(filefrom); + if (file.exists()) { + file = null; + return true; + } + file=null; + return false; + }, + renamefile: function(filefrom,pathto,fileto){ + var file = new FileUtils.File(filefrom); + if (file.exists()) { + var dir = FileUtils.File(pathto); + file.renameTo(dir,fileto); + } + return true; + }, + readLocalTextFile: function(aURL) { + var ioService = Components.classes["@mozilla.org/network/io-service;1"] + .getService(Components.interfaces.nsIIOService); + var scriptableStream = Components + .classes["@mozilla.org/scriptableinputstream;1"] + .getService(Components.interfaces.nsIScriptableInputStream); + + var channel = ioService.newChannel("file://" + aURL, null, null); + var input = channel.open(); + scriptableStream.init(input); + var str = scriptableStream.read(input.available()); + + scriptableStream.close(); + input.close(); + var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"] + .createInstance(Components.interfaces.nsIScriptableUnicodeConverter); + converter.charset = "UTF-8"; + str = converter.ConvertToUnicode(str); + return str; + }, + WriteTextFile: function(xdata, outfile) { + //dump(outfile + "\n"); + var nsifile = new FileUtils.File( outfile ); + var ostream = FileUtils.openSafeFileOutputStream(nsifile); + var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Components.interfaces.nsIScriptableUnicodeConverter); + converter.charset = "UTF-8"; + var istream = converter.convertToInputStream(xdata); + NetUtil.asyncCopy(istream, ostream,function(status) { + if (!Components.isSuccessCode(status)) { + // Handle error! + return; + } + + }); + }, + WriteTextFile2: function(file,data){ + dump(file.path); + OS.File.remove(file.path,{ignoreAbsent:true}); + var foStream = Components.classes["@mozilla.org/network/file-output-stream;1"].createInstance(Components.interfaces.nsIFileOutputStream); + foStream.init(file, 0x02 | 0x08 | 0x20, foStream.PR_IRWXU, 0); + var converter = Components.classes["@mozilla.org/intl/converter-output-stream;1"].createInstance(Components.interfaces.nsIConverterOutputStream); + converter.init(foStream, "UTF-8", 0, 0); + converter.writeString(data); + converter.close(); + }, + b64EncodeUnicode: function(str) { + return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function(match, p1) { + return String.fromCharCode('0x' + p1); + })); + }, + appinfo: function() { + var xulAppInfo = Components.classes["@mozilla.org/xre/app-info;1"] + .getService(Components.interfaces.nsIXULAppInfo); + var xulRuntime = Components.classes["@mozilla.org/xre/app-info;1"] + .getService(Components.interfaces.nsIXULRuntime); + var profileident = system.profiledir().substring(system.profilerootdir().length+1); + var appinfo = { + appBuildID: xulAppInfo.appBuildID, + ID: xulAppInfo.ID, + name: xulAppInfo.name, + platformBuildID: xulAppInfo.platformBuildID, + platformVersion: xulAppInfo.platformVersion, + vendor: xulAppInfo.vendor, + version: xulAppInfo.version, + OS: xulRuntime.OS, + profile: profileident + } + return appinfo; + }, + hostname: function(){ + var dnsComp = Components.classes["@mozilla.org/network/dns-service;1"]; + var dnsSvc = dnsComp.getService(Components.interfaces.nsIDNSService); + var compName = dnsSvc.myHostName; + return compName; + }, + setappdata: function() { + var appdata = this.appinfo(); + document.getElementById("stbversion").setAttribute('label',"Version " + appdata.version); + if (curcfg.name) { + document.getElementById("curcreche").value=curcfg.name; + } else { + document.getElementById("curcreche").value=""; + } + + }, + getBackups:function(){ + + var dir = new FileUtils.File(curcfg.path.local + system.sep() + 'backup'); + var entries = dir.directoryEntries; + var array = []; + while(entries.hasMoreElements()) { + var entry = entries.getNext(); + entry.QueryInterface(Components.interfaces.nsIFile); + if (entry.path.indexOf(curcfg.uuid) > 0){ + array.push(entry); + } + } + return array; + }, + getReports:function(cruuid){ + + var dir = new FileUtils.File(curcfg.path.local + system.sep() + 'reports' + system.sep() +cruuid); + if (!system.fileexists(dir.path)){ + dir.create(1,0755); + } + var entries = dir.directoryEntries; + var array = []; + while(entries.hasMoreElements()) { + var entry = entries.getNext(); + entry.QueryInterface(Components.interfaces.nsIFile); + array.push(entry); + } + return array; + }, + getChildFiles:function(cruuid,chuuid){ + + var dir = new FileUtils.File(curcfg.path.local + system.sep() + 'childs' + system.sep() +cruuid + system.sep() + chuuid); + if (!system.fileexists(dir.path)){ + dir.create(1,0755); + } + var entries = dir.directoryEntries; + var array = []; + while(entries.hasMoreElements()) { + var entry = entries.getNext(); + entry.QueryInterface(Components.interfaces.nsIFile); + //dump("Push to Array:" + entry); + //if (!entry.path.startsWith('.')){ + array.push(entry); + //} + } + return array; + }, + getModtime: function(somePath){ + var file = new FileUtils.File(somePath); + return new Date(file.lastModifiedTime).toLocaleFormat("%Y-%m-%d %H:%M:%S"); + }, + //restartapp: function(text) { + // + // if (window.confirm(text + "\nRedémarrer maintenant?")){ + // var appStartup = Components.classes["@mozilla.org/toolkit/app-startup;1"].getService(Components.interfaces.nsIAppStartup); + // appStartup.quit(Components.interfaces.nsIAppStartup.eRestart | Components.interfaces.nsIAppStartup.eAttemptQuit); + // } + //}, + popup: function(title, msg) { + var image = null; + var win = Components.classes['@mozilla.org/embedcomp/window-watcher;1']. + getService(Components.interfaces.nsIWindowWatcher). + openWindow(null, 'chrome://global/content/alerts/alert.xul', + '_blank', 'chrome,titlebar=no,popup=yes', null); + win.arguments = [image, title, msg, false, '']; + return true; + }, + runcmdline: function(cmdlapp,args,callback){ + var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile); + var process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess); + dump(cmdlapp + " "+ JSON.stringify(args) + "\n"); + file.initWithPath(cmdlapp); + process.init(file); + //cmdlapp + " "+ JSON.stringify(args) + "\n"); + process.runwAsync( args, args.length,callback); + return true; + }, + selectfile: function(lastdir,wmsg){ + var nsIFilePicker = Components.interfaces.nsIFilePicker; + var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker); + fp.init(window, wmsg, nsIFilePicker.modeOpen); + fp.appendFilter("Database Files", "*.sqlite"); + var selfile = null; + if ((lastdir) && (lastdir != '')) { + var nsILocalFile= Components.interfaces.nsILocalFile; + var f = Components.classes["@mozilla.org/file/local;1"].createInstance(nsILocalFile); + f.initWithPath(lastdir); + fp.displayDirectory = f; + } + var res = fp.show(); + if (res != nsIFilePicker.returnCancel) { + selfile = fp.file; + } + return selfile; + }, + closeapp(){ + if (system.os == "Darwin" && system.fileexists(system.profilerootdir() + system.sep() + 'vpncfg.txt') + && system.fileexists(system.toolsdir() + system.sep() + "vpnclose.sh")){ + system.runcmdline("/bin/bash",[system.toolsdir() + system.sep() + "vpnclose.sh",system.profilerootdir() + system.sep() + 'vpncfg.txt']); + } + if (system.fileexists(system.profilerootdir() + system.sep() + "sync.conf")){ + //TODO: stop sync app + } + }, + selectvpnfile: function(lastdir,wmsg){ + var nsIFilePicker = Components.interfaces.nsIFilePicker; + var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker); + fp.init(window, wmsg, nsIFilePicker.modeOpen); + fp.appendFilter("Private Key-File", "*.key"); + var selfile = null; + if ((lastdir) && (lastdir != '')) { + var nsILocalFile= Components.interfaces.nsILocalFile; + var f = Components.classes["@mozilla.org/file/local;1"].createInstance(nsILocalFile); + f.initWithPath(lastdir); + fp.displayDirectory = f; + } + var res = fp.show(); + if (res != nsIFilePicker.returnCancel) { + selfile = fp.file; + } + return selfile; + }, + loadconfig:function(tout){ + //dump("lc: timeout " + tout + "\n"); + + if (tout <= 0){ + //dump("set site cfg sites!\n") + var nx = { "view":"multisite","module":"support","header":"Configuration Sites"}; + apppref.setpreference("pageconfig.lastpage", nx); + navigation.load_deck(2); + return false; + } + tout = tout - 2000; + var r=curcfg.loadconfig(apppref.getpreference("support.database.currentdb.num")); + if (r === false){ + + setTimeout(function(){r = system.loadconfig(tout);},2000); + }else { + setTimeout(function(){navigation.load_deck(2);},2000); + } + return r; + }, + selectdirectory: function(lastdir,wmsg){ + try { + //var lastdir = apppref.getpreference("support.lastfiledir"); + var nsIFilePicker = Components.interfaces.nsIFilePicker; + var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker); + fp.init(window, wmsg, nsIFilePicker.modeGetFolder); + //fp.appendFilter("PDF", "*.pdf"); + if ((lastdir) && (lastdir != '')) { + var nsILocalFile= Components.interfaces.nsILocalFile; + var f = Components.classes["@mozilla.org/file/local;1"].createInstance(nsILocalFile); + f.initWithPath(lastdir); + fp.displayDirectory = f; + } + var seldir = null; + var res = fp.show(); + if (res != nsIFilePicker.returnCancel) { + seldir = fp.file; + } + }catch(ex){ + system.popup("Erreur d'selct dir!","Une erreur s'est produite!\n"); + //"Error selecting folder! " + ex + "\n"); + } + return seldir; + }, + changelicense:function(){ + navigation.load_deck(1); + } + +} \ No newline at end of file diff --git a/app_v3satdemo/chrome/content/js/tools.js b/app_v3satdemo/chrome/content/js/tools.js new file mode 100644 index 0000000..8309684 --- /dev/null +++ b/app_v3satdemo/chrome/content/js/tools.js @@ -0,0 +1,189 @@ +//Source-code licensed under EUPL v1.1 ( Copyright 2016 By DKS s.à r.l. - Kilian Saffran - Luxembourg ) + +Components.utils["import"]("resource://gre/modules/NetUtil.jsm"); +Components.utils["import"]("resource://gre/modules/FileUtils.jsm"); +var tools = { + waitdlg: null, + movecreche: function(oldfolder,newfolder,cuuid,dbnum){ + //"Move Form: " + oldfolder + "\nTO: " + newfolder + "\nuuid:" + cuuid + "\ndbnum: " + dbnum + "\n"); + try { + var repdir = new FileUtils.File(oldfolder + system.sep() + 'reports' + system.sep() + cuuid); + //"Reports: " + repdir.path + "\n"); + var filearray = []; + var expdirarray = []; + expdirarray.push("reports"); + expdirarray.push("reports" + system.sep() + cuuid); + //get all reports + if (system.fileexists(repdir.path)){ + + //for (var d in dirarray){ + //dir = FileUtils.getDir("ProfD", ["reports",dirarray[d]], true); + + entries = repdir.directoryEntries; + //expdirarray.push("reports" + system.sep() + dirarray[d]); + while(entries.hasMoreElements()) { + var entry = entries.getNext().QueryInterface(Components.interfaces.nsIFile); + + if (entry.isFile()) { + filearray.push(entry.path); + } + } + } + //} + //get all imports + var impdir = new FileUtils.File(oldfolder + system.sep() + 'imports' + system.sep() + cuuid); + //"Imports: " + impdir.path + "\n"); + expdirarray.push("imports"); + expdirarray.push("imports" + system.sep() + cuuid); + if (system.fileexists(impdir.path)){ + //for (var d in dirarray){ + // dir = FileUtils.getDir("ProfD", ["imports",dirarray[d]], true); + entries = impdir.directoryEntries; + //expdirarray.push("imports" + system.sep() + dirarray[d]); + while(entries.hasMoreElements()) { + var entry = entries.getNext().QueryInterface(Components.interfaces.nsIFile); + + if (entry.isFile()) { + filearray.push(entry.path); + } + } + } + //create dirs in exportpath + var exportdir = new FileUtils.File(newfolder); + var fromdir = new FileUtils.File(oldfolder); + for (var ed in expdirarray){ + var cexpdir = new FileUtils.File( exportdir.path + system.sep() + expdirarray[ed]); + //cexpdir.path + "\n"); + if (!cexpdir.exists()) { + cexpdir.create(1,0755); + } + if (system.os != "WINNT") { + + } + } + //copy files + var filex= []; + //dump(JSON.stringify(filearray) + "\n"); + for (var f in filearray){ + var expfile = filearray[f]; + //dump("EXP FILE: " + expfile + "\n"); + var nfile = expfile.substring(fromdir.path.length); + //"n-file: " + nfile + "\n"); + var fname = system.getFileName(nfile); + + var dname = exportdir.path +system.getDirectory(nfile); + + var ef = new FileUtils.File(expfile); + var de = new FileUtils.File(dname); + //dump("from: "+ ef.path + " to folder: " + de.path +" fname: " + fname + "\n"); + ef.copyTo(de,fname); + //filex.push(nfile); + } + + var sqlfdb = FileUtils.File(fromdir.path + system.sep() + cuuid + ".sqlite"); + if (system.fileexists(sqlfdb.path)){ + //"Copy DB: " + sqlfdb.path + "\n"); + sqlfdb.copyTo(exportdir,cuuid + ".sqlite"); + }//var nzipfile = tools.backup(exportdir); + var strsitecfg = apppref.getpreference("support.database." + dbnum); + var jsitecfg = JSON.parse(strsitecfg); + jsitecfg.path.local=exportdir.path; + apppref.setpreference("support.database." + dbnum,jsitecfg); + if (curcfg.dbnum == dbnum){ + + curcfg.loadconfig(apppref.getpreference("support.database.currentdb.num")); + } + // + // + //var expdata = {"db":system.getFileName(nzipfile.path),"dir":expdirarray,"files":filex}; + // + //expfname = system.getFileName(nzipfile.path); + //expfname = expfname.substring(0,expfname.length-3) + "def"; + //system.WriteTextFile(JSON.stringify(expdata),exportdir.path + system.sep() + expfname); + system.popup("Export des données!","Les données ont été exportées vers "+ exportdir.path +"\n"); + }catch(ex){ + system.popup("Erreur d'Export!","L'export des données n'a pas completement fonctionné !\n"); + } + }, + readinvoicepdf: function(){ + try { + var lastdir = apppref.getpreference("support.lastfiledir"); + var nsIFilePicker = Components.interfaces.nsIFilePicker; + var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker); + fp.init(window, "selectionner fichier PDF", nsIFilePicker.modeOpen); + fp.appendFilter("PDF", "*.pdf"); + if (lastdir != '') { + var nsILocalFile= Components.interfaces.nsILocalFile; + var f = Components.classes["@mozilla.org/file/local;1"].createInstance(nsILocalFile); + f.initWithPath(lastdir); + fp.displayDirectory = f; + } + var res = fp.show(); + if (res != nsIFilePicker.returnCancel) { + var pdffile = fp.file; + apppref.setpreference("support.lastfiledir",system.getDirectory(pdffile.path)); + + var cname = appdb.dbquery("select uuid from creche LIMIT 1;"); + cruuid = cname.sqldata[0].uuid; + var importpath = FileUtils.File(curcfg.path.local + system.sep() +"imports" + system.sep() + cruuid); + var args = ["-db",'"' + appdb.dbFile.path + '"',"-p",'"' +pdffile.path + '"',"-o",'"' + importpath.path + '"',"-t",'"' + system.toolsdir() + '"',"-x","inv","-l", '"' + system.profiledir() + system.sep() + 'importerror.log"']; + + var binpdf = system.toolsdir() + system.sep() + "pdfextract.exe"; + if (system.os != "WINNT") { + binpdf = system.toolsdir() + system.sep() + "pdfextract"; + } + //dump(binpdf + " " +JSON.stringify(args) + "\n"); + system.popup("Import Factures!","Import du PDF '"+ pdffile.path +"' en cours!\n"); + system.runcmdline(binpdf,args,function(data){ + var strx = apppref.getpreference("pageconfig.lastpage"); + var x = JSON.parse(strx); + + if (x.module == 'accounting') { + navigation.load_appview(x.view,x.module,null,x.header); + } + system.popup("Import Factures!","Les factures ont été importées!\n"); + }); + + } + } catch(ex){ + system.popup("Erreur d'import!","Une Erreur s'est produite pendant l'import des factures!\n"); + //dump("Error importing invoice PDF! " + ex + "\n"); + } + }, + readbenefitstatement: function(){ + try { + var lastdir = apppref.getpreference("support.lastfiledir"); + var nsIFilePicker = Components.interfaces.nsIFilePicker; + var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker); + fp.init(window, "selectionner fichier PDF", nsIFilePicker.modeOpen); + fp.appendFilter("PDF", "*.pdf"); + if (lastdir != '') { + var nsILocalFile= Components.interfaces.nsILocalFile; + var f = Components.classes["@mozilla.org/file/local;1"].createInstance(nsILocalFile); + f.initWithPath(lastdir); + fp.displayDirectory = f; + } + var res = fp.show(); + if (res != nsIFilePicker.returnCancel) { + var pdffile = fp.file; + apppref.setpreference("support.lastfiledir",system.getDirectory(pdffile.path)); + + var cname = appdb.dbquery("select uuid from creche LIMIT 1;"); + cruuid = cname.sqldata[0].uuid; + var importpath = FileUtils.File(curcfg.path.local + system.sep() +"imports" + system.sep() + cruuid); + var args = ["-db",'"' + appdb.dbFile.path + '"',"-p",'"' + pdffile.path + '"',"-o",'"' + importpath.path +'"',"-t",'"' + system.toolsdir() + '"',"-x","stmt","-l",'"' + system.profiledir() + system.sep() + 'importerror.log"']; + var binpdf = system.toolsdir() + system.sep() + "pdfextract.exe"; + if (system.os != "WINNT") { + binpdf = system.toolsdir() + system.sep() + "pdfextract"; + } + system.runcmdline(binpdf,args,function(data){ + system.popup("Import Prestations!","Les Prestations ont été importées!\n"); + }); + } + } catch(ex){ + system.popup("Erreur d'import!","Une erreur s'est produite pendant l'import des prestations!\n"); + //dump("Error importing statement PDF! " + ex + "\n"); + } + } + +}; diff --git a/app_v3satdemo/chrome/content/license.html b/app_v3satdemo/chrome/content/license.html new file mode 100644 index 0000000..66f6534 --- /dev/null +++ b/app_v3satdemo/chrome/content/license.html @@ -0,0 +1,147 @@ + + + + + + + + +
+
+ +

Licence Publique de l’Union européenne

+

V.1.1

+

EUPL © Communauté Européenne 2007

+

La présente Licence Publique de l’Union européenne("EUPL")1 s’applique à toute Œuvre ou Logiciel (telle que ci-dessous définis) fournissous les termes et conditions de la présente Licence. Toute utilisation de l’Œuvre, autre que ce qui est autorisé par la présente Licence, est interdite (dans la mesure où pareille utilisation est couverte par un droit du titulaire des droits d’auteur sur l’Œuvre).

+

L’Œuvre Originale est fournie sous les termes et co nditions de la présente Licence quand le Donneur de licence (telle que ci-dessous défini) aplacé la mention suivante immédiatement après la mention de son droit d’auteur sur l’Œuvre Originale:

+

Donné en licence selon les termes de l’EUPL V.1.1

+

ou a exprimé de manière quelconque sa volonté de donner en licence selon l’EUPL.

+

1. Définitions

+

Dans la présente Licence, il convient de comprendrecomme suit les termes suivants :

+

-La Licence: la présente Licence.

+

-L’Œuvre Originale ou Logiciel : le logiciel distribué et/ou communiqué par le Donneur de licence sous la présente Licence, sous forme de Code Source ou sous forme de Code Objet.

+

-L’Œuvre Dérivée : l’œuvre ou le logiciel qui peut être créé par leLicencié sur la base de l’Œuvre Originale ou de l’une de ses modificatio ns. La présente Licence ne définit pas le degré de modification ou de dépendance requis par rapport à l’Œuvre Originale pour caractériser une Œuvre Dérivée ; cette question est réglée selon la loi applicable en matière de droit d’auteur dans le pays désigné à l’article 15.

+

-L’Œuvre : ce terme générique désigne ici l’Œuvre Originale et/ou ses Œuvres Dérivées.

+

-Le Code Source : l’Œuvre lisible par l’être humain dans la forme l a plus appropriée pour l’examiner et pour y faire des modifications.

+

-Le Code Objet : l’Œuvre codée, généralement après compilation, destinée à être exécutée comme programme par un ordinateur.

+

-Le Donneur de licence : la personne physique ou morale qui distribue ou qui communique l’Œuvre sous la Licence.

+

-Le(s) Contributeur(s) : désignant toute personne physique ou morale qui modifie l’Œuvre sous la Licence, ou contribue de quelque ma nière à en faire une Œuvre Dérivée.

+

-Le Licencié ou « Vous » désignant toute personne physique ou morale qui utilise l’Œuvre conformément à la présente Licence.

+

-La Distribution et/ou la Communication: toute action de vente, don, prêt, louage,

+

1EUPL: "European Union Public Licence"

+
+
+
+
+ + +

distribution, communication, transmission ou de rendre disponible, en ligne ou hors ligne, des copies de l’Œuvre ou l’accès à ses fonct ionnalités essentielles à d’autres personnes physiques ou morales.

+

2. Etendue des droits accordés par la Licence

+

Le Donneur de licence Vous concède pour la durée dela protection de son droit d’auteur sur l’Œuvre Originale une Licence mondiale , gratuite, non exclusive, et qui peut faire l'objet de sous-licences, de faire ce qui suit:

+ + + + + + + + + + + + + + + + + + + + + +

∙

utiliser l’Œuvre en toute circonstance et pour tout

usage,

∙

reproduire l’Œuvre,

 

∙

modifier l’Œuvre Originale, et de faire des Œuvres

Dérivées sur la base de

 

l’Œuvre,

 

+

∙communiquer, présenter ou représenter l'œuvre ou copie de celle-ci au public, en ce compris le droit de mettre celles-ci à la dis position du public,

+

∙distribuer l’Œuvre ou des copies de celles-ci,

+

∙prêter et louer l’Œuvre ou des copies de celles-ci,

+

∙sous-licencier les droits concédés ici sur l’Œuvre ou sur des copies de celles- ci.

+

Ces droits peuvent être exercés sur tout média, support et format, connu ou encore à inventer, dans la mesure où le droit applicable l e permet.

+

Dans les pays où les droits moraux sont d’application, le Donneur de licence renonce à son droit d’exercer ses droits moraux dan s la mesure nécessaire à ce que la Licence des droits patrimoniaux ci-dessus explicités produise tous ses effets.

+

Le Donneur de licence Vous concède de manière non xclusive et gratuite, toute utilisation de brevets qui seraient détenus par le Donneur de licence, dans la mesure nécessaire à l’exercice des droits qui Vous sont concédés sur l’Œuvre distribuée sous la présente Licence.

+

3. Communication du code source

+

Le Donneur de licence fournit l’Œuvre en Code Sourc e ou en Code Objet. Si l’Œuvre est fournie en Code Objet, le Donneur de li cence fournit en plus une copie numérique lisible par ordinateur du Code Source de l’Œuvre avec chacune des copies de l’Œuvre que le Donneur de licence dis tribue, ou indique dans un avis qui suit la notice de droits d’auteur apposée à l’Œuvre, l’endroit où le Code Source peut être facilement et gratuitement accessible aussi longtemps que le Donneur de licence distribue ou communique l’Œuvre.

+

4. Limitations au droit d’auteur

+

Rien dans la présente Licence n’a pour but de priver le Licencié du bénéfice de toute exception ou limitation aux droits exclusifs des titulaires des droits sur l’Œuvre Originale ou le Logiciel, de l’épuisement d e ces droits ou de toute autre limitation applicable.

+
+
+
+
+ + +

5. Obligations du Licencié

+

La concession des droits ci-dessus est soumise à de s restrictions, c'est-à-dire des obligations imposées au Licencié. Ces obligationsonts les suivantes :

+

∙Droit d’attribution : le Licencié devra laisser intactes toutes les notifications de droit d’auteur, brevet et/ou marque et toutes les notifications faisant référence à la Licence et à l’exclusion de garantie. Le Licenci é doit inclure une copie de ces notifications et de la Licence avec chaque copie de l’Œuvre qu’il distribuera ou communiquera. Le Licencié veillera à ce que ses modifications ou Œuvres Dérivées portent une notification bien visible annonçant qu’il a modifié l’Œuvre, et la date de la modification.

+

∙Clause Copyleft: Si le Licencié distribue ou communique des copiesde l’Œuvre Originale ou des Œuvres Dérivées de l’Œuvre Origina le, la Distribution et/ou Communication se fera sous cette même Licence EUPLou sous une version ultérieure de cette Licence, sauf si l’Œuvre Origin ale est expressément distribuée seulement sous la présente version de la Licence. Le Licencié (devenant Donneur de licence) ne peut pas offrir ou imposer d’autres termes ou conditions sur l’Œuvre ou les Œuvres Dérivées, qui restreindra ient ou altéreraient les termes de la Licence.

+

∙Clause de compatibilité :Si le Licencié distribue ou communique des Œuvres Dérivées ou des copies de celles-ci basées à la fois sur l’Œuvre Originale et sur une autre œuvre concédée en licence selon les termes d’une Licence Compatible, la Distribution et/ou Communication peut se faire sous les termes de cette Licence Compatible. Pour l’application du présent article, «Licence Compatible » renvoie aux Licences citées en annexe de la présente Licence. Dans le cas où les obligations du Licencié conformément à la Licence Compatible entrent en conflit avec les obligations du Licencié conformément à la présente Licence, les premières prévaudront.

+

∙Fourniture du Code Source: S’il distribue ou communique des copies de l’Œuvre, le Licencié fournira une copie en format d igital standard du Code Source ou indiquera l’endroit où ces sources sont facilement et librement accessibles aussi longtemps qu’il distribuera ou communiquera l’Œuvre.

+

∙Protection des droits: La présente Licence ne donne aucune permission d’utiliser les noms commerciaux, marques de produit ou de service ou les noms des Donneurs de licence, sauf ce qui est nécessaireà une utilisation raisonnable et dictée par les pratiques habituelles de décrirel’origine de l’Œuvre et de reproduire le contenu des notifications de droits d’auteur.

+

6.Chaîne d’auteurs

+

Le Donneur de licence original garantit que les droits d’auteur protégeant l’Œuvre Originale et concédés par la présente Licence sontsa propriété ou lui ont été donnés sous licence et qu’il/elle a le pouvoir et la capacité de les donner sous la présente Licence.

+
+
+ + +

Chaque Contributeur garantit que les droits d’auteur protégeant sa contribution et concédés par la présente Licence sont sa propriétéou lui ont été donnés sous licence et qu’il/elle a le droit et la capacité de les donner sous la présente Licence.

+

Chaque fois que Vous acceptez la Licence, le Donneur de licence original et les Contributeurs successifs Vous concèdent une Licence sur toutes leurs contributions

+

àl’Œuvre selon les termes de la présente Licence.

+

7.Exclusion de garantie

+

L’Œuvre est un travail en cours, destinée à être co ntinuellement améliorée par des contributeurs successifs. C’est un travail inachevé, qui peut dès lors contenir des défauts ou erreurs inhérentes à ce type de développement.

+

Pour la raison ci-dessus, l’Œuvre est fournie sous la Licence telle quelle, sans aucune garantie d’aucune sorte la concernant, y compris de manière non exhaustive quant à sa commercialisation, l’aptitude à remplir une fonctionnalité déterminée, l’absence de défauts ou erreurs, l’efficacité, la on violation de droits intellectuels autres que le droit d’auteur comme il est stipulé à l’article 6.

+

Cette exclusion de garantie est une partie essentielle de la Licence et une condition pour la concession de droits sur l’Œuvre.

+

8. Exclusion de responsabilité

+

Sauf dans le cas de dommages causés avec intention de nuire ou dans le cas de dommages directement causés à des personnes physiques, le Donneur de licence ne sera en aucun cas responsable d’aucun dommage, quelle qu’en soit la nature, direct ou indirect, matériel ou moral, qui surviendrait dela Licence ou de l’utilisation de l’Œuvre, y compris sans s’y limiter, des dommages c ausés par la perte de clientèle, arrêt de travail, mauvais fonctionnement ou arrêtedmatériel informatique, perte de données, ou tout autre dommage commercial, même sile Donneur de licence avait connaissance de la possibilité de pareils dommages. Cependant, le Donneur de licence sera responsable selon les termes des lois impératives relatives à la responsabilité du fait des produits, dans la mesure où ces lois sont applicables à l’Œuvre.

+

9. Contrats additionnels

+

Lors de la Distribution de l’Œuvre Originale ou d’Œ uvres Dérivées, Vous pouvez conclure un contrat distinct pour offrir, contre rémunération, une aide, une garantie, des indemnités, ou d’autres obligations de responsabilité, et/ou d’autres services compatibles avec la présente Licence. Cependant, enacceptant pareilles obligations, Vous ne pouvez engager que votre seule responsabilité et en votre nom propre et non au nom du Donneur de licence original ou de tout autre Contributeur, et seulement si vous acceptez d’indemniser, défendre et décharger out Contributeur de toute responsabilité, au cas où ces Contributeurs seraient inquiétés d’une manière quelconque par le fait que Vous ayez accepté pareiles obligations de garantie ou responsabilités additionnelles.

+
+
+ + +

10. Acceptation de la Licence

+

Vous pouvez exprimer votre accord sur le contenu de la présente Licence en cliquant sur une Icône « j’accepte » placée au bas d’une fenêtre faisant apparaîtreel texte de la présente Licence, ou toute autre manifestation de consentement similaire, conformément à la loi applicable. Le fait de cliquer sur cette Icône indique votre acceptation claire et irrévocable de la présente Licence et de tous ses termes et conditions.

+

De même, Vous acceptez irrévocablement la présenteLicence et de tous ses termes et conditions par le fait d’exercer un des droits qui Vous sont concédés par l’article 2 de la présente Licence, tels que la création d’uneŒuvre Dérivée, la Distribution et/ou la Communication par Vous de l’Œuvre ou de se s copies.

+

11. Information due au public

+

Au cas où Vous distribuez ou communiquez l’Œuvre pa r des moyens de communication électroniques (par exemple en permettant son déchargement à distance) le canal de distribution ou media (par exemple, le site Web) devra au minimum fournir au public les informations requises par la loi applicable en ce qui concerne le Donneur de licence, la Licence et la manière dont elle peut être accessible, conclue, conservée et reproduite par leLicencié.

+

12. Fin de la Licence

+

La Licence et les droits concédés par cette dernièrprendront fin automatiquement dès que le Licencié n’aura pas respecté une des conditions de la présente Licence.

+

Cet événement ne mettra pas fin aux Licences des personnes qui auraient reçu l’Œuvre du Licencié en vertu de la présente Licence , à condition que ces personnes respectent les termes de la Licence.

+

13. Divers

+

Sous réserve de l’article 9, la Licence représentel’entièreté de l’accord entre les parties quant à l’Œuvre donnée en licence.

+

Si une clause quelconque de la Licence était déclarée invalide ou inopposable selon le droit applicable, cela n’affectera pas l’entièreté de la validité ou de l’opposabilité de la Licence. Pareille clause sera interprétée et/ou modifiée de manière juste suffisante pour qu’elle devienne valide et opposable.

+

La Commission européenne peut publier d’autres versions linguistiques et/ou de nouvelles versions de la présente Licence, dans lamesure de ce qui est nécessaire et raisonnable, sans réduire l’étendue des droits accordés par la Licence. Les nouvelles versions de la Licence seront publiées avec un numéro de version unique.

+
+
+ + +

Toutes les versions linguistiques de cette Licence, approuvées par la Commission européenne, sont équivalentes. Les parties peuventse prévaloir de la version linguistique de leur choix.

+

14. For (Tribunal compétent)

+

Tout litige résultant de l’interprétation de la présente Licence, survenant entre la Commission Européenne comme Donneur de licence et un Licencié, sera porté devant la Cour de Justice des Communautés européennes, conformément à l’article 238 du Traité instituant la Communauté européenne.

+

Tout litige survenant entre Parties, autres que la Commission européenne, et résultant de l’interprétation de la présente Licence, sera porté devant la juridiction du lieu où le Donneur de licence réside ou exerce sonactivité principale.

+

15. Loi applicable

+

La présente Licence sera interprétée conformément laà loi de l’Etat membre de l’Union européenne où le Donneur de licence résideou a établi son siège social.

+

La présente Licence sera interprétée conformémentlaà loi belge si :

+

-un différend survient entre la Commission européenne, comme Donneur de licence, et un Licencié.

+

-le Donneur de licence, autre que la Commission européenne, n’a pas établi de siège social ou de résidence sur le territoire d’un Etat membre de l’Union européenne.

+

====

+
+
+ + +

Annexe

+

Les "Licences compatibles"? pour l’application de l ’article 5 EUPL sont:

+

-GNU General Public License (GNU GPL) v. 2

+

-Open Software License (OSL) v. 2.1, v. 3.0

+

-Common Public License v. 1.0

+

-Eclipse Public License v. 1.0

+

-Cecill v. 2.0

+
+ + diff --git a/app_v3satdemo/chrome/content/modules/accounting/accounting.html b/app_v3satdemo/chrome/content/modules/accounting/accounting.html new file mode 100644 index 0000000..0e794e7 --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/accounting/accounting.html @@ -0,0 +1,179 @@ + + + + + + + Décompte + + + + + + + + + + + + + + + + + + + +
+
+
+ du mois: + + +
+ + + + +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + diff --git a/app_v3satdemo/chrome/content/modules/accounting/accounting.xul b/app_v3satdemo/chrome/content/modules/accounting/accounting.xul new file mode 100644 index 0000000..db9ca6d --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/accounting/accounting.xul @@ -0,0 +1,24 @@ + + + + + + + + + + diff --git a/app_v3satdemo/chrome/content/modules/accounting/accountingchild.html b/app_v3satdemo/chrome/content/modules/accounting/accountingchild.html new file mode 100644 index 0000000..59b387c --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/accounting/accountingchild.html @@ -0,0 +1,176 @@ + + + + + + + Décompte Enfant + + + + + + + + + + + + + + + + + + + +
+
+
+ du année: + + +
+
+ du enfant: + +
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + diff --git a/app_v3satdemo/chrome/content/modules/calendar/img/calendar.png b/app_v3satdemo/chrome/content/modules/calendar/img/calendar.png new file mode 100644 index 0000000..cf44ff5 Binary files /dev/null and b/app_v3satdemo/chrome/content/modules/calendar/img/calendar.png differ diff --git a/app_v3satdemo/chrome/content/modules/calendar/js/calactivity.js b/app_v3satdemo/chrome/content/modules/calendar/js/calactivity.js new file mode 100644 index 0000000..f978b76 --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/calendar/js/calactivity.js @@ -0,0 +1,1090 @@ +//Source-code licensed under EUPL v1.1 ( Copyright 2016 By DKS s.à r.l. - Kilian Saffran - Luxembourg ) + +var pconfig = {}; +var initdate = new Date(); +initdate.setDate(1); +var lastmonthday = null; +var firstmonday = null; +var lastsunday = null; +var winh = window.innerHeight - 140; +var tblacc = null; +var lblfreq = {daily:'jour(s)',weekly:'semaine(s)',monthly:'mois'}; +var amonth = ['', 'Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Aôut', 'Septembre','Octobre', 'Novembre', 'Décembre']; +var linkpos = {}; +var posday = {}; +var delac = null; +var curfreq ={}; +var redate = /\d\d.\d\d.\d\d\d\d/; +var tblcal = null; +var vacpos = {}; +var vacdata = null; +var drsql = ""; +var eventdates = {}; +var curevcolor = ""; +var alltr = {}; +var rtblall = {}; +var crsel = []; +function initdata() { + //curcfg.loadconfig(apppref.getpreference("creorga.support.database.currentdb.num")); + load_helpers(); + $('#view_list').hide(); + var configdata = apppref.getpreference("pageconfig.calactivity"); + if (!configdata) { + apppref.setpreference("pageconfig.calactivity", ''); + } + if (configdata !== '') { + pconfig = JSON.parse(configdata); + } + pconfig.view = 'table'; + //if (!pconfig.printlayout) { + pconfig.printlayout = 'table'; + apppref.setpreference("pageconfig.calactivity",pconfig); + //} + if (pconfig.calmonth) { + + initdate = new Date(encodeparam(pconfig.calmonth, 'month').replace(/'/g, '')); + $("#calmonth").val(pconfig.calmonth); + } else { + $("#calmonth").val(initdate.toLocaleFormat('%m.%Y')); + pconfig.calmonth = initdate.toLocaleFormat('%m.%Y'); + } + + load_staff_selection('filter_staff'); + load_activity_selection('filter_activity','multiple'); + load_staff_selection('staffuuid'); + //load_creche_selection(); + set_infoheader(amonth[parseInt(pconfig.calmonth.substring(0,3))] + " " + pconfig.calmonth.substring(3,8)); + load_calendar_month(); + + $('#calmonth').on('dp.hide',function(e){ + set_calmonth(); + }); + $('#frmeditevent #color').minicolors({theme:'bootstrap',position: 'bottom right'}); + $("#weekly_byday :input").change(function() { + + if (this.checked) { + this.setAttribute("checked",true); + }else { + this.removeAttribute("checked"); + } +}); + $("#monthly_bydaypos :input").change(function() { + + if (this.checked) { + this.setAttribute("checked",true); + }else { + this.removeAttribute("checked"); + } + +}); + $("#monthly_bydaywday :input").change(function() { + + if (this.checked) { + this.setAttribute("checked",true); + }else { + this.removeAttribute("checked"); + } + +}); + $("#monthly_bymonthday :input").change(function() { + + if (this.checked) { + this.setAttribute("checked",true); + }else { + this.removeAttribute("checked"); + } + +}); + $("#monthly_by :input").change(function() { + var xd = this.id.split("_"); + curfreq.freqtype=xd[2]; + + this.setAttribute("checked",true); + + $('#freq_monthly_byday').hide(); + $('#freq_monthly_bymonthday').hide(); + $('#pnl_monthly_byday').removeAttr("checked"); + $('#pnl_monthly_bymonthday').removeAttr("checked"); + + $('#freq_' + this.value).show(); + +}); + + $('#frmeditevent #datefrom').on("blur",function (e) { + var ok = true; + if ($('#frmeditevent #datefrom').val().match(redate)) { + $('#btn_save_event').removeAttr("disabled"); + }else { + ok = false; + $('#btn_save_event').attr("disabled","1"); + } + if ((ok === true) && ($('#frmeditevent #dateto').val() !== '')) { + var tmpdt1 = encodeparam($('#frmeditevent #datefrom').val(),'date'); + var tmpdt2 = encodeparam($('#frmeditevent #dateto').val(),'date'); + + if (tmpdt1 >= tmpdt2) { + $('#btn_save_event').attr("disabled","1"); + } else { + $('#btn_save_event').removeAttr("disabled"); + } + + } + }); + $('#frmeditevent #dateto').on("blur",function (e) { + var ok = true; + if ($('#frmeditevent #dateto').val().match(redate)) { + $('#btn_save_event').removeAttr("disabled"); + }else { + ok = false; + $('#btn_save_event').attr("disabled","1"); + } + if ((ok === true) && ($('#frmeditevent #dateto').val() !== '')) { + var tmpdt1 = encodeparam($('#frmeditevent #datefrom').val(),'date'); + var tmpdt2 = encodeparam($('#frmeditevent #dateto').val(),'date'); + + if (tmpdt1 >= tmpdt2) { + $('#btn_save_event').attr("disabled","1"); + } else { + $('#btn_save_event').removeAttr("disabled"); + } + + } + }); +} + +function load_calendar_month() { + + firstmonday = new Date(initdate.getFullYear(), initdate.getMonth(), -1 * parseInt(initdate.toLocaleFormat('%w')) + 2); + if (firstmonday > initdate) { + firstmonday = new Date(initdate.getFullYear(), initdate.getMonth(),firstmonday.getDate()-7); + } + lastmonthday = new Date(initdate.getFullYear(), initdate.getMonth() + 1, 1); + + lastsunday = new Date(lastmonthday.getFullYear(), lastmonthday.getMonth(), lastmonthday.getDate() + 7 - parseInt(lastmonthday.toLocaleFormat('%w'))); + + var weeknum = 0; + var cmonth = initdate.getMonth(); + var sday = []; + firstmonday = new Date(initdate.getFullYear(), initdate.getMonth(), -1 * parseInt(initdate.toLocaleFormat('%w')) + 2); + if (firstmonday > initdate) { + firstmonday = new Date(initdate.getFullYear(), initdate.getMonth(),firstmonday.getDate()-7); + } + load_vacancy_data(); + + load_calendar_data(); + +} + +function load_calendar_data() { + var where = []; + if ((pconfig.filterstaff) && (pconfig.filterstaff.length > 0)) { + where.push(" st.uuid in ('"+ pconfig.filterstaff.join("','") + "')"); + } + if ((pconfig.filteractivity) && (pconfig.filteractivity.length > 0)) { + where.push(" cal.description in ('"+ pconfig.filteractivity.join("','") + "')"); + } + var sql = "SELECT cal.uuid, cal.datefrom, cal.dateto, '
' || strftime('%Y%m%d',cal.datefrom) ||'
' || strftime('%d.%m.%Y',cal.datefrom) AS tbldatefrom ,strftime('%Y%m%d',cal.datefrom) AS strdatefrom, strftime('%Y%m%d',cal.dateto) AS strdateto,cal.timefrom, cal.timeto, cal.description, cal.location, cal.color, cal.freq, '[\"' || GROUP_CONCAT(sp.staffuuid,'\",\"') || '\"]' as staffuuid, GROUP_CONCAT(coalesce(st.surname,'') || ' ' || coalesce(st.prename,''), '
' ) as staffnames ,'[\"' || GROUP_CONCAT(st.color,'\",\"') || '\"]' as staffcolors from eventcalendar cal " + ((pconfig.filterstaff)?"":" left ") +" join staffplanning sp on (cal.uuid=sp.eventcalendaruuid " + ((pconfig.filterstaff)?" AND sp.staffuuid in ('"+ pconfig.filterstaff.join("','") + "')":"") +") left join staff st on (sp.staffuuid=st.uuid) "+ + + " where (cal.datefrom between '" + initdate.toLocaleFormat('%Y-%m-%d') + "' and '" + lastmonthday.toLocaleFormat('%Y-%m-%d') + "' and (cal.dateto >= '" + initdate.toLocaleFormat('%Y-%m-%d') + "' or cal.dateto is null)) or (cal.dateto between '" + initdate.toLocaleFormat('%Y-%m-%d') + "' and '" + lastmonthday.toLocaleFormat('%Y-%m-%d') + "' and cal.datefrom < '" + initdate.toLocaleFormat('%Y-%m-%d') + "') or ((cal.datefrom <= '" + firstmonday.toLocaleFormat('%Y-%m-%d') + "') and ((cal.dateto >= '" + lastmonthday.toLocaleFormat('%Y-%m-%d') + "') or cal.dateto is null)) "+ ((where.length > 0)?" AND (" + where.join(" or ") + ")":"")+" group by cal.uuid order by cal.datefrom,cal.dateto;"; + + var caldata = appdb.dbquery(sql); + + caldata = caldata.sqldata; + get_vacancy_data(); + + for (var c in caldata) { + if (!eventdates[caldata[c].uuid]) { + eventdates[caldata[c].uuid] = {}; + } + var freq = caldata[c].freq; + if (freq !== '') { + freq += ';DTSTART='+caldata[c].strdatefrom + 'T000000Z'; + if ((caldata[c].dateto !== '') && (caldata[c].dateto <= lastmonthday.toLocaleFormat('%Y-%m-%d'))){ + freq += ';UNTIL='+caldata[c].strdateto + 'T000000Z'; + }else { + freq += ';UNTIL='+lastmonthday.toLocaleFormat('%Y%m%d') + 'T000000Z'; + } + } + + if (freq !== ""){ + try { + var rule = RRule.fromString(freq); + rall = rule.all(); + } catch (ex){ + //dump("ERROR! loading data!" + ex + " FREQ:" + freq + "\n"); + } + } else { + continue; + } + for (var r in rall){ + //dump(rall[r].toLocaleFormat('%Y-%m-%d') + " " + initdate.toLocaleFormat('%Y-%m-%d')+ " " + lastmonthday.toLocaleFormat('%Y-%m-%d') + "\n" ); + if ((rall[r].toLocaleFormat('%Y-%m-%d') >= initdate.toLocaleFormat('%Y-%m-%d')) && (rall[r].toLocaleFormat('%Y-%m-%d') <= lastmonthday.toLocaleFormat('%Y-%m-%d'))) { + //dump("OK " + rall[r].toLocaleFormat('%Y-%m-%d') + " " + initdate.toLocaleFormat('%Y-%m-%d')+ " " + lastmonthday.toLocaleFormat('%Y-%m-%d') + "\n" ); + if (!eventdates[caldata[c].uuid][rall[r].toLocaleFormat('%d')]) { + eventdates[caldata[c].uuid][rall[r].toLocaleFormat('%d')] = 1; + } + } + + } + } + load_timetable(); +} + +function load_timetable() { + $('#tbl_timetable').html(""); + drsql = getdaterangesql(); + var ophdata = getoph(); + + var thead = []; + var weekrange = {}; + var ltd = ""; + for (var t in ophdata){ + var dx = new Date(ophdata[t].daydate); + if (!weekrange[parseInt(dx.toLocaleFormat('%W'))]) { + weekrange[parseInt(dx.toLocaleFormat('%W'))] = 1; + }else if (ltd != ophdata[t].daydate) { + weekrange[parseInt(dx.toLocaleFormat('%W'))] += 1; + } + var head = ophdata[t].daydate.substring(8,10); + if (thead.indexOf(head) == -1) { + thead.push(head); + + } + + ltd = ophdata[t].daydate; + + } + var actdata = getstaffactivity(); + + var lev = ""; + var lst = ""; + + var ev = {}; + + var alltrx = {}; + for (var ac in actdata){ + var evid = actdata[ac].eventuuid; + + if ((evid) && (lev !== evid) && (!alltrx[evid])) { + ev = {"eventuuid":evid,"description": actdata[ac].description ,"timefrom":actdata[ac].timefrom,"timeto":actdata[ac].timeto,"eventcolor":actdata[ac].eventcolor}; + for (var h in thead){ + ev[thead[h]] = {}; + } + alltrx[evid] = ev; + + } + var cday = actdata[ac].daydate.substring(8,10); + + if ((evid) && (eventdates[evid]) && (eventdates[evid][cday])) { + + alltrx[evid][cday]={"staffuuid":JSON.parse(actdata[ac].staffuuid),"staffcolor":JSON.parse(actdata[ac].staffcolor),"staffnames":JSON.parse(actdata[ac].staffnames)}; + + } + lev = null; + lev = evid; + + } + + var vacdata = getstaffvacancy(); + var staffuuids = []; + for (var vc in vacdata){ + var dx = new Date(vacdata[vc].daydate).toLocaleFormat('%d'); + if (staffuuids.indexOf(vacdata[vc].staffuuid)) { + staffuuids.push(vacdata[vc].staffuuid); + } + for (var e in alltrx){ + + if (alltrx[e][dx]['staffuuid']) { + var idx = alltrx[e][dx]['staffuuid'].indexOf(vacdata[vc].staffuuid); + + if (idx != -1) { + + if (vacdata[vc].timefrom==vacdata[vc].timeto) { + alltrx[e][dx]['staffcolor'][idx] = "transparent"; + }else { + + var tfto =((parseInt(vacdata[vc].timeto.substring(1,2)) - parseInt(vacdata[vc].timefrom.substring(1,2)))/8)*100; + var clr = alltrx[e][dx]['staffcolor'][idx]; + + alltrx[e][dx]['staffcolor'][idx] = "linear-gradient(to right, "+convertHex(clr,1)+" 0%,"+convertHex(clr,1)+" "+tfto+"%,rgba(0,0,0,0) 100%)"; + } + + } + } + } + + } + var cspan = 0; + var hdays = get_vacancydays(); + var strhead = 'Semaine'; + for (var w in weekrange){ + strhead += '' + w + ''; + cspan += weekrange[w]; + } + strhead += '  de à '; + for (var th in thead){ + var sty=""; + if (hdays[thead[th]]) { + sty =' style="background-color: '+((hdays[thead[th]]=='vacancy')?'#FF7145':'#FF9C2A')+' !important;" '; + } + strhead += ''+ thead[th]+''; + } + + strhead += ''; + $('#tbl_timetable').append(strhead); + $('#tbl_timetable').append(''); + cspan +=3; + + var actchange = ""; + //dump(JSON.stringify(alltr) + "\n"); + for (var a in alltrx){ + + if (alltrx[a].description != actchange) { + $('#tbl_timetable').append(' '+alltrx[a].description+''); + } + actchange = alltrx[a].description; + var trn = ''; + trn += ''+alltrx[a].timefrom+''+alltrx[a].timeto+''; + for (var h in thead){ + if ((hdays[thead[h]]) && (hdays[thead[h]] == 'vacancy')) { + trn += ''; + continue; + } + if (alltrx[a][thead[h]]) { + + trn += ''; + if (alltrx[a][thead[h]]["staffcolor"]) { + var xx = alltrx[a][thead[h]]["staffcolor"]; + for (var r in xx){ + var col = ""; + if (xx[r] == 'transparent') { + col = 'color: transparent; display: none;'; + } + trn += '
'+alltrx[a][thead[h]]["staffnames"][r] +'
'; + } + + } + + trn += ''; + }else { + trn += ''; + } + } + trn += ''; + + $('#tbl_timetable').append(trn); + + } + //dump(JSON.stringify(vacdata) + "\n"); + +// if ((vacdata.length > 0) && ((!pconfig.filtervacancy) || (pconfig.filtervacancy && pconfig.filtervacancy === "1"))){ +// var staffnames = appdb.dbquery("SELECT uuid,prename || ' ' || surname as fullname, substr(prename,1,2) || ' ' || substr(surname,1,2) as shortname,color from staff where uuid in ('" + staffuuids.join("','")+"');"); +// staffnames = staffnames.sqldata; +// $('#tbl_timetable').append(' Congé(s)'); +// var days = cspan-3; +// var stxcolor = {}; +// for (var stu in staffnames){ +// //dump(JSON.stringify(staffnames[stu]) + "\n"); +// stxcolor[staffnames[stu].uuid] = staffnames[stu].color; +// var row = ''+ staffnames[stu].fullname+''; +// //$('#tbl_timetable').append(); +// for (var d in thead){ +// if ((hdays[thead[d]]) && (hdays[thead[d]] == 'vacancy')){ +// row += ''; +// }else { +// row += ''; +// } +// +// } +// row += ''; +// $('#tbl_timetable').append(row); +// } +// $('#tbl_timetable').append(''); +// for (var vc in vacdata){ +// var da = vacdata[vc].daydate.substring(8,10); +// var hh = ""; +// if (vacdata[vc].timefrom==vacdata[vc].timeto) { +// hh="8h"; +// }else { +// hh=parseInt(vacdata[vc].timeto.substring(1,2))-parseInt(vacdata[vc].timefrom.substring(1,2)) + "h"; +// } +// +// $('#tblcon_' + vacdata[vc].staffuuid + '_' + da + "").append('
'+ hh + ((vacdata[vc].type == "-1")?' ':"")+'
'); +// // +// //dump(+ " > " + da +"\n"); +// } +// }else { + $('#tbl_timetable').append(''); +// } + + +} + +function load_vacancy_data() { + var sql = "select vacancydate,strftime('%Y%m%d',vacancydate) as strvacancydate,vacancydateto,case when vacancydateto is not null then strftime('%Y%m%d',vacancydateto) else null end as strvacancydateto,vacancydescription from vacancy " + + "where (vacancydate between '" + firstmonday.toLocaleFormat('%Y-%m-%d') + "' and '" + lastsunday.toLocaleFormat('%Y-%m-%d') + "' and (vacancydateto >= '" + firstmonday.toLocaleFormat('%Y-%m-%d') + "' or vacancydateto is null)) or (vacancydateto between '" + firstmonday.toLocaleFormat('%Y-%m-%d') + "' and '" + lastsunday.toLocaleFormat('%Y-%m-%d') + "' and vacancydate < '" + firstmonday.toLocaleFormat('%Y-%m-%d') + "') or ((vacancydate <= '" + firstmonday.toLocaleFormat('%Y-%m-%d') + "') and (vacancydateto >= '" + lastsunday.toLocaleFormat('%Y-%m-%d') + "')) " + + "order by vacancydate,vacancydateto;"; + var caldata = appdb.dbquery(sql); + caldata = caldata.sqldata; + for (var c in caldata) { + var freq = "FREQ=DAILY"; + freq += ';DTSTART='+caldata[c].strvacancydate + 'T000000Z'; + + if (caldata[c].vacancydateto !== ''){ + freq += ';UNTIL='+caldata[c].strvacancydateto + 'T000000Z'; + }else { + freq += ';UNTIL='+caldata[c].strvacancydate + 'T000000Z'; + } + try { + var rule = RRule.fromString(freq); + var rall = rule.all(); + + for (var r in rall){ + if ((rall[r].toLocaleFormat('%Y-%m-%d') >= initdate.toLocaleFormat('%Y-%m-%d')) && (rall[r].toLocaleFormat('%Y-%m-%d') <= lastmonthday.toLocaleFormat('%Y-%m-%dT00:00.000Z'))) { + + $("#" + linkpos["" + rall[r].toLocaleFormat('%Y-%m-%d')] + " > div.panel-day > div.panel-dayhead").addClass(((caldata[c].vacancydateto == '')?'calvacancy':'calvacrange')); + $("#" + linkpos["" + rall[r].toLocaleFormat('%Y-%m-%d')] + " > div.panel-day > div.panel-dayhead > div#vacname").remove(); + $("#" + linkpos["" + rall[r].toLocaleFormat('%Y-%m-%d')] + " > div.panel-day > div.panel-dayhead").prepend('
'+ caldata[c].vacancydescription + "
 "); + } + } + } catch (ex){ + } + } +} + +function load_staff_selection(objid,option){ + var stdata = appdb.dbquery("select uuid, coalesce(surname,'') || ' ' || coalesce(prename,'') as name,case when color is null then '#000' else color end as color from staff order by surname,prename"); + stdata = stdata.sqldata; + for (var s in stdata){ + $('#' + objid).append(''); + } + if (objid == 'filter_staff') { + $('#' + objid).multiselect({enableHTML: true,numberDisplayed:1,nonSelectedText:"Tous",allSelectedText: 'Tous',nSelectedText: ' selections'}); + if (pconfig.filterstaff) { + $('#' + objid).multiselect('select',pconfig.filterstaff); + } + }else { + var copt = {}; + if (option) { + copt = option; + } + copt['enableHTML'] = true; + copt['nonSelectedText']="Sélectionner un(e) employé(e)..."; + copt['numberDisplayed']=5; + copt['allSelectedText']='Tous'; + copt['nSelectedText']=' selections'; + + $('#' + objid).multiselect(copt); + } + +} + +//function load_creche_selection(){ +// var accdb = appdb.getaccessibledatabases(); +// for (var i in accdb){ +// +// $('#filter_creche').append(''); +// //dump(JSON.stringify(accdb[i]) + "\n"); +// } +// +// $('#filter_creche').multiselect({enableHTML: true,numberDisplayed:1,nonSelectedText:"Crèche Courrant",allSelectedText: 'Tous',nSelectedText: ' selections'}); +// if (pconfig.filtercreche) { +// $('#filter_creche').multiselect('select',pconfig.filtercreche); +// }else { +// var xar = []; +// xar.push(curcfg.dbnum); +// $('#filter_creche').multiselect('select',curcfg.dbnum); +// pconfig.filtercreche = xar; +// } +//} + +function load_activity_selection(objid,type) { + var stdata = appdb.dbquery("select uuid,description as activity,color from eventcalendar group by description,color;"); + stdata = stdata.sqldata; + for (var s in stdata){ + $('#' + objid).append(''); + } + if (pconfig.filteractivity) { + $('#' + objid).multiselect({enableHTML: true,numberDisplayed:1,nonSelectedText:"Tous",allSelectedText: 'Tous',nSelectedText: ' selections'}); + $('#' + objid).multiselect('select',pconfig.filteractivity); + } else if (type == 'multiple') { + $('#' + objid).multiselect({enableHTML: true,numberDisplayed:1,nonSelectedText:"Tous",allSelectedText: 'Tous',nSelectedText: ' selections'}); + } else { + var copt = {}; + copt['enableHTML'] = true; + copt['nonSelectedText']="Sélectionner une activité.."; + $('#' + objid).multiselect(copt); + $('#' + objid).multiselect('select',null); + } +} + +function set_calmonth() { + pconfig.calmonth = $('#calmonth').val(); + apppref.setpreference("pageconfig.calactivity", pconfig); + globelreq.send_request({ + page: 'calactivity', + module: 'calendar', + header: 'Organisation Personnel' + }, null); +} + +function onnextmonth() { + var tmpmonth = new Date(encodeparam(pconfig.calmonth, 'month').replace(/'/g, '')); + var nmonth = new Date(tmpmonth.getFullYear(), tmpmonth.getMonth() + 1, tmpmonth.getDate()); + pconfig.calmonth = nmonth.toLocaleFormat('%m.%Y'); + apppref.setpreference("pageconfig.calactivity", pconfig); + globelreq.send_request({ + page: 'calactivity', + module: 'calendar', + header: 'Organisation Personnel' + }, null); +} + +function onpreviousmonth() { + var tmpmonth = new Date(encodeparam(pconfig.calmonth, 'month').replace(/'/g, '')); + var nmonth = new Date(tmpmonth.getFullYear(), tmpmonth.getMonth() - 1, tmpmonth.getDate()); + pconfig.calmonth = nmonth.toLocaleFormat('%m.%Y'); + apppref.setpreference("pageconfig.calactivity", pconfig); + globelreq.send_request({ + page: 'calactivity', + module: 'calendar', + header: 'Organisation Personnel' + }, null); +} + +function dlg_vacancy_detail(stuuids) { + //dump(JSON.stringify(stuuids) + "\n"); + var obj = stuuids.split(',') + var vsql = "select coalesce(surname,'') || ' ' || coalesce(prename,'') as staffname,color from staff where uuid in ('" + obj.join("','") + "');"; + //dump(vsql + "\n"); + var vst = appdb.dbquery(vsql); + vst = vst.sqldata; + $('#vacdetail').html(""); + for (var v in vst){ + $('#vacdetail').append('
'+ vst[v].staffname+'
'); + } + $("#dlg_vacancy_detail").modal('show'); + +} + +function dlg_event(uuid, type) { + $('#staffuuid').multiselect('deselectAll', false); + + //$('#cmb_clone_activity').val('none'); + $('#staffuuid').multiselect('updateButtonText'); + //$('#cmb_clone_activity').html(""); + if (type== "ins") { + $('#btndeleteevent').hide(); + + }else { + $('#btndeleteevent').show(); + } + $('#frmeditevent #freqinterval').hide(); + $('#frmeditevent #freqmonthly').hide(); + $('#frmeditevent #freqweekly').hide(); + $('#frmeditevent #freq_monthly_byday').show(); + $('#frmeditevent #freq_monthly_bymonthday').hide(); + $('#frmeditevent #freq').val(""); + $('#frmeditevent .active').removeClass('active'); + load_activity_selection('cmb_clone_activity','single'); + $('#cmb_clone_activity').multiselect('select', ['none']); + if ((type == 'upd') || (type == 'ins')) { + var evdata = { + uuid: '0', + description: '', + activityuuid:'', + location: '', + color: '', + datefrom:new Date().toLocaleFormat("%d.%m.%Y"), + dateto:'', + staffuuid:'', + timefrom: '00:00', + timeto: '00:00', + freq: '' + }; + + if (type == 'upd') { + var evsql = "SELECT uuid, strftime(\"%d.%m.%Y\",datefrom) as datefrom, strftime(\"%d.%m.%Y\",dateto) as dateto, timefrom, timeto, description, location, color, freq, GROUP_CONCAT(st.staffuuid,',') as staffuuid FROM eventcalendar ev left join staffplanning st on (ev.uuid=st.eventcalendaruuid) where ev.uuid='" + uuid.uuid + "' group by ev.uuid;"; + evdata = appdb.dbquery(evsql); + evdata = evdata.sqldata[0]; + if (evdata.freq !== '') { + var tmpfreq = evdata.freq.split(';'); + for (var t in tmpfreq){ + if (tmpfreq[t] !== '') { + var spl = tmpfreq[t].split("="); + evdata[spl[0].toLowerCase()] = spl[1].toLowerCase(); + } + } + } + } + for (var w in evdata) { + if ($("#frmeditevent #" + w)) { + if (w == 'staffuuid') { + if (evdata[w] === '') { + $("#frmeditevent #" + w).multiselect('select',[]); + } else { + $("#frmeditevent #" + w).multiselect('select',evdata[w].split(',')); + } + + }else if (w == 'color') { + //dump("load color: " + evdata[w]); + curevcolor = evdata[w]; + $("#frmeditevent #color").val(evdata[w]); + $('#frmeditevent #color').minicolors('value',{color: evdata[w]}); + } + else { + $("#frmeditevent #" + w).val(evdata[w]); + if ((w === "description") && (evdata[w] !== "")) { + $("#cmb_clone_activity").multiselect('select',evdata[w]); + } + } + } + } + if ((evdata.freq == 'weekly') && (evdata.byday)) { + var bd = evdata.byday.split(','); + for (var i in bd){ + document.getElementById('weekly_byday_' + bd[i]).setAttribute("checked",true); + $('#frmeditevent #weekly_byday_' + bd[i]).parent().addClass("active"); + } + } + if (evdata.freq == 'monthly') { + $('#freq_monthly_byday').hide(); + $('#freq_monthly_bymonthday').hide(); + $('#pnl_monthly_byday').removeAttr("checked"); + $('#pnl_monthly_bymonthday').removeAttr("checked"); + if (evdata.byday) { + document.getElementById('pnl_monthly_byday').setAttribute("checked",true); + $('#frmeditevent #pnl_monthly_byday').parent().addClass("active"); + $('#freq_monthly_byday').show(); + var bd = evdata.byday.split(','); + var adpos = []; + var awday = []; + for (var i in bd){ + var wday = bd[i].substr(bd[i].length-2); + var pos = bd[i].substring(0,bd[i].length-2); + awday.push(wday.toLowerCase()); + adpos.push(pos); + } + for (var i in adpos){ + document.getElementById('monthly_bydaypos_' + adpos[i]).setAttribute("checked",true); + $('#frmeditevent #monthly_bydaypos_' + adpos[i]).parent().addClass("active"); + } + for (var i in awday){ + document.getElementById('monthly_bydaywday_' + awday[i]).setAttribute("checked",true); + $('#frmeditevent #monthly_bydaywday_' + awday[i]).parent().addClass("active"); + } + }else if (evdata.bymonthday) { + document.getElementById('pnl_monthly_bymonthday').setAttribute("checked",true); + $('#frmeditevent #pnl_monthly_bymonthday').parent().addClass("active"); + $('#freq_monthly_bymonthday').show(); + var bd = evdata.bymonthday.split(','); + for (var i in bd){ + document.getElementById('monthly_bymonthday_' + bd[i]).setAttribute("checked",true); + $('#frmeditevent #monthly_bymonthday_' + bd[i]).parent().addClass("active"); + } + } + } + setfreq(); + $("#edit_event").modal('show'); + } +} + +function save_event() { + var sql1 = new Array(); + var sql2 = new Array(); + + if ($('#dateto').val() != '' && (encodeparam($('#datefrom').val()) > encodeparam($('#dateto').val())) ) { + errormsg("Erreur","La Date début ne peut pas être supérieur à la date fin!"); + return false; + } + if ($('#timeto').val() != '' && (encodeparam($('#timefrom').val()) > encodeparam($('#timeto').val())) ) { + errormsg("Erreur","L'heure de début ne peut pas être supérieur à la heure de fin!"); + return false; + } + var type = 'ins'; + var cuuid = ""; + if ($("#frmeditevent #uuid").val() != 0) { + type = 'upd'; + cuuid = $("#frmeditevent #uuid").val(); + } else { + cuuid = appdb.generate_uuid(); + } + var cactv = $('#frmeditevent #cmb_clone_activity').val(); + if (cactv == 'none') { + var dtest = appdb.dbquery("select count(*) as cnt from eventcalendar where description='"+ $("#frmeditevent #description").val() + "';"); + if (dtest && dtest.sqldata[0].cnt != "0") { + $("#frmeditevent #description").val($("#frmeditevent #description").val() + " Copy"); + } + }else if ((cactv != $("#frmeditevent #description").val()) || (curevcolor != $("#frmeditevent #color").val())) { + appdb.dbexec("update eventcalendar set description='"+$("#frmeditevent #description").val()+"',color='"+$("#frmeditevent #color").val()+"' where description='"+ cactv +"';"); + //update description and color off all events with same name + } + var freqdata = {}; + var cfreq = $("#frmeditevent #freq").val(); + $("#frmeditevent :input").each(function() { + var input = $(this); + + if (input.attr("id") && (input.attr("id") != "staffuuid") && (input.attr("id") != "cmb_clone_activity")) { + if ((input.attr("type") == "checkbox") && (input.attr("id").indexOf(cfreq) >= 0)){ + var xd = input.attr("id").split("_"); + if (input.attr("checked")) { + if (!freqdata[xd[1]]) { + freqdata[xd[1]] = new Array(); + } + freqdata[xd[1]].push(input.val()); + } + } + else if ((input.attr("type") == "radio") && (input.attr("id").indexOf(cfreq) >= 0)) { + var xd = input.attr("id").split("_"); + if (input.attr("checked")) { + freqdata['freqtype'] = xd[2]; + } + } + else if ((input.attr("type") != "checkbox") && ((input.attr("type") != "radio"))){ + if ((input.attr("id") == 'interval') || (input.attr("id") == 'freq')) { + freqdata[input.attr("id")] = input.val(); + } else if ((type == 'ins') && (input.attr("id") != 'staffuuid')) { + + sql1.push('"' + input.attr("id") + '"'); + if (input.attr("id") == 'uuid') { + if (input.val() == "" || input.val() == "0") { + sql2.push("'" + cuuid + "'"); + } else { + sql2.push("'" + input.val() + "'"); + } + } else { + var ival = encodeparam(input.val(), input.attr('type')); + sql2.push(ival); + } + } else { + if ((input.attr("id") != 'uuid') && (input.attr("id") != 'staffuuid')){ + var ival = encodeparam(input.val(), input.attr('type')); + sql2.push('"' + input.attr("id") + '"=' + ival); + } + } + } + } + + }); + if (!freqdata.freqtype) { + freqdata['freqtype'] = curfreq.freqtype; + } + + var strfreq =""; + if (cfreq != "") { + strfreq='FREQ=' + cfreq.toUpperCase()+';INTERVAL=' + freqdata.interval +';'; + if ((cfreq == 'weekly') && (freqdata.byday)){ + strfreq += 'BYDAY=' + freqdata.byday.join(","); + } + if ((cfreq == 'monthly') && (freqdata.bydaypos) || ((freqdata.bydaywday)) || (freqdata.bymonthday)){ + strfreq += freqdata.freqtype.toUpperCase() + '='; + if (freqdata.freqtype == 'bymonthday') { + strfreq += freqdata.bymonthday.join(',') + ";" + }else { + var abyday = new Array(); + for (var p in freqdata.bydaypos){ + for (var w in freqdata.bydaywday){ + abyday.push(freqdata.bydaypos[p] + freqdata.bydaywday[w]); + } + } + strfreq += abyday.join(","); + } + } + if (strfreq.slice(-1) == ';') { + strfreq = strfreq.substring(0,strfreq.length-1); + } + } + var staffuuids = $('#staffuuid').val(); + var xsql=[]; + var delsql = ""; + if (type != 'ins') { + xsql.push("DELETE FROM staffplanning where eventcalendaruuid = '"+cuuid+"';"); + } + var staffinssql = ""; + if (staffuuids && (staffuuids.length != 0)) { + staffinssql = "INSERT INTO staffplanning (eventcalendaruuid,staffuuid) VALUES "; + var tmps = []; + for (var s in staffuuids){ + tmps.push("('"+cuuid+"','"+staffuuids[s]+"')"); + } + staffinssql += tmps.join(',') + ";"; + xsql.push(staffinssql); + } + + if (type == 'upd') { + sql2.push('freq=' + encodeparam(strfreq)); + xsql.push("UPDATE eventcalendar SET " + sql2.join(',') + " where \"uuid\"='" + cuuid + "';"); + } else { + sql1.push('freq'); + sql2.push(encodeparam(strfreq)); + xsql.push("INSERT INTO eventcalendar (" + sql1.join(',') + ") VALUES (" + sql2.join(',') + ");"); + } + for (var i in xsql){ + appdb.dbexec(xsql[i]); + } + + //load_calendar_data(); + + $("#frmeditevent #uuid").val("0"); + $("#edit_event").modal('hide'); + globelreq.send_request({ + page: 'calactivity', + module: 'calendar', + header: 'Organisation Personnel' + }, null); +} + +function confirm_delete_event() { + $("#confirm_delete_event").modal('show'); + return false; +} + +function delete_event() { + + appdb.dbexec("DELETE FROM eventcalendar where uuid='" + $('#frmeditevent #uuid').val()+"';"); + appdb.dbexec("DELETE FROM staffplanning where eventcalendaruuid='" + $('#frmeditevent #uuid').val()+"';"); + + load_activity_selection('filter_activity','multiple'); + load_calendar_data(); + $("#confirm_delete_event").modal('hide'); + + return false; +} + +function setfreq() { + + curfreq.freq = $('#freq option:selected').val(); + $('#freqinterval').hide(); + $('#freqmonthly').hide(); + $('#freqweekly').hide(); + if (curfreq.freq != "") { + $('#lblfreq').text(lblfreq[curfreq.freq]); + $('#freqinterval').show(); + if (curfreq.freq != 'daily') { + $('#freq' + curfreq.freq).show(); + } + } + +} + +function invertColor(hexTripletColor) { + var color = hexTripletColor; + color = color.substring(1); // remove # + color = parseInt(color, 16); // convert to integer + color = 0xFFFFFF ^ color; // invert three bytes + color = color.toString(16); // convert to hex + color = ("000000" + color).slice(-6); // pad with leading zeros + color = "#" + color; // prepend # + return color; +} + +function onselactivity(objid) { + pconfig.filteractivity = $('#' + objid).val()//(()?$('#' + objid).val().split(','):null); + apppref.setpreference("pageconfig.calactivity",pconfig); + load_calendar_data(); +} +function onselstaff(objid) { + + pconfig.filterstaff = $('#' + objid).val(); + apppref.setpreference("pageconfig.calactivity",pconfig); + load_calendar_data(); +} + +function get_vacancy_data() { + vacpos = {}; + var where = ""; + if ((pconfig.filterstaff) && (pconfig.filterstaff.length > 0)) { + where = " st.uuid in ('"+ pconfig.filterstaff.join("','") + "')"; + } + var sql = getvacancysql(new Date(initdate.toLocaleFormat("%Y-%m-%d")),new Date(lastmonthday.toLocaleFormat("%Y-%m-%d")),where); + vacdata = appdb.dbquery(sql); + vacdata = vacdata.sqldata; + + for (var v in vacdata) { + var freq = "FREQ=DAILY"; + + freq += ';DTSTART='+vacdata[v].strdatefrom + 'T000000Z'; + if (vacdata[v].vacancydateto != ''){ + freq += ';UNTIL='+vacdata[v].strdateto + 'T000000Z'; + }else { + freq += ';UNTIL='+vacdata[v].strstrdatefrom + 'T000000Z'; + } + try { + var vacrule = RRule.fromString(freq); + var vacrall = vacrule.all(); + } catch (ex){ + //dump("ERROR! loading data!" + ex + " FREQ:" + freq + "\n"); + } + for (var r in vacrall){ + if ((vacrall[r].toLocaleFormat('%Y-%m-%d') >= initdate.toLocaleFormat('%Y-%m-%d')) && (vacrall[r].toLocaleFormat('%Y-%m-%d') <= lastmonthday.toLocaleFormat('%Y-%m-%dT00:00.000Z'))) { + if (!vacpos[vacrall[r].toLocaleFormat('%Y-%m-%d')]) { + vacpos[vacrall[r].toLocaleFormat('%Y-%m-%d')] = {'staffuuid':[vacdata[v].staffuuid],color:[vacdata[v].color]}; + }else { + vacpos[vacrall[r].toLocaleFormat('%Y-%m-%d')]['staffuuid'].push(vacdata[v].staffuuid); + vacpos[vacrall[r].toLocaleFormat('%Y-%m-%d')]['color'].push(vacdata[v].color); + } + } + } + } +} + +function getvacancysql(datefrom2,dateto2,where) { + var sqlret = "SELECT vc.uuid, vc.datefrom,strftime('%Y%m%d',vc.datefrom) as strdatefrom,' ' || strftime('%Y%m%d',vc.datefrom) || strftime('%Y%m%d',vc.dateto) || '' || strftime('%d.%m.%Y',vc.datefrom) || ' - ' || strftime('%d.%m.%Y',vc.dateto) as tbldaterange, vc.dateto,strftime('%Y%m%d',vc.dateto) as strdateto,vc.timefrom,vc.timeto "+ +", vc.staffuuid,coalesce(st.surname,'') || ' ' || coalesce(st.prename,'') as staffname,vc.type,st.color FROM vacancycalendar vc left join staff st on (vc.staffuuid=st.uuid) " + + "LEFT JOIN ( SELECT * FROM ( "; + var sqldays = new Array(); + + for (var cdate2=datefrom2;cdate2<=dateto2;cdate2.setDate(cdate2.getDate() +1)){ + if ((cdate2.getDay() != 0) && (cdate2.getDay() != 6)){ + sqldays.push ("SELECT date('" + cdate2.toLocaleFormat('%Y-%m-%d') +"') as daydate"); + } + } + + sqlret += sqldays.join(' UNION ALL ') + " )) oph " + + "ON (oph.daydate BETWEEN vc.datefrom AND vc.dateto) " + + "WHERE oph.daydate IS NOT NULL and strftime('%w',oph.daydate) not in ('6','0') " + + "AND oph.daydate NOT IN ( SELECT vacancydate FROM vacancy WHERE vacancydateto IS NULL AND vacancydate BETWEEN '"+initdate.toLocaleFormat("%Y-%m-%d") + "' AND '" + dateto2.toLocaleFormat("%Y-%m-%d")+"') " + + ((where != '')?" AND " + where + " ":"") + + " GROUP BY vc.uuid ORDER BY st.uuid,vc.datefrom, vc.dateto; "; + return sqlret; +} + +function getoph() { + var ophsql = "select dd.daydate,max(wh.datestart) as baseopendate, "+ +"case when strftime('%w',daydate) = '1' then montimeopen "+ +"when strftime('%w',daydate) = '2' then tuetimeopen "+ +"when strftime('%w',daydate) = '3' then wedtimeopen "+ +"when strftime('%w',daydate) = '4' then thutimeopen "+ +"when strftime('%w',daydate) = '5' then fritimeopen else null end as begintime, "+ +"case when strftime('%w',daydate) = '1' then montimeclose "+ +"when strftime('%w',daydate) = '2' then tuetimeclose "+ +"when strftime('%w',daydate) = '3' then wedtimeclose "+ +"when strftime('%w',daydate) = '4' then thutimeclose "+ +"when strftime('%w',daydate) = '5' then fritimeclose else null end as endtime "+ + "from workinghours wh left join ("; + ophsql += drsql + + ") dd on (dd.daydate > wh.datestart) group by dd.daydate order by dd.daydate"; + //dump("\n\n\nOPHSQL: " + ophsql + "\n\n\n"); + var ophdata = appdb.dbquery(ophsql); + ophdata = ophdata.sqldata; + return ophdata; +} + +function getdaterangesql(){ + var adays = []; + var bdate = new Date(initdate.getFullYear(), initdate.getMonth(), initdate.getDate()); + var bend = new Date(initdate.getFullYear(), initdate.getMonth() + 1, 0); + for (var cdt = bdate; cdt <= bend; cdt.setDate(cdt.getDate() + 1)) { + if ((cdt.getDay() != 0) && (cdt.getDay() != 6)){ + adays.push("select date('" + cdt.toLocaleFormat('%Y-%m-%d') + "') as daydate"); + } + + } + return adays.join(" UNION "); +} + +function getstaffactivity() { + var bdate = new Date(initdate.getFullYear(), initdate.getMonth(), initdate.getDate()); + var bend = new Date(initdate.getFullYear(), initdate.getMonth() + 1, 0); + var actsql = "select dd.daydate as daydate, '[\"' || GROUP_CONCAT(ev.staffuuid,'\",\"') || '\"]' AS staffuuid,'[\"' || GROUP_CONCAT(st.color,'\",\"') || '\"]' as staffcolor,'[\"' || GROUP_CONCAT(coalesce(substr(st.surname,1,2),'') || ' ' || coalesce(substr(st.prename,1,2),''), '\",\"' ) || '\"]' as staffnames, ev.timefrom as timefrom,ev.timeto as timeto, ev.description as description,ev.color as eventcolor,ev.uuid as eventuuid from ( "+ +"select sp.staffuuid,ec.description,ec.color,ec.uuid, "+ +"case when datefrom < '"+bdate.toLocaleFormat("%Y-%m-%d")+"' then '"+bdate.toLocaleFormat("%Y-%m-%d")+"' else datefrom end as datefrom, "+ +"case when dateto > '"+bend.toLocaleFormat("%Y-%m-%d")+"' then '"+bend.toLocaleFormat("%Y-%m-%d")+"' else dateto end as dateto, "+ +"timefrom,timeto "+ +"from eventcalendar ec join staffplanning sp on (ec.uuid=sp.eventcalendaruuid) where datefrom <= '"+bend.toLocaleFormat("%Y-%m-%d")+"' and (dateto is null or dateto >= '"+bdate.toLocaleFormat("%Y-%m-%d")+"')) ev "+ +"join staff st on (ev.staffuuid=st.uuid) "+ +"join ("+ drsql+") dd "+ +"on (dd.daydate between ev.datefrom and ev.dateto) "; +var wh = []; +if (pconfig.filterstaff) { + wh.push("st.uuid in ('"+ pconfig.filterstaff.join("','")+"')"); +} +if (pconfig.filteractivity) { + //dump(pconfig.filteractivity + "\n"); + wh.push("ev.description in ('"+ pconfig.filteractivity.join("','")+"')"); +} +if (wh.length > 0) { + actsql += " WHERE " + wh.join( " OR "); +} +actsql += " GROUP BY dd.daydate,ev.uuid ORDER BY ev.description,dd.daydate,ev.timefrom,ev.timeto; "; +//dump("\n\n\nSTAFF ACTIVITY: " + actsql + "\n\n\n"); + var actdata = appdb.dbquery(actsql); + actdata = actdata.sqldata; + return actdata; +} + +function getstaffvacancy() { + var bdate = new Date(initdate.getFullYear(), initdate.getMonth(), initdate.getDate()); + var bend = new Date(initdate.getFullYear(), initdate.getMonth() + 1, 0); + var vacsql = "select dd.daydate as daydate,staffuuid, timefrom,timeto,type from ( "+ +"select staffuuid, "+ +"case when datefrom < '"+bdate.toLocaleFormat("%Y-%m-%d")+"' then '"+bdate.toLocaleFormat("%Y-%m-%d")+"' else datefrom end as datefrom, "+ +"case when dateto > '"+bend.toLocaleFormat("%Y-%m-%d")+"' then '"+bend.toLocaleFormat("%Y-%m-%d")+"' else dateto end as dateto, "+ +"timefrom,timeto, type "+ +"from vacancycalendar where (datefrom is null or datefrom <= '"+bend.toLocaleFormat("%Y-%m-%d")+"') and (dateto is null or dateto >= '"+bdate.toLocaleFormat("%Y-%m-%d")+"')) vc "+ +"join ("+drsql+") dd "+ +"on (dd.daydate between vc.datefrom and vc.dateto); "; +var wh = []; +if (pconfig.filterstaff) { + wh.push("staffuuid in ('"+ pconfig.filterstaff.join("','")+"')"); +} +if (wh.length > 0) { + vacsql += " WHERE " + wh.join( " OR "); +} +//dump("\n\n\nOPHSQL: " + ophsql + "\n\n\n"); + var vacdata = appdb.dbquery(vacsql); + vacdata = vacdata.sqldata; + return vacdata; +} + +function get_vacancydays(){ + var bdate = new Date(initdate.getFullYear(), initdate.getMonth(), initdate.getDate()); + var bend = new Date(initdate.getFullYear(), initdate.getMonth() + 1, 0); + var sql = "select dd.daydate,strftime('%d',dd.daydate) as strday,type from ( "+ +"select vacancydate, "+ +"case when vacancydateto is null then vacancydate else vacancydateto end as vacancydateto, "+ +"case when vacancydateto is null then 'vacancy' else 'holiday' end as type, "+ +"vacancydescription from vacancy where (vacancydate between '"+bdate.toLocaleFormat("%Y-%m-%d")+"' and '"+bend.toLocaleFormat("%Y-%m-%d")+"' and (vacancydateto >= '"+bdate.toLocaleFormat("%Y-%m-%d")+"' or vacancydateto is null)) or (vacancydateto between '"+bdate.toLocaleFormat("%Y-%m-%d")+"' and '"+bend.toLocaleFormat("%Y-%m-%d")+"' and vacancydate < '"+bdate.toLocaleFormat("%Y-%m-%d")+"') or ((vacancydate <= '"+bdate.toLocaleFormat("%Y-%m-%d")+"') and (vacancydateto >= '"+bend.toLocaleFormat("%Y-%m-%d")+"')) order by vacancydate,vacancydateto) vc "+ +"join ( "+ drsql +") dd "+ +"on (dd.daydate between vc.vacancydate and vc.vacancydateto) group by dd.daydate order by daydate;"; + var hdata = appdb.dbquery(sql); + hdata = hdata.sqldata; + var hs = {}; + for (var h in hdata){ + hs[hdata[h].strday] = hdata[h].type; + } + return hs; +} + +function convertHex(hex,opacity){ + hex = hex.replace('#',''); + r = parseInt(hex.substring(0,2), 16); + g = parseInt(hex.substring(2,4), 16); + b = parseInt(hex.substring(4,6), 16); + + result = 'rgba('+r+','+g+','+b+','+opacity+')'; + return result; +} + +function oncloneactivity(actv_id) { + var aid = $("#cmb_clone_activity :selected").val(); + //dump('value: ' + $("#cmb_clone_activity :selected").val() + "\n"); + if (aid != '') { + //dump(actv_id + "\n"); + $("#frmeditevent #description").val(aid); + var seltxt = $("#cmb_clone_activity :selected").text(); + //dump("seltxt:" + seltxt + "\n"); + var colre = //; + var ccolor =seltxt.match(colre); + //dump("CREs: " + JSON.stringify(ccolor) + "\n"); + $('#frmeditevent #color').minicolors('value',{color: ccolor[1]}); + } +} + +function onselcreche(){ + +} + + + + diff --git a/app_v3satdemo/chrome/content/modules/calendar/js/calactivity_basic.js b/app_v3satdemo/chrome/content/modules/calendar/js/calactivity_basic.js new file mode 100644 index 0000000..1a7e8d8 --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/calendar/js/calactivity_basic.js @@ -0,0 +1,731 @@ +//Source-code licensed under EUPL v1.1 ( Copyright 2016 By DKS s.à r.l. - Kilian Saffran - Luxembourg ) + +var pconfig = {}; +var initdate = new Date(); +initdate.setDate(1); +var lastmonthday = null; +var firstmonday = null; +var lastsunday = null; +var winh = window.innerHeight - 140; +var tblacc = null; +var lblfreq = {daily:'jour(s)',weekly:'semaine(s)',monthly:'mois'}; +var amonth = ['', 'Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Aôut', 'Septembre','Octobre', 'Novembre', 'Décembre']; +var linkpos = {}; +var posday = {}; +var delac = null; +var curfreq ={}; +var redate = /\d\d.\d\d.\d\d\d\d/; +var tblcal = null; +var vacpos = {}; +var vacdata = null; +var drsql = ""; +var eventdates = {}; +var curevcolor = ""; +var alltr = {}; +var rtblall = {}; +var crsel = []; +function initdata() { + //curcfg.loadconfig(apppref.getpreference("creorga.support.database.currentdb.num")); + load_helpers(); + $('#view_list').hide(); + var configdata = apppref.getpreference("pageconfig.calactivity"); + if (!configdata) { + apppref.setpreference("pageconfig.calactivity", ''); + } + if (configdata !== '') { + pconfig = JSON.parse(configdata); + } + pconfig.view = 'table'; + //if (!pconfig.printlayout) { + pconfig.printlayout = 'table'; + apppref.setpreference("pageconfig.calactivity",pconfig); + //} + if (pconfig.calmonth) { + + initdate = new Date(encodeparam(pconfig.calmonth, 'month').replace(/'/g, '')); + $("#calmonth").val(pconfig.calmonth); + } else { + $("#calmonth").val(initdate.toLocaleFormat('%m.%Y')); + pconfig.calmonth = initdate.toLocaleFormat('%m.%Y'); + } + + load_staff_selection('filter_staff'); + load_activity_selection('filter_activity','multiple'); + load_staff_selection('staffuuid'); + //load_creche_selection(); + set_infoheader(amonth[parseInt(pconfig.calmonth.substring(0,3))] + " " + pconfig.calmonth.substring(3,8)); + load_calendar_month(); + + $('#calmonth').on('dp.hide',function(e){ + set_calmonth(); + }); + $('#frmeditevent #color').minicolors({theme:'bootstrap',position: 'bottom right'}); + $("#weekly_byday :input").change(function() { + + if (this.checked) { + this.setAttribute("checked",true); + }else { + this.removeAttribute("checked"); + } +}); + $("#monthly_bydaypos :input").change(function() { + + if (this.checked) { + this.setAttribute("checked",true); + }else { + this.removeAttribute("checked"); + } + +}); + $("#monthly_bydaywday :input").change(function() { + + if (this.checked) { + this.setAttribute("checked",true); + }else { + this.removeAttribute("checked"); + } + +}); + $("#monthly_bymonthday :input").change(function() { + + if (this.checked) { + this.setAttribute("checked",true); + }else { + this.removeAttribute("checked"); + } + +}); + $("#monthly_by :input").change(function() { + var xd = this.id.split("_"); + curfreq.freqtype=xd[2]; + + this.setAttribute("checked",true); + + $('#freq_monthly_byday').hide(); + $('#freq_monthly_bymonthday').hide(); + $('#pnl_monthly_byday').removeAttr("checked"); + $('#pnl_monthly_bymonthday').removeAttr("checked"); + + $('#freq_' + this.value).show(); + +}); + + $('#frmeditevent #datefrom').on("blur",function (e) { + var ok = true; + if ($('#frmeditevent #datefrom').val().match(redate)) { + $('#btn_save_event').removeAttr("disabled"); + }else { + ok = false; + $('#btn_save_event').attr("disabled","1"); + } + if ((ok === true) && ($('#frmeditevent #dateto').val() !== '')) { + var tmpdt1 = encodeparam($('#frmeditevent #datefrom').val(),'date'); + var tmpdt2 = encodeparam($('#frmeditevent #dateto').val(),'date'); + + if (tmpdt1 >= tmpdt2) { + $('#btn_save_event').attr("disabled","1"); + } else { + $('#btn_save_event').removeAttr("disabled"); + } + + } + }); + $('#frmeditevent #dateto').on("blur",function (e) { + var ok = true; + if ($('#frmeditevent #dateto').val().match(redate)) { + $('#btn_save_event').removeAttr("disabled"); + }else { + ok = false; + $('#btn_save_event').attr("disabled","1"); + } + if ((ok === true) && ($('#frmeditevent #dateto').val() !== '')) { + var tmpdt1 = encodeparam($('#frmeditevent #datefrom').val(),'date'); + var tmpdt2 = encodeparam($('#frmeditevent #dateto').val(),'date'); + + if (tmpdt1 >= tmpdt2) { + $('#btn_save_event').attr("disabled","1"); + } else { + $('#btn_save_event').removeAttr("disabled"); + } + + } + }); +} + +function load_calendar_month() { + + firstmonday = new Date(initdate.getFullYear(), initdate.getMonth(), -1 * parseInt(initdate.toLocaleFormat('%w')) + 2); + if (firstmonday > initdate) { + firstmonday = new Date(initdate.getFullYear(), initdate.getMonth(),firstmonday.getDate()-7); + } + lastmonthday = new Date(initdate.getFullYear(), initdate.getMonth() + 1, 1); + + lastsunday = new Date(lastmonthday.getFullYear(), lastmonthday.getMonth(), lastmonthday.getDate() + 7 - parseInt(lastmonthday.toLocaleFormat('%w'))); + + var weeknum = 0; + var cmonth = initdate.getMonth(); + var sday = []; + firstmonday = new Date(initdate.getFullYear(), initdate.getMonth(), -1 * parseInt(initdate.toLocaleFormat('%w')) + 2); + if (firstmonday > initdate) { + firstmonday = new Date(initdate.getFullYear(), initdate.getMonth(),firstmonday.getDate()-7); + } + load_vacancy_data(); + + load_calendar_data(); + +} + +function load_calendar_data() { + var where = []; + if ((pconfig.filterstaff) && (pconfig.filterstaff.length > 0)) { + where.push(" st.uuid in ('"+ pconfig.filterstaff.join("','") + "')"); + } + if ((pconfig.filteractivity) && (pconfig.filteractivity.length > 0)) { + where.push(" cal.description in ('"+ pconfig.filteractivity.join("','") + "')"); + } + var sql = "SELECT cal.uuid, cal.datefrom, cal.dateto, '
' || strftime('%Y%m%d',cal.datefrom) ||'
' || strftime('%d.%m.%Y',cal.datefrom) AS tbldatefrom ,strftime('%Y%m%d',cal.datefrom) AS strdatefrom, strftime('%Y%m%d',cal.dateto) AS strdateto,cal.timefrom, cal.timeto, cal.description, cal.location, cal.color, cal.freq, '[\"' || GROUP_CONCAT(sp.staffuuid,'\",\"') || '\"]' as staffuuid, GROUP_CONCAT(coalesce(st.surname,'') || ' ' || coalesce(st.prename,''), '
' ) as staffnames ,'[\"' || GROUP_CONCAT(st.color,'\",\"') || '\"]' as staffcolors from eventcalendar cal " + ((pconfig.filterstaff)?"":" left ") +" join staffplanning sp on (cal.uuid=sp.eventcalendaruuid " + ((pconfig.filterstaff)?" AND sp.staffuuid in ('"+ pconfig.filterstaff.join("','") + "')":"") +") left join staff st on (sp.staffuuid=st.uuid) "+ + + " where (cal.datefrom between '" + initdate.toLocaleFormat('%Y-%m-%d') + "' and '" + lastmonthday.toLocaleFormat('%Y-%m-%d') + "' and (cal.dateto >= '" + initdate.toLocaleFormat('%Y-%m-%d') + "' or cal.dateto is null)) or (cal.dateto between '" + initdate.toLocaleFormat('%Y-%m-%d') + "' and '" + lastmonthday.toLocaleFormat('%Y-%m-%d') + "' and cal.datefrom < '" + initdate.toLocaleFormat('%Y-%m-%d') + "') or ((cal.datefrom <= '" + firstmonday.toLocaleFormat('%Y-%m-%d') + "') and ((cal.dateto >= '" + lastmonthday.toLocaleFormat('%Y-%m-%d') + "') or cal.dateto is null)) "+ ((where.length > 0)?" AND (" + where.join(" or ") + ")":"")+" group by cal.uuid order by cal.datefrom,cal.dateto;"; + + var caldata = appdb.dbquery(sql); + + caldata = caldata.sqldata; + get_vacancy_data(); + + for (var c in caldata) { + if (!eventdates[caldata[c].uuid]) { + eventdates[caldata[c].uuid] = {}; + } + var freq = caldata[c].freq; + if (freq !== '') { + freq += ';DTSTART='+caldata[c].strdatefrom + 'T000000Z'; + if ((caldata[c].dateto !== '') && (caldata[c].dateto <= lastmonthday.toLocaleFormat('%Y-%m-%d'))){ + freq += ';UNTIL='+caldata[c].strdateto + 'T000000Z'; + }else { + freq += ';UNTIL='+lastmonthday.toLocaleFormat('%Y%m%d') + 'T000000Z'; + } + } + + if (freq !== ""){ + try { + var rule = RRule.fromString(freq); + rall = rule.all(); + } catch (ex){ + //dump("ERROR! loading data!" + ex + " FREQ:" + freq + "\n"); + } + } else { + continue; + } + for (var r in rall){ + //dump(rall[r].toLocaleFormat('%Y-%m-%d') + " " + initdate.toLocaleFormat('%Y-%m-%d')+ " " + lastmonthday.toLocaleFormat('%Y-%m-%d') + "\n" ); + if ((rall[r].toLocaleFormat('%Y-%m-%d') >= initdate.toLocaleFormat('%Y-%m-%d')) && (rall[r].toLocaleFormat('%Y-%m-%d') <= lastmonthday.toLocaleFormat('%Y-%m-%d'))) { + //dump("OK " + rall[r].toLocaleFormat('%Y-%m-%d') + " " + initdate.toLocaleFormat('%Y-%m-%d')+ " " + lastmonthday.toLocaleFormat('%Y-%m-%d') + "\n" ); + if (!eventdates[caldata[c].uuid][rall[r].toLocaleFormat('%d')]) { + eventdates[caldata[c].uuid][rall[r].toLocaleFormat('%d')] = 1; + } + } + + } + } + load_timetable(); +} + +function load_timetable() { + $('#tbl_timetable').html(""); + drsql = getdaterangesql(); + var ophdata = getoph(); + + var thead = []; + var weekrange = {}; + var ltd = ""; + for (var t in ophdata){ + var dx = new Date(ophdata[t].daydate); + if (!weekrange[parseInt(dx.toLocaleFormat('%W'))]) { + weekrange[parseInt(dx.toLocaleFormat('%W'))] = 1; + }else if (ltd != ophdata[t].daydate) { + weekrange[parseInt(dx.toLocaleFormat('%W'))] += 1; + } + var head = ophdata[t].daydate.substring(8,10); + if (thead.indexOf(head) == -1) { + thead.push(head); + + } + + ltd = ophdata[t].daydate; + + } + var actdata = getstaffactivity(); + + var lev = ""; + var lst = ""; + + var ev = {}; + + var alltrx = {}; + for (var ac in actdata){ + var evid = actdata[ac].eventuuid; + + if ((evid) && (lev !== evid) && (!alltrx[evid])) { + ev = {"eventuuid":evid,"description": actdata[ac].description ,"timefrom":actdata[ac].timefrom,"timeto":actdata[ac].timeto,"eventcolor":actdata[ac].eventcolor}; + for (var h in thead){ + ev[thead[h]] = {}; + } + alltrx[evid] = ev; + + } + var cday = actdata[ac].daydate.substring(8,10); + + if ((evid) && (eventdates[evid]) && (eventdates[evid][cday])) { + + alltrx[evid][cday]={"staffuuid":JSON.parse(actdata[ac].staffuuid),"staffcolor":JSON.parse(actdata[ac].staffcolor),"staffnames":JSON.parse(actdata[ac].staffnames)}; + + } + lev = null; + lev = evid; + + } + + var vacdata = getstaffvacancy(); + var staffuuids = []; + for (var vc in vacdata){ + var dx = new Date(vacdata[vc].daydate).toLocaleFormat('%d'); + if (staffuuids.indexOf(vacdata[vc].staffuuid)) { + staffuuids.push(vacdata[vc].staffuuid); + } + for (var e in alltrx){ + + if (alltrx[e][dx]['staffuuid']) { + var idx = alltrx[e][dx]['staffuuid'].indexOf(vacdata[vc].staffuuid); + + if (idx != -1) { + + if (vacdata[vc].timefrom==vacdata[vc].timeto) { + alltrx[e][dx]['staffcolor'][idx] = "transparent"; + }else { + + var tfto =((parseInt(vacdata[vc].timeto.substring(1,2)) - parseInt(vacdata[vc].timefrom.substring(1,2)))/8)*100; + var clr = alltrx[e][dx]['staffcolor'][idx]; + + alltrx[e][dx]['staffcolor'][idx] = "linear-gradient(to right, "+convertHex(clr,1)+" 0%,"+convertHex(clr,1)+" "+tfto+"%,rgba(0,0,0,0) 100%)"; + } + + } + } + } + + } + var cspan = 0; + var hdays = get_vacancydays(); + var strhead = 'Semaine'; + for (var w in weekrange){ + strhead += '' + w + ''; + cspan += weekrange[w]; + } + strhead += '  de à '; + for (var th in thead){ + var sty=""; + if (hdays[thead[th]]) { + sty =' style="background-color: '+((hdays[thead[th]]=='vacancy')?'#FF7145':'#FF9C2A')+' !important;" '; + } + strhead += ''+ thead[th]+''; + } + + strhead += ''; + $('#tbl_timetable').append(strhead); + $('#tbl_timetable').append(''); + cspan +=3; + + var actchange = ""; + //dump(JSON.stringify(alltr) + "\n"); + for (var a in alltrx){ + + if (alltrx[a].description != actchange) { + $('#tbl_timetable').append(' '+alltrx[a].description+''); + } + actchange = alltrx[a].description; + var trn = ' '; + trn += ''+alltrx[a].timefrom+''+alltrx[a].timeto+''; + for (var h in thead){ + if ((hdays[thead[h]]) && (hdays[thead[h]] == 'vacancy')) { + trn += ''; + continue; + } + if (alltrx[a][thead[h]]) { + + trn += ''; + if (alltrx[a][thead[h]]["staffcolor"]) { + var xx = alltrx[a][thead[h]]["staffcolor"]; + for (var r in xx){ + var col = ""; + if (xx[r] == 'transparent') { + col = 'color: transparent; display: none;'; + } + trn += '
'+alltrx[a][thead[h]]["staffnames"][r] +'
'; + } + + } + + trn += ''; + }else { + trn += ''; + } + } + trn += ''; + + $('#tbl_timetable').append(trn); + + } + + $('#tbl_timetable').append(''); + +} + +function load_vacancy_data() { + var sql = "select vacancydate,strftime('%Y%m%d',vacancydate) as strvacancydate,vacancydateto,case when vacancydateto is not null then strftime('%Y%m%d',vacancydateto) else null end as strvacancydateto,vacancydescription from vacancy " + + "where (vacancydate between '" + firstmonday.toLocaleFormat('%Y-%m-%d') + "' and '" + lastsunday.toLocaleFormat('%Y-%m-%d') + "' and (vacancydateto >= '" + firstmonday.toLocaleFormat('%Y-%m-%d') + "' or vacancydateto is null)) or (vacancydateto between '" + firstmonday.toLocaleFormat('%Y-%m-%d') + "' and '" + lastsunday.toLocaleFormat('%Y-%m-%d') + "' and vacancydate < '" + firstmonday.toLocaleFormat('%Y-%m-%d') + "') or ((vacancydate <= '" + firstmonday.toLocaleFormat('%Y-%m-%d') + "') and (vacancydateto >= '" + lastsunday.toLocaleFormat('%Y-%m-%d') + "')) " + + "order by vacancydate,vacancydateto;"; + var caldata = appdb.dbquery(sql); + caldata = caldata.sqldata; + for (var c in caldata) { + var freq = "FREQ=DAILY"; + freq += ';DTSTART='+caldata[c].strvacancydate + 'T000000Z'; + + if (caldata[c].vacancydateto !== ''){ + freq += ';UNTIL='+caldata[c].strvacancydateto + 'T000000Z'; + }else { + freq += ';UNTIL='+caldata[c].strvacancydate + 'T000000Z'; + } + try { + var rule = RRule.fromString(freq); + var rall = rule.all(); + + for (var r in rall){ + if ((rall[r].toLocaleFormat('%Y-%m-%d') >= initdate.toLocaleFormat('%Y-%m-%d')) && (rall[r].toLocaleFormat('%Y-%m-%d') <= lastmonthday.toLocaleFormat('%Y-%m-%dT00:00.000Z'))) { + + $("#" + linkpos["" + rall[r].toLocaleFormat('%Y-%m-%d')] + " > div.panel-day > div.panel-dayhead").addClass(((caldata[c].vacancydateto == '')?'calvacancy':'calvacrange')); + $("#" + linkpos["" + rall[r].toLocaleFormat('%Y-%m-%d')] + " > div.panel-day > div.panel-dayhead > div#vacname").remove(); + $("#" + linkpos["" + rall[r].toLocaleFormat('%Y-%m-%d')] + " > div.panel-day > div.panel-dayhead").prepend('
'+ caldata[c].vacancydescription + "
 "); + } + } + } catch (ex){ + } + } +} + +function load_staff_selection(objid,option){ + var stdata = appdb.dbquery("select uuid, coalesce(surname,'') || ' ' || coalesce(prename,'') as name,case when color is null then '#000' else color end as color from staff order by surname,prename"); + stdata = stdata.sqldata; + for (var s in stdata){ + $('#' + objid).append(''); + } + if (objid == 'filter_staff') { + $('#' + objid).multiselect({enableHTML: true,numberDisplayed:1,nonSelectedText:"Tous",allSelectedText: 'Tous',nSelectedText: ' selections'}); + if (pconfig.filterstaff) { + $('#' + objid).multiselect('select',pconfig.filterstaff); + } + }else { + var copt = {}; + if (option) { + copt = option; + } + copt['enableHTML'] = true; + copt['nonSelectedText']="Sélectionner un(e) employé(e)..."; + copt['numberDisplayed']=5; + copt['allSelectedText']='Tous'; + copt['nSelectedText']=' selections'; + + $('#' + objid).multiselect(copt); + } + +} + + +function load_activity_selection(objid,type) { + var stdata = appdb.dbquery("select uuid,description as activity,color from eventcalendar group by description,color;"); + stdata = stdata.sqldata; + for (var s in stdata){ + $('#' + objid).append(''); + } + if (pconfig.filteractivity) { + $('#' + objid).multiselect({enableHTML: true,numberDisplayed:1,nonSelectedText:"Tous",allSelectedText: 'Tous',nSelectedText: ' selections'}); + $('#' + objid).multiselect('select',pconfig.filteractivity); + } else if (type == 'multiple') { + $('#' + objid).multiselect({enableHTML: true,numberDisplayed:1,nonSelectedText:"Tous",allSelectedText: 'Tous',nSelectedText: ' selections'}); + } else { + var copt = {}; + copt['enableHTML'] = true; + copt['nonSelectedText']="Sélectionner une activité.."; + $('#' + objid).multiselect(copt); + $('#' + objid).multiselect('select',null); + } +} + +function set_calmonth() { + pconfig.calmonth = $('#calmonth').val(); + apppref.setpreference("pageconfig.calactivity", pconfig); + globelreq.send_request({ + page: 'calactivity_basic', + module: 'calendar', + header: 'Organisation Personnel' + }, null); +} + +function onnextmonth() { + var tmpmonth = new Date(encodeparam(pconfig.calmonth, 'month').replace(/'/g, '')); + var nmonth = new Date(tmpmonth.getFullYear(), tmpmonth.getMonth() + 1, tmpmonth.getDate()); + pconfig.calmonth = nmonth.toLocaleFormat('%m.%Y'); + apppref.setpreference("pageconfig.calactivity", pconfig); + globelreq.send_request({ + page: 'calactivity_basic', + module: 'calendar', + header: 'Organisation Personnel' + }, null); +} + +function onpreviousmonth() { + var tmpmonth = new Date(encodeparam(pconfig.calmonth, 'month').replace(/'/g, '')); + var nmonth = new Date(tmpmonth.getFullYear(), tmpmonth.getMonth() - 1, tmpmonth.getDate()); + pconfig.calmonth = nmonth.toLocaleFormat('%m.%Y'); + apppref.setpreference("pageconfig.calactivity", pconfig); + globelreq.send_request({ + page: 'calactivity_basic', + module: 'calendar', + header: 'Organisation Personnel' + }, null); +} + +function dlg_vacancy_detail(stuuids) { + //dump(JSON.stringify(stuuids) + "\n"); + var obj = stuuids.split(',') + var vsql = "select coalesce(surname,'') || ' ' || coalesce(prename,'') as staffname,color from staff where uuid in ('" + obj.join("','") + "');"; + //dump(vsql + "\n"); + var vst = appdb.dbquery(vsql); + vst = vst.sqldata; + $('#vacdetail').html(""); + for (var v in vst){ + $('#vacdetail').append('
'+ vst[v].staffname+'
'); + } + $("#dlg_vacancy_detail").modal('show'); + +} + + +function setfreq() { + + curfreq.freq = $('#freq option:selected').val(); + $('#freqinterval').hide(); + $('#freqmonthly').hide(); + $('#freqweekly').hide(); + if (curfreq.freq != "") { + $('#lblfreq').text(lblfreq[curfreq.freq]); + $('#freqinterval').show(); + if (curfreq.freq != 'daily') { + $('#freq' + curfreq.freq).show(); + } + } + +} + +function invertColor(hexTripletColor) { + var color = hexTripletColor; + color = color.substring(1); // remove # + color = parseInt(color, 16); // convert to integer + color = 0xFFFFFF ^ color; // invert three bytes + color = color.toString(16); // convert to hex + color = ("000000" + color).slice(-6); // pad with leading zeros + color = "#" + color; // prepend # + return color; +} + +function onselactivity(objid) { + pconfig.filteractivity = $('#' + objid).val()//(()?$('#' + objid).val().split(','):null); + apppref.setpreference("pageconfig.calactivity",pconfig); + load_calendar_data(); +} +function onselstaff(objid) { + + pconfig.filterstaff = $('#' + objid).val(); + apppref.setpreference("pageconfig.calactivity",pconfig); + load_calendar_data(); +} + +function get_vacancy_data() { + vacpos = {}; + var where = ""; + if ((pconfig.filterstaff) && (pconfig.filterstaff.length > 0)) { + where = " st.uuid in ('"+ pconfig.filterstaff.join("','") + "')"; + } + var sql = getvacancysql(new Date(initdate.toLocaleFormat("%Y-%m-%d")),new Date(lastmonthday.toLocaleFormat("%Y-%m-%d")),where); + vacdata = appdb.dbquery(sql); + vacdata = vacdata.sqldata; + + for (var v in vacdata) { + var freq = "FREQ=DAILY"; + + freq += ';DTSTART='+vacdata[v].strdatefrom + 'T000000Z'; + if (vacdata[v].vacancydateto != ''){ + freq += ';UNTIL='+vacdata[v].strdateto + 'T000000Z'; + }else { + freq += ';UNTIL='+vacdata[v].strstrdatefrom + 'T000000Z'; + } + try { + var vacrule = RRule.fromString(freq); + var vacrall = vacrule.all(); + } catch (ex){ + //dump("ERROR! loading data!" + ex + " FREQ:" + freq + "\n"); + } + for (var r in vacrall){ + if ((vacrall[r].toLocaleFormat('%Y-%m-%d') >= initdate.toLocaleFormat('%Y-%m-%d')) && (vacrall[r].toLocaleFormat('%Y-%m-%d') <= lastmonthday.toLocaleFormat('%Y-%m-%dT00:00.000Z'))) { + if (!vacpos[vacrall[r].toLocaleFormat('%Y-%m-%d')]) { + vacpos[vacrall[r].toLocaleFormat('%Y-%m-%d')] = {'staffuuid':[vacdata[v].staffuuid],color:[vacdata[v].color]}; + }else { + vacpos[vacrall[r].toLocaleFormat('%Y-%m-%d')]['staffuuid'].push(vacdata[v].staffuuid); + vacpos[vacrall[r].toLocaleFormat('%Y-%m-%d')]['color'].push(vacdata[v].color); + } + } + } + } +} + +function getvacancysql(datefrom2,dateto2,where) { + var sqlret = "SELECT vc.uuid, vc.datefrom,strftime('%Y%m%d',vc.datefrom) as strdatefrom,' ' || strftime('%Y%m%d',vc.datefrom) || strftime('%Y%m%d',vc.dateto) || '' || strftime('%d.%m.%Y',vc.datefrom) || ' - ' || strftime('%d.%m.%Y',vc.dateto) as tbldaterange, vc.dateto,strftime('%Y%m%d',vc.dateto) as strdateto,vc.timefrom,vc.timeto "+ +", vc.staffuuid,coalesce(st.surname,'') || ' ' || coalesce(st.prename,'') as staffname,vc.type,st.color FROM vacancycalendar vc left join staff st on (vc.staffuuid=st.uuid) " + + "LEFT JOIN ( SELECT * FROM ( "; + var sqldays = new Array(); + + for (var cdate2=datefrom2;cdate2<=dateto2;cdate2.setDate(cdate2.getDate() +1)){ + if ((cdate2.getDay() != 0) && (cdate2.getDay() != 6)){ + sqldays.push ("SELECT date('" + cdate2.toLocaleFormat('%Y-%m-%d') +"') as daydate"); + } + } + + sqlret += sqldays.join(' UNION ALL ') + " )) oph " + + "ON (oph.daydate BETWEEN vc.datefrom AND vc.dateto) " + + "WHERE oph.daydate IS NOT NULL and strftime('%w',oph.daydate) not in ('6','0') " + + "AND oph.daydate NOT IN ( SELECT vacancydate FROM vacancy WHERE vacancydateto IS NULL AND vacancydate BETWEEN '"+initdate.toLocaleFormat("%Y-%m-%d") + "' AND '" + dateto2.toLocaleFormat("%Y-%m-%d")+"') " + + ((where != '')?" AND " + where + " ":"") + + " GROUP BY vc.uuid ORDER BY st.uuid,vc.datefrom, vc.dateto; "; + return sqlret; +} + +function getoph() { + var ophsql = "select dd.daydate,max(wh.datestart) as baseopendate, "+ +"case when strftime('%w',daydate) = '1' then montimeopen "+ +"when strftime('%w',daydate) = '2' then tuetimeopen "+ +"when strftime('%w',daydate) = '3' then wedtimeopen "+ +"when strftime('%w',daydate) = '4' then thutimeopen "+ +"when strftime('%w',daydate) = '5' then fritimeopen else null end as begintime, "+ +"case when strftime('%w',daydate) = '1' then montimeclose "+ +"when strftime('%w',daydate) = '2' then tuetimeclose "+ +"when strftime('%w',daydate) = '3' then wedtimeclose "+ +"when strftime('%w',daydate) = '4' then thutimeclose "+ +"when strftime('%w',daydate) = '5' then fritimeclose else null end as endtime "+ + "from workinghours wh left join ("; + ophsql += drsql + + ") dd on (dd.daydate > wh.datestart) group by dd.daydate order by dd.daydate"; + //dump("\n\n\nOPHSQL: " + ophsql + "\n\n\n"); + var ophdata = appdb.dbquery(ophsql); + ophdata = ophdata.sqldata; + return ophdata; +} + +function getdaterangesql(){ + var adays = []; + var bdate = new Date(initdate.getFullYear(), initdate.getMonth(), initdate.getDate()); + var bend = new Date(initdate.getFullYear(), initdate.getMonth() + 1, 0); + for (var cdt = bdate; cdt <= bend; cdt.setDate(cdt.getDate() + 1)) { + if ((cdt.getDay() != 0) && (cdt.getDay() != 6)){ + adays.push("select date('" + cdt.toLocaleFormat('%Y-%m-%d') + "') as daydate"); + } + + } + return adays.join(" UNION "); +} + +function getstaffactivity() { + var bdate = new Date(initdate.getFullYear(), initdate.getMonth(), initdate.getDate()); + var bend = new Date(initdate.getFullYear(), initdate.getMonth() + 1, 0); + var actsql = "select dd.daydate as daydate, '[\"' || GROUP_CONCAT(ev.staffuuid,'\",\"') || '\"]' AS staffuuid,'[\"' || GROUP_CONCAT(st.color,'\",\"') || '\"]' as staffcolor,'[\"' || GROUP_CONCAT(coalesce(substr(st.surname,1,2),'') || ' ' || coalesce(substr(st.prename,1,2),''), '\",\"' ) || '\"]' as staffnames, ev.timefrom as timefrom,ev.timeto as timeto, ev.description as description,ev.color as eventcolor,ev.uuid as eventuuid from ( "+ +"select sp.staffuuid,ec.description,ec.color,ec.uuid, "+ +"case when datefrom < '"+bdate.toLocaleFormat("%Y-%m-%d")+"' then '"+bdate.toLocaleFormat("%Y-%m-%d")+"' else datefrom end as datefrom, "+ +"case when dateto > '"+bend.toLocaleFormat("%Y-%m-%d")+"' then '"+bend.toLocaleFormat("%Y-%m-%d")+"' else dateto end as dateto, "+ +"timefrom,timeto "+ +"from eventcalendar ec join staffplanning sp on (ec.uuid=sp.eventcalendaruuid) where datefrom <= '"+bend.toLocaleFormat("%Y-%m-%d")+"' and (dateto is null or dateto >= '"+bdate.toLocaleFormat("%Y-%m-%d")+"')) ev "+ +"join staff st on (ev.staffuuid=st.uuid) "+ +"join ("+ drsql+") dd "+ +"on (dd.daydate between ev.datefrom and ev.dateto) "; +var wh = []; +if (pconfig.filterstaff) { + wh.push("st.uuid in ('"+ pconfig.filterstaff.join("','")+"')"); +} +if (pconfig.filteractivity) { + //dump(pconfig.filteractivity + "\n"); + wh.push("ev.description in ('"+ pconfig.filteractivity.join("','")+"')"); +} +if (wh.length > 0) { + actsql += " WHERE " + wh.join( " OR "); +} +actsql += " GROUP BY dd.daydate,ev.uuid ORDER BY ev.description,dd.daydate,ev.timefrom,ev.timeto; "; +//dump("\n\n\nSTAFF ACTIVITY: " + actsql + "\n\n\n"); + var actdata = appdb.dbquery(actsql); + actdata = actdata.sqldata; + return actdata; +} + +function getstaffvacancy() { + var bdate = new Date(initdate.getFullYear(), initdate.getMonth(), initdate.getDate()); + var bend = new Date(initdate.getFullYear(), initdate.getMonth() + 1, 0); + var vacsql = "select dd.daydate as daydate,staffuuid, timefrom,timeto,type from ( "+ +"select staffuuid, "+ +"case when datefrom < '"+bdate.toLocaleFormat("%Y-%m-%d")+"' then '"+bdate.toLocaleFormat("%Y-%m-%d")+"' else datefrom end as datefrom, "+ +"case when dateto > '"+bend.toLocaleFormat("%Y-%m-%d")+"' then '"+bend.toLocaleFormat("%Y-%m-%d")+"' else dateto end as dateto, "+ +"timefrom,timeto, type "+ +"from vacancycalendar where (datefrom is null or datefrom <= '"+bend.toLocaleFormat("%Y-%m-%d")+"') and (dateto is null or dateto >= '"+bdate.toLocaleFormat("%Y-%m-%d")+"')) vc "+ +"join ("+drsql+") dd "+ +"on (dd.daydate between vc.datefrom and vc.dateto); "; +var wh = []; +if (pconfig.filterstaff) { + wh.push("staffuuid in ('"+ pconfig.filterstaff.join("','")+"')"); +} +if (wh.length > 0) { + vacsql += " WHERE " + wh.join( " OR "); +} +//dump("\n\n\nOPHSQL: " + ophsql + "\n\n\n"); + var vacdata = appdb.dbquery(vacsql); + vacdata = vacdata.sqldata; + return vacdata; +} + +function get_vacancydays(){ + var bdate = new Date(initdate.getFullYear(), initdate.getMonth(), initdate.getDate()); + var bend = new Date(initdate.getFullYear(), initdate.getMonth() + 1, 0); + var sql = "select dd.daydate,strftime('%d',dd.daydate) as strday,type from ( "+ +"select vacancydate, "+ +"case when vacancydateto is null then vacancydate else vacancydateto end as vacancydateto, "+ +"case when vacancydateto is null then 'vacancy' else 'holiday' end as type, "+ +"vacancydescription from vacancy where (vacancydate between '"+bdate.toLocaleFormat("%Y-%m-%d")+"' and '"+bend.toLocaleFormat("%Y-%m-%d")+"' and (vacancydateto >= '"+bdate.toLocaleFormat("%Y-%m-%d")+"' or vacancydateto is null)) or (vacancydateto between '"+bdate.toLocaleFormat("%Y-%m-%d")+"' and '"+bend.toLocaleFormat("%Y-%m-%d")+"' and vacancydate < '"+bdate.toLocaleFormat("%Y-%m-%d")+"') or ((vacancydate <= '"+bdate.toLocaleFormat("%Y-%m-%d")+"') and (vacancydateto >= '"+bend.toLocaleFormat("%Y-%m-%d")+"')) order by vacancydate,vacancydateto) vc "+ +"join ( "+ drsql +") dd "+ +"on (dd.daydate between vc.vacancydate and vc.vacancydateto) group by dd.daydate order by daydate;"; + var hdata = appdb.dbquery(sql); + hdata = hdata.sqldata; + var hs = {}; + for (var h in hdata){ + hs[hdata[h].strday] = hdata[h].type; + } + return hs; +} + +function convertHex(hex,opacity){ + hex = hex.replace('#',''); + r = parseInt(hex.substring(0,2), 16); + g = parseInt(hex.substring(2,4), 16); + b = parseInt(hex.substring(4,6), 16); + + result = 'rgba('+r+','+g+','+b+','+opacity+')'; + return result; +} + + + + + diff --git a/app_v3satdemo/chrome/content/modules/calendar/js/calchilds.js b/app_v3satdemo/chrome/content/modules/calendar/js/calchilds.js new file mode 100644 index 0000000..9fdea00 --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/calendar/js/calchilds.js @@ -0,0 +1,877 @@ +//Source-code licensed under EUPL v1.1 ( Copyright 2016 By DKS s.à r.l. - Kilian Saffran - Luxembourg ) + +var pconfig = {}; +//var cdate = null; +var initdate = new Date(); +initdate.setDate(1); +//var lastmonthday = null; +//var firstmonday = null; +//var lastsunday = null; +//var winh = window.innerHeight - 170; + +var amonth = ['', 'Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Aôut', 'Septembre', 'Octobre','Novembre', 'Décembre']; +//var linkpos = {}; +//var posday = {}; +//var delac = null; +//var curfreq ={}; +//var redate = /\d\d.\d\d.\d\d\d\d/; +//var tblcal = null; +var drsql = ""; + +function initdata() { + load_helpers(); + var configdata = apppref.getpreference("pageconfig.calchilds"); + if (!configdata) { + apppref.setpreference("pageconfig.calchilds", ''); + } + if (configdata !== '') { + pconfig = JSON.parse(configdata); + } + //if (!pconfig.printlayout) { + pconfig.printlayout = 'table'; + apppref.setpreference("pageconfig.calchilds",pconfig); + //} + if (pconfig.calmonth) { + + initdate = new Date(encodeparam(pconfig.calmonth, 'month').replace(/'/g, '')); + $("#calmonth").val(pconfig.calmonth); + } else { + $("#calmonth").val(initdate.toLocaleFormat('%m.%Y')); + pconfig.calmonth = initdate.toLocaleFormat('%m.%Y'); + } + var infogrp ="Nombre d'enfants"; + if (!pconfig.calendar){ + pconfig.calendar = "childsbyhour"; + } + if (pconfig.calendar == "lunch"){ + infogrp = "Déjeuner"; + } + + set_infoheader(infogrp+" - " + amonth[parseInt(pconfig.calmonth.substring(0, 3))] + " " + pconfig.calmonth.substring(3, 8)); + //drsql = getdaterangesql(); + //getgroups(); + drsql = getdaterangesql(); + //load_calendar_month(); + $('#calmonth').on('dp.hide', function() { + set_calmonth(); + }); + $("#filter_calendar option[value='"+ pconfig.calendar+"']").attr("selected", true); + $('#filter_calendar').on('change', function(){ + onselcalendar($(this).attr("id")); + }); + + if (pconfig.calendar == "childsbyhour"){ + + load_calendar_childs(); + }else if (pconfig.calendar == "childsbyplan"){ + load_calendar_plan(); + }else if (pconfig.calendar == "lunch"){ + load_calendar_lunch(); + }else if (pconfig.calendar == "childsbydayrange"){ + load_calendar_dayranges(); + }else if (pconfig.calendar == "childsbyweekhours"){ + load_calendar_weekhours(); + } + +} + +function load_calendar_childs() { + + + var cgr = appdb.dbquery("select uuid,grpname,maxchilds,color from groups"); + cgr = cgr.sqldata; + var ophdata = getoph(); + var timeranges = []; + //openhours + for (var o in ophdata) { + if (timeranges.indexOf(ophdata[o].begintime) == -1) { + timeranges.push(ophdata[o].begintime); + } + if (timeranges.indexOf(ophdata[o].endtime) == -1) { + timeranges.push(ophdata[o].endtime); + } + } + + //set Table header + var hdays = get_vacancydays(); + var strhead = 'Semaine'; + var totalspan = 2; + var coldata=getcolumndays(); + var coldays=coldata[0]; + var weekrange=coldata[1]; + for (var w in weekrange){ + strhead += '' + w + ''; + totalspan += weekrange[w]; + } + + strhead += ' de à '; + for (var th in coldays){ + var sty=""; + if (hdays[coldays[th]]) { + sty =' class="'+((hdays[coldays[th]]=='vacancy')?'calvacancy':'calvacrange')+'" '; + } + strhead += ''+ coldays[th]+''; + } + strhead += ''; + $('#tbl_timetable').append(strhead); + $('#tbl_timetable').append(''); + for (var g in cgr) { + $('#tbl_timetable').append('Groupe: '+ cgr[g].grpname+''); + var ttdata = gettimetable(cgr[g].uuid); + //dump(cgr[g].grpname + ":" + ttdata.length + "=>" + cgr[g].color + "\n"); + if (ttdata.length == 0){ + $('#tbl_timetable').append(' Pas de données'); + continue; + } + var alltr =[]; + var grtrange = timeranges; + + for (var tt in ttdata) { + if (timeranges.indexOf(ttdata[tt].begintime) == -1) { + grtrange.push(ttdata[tt].begintime); + } + if (timeranges.indexOf(ttdata[tt].endtime) == -1) { + grtrange.push(ttdata[tt].endtime); + } + } + grtrange=grtrange.sort(); + for (var t=0;t= alltr[y].endtime)) { + alltr[y][head]['childs'] += parseInt(ttdata[t].childcnt); + } + } + } + for (var a in alltr){ + var trn = ''+alltr[a].begintime+''+alltr[a].endtime+''; + for (var h in thead){ + if ((hdays[thead[h]]) && (hdays[thead[h]] == 'vacancy')) { + trn += ''; + continue; + } + trn += '' +alltr[a][thead[h]].childs+ ''; + trn +=''; + } + trn += ''; + $('#tbl_timetable').append(trn); + } + } + $('#tbl_timetable').append(''); + + +} + +function load_calendar_weekhours(){ + var cgr = appdb.dbquery("select uuid,grpname,maxchilds,color from groups"); + cgr = cgr.sqldata; + var hdays = get_vacancydays(); + var strhead = 'Semaine'; + var totalspan = 2; + var coldata=getcolumndays(); + var coldays=coldata[0]; + var weekrange=coldata[1]; + for (var w in weekrange){ + strhead += '' + w + ''; + totalspan += weekrange[w]; + } + + strhead += 'h / Semaine'; + for (var th in coldays){ + var sty=""; + if (hdays[coldays[th]]) { + sty =' class="'+((hdays[coldays[th]]=='vacancy')?'calvacancy':'calvacrange')+'" '; + } + strhead += ''+ coldays[th]+''; + } + strhead += ''; + $('#tbl_timetable').append(strhead); + $('#tbl_timetable').append(''); + for (var g in cgr) { + $('#tbl_timetable').append('Groupe: '+ cgr[g].grpname+' (max. '+cgr[g].maxchilds+' enfants)'); + var ttdata = getweekhours(cgr[g].uuid); + //dump(cgr[g].grpname + ":" + ttdata.length + "=>" + cgr[g].color + "\n"); + if (ttdata.length == 0){ + $('#tbl_timetable').append(' Pas de données'); + continue; + } + var alltr =[]; + var grtrange = []; + + for (var tt in ttdata) { + if (grtrange.indexOf(ttdata[tt].weekhours) == -1) + grtrange.push( ttdata[tt].weekhours); + } + grtrange=grtrange.sort(); + //dump("WH:" + JSON.stringify(grtrange) + "\n"); + var tfooter = []; + for (var t=0;t'; + for (var h in thead){ + if ((hdays[thead[h]]) && (hdays[thead[h]] == 'vacancy')) { + trn += ''; + continue; + } + trn += '' +alltr[a][thead[h]].childs+ ''; + trn +=''; + + } + trn += ''; + + $('#tbl_timetable').append(trn); + } + + //trf += ''; + //$('#tbl_timetable').append(trf); + //dump(JSON.stringify(tfoot) + "\n"); + + } + $('#tbl_timetable').append(''); +} + +function load_calendar_dayranges(){ + var cgr = appdb.dbquery("select uuid,grpname,maxchilds,color from groups"); + cgr = cgr.sqldata; + var hdays = get_vacancydays(); + var strhead = 'Semaine'; + var totalspan = 1; + var coldata=getcolumndays(); + var coldays=coldata[0]; + var weekrange=coldata[1]; + for (var w in weekrange){ + strhead += '' + w + ''; + totalspan += weekrange[w]; + } + + strhead += ' '; + for (var th in coldays){ + var sty=""; + if (hdays[coldays[th]]) { + sty =' class="'+((hdays[coldays[th]]=='vacancy')?'calvacancy':'calvacrange')+'" '; + } + strhead += ''+ coldays[th]+''; + } + strhead += ''; + $('#tbl_timetable').append(strhead); + $('#tbl_timetable').append(''); + for (var g in cgr) { + $('#tbl_timetable').append('Groupe: '+ cgr[g].grpname+' (max. '+cgr[g].maxchilds+' enfants)'); + var ttdata = gettimetable(cgr[g].uuid); + //dump(cgr[g].grpname + ":" + ttdata.length + "=>" + cgr[g].color + "\n"); + if (ttdata.length == 0){ + $('#tbl_timetable').append(' Pas de données'); + continue; + } + var alltr =[]; + var grtrange=['ouverture-12:00','12:00-14:00','14:00-fermeture']; + + + var tfooter = []; + var tr = {begintime:'00:01',endtime:'12:00',name:'matin'}; + alltr.push(tr); + tr = {begintime:'12:00',endtime:'14:00',name:'midi'}; + alltr.push(tr); + tr = {begintime:'14:00',endtime:'23:59',name:'après-midi'}; + alltr.push(tr); + //dump(JSON.stringify(alltr) + "\n"); + var thead = []; + var tfoot = []; + //var weekrange = {}; + var ltd = ""; + for (var t in ttdata){ + var dx = new Date(ttdata[t].daydate); + var head = ttdata[t].daydate.substring(8,10); + if (thead.indexOf(head) == -1) { + thead.push(head); + + } + + for (var y in alltr) { + //dump(JSON.stringify(alltr)) + if (!alltr[y][head]) { + alltr[y][head] = {childs:0}; + } + //dump(alltr[y].begintime + "=>" + ttdata[t].begintime + "\n"); + //dump(alltr[y].begintime + "<=>" + ttdata[t].endtime + "<=>"+ alltr[y].endtime + "\n----------------\n"); + if (y == "matin"){ + if (ttdata[t].begintime >= alltr[y].begintime) + { + alltr[y][head]['childs'] += parseInt(ttdata[t].childcnt); + } + }else if (y == "midi") { + if (((ttdata[t].begintime <= alltr[y].begintime) && (ttdata[t].endtime >= alltr[y].endtime)) || + ((ttdata[t].begintime >= alltr[y].begintime) && (ttdata[t].endtime >= alltr[y].endtime)) || + ((ttdata[t].begintime <= alltr[y].begintime) && (ttdata[t].endtime <= alltr[y].endtime)) || + ((ttdata[t].begintime >= alltr[y].begintime) && (ttdata[t].endtime <= alltr[y].endtime))) + { + alltr[y][head]['childs'] += parseInt(ttdata[t].childcnt); + } + }else { + if (ttdata[t].endtime >= alltr[y].begintime){ + alltr[y][head]['childs'] += parseInt(ttdata[t].childcnt); + } + } + } + //if (!tfoot[head]){ + // tfoot[head] = {total:0}; + //} + //dump(head + ":" +JSON.stringify(tfoot[head])+"\n"); + //tfoot[head].total = tfoot[head].total + parseInt(ttdata[t].childcnt); + } + //dump("FOOTER: " + tfoot.length +" : " + JSON.stringify(tfoot) + "\n"); + var grpcount = []; + for (var a in alltr){ + var trn = ''+alltr[a].name+''; + for (var h in thead){ + if ((hdays[thead[h]]) && (hdays[thead[h]] == 'vacancy')) { + trn += ''; + continue; + } + trn += '' +alltr[a][thead[h]].childs+ ''; + trn +=''; + + } + trn += ''; + + $('#tbl_timetable').append(trn); + } + + //trf += ''; + //$('#tbl_timetable').append(trf); + //dump(JSON.stringify(tfoot) + "\n"); + + } + $('#tbl_timetable').append(''); + } + +function load_calendar_plan(){ + var cgr = appdb.dbquery("select uuid,grpname,maxchilds,color from groups"); + cgr = cgr.sqldata; + var hdays = get_vacancydays(); + var strhead = 'Semaine'; + var totalspan = 2; + var coldata=getcolumndays(); + var coldays=coldata[0]; + var weekrange=coldata[1]; + for (var w in weekrange){ + strhead += '' + w + ''; + totalspan += weekrange[w]; + } + + strhead += ' de à '; + for (var th in coldays){ + var sty=""; + if (hdays[coldays[th]]) { + sty =' class="'+((hdays[coldays[th]]=='vacancy')?'calvacancy':'calvacrange')+'" '; + } + strhead += ''+ coldays[th]+''; + } + strhead += ''; + $('#tbl_timetable').append(strhead); + $('#tbl_timetable').append(''); + for (var g in cgr) { + $('#tbl_timetable').append('Groupe: '+ cgr[g].grpname+' (max. '+cgr[g].maxchilds+' enfants)'); + var ttdata = gettimetable(cgr[g].uuid); + //dump(cgr[g].grpname + ":" + ttdata.length + "=>" + cgr[g].color + "\n"); + if (ttdata.length == 0){ + $('#tbl_timetable').append(' Pas de données'); + continue; + } + var alltr =[]; + var grtrange = []; + + for (var tt in ttdata) { + if (grtrange.indexOf(ttdata[tt].begintime+"-"+ttdata[tt].endtime) == -1) + grtrange.push( ttdata[tt].begintime+ "-"+ ttdata[tt].endtime); + } + grtrange=grtrange.sort(); + var tfooter = []; + for (var t=0;t'+alltr[a].endtime+''; + for (var h in thead){ + if ((hdays[thead[h]]) && (hdays[thead[h]] == 'vacancy')) { + trn += ''; + continue; + } + trn += '' +alltr[a][thead[h]].childs+ ''; + trn +=''; + + } + trn += ''; + + $('#tbl_timetable').append(trn); + } + + //trf += ''; + //$('#tbl_timetable').append(trf); + //dump(JSON.stringify(tfoot) + "\n"); + + } + $('#tbl_timetable').append(''); + } + +function load_calendar_lunch(){ + var hdays = get_vacancydays(); + var strhead = 'Semaine'; + var totalspan = 1; + var coldata=getcolumndays(); + var coldays=coldata[0]; + var weekrange=coldata[1]; + var thead = []; + for (var w in weekrange){ + strhead += '' + w + ''; + totalspan += weekrange[w]; + } + + strhead += 'Groupe'; + for (var th in coldays){ + var sty=""; + if (hdays[coldays[th]]) { + sty =' class="'+((hdays[coldays[th]]=='vacancy')?'calvacancy':'calvacrange')+'" '; + } + strhead += ''+ coldays[th]+''; + if (thead.indexOf(coldays[th]) == -1) { + thead.push(coldays[th]); + } + } + strhead += ''; + $('#tbl_timetable').append(strhead); + $('#tbl_timetable').append(''); + var ldata = getlunchdata(); + + var cgr = appdb.dbquery("select uuid,grpname,color from groups"); + cgr = cgr.sqldata; + var alltr ={}; + + for (var g in cgr){ + + alltr[cgr[g].uuid] = {name:cgr[g].grpname,color:cgr[g].color}; + } + + //dump(JSON.stringify(alltr) + "\n"); + for (var l in ldata){ + //dump(JSON.stringify(ldata[l]) + "\n"); + + var guuid= ldata[l].groupuuid; + var dd = ldata[l].daydate; + + //if (!alltr[guuid][dd]) { + alltr[guuid][dd] = {"lunch":ldata[l].lunch}; + //} + + } + //dump(JSON.stringify(alltr) + "\n"); + //dump(JSON.stringify(thead) + "\n"); + for (var i in alltr){ + var trn = ''+alltr[i].name+''; + //dump(alltr[i] + "\n"); + for (var h in thead){ + if ((hdays[thead[h]]) && (hdays[thead[h]] == 'vacancy')) { + trn += ''; + continue; + } + //dump(thead[h] + " "+ h+ "\n"); + trn += '' +alltr[i][thead[h]].lunch+ ''; + trn +=''; + + + } + trn += ''; + $('#tbl_timetable').append(trn); + } + + $('#tbl_timetable').append(''); + + +} + +function set_calmonth(){ + pconfig.calmonth =$("#calmonth").val(); + apppref.setpreference("pageconfig.calchilds",pconfig); + globelreq.send_request({ + page: 'calchilds', + module: 'calendar', + data: null, + header: 'Organisation Enfants' + }); +} + + +function onnextmonth() { + var tmpmonth = new Date(encodeparam(pconfig.calmonth, 'month').replace(/'/g, '')); + var nmonth = new Date(tmpmonth.getFullYear(), tmpmonth.getMonth() + 1, tmpmonth.getDate()); + pconfig.calmonth = nmonth.toLocaleFormat('%m.%Y'); + apppref.setpreference("pageconfig.calchilds", pconfig); + globelreq.send_request({ + page: 'calchilds', + module: 'calendar', + header: 'Organisation Enfants' + }, null); +} + +function onpreviousmonth() { + var tmpmonth = new Date(encodeparam(pconfig.calmonth, 'month').replace(/'/g, '')); + var nmonth = new Date(tmpmonth.getFullYear(), tmpmonth.getMonth() - 1, tmpmonth.getDate()); + pconfig.calmonth = nmonth.toLocaleFormat('%m.%Y'); + apppref.setpreference("pageconfig.calchilds", pconfig); + globelreq.send_request({ + page: 'calchilds', + module: 'calendar', + header: 'Organisation Enfants' + }, null); +} + +//get childs planning with exact hours +function gettimetable(groupfilter) { + var ttsql = "select aa.daydate, " + +"case when aa.begintime is null or aa.begintime ='00:00' then wx.opentime else aa.begintime end as begintime, " + +"case when aa.endtime is null or aa.endtime ='00:00' then wx.closetime else aa.endtime end as endtime,"+ +"childcnt,aa.groupuuid,CAST(CAST (gr.maxchilds/gr.minstaff as REAL) + 0.5 as INT) as childsperstaff from ( "+ +"select daydate,groupuuid,"+ +"case when strftime('%w',daydate) = '1' then montimebegin "+ +"when strftime('%w',daydate) = '2' then tuetimebegin "+ +"when strftime('%w',daydate) = '3' then wedtimebegin "+ +"when strftime('%w',daydate) = '4' then thutimebegin "+ +"when strftime('%w',daydate) = '5' then fritimebegin else null end as begintime, "+ +"case when strftime('%w',daydate) = '1' then montimeend "+ +"when strftime('%w',daydate) = '2' then tuetimeend "+ +"when strftime('%w',daydate) = '3' then wedtimeend "+ +"when strftime('%w',daydate) = '4' then thutimeend "+ +"when strftime('%w',daydate) = '5' then fritimeend else null end as endtime, "+ +"count(distinct(childuuid)) as childcnt "+ +"from planning pl join ("; + ttsql += drsql + ") dd on (dd.daydate between pl.datebegin and pl.dateend) group by daydate,groupuuid,begintime,endtime ) " + + "aa " + +" left join (select dd.daydate,max(wh.datestart) as baseopendate, "+ +"case when strftime('%w',daydate) = '1' then montimeopen "+ +"when strftime('%w',daydate) = '2' then tuetimeopen "+ +"when strftime('%w',daydate) = '3' then wedtimeopen "+ +"when strftime('%w',daydate) = '4' then thutimeopen "+ +"when strftime('%w',daydate) = '5' then fritimeopen else null end as opentime, "+ +"case when strftime('%w',daydate) = '1' then montimeclose "+ +"when strftime('%w',daydate) = '2' then tuetimeclose "+ +"when strftime('%w',daydate) = '3' then wedtimeclose "+ +"when strftime('%w',daydate) = '4' then thutimeclose "+ +"when strftime('%w',daydate) = '5' then fritimeclose else null end as closetime "+ +" from workinghours wh left join ( " + drsql + +") dd on (dd.daydate > wh.datestart) group by dd.daydate) wx on (aa.daydate=wx.daydate) " + +" left join groups gr on (gr.uuid=aa.groupuuid) "; + if (groupfilter === ""){ + ttsql += " where gr.uuid='' or gr.uuid is null"; + } else { + ttsql += " where gr.uuid='"+ groupfilter +"' "; + } + + ttsql += " order by aa.daydate,begintime,endtime"; + //dump("\n\n\nTimeTableSQL: " + ttsql+ "\n\n\n"); + var ttdata = appdb.dbquery(ttsql); + ttdata = ttdata.sqldata; + return ttdata; +} + +function getweekhours(groupfilter) { + var ttsql = "select count(childuuid) as childcnt,weekhours,daydate,groupuuid from ( " + + "select daydate,ch.uuid as childuuid,pl.groupuuid, " + + "cast((strftime(\"%s\",montimeend) - strftime(\"%s\",montimebegin))/3600.0 AS REAL) + " + + "cast((strftime(\"%s\",tuetimeend) - strftime(\"%s\",tuetimebegin))/3600.0 AS REAL) + " + + "cast((strftime(\"%s\",wedtimeend) - strftime(\"%s\",wedtimebegin))/3600.0 AS REAL) + " + + "cast((strftime(\"%s\",thutimeend) - strftime(\"%s\",thutimebegin))/3600.0 AS REAL) + " + + "cast((strftime(\"%s\",fritimeend) - strftime(\"%s\",fritimebegin))/3600.0 AS REAL) + " + + "case when montimebegin2 is not null then CAST((strftime(\"%s\",montimeend2) - strftime(\"%s\",montimebegin2))/3600.0 AS REAL) else 0.0 end + " + + "case when tuetimebegin2 is not null then CAST((strftime(\"%s\",tuetimeend2) - strftime(\"%s\",tuetimebegin2))/3600.0 AS REAL) else 0.0 end + " + + "case when wedtimebegin2 is not null then CAST((strftime(\"%s\",wedtimeend2) - strftime(\"%s\",wedtimebegin2))/3600.0 AS REAL) else 0.0 end + " + + "case when thutimebegin2 is not null then CAST((strftime(\"%s\",thutimeend2) - strftime(\"%s\",thutimebegin2))/3600.0 AS REAL) else 0.0 end + " + + "case when fritimebegin2 is not null then CAST((strftime(\"%s\",fritimeend2) - strftime(\"%s\",fritimebegin2))/3600.0 AS REAL) else 0.0 end " + + "as weekhours " + + "from childs ch join planning pl on (ch.uuid=pl.childuuid) " + + "JOIN " + + " ("; + ttsql += drsql + ") dd on ( " + + " dd.daydate BETWEEN pl.datebegin AND pl.dateend) " + + " where pl.groupuuid='"+ groupfilter +"' " + + " GROUP BY daydate,childuuid) group by daydate,weekhours order by daydate,weekhours; " + + dump("\n\n\nWeekhoursSQL: " + ttsql+ "\n\n\n"); + var ttdata = appdb.dbquery(ttsql); + ttdata = ttdata.sqldata; + return ttdata; + } + +//get opening hours for list by splittet times +function getoph() { + var ophsql = "select dd.daydate,max(wh.datestart) as baseopendate, "+ +"case when strftime('%w',daydate) = '1' then montimeopen "+ +"when strftime('%w',daydate) = '2' then tuetimeopen "+ +"when strftime('%w',daydate) = '3' then wedtimeopen "+ +"when strftime('%w',daydate) = '4' then thutimeopen "+ +"when strftime('%w',daydate) = '5' then fritimeopen else null end as begintime, "+ +"case when strftime('%w',daydate) = '1' then montimeclose "+ +"when strftime('%w',daydate) = '2' then tuetimeclose "+ +"when strftime('%w',daydate) = '3' then wedtimeclose "+ +"when strftime('%w',daydate) = '4' then thutimeclose "+ +"when strftime('%w',daydate) = '5' then fritimeclose else null end as endtime "+ + "from workinghours wh left join ("; + ophsql += drsql + + ") dd on (dd.daydate > wh.datestart) group by dd.daydate order by dd.daydate"; + //dump("\n\n\nOPHSQL: " + ophsql + "\n\n\n"); + var ophdata = appdb.dbquery(ophsql); + ophdata = ophdata.sqldata; + return ophdata; +} + +function getlunchdata() { + var dateto2 = new Date(initdate.getFullYear(), initdate.getMonth() + 1, 1); + var sqlret = "select strftime('%d',daydate) as daydate,groupuuid,sum(monlunch+tuelunch+wedlunch+thulunch+frilunch) as lunch from ( " + +"select oph.daydate,gr.grpname,gr.uuid as groupuuid, " + +"SUM( CASE WHEN strftime('%w',oph.daydate) == '1' AND pl.monlunch == '1' THEN 1 ELSE 0 END ) AS monlunch, " + +"SUM( CASE WHEN strftime('%w',oph.daydate) == '2' AND pl.tuelunch == '1' THEN 1 ELSE 0 END ) AS tuelunch, " + +"SUM( CASE WHEN strftime('%w',oph.daydate) == '3' AND pl.wedlunch == '1' THEN 1 ELSE 0 END ) AS wedlunch, " + +"SUM( CASE WHEN strftime('%w',oph.daydate) == '4' AND pl.thulunch == '1' THEN 1 ELSE 0 END ) AS thulunch, " + +"SUM( CASE WHEN strftime('%w',oph.daydate) == '5' AND pl.frilunch == '1' THEN 1 ELSE 0 END ) AS frilunch " + +"FROM planning pl LEFT JOIN groups gr ON (pl.groupuuid=gr.uuid) " + +"LEFT JOIN " + +"( SELECT * FROM ( "; + + sqlret += drsql + " )) oph " + +"ON ( oph.daydate BETWEEN pl.datebegin AND pl.dateend) " + +"WHERE oph.daydate IS NOT NULL " + +"AND oph.daydate not in (select vacancydate from vacancy where vacancydateto is null and vacancydate between '"+initdate.toLocaleFormat("%Y-%m-%d") + "' AND '" + dateto2.toLocaleFormat("%Y-%m-%d")+"') " + +"GROUP BY daydate,gr.uuid " + +"ORDER BY oph.daydate, gr.minage, gr.maxage " + +") group by daydate,grpname; "; + //"LunchSQL:" + sqlret + "\n"); + var lunchdata = appdb.dbquery(sqlret); + lunchdata = lunchdata.sqldata; + return lunchdata; +} + +function getdaterangesql(){ + var adays = []; + var bdate = new Date(initdate.getFullYear(), initdate.getMonth(), initdate.getDate()); + var bend = new Date(initdate.getFullYear(), initdate.getMonth() + 1, 0); + for (var cdt = bdate; cdt <= bend; cdt.setDate(cdt.getDate() + 1)) { + if ((cdt.getDay() !== 0) && (cdt.getDay() !== 6)){ + adays.push("select date('" + cdt.toLocaleFormat('%Y-%m-%d') + "') as daydate"); + } + + } + return adays.join(" UNION "); +} + +function getcolumndays(){ + var adays = []; + var wrs = []; + var firstmonday = new Date(initdate.getFullYear(), initdate.getMonth(), 1); + //if (firstmonday > initdate) { + // firstmonday = new Date(initdate.getFullYear(), initdate.getMonth(),firstmonday.getDate()-7); + //} + var lastmonthday = new Date(initdate.getFullYear(), initdate.getMonth() + 1, 1); + //lastsunday = new Date(lastmonthday.getFullYear(), lastmonthday.getMonth(), lastmonthday.getDate() + 7 - parseInt(lastmonthday.toLocaleFormat('%w'))); + var lwr = -1; + //dump (initdate + ": " + firstmonday + " -> " + lastmonthday + "\n"); + for (var cdt = firstmonday; cdt < lastmonthday; cdt.setDate(cdt.getDate() + 1)) { + if ((cdt.getDay() !== 0) && (cdt.getDay() !== 6)){ + if ((lwr === -1) || (!wrs[parseInt(cdt.toLocaleFormat('%W'))])) { + wrs[parseInt(cdt.toLocaleFormat('%W'))] = 1; + }else { + wrs[parseInt(cdt.toLocaleFormat('%W'))] += 1; + } + lwr = parseInt(cdt.toLocaleFormat('%W')); + adays.push(cdt.toLocaleFormat('%d')); + } + + } + //dump(JSON.stringify(wrs) + "\n"); + return [adays,wrs]; +} + +//function getstaffglobal() { +// var bdate = new Date(initdate.getFullYear(), initdate.getMonth(), initdate.getDate()); +// var bend = new Date(initdate.getFullYear(), initdate.getMonth() + 1, 0); +// var staffsql = "select dd.daydate as daydate,uuid as staffuuid from ( "+ +//"select uuid, "+ +//"case when entrydate is null or entrydate < '"+bdate.toLocaleFormat("%Y-%m-%d")+"' then '"+bdate.toLocaleFormat("%Y-%m-%d")+"' else entrydate end as entrydate, "+ +//"case when exitdate is null or exitdate > '"+bend.toLocaleFormat("%Y-%m-%d")+"' then '"+bend.toLocaleFormat("%Y-%m-%d")+"' else exitdate end as exitdate "+ +//"from staff st "+ +//"where (entrydate is null or entrydate <= '"+bend.toLocaleFormat("%Y-%m-%d")+"') and (exitdate is null or exitdate >= '"+bdate.toLocaleFormat("%Y-%m-%d")+"')) sf "+ +//"join ("+drsql+") dd "+ +//"on (dd.daydate between sf.entrydate and sf.exitdate) order by daydate"; +// //dump("\n\n\nGLOBSQL: " + staffsql + "\n\n\n"); +// var sgldata = appdb.dbquery(staffsql); +// sgldata = sgldata.sqldata; +// return sgldata; +//} + +//function getstaffactivity() { +// var bdate = new Date(initdate.getFullYear(), initdate.getMonth(), initdate.getDate()); +// var bend = new Date(initdate.getFullYear(), initdate.getMonth() + 1, 0); +// var actsql = "select dd.daydate as daydate,ev.staffuuid as staffuuid,st.prename || ' ' || st.surname as staffname,st.color as color, ev.timefrom as timefrom,ev.timeto as timeto from ( "+ +//"select sp.staffuuid, "+ +//"case when datefrom < '"+bdate.toLocaleFormat("%Y-%m-%d")+"' then '"+bdate.toLocaleFormat("%Y-%m-%d")+"' else datefrom end as datefrom, "+ +//"case when dateto > '"+bend.toLocaleFormat("%Y-%m-%d")+"' then '"+bend.toLocaleFormat("%Y-%m-%d")+"' else dateto end as dateto, "+ +//"timefrom,timeto "+ +//"from eventcalendar ec join staffplanning sp on (ec.uuid=sp.eventcalendaruuid) where datefrom <= '"+bend.toLocaleFormat("%Y-%m-%d")+"' and (dateto is null or dateto >= '"+bdate.toLocaleFormat("%Y-%m-%d")+"')) ev "+ +//"join staff st on (ev.staffuuid=st.uuid) "+ +//"join ("+ drsql+") dd "+ +//"on (dd.daydate between ev.datefrom and ev.dateto) order by staffname,dd.daydate,ev.timefrom,ev.timeto; "; +////dump("\n\n\nACTSQL: " + actsql + "\n\n\n"); +// var actdata = appdb.dbquery(actsql); +// actdata = actdata.sqldata; +// return actdata; +//} + +//function getstaffvacancy() { +// var bdate = new Date(initdate.getFullYear(), initdate.getMonth(), initdate.getDate()); +// var bend = new Date(initdate.getFullYear(), initdate.getMonth() + 1, 0); +// var vacsql = "select dd.daydate as daydate,staffuuid, timefrom,timeto from ( "+ +//"select staffuuid, "+ +//"case when datefrom < '"+bdate.toLocaleFormat("%Y-%m-%d")+"' then '"+bdate.toLocaleFormat("%Y-%m-%d")+"' else datefrom end as datefrom, "+ +//"case when dateto > '"+bend.toLocaleFormat("%Y-%m-%d")+"' then '"+bend.toLocaleFormat("%Y-%m-%d")+"' else dateto end as dateto, "+ +//"timefrom,timeto "+ +//"from vacancycalendar where (datefrom is null or datefrom <= '"+bend.toLocaleFormat("%Y-%m-%d")+"') and (dateto is null or dateto >= '"+bdate.toLocaleFormat("%Y-%m-%d")+"')) vc "+ +//"join ("+drsql+") dd "+ +//"on (dd.daydate between vc.datefrom and vc.dateto); "; +// //dump("\n\n\nVACSQL: " + vacsql + "\n\n\n"); +// var vacdata = appdb.dbquery(vacsql); +// vacdata = vacdata.sqldata; +// return vacdata; +//} + +function get_vacancydays(){ + var bdate = new Date(initdate.getFullYear(), initdate.getMonth(), initdate.getDate()); + var bend = new Date(initdate.getFullYear(), initdate.getMonth() + 1, 0); + var sql = "select dd.daydate,strftime('%d',dd.daydate) as strday,type from ( "+ +"select vacancydate, "+ +"case when vacancydateto is null then vacancydate else vacancydateto end as vacancydateto, "+ +"case when vacancydateto is null then 'vacancy' else 'holiday' end as type, "+ +"vacancydescription from vacancy where (vacancydate between '"+bdate.toLocaleFormat("%Y-%m-%d")+"' and '"+bend.toLocaleFormat("%Y-%m-%d")+"' and (vacancydateto >= '"+bdate.toLocaleFormat("%Y-%m-%d")+"' or vacancydateto is null)) or (vacancydateto between '"+bdate.toLocaleFormat("%Y-%m-%d")+"' and '"+bend.toLocaleFormat("%Y-%m-%d")+"' and vacancydate < '"+bdate.toLocaleFormat("%Y-%m-%d")+"') or ((vacancydate <= '"+bdate.toLocaleFormat("%Y-%m-%d")+"') and (vacancydateto >= '"+bend.toLocaleFormat("%Y-%m-%d")+"')) order by vacancydate,vacancydateto) vc "+ +"join ( "+ drsql +") dd "+ +"on (dd.daydate between vc.vacancydate and vc.vacancydateto) group by dd.daydate order by daydate;"; + //dump("VACSQL: " + sql + "\n"); + var hdata = appdb.dbquery(sql); + hdata = hdata.sqldata; + var hs = {}; + for (var h in hdata){ + hs[hdata[h].strday] = hdata[h].type; + } + return hs; +} + +function onselcalendar(objid){ + //$('#' + objid).val() + "\n"); + pconfig.calendar = $('#' + objid).val(); + apppref.setpreference("pageconfig.calchilds",pconfig); + globelreq.send_request({ + page: 'calchilds', + module: 'calendar', + header: 'Organisation Enfants' + }, null); +} + + + +//function getgroups(){ +// var grpsdata = appdb.dbquery("select uuid,grpname from groups order by minage,maxage;"); +// grpsdata = grpsdata.sqldata; +// $("#filter_group").html(''); +// $("#filter_group").append(''); +// for (var g in grpsdata) { +// var sel = ""; +// if ((pconfig) && (pconfig.filtergroup) && (pconfig.filtergroup == grpsdata[g].uuid)){ +// sel = ' selected="1"'; +// } +// $("#filter_group").append(''); +// } +//} + diff --git a/app_v3satdemo/chrome/content/modules/calendar/js/calglobal.js b/app_v3satdemo/chrome/content/modules/calendar/js/calglobal.js new file mode 100644 index 0000000..1cb264f --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/calendar/js/calglobal.js @@ -0,0 +1,326 @@ +//Source-code licensed under EUPL v1.1 ( Copyright 2016 By DKS s.à r.l. - Kilian Saffran - Luxembourg ) + +var pconfig = {}; +//var cdate = null; +var initdate = new Date(); +initdate.setDate(1); +var lastmonthday = null; +var firstmonday = null; +var lastsunday = null; +var winh = window.innerHeight - 140; +var tblacc = null; +//var lblfreq = {daily:'jour(s)',weekly:'semaine(s)',monthly:'mois'}; +var amonth = ['', 'Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Aôut', 'Septembre','Octobre', 'Novembre', 'Décembre']; +var linkpos = {}; +var posday = {}; +var redate = /\d\d.\d\d.\d\d\d\d/; +//var lictype = apppref.getpreference("support.lictype"); + +function initdata() { + load_helpers(); + + var configdata = apppref.getpreference("pageconfig.calglobal"); + if (!configdata) { + apppref.setpreference("pageconfig.calglobal", ''); + } + //if (lictype == "free"){ + // $("#ddnofficial").hide(); + //} + if (configdata != '') { + pconfig = JSON.parse(configdata); + } + if (!pconfig.printlayout) { + pconfig.printlayout = 'calendar'; + apppref.setpreference("pageconfig.calglobal",pconfig); + } + if (pconfig.calmonth) { + + initdate = new Date(encodeparam(pconfig.calmonth, 'month').replace(/'/g, '')); + $("#calmonth").val(pconfig.calmonth); + } else { + $("#calmonth").val(initdate.toLocaleFormat('%m.%Y')); + pconfig.calmonth = initdate.toLocaleFormat('%m.%Y'); + } + set_infoheader(amonth[parseInt(pconfig.calmonth.substring(0,3))] + " " + pconfig.calmonth.substring(3,8)); + load_calendar_month(); + + $('#calmonth').on('dp.hide',function(e){ + set_calmonth(); + }); +} + +function load_calendar_month() { + + lastmonthday = new Date(initdate.getFullYear(), initdate.getMonth() + 1, 0); + firstmonday = new Date(initdate.getFullYear(), initdate.getMonth(), -1 * parseInt(initdate.toLocaleFormat('%w')) + 2); + + if (firstmonday > initdate) { + firstmonday = new Date(initdate.getFullYear(), initdate.getMonth(),firstmonday.getDate()-7); + } + + lastsunday = new Date(lastmonthday.getFullYear(), lastmonthday.getMonth(), lastmonthday.getDate() + 7 - parseInt(lastmonthday.toLocaleFormat('%w'))); + + var weeknum = 0; + var cmonth = initdate.getMonth(); + var sday = new Array(); + for (var cdate = firstmonday; cdate <= lastsunday; cdate.setDate(cdate.getDate() + 1)) { + dayident = "day" + weeknum + cdate.toLocaleFormat('%w'); + + linkpos[cdate.toLocaleFormat('%Y-%m-%d')] = "day" + weeknum + cdate.toLocaleFormat('%w'); + posday["day" + weeknum + cdate.toLocaleFormat('%w')] = cdate.toLocaleFormat('%Y-%m-%d'); + $("#" + dayident + " > div.panel-day > div.panel-dayhead").html(cdate.toLocaleFormat('%d')); + if (cdate.getMonth() == cmonth) { + $("#" + dayident + " > div.panel-day > div.panel-dayhead").addClass("panel-dayheadcurrent"); + } else { + $("#" + dayident).addClass("panel-dayother"); + + } + if (cdate.toLocaleFormat('%w') == "0") { + weeknum++; + } + + } + if (weeknum == 5) { + var curnum = cdate.toLocaleFormat('%d'); + $("#day51").addClass("panel-dayother"); + curnum = parseInt(curnum++);if (curnum < 10) {curnum = "0" + curnum;} + $("#day51 > div.panel-day > div.panel-dayhead").html(curnum); + $("#day52").addClass("panel-dayother"); + curnum = parseInt(curnum)+1;if (curnum < 10) {curnum = "0" + curnum;} + $("#day52 > div.panel-day > div.panel-dayhead").html(curnum); + $("#day53").addClass("panel-dayother"); + curnum = parseInt(curnum)+1;if (curnum < 10) {curnum = "0" + curnum;} + $("#day53 > div.panel-day > div.panel-dayhead").html(curnum); + $("#day54").addClass("panel-dayother"); + curnum = parseInt(curnum)+1;if (curnum < 10) {curnum = "0" + curnum;} + $("#day54 > div.panel-day > div.panel-dayhead").html(curnum); + $("#day55").addClass("panel-dayother"); + curnum = parseInt(curnum)+1;if (curnum < 10) {curnum = "0" + curnum;} + $("#day55 > div.panel-day > div.panel-dayhead").html(curnum); + $("#day56").addClass("panel-dayother"); + curnum = parseInt(curnum)+1;if (curnum < 10) {curnum = "0" + curnum;} + $("#day56 > div.panel-day > div.panel-dayhead").html(curnum); + $("#day50").addClass("panel-dayother"); + curnum = parseInt(curnum) +1;if (curnum < 10) {curnum = "0" + curnum;} + $("#day50 > div.panel-day > div.panel-dayhead").html(curnum); + } + firstmonday = new Date(initdate.getFullYear(), initdate.getMonth(), -1 * parseInt(initdate.toLocaleFormat('%w')) + 2); + + if (firstmonday > initdate) { + firstmonday = new Date(initdate.getFullYear(), initdate.getMonth(),firstmonday.getDate()-7); + } + lastsunday = new Date(lastmonthday.getFullYear(), lastmonthday.getMonth(), lastmonthday.getDate() + 7 - parseInt(lastmonthday.toLocaleFormat('%w'))); + load_calendar_data(); + + $('#frmeditvacancyrange #vacancydate').on("blur",function (e) { + var ok = true; + if ($('#frmeditvacancyrange #vacancydate').val().match(redate)) { + $('#btn_save_vacancyrange').removeAttr("disabled"); + }else { + ok = false; + $('#btn_save_vacancyrange').attr("disabled","1"); + } + if ((ok == true) && ($('#frmeditvacancyrange #vacancydateto').val() != '')) { + var tmpdt1 = encodeparam($('#frmeditvacancyrange #vacancydate').val(),'date'); + var tmpdt2 = encodeparam($('#frmeditvacancyrange #vacancydateto').val(),'date'); + if (tmpdt1 >= tmpdt2) { + $('#btn_save_vacancyrange').attr("disabled","1"); + } else { + $('#btn_save_vacancyrange').removeAttr("disabled"); + } + + } + }); + $('#frmeditvacancyrange #vacancydateto').on("blur",function (e) { + var ok = true; + if ($('#frmeditvacancyrange #vacancydateto').val().match(redate)) { + $('#btn_save_vacancyrange').removeAttr("disabled"); + }else { + ok = false; + $('#btn_save_vacancyrange').attr("disabled","1"); + } + if ((ok == true) && ($('#frmeditvacancyrange #vacancydateto').val() != '')) { + var tmpdt1 = encodeparam($('#frmeditvacancyrange #vacancydate').val(),'date'); + var tmpdt2 = encodeparam($('#frmeditvacancyrange #vacancydateto').val(),'date'); + if (tmpdt1 >= tmpdt2) { + $('#btn_save_vacancyrange').attr("disabled","1"); + } else { + $('#btn_save_vacancyrange').removeAttr("disabled"); + } + + } + }); +} + +function load_calendar_data() { + $("div.panel-daybody").html(""); + var sql = "select vacancydate,strftime('%Y%m%d',vacancydate) as strvacancydate,vacancydateto,case when vacancydateto is not null then strftime('%Y%m%d',vacancydateto) else null end as strvacancydateto,vacancydescription from vacancy " + + "where (vacancydate between '" + firstmonday.toLocaleFormat('%Y-%m-%d') + "' and '" + lastsunday.toLocaleFormat('%Y-%m-%d') + "' and (vacancydateto >= '" + firstmonday.toLocaleFormat('%Y-%m-%d') + "' or vacancydateto is null)) or (vacancydateto between '" + firstmonday.toLocaleFormat('%Y-%m-%d') + "' and '" + lastsunday.toLocaleFormat('%Y-%m-%d') + "' and vacancydate < '" + firstmonday.toLocaleFormat('%Y-%m-%d') + "') or ((vacancydate <= '" + firstmonday.toLocaleFormat('%Y-%m-%d') + "') and (vacancydateto >= '" + lastsunday.toLocaleFormat('%Y-%m-%d') + "')) " + + "order by vacancydate,vacancydateto;"; + + var caldata = appdb.dbquery(sql); + caldata = caldata.sqldata; + for (var c in caldata) { + var freq = "FREQ=DAILY"; + freq += ';DTSTART='+caldata[c].strvacancydate + 'T000000Z'; + + if (caldata[c].vacancydateto != ''){ + freq += ';UNTIL='+caldata[c].strvacancydateto + 'T000000Z'; + }else { + freq += ';UNTIL='+caldata[c].strvacancydate + 'T000000Z'; + } + try { + var rule = RRule.fromString(freq); + var rall = rule.all(); + } catch (ex){ + //dump("ERROR! loading data!" + ex + " FREQ:" + freq + "\n"); + } + for (var r in rall){ + var bgstyle='background-color: ' + ((caldata[c].vacancydateto == '')?'#0099cc':'#0000cc'); + $("#" + linkpos["" + rall[r].toLocaleFormat('%Y-%m-%d')] + " > div.panel-day > div.panel-daybody").append('
' + caldata[c].vacancydescription + '
'); + } + } +} + + +function set_calmonth() { + pconfig.calmonth = $('#calmonth').val(); + apppref.setpreference("pageconfig.calglobal", pconfig); + globelreq.send_request({ + page: 'calglobal', + module: 'calendar', + header: 'Jours feriés / Vacances' + }, null); +} + +function onnextmonth() { + var tmpmonth = new Date(encodeparam(pconfig.calmonth, 'month').replace(/'/g, '')); + var nmonth = new Date(tmpmonth.getFullYear(), tmpmonth.getMonth() + 1, tmpmonth.getDate()); + pconfig.calmonth = nmonth.toLocaleFormat('%m.%Y'); + apppref.setpreference("pageconfig.calglobal", pconfig); + globelreq.send_request({ + page: 'calglobal', + module: 'calendar', + header: 'Jours feriés / Vacances' + }, null); +} + +function onpreviousmonth() { + var tmpmonth = new Date(encodeparam(pconfig.calmonth, 'month').replace(/'/g, '')); + var nmonth = new Date(tmpmonth.getFullYear(), tmpmonth.getMonth() - 1, tmpmonth.getDate()); + pconfig.calmonth = nmonth.toLocaleFormat('%m.%Y'); + apppref.setpreference("pageconfig.calglobal", pconfig); + globelreq.send_request({ + page: 'calglobal', + module: 'calendar', + header: 'Jours feriés / Vacances' + }, null); +} + +function dlg_vacancyrange(data, type) { + $("#frmeditvacancyrange #vacancydateto").val(""); + $("#frmeditvacancyrange #vacancydate").val(""); + $("#frmeditvacancyrange #id_vacancydateto").val(""); + $("#frmeditvacancyrange #id_vacancydate").val(""); + $("#frmeditvacancyrange #vacancydescription").val(""); + var evdata = { + vacancydescription: '', + vacancydate:new Date(initdate.getFullYear(),initdate.getMonth(),initdate.getDate()).toLocaleFormat("%d.%m.%Y"), + vacancydateto: null + }; + if (data.vacancydateto == '') { + $('#dt_vacancydateto').hide(); + $('#dlgvacancytitle').html("Editer jour ferié"); + $('#lbldatevacancy').html("Date"); + }else { + $('#dt_vacancydateto').show(); + $('#dlgvacancytitle').html("Editer vacance scolaire"); + $('#lbldatevacancy').html("Date debut / fin"); + evdata.vacancydateto = new Date(initdate.getFullYear(),initdate.getMonth(),initdate.getDate()).toLocaleFormat("%d.%m.%Y"); + } + if (type == 'ins') { + $('#btndeletevacancy').hide(); + }else { + $('#btndeletevacancy').show(); + } + if ((type == 'upd') || (type == 'ins')) { + if (type == 'upd') { + var evsql = "SELECT strftime(\"%d.%m.%Y\",vacancydate) as vacancydate,vacancydate as id_vacancydate, strftime(\"%d.%m.%Y\",vacancydateto) as vacancydateto, vacancydateto as id_vacancydateto, vacancydescription FROM vacancy where vacancydate=date('"+data.vacancydate+"') and vacancydateto "+ ((data.vacancydateto == '')?'is null':"=date('"+data.vacancydateto+"')")+";"; + evdata = appdb.dbquery(evsql); + evdata = evdata.sqldata[0]; + } + for (var w in evdata) { + if ($("#frmeditvacancyrange #" + w)) { + $("#frmeditvacancyrange #" + w).val(evdata[w]); + } + } + + $("#edit_vacancyrange").modal('show'); + } +} + +function confirm_delete_vacancyrange() { + $("#confirm_delete_vacancyrange").modal('show'); + return false; +} + +function delete_vacancyrange() { + var delsql = "DELETE FROM vacancy where vacancydate=date('" + $('#frmeditvacancyrange #id_vacancydate').val()+"') and vacancydateto " + (($('#frmeditvacancyrange #id_vacancydateto').val()== '')?'is null':"=date('" + $('#frmeditvacancyrange #id_vacancydateto').val() + "')")+";"; + appdb.dbexec(delsql); + + $("#confirm_delete_vacancyrange").modal('hide'); + load_calendar_data(); + return false; +} + +function importdata(sqlfile) { + var abssqlfile = system.appdir() + system.sep() + 'defaults' + system.sep() + 'data'+ system.sep() + sqlfile + ".sql"; + if (system.fileexists(abssqlfile)) { + var data = system.readLocalTextFile(abssqlfile); + var repldata = data.split(';'); + for (var r in repldata){ + appdb.dbquery(repldata[r] + ";"); + } + } + load_calendar_data(); +} + +function save_vacancyrange() { + var sql1 = new Array(); + var sql2 = new Array(); + if ($('#vacancydateto').val() != '' && (encodeparam($('#vacancydate').val(),'date') > encodeparam($('#vacancydateto').val(),'date')) ) { + errormsg("Erreur","La Date début ne peut pas être supérieur à la date fin!"); + return false; + } + var type = 'ins'; + if ($('#frmeditvacancyrange #id_vacancydate').val() != '') { + type = 'upd'; + } + $("#frmeditvacancyrange :input").each(function() { + var input = $(this); + + if (input.attr("id") && (input.attr("id").substring(0,3) != 'id_')) { + if (type == 'ins') { + + sql1.push('"' + input.attr("id") + '"'); + var ival = encodeparam(input.val(), input.attr('type')); + sql2.push(ival); + } else { + var ival = encodeparam(input.val(), input.attr('type')); + sql2.push('"' + input.attr("id") + '"=' + ival); + } + } + }); + + var xsql = ""; + if (type == 'upd') { + xsql = "UPDATE vacancy SET " + sql2.join(',') + " where vacancydate=date('"+$('#frmeditvacancyrange #id_vacancydate').val()+"') and vacancydateto "+ (($('#frmeditvacancyrange #id_vacancydateto').val() == '')?'is null':"=date('"+$('#frmeditvacancyrange #id_vacancydateto').val()+"')")+";"; + } else { + xsql = "INSERT INTO vacancy (" + sql1.join(',') + ") VALUES (" + sql2.join(',') + ");"; + } + + appdb.dbexec(xsql); + load_calendar_data(); + + $("#edit_vacancyrange").modal('hide'); +} diff --git a/app_v3satdemo/chrome/content/modules/calendar/js/callunch.js b/app_v3satdemo/chrome/content/modules/calendar/js/callunch.js new file mode 100644 index 0000000..cb24bbb --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/calendar/js/callunch.js @@ -0,0 +1,216 @@ +//Source-code licensed under EUPL v1.1 ( Copyright 2016 By DKS s.à r.l. - Kilian Saffran - Luxembourg ) + +var pconfig = {}; +var initdate = new Date(); +initdate.setDate(1); +var lastmonthday = null; +var firstmonday = null; +var lastsunday = null; +var winh = window.innerHeight - 140; +var tblacc = null; +var lblfreq = {daily:'jour(s)',weekly:'semaine(s)',monthly:'mois'}; +var amonth = ['', 'Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Aôut', 'Septembre','Octobre', 'Novembre', 'Décembre']; +var linkpos = {}; +var posday = {}; +var delac = null; +var curfreq ={}; +//var lictype = apppref.getpreference("support.lictype"); + +function initdata() { + load_helpers(); + + var configdata = apppref.getpreference("pageconfig.callunch"); + if (!configdata) { + apppref.setpreference("pageconfig.callunch", ''); + } + if (configdata != '') { + pconfig = JSON.parse(configdata); + } + if (!pconfig.printlayout) { + pconfig.printlayout = 'calendar'; + apppref.setpreference("pageconfig.callunch",pconfig); + } + if (pconfig.calmonth) { + + initdate = new Date(encodeparam(pconfig.calmonth, 'month').replace(/'/g, '')); + $("#calmonth").val(pconfig.calmonth); + } else { + $("#calmonth").val(initdate.toLocaleFormat('%m.%Y')); + pconfig.calmonth = initdate.toLocaleFormat('%m.%Y'); + } + set_infoheader(amonth[parseInt(pconfig.calmonth.substring(0,3))] + " " + pconfig.calmonth.substring(3,8)); + load_calendar_month(); + $('#calmonth').on('dp.hide',function(e){ + set_calmonth(); + }); +} + +function load_calendar_month() { + + firstmonday = new Date(initdate.getFullYear(), initdate.getMonth(), -1 * parseInt(initdate.toLocaleFormat('%w')) + 2); + if (firstmonday > initdate) { + firstmonday = new Date(initdate.getFullYear(), initdate.getMonth(),firstmonday.getDate()-7); + } + lastmonthday = new Date(initdate.getFullYear(), initdate.getMonth() + 1, 0); + lastsunday = new Date(lastmonthday.getFullYear(), lastmonthday.getMonth(), lastmonthday.getDate() + 7 - parseInt(lastmonthday.toLocaleFormat('%w'))); + var weeknum = 0; + var cmonth = initdate.getMonth(); + var sday = new Array(); + for (var cdate = firstmonday; cdate <= lastsunday; cdate.setDate(cdate.getDate() + 1)) { + dayident = "day" + weeknum + cdate.toLocaleFormat('%w'); + + linkpos[cdate.toLocaleFormat('%Y-%m-%d')] = "day" + weeknum + cdate.toLocaleFormat('%w'); + posday["day" + weeknum + cdate.toLocaleFormat('%w')] = cdate.toLocaleFormat('%Y-%m-%d'); + $("#" + dayident + " > div.panel-day > div.panel-dayhead").html(cdate.toLocaleFormat('%d')); + if (cdate.getMonth() == cmonth) { + $("#" + dayident + " > div.panel-day > div.panel-dayhead").addClass("panel-dayheadcurrent"); + + } else { + $("#" + dayident).addClass("panel-dayother"); + } + if (cdate.toLocaleFormat('%w') == "0") { + weeknum++; + } + + } + if (weeknum == 5) { + var curnum = cdate.toLocaleFormat('%d'); + $("#day51").addClass("panel-dayother"); + curnum = parseInt(curnum++);if (curnum < 10) {curnum = "0" + curnum;} + $("#day51 > div.panel-day > div.panel-dayhead").html(curnum); + $("#day52").addClass("panel-dayother"); + curnum = parseInt(curnum)+1;if (curnum < 10) {curnum = "0" + curnum;} + $("#day52 > div.panel-day > div.panel-dayhead").html(curnum); + $("#day53").addClass("panel-dayother"); + curnum = parseInt(curnum)+1;if (curnum < 10) {curnum = "0" + curnum;} + $("#day53 > div.panel-day > div.panel-dayhead").html(curnum); + $("#day54").addClass("panel-dayother"); + curnum = parseInt(curnum)+1;if (curnum < 10) {curnum = "0" + curnum;} + $("#day54 > div.panel-day > div.panel-dayhead").html(curnum); + $("#day55").addClass("panel-dayother"); + curnum = parseInt(curnum)+1;if (curnum < 10) {curnum = "0" + curnum;} + $("#day55 > div.panel-day > div.panel-dayhead").html(curnum); + + } + firstmonday = new Date(initdate.getFullYear(), initdate.getMonth(), -1 * parseInt(initdate.toLocaleFormat('%w')) + 2); + if (firstmonday > initdate) { + firstmonday = new Date(initdate.getFullYear(), initdate.getMonth(),firstmonday.getDate()-7); + } + load_vacancy_data(); + load_calendar_data(); + +} + +function load_vacancy_data() { + var sql = "select vacancydate,strftime('%Y%m%d',vacancydate) as strvacancydate,vacancydateto,case when vacancydateto is not null then strftime('%Y%m%d',vacancydateto) else null end as strvacancydateto,vacancydescription from vacancy " + + "where (vacancydate between '" + firstmonday.toLocaleFormat('%Y-%m-%d') + "' and '" + lastsunday.toLocaleFormat('%Y-%m-%d') + "' and (vacancydateto >= '" + firstmonday.toLocaleFormat('%Y-%m-%d') + "' or vacancydateto is null)) or (vacancydateto between '" + firstmonday.toLocaleFormat('%Y-%m-%d') + "' and '" + lastsunday.toLocaleFormat('%Y-%m-%d') + "' and vacancydate < '" + firstmonday.toLocaleFormat('%Y-%m-%d') + "') or ((vacancydate <= '" + firstmonday.toLocaleFormat('%Y-%m-%d') + "') and (vacancydateto >= '" + lastsunday.toLocaleFormat('%Y-%m-%d') + "')) " + + "order by vacancydate,vacancydateto;"; + var caldata = appdb.dbquery(sql); + caldata = caldata.sqldata; + for (var c in caldata) { + var freq = "FREQ=DAILY"; + freq += ';DTSTART='+caldata[c].strvacancydate + 'T000000Z'; + + if (caldata[c].vacancydateto != ''){ + freq += ';UNTIL='+caldata[c].strvacancydateto + 'T000000Z'; + }else { + freq += ';UNTIL='+caldata[c].strvacancydate + 'T000000Z'; + } + try { + var rule = RRule.fromString(freq); + var rall = rule.all(); + } catch (ex){ + //dump("ERROR! loading data!" + ex + " FREQ:" + freq + "\n"); + } + for (var r in rall){ + $("#" + linkpos["" + rall[r].toLocaleFormat('%Y-%m-%d')] + " > div.panel-day > div.panel-dayhead").addClass(((caldata[c].vacancydateto == '')?'calvacancy':'calvacrange')); + $("#" + linkpos["" + rall[r].toLocaleFormat('%Y-%m-%d')] + " > div.panel-day > div.panel-dayhead > div#vacname").remove(); + $("#" + linkpos["" + rall[r].toLocaleFormat('%Y-%m-%d')] + " > div.panel-day > div.panel-dayhead").prepend('
'+ caldata[c].vacancydescription + "
 "); + } + } +} + + +function load_calendar_data() { + + $("div.panel-daybody").html(""); + var sql = getsql(new Date(initdate.toLocaleFormat("%Y-%m-%d")),new Date(lastmonthday.toLocaleFormat("%Y-%m-%d"))); + var caldata = appdb.dbquery(sql); + caldata = caldata.sqldata; + var totals = {}; + for (var c in caldata) { + $("#" + linkpos["" + caldata[c].daydate] + " > div.panel-day > div.panel-daybody").append('' + caldata[c].grpname + ": "+ caldata[c].lunch +'  '); + if (totals[caldata[c].daydate]) { + totals[caldata[c].daydate] += caldata[c].lunch; + }else { + totals[caldata[c].daydate] = caldata[c].lunch; + } + } + for (var t in totals){ + $("#" + linkpos["" + t] + " > div.panel-day > div.panel-daybody").prepend('TOTAL:' + " "+ totals[t] +' 
'); + } +} + +function getsql(datefrom2,dateto2) { + var sqlret = "select daydate,grpname,sum(monlunch+tuelunch+wedlunch+thulunch+frilunch) as lunch from ( " + +"select oph.daydate,gr.grpname, " + +"SUM( CASE WHEN strftime('%w',oph.daydate) == '1' AND pl.monlunch == '1' THEN 1 ELSE 0 END ) AS monlunch, " + +"SUM( CASE WHEN strftime('%w',oph.daydate) == '2' AND pl.tuelunch == '1' THEN 1 ELSE 0 END ) AS tuelunch, " + +"SUM( CASE WHEN strftime('%w',oph.daydate) == '3' AND pl.wedlunch == '1' THEN 1 ELSE 0 END ) AS wedlunch, " + +"SUM( CASE WHEN strftime('%w',oph.daydate) == '4' AND pl.thulunch == '1' THEN 1 ELSE 0 END ) AS thulunch, " + +"SUM( CASE WHEN strftime('%w',oph.daydate) == '5' AND pl.frilunch == '1' THEN 1 ELSE 0 END ) AS frilunch " + +"FROM planning pl LEFT JOIN groups gr ON (pl.groupuuid=gr.uuid) " + +"LEFT JOIN " + +"( SELECT * FROM ( "; + var sqldays = new Array(); + + for (var cdate2=datefrom2;cdate2<=dateto2;cdate2.setDate(cdate2.getDate() +1)){ + if ((cdate2.getDay() != 0) && (cdate2.getDay() != 6)){ + sqldays.push ("SELECT date('" + cdate2.toLocaleFormat('%Y-%m-%d') +"') as daydate"); + } + } + + sqlret += sqldays.join(' UNION ALL ') + " )) oph " + +"ON ( oph.daydate BETWEEN pl.datebegin AND pl.dateend) " + +"WHERE oph.daydate IS NOT NULL " + +"AND oph.daydate not in (select vacancydate from vacancy where vacancydateto is null and vacancydate between '"+initdate.toLocaleFormat("%Y-%m-%d") + "' AND '" + dateto2.toLocaleFormat("%Y-%m-%d")+"') " + +"GROUP BY daydate,gr.uuid " + +"ORDER BY oph.daydate, gr.minage, gr.maxage " + +") group by daydate,grpname; "; + return sqlret; +} + + +function set_calmonth() { + pconfig.calmonth = $('#calmonth').val(); + apppref.setpreference("pageconfig.callunch", pconfig); + globelreq.send_request({ + page: 'callunch', + module: 'calendar', + header: 'Déjeuner' + }, null); +} + +function onnextmonth() { + var tmpmonth = new Date(encodeparam(pconfig.calmonth, 'month').replace(/'/g, '')); + var nmonth = new Date(tmpmonth.getFullYear(), tmpmonth.getMonth() + 1, tmpmonth.getDate()); + pconfig.calmonth = nmonth.toLocaleFormat('%m.%Y'); + apppref.setpreference("pageconfig.callunch", pconfig); + globelreq.send_request({ + page: 'callunch', + module: 'calendar', + header: 'Déjeuner' + }, null); +} + +function onpreviousmonth() { + var tmpmonth = new Date(encodeparam(pconfig.calmonth, 'month').replace(/'/g, '')); + var nmonth = new Date(tmpmonth.getFullYear(), tmpmonth.getMonth() - 1, tmpmonth.getDate()); + pconfig.calmonth = nmonth.toLocaleFormat('%m.%Y'); + apppref.setpreference("pageconfig.callunch", pconfig); + globelreq.send_request({ + page: 'callunch', + module: 'calendar', + header: 'Déjeuner' + }, null); +} diff --git a/app_v3satdemo/chrome/content/modules/calendar/js/calvacancy.js b/app_v3satdemo/chrome/content/modules/calendar/js/calvacancy.js new file mode 100644 index 0000000..33d068b --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/calendar/js/calvacancy.js @@ -0,0 +1,656 @@ +//Source-code licensed under EUPL v1.1 ( Copyright 2016 By DKS s.à r.l. - Kilian Saffran - Luxembourg ) + +var pconfig = {}; +//var cdate = null; +var initdate = new Date(); +initdate.setDate(1); +var lastmonthday = null; +var firstmonday = null; +var lastsunday = null; +var winh = window.innerHeight - 140; +var tblcal = null; +var lblfreq = {daily:'jour(s)',weekly:'semaine(s)',monthly:'mois'}; +var amonth = ['', 'Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Aôut', 'Septembre',,'Octobre', 'Novembre', 'Décembre']; +var linkpos = {}; +var posday = {}; +var delac = null; +var curfreq ={}; +var redate = /\d\d.\d\d.\d\d\d\d/; +var curdatediff = null; +var accdb = null; +var drsql = ""; +var defaultcreche = null; +var curcreche=null; +//var lictype = apppref.getpreference("support.lictype"); + +function initdata() { + load_helpers(); + + var configdata = apppref.getpreference("pageconfig.calvacancy"); + if (!configdata) { + apppref.setpreference("pageconfig.calvacancy", ''); + } + if (configdata != '') { + pconfig = JSON.parse(configdata); + } + if (!pconfig.printlayout) { + pconfig.printlayout = 'calendar'; + apppref.setpreference("pageconfig.calvacancy",pconfig); + } + //if (lictype == "free"){ + // $("#divfilterstaff").hide(); + //} + if (pconfig.calmonth) { + + initdate = new Date(encodeparam(pconfig.calmonth, 'month').replace(/'/g, '')); + $("#calmonth").val(pconfig.calmonth); + } else { + $("#calmonth").val(initdate.toLocaleFormat('%m.%Y')); + pconfig.calmonth = initdate.toLocaleFormat('%m.%Y'); + } + +// load_staff_selection('filter_staff'); +// load_staff_selection('staffuuid',{maxHeight: 300}); + load_creche_selection(); + set_infoheader(amonth[parseInt(pconfig.calmonth.substring(0,3))] + " " + pconfig.calmonth.substring(3,8)); + load_calendar_month(); + $('#calmonth').on('dp.hide',function(e){ + set_calmonth(); + }); + $('#frmeditvacancy #datefrom').on("blur",function (e) { + var ok = true; + if ($('#frmeditvacancy #datefrom').val().match(redate)) { + $('#btn_save_vacancy').removeAttr("disabled"); + }else { + ok = false; + $('#btn_save_vacancy').attr("disabled","1"); + } + if ((ok == true) && ($('#frmeditvacancy #dateto').val() != '')) { + var tmpdt1 = encodeparam($('#frmeditvacancy #datefrom').val(),'date'); + var nd = new Date(tmpdt1.replace(/'/g,'')); + var xd = new Date(nd.getFullYear(),nd.getMonth(),nd.getDate() + curdatediff); + $('#frmeditvacancy #dateto').val(xd.toLocaleFormat("%d.%m.%Y")); + var tmpdt2 = encodeparam($('#frmeditvacancy #dateto').val(),'date'); + if (tmpdt1 > tmpdt2) { + $('#btn_save_vacancy').attr("disabled","1"); + } else { + $('#btn_save_vacancy').removeAttr("disabled"); + } + + } + }); + $('#frmeditvacancy #dateto').on("blur",function (e) { + var ok = true; + if ($('#frmeditvacancy #dateto').val().match(redate)) { + $('#btn_save_vacancy').removeAttr("disabled"); + }else { + ok = false; + $('#btn_save_vacancy').attr("disabled","1"); + } + curdatediff=daysBetween(new Date(encodeparam($('#frmeditvacancy #datefrom').val(),'date').replace(/'/g,'')),new Date(encodeparam($('#frmeditvacancy #dateto').val(),'date').replace(/'/g,''))); + if ((ok == true) && ($('#frmeditvacancy #dateto').val() != '')) { + var tmpdt1 = encodeparam($('#frmeditvacancy #datefrom').val(),'date'); + var tmpdt2 = encodeparam($('#frmeditvacancy #dateto').val(),'date'); + if (tmpdt1 > tmpdt2) { + $('#btn_save_vacancy').attr("disabled","1"); + } else { + $('#btn_save_vacancy').removeAttr("disabled"); + } + + } + }); + +} + + + +function load_calendar_month() { + + firstmonday = new Date(initdate.getFullYear(), initdate.getMonth(), -1 * parseInt(initdate.toLocaleFormat('%w')) + 2); + if (firstmonday > initdate) { + firstmonday = new Date(initdate.getFullYear(), initdate.getMonth(),firstmonday.getDate()-7); + } + + lastmonthday = new Date(initdate.getFullYear(), initdate.getMonth() + 1, 0); + + lastsunday = new Date(lastmonthday.getFullYear(), lastmonthday.getMonth(), lastmonthday.getDate() + 7 - parseInt(lastmonthday.toLocaleFormat('%w'))); + + var weeknum = 0; + var cmonth = initdate.getMonth(); + var sday = new Array(); + for (var cdate = firstmonday; cdate <= lastsunday; cdate.setDate(cdate.getDate() + 1)) { + dayident = "day" + weeknum + cdate.toLocaleFormat('%w'); + + linkpos[cdate.toLocaleFormat('%Y-%m-%d')] = "day" + weeknum + cdate.toLocaleFormat('%w'); + posday["day" + weeknum + cdate.toLocaleFormat('%w')] = cdate.toLocaleFormat('%Y-%m-%d'); + $("#" + dayident + " > div.panel-day > div.panel-dayhead").html(cdate.toLocaleFormat('%d')); + + if (cdate.getMonth() == cmonth) { + $("#" + dayident + " > div.panel-day > div.panel-dayhead").addClass("panel-dayheadcurrent"); + } else { + $("#" + dayident).addClass("panel-dayother"); + + } + if (cdate.toLocaleFormat('%w') == "0") { + weeknum++; + } + + } + + firstmonday = new Date(initdate.getFullYear(), initdate.getMonth(), -1 * parseInt(initdate.toLocaleFormat('%w')) + 2); + + if (firstmonday > initdate) { + firstmonday = new Date(initdate.getFullYear(), initdate.getMonth(),firstmonday.getDate()-7); + } + //load_vacancy_data(); + load_calendar_data(); + +} + +function load_calendar_data() { + var where = ""; + + var sql = getmonthlysql(new Date(initdate.toLocaleFormat("%Y-%m-%d")),new Date(lastmonthday.toLocaleFormat("%Y-%m-%d")),where); + + $("#tbl_timetable").html(""); + + + // set timetable header + drsql = getdaterangesql(); + var ophdata = getoph(); + + var thead = []; + var weekrange = {}; + var ltd = ""; + for (var t in ophdata){ + var dx = new Date(ophdata[t].daydate); + if (!weekrange[parseInt(dx.toLocaleFormat('%W'))]) { + weekrange[parseInt(dx.toLocaleFormat('%W'))] = 1; + }else if (ltd != ophdata[t].daydate) { + weekrange[parseInt(dx.toLocaleFormat('%W'))] += 1; + } + var head = ophdata[t].daydate.substring(8,10); + if (thead.indexOf(head) == -1) { + thead.push(head); + + } + + ltd = ophdata[t].daydate; + + } + var cspan = 0; + var hdays = get_vacancydays(); + var strhead = 'Semaine'; + for (var w in weekrange){ + strhead += '' + w + ''; + cspan += weekrange[w]; + } + strhead += ' '; + for (var th in thead){ + var sty=""; + if (hdays[thead[th]]) { + sty =' style="background-color: '+((hdays[thead[th]]=='vacancy')?'#FF7145':'#FF9C2A')+' !important;" '; + } + strhead += ''+ thead[th]+''; + } + + strhead += ''; + $('#tbl_timetable').append(strhead); + $('#tbl_timetable').append(''); + //dump(JSON.stringify(accdb) + "\n"); + if (pconfig.filtercreche){ + //dump(JSON.stringify(pconfig.filtercreche) + "\n"); + for (var c in pconfig.filtercreche){ + //dump(c + "\n"); + var xnum = pconfig.filtercreche[c]; + var crspan = thead.length + 1; + curcreche = accdb[xnum]; + var crhead = '' + curcreche.name +''; + $('#tbl_timetable').append(crhead); + appdb.closeConnection(); + appdb.setdbFile(curcreche.path.local + system.sep() + curcreche.uuid + ".sqlite"); + appdb.openDatabase(); + setcrechevacancydata(thead,hdays); + } + } + $('#tbl_timetable').append(''); +} + +function setcrechevacancydata(thead,hdays){ + var vacdata = getstaffvacancy(); + //dump(JSON.stringify(vacdata) + "\n" ); + var staffsql = "SELECT uuid,prename || ' ' || substr(surname,1,2) as fullname,color from staff where entrydate <= date('"+initdate.toLocaleFormat('%Y-%m-%d')+"','+1 month','-1 day') and (exitdate is null or exitdate >= date('"+initdate.toLocaleFormat('%Y-%m-%d')+"'));"; + //dump("SSQL:" + staffsql + "\n"); + var staffnames = appdb.dbquery(staffsql); + staffnames = staffnames.sqldata; + var stxcolor = {}; + //dump(JSON.stringify(staffnames)); + for (var stu in staffnames){ + //dump(JSON.stringify(staffnames[stu]) + "\n"); + stxcolor[staffnames[stu].uuid] = staffnames[stu].color; + var row = ''+ staffnames[stu].fullname+'.'; + + for (var d in thead){ + if ((hdays[thead[d]]) && (hdays[thead[d]] == 'vacancy')){ + row += ''; + }else { + row += ''; + } + + } + row += ''; + $('#tbl_timetable').append(row); + } + if (vacdata.length > 0){ + for (var vc in vacdata){ + //dump(JSON.stringify(vacdata[vc]) + "\n"); + var da = vacdata[vc].daydate.substring(8,10); + var hh = ""; + //if (vacdata[vc].timefrom==vacdata[vc].timeto) { + // hh="8h"; + //}else { + // hh=parseInt(vacdata[vc].timeto.substring(1,2))-parseInt(vacdata[vc].timefrom.substring(1,2)) + "h"; + //} + + $('#tblcon_' + vacdata[vc].staffuuid + '_' + da + "").append(''); + //$('#tblcon_' + vacdata[vc].staffuuid + '_' + da + "").append(''); + } + + } + +} + +function setdailydurationfields() { + var dd = $('#dailyduration :selected').val(); + if (dd=='1.0') { + $("#ftimefrom").hide(); + $("#fhours").hide(); + }else if (dd=='0.4') { + $("#ftimefrom").show(); + $("#fhours").hide(); + }else if (dd=='0.') { + $("#ftimefrom").show(); + $("#fhours").show(); + } +} + +function getmonthlysql(datefrom2,dateto2,where) { + var sqlret = "SELECT vc.uuid, vc.datefrom,strftime('%Y%m%d',vc.datefrom) as strdatefrom,' ' || strftime('%Y%m%d',vc.datefrom) || strftime('%Y%m%d',vc.dateto) || '' || strftime('%d.%m.%Y',vc.datefrom) || ' - ' || strftime('%d.%m.%Y',vc.dateto) as tbldaterange, vc.dateto,strftime('%Y%m%d',vc.dateto) as strdateto, "+ +"case when vc.timefrom=vc.timeto then '8h' else (cast(substr(vc.timeto,1,2) as int) - cast(substr(vc.timefrom,1,2) as int)) || 'h' end as hours , " + +"vc.description, vc.staffuuid,coalesce(st.surname,'') || ' ' || coalesce(st.prename,'') as staffname,vc.type,st.color FROM vacancycalendar vc left join staff st on (vc.staffuuid=st.uuid) " + + "LEFT JOIN ( SELECT * FROM ( "; + var sqldays = new Array(); + + for (var cdate2=datefrom2;cdate2<=dateto2;cdate2.setDate(cdate2.getDate() +1)){ + if ((cdate2.getDay() != 0) && (cdate2.getDay() != 6)){ + sqldays.push ("SELECT date('" + cdate2.toLocaleFormat('%Y-%m-%d') +"') as daydate"); + } + } + + sqlret += sqldays.join(' UNION ALL ') + " )) oph " + + "ON (oph.daydate BETWEEN vc.datefrom AND vc.dateto) " + + "WHERE oph.daydate IS NOT NULL and strftime('%w',oph.daydate) not in ('6','0') " + + "AND oph.daydate NOT IN ( SELECT vacancydate FROM vacancy WHERE vacancydateto IS NULL AND vacancydate BETWEEN '"+initdate.toLocaleFormat("%Y-%m-%d") + "' AND '" + dateto2.toLocaleFormat("%Y-%m-%d")+"') " + + ((where != '')?" AND " + where + " ":"") + + " GROUP BY vc.uuid ORDER BY st.uuid,vc.datefrom, vc.dateto; "; + return sqlret; +} + + +function set_calmonth() { + pconfig.calmonth = $('#calmonth').val(); + apppref.setpreference("pageconfig.calvacancy", pconfig); + globelreq.send_request({ + page: 'calvacancy', + module: 'calendar', + header: 'Congés' + }, null); +} + +function onnextmonth() { + var tmpmonth = new Date(encodeparam(pconfig.calmonth, 'month').replace(/'/g,'')); + var nmonth = new Date(tmpmonth.getFullYear(), tmpmonth.getMonth() + 1, tmpmonth.getDate()); + pconfig.calmonth = nmonth.toLocaleFormat('%m.%Y'); + apppref.setpreference("pageconfig.calvacancy", pconfig); + globelreq.send_request({ + page: 'calvacancy', + module: 'calendar', + header: 'Congés' + }, null); +} + +function onpreviousmonth() { + var tmpmonth = new Date(encodeparam(pconfig.calmonth, 'month').replace(/'/g,'')); + var nmonth = new Date(tmpmonth.getFullYear(), tmpmonth.getMonth() - 1, tmpmonth.getDate()); + pconfig.calmonth = nmonth.toLocaleFormat('%m.%Y'); + apppref.setpreference("pageconfig.calvacancy", pconfig); + globelreq.send_request({ + page: 'calvacancy', + module: 'calendar', + header: 'Congés' + }, null); +} + +function dlg_sel_creche(){ + $('#select_creche').modal('show'); +} + +function set_creche(){ + $('#select_creche').modal('hide'); + dlg_vacancy($('#sel_creche :selected').val(),null, 'ins') +} + +function dlg_vacancy(xnum,uuid, type) { + if (!xnum){ + return false; + } + curcreche = accdb[xnum]; + + appdb.closeConnection(); + appdb.setdbFile(curcreche.path.local + system.sep() + curcreche.uuid + ".sqlite"); + appdb.openDatabase(); + + load_staff_selection('staffuuid',{maxHeight: 300}); + //dump("TYPE " + type +" CUUID:" + uuid +"\n"); +if (type == 'ins') { + + //load staffdata + $('#frmeditvacancy #staffuuid').multiselect('select',[]); + $('#btndeletevacancy').hide(); + }else { + $('#btndeletevacancy').show(); + } + + var evdata = { + uuid: '0', + description: '', + datefrom:new Date().toLocaleFormat("%d.%m.%Y"), + dateto:new Date().toLocaleFormat("%d.%m.%Y"), + staffuuid:'', + timefrom: '00:00', + hours: '1', + type:'0', + dailyduration:'1.0' + }; + + if (type == 'upd') { + var evsql = "SELECT uuid, strftime(\"%d.%m.%Y\",datefrom) as datefrom, strftime(\"%d.%m.%Y\",dateto) as dateto, timefrom, description, staffuuid,type, case when timefrom!=timeto then '0.' || (cast(substr(timeto,1,2) as int) - cast(substr(timefrom,1,2) as int)) else 1.0 end as dailyduration,null as hours FROM vacancycalendar where uuid='" + uuid + "';"; + //dump("UPDSQL:" +evsql + "\n"); + evdata = appdb.dbquery(evsql); + evdata = evdata.sqldata[0]; + if (evdata.dailyduration == '1') { + evdata.dailyduration = '1.0'; + evdata.hours = '8'; + }else { + evdata.hours = evdata.dailyduration.substring(2,3); + if (evdata.dailyduration != '0.4') { + evdata.dailyduration = '0.'; + } + } + $('#frmeditvacancy #staffuuid').multiselect('select',[evdata.staffuuid]); + } + + for (var w in evdata) { + if ($("#frmeditvacancy #" + w)) { + $("#frmeditvacancy #" + w).val(evdata[w]); + } + } + curdatediff=daysBetween(new Date(encodeparam($('#frmeditvacancy #datefrom').val(),'date').replace(/'/g,'')),new Date(encodeparam($('#frmeditvacancy #dateto').val(),'date').replace(/'/g,''))); + setdailydurationfields(); + $("#edit_vacancy").modal('show'); +} + +function confirm_delete_vacancy() { + $("#confirm_delete_vacancy").modal('show'); + return false; +} + +function delete_vacancy() { + var delsql = "DELETE FROM vacancycalendar where uuid='" + $('#frmeditvacancy #uuid').val()+"';"; + appdb.dbexec(delsql); + load_calendar_data(); + $("#confirm_delete_vacancy").modal('hide'); + + return false; +} + +function save_vacancy() { + var sql1 = new Array(); + var sql2 = new Array(); + if (($('#datefrom').val() != '') && + (encodeparam($('#datefrom').val(),'date') > encodeparam($('#dateto').val(),'date'))) { + errormsg("Erreur","La Date début ne peut pas être supérieur à la date fin!"); + return false; + } + + var type = 'ins'; + var cuuid = ""; + if ($("#frmeditvacancy #uuid").val() != 0) { + type = 'upd'; + cuuid = $("#frmeditvacancy #uuid").val(); + } + + $("#frmeditvacancy :input").each(function() { + var input = $(this); + + if (input.attr("id")) { + + if (type == 'ins') { + + + if (input.attr("id") == 'uuid') { + sql1.push('"' + input.attr("id") + '"'); + if (input.val() == "" || input.val() == "0") { + sql2.push("'" + appdb.generate_uuid() + "'"); + } else { + sql2.push("'" + input.val() + "'"); + } + } else if (input.attr("id") == 'dailyduration') { + sql1.push('"timeto"'); + if (input.val() == '1.0') { + sql2.push("'" +$('#timefrom').val() + "'"); + }else if (input.val() == '0.4') { + var xval = parseInt($('#timefrom').val().substring(1,2)) + 4; + if (xval < 10) { xval = "0" + xval;} + xval += ":00"; + sql2.push("'" + xval + "'"); + }else { + var xval = parseInt($('#timefrom').val().substring(1,2)) + parseInt($('#hours').val()); + if (xval < 10) { xval = "0" + xval;} + xval += ":00"; + sql2.push("'" + xval + "'"); + } + } else if ((input.attr("id") != 'dailyduration') && (input.attr("id") != 'hours')) { + sql1.push('"' + input.attr("id") + '"'); + var ival = encodeparam(input.val(), input.attr('type')); + sql2.push(ival); + } + } else { + if ((input.attr("id") != 'uuid') && (input.attr("id") != 'dailyduration') && (input.attr("id") != 'hours')) { + var ival = encodeparam(input.val(), input.attr('type')); + sql2.push('"' + input.attr("id") + '"=' + ival); + } else if (input.attr("id") == 'dailyduration') { + if (input.val() == '1.0') { + sql2.push('"timeto"='+ "'" + $('#timefrom').val() + "'"); + }else if (input.val() == '0.4') { + var xval = parseInt($('#timefrom').val().substring(1,2)) + 4; + if (xval < 10) { xval = "0" + xval;} + xval += ":00"; + sql2.push('"timeto"=' +"'" + xval + "'"); + }else { + var xval = parseInt($('#timefrom').val().substring(1,2)) + parseInt($('#hours').val()); + if (xval < 10) { xval = "0" + xval;} + xval += ":00"; + sql2.push('"timeto"=' +"'" + xval + "'"); + } + } + } + //} + } + + }); + + var xsql = ""; + if (type == 'upd') { + xsql = "UPDATE vacancycalendar SET " + sql2.join(',') + " where \"uuid\"='" + cuuid + "';"; + } else { + + xsql = "INSERT INTO vacancycalendar (" + sql1.join(',') + ") VALUES (" + sql2.join(',') + ");"; + } + + appdb.dbexec(xsql); + + load_calendar_data(); + + $("#frmeditvacancy #uuid").val("0"); + $("#edit_vacancy").modal('hide'); +} + +function invertColor(hexTripletColor) { + var color = hexTripletColor; + color = color.substring(1); // remove # + color = parseInt(color, 16); // convert to integer + color = 0xFFFFFF ^ color; // invert three bytes + color = color.toString(16); // convert to hex + color = ("000000" + color).slice(-6); // pad with leading zeros + color = "#" + color; // prepend # + return color; +} + +function onselstaff(objid) { + + pconfig.filterstaff = $('#' + objid).val(); + apppref.setpreference("pageconfig.calvacancy",pconfig); + load_calendar_data(); +} + +function load_dlgprint(){ + if ($('#view_month').css('display') == 'none') { + globelreq.send_request({page:'preview2',data:{page: 'table'}}); + }else { + globelreq.send_request({page:'preview2',data:{page: 'calendar'}}); + } +} + +function load_creche_selection(){ + accdb = appdb.getaccessibledatabases(); + + for (var i in accdb){ + //dump("DBcfg: " +JSON.stringify(i) + "\n"); + if (appdb.dbFile == accdb[i].path.local){ + defaultcreche = accdb[i].dbnum; + } + $('#filter_creche').append(''); + $('#sel_creche').append(''); + } + + $('#filter_creche').multiselect({enableHTML: true,numberDisplayed:1,nonSelectedText:"Crèche Courrant",allSelectedText: 'Tous',nSelectedText: ' selections'}); + if (pconfig.filtercreche) { + $('#filter_creche').multiselect('select',pconfig.filtercreche); + }else { + var xar = []; + xar.push(defaultcreche); + $('#filter_creche').multiselect('select',xar); + pconfig.filtercreche = xar; + } + apppref.setpreference("pageconfig.calvacancy",pconfig); +} + +function onselcreche(){ + pconfig.filtercreche = $('#filter_creche').val(); + apppref.setpreference("pageconfig.calvacancy",pconfig); + load_calendar_data(); +} + +function getoph() { + var ophsql = "select dd.daydate,max(wh.datestart) as baseopendate, "+ + "case when strftime('%w',daydate) = '1' then montimeopen "+ + "when strftime('%w',daydate) = '2' then tuetimeopen "+ + "when strftime('%w',daydate) = '3' then wedtimeopen "+ + "when strftime('%w',daydate) = '4' then thutimeopen "+ + "when strftime('%w',daydate) = '5' then fritimeopen else null end as begintime, "+ + "case when strftime('%w',daydate) = '1' then montimeclose "+ + "when strftime('%w',daydate) = '2' then tuetimeclose "+ + "when strftime('%w',daydate) = '3' then wedtimeclose "+ + "when strftime('%w',daydate) = '4' then thutimeclose "+ + "when strftime('%w',daydate) = '5' then fritimeclose else null end as endtime "+ + "from workinghours wh left join ("; + ophsql += drsql + + ") dd on (dd.daydate > wh.datestart) group by dd.daydate order by dd.daydate"; + //dump("\n\n\nOPHSQL: " + ophsql + "\n\n\n"); + var ophdata = appdb.dbquery(ophsql); + ophdata = ophdata.sqldata; + return ophdata; + } + + function getdaterangesql(){ + var adays = []; + var bdate = new Date(initdate.getFullYear(), initdate.getMonth(), initdate.getDate()); + var bend = new Date(initdate.getFullYear(), initdate.getMonth() + 1, 0); + for (var cdt = bdate; cdt <= bend; cdt.setDate(cdt.getDate() + 1)) { + if ((cdt.getDay() != 0) && (cdt.getDay() != 6)){ + adays.push("select date('" + cdt.toLocaleFormat('%Y-%m-%d') + "') as daydate"); + } + + } + return adays.join(" UNION "); + } + + function get_vacancydays(){ + var bdate = new Date(initdate.getFullYear(), initdate.getMonth(), initdate.getDate()); + var bend = new Date(initdate.getFullYear(), initdate.getMonth() + 1, 0); + var sql = "select dd.daydate,strftime('%d',dd.daydate) as strday,type from ( "+ + "select vacancydate, "+ + "case when vacancydateto is null then vacancydate else vacancydateto end as vacancydateto, "+ + "case when vacancydateto is null then 'vacancy' else 'holiday' end as type, "+ + "vacancydescription from vacancy where (vacancydate between '"+bdate.toLocaleFormat("%Y-%m-%d")+"' and '"+bend.toLocaleFormat("%Y-%m-%d")+"' and (vacancydateto >= '"+bdate.toLocaleFormat("%Y-%m-%d")+"' or vacancydateto is null)) or (vacancydateto between '"+bdate.toLocaleFormat("%Y-%m-%d")+"' and '"+bend.toLocaleFormat("%Y-%m-%d")+"' and vacancydate < '"+bdate.toLocaleFormat("%Y-%m-%d")+"') or ((vacancydate <= '"+bdate.toLocaleFormat("%Y-%m-%d")+"') and (vacancydateto >= '"+bend.toLocaleFormat("%Y-%m-%d")+"')) order by vacancydate,vacancydateto) vc "+ + "join ( "+ drsql +") dd "+ + "on (dd.daydate between vc.vacancydate and vc.vacancydateto) group by dd.daydate order by daydate;"; + var hdata = appdb.dbquery(sql); + hdata = hdata.sqldata; + var hs = {}; + for (var h in hdata){ + hs[hdata[h].strday] = hdata[h].type; + } + return hs; + } + + function getstaffvacancy() { + var bdate = new Date(initdate.getFullYear(), initdate.getMonth(), initdate.getDate()); + var bend = new Date(initdate.getFullYear(), initdate.getMonth() + 1, 0); + var vacsql = "SELECT vc.uuid as uuid, dd.daydate AS daydate, vc.staffuuid as staffuuid, printf(\"%.2f\",CASE WHEN vc.timefrom=vc.timeto THEN CAST(st.weekhours/5.00 AS REAL) ELSE CAST((CAST(strftime(\"%s\",vc.timeto) AS REAL)- CAST(strftime(\"%s\",vc.timefrom) AS REAL))/3600.00 AS REAL) END) AS hours, vc.type as type" + + " from ( "+ + "select uuid,staffuuid, "+ + "case when datefrom < '"+bdate.toLocaleFormat("%Y-%m-%d")+"' then '"+bdate.toLocaleFormat("%Y-%m-%d")+"' else datefrom end as datefrom, "+ + "case when dateto > '"+bend.toLocaleFormat("%Y-%m-%d")+"' then '"+bend.toLocaleFormat("%Y-%m-%d")+"' else dateto end as dateto, "+ + "timefrom,timeto, type "+ + "from vacancycalendar where (datefrom is null or datefrom <= '"+bend.toLocaleFormat("%Y-%m-%d")+"') and (dateto is null or dateto >= '"+bdate.toLocaleFormat("%Y-%m-%d")+"')) vc "+ + "join ("+drsql+") dd "+ + "on (dd.daydate between vc.datefrom and vc.dateto) left join staff st on (st.uuid=vc.staffuuid); "; + //dump("VACCALSQL:" +vacsql + "\n"); + var vacdata = appdb.dbquery(vacsql); + vacdata = vacdata.sqldata; + return vacdata; + } + + function load_staff_selection(objid,option){ + $('#' + objid).html(""); + var stdata = appdb.dbquery("select uuid, coalesce(surname,'') || ' ' || coalesce(prename,'') as name,case when color is null then '#000' else color end as color from staff order by surname,prename"); + stdata = stdata.sqldata; + for (var s in stdata){ + $('#' + objid).append(''); + } + + var copt = {}; + if (option) { + copt = option; + } + copt['enableHTML'] = true; + copt['nonSelectedText']="Sélectionner un(e) employé(e)..."; + copt['numberDisplayed']=5; + copt['allSelectedText']='Tous'; + copt['nSelectedText']=' selections'; + + $('#' + objid).multiselect(copt); + + } \ No newline at end of file diff --git a/app_v3satdemo/chrome/content/modules/calendar/js/calvacancy_basic.js b/app_v3satdemo/chrome/content/modules/calendar/js/calvacancy_basic.js new file mode 100644 index 0000000..9e3a643 --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/calendar/js/calvacancy_basic.js @@ -0,0 +1,467 @@ +//Source-code licensed under EUPL v1.1 ( Copyright 2016 By DKS s.à r.l. - Kilian Saffran - Luxembourg ) + +var pconfig = {}; +//var cdate = null; +var initdate = new Date(); +initdate.setDate(1); +var lastmonthday = null; +var firstmonday = null; +var lastsunday = null; +var winh = window.innerHeight - 140; +var tblcal = null; +var lblfreq = {daily:'jour(s)',weekly:'semaine(s)',monthly:'mois'}; +var amonth = ['', 'Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Aôut', 'Septembre',,'Octobre', 'Novembre', 'Décembre']; +var linkpos = {}; +var posday = {}; +var delac = null; +var curfreq ={}; +var redate = /\d\d.\d\d.\d\d\d\d/; +var curdatediff = null; +var accdb = null; +var drsql = ""; +var defaultcreche = null; +var curcreche=null; +//var lictype = apppref.getpreference("support.lictype"); + +function initdata() { + load_helpers(); + + var configdata = apppref.getpreference("pageconfig.calvacancy"); + if (!configdata) { + apppref.setpreference("pageconfig.calvacancy", ''); + } + if (configdata != '') { + pconfig = JSON.parse(configdata); + } + if (!pconfig.printlayout) { + pconfig.printlayout = 'calendar'; + apppref.setpreference("pageconfig.calvacancy",pconfig); + } + //if (lictype == "free"){ + // $("#divfilterstaff").hide(); + //} + if (pconfig.calmonth) { + + initdate = new Date(encodeparam(pconfig.calmonth, 'month').replace(/'/g, '')); + $("#calmonth").val(pconfig.calmonth); + } else { + $("#calmonth").val(initdate.toLocaleFormat('%m.%Y')); + pconfig.calmonth = initdate.toLocaleFormat('%m.%Y'); + } + +// load_staff_selection('filter_staff'); +// load_staff_selection('staffuuid',{maxHeight: 300}); + load_creche_selection(); + set_infoheader(amonth[parseInt(pconfig.calmonth.substring(0,3))] + " " + pconfig.calmonth.substring(3,8)); + load_calendar_month(); + $('#calmonth').on('dp.hide',function(e){ + set_calmonth(); + }); + + +} + + + +function load_calendar_month() { + + firstmonday = new Date(initdate.getFullYear(), initdate.getMonth(), -1 * parseInt(initdate.toLocaleFormat('%w')) + 2); + if (firstmonday > initdate) { + firstmonday = new Date(initdate.getFullYear(), initdate.getMonth(),firstmonday.getDate()-7); + } + + lastmonthday = new Date(initdate.getFullYear(), initdate.getMonth() + 1, 0); + + lastsunday = new Date(lastmonthday.getFullYear(), lastmonthday.getMonth(), lastmonthday.getDate() + 7 - parseInt(lastmonthday.toLocaleFormat('%w'))); + + var weeknum = 0; + var cmonth = initdate.getMonth(); + var sday = new Array(); + for (var cdate = firstmonday; cdate <= lastsunday; cdate.setDate(cdate.getDate() + 1)) { + dayident = "day" + weeknum + cdate.toLocaleFormat('%w'); + + linkpos[cdate.toLocaleFormat('%Y-%m-%d')] = "day" + weeknum + cdate.toLocaleFormat('%w'); + posday["day" + weeknum + cdate.toLocaleFormat('%w')] = cdate.toLocaleFormat('%Y-%m-%d'); + $("#" + dayident + " > div.panel-day > div.panel-dayhead").html(cdate.toLocaleFormat('%d')); + + if (cdate.getMonth() == cmonth) { + $("#" + dayident + " > div.panel-day > div.panel-dayhead").addClass("panel-dayheadcurrent"); + } else { + $("#" + dayident).addClass("panel-dayother"); + + } + if (cdate.toLocaleFormat('%w') == "0") { + weeknum++; + } + + } + + firstmonday = new Date(initdate.getFullYear(), initdate.getMonth(), -1 * parseInt(initdate.toLocaleFormat('%w')) + 2); + + if (firstmonday > initdate) { + firstmonday = new Date(initdate.getFullYear(), initdate.getMonth(),firstmonday.getDate()-7); + } + //load_vacancy_data(); + load_calendar_data(); + +} + +function load_calendar_data() { + var where = ""; + + var sql = getmonthlysql(new Date(initdate.toLocaleFormat("%Y-%m-%d")),new Date(lastmonthday.toLocaleFormat("%Y-%m-%d")),where); + + $("#tbl_timetable").html(""); + + + // set timetable header + drsql = getdaterangesql(); + var ophdata = getoph(); + + var thead = []; + var weekrange = {}; + var ltd = ""; + for (var t in ophdata){ + var dx = new Date(ophdata[t].daydate); + if (!weekrange[parseInt(dx.toLocaleFormat('%W'))]) { + weekrange[parseInt(dx.toLocaleFormat('%W'))] = 1; + }else if (ltd != ophdata[t].daydate) { + weekrange[parseInt(dx.toLocaleFormat('%W'))] += 1; + } + var head = ophdata[t].daydate.substring(8,10); + if (thead.indexOf(head) == -1) { + thead.push(head); + + } + + ltd = ophdata[t].daydate; + + } + var cspan = 0; + var hdays = get_vacancydays(); + var strhead = 'Semaine'; + for (var w in weekrange){ + strhead += '' + w + ''; + cspan += weekrange[w]; + } + strhead += ' '; + for (var th in thead){ + var sty=""; + if (hdays[thead[th]]) { + sty =' style="background-color: '+((hdays[thead[th]]=='vacancy')?'#FF7145':'#FF9C2A')+' !important;" '; + } + strhead += ''+ thead[th]+''; + } + + strhead += ''; + $('#tbl_timetable').append(strhead); + $('#tbl_timetable').append(''); + //dump(JSON.stringify(accdb) + "\n"); + if (pconfig.filtercreche){ + //dump(JSON.stringify(pconfig.filtercreche) + "\n"); + for (var c in pconfig.filtercreche){ + //dump(c + "\n"); + var xnum = pconfig.filtercreche[c]; + var crspan = thead.length + 1; + curcreche = accdb[xnum]; + var crhead = '' + curcreche.name +''; + $('#tbl_timetable').append(crhead); + appdb.closeConnection(); + appdb.setdbFile(curcreche.path.local + system.sep() + curcreche.uuid + ".sqlite"); + appdb.openDatabase(); + setcrechevacancydata(thead,hdays); + } + } + $('#tbl_timetable').append(''); +} + +function setcrechevacancydata(thead,hdays){ + var vacdata = getstaffvacancy(); + + var staffsql = "SELECT uuid,prename || ' ' || substr(surname,1,2) as fullname,color from staff where entrydate <= date('"+initdate.toLocaleFormat('%Y-%m-%d')+"','+1 month','-1 day') and (exitdate is null or exitdate >= date('"+initdate.toLocaleFormat('%Y-%m-%d')+"'));"; + //dump("SSQL:" + staffsql + "\n"); + var staffnames = appdb.dbquery(staffsql); + staffnames = staffnames.sqldata; + var stxcolor = {}; + //dump(JSON.stringify(staffnames)); + for (var stu in staffnames){ + //dump(JSON.stringify(staffnames[stu]) + "\n"); + stxcolor[staffnames[stu].uuid] = staffnames[stu].color; + var row = ''+ staffnames[stu].fullname+'.'; + + for (var d in thead){ + if ((hdays[thead[d]]) && (hdays[thead[d]] == 'vacancy')){ + row += ''; + }else { + row += ''; + } + + } + row += ''; + $('#tbl_timetable').append(row); + } + if (vacdata.length > 0){ + for (var vc in vacdata){ + //dump(JSON.stringify(vacdata[vc]) + "\n"); + var da = vacdata[vc].daydate.substring(8,10); + var hh = ""; + if (vacdata[vc].timefrom==vacdata[vc].timeto) { + hh="8h"; + }else { + hh=parseInt(vacdata[vc].timeto.substring(1,2))-parseInt(vacdata[vc].timefrom.substring(1,2)) + "h"; + } + + $('#tblcon_' + vacdata[vc].staffuuid + '_' + da + "").append(''); + } + + } + +} + + + +function getmonthlysql(datefrom2,dateto2,where) { + var sqlret = "SELECT vc.uuid, vc.datefrom,strftime('%Y%m%d',vc.datefrom) as strdatefrom,' ' || strftime('%Y%m%d',vc.datefrom) || strftime('%Y%m%d',vc.dateto) || '' || strftime('%d.%m.%Y',vc.datefrom) || ' - ' || strftime('%d.%m.%Y',vc.dateto) as tbldaterange, vc.dateto,strftime('%Y%m%d',vc.dateto) as strdateto, "+ +"case when vc.timefrom=vc.timeto then '8h' else (cast(substr(vc.timeto,1,2) as int) - cast(substr(vc.timefrom,1,2) as int)) || 'h' end as hours , " + +"vc.description, vc.staffuuid,coalesce(st.surname,'') || ' ' || coalesce(st.prename,'') as staffname,vc.type,st.color FROM vacancycalendar vc left join staff st on (vc.staffuuid=st.uuid) " + + "LEFT JOIN ( SELECT * FROM ( "; + var sqldays = new Array(); + + for (var cdate2=datefrom2;cdate2<=dateto2;cdate2.setDate(cdate2.getDate() +1)){ + if ((cdate2.getDay() != 0) && (cdate2.getDay() != 6)){ + sqldays.push ("SELECT date('" + cdate2.toLocaleFormat('%Y-%m-%d') +"') as daydate"); + } + } + + sqlret += sqldays.join(' UNION ALL ') + " )) oph " + + "ON (oph.daydate BETWEEN vc.datefrom AND vc.dateto) " + + "WHERE oph.daydate IS NOT NULL and strftime('%w',oph.daydate) not in ('6','0') " + + "AND oph.daydate NOT IN ( SELECT vacancydate FROM vacancy WHERE vacancydateto IS NULL AND vacancydate BETWEEN '"+initdate.toLocaleFormat("%Y-%m-%d") + "' AND '" + dateto2.toLocaleFormat("%Y-%m-%d")+"') " + + ((where != '')?" AND " + where + " ":"") + + " GROUP BY vc.uuid ORDER BY st.uuid,vc.datefrom, vc.dateto; "; + return sqlret; +} + + +function set_calmonth() { + pconfig.calmonth = $('#calmonth').val(); + apppref.setpreference("pageconfig.calvacancy", pconfig); + globelreq.send_request({ + page: 'calvacancy_basic', + module: 'calendar', + header: 'Congés' + }, null); +} + +function onnextmonth() { + var tmpmonth = new Date(encodeparam(pconfig.calmonth, 'month').replace(/'/g,'')); + var nmonth = new Date(tmpmonth.getFullYear(), tmpmonth.getMonth() + 1, tmpmonth.getDate()); + pconfig.calmonth = nmonth.toLocaleFormat('%m.%Y'); + apppref.setpreference("pageconfig.calvacancy", pconfig); + globelreq.send_request({ + page: 'calvacancy_basic', + module: 'calendar', + header: 'Congés' + }, null); +} + +function onpreviousmonth() { + var tmpmonth = new Date(encodeparam(pconfig.calmonth, 'month').replace(/'/g,'')); + var nmonth = new Date(tmpmonth.getFullYear(), tmpmonth.getMonth() - 1, tmpmonth.getDate()); + pconfig.calmonth = nmonth.toLocaleFormat('%m.%Y'); + apppref.setpreference("pageconfig.calvacancy", pconfig); + globelreq.send_request({ + page: 'calvacancy_basic', + module: 'calendar', + header: 'Congés' + }, null); +} + +function dlg_sel_creche(){ + $('#select_creche').modal('show'); +} + +function set_creche(){ + $('#select_creche').modal('hide'); + dlg_vacancy($('#sel_creche :selected').val(),null, 'ins') +} + +function dlg_vacancy(xnum,uuid, type) { + if (!xnum){ + return false; + } + curcreche = accdb[xnum]; + + appdb.closeConnection(); + appdb.setdbFile(curcreche.path.local + system.sep() + curcreche.uuid + ".sqlite"); + appdb.openDatabase(); + + load_staff_selection('staffuuid',{maxHeight: 300}); + //dump("TYPE " + type +" CUUID:" + uuid +"\n"); +if (type == 'ins') { + + //load staffdata + $('#frmeditvacancy #staffuuid').multiselect('select',[]); + $('#btndeletevacancy').hide(); + }else { + $('#btndeletevacancy').show(); + } + + var evdata = { + uuid: '0', + description: '', + datefrom:new Date().toLocaleFormat("%d.%m.%Y"), + dateto:new Date().toLocaleFormat("%d.%m.%Y"), + staffuuid:'', + timefrom: '00:00', + hours: '1', + type:'0', + dailyduration:'1.0' + }; + + if (type == 'upd') { + var evsql = "SELECT uuid, strftime(\"%d.%m.%Y\",datefrom) as datefrom, strftime(\"%d.%m.%Y\",dateto) as dateto, timefrom, description, staffuuid,type, case when timefrom!=timeto then '0.' || (cast(substr(timeto,1,2) as int) - cast(substr(timefrom,1,2) as int)) else 1.0 end as dailyduration,null as hours FROM vacancycalendar where uuid='" + uuid + "';"; + //dump("UPDSQL:" +evsql + "\n"); + evdata = appdb.dbquery(evsql); + evdata = evdata.sqldata[0]; + if (evdata.dailyduration == '1') { + evdata.dailyduration = '1.0'; + evdata.hours = '8'; + }else { + evdata.hours = evdata.dailyduration.substring(2,3); + if (evdata.dailyduration != '0.4') { + evdata.dailyduration = '0.'; + } + } + $('#frmeditvacancy #staffuuid').multiselect('select',[evdata.staffuuid]); + } + + for (var w in evdata) { + if ($("#frmeditvacancy #" + w)) { + $("#frmeditvacancy #" + w).val(evdata[w]); + } + } + curdatediff=daysBetween(new Date(encodeparam($('#frmeditvacancy #datefrom').val(),'date').replace(/'/g,'')),new Date(encodeparam($('#frmeditvacancy #dateto').val(),'date').replace(/'/g,''))); + setdailydurationfields(); + $("#edit_vacancy").modal('show'); +} + + + + + + +function invertColor(hexTripletColor) { + var color = hexTripletColor; + color = color.substring(1); // remove # + color = parseInt(color, 16); // convert to integer + color = 0xFFFFFF ^ color; // invert three bytes + color = color.toString(16); // convert to hex + color = ("000000" + color).slice(-6); // pad with leading zeros + color = "#" + color; // prepend # + return color; +} + + +function load_creche_selection(){ + accdb = appdb.getaccessibledatabases(); + + for (var i in accdb){ + //dump("DBcfg: " +JSON.stringify(i) + "\n"); + if (appdb.dbFile == accdb[i].path.local){ + defaultcreche = accdb[i].dbnum; + } + $('#filter_creche').append(''); + $('#sel_creche').append(''); + } + + $('#filter_creche').multiselect({enableHTML: true,numberDisplayed:1,nonSelectedText:"Crèche Courrant",allSelectedText: 'Tous',nSelectedText: ' selections'}); + if (pconfig.filtercreche) { + $('#filter_creche').multiselect('select',pconfig.filtercreche); + }else { + var xar = []; + xar.push(defaultcreche); + $('#filter_creche').multiselect('select',xar); + pconfig.filtercreche = xar; + } + apppref.setpreference("pageconfig.calvacancy",pconfig); +} + +function onselcreche(){ + pconfig.filtercreche = $('#filter_creche').val(); + apppref.setpreference("pageconfig.calvacancy",pconfig); + load_calendar_data(); +} + +function getoph() { + var ophsql = "select dd.daydate,max(wh.datestart) as baseopendate, "+ + "case when strftime('%w',daydate) = '1' then montimeopen "+ + "when strftime('%w',daydate) = '2' then tuetimeopen "+ + "when strftime('%w',daydate) = '3' then wedtimeopen "+ + "when strftime('%w',daydate) = '4' then thutimeopen "+ + "when strftime('%w',daydate) = '5' then fritimeopen else null end as begintime, "+ + "case when strftime('%w',daydate) = '1' then montimeclose "+ + "when strftime('%w',daydate) = '2' then tuetimeclose "+ + "when strftime('%w',daydate) = '3' then wedtimeclose "+ + "when strftime('%w',daydate) = '4' then thutimeclose "+ + "when strftime('%w',daydate) = '5' then fritimeclose else null end as endtime "+ + "from workinghours wh left join ("; + ophsql += drsql + + ") dd on (dd.daydate > wh.datestart) group by dd.daydate order by dd.daydate"; + //dump("\n\n\nOPHSQL: " + ophsql + "\n\n\n"); + var ophdata = appdb.dbquery(ophsql); + ophdata = ophdata.sqldata; + return ophdata; + } + + function getdaterangesql(){ + var adays = []; + var bdate = new Date(initdate.getFullYear(), initdate.getMonth(), initdate.getDate()); + var bend = new Date(initdate.getFullYear(), initdate.getMonth() + 1, 0); + for (var cdt = bdate; cdt <= bend; cdt.setDate(cdt.getDate() + 1)) { + if ((cdt.getDay() != 0) && (cdt.getDay() != 6)){ + adays.push("select date('" + cdt.toLocaleFormat('%Y-%m-%d') + "') as daydate"); + } + + } + return adays.join(" UNION "); + } + + function get_vacancydays(){ + var bdate = new Date(initdate.getFullYear(), initdate.getMonth(), initdate.getDate()); + var bend = new Date(initdate.getFullYear(), initdate.getMonth() + 1, 0); + var sql = "select dd.daydate,strftime('%d',dd.daydate) as strday,type from ( "+ + "select vacancydate, "+ + "case when vacancydateto is null then vacancydate else vacancydateto end as vacancydateto, "+ + "case when vacancydateto is null then 'vacancy' else 'holiday' end as type, "+ + "vacancydescription from vacancy where (vacancydate between '"+bdate.toLocaleFormat("%Y-%m-%d")+"' and '"+bend.toLocaleFormat("%Y-%m-%d")+"' and (vacancydateto >= '"+bdate.toLocaleFormat("%Y-%m-%d")+"' or vacancydateto is null)) or (vacancydateto between '"+bdate.toLocaleFormat("%Y-%m-%d")+"' and '"+bend.toLocaleFormat("%Y-%m-%d")+"' and vacancydate < '"+bdate.toLocaleFormat("%Y-%m-%d")+"') or ((vacancydate <= '"+bdate.toLocaleFormat("%Y-%m-%d")+"') and (vacancydateto >= '"+bend.toLocaleFormat("%Y-%m-%d")+"')) order by vacancydate,vacancydateto) vc "+ + "join ( "+ drsql +") dd "+ + "on (dd.daydate between vc.vacancydate and vc.vacancydateto) group by dd.daydate order by daydate;"; + var hdata = appdb.dbquery(sql); + hdata = hdata.sqldata; + var hs = {}; + for (var h in hdata){ + hs[hdata[h].strday] = hdata[h].type; + } + return hs; + } + + function getstaffvacancy() { + var bdate = new Date(initdate.getFullYear(), initdate.getMonth(), initdate.getDate()); + var bend = new Date(initdate.getFullYear(), initdate.getMonth() + 1, 0); + var vacsql = "select uuid,dd.daydate as daydate,staffuuid, timefrom,timeto,type from ( "+ + "select uuid,staffuuid, "+ + "case when datefrom < '"+bdate.toLocaleFormat("%Y-%m-%d")+"' then '"+bdate.toLocaleFormat("%Y-%m-%d")+"' else datefrom end as datefrom, "+ + "case when dateto > '"+bend.toLocaleFormat("%Y-%m-%d")+"' then '"+bend.toLocaleFormat("%Y-%m-%d")+"' else dateto end as dateto, "+ + "timefrom,timeto, type "+ + "from vacancycalendar where (datefrom is null or datefrom <= '"+bend.toLocaleFormat("%Y-%m-%d")+"') and (dateto is null or dateto >= '"+bdate.toLocaleFormat("%Y-%m-%d")+"')) vc "+ + "join ("+drsql+") dd "+ + "on (dd.daydate between vc.datefrom and vc.dateto); "; + + //dump("\n\n\nSVSQL: " + vacsql + "\n\n\n"); + var vacdata = appdb.dbquery(vacsql); + vacdata = vacdata.sqldata; + return vacdata; + } + + \ No newline at end of file diff --git a/app_v3satdemo/chrome/content/modules/calendar/js/calvacancy_free.js b/app_v3satdemo/chrome/content/modules/calendar/js/calvacancy_free.js new file mode 100644 index 0000000..2741b38 --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/calendar/js/calvacancy_free.js @@ -0,0 +1,471 @@ +//Source-code licensed under EUPL v1.1 ( Copyright 2016 By DKS s.à r.l. - Kilian Saffran - Luxembourg ) + +var pconfig = {}; +//var cdate = null; +var initdate = new Date(); +initdate.setDate(1); +var lastmonthday = null; +var firstmonday = null; +var lastsunday = null; +var winh = window.innerHeight - 140; +var tblcal = null; +var lblfreq = {daily:'jour(s)',weekly:'semaine(s)',monthly:'mois'}; +var amonth = ['', 'Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Aôut', 'Septembre',,'Octobre', 'Novembre', 'Décembre']; +var linkpos = {}; +var posday = {}; +var delac = null; +var curfreq ={}; +var redate = /\d\d.\d\d.\d\d\d\d/; +var curdatediff = null; +var accdb = null; +var drsql = ""; +var defaultcreche = null; +//var curcreche=null; +//var lictype = apppref.getpreference("support.lictype"); + +function initdata() { + load_helpers(); + + var configdata = apppref.getpreference("pageconfig.calvacancy"); + if (!configdata) { + apppref.setpreference("pageconfig.calvacancy", ''); + } + if (configdata != '') { + pconfig = JSON.parse(configdata); + } + if (!pconfig.printlayout) { + pconfig.printlayout = 'calendar'; + apppref.setpreference("pageconfig.calvacancy",pconfig); + } + curcfg.loadconfig(apppref.getpreference("support.database.currentdb.num")); +// if (!pconfig.filtercreche){ +// pconfig.filtercreche = apppref.getpreference("support.database.currentdb.num"); +// } + //if (lictype == "free"){ + // $("#divfilterstaff").hide(); + //} + if (pconfig.calmonth) { + + initdate = new Date(encodeparam(pconfig.calmonth, 'month').replace(/'/g, '')); + $("#calmonth").val(pconfig.calmonth); + } else { + $("#calmonth").val(initdate.toLocaleFormat('%m.%Y')); + pconfig.calmonth = initdate.toLocaleFormat('%m.%Y'); + } + +// load_staff_selection('filter_staff'); +// load_staff_selection('staffuuid',{maxHeight: 300}); + //load_creche_selection(); + set_infoheader(amonth[parseInt(pconfig.calmonth.substring(0,3))] + " " + pconfig.calmonth.substring(3,8)); + load_calendar_month(); + $('#calmonth').on('dp.hide',function(e){ + set_calmonth(); + }); + + +} + + + +function load_calendar_month() { + + firstmonday = new Date(initdate.getFullYear(), initdate.getMonth(), -1 * parseInt(initdate.toLocaleFormat('%w')) + 2); + if (firstmonday > initdate) { + firstmonday = new Date(initdate.getFullYear(), initdate.getMonth(),firstmonday.getDate()-7); + } + + lastmonthday = new Date(initdate.getFullYear(), initdate.getMonth() + 1, 0); + + lastsunday = new Date(lastmonthday.getFullYear(), lastmonthday.getMonth(), lastmonthday.getDate() + 7 - parseInt(lastmonthday.toLocaleFormat('%w'))); + + var weeknum = 0; + var cmonth = initdate.getMonth(); + var sday = new Array(); + for (var cdate = firstmonday; cdate <= lastsunday; cdate.setDate(cdate.getDate() + 1)) { + dayident = "day" + weeknum + cdate.toLocaleFormat('%w'); + + linkpos[cdate.toLocaleFormat('%Y-%m-%d')] = "day" + weeknum + cdate.toLocaleFormat('%w'); + posday["day" + weeknum + cdate.toLocaleFormat('%w')] = cdate.toLocaleFormat('%Y-%m-%d'); + $("#" + dayident + " > div.panel-day > div.panel-dayhead").html(cdate.toLocaleFormat('%d')); + + if (cdate.getMonth() == cmonth) { + $("#" + dayident + " > div.panel-day > div.panel-dayhead").addClass("panel-dayheadcurrent"); + } else { + $("#" + dayident).addClass("panel-dayother"); + + } + if (cdate.toLocaleFormat('%w') == "0") { + weeknum++; + } + + } + + firstmonday = new Date(initdate.getFullYear(), initdate.getMonth(), -1 * parseInt(initdate.toLocaleFormat('%w')) + 2); + + if (firstmonday > initdate) { + firstmonday = new Date(initdate.getFullYear(), initdate.getMonth(),firstmonday.getDate()-7); + } + //load_vacancy_data(); + load_calendar_data(); + +} + +function load_calendar_data() { + var where = ""; + + var sql = getmonthlysql(new Date(initdate.toLocaleFormat("%Y-%m-%d")),new Date(lastmonthday.toLocaleFormat("%Y-%m-%d")),where); + + $("#tbl_timetable").html(""); + + + // set timetable header + drsql = getdaterangesql(); + var ophdata = getoph(); + + var thead = []; + var weekrange = {}; + var ltd = ""; + for (var t in ophdata){ + var dx = new Date(ophdata[t].daydate); + if (!weekrange[parseInt(dx.toLocaleFormat('%W'))]) { + weekrange[parseInt(dx.toLocaleFormat('%W'))] = 1; + }else if (ltd != ophdata[t].daydate) { + weekrange[parseInt(dx.toLocaleFormat('%W'))] += 1; + } + var head = ophdata[t].daydate.substring(8,10); + if (thead.indexOf(head) == -1) { + thead.push(head); + + } + + ltd = ophdata[t].daydate; + + } + var cspan = 0; + var hdays = get_vacancydays(); + var strhead = 'Semaine'; + for (var w in weekrange){ + strhead += '' + w + ''; + cspan += weekrange[w]; + } + strhead += ' '; + for (var th in thead){ + var sty=""; + if (hdays[thead[th]]) { + sty =' style="background-color: '+((hdays[thead[th]]=='vacancy')?'#FF7145':'#FF9C2A')+' !important;" '; + } + strhead += ''+ thead[th]+''; + } + + strhead += ''; + $('#tbl_timetable').append(strhead); + $('#tbl_timetable').append(''); + //dump(JSON.stringify(accdb) + "\n"); +// if (pconfig.filtercreche){ +// //dump(JSON.stringify(pconfig.filtercreche) + "\n"); +// for (var c in pconfig.filtercreche){ +// //dump(c + "\n"); +// var xnum = pconfig.filtercreche[c]; + var crspan = thead.length + 1; +// curcreche = curcfg; + var crhead = '' + curcfg.name +''; + $('#tbl_timetable').append(crhead); +// appdb.closeConnection(); +// appdb.setdbFile(curcreche.path.local + system.sep() + curcfg.uuid + ".sqlite"); +// appdb.openDatabase(); + setcrechevacancydata(thead,hdays); +// } +// } + $('#tbl_timetable').append(''); +} + +function setcrechevacancydata(thead,hdays){ + var vacdata = getstaffvacancy(); + + var staffsql = "SELECT uuid,prename || ' ' || substr(surname,1,2) as fullname,color from staff where entrydate <= date('"+initdate.toLocaleFormat('%Y-%m-%d')+"','+1 month','-1 day') and (exitdate is null or exitdate >= date('"+initdate.toLocaleFormat('%Y-%m-%d')+"'));"; + //dump("SSQL:" + staffsql + "\n"); + var staffnames = appdb.dbquery(staffsql); + staffnames = staffnames.sqldata; + var stxcolor = {}; + //dump(JSON.stringify(staffnames)); + for (var stu in staffnames){ + //dump(JSON.stringify(staffnames[stu]) + "\n"); + stxcolor[staffnames[stu].uuid] = staffnames[stu].color; + var row = ''+ staffnames[stu].fullname+'.'; + + for (var d in thead){ + if ((hdays[thead[d]]) && (hdays[thead[d]] == 'vacancy')){ + row += ''; + }else { + row += ''; + } + + } + row += ''; + $('#tbl_timetable').append(row); + } + if (vacdata.length > 0){ + for (var vc in vacdata){ + //dump(JSON.stringify(vacdata[vc]) + "\n"); + var da = vacdata[vc].daydate.substring(8,10); + var hh = ""; + if (vacdata[vc].timefrom==vacdata[vc].timeto) { + hh="8h"; + }else { + hh=parseInt(vacdata[vc].timeto.substring(1,2))-parseInt(vacdata[vc].timefrom.substring(1,2)) + "h"; + } + + $('#tblcon_' + vacdata[vc].staffuuid + '_' + da + "").append(''); + } + + } + +} + + + +function getmonthlysql(datefrom2,dateto2,where) { + var sqlret = "SELECT vc.uuid, vc.datefrom,strftime('%Y%m%d',vc.datefrom) as strdatefrom,' ' || strftime('%Y%m%d',vc.datefrom) || strftime('%Y%m%d',vc.dateto) || '' || strftime('%d.%m.%Y',vc.datefrom) || ' - ' || strftime('%d.%m.%Y',vc.dateto) as tbldaterange, vc.dateto,strftime('%Y%m%d',vc.dateto) as strdateto, "+ +"case when vc.timefrom=vc.timeto then '8h' else (cast(substr(vc.timeto,1,2) as int) - cast(substr(vc.timefrom,1,2) as int)) || 'h' end as hours , " + +"vc.description, vc.staffuuid,coalesce(st.surname,'') || ' ' || coalesce(st.prename,'') as staffname,vc.type,st.color FROM vacancycalendar vc left join staff st on (vc.staffuuid=st.uuid) " + + "LEFT JOIN ( SELECT * FROM ( "; + var sqldays = new Array(); + + for (var cdate2=datefrom2;cdate2<=dateto2;cdate2.setDate(cdate2.getDate() +1)){ + if ((cdate2.getDay() != 0) && (cdate2.getDay() != 6)){ + sqldays.push ("SELECT date('" + cdate2.toLocaleFormat('%Y-%m-%d') +"') as daydate"); + } + } + + sqlret += sqldays.join(' UNION ALL ') + " )) oph " + + "ON (oph.daydate BETWEEN vc.datefrom AND vc.dateto) " + + "WHERE oph.daydate IS NOT NULL and strftime('%w',oph.daydate) not in ('6','0') " + + "AND oph.daydate NOT IN ( SELECT vacancydate FROM vacancy WHERE vacancydateto IS NULL AND vacancydate BETWEEN '"+initdate.toLocaleFormat("%Y-%m-%d") + "' AND '" + dateto2.toLocaleFormat("%Y-%m-%d")+"') " + + ((where != '')?" AND " + where + " ":"") + + " GROUP BY vc.uuid ORDER BY st.uuid,vc.datefrom, vc.dateto; "; + return sqlret; +} + + +function set_calmonth() { + pconfig.calmonth = $('#calmonth').val(); + apppref.setpreference("pageconfig.calvacancy", pconfig); + globelreq.send_request({ + page: 'calvacancy_free', + module: 'calendar', + header: 'Congés' + }, null); +} + +function onnextmonth() { + var tmpmonth = new Date(encodeparam(pconfig.calmonth, 'month').replace(/'/g,'')); + var nmonth = new Date(tmpmonth.getFullYear(), tmpmonth.getMonth() + 1, tmpmonth.getDate()); + pconfig.calmonth = nmonth.toLocaleFormat('%m.%Y'); + apppref.setpreference("pageconfig.calvacancy", pconfig); + globelreq.send_request({ + page: 'calvacancy_free', + module: 'calendar', + header: 'Congés' + }, null); +} + +function onpreviousmonth() { + var tmpmonth = new Date(encodeparam(pconfig.calmonth, 'month').replace(/'/g,'')); + var nmonth = new Date(tmpmonth.getFullYear(), tmpmonth.getMonth() - 1, tmpmonth.getDate()); + pconfig.calmonth = nmonth.toLocaleFormat('%m.%Y'); + apppref.setpreference("pageconfig.calvacancy", pconfig); + globelreq.send_request({ + page: 'calvacancy_free', + module: 'calendar', + header: 'Congés' + }, null); +} + +function dlg_sel_creche(){ + $('#select_creche').modal('show'); +} + +function set_creche(){ + $('#select_creche').modal('hide'); + dlg_vacancy($('#sel_creche :selected').val(),null, 'ins') +} + +function dlg_vacancy(xnum,uuid, type) { + if (!xnum){ + return false; + } + curcreche = accdb[xnum]; + + appdb.closeConnection(); + appdb.setdbFile(curcreche.path.local + system.sep() + curcreche.uuid + ".sqlite"); + appdb.openDatabase(); + + load_staff_selection('staffuuid',{maxHeight: 300}); + //dump("TYPE " + type +" CUUID:" + uuid +"\n"); +if (type == 'ins') { + + //load staffdata + $('#frmeditvacancy #staffuuid').multiselect('select',[]); + $('#btndeletevacancy').hide(); + }else { + $('#btndeletevacancy').show(); + } + + var evdata = { + uuid: '0', + description: '', + datefrom:new Date().toLocaleFormat("%d.%m.%Y"), + dateto:new Date().toLocaleFormat("%d.%m.%Y"), + staffuuid:'', + timefrom: '00:00', + hours: '1', + type:'0', + dailyduration:'1.0' + }; + + if (type == 'upd') { + var evsql = "SELECT uuid, strftime(\"%d.%m.%Y\",datefrom) as datefrom, strftime(\"%d.%m.%Y\",dateto) as dateto, timefrom, description, staffuuid,type, case when timefrom!=timeto then '0.' || (cast(substr(timeto,1,2) as int) - cast(substr(timefrom,1,2) as int)) else 1.0 end as dailyduration,null as hours FROM vacancycalendar where uuid='" + uuid + "';"; + //dump("UPDSQL:" +evsql + "\n"); + evdata = appdb.dbquery(evsql); + evdata = evdata.sqldata[0]; + if (evdata.dailyduration == '1') { + evdata.dailyduration = '1.0'; + evdata.hours = '8'; + }else { + evdata.hours = evdata.dailyduration.substring(2,3); + if (evdata.dailyduration != '0.4') { + evdata.dailyduration = '0.'; + } + } + $('#frmeditvacancy #staffuuid').multiselect('select',[evdata.staffuuid]); + } + + for (var w in evdata) { + if ($("#frmeditvacancy #" + w)) { + $("#frmeditvacancy #" + w).val(evdata[w]); + } + } + curdatediff=daysBetween(new Date(encodeparam($('#frmeditvacancy #datefrom').val(),'date').replace(/'/g,'')),new Date(encodeparam($('#frmeditvacancy #dateto').val(),'date').replace(/'/g,''))); + setdailydurationfields(); + $("#edit_vacancy").modal('show'); +} + + + + + + +function invertColor(hexTripletColor) { + var color = hexTripletColor; + color = color.substring(1); // remove # + color = parseInt(color, 16); // convert to integer + color = 0xFFFFFF ^ color; // invert three bytes + color = color.toString(16); // convert to hex + color = ("000000" + color).slice(-6); // pad with leading zeros + color = "#" + color; // prepend # + return color; +} + + +//function load_creche_selection(){ +// accdb = appdb.getaccessibledatabases(); +// +// for (var i in accdb){ +// //dump("DBcfg: " +JSON.stringify(i) + "\n"); +// if (appdb.dbFile == accdb[i].path.local){ +// defaultcreche = accdb[i].dbnum; +// } +// $('#filter_creche').append(''); +// $('#sel_creche').append(''); +// } +// +// $('#filter_creche').multiselect({enableHTML: true,numberDisplayed:1,nonSelectedText:"Crèche Courrant",allSelectedText: 'Tous',nSelectedText: ' selections'}); +// if (pconfig.filtercreche) { +// $('#filter_creche').multiselect('select',pconfig.filtercreche); +// }else { +// var xar = []; +// xar.push(defaultcreche); +// $('#filter_creche').multiselect('select',xar); +// pconfig.filtercreche = xar; +// } +// apppref.setpreference("pageconfig.calvacancy",pconfig); +//} + +//function onselcreche(){ +// pconfig.filtercreche = $('#filter_creche').val(); +// apppref.setpreference("pageconfig.calvacancy",pconfig); +// load_calendar_data(); +//} + +function getoph() { + var ophsql = "select dd.daydate,max(wh.datestart) as baseopendate, "+ + "case when strftime('%w',daydate) = '1' then montimeopen "+ + "when strftime('%w',daydate) = '2' then tuetimeopen "+ + "when strftime('%w',daydate) = '3' then wedtimeopen "+ + "when strftime('%w',daydate) = '4' then thutimeopen "+ + "when strftime('%w',daydate) = '5' then fritimeopen else null end as begintime, "+ + "case when strftime('%w',daydate) = '1' then montimeclose "+ + "when strftime('%w',daydate) = '2' then tuetimeclose "+ + "when strftime('%w',daydate) = '3' then wedtimeclose "+ + "when strftime('%w',daydate) = '4' then thutimeclose "+ + "when strftime('%w',daydate) = '5' then fritimeclose else null end as endtime "+ + "from workinghours wh left join ("; + ophsql += drsql + + ") dd on (dd.daydate > wh.datestart) group by dd.daydate order by dd.daydate"; + //dump("\n\n\nOPHSQL: " + ophsql + "\n\n\n"); + var ophdata = appdb.dbquery(ophsql); + ophdata = ophdata.sqldata; + return ophdata; + } + + function getdaterangesql(){ + var adays = []; + var bdate = new Date(initdate.getFullYear(), initdate.getMonth(), initdate.getDate()); + var bend = new Date(initdate.getFullYear(), initdate.getMonth() + 1, 0); + for (var cdt = bdate; cdt <= bend; cdt.setDate(cdt.getDate() + 1)) { + if ((cdt.getDay() != 0) && (cdt.getDay() != 6)){ + adays.push("select date('" + cdt.toLocaleFormat('%Y-%m-%d') + "') as daydate"); + } + + } + return adays.join(" UNION "); + } + + function get_vacancydays(){ + var bdate = new Date(initdate.getFullYear(), initdate.getMonth(), initdate.getDate()); + var bend = new Date(initdate.getFullYear(), initdate.getMonth() + 1, 0); + var sql = "select dd.daydate,strftime('%d',dd.daydate) as strday,type from ( "+ + "select vacancydate, "+ + "case when vacancydateto is null then vacancydate else vacancydateto end as vacancydateto, "+ + "case when vacancydateto is null then 'vacancy' else 'holiday' end as type, "+ + "vacancydescription from vacancy where (vacancydate between '"+bdate.toLocaleFormat("%Y-%m-%d")+"' and '"+bend.toLocaleFormat("%Y-%m-%d")+"' and (vacancydateto >= '"+bdate.toLocaleFormat("%Y-%m-%d")+"' or vacancydateto is null)) or (vacancydateto between '"+bdate.toLocaleFormat("%Y-%m-%d")+"' and '"+bend.toLocaleFormat("%Y-%m-%d")+"' and vacancydate < '"+bdate.toLocaleFormat("%Y-%m-%d")+"') or ((vacancydate <= '"+bdate.toLocaleFormat("%Y-%m-%d")+"') and (vacancydateto >= '"+bend.toLocaleFormat("%Y-%m-%d")+"')) order by vacancydate,vacancydateto) vc "+ + "join ( "+ drsql +") dd "+ + "on (dd.daydate between vc.vacancydate and vc.vacancydateto) group by dd.daydate order by daydate;"; + var hdata = appdb.dbquery(sql); + hdata = hdata.sqldata; + var hs = {}; + for (var h in hdata){ + hs[hdata[h].strday] = hdata[h].type; + } + return hs; + } + + function getstaffvacancy() { + var bdate = new Date(initdate.getFullYear(), initdate.getMonth(), initdate.getDate()); + var bend = new Date(initdate.getFullYear(), initdate.getMonth() + 1, 0); + var vacsql = "select uuid,dd.daydate as daydate,staffuuid, timefrom,timeto,type from ( "+ + "select uuid,staffuuid, "+ + "case when datefrom < '"+bdate.toLocaleFormat("%Y-%m-%d")+"' then '"+bdate.toLocaleFormat("%Y-%m-%d")+"' else datefrom end as datefrom, "+ + "case when dateto > '"+bend.toLocaleFormat("%Y-%m-%d")+"' then '"+bend.toLocaleFormat("%Y-%m-%d")+"' else dateto end as dateto, "+ + "timefrom,timeto, type "+ + "from vacancycalendar where (datefrom is null or datefrom <= '"+bend.toLocaleFormat("%Y-%m-%d")+"') and (dateto is null or dateto >= '"+bdate.toLocaleFormat("%Y-%m-%d")+"')) vc "+ + "join ("+drsql+") dd "+ + "on (dd.daydate between vc.datefrom and vc.dateto); "; + + //dump("\n\n\nSVSQL: " + vacsql + "\n\n\n"); + var vacdata = appdb.dbquery(vacsql); + vacdata = vacdata.sqldata; + return vacdata; + } + + \ No newline at end of file diff --git a/app_v3satdemo/chrome/content/modules/calendar/js/nlp.js b/app_v3satdemo/chrome/content/modules/calendar/js/nlp.js new file mode 100644 index 0000000..ec37367 --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/calendar/js/nlp.js @@ -0,0 +1,1042 @@ +/*! + * rrule.js - Library for working with recurrence rules for calendar dates. + * https://github.com/jkbrzt/rrule + * + * Copyright 2010, Jakub Roztocil and Lars Schoning + * Licenced under the BSD licence. + * https://github.com/jkbrzt/rrule/blob/master/LICENCE + * + */ + +/** + * + * Implementation of RRule.fromText() and RRule::toText(). + * + * + * On the client side, this file needs to be included + * when those functions are used. + * + */ +/* global module, define */ + +;(function (root, factory) { + if (typeof module === 'object' && module.exports) { + module.exports = factory() + } else if (typeof define === 'function' && define.amd) { + define([], factory) + } else { + root._getRRuleNLP = factory() + } +}(typeof window === 'object' ? window : this, function () { + // ============================================================================= + // Helper functions + // ============================================================================= + + /** + * Return true if a value is in an array + */ + var contains = function (arr, val) { + return arr.indexOf(val) !== -1 + } + + return function (RRule) { + // ============================================================================= + // ToText + // ============================================================================= + + /** + * + * @param {RRule} rrule + * Optional: + * @param {Function} gettext function + * @param {Object} language definition + * @constructor + */ + var ToText = function (rrule, gettext, language) { + this.text = '' + this.language = language || FRENCH + this.gettext = gettext || function (id) { + return id + } + + this.rrule = rrule + this.freq = rrule.options.freq + this.options = rrule.options + this.origOptions = rrule.origOptions + + if (this.origOptions.bymonthday) { + var bymonthday = [].concat(this.options.bymonthday) + var bynmonthday = [].concat(this.options.bynmonthday) + + bymonthday.sort() + bynmonthday.sort() + bynmonthday.reverse() + // 1, 2, 3, .., -5, -4, -3, .. + this.bymonthday = bymonthday.concat(bynmonthday) + if (!this.bymonthday.length) this.bymonthday = null + } + + if (this.origOptions.byweekday) { + var byweekday = !(this.origOptions.byweekday instanceof Array) + ? [this.origOptions.byweekday] : this.origOptions.byweekday + var days = String(byweekday) + + this.byweekday = { + allWeeks: byweekday.filter(function (weekday) { + return !Boolean(weekday.n) + }), + someWeeks: byweekday.filter(function (weekday) { + return Boolean(weekday.n) + }), + isWeekdays: ( + days.indexOf('MO') !== -1 && + days.indexOf('TU') !== -1 && + days.indexOf('WE') !== -1 && + days.indexOf('TH') !== -1 && + days.indexOf('FR') !== -1 && + days.indexOf('SA') === -1 && + days.indexOf('SU') === -1 + ) + } + + var sortWeekDays = function (a, b) { + return a.weekday - b.weekday + } + + this.byweekday.allWeeks.sort(sortWeekDays) + this.byweekday.someWeeks.sort(sortWeekDays) + + if (!this.byweekday.allWeeks.length) this.byweekday.allWeeks = null + if (!this.byweekday.someWeeks.length) this.byweekday.someWeeks = null + } else { + this.byweekday = null + } + } + + var common = [ + 'count', 'until', 'interval', + 'byweekday', 'bymonthday', 'bymonth' + ] + ToText.IMPLEMENTED = [] + ToText.IMPLEMENTED[RRule.HOURLY] = common + ToText.IMPLEMENTED[RRule.DAILY] = ['byhour'].concat(common) + ToText.IMPLEMENTED[RRule.WEEKLY] = common + ToText.IMPLEMENTED[RRule.MONTHLY] = common + ToText.IMPLEMENTED[RRule.YEARLY] = ['byweekno', 'byyearday'].concat(common) + + /** + * Test whether the rrule can be fully converted to text. + * @param {RRule} rrule + * @return {Boolean} + */ + ToText.isFullyConvertible = function (rrule) { + var canConvert = true + + if (!(rrule.options.freq in ToText.IMPLEMENTED)) return false + if (rrule.origOptions.until && rrule.origOptions.count) return false + + for (var key in rrule.origOptions) { + if (contains(['dtstart', 'wkst', 'freq'], key)) return true + if (!contains(ToText.IMPLEMENTED[rrule.options.freq], key)) return false + } + + return canConvert + } + + ToText.prototype = { + constructor: ToText, + + isFullyConvertible: function () { + return ToText.isFullyConvertible(this.rrule) + }, + + /** + * Perform the conversion. Only some of the frequencies are supported. + * If some of the rrule's options aren't supported, they'll + * be omitted from the output an "(~ approximate)" will be appended. + * @return {*} + */ + toString: function () { + var gettext = this.gettext + + if (!(this.options.freq in ToText.IMPLEMENTED)) { + return gettext('RRule error: Unable to fully convert this rrule to text') + } + + this.text = [gettext('tous les')] + this[RRule.FREQUENCIES[this.options.freq]]() + + if (this.options.until) { + this.add(gettext('jusqu\'au')) + var until = this.options.until + this.add(until.getDate() + ' ').add(this.language.monthNames[until.getMonth()]).add(until.getFullYear()) + } else if (this.options.count) { + this.add(gettext('pour')) + .add(this.options.count) + .add(this.plural(this.options.count) + ? gettext('fois') : gettext('fois')) + } + + if (!this.isFullyConvertible()) this.add(gettext('(~ à-peu-près)')) + + return this.text.join('') + }, + + HOURLY: function () { + var gettext = this.gettext + + if (this.options.interval !== 1) this.add(this.options.interval) + + this.add(this.plural(this.options.interval) + ? gettext('heures') : gettext('heure')) + }, + + DAILY: function () { + var gettext = this.gettext + + if (this.options.interval !== 1) this.add(this.options.interval) + + if (this.byweekday && this.byweekday.isWeekdays) { + this.add(this.plural(this.options.interval) + ? gettext('jours ouvrables') : gettext('jour ouvrable')) + } else { + this.add(this.plural(this.options.interval) + ? gettext('jours') : gettext('jour')) + } + + if (this.origOptions.bymonth) { + this.add(gettext('dans')) + this._bymonth() + } + + if (this.bymonthday) { + this._bymonthday() + } else if (this.byweekday) { + this._byweekday() + } else if (this.origOptions.byhour) { + this._byhour() + } + }, + + WEEKLY: function () { + var gettext = this.gettext + + if (this.options.interval !== 1) { + this.add(this.options.interval) + .add(this.plural(this.options.interval) + ? gettext('semaines') : gettext('semaine')) + } + + if (this.byweekday && this.byweekday.isWeekdays) { + if (this.options.interval === 1) { + this.add(this.plural(this.options.interval) + ? gettext('jours ouvrables') : gettext('jour ouvrable')) + } else { + this.add(gettext('au')).add(gettext('jours ouvrables')) + } + } else { + if (this.options.interval === 1) this.add(gettext('semaine')) + + if (this.origOptions.bymonth) { + this.add(gettext('dans')) + this._bymonth() + } + + if (this.bymonthday) { + this._bymonthday() + } else if (this.byweekday) { + this._byweekday() + } + } + }, + + MONTHLY: function () { + var gettext = this.gettext + + if (this.origOptions.bymonth) { + if (this.options.interval !== 1) { + this.add(this.options.interval).add(gettext('mois')) + if (this.plural(this.options.interval)) this.add(gettext('dans')) + } else { + // this.add(gettext('MONTH')) + } + this._bymonth() + } else { + if (this.options.interval !== 1) this.add(this.options.interval) + this.add(this.plural(this.options.interval) + ? gettext('mois') : gettext('mois')) + } + if (this.bymonthday) { + this._bymonthday() + } else if (this.byweekday && this.byweekday.isWeekdays) { + this.add(gettext('au')).add(gettext('jours ouvrables')) + } else if (this.byweekday) { + this._byweekday() + } + }, + + YEARLY: function () { + var gettext = this.gettext + + if (this.origOptions.bymonth) { + if (this.options.interval !== 1) { + this.add(this.options.interval) + this.add(gettext('ans')) + } else { + // this.add(gettext('YEAR')) + } + this._bymonth() + } else { + if (this.options.interval !== 1) this.add(this.options.interval) + this.add(this.plural(this.options.interval) + ? gettext('ans') : gettext('an')) + } + + if (this.bymonthday) { + this._bymonthday() + } else if (this.byweekday) { + this._byweekday() + } + + if (this.options.byyearday) { + this.add(gettext('au')) + .add(this.list(this.options.byyearday, this.nth, gettext('et'))) + .add(gettext('jour')) + } + + if (this.options.byweekno) { + this.add(gettext('dans')) + .add(this.plural(this.options.byweekno.length) ? gettext('semaines') : gettext('semaine')) + .add(this.list(this.options.byweekno, null, gettext('et'))) + } + }, + + _bymonthday: function () { + var gettext = this.gettext + if (this.byweekday && this.byweekday.allWeeks) { + this.add(gettext('au')) + .add(this.list(this.byweekday.allWeeks, this.weekdaytext, gettext('ou'))) + .add(gettext('le')) + .add(this.list(this.bymonthday, this.nth, gettext('ou'))) + } else { + this.add(gettext('au')) + .add(this.list(this.bymonthday, this.nth, gettext('et'))) + } + // this.add(gettext('DAY')) + }, + + _byweekday: function () { + var gettext = this.gettext + if (this.byweekday.allWeeks && !this.byweekday.isWeekdays) { + this.add(gettext('au')) + .add(this.list(this.byweekday.allWeeks, this.weekdaytext)) + } + + if (this.byweekday.someWeeks) { + if (this.byweekday.allWeeks) this.add(gettext('et')) + + this.add(gettext('au')) + .add(this.list(this.byweekday.someWeeks, this.weekdaytext, gettext('et'))) + } + }, + + _byhour: function () { + var gettext = this.gettext + + this.add(gettext('à')) + .add(this.list(this.origOptions.byhour, null, gettext('et'))) + }, + + _bymonth: function () { + this.add(this.list(this.options.bymonth, this.monthtext, this.gettext('et'))) + }, + + nth: function (n) { + var nth, npos + var gettext = this.gettext + + if (n === -1) return gettext('dernier') + + npos = Math.abs(n) + switch (npos) { + case 1: + case 21: + case 31: + nth = npos + gettext('ier') + break + case 2: + case 22: + nth = npos + gettext('ième') + break + case 3: + case 23: + nth = npos + gettext('ième') + break + default: + nth = npos + gettext('ième') + } + + return n < 0 ? nth + ' ' + gettext('dernier') : nth + }, + + monthtext: function (m) { + return this.language.monthNames[m - 1] + }, + + weekdaytext: function (wday) { + var weekday = typeof wday === 'number' ? wday : wday.getJsWeekday() + return (wday.n ? this.nth(wday.n) + ' ' : '') + + this.language.dayNames[weekday] + }, + + plural: function (n) { + return n % 100 !== 1 + }, + + add: function (s) { + this.text.push(' ') + this.text.push(s) + return this + }, + + list: function (arr, callback, finalDelim, delim) { + var delimJoin = function (array, delimiter, finalDelimiter) { + var list = '' + + for (var i = 0; i < array.length; i++) { + if (i !== 0) { + if (i === array.length - 1) { + list += ' ' + finalDelimiter + ' ' + } else { + list += delimiter + ' ' + } + } + list += array[i] + } + return list + } + + delim = delim || ',' + callback = callback || function (o) { + return o + } + var self = this + var realCallback = function (arg) { + return callback.call(self, arg) + } + + if (finalDelim) { + return delimJoin(arr.map(realCallback), delim, finalDelim) + } else { + return arr.map(realCallback).join(delim + ' ') + } + } + } + + // ============================================================================= + // fromText + // ============================================================================= + /** + * Will be able to convert some of the below described rules from + * text format to a rule object. + * + * + * RULES + * + * Every ([n]) + * day(s) + * | [weekday], ..., (and) [weekday] + * | weekday(s) + * | week(s) + * | month(s) + * | [month], ..., (and) [month] + * | year(s) + * + * + * Plus 0, 1, or multiple of these: + * + * on [weekday], ..., (or) [weekday] the [monthday], [monthday], ... (or) [monthday] + * + * on [weekday], ..., (and) [weekday] + * + * on the [monthday], [monthday], ... (and) [monthday] (day of the month) + * + * on the [nth-weekday], ..., (and) [nth-weekday] (of the month/year) + * + * + * Plus 0 or 1 of these: + * + * for [n] time(s) + * + * until [date] + * + * Plus (.) + * + * + * Definitely no supported for parsing: + * + * (for year): + * in week(s) [n], ..., (and) [n] + * + * on the [yearday], ..., (and) [n] day of the year + * on day [yearday], ..., (and) [n] + * + * + * NON-TERMINALS + * + * [n]: 1, 2 ..., one, two, three .. + * [month]: January, February, March, April, May, ... December + * [weekday]: Monday, ... Sunday + * [nth-weekday]: first [weekday], 2nd [weekday], ... last [weekday], ... + * [monthday]: first, 1., 2., 1st, 2nd, second, ... 31st, last day, 2nd last day, .. + * [date]: + * [month] (0-31(,) ([year])), + * (the) 0-31.(1-12.([year])), + * (the) 0-31/(1-12/([year])), + * [weekday] + * + * [year]: 0000, 0001, ... 01, 02, .. + * + * Definitely not supported for parsing: + * + * [yearday]: first, 1., 2., 1st, 2nd, second, ... 366th, last day, 2nd last day, .. + * + * @param {String} text + * @return {Object, Boolean} the rule, or null. + */ + var fromText = function (text, language) { + return new RRule(parseText(text, language)) + } + + var parseText = function (text, language) { + var options = {} + var ttr = new Parser((language || FRENCH).tokens) + + if (!ttr.start(text)) return null + + S() + return options + + function S () { + // every [n] + var n + + ttr.expect('every') + if ((n = ttr.accept('number'))) options.interval = parseInt(n[0], 10) + if (ttr.isDone()) throw new Error('Unexpected end') + + switch (ttr.symbol) { + case 'day(s)': + options.freq = RRule.DAILY + if (ttr.nextSymbol()) { + AT() + F() + } + break + + // FIXME Note: every 2 weekdays != every two weeks on weekdays. + // DAILY on weekdays is not a valid rule + case 'weekday(s)': + options.freq = RRule.WEEKLY + options.byweekday = [ + RRule.MO, + RRule.TU, + RRule.WE, + RRule.TH, + RRule.FR + ] + ttr.nextSymbol() + F() + break + + case 'week(s)': + options.freq = RRule.WEEKLY + if (ttr.nextSymbol()) { + ON() + F() + } + break + + case 'hour(s)': + options.freq = RRule.HOURLY + if (ttr.nextSymbol()) { + ON() + F() + } + break + + case 'month(s)': + options.freq = RRule.MONTHLY + if (ttr.nextSymbol()) { + ON() + F() + } + break + + case 'year(s)': + options.freq = RRule.YEARLY + if (ttr.nextSymbol()) { + ON() + F() + } + break + + case 'monday': + case 'tuesday': + case 'wednesday': + case 'thursday': + case 'friday': + case 'saturday': + case 'sunday': + options.freq = RRule.WEEKLY + options.byweekday = [RRule[ttr.symbol.substr(0, 2).toUpperCase()]] + + if (!ttr.nextSymbol()) return + + // TODO check for duplicates + while (ttr.accept('comma')) { + if (ttr.isDone()) throw new Error('Unexpected end') + + var wkd + if (!(wkd = decodeWKD())) { + throw new Error('Unexpected symbol ' + ttr.symbol + ', expected weekday') + } + + options.byweekday.push(RRule[wkd]) + ttr.nextSymbol() + } + MDAYs() + F() + break + + case 'january': + case 'february': + case 'march': + case 'april': + case 'may': + case 'june': + case 'july': + case 'august': + case 'september': + case 'october': + case 'november': + case 'december': + options.freq = RRule.YEARLY + options.bymonth = [decodeM()] + + if (!ttr.nextSymbol()) return + + // TODO check for duplicates + while (ttr.accept('comma')) { + if (ttr.isDone()) throw new Error('Unexpected end') + + var m + if (!(m = decodeM())) { + throw new Error('Unexpected symbol ' + ttr.symbol + ', expected month') + } + + options.bymonth.push(m) + ttr.nextSymbol() + } + + ON() + F() + break + + default: + throw new Error('Unknown symbol') + + } + } + + function ON () { + var on = ttr.accept('on') + var the = ttr.accept('the') + if (!(on || the)) return + + do { + var nth, wkd, m + + // nth | + if ((nth = decodeNTH())) { + // ttr.nextSymbol() + + if ((wkd = decodeWKD())) { + ttr.nextSymbol() + if (!options.byweekday) options.byweekday = [] + options.byweekday.push(RRule[wkd].nth(nth)) + } else { + if (!options.bymonthday) options.bymonthday = [] + options.bymonthday.push(nth) + ttr.accept('day(s)') + } + // + } else if ((wkd = decodeWKD())) { + ttr.nextSymbol() + if (!options.byweekday) options.byweekday = [] + options.byweekday.push(RRule[wkd]) + } else if (ttr.symbol === 'weekday(s)') { + ttr.nextSymbol() + if (!options.byweekday) options.byweekday = [] + options.byweekday.push(RRule.MO) + options.byweekday.push(RRule.TU) + options.byweekday.push(RRule.WE) + options.byweekday.push(RRule.TH) + options.byweekday.push(RRule.FR) + } else if (ttr.symbol === 'week(s)') { + ttr.nextSymbol() + var n + if (!(n = ttr.accept('number'))) { + throw new Error('Unexpected symbol ' + ttr.symbol + ', expected week number') + } + options.byweekno = [n[0]] + while (ttr.accept('comma')) { + if (!(n = ttr.accept('number'))) { + throw new Error('Unexpected symbol ' + ttr.symbol + '; expected monthday') + } + options.byweekno.push(n[0]) + } + } else if ((m = decodeM())) { + ttr.nextSymbol() + if (!options.bymonth) options.bymonth = [] + options.bymonth.push(m) + } else { + return + } + } while (ttr.accept('comma') || ttr.accept('the') || ttr.accept('on')) + } + + function AT () { + var at = ttr.accept('at') + if (!at) return + + do { + var n + if (!(n = ttr.accept('number'))) { + throw new Error('Unexpected symbol ' + ttr.symbol + ', expected hour') + } + options.byhour = [n[0]] + while (ttr.accept('comma')) { + if (!(n = ttr.accept('number'))) { + throw new Error('Unexpected symbol ' + ttr.symbol + '; expected hour') + } + options.byhour.push(n[0]) + } + } while (ttr.accept('comma') || ttr.accept('at')) + } + + function decodeM () { + switch (ttr.symbol) { + case 'january': + return 1 + case 'february': + return 2 + case 'march': + return 3 + case 'april': + return 4 + case 'may': + return 5 + case 'june': + return 6 + case 'july': + return 7 + case 'august': + return 8 + case 'september': + return 9 + case 'october': + return 10 + case 'november': + return 11 + case 'december': + return 12 + default: + return false + } + } + + function decodeWKD () { + switch (ttr.symbol) { + case 'monday': + case 'tuesday': + case 'wednesday': + case 'thursday': + case 'friday': + case 'saturday': + case 'sunday': + return ttr.symbol.substr(0, 2).toUpperCase() + default: + return false + } + } + + function decodeNTH () { + switch (ttr.symbol) { + case 'last': + ttr.nextSymbol() + return -1 + case 'first': + ttr.nextSymbol() + return 1 + case 'second': + ttr.nextSymbol() + return ttr.accept('last') ? -2 : 2 + case 'third': + ttr.nextSymbol() + return ttr.accept('last') ? -3 : 3 + case 'nth': + var v = parseInt(ttr.value[1], 10) + if (v < -366 || v > 366) throw new Error('Nth out of range: ' + v) + + ttr.nextSymbol() + return ttr.accept('last') ? -v : v + + default: + return false + } + } + + function MDAYs () { + ttr.accept('on') + ttr.accept('the') + + var nth + if (!(nth = decodeNTH())) return + + options.bymonthday = [nth] + ttr.nextSymbol() + + while (ttr.accept('comma')) { + if (!(nth = decodeNTH())) { + throw new Error('Unexpected symbol ' + ttr.symbol + '; expected monthday') + } + + options.bymonthday.push(nth) + ttr.nextSymbol() + } + } + + function F () { + if (ttr.symbol === 'until') { + var date = Date.parse(ttr.text) + + if (!date) throw new Error('Cannot parse until date:' + ttr.text) + options.until = new Date(date) + } else if (ttr.accept('for')) { + options.count = ttr.value[0] + ttr.expect('number') + // ttr.expect('times') + } + } + } + + // ============================================================================= + // Parser + // ============================================================================= + + var Parser = function (rules) { + this.rules = rules + } + + Parser.prototype.start = function (text) { + this.text = text + this.done = false + return this.nextSymbol() + } + + Parser.prototype.isDone = function () { + return this.done && this.symbol == null + } + + Parser.prototype.nextSymbol = function () { + var best, bestSymbol + var p = this + + this.symbol = null + this.value = null + do { + if (this.done) return false + + var match, rule + best = null + for (var name in this.rules) { + rule = this.rules[name] + if ((match = rule.exec(p.text))) { + if (best == null || match[0].length > best[0].length) { + best = match + bestSymbol = name + } + } + } + + if (best != null) { + this.text = this.text.substr(best[0].length) + + if (this.text === '') this.done = true + } + + if (best == null) { + this.done = true + this.symbol = null + this.value = null + return + } + } while (bestSymbol === 'SKIP') + + this.symbol = bestSymbol + this.value = best + return true + } + + Parser.prototype.accept = function (name) { + if (this.symbol === name) { + if (this.value) { + var v = this.value + this.nextSymbol() + return v + } + + this.nextSymbol() + return true + } + + return false + } + + Parser.prototype.expect = function (name) { + if (this.accept(name)) return true + + throw new Error('expected ' + name + ' but found ' + this.symbol) + } + + // ============================================================================= + // i18n + // ============================================================================= + + var ENGLISH = { + dayNames: [ + 'Sunday', 'Monday', 'Tuesday', 'Wednesday', + 'Thursday', 'Friday', 'Saturday' + ], + monthNames: [ + 'January', 'February', 'March', 'April', 'May', + 'June', 'July', 'August', 'September', 'October', + 'November', 'December' + ], + tokens: { + 'SKIP': /^[ \r\n\t]+|^\.$/, + 'number': /^[1-9][0-9]*/, + 'numberAsText': /^(one|two|three)/i, + 'every': /^every/i, + 'day(s)': /^days?/i, + 'weekday(s)': /^weekdays?/i, + 'week(s)': /^weeks?/i, + 'hour(s)': /^hours?/i, + 'month(s)': /^months?/i, + 'year(s)': /^years?/i, + 'on': /^(on|in)/i, + 'at': /^(at)/i, + 'the': /^the/i, + 'first': /^first/i, + 'second': /^second/i, + 'third': /^third/i, + 'nth': /^([1-9][0-9]*)(\.|th|nd|rd|st)/i, + 'last': /^last/i, + 'for': /^for/i, + 'time(s)': /^times?/i, + 'until': /^(un)?til/i, + 'monday': /^mo(n(day)?)?/i, + 'tuesday': /^tu(e(s(day)?)?)?/i, + 'wednesday': /^we(d(n(esday)?)?)?/i, + 'thursday': /^th(u(r(sday)?)?)?/i, + 'friday': /^fr(i(day)?)?/i, + 'saturday': /^sa(t(urday)?)?/i, + 'sunday': /^su(n(day)?)?/i, + 'january': /^jan(uary)?/i, + 'february': /^feb(ruary)?/i, + 'march': /^mar(ch)?/i, + 'april': /^apr(il)?/i, + 'may': /^may/i, + 'june': /^june?/i, + 'july': /^july?/i, + 'august': /^aug(ust)?/i, + 'september': /^sep(t(ember)?)?/i, + 'october': /^oct(ober)?/i, + 'november': /^nov(ember)?/i, + 'december': /^dec(ember)?/i, + 'comma': /^(,\s*|(and|or)\s*)+/i + } + } + + var FRENCH = { + dayNames: [ + 'Dimanche', 'Lundi', 'Mardi', 'Mercredi', + 'Jeudi', 'Vendredi', 'Samedi' + ], + monthNames: [ + 'Janvier', 'Février', 'Mars', 'Avril', 'Mai', + 'Juin', 'Julliet', 'Août', 'Septembre', 'Octobre', + 'Novembre', 'Décembre' + ], + tokens: { + 'SKIP': /^[ \r\n\t]+|^\.$/, + 'number': /^[1-9][0-9]*/, + 'numberAsText': /^(one|two|three)/i, + 'every': /^every/i, + 'day(s)': /^days?/i, + 'weekday(s)': /^weekdays?/i, + 'week(s)': /^weeks?/i, + 'hour(s)': /^hours?/i, + 'month(s)': /^months?/i, + 'year(s)': /^years?/i, + 'on': /^(on|in)/i, + 'at': /^(at)/i, + 'the': /^the/i, + 'first': /^first/i, + 'second': /^second/i, + 'third': /^third/i, + 'nth': /^([1-9][0-9]*)(\.|th|nd|rd|st)/i, + 'last': /^last/i, + 'for': /^for/i, + 'time(s)': /^times?/i, + 'until': /^(un)?til/i, + 'monday': /^mo(n(day)?)?/i, + 'tuesday': /^tu(e(s(day)?)?)?/i, + 'wednesday': /^we(d(n(esday)?)?)?/i, + 'thursday': /^th(u(r(sday)?)?)?/i, + 'friday': /^fr(i(day)?)?/i, + 'saturday': /^sa(t(urday)?)?/i, + 'sunday': /^su(n(day)?)?/i, + 'january': /^jan(uary)?/i, + 'february': /^feb(ruary)?/i, + 'march': /^mar(ch)?/i, + 'april': /^apr(il)?/i, + 'may': /^may/i, + 'june': /^june?/i, + 'july': /^july?/i, + 'august': /^aug(ust)?/i, + 'september': /^sep(t(ember)?)?/i, + 'october': /^oct(ober)?/i, + 'november': /^nov(ember)?/i, + 'december': /^dec(ember)?/i, + 'comma': /^(,\s*|(and|or)\s*)+/i + } + } + + + + // ============================================================================= + // Export + // ============================================================================= + + return { + fromText: fromText, + parseText: parseText, + isFullyConvertible: ToText.isFullyConvertible, + toText: function (rrule, gettext, language) { + return new ToText(rrule, gettext, language).toString() + } + } + } +})) diff --git a/app_v3satdemo/chrome/content/modules/calendar/js/rrule.js b/app_v3satdemo/chrome/content/modules/calendar/js/rrule.js new file mode 100644 index 0000000..b75e991 --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/calendar/js/rrule.js @@ -0,0 +1,2278 @@ +/*! + * rrule.js - Library for working with recurrence rules for calendar dates. + * https://github.com/jkbrzt/rrule + * + * Copyright 2010, Jakub Roztocil and Lars Schoning + * Licenced under the BSD licence. + * https://github.com/jkbrzt/rrule/blob/master/LICENCE + * + * Based on: + * python-dateutil - Extensions to the standard Python datetime module. + * Copyright (c) 2003-2011 - Gustavo Niemeyer + * Copyright (c) 2012 - Tomi Pieviläinen + * https://github.com/jkbrzt/rrule/blob/master/LICENCE + * + */ +/* global module, define */ + +;(function (root, factory) { + if (typeof module === 'object' && module.exports) { + module.exports = factory() + } else if (typeof define === 'function' && define.amd) { + define([], factory) + } else { + root.RRule = factory(root) + root.RRuleSet = root.RRule.RRuleSet + root.rrulestr = root.RRule.rrulestr + } +}(typeof window === 'object' ? window : this, function (root) { + // ============================================================================= + // Date utilities + // ============================================================================= + + /** + * General date-related utilities. + * Also handles several incompatibilities between JavaScript and Python + * + */ + var dateutil = { + MONTH_DAYS: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31], + + /** + * Number of milliseconds of one day + */ + ONE_DAY: 1000 * 60 * 60 * 24, + + /** + * @see: + */ + MAXYEAR: 9999, + + /** + * Python uses 1-Jan-1 as the base for calculating ordinals but we don't + * want to confuse the JS engine with milliseconds > Number.MAX_NUMBER, + * therefore we use 1-Jan-1970 instead + */ + ORDINAL_BASE: new Date(1970, 0, 1), + + /** + * Python: MO-SU: 0 - 6 + * JS: SU-SAT 0 - 6 + */ + PY_WEEKDAYS: [6, 0, 1, 2, 3, 4, 5], + + /** + * py_date.timetuple()[7] + */ + getYearDay: function (date) { + var dateNoTime = new Date( + date.getFullYear(), date.getMonth(), date.getDate()) + return Math.ceil( + (dateNoTime - new Date(date.getFullYear(), 0, 1)) / dateutil.ONE_DAY) + 1 + }, + + isLeapYear: function (year) { + if (year instanceof Date) year = year.getFullYear() + return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0) + }, + + /** + * @return {Number} the date's timezone offset in ms + */ + tzOffset: function (date) { + return date.getTimezoneOffset() * 60 * 1000 + }, + + /** + * @see: + */ + daysBetween: function (date1, date2) { + // The number of milliseconds in one day + // Convert both dates to milliseconds + var date1_ms = date1.getTime() - dateutil.tzOffset(date1) + var date2_ms = date2.getTime() - dateutil.tzOffset(date2) + // Calculate the difference in milliseconds + var difference_ms = Math.abs(date1_ms - date2_ms) + // Convert back to days and return + return Math.round(difference_ms / dateutil.ONE_DAY) + }, + + /** + * @see: + */ + toOrdinal: function (date) { + return dateutil.daysBetween(date, dateutil.ORDINAL_BASE) + }, + + /** + * @see - + */ + fromOrdinal: function (ordinal) { + var millisecsFromBase = ordinal * dateutil.ONE_DAY + return new Date(dateutil.ORDINAL_BASE.getTime() - + dateutil.tzOffset(dateutil.ORDINAL_BASE) + + millisecsFromBase + + dateutil.tzOffset(new Date(millisecsFromBase))) + }, + + /** + * @see: + */ + monthRange: function (year, month) { + var date = new Date(year, month, 1) + return [dateutil.getWeekday(date), dateutil.getMonthDays(date)] + }, + + getMonthDays: function (date) { + var month = date.getMonth() + return month === 1 && dateutil.isLeapYear(date) + ? 29 : dateutil.MONTH_DAYS[month] + }, + + /** + * @return {Number} python-like weekday + */ + getWeekday: function (date) { + return dateutil.PY_WEEKDAYS[date.getDay()] + }, + + /** + * @see: + */ + combine: function (date, time) { + time = time || date + return new Date( + date.getFullYear(), date.getMonth(), date.getDate(), + time.getHours(), time.getMinutes(), time.getSeconds(), + time.getMilliseconds()) + }, + + clone: function (date) { + var dolly = new Date(date.getTime()) + return dolly + }, + + cloneDates: function (dates) { + var clones = [] + for (var i = 0; i < dates.length; i++) { + clones.push(dateutil.clone(dates[i])) + } + return clones + }, + + /** + * Sorts an array of Date or dateutil.Time objects + */ + sort: function (dates) { + dates.sort(function (a, b) { + return a.getTime() - b.getTime() + }) + }, + + timeToUntilString: function (time) { + var comp + var date = new Date(time) + var comps = [ + date.getUTCFullYear(), + date.getUTCMonth() + 1, + date.getUTCDate(), + 'T', + date.getUTCHours(), + date.getUTCMinutes(), + date.getUTCSeconds(), + 'Z' + ] + + for (var i = 0; i < comps.length; i++) { + comp = comps[i] + if (!/[TZ]/.test(comp) && comp < 10) comps[i] = '0' + String(comp) + } + return comps.join('') + }, + + untilStringToDate: function (until) { + var re = /^(\d{4})(\d{2})(\d{2})(T(\d{2})(\d{2})(\d{2})Z)?$/ + var bits = re.exec(until) + if (!bits) throw new Error('Invalid UNTIL value: ' + until) + return new Date(Date.UTC( + bits[1], + bits[2] - 1, + bits[3], + bits[5] || 0, + bits[6] || 0, + bits[7] || 0)) + } + } + + dateutil.Time = function (hour, minute, second, millisecond) { + this.hour = hour + this.minute = minute + this.second = second + this.millisecond = millisecond || 0 + } + + dateutil.Time.prototype = { + constructor: dateutil.Time, + getHours: function () { + return this.hour + }, + getMinutes: function () { + return this.minute + }, + getSeconds: function () { + return this.second + }, + getMilliseconds: function () { + return this.millisecond + }, + getTime: function () { + return ((this.hour * 60 * 60) + (this.minute * 60) + this.second) * 1000 + + this.millisecond + } + } + + // ============================================================================= + // Helper functions + // ============================================================================= + + /** + * Simplified version of python's range() + */ + var range = function (start, end) { + if (arguments.length === 1) { + end = start + start = 0 + } + var rang = [] + for (var i = start; i < end; i++) rang.push(i) + return rang + } + + var repeat = function (value, times) { + var i = 0 + var array = [] + + if (value instanceof Array) { + for (; i < times; i++) array[i] = [].concat(value) + } else { + for (; i < times; i++) array[i] = value + } + return array + } + + /** + * Python like split + */ + var split = function (str, sep, num) { + var splits = str.split(sep) + return num + ? splits.slice(0, num).concat([splits.slice(num).join(sep)]) : splits + } + + /** + * closure/goog/math/math.js:modulo + * Copyright 2006 The Closure Library Authors. + * The % operator in JavaScript returns the remainder of a / b, but differs from + * some other languages in that the result will have the same sign as the + * dividend. For example, -1 % 8 == -1, whereas in some other languages + * (such as Python) the result would be 7. This function emulates the more + * correct modulo behavior, which is useful for certain applications such as + * calculating an offset index in a circular list. + * + * @param {number} a The dividend. + * @param {number} b The divisor. + * @return {number} a % b where the result is between 0 and b (either 0 <= x < b + * or b < x <= 0, depending on the sign of b). + */ + var pymod = function (a, b) { + var r = a % b + // If r and b differ in sign, add b to wrap the result to the correct sign. + return (r * b < 0) ? r + b : r + } + + /** + * @see: + */ + var divmod = function (a, b) { + return {div: Math.floor(a / b), mod: pymod(a, b)} + } + + /** + * Python-like boolean + * @return {Boolean} value of an object/primitive, taking into account + * the fact that in Python an empty list's/tuple's + * boolean value is False, whereas in JS it's true + */ + var plb = function (obj) { + return (obj instanceof Array && obj.length === 0) + ? false : Boolean(obj) + } + + /** + * Return true if a value is in an array + */ + var contains = function (arr, val) { + return arr.indexOf(val) !== -1 + } + + // ============================================================================= + // Date masks + // ============================================================================= + + // Every mask is 7 days longer to handle cross-year weekly periods. + + var M365MASK = [].concat( + repeat(1, 31), repeat(2, 28), repeat(3, 31), + repeat(4, 30), repeat(5, 31), repeat(6, 30), + repeat(7, 31), repeat(8, 31), repeat(9, 30), + repeat(10, 31), repeat(11, 30), repeat(12, 31), + repeat(1, 7)) + + var M366MASK = [].concat( + repeat(1, 31), repeat(2, 29), repeat(3, 31), + repeat(4, 30), repeat(5, 31), repeat(6, 30), + repeat(7, 31), repeat(8, 31), repeat(9, 30), + repeat(10, 31), repeat(11, 30), repeat(12, 31), + repeat(1, 7)) + + var M28 = range(1, 29) + var M29 = range(1, 30) + var M30 = range(1, 31) + var M31 = range(1, 32) + + var MDAY366MASK = [].concat( + M31, M29, M31, + M30, M31, M30, + M31, M31, M30, + M31, M30, M31, + M31.slice(0, 7)) + + var MDAY365MASK = [].concat( + M31, M28, M31, + M30, M31, M30, + M31, M31, M30, + M31, M30, M31, + M31.slice(0, 7)) + + M28 = range(-28, 0) + M29 = range(-29, 0) + M30 = range(-30, 0) + M31 = range(-31, 0) + + var NMDAY366MASK = [].concat( + M31, M29, M31, + M30, M31, M30, + M31, M31, M30, + M31, M30, M31, + M31.slice(0, 7)) + + var NMDAY365MASK = [].concat( + M31, M28, M31, + M30, M31, M30, + M31, M31, M30, + M31, M30, M31, + M31.slice(0, 7)) + + var M366RANGE = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366] + var M365RANGE = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365] + + var WDAYMASK = (function () { + for (var wdaymask = [], i = 0; i < 55; i++) wdaymask = wdaymask.concat(range(7)) + return wdaymask + }()) + + // ============================================================================= + // Weekday + // ============================================================================= + + var Weekday = function (weekday, n) { + if (n === 0) throw new Error("Can't create weekday with n == 0") + this.weekday = weekday + this.n = n + } + + Weekday.prototype = { + constructor: Weekday, + // __call__ - Cannot call the object directly, do it through + // e.g. RRule.TH.nth(-1) instead, + nth: function (n) { + return this.n === n ? this : new Weekday(this.weekday, n) + }, + + // __eq__ + equals: function (other) { + return this.weekday === other.weekday && this.n === other.n + }, + + // __repr__ + toString: function () { + var s = ['MO', 'TU', 'WE', 'TH', 'FR', 'SA', 'SU'][this.weekday] + if (this.n) s = (this.n > 0 ? '+' : '') + String(this.n) + s + return s + }, + + getJsWeekday: function () { + return this.weekday === 6 ? 0 : this.weekday + 1 + } + + } + + // ============================================================================= + // RRule + // ============================================================================= + + /** + * + * @param {Object?} options - see + * The only required option is `freq`, one of RRule.YEARLY, RRule.MONTHLY, ... + * @constructor + */ + var RRule = function (options, noCache) { + options = options || {} + // RFC string + this._string = null + this._cache = noCache ? null : { + all: false, + before: [], + after: [], + between: [] + } + + // used by toString() + this.origOptions = {} + + var invalid = [] + var keys = Object.keys(options) + var defaultKeys = Object.keys(RRule.DEFAULT_OPTIONS) + + // Shallow copy for origOptions and check for invalid + keys.forEach(function (key) { + this.origOptions[key] = options[key] + if (!contains(defaultKeys, key)) invalid.push(key) + }, this) + + if (invalid.length) throw new Error('Invalid options: ' + invalid.join(', ')) + + if (!RRule.FREQUENCIES[options.freq] && options.byeaster === null) { + throw new Error('Invalid frequency: ' + String(options.freq)) + } + + // Merge in default options + defaultKeys.forEach(function (key) { + if (!contains(keys, key)) options[key] = RRule.DEFAULT_OPTIONS[key] + }) + + var opts = this.options = options + + if (opts.byeaster !== null) opts.freq = RRule.YEARLY + if (!opts.dtstart) opts.dtstart = new Date() + + var millisecondModulo = opts.dtstart.getTime() % 1000 + if (opts.wkst === null) { + opts.wkst = RRule.MO.weekday + } else if (typeof opts.wkst === 'number') { + // cool, just keep it like that + } else { + opts.wkst = opts.wkst.weekday + } + + if (opts.bysetpos !== null) { + if (typeof opts.bysetpos === 'number') opts.bysetpos = [opts.bysetpos] + + for (var i = 0; i < opts.bysetpos.length; i++) { + var v = opts.bysetpos[i] + if (v === 0 || !(v >= -366 && v <= 366)) { + throw new Error('bysetpos must be between 1 and 366,' + + ' or between -366 and -1') + } + } + } + + if (!(plb(opts.byweekno) || plb(opts.byyearday) || plb(opts.bymonthday) || + opts.byweekday !== null || opts.byeaster !== null)) { + switch (opts.freq) { + case RRule.YEARLY: + if (!opts.bymonth) opts.bymonth = opts.dtstart.getMonth() + 1 + opts.bymonthday = opts.dtstart.getDate() + break + case RRule.MONTHLY: + opts.bymonthday = opts.dtstart.getDate() + break + case RRule.WEEKLY: + opts.byweekday = dateutil.getWeekday(opts.dtstart) + break + } + } + + // bymonth + if (opts.bymonth !== null && !(opts.bymonth instanceof Array)) { + opts.bymonth = [opts.bymonth] + } + // byyearday + if (opts.byyearday !== null && !(opts.byyearday instanceof Array)) { + opts.byyearday = [opts.byyearday] + } + + // bymonthday + if (opts.bymonthday === null) { + opts.bymonthday = [] + opts.bynmonthday = [] + } else if (opts.bymonthday instanceof Array) { + var bymonthday = [] + var bynmonthday = [] + + for (i = 0; i < opts.bymonthday.length; i++) { + v = opts.bymonthday[i] + if (v > 0) { + bymonthday.push(v) + } else if (v < 0) { + bynmonthday.push(v) + } + } + opts.bymonthday = bymonthday + opts.bynmonthday = bynmonthday + } else { + if (opts.bymonthday < 0) { + opts.bynmonthday = [opts.bymonthday] + opts.bymonthday = [] + } else { + opts.bynmonthday = [] + opts.bymonthday = [opts.bymonthday] + } + } + + // byweekno + if (opts.byweekno !== null && !(opts.byweekno instanceof Array)) { + opts.byweekno = [opts.byweekno] + } + + // byweekday / bynweekday + if (opts.byweekday === null) { + opts.bynweekday = null + } else if (typeof opts.byweekday === 'number') { + opts.byweekday = [opts.byweekday] + opts.bynweekday = null + } else if (opts.byweekday instanceof Weekday) { + if (!opts.byweekday.n || opts.freq > RRule.MONTHLY) { + opts.byweekday = [opts.byweekday.weekday] + opts.bynweekday = null + } else { + opts.bynweekday = [ + [opts.byweekday.weekday, opts.byweekday.n] + ] + opts.byweekday = null + } + } else { + var byweekday = [] + var bynweekday = [] + + for (i = 0; i < opts.byweekday.length; i++) { + var wday = opts.byweekday[i] + + if (typeof wday === 'number') { + byweekday.push(wday) + } else if (!wday.n || opts.freq > RRule.MONTHLY) { + byweekday.push(wday.weekday) + } else { + bynweekday.push([wday.weekday, wday.n]) + } + } + opts.byweekday = plb(byweekday) ? byweekday : null + opts.bynweekday = plb(bynweekday) ? bynweekday : null + } + + // byhour + if (opts.byhour === null) { + opts.byhour = (opts.freq < RRule.HOURLY) ? [opts.dtstart.getHours()] : null + } else if (typeof opts.byhour === 'number') { + opts.byhour = [opts.byhour] + } + + // byminute + if (opts.byminute === null) { + opts.byminute = (opts.freq < RRule.MINUTELY) + ? [opts.dtstart.getMinutes()] : null + } else if (typeof opts.byminute === 'number') { + opts.byminute = [opts.byminute] + } + + // bysecond + if (opts.bysecond === null) { + opts.bysecond = (opts.freq < RRule.SECONDLY) + ? [opts.dtstart.getSeconds()] : null + } else if (typeof opts.bysecond === 'number') { + opts.bysecond = [opts.bysecond] + } + + if (opts.freq >= RRule.HOURLY) { + this.timeset = null + } else { + this.timeset = [] + for (i = 0; i < opts.byhour.length; i++) { + var hour = opts.byhour[i] + for (var j = 0; j < opts.byminute.length; j++) { + var minute = opts.byminute[j] + for (var k = 0; k < opts.bysecond.length; k++) { + var second = opts.bysecond[k] + // python: + // datetime.time(hour, minute, second, + // tzinfo=self._tzinfo)) + this.timeset.push(new dateutil.Time(hour, minute, second, millisecondModulo)) + } + } + } + dateutil.sort(this.timeset) + } + } + + // RRule class 'constants' + + RRule.FREQUENCIES = [ + 'YEARLY', 'MONTHLY', 'WEEKLY', 'DAILY', + 'HOURLY', 'MINUTELY', 'SECONDLY' + ] + + RRule.YEARLY = 0 + RRule.MONTHLY = 1 + RRule.WEEKLY = 2 + RRule.DAILY = 3 + RRule.HOURLY = 4 + RRule.MINUTELY = 5 + RRule.SECONDLY = 6 + + RRule.MO = new Weekday(0) + RRule.TU = new Weekday(1) + RRule.WE = new Weekday(2) + RRule.TH = new Weekday(3) + RRule.FR = new Weekday(4) + RRule.SA = new Weekday(5) + RRule.SU = new Weekday(6) + + RRule.DEFAULT_OPTIONS = { + freq: null, + dtstart: null, + interval: 1, + wkst: RRule.MO, + count: null, + until: null, + bysetpos: null, + bymonth: null, + bymonthday: null, + bynmonthday: null, + byyearday: null, + byweekno: null, + byweekday: null, + bynweekday: null, + byhour: null, + byminute: null, + bysecond: null, + byeaster: null + } + + RRule.parseText = function (text, language) { + return getnlp().parseText(text, language) + } + + RRule.fromText = function (text, language) { + return getnlp().fromText(text, language) + } + + RRule.optionsToString = function (options) { + var key, value, strValues + var pairs = [] + var keys = Object.keys(options) + var defaultKeys = Object.keys(RRule.DEFAULT_OPTIONS) + + for (var i = 0; i < keys.length; i++) { + if (!contains(defaultKeys, keys[i])) continue + + key = keys[i].toUpperCase() + value = options[keys[i]] + strValues = [] + + if (value === null || value instanceof Array && !value.length) continue + + switch (key) { + case 'FREQ': + value = RRule.FREQUENCIES[options.freq] + break + case 'WKST': + value = value.toString() + break + case 'BYWEEKDAY': + /* + NOTE: BYWEEKDAY is a special case. + RRule() deconstructs the rule.options.byweekday array + into an array of Weekday arguments. + On the other hand, rule.origOptions is an array of Weekdays. + We need to handle both cases here. + It might be worth change RRule to keep the Weekdays. + + Also, BYWEEKDAY (used by RRule) vs. BYDAY (RFC) + + */ + key = 'BYDAY' + if (!(value instanceof Array)) value = [value] + + for (var wday, j = 0; j < value.length; j++) { + wday = value[j] + if (wday instanceof Weekday) { + // good + } else if (wday instanceof Array) { + wday = new Weekday(wday[0], wday[1]) + } else { + wday = new Weekday(wday) + } + strValues[j] = wday.toString() + } + value = strValues + break + case 'DTSTART': + case 'UNTIL': + value = dateutil.timeToUntilString(value) + break + default: + if (value instanceof Array) { + for (j = 0; j < value.length; j++) strValues[j] = String(value[j]) + value = strValues + } else { + value = String(value) + } + + } + pairs.push([key, value]) + } + + var strings = [] + for (i = 0; i < pairs.length; i++) { + var attr = pairs[i] + strings.push(attr[0] + '=' + attr[1].toString()) + } + return strings.join(';') + } + + RRule.prototype = { + constructor: RRule, + + /** + * @param {Function} iterator - optional function that will be called + * on each date that is added. It can return false + * to stop the iteration. + * @return Array containing all recurrences. + */ + all: function (iterator) { + if (iterator) { + return this._iter(new CallbackIterResult('all', {}, iterator)) + } else { + var result = this._cacheGet('all') + if (result === false) { + result = this._iter(new IterResult('all', {})) + this._cacheAdd('all', result) + } + return result + } + }, + + /** + * Returns all the occurrences of the rrule between after and before. + * The inc keyword defines what happens if after and/or before are + * themselves occurrences. With inc == True, they will be included in the + * list, if they are found in the recurrence set. + * @return Array + */ + between: function (after, before, inc, iterator) { + var args = { + before: before, + after: after, + inc: inc + } + + if (iterator) { + return this._iter(new CallbackIterResult('between', args, iterator)) + } + var result = this._cacheGet('between', args) + if (result === false) { + result = this._iter(new IterResult('between', args)) + this._cacheAdd('between', result, args) + } + return result + }, + + /** + * Returns the last recurrence before the given datetime instance. + * The inc keyword defines what happens if dt is an occurrence. + * With inc == True, if dt itself is an occurrence, it will be returned. + * @return Date or null + */ + before: function (dt, inc) { + var args = {dt: dt, inc: inc} + var result = this._cacheGet('before', args) + if (result === false) { + result = this._iter(new IterResult('before', args)) + this._cacheAdd('before', result, args) + } + return result + }, + + /** + * Returns the first recurrence after the given datetime instance. + * The inc keyword defines what happens if dt is an occurrence. + * With inc == True, if dt itself is an occurrence, it will be returned. + * @return Date or null + */ + after: function (dt, inc) { + var args = {dt: dt, inc: inc} + var result = this._cacheGet('after', args) + if (result === false) { + result = this._iter(new IterResult('after', args)) + this._cacheAdd('after', result, args) + } + return result + }, + + /** + * Returns the number of recurrences in this set. It will have go trough + * the whole recurrence, if this hasn't been done before. + */ + count: function () { + return this.all().length + }, + + /** + * Converts the rrule into its string representation + * @see + * @return String + */ + toString: function () { + return RRule.optionsToString(this.origOptions) + }, + + /** + * Will convert all rules described in nlp:ToText + * to text. + */ + toText: function (gettext, language) { + return getnlp().toText(this, gettext, language) + }, + + isFullyConvertibleToText: function () { + return getnlp().isFullyConvertible(this) + }, + + /** + * @param {String} what - all/before/after/between + * @param {Array,Date} value - an array of dates, one date, or null + * @param {Object?} args - _iter arguments + */ + _cacheAdd: function (what, value, args) { + if (!this._cache) return + + if (value) { + value = (value instanceof Date) + ? dateutil.clone(value) : dateutil.cloneDates(value) + } + + if (what === 'all') { + this._cache.all = value + } else { + args._value = value + this._cache[what].push(args) + } + }, + + /** + * @return false - not in the cache + * null - cached, but zero occurrences (before/after) + * Date - cached (before/after) + * [] - cached, but zero occurrences (all/between) + * [Date1, DateN] - cached (all/between) + */ + _cacheGet: function (what, args) { + if (!this._cache) return false + + var cached = false + var argsKeys = args ? Object.keys(args) : [] + var findCacheDiff = function (item) { + for (var key, i = 0; i < argsKeys.length; i++) { + key = argsKeys[i] + if (String(args[key]) !== String(item[key])) return true + } + return false + } + + if (what === 'all') { + cached = this._cache.all + } else { + // Let's see whether we've already called the + // 'what' method with the same 'args' + for (var item, i = 0; i < this._cache[what].length; i++) { + item = this._cache[what][i] + if (argsKeys.length && findCacheDiff(item)) continue + cached = item._value + break + } + } + + if (!cached && this._cache.all) { + // Not in the cache, but we already know all the occurrences, + // so we can find the correct dates from the cached ones. + var iterResult = new IterResult(what, args) + for (i = 0; i < this._cache.all.length; i++) { + if (!iterResult.accept(this._cache.all[i])) break + } + cached = iterResult.getValue() + this._cacheAdd(what, cached, args) + } + + return cached instanceof Array + ? dateutil.cloneDates(cached) + : (cached instanceof Date ? dateutil.clone(cached) : cached) + }, + + /** + * @return a RRule instance with the same freq and options + * as this one (cache is not cloned) + */ + clone: function () { + return new RRule(this.origOptions) + }, + + _iter: function (iterResult) { + /* Since JavaScript doesn't have the python's yield operator (<1.7), + we use the IterResult object that tells us when to stop iterating. + + */ + + var dtstart = this.options.dtstart + var dtstartMillisecondModulo = this.options.dtstart % 1000 + + var year = dtstart.getFullYear() + var month = dtstart.getMonth() + 1 + var day = dtstart.getDate() + var hour = dtstart.getHours() + var minute = dtstart.getMinutes() + var second = dtstart.getSeconds() + var weekday = dateutil.getWeekday(dtstart) + + // Some local variables to speed things up a bit + var freq = this.options.freq + var interval = this.options.interval + var wkst = this.options.wkst + var until = this.options.until + var bymonth = this.options.bymonth + var byweekno = this.options.byweekno + var byyearday = this.options.byyearday + var byweekday = this.options.byweekday + var byeaster = this.options.byeaster + var bymonthday = this.options.bymonthday + var bynmonthday = this.options.bynmonthday + var bysetpos = this.options.bysetpos + var byhour = this.options.byhour + var byminute = this.options.byminute + var bysecond = this.options.bysecond + + var ii = new Iterinfo(this) + ii.rebuild(year, month) + + var getdayset = {} + getdayset[RRule.YEARLY] = ii.ydayset + getdayset[RRule.MONTHLY] = ii.mdayset + getdayset[RRule.WEEKLY] = ii.wdayset + getdayset[RRule.DAILY] = ii.ddayset + getdayset[RRule.HOURLY] = ii.ddayset + getdayset[RRule.MINUTELY] = ii.ddayset + getdayset[RRule.SECONDLY] = ii.ddayset + + getdayset = getdayset[freq] + + var timeset + if (freq < RRule.HOURLY) { + timeset = this.timeset + } else { + var gettimeset = {} + gettimeset[RRule.HOURLY] = ii.htimeset + gettimeset[RRule.MINUTELY] = ii.mtimeset + gettimeset[RRule.SECONDLY] = ii.stimeset + gettimeset = gettimeset[freq] + if ((freq >= RRule.HOURLY && plb(byhour) && !contains(byhour, hour)) || + (freq >= RRule.MINUTELY && plb(byminute) && !contains(byminute, minute)) || + (freq >= RRule.SECONDLY && plb(bysecond) && !contains(bysecond, minute))) { + timeset = [] + } else { + timeset = gettimeset.call(ii, hour, minute, second, dtstartMillisecondModulo) + } + } + + var total = 0 + var count = this.options.count + var i, j, k, dm, div, mod, tmp, pos, dayset, start, end, fixday, filtered + + while (true) { + // Get dayset with the right frequency + tmp = getdayset.call(ii, year, month, day) + dayset = tmp[0] + start = tmp[1] + end = tmp[2] + + // Do the "hard" work ;-) + filtered = false + for (j = start; j < end; j++) { + i = dayset[j] + + filtered = (plb(bymonth) && !contains(bymonth, ii.mmask[i])) || + (plb(byweekno) && !ii.wnomask[i]) || + (plb(byweekday) && !contains(byweekday, ii.wdaymask[i])) || + (plb(ii.nwdaymask) && !ii.nwdaymask[i]) || + (byeaster !== null && !contains(ii.eastermask, i)) || + ((plb(bymonthday) || plb(bynmonthday)) && + !contains(bymonthday, ii.mdaymask[i]) && + !contains(bynmonthday, ii.nmdaymask[i])) || + (plb(byyearday) && + ((i < ii.yearlen && + !contains(byyearday, i + 1) && + !contains(byyearday, -ii.yearlen + i)) || + (i >= ii.yearlen && + !contains(byyearday, i + 1 - ii.yearlen) && + !contains(byyearday, -ii.nextyearlen + i - ii.yearlen)))) + + if (filtered) dayset[i] = null + } + + // Output results + if (plb(bysetpos) && plb(timeset)) { + var daypos, timepos + var poslist = [] + + for (i, j = 0; j < bysetpos.length; j++) { + pos = bysetpos[j] + + if (pos < 0) { + daypos = Math.floor(pos / timeset.length) + timepos = pymod(pos, timeset.length) + } else { + daypos = Math.floor((pos - 1) / timeset.length) + timepos = pymod((pos - 1), timeset.length) + } + + try { + tmp = [] + for (k = start; k < end; k++) { + var val = dayset[k] + if (val === null) continue + tmp.push(val) + } + if (daypos < 0) { + // we're trying to emulate python's aList[-n] + i = tmp.slice(daypos)[0] + } else { + i = tmp[daypos] + } + + var time = timeset[timepos] + var date = dateutil.fromOrdinal(ii.yearordinal + i) + var res = dateutil.combine(date, time) + // XXX: can this ever be in the array? + // - compare the actual date instead? + if (!contains(poslist, res)) poslist.push(res) + } catch (e) {} + } + + dateutil.sort(poslist) + for (j = 0; j < poslist.length; j++) { + res = poslist[j] + if (until && res > until) { + this._len = total + return iterResult.getValue() + } else if (res >= dtstart) { + ++total + if (!iterResult.accept(res)) return iterResult.getValue() + if (count) { + --count + if (!count) { + this._len = total + return iterResult.getValue() + } + } + } + } + } else { + for (j = start; j < end; j++) { + i = dayset[j] + if (i !== null) { + date = dateutil.fromOrdinal(ii.yearordinal + i) + for (k = 0; k < timeset.length; k++) { + time = timeset[k] + res = dateutil.combine(date, time) + if (until && res > until) { + this._len = total + return iterResult.getValue() + } else if (res >= dtstart) { + ++total + if (!iterResult.accept(res)) return iterResult.getValue() + if (count) { + --count + if (!count) { + this._len = total + return iterResult.getValue() + } + } + } + } + } + } + } + + // Handle frequency and interval + fixday = false + if (freq === RRule.YEARLY) { + year += interval + if (year > dateutil.MAXYEAR) { + this._len = total + return iterResult.getValue() + } + ii.rebuild(year, month) + } else if (freq === RRule.MONTHLY) { + month += interval + if (month > 12) { + div = Math.floor(month / 12) + mod = pymod(month, 12) + month = mod + year += div + if (month === 0) { + month = 12 + --year + } + if (year > dateutil.MAXYEAR) { + this._len = total + return iterResult.getValue() + } + } + ii.rebuild(year, month) + } else if (freq === RRule.WEEKLY) { + if (wkst > weekday) { + day += -(weekday + 1 + (6 - wkst)) + interval * 7 + } else { + day += -(weekday - wkst) + interval * 7 + } + weekday = wkst + fixday = true + } else if (freq === RRule.DAILY) { + day += interval + fixday = true + } else if (freq === RRule.HOURLY) { + if (filtered) { + // Jump to one iteration before next day + hour += Math.floor((23 - hour) / interval) * interval + } + while (true) { + hour += interval + dm = divmod(hour, 24) + div = dm.div + mod = dm.mod + if (div) { + hour = mod + day += div + fixday = true + } + if (!plb(byhour) || contains(byhour, hour)) break + } + timeset = gettimeset.call(ii, hour, minute, second) + } else if (freq === RRule.MINUTELY) { + if (filtered) { + // Jump to one iteration before next day + minute += Math.floor( + (1439 - (hour * 60 + minute)) / interval) * interval + } + + while (true) { + minute += interval + dm = divmod(minute, 60) + div = dm.div + mod = dm.mod + if (div) { + minute = mod + hour += div + dm = divmod(hour, 24) + div = dm.div + mod = dm.mod + if (div) { + hour = mod + day += div + fixday = true + filtered = false + } + } + if ((!plb(byhour) || contains(byhour, hour)) && + (!plb(byminute) || contains(byminute, minute))) { + break + } + } + timeset = gettimeset.call(ii, hour, minute, second) + } else if (freq === RRule.SECONDLY) { + if (filtered) { + // Jump to one iteration before next day + second += Math.floor( + (86399 - (hour * 3600 + minute * 60 + second)) / interval) * interval + } + while (true) { + second += interval + dm = divmod(second, 60) + div = dm.div + mod = dm.mod + if (div) { + second = mod + minute += div + dm = divmod(minute, 60) + div = dm.div + mod = dm.mod + if (div) { + minute = mod + hour += div + dm = divmod(hour, 24) + div = dm.div + mod = dm.mod + if (div) { + hour = mod + day += div + fixday = true + } + } + } + if ((!plb(byhour) || contains(byhour, hour)) && + (!plb(byminute) || contains(byminute, minute)) && + (!plb(bysecond) || contains(bysecond, second))) { + break + } + } + timeset = gettimeset.call(ii, hour, minute, second) + } + + if (fixday && day > 28) { + var daysinmonth = dateutil.monthRange(year, month - 1)[1] + if (day > daysinmonth) { + while (day > daysinmonth) { + day -= daysinmonth + ++month + if (month === 13) { + month = 1 + ++year + if (year > dateutil.MAXYEAR) { + this._len = total + return iterResult.getValue() + } + } + daysinmonth = dateutil.monthRange(year, month - 1)[1] + } + ii.rebuild(year, month) + } + } + } + } + + } + + RRule.parseString = function (rfcString) { + rfcString = rfcString.replace(/^\s+|\s+$/, '') + if (!rfcString.length) return null + + var i, j, key, value, attr + var attrs = rfcString.split(';') + var options = {} + + for (i = 0; i < attrs.length; i++) { + attr = attrs[i].split('=') + key = attr[0] + value = attr[1] + switch (key) { + case 'FREQ': + options.freq = RRule[value] + break + case 'WKST': + options.wkst = RRule[value] + break + case 'COUNT': + case 'INTERVAL': + case 'BYSETPOS': + case 'BYMONTH': + case 'BYMONTHDAY': + case 'BYYEARDAY': + case 'BYWEEKNO': + case 'BYHOUR': + case 'BYMINUTE': + case 'BYSECOND': + if (value.indexOf(',') !== -1) { + value = value.split(',') + for (j = 0; j < value.length; j++) { + if (/^[+-]?\d+$/.test(value[j])) value[j] = Number(value[j]) + } + } else if (/^[+-]?\d+$/.test(value)) { + value = Number(value) + } + key = key.toLowerCase() + options[key] = value + break + case 'BYDAY': // => byweekday + var n, wday, day + var days = value.split(',') + + options.byweekday = [] + for (j = 0; j < days.length; j++) { + day = days[j] + if (day.length === 2) { // MO, TU, ... + wday = RRule[day] // wday instanceof Weekday + options.byweekday.push(wday) + } else { // -1MO, +3FR, 1SO, ... + day = day.match(/^([+-]?\d)([A-Z]{2})$/) + n = Number(day[1]) + wday = day[2] + wday = RRule[wday].weekday + options.byweekday.push(new Weekday(wday, n)) + } + } + break + case 'DTSTART': + options.dtstart = dateutil.untilStringToDate(value) + break + case 'UNTIL': + options.until = dateutil.untilStringToDate(value) + break + case 'BYEASTER': + options.byeaster = Number(value) + break + default: + throw new Error("Unknown RRULE property '" + key + "'") + } + } + return options + } + + RRule.fromString = function (string) { + return new RRule(RRule.parseString(string)) + } + + // ============================================================================= + // Iterinfo + // ============================================================================= + + var Iterinfo = function (rrule) { + this.rrule = rrule + this.lastyear = null + this.lastmonth = null + this.yearlen = null + this.nextyearlen = null + this.yearordinal = null + this.yearweekday = null + this.mmask = null + this.mrange = null + this.mdaymask = null + this.nmdaymask = null + this.wdaymask = null + this.wnomask = null + this.nwdaymask = null + this.eastermask = null + } + + Iterinfo.prototype.easter = function (y, offset) { + offset = offset || 0 + + var a = y % 19 + var b = Math.floor(y / 100) + var c = y % 100 + var d = Math.floor(b / 4) + var e = b % 4 + var f = Math.floor((b + 8) / 25) + var g = Math.floor((b - f + 1) / 3) + var h = Math.floor(19 * a + b - d - g + 15) % 30 + var i = Math.floor(c / 4) + var k = c % 4 + var l = Math.floor(32 + 2 * e + 2 * i - h - k) % 7 + var m = Math.floor((a + 11 * h + 22 * l) / 451) + var month = Math.floor((h + l - 7 * m + 114) / 31) + var day = (h + l - 7 * m + 114) % 31 + 1 + var date = Date.UTC(y, month - 1, day + offset) + var yearStart = Date.UTC(y, 0, 1) + + return [Math.ceil((date - yearStart) / (1000 * 60 * 60 * 24))] + } + + Iterinfo.prototype.rebuild = function (year, month) { + var rr = this.rrule + + if (year !== this.lastyear) { + this.yearlen = dateutil.isLeapYear(year) ? 366 : 365 + this.nextyearlen = dateutil.isLeapYear(year + 1) ? 366 : 365 + var firstyday = new Date(year, 0, 1) + + this.yearordinal = dateutil.toOrdinal(firstyday) + this.yearweekday = dateutil.getWeekday(firstyday) + + var wday = dateutil.getWeekday(new Date(year, 0, 1)) + + if (this.yearlen === 365) { + this.mmask = [].concat(M365MASK) + this.mdaymask = [].concat(MDAY365MASK) + this.nmdaymask = [].concat(NMDAY365MASK) + this.wdaymask = WDAYMASK.slice(wday) + this.mrange = [].concat(M365RANGE) + } else { + this.mmask = [].concat(M366MASK) + this.mdaymask = [].concat(MDAY366MASK) + this.nmdaymask = [].concat(NMDAY366MASK) + this.wdaymask = WDAYMASK.slice(wday) + this.mrange = [].concat(M366RANGE) + } + + if (!plb(rr.options.byweekno)) { + this.wnomask = null + } else { + this.wnomask = repeat(0, this.yearlen + 7) + var no1wkst, firstwkst, wyearlen + no1wkst = firstwkst = pymod(7 - this.yearweekday + rr.options.wkst, 7) + if (no1wkst >= 4) { + no1wkst = 0 + // Number of days in the year, plus the days we got + // from last year. + wyearlen = this.yearlen + pymod(this.yearweekday - rr.options.wkst, 7) + } else { + // Number of days in the year, minus the days we + // left in last year. + wyearlen = this.yearlen - no1wkst + } + var div = Math.floor(wyearlen / 7) + var mod = pymod(wyearlen, 7) + var numweeks = Math.floor(div + (mod / 4)) + for (var n, i, j = 0; j < rr.options.byweekno.length; j++) { + n = rr.options.byweekno[j] + if (n < 0) { + n += numweeks + 1 + } if (!(n > 0 && n <= numweeks)) { + continue + } if (n > 1) { + i = no1wkst + (n - 1) * 7 + if (no1wkst !== firstwkst) { + i -= 7 - firstwkst + } + } else { + i = no1wkst + } + for (var k = 0; k < 7; k++) { + this.wnomask[i] = 1 + i++ + if (this.wdaymask[i] === rr.options.wkst) break + } + } + + if (contains(rr.options.byweekno, 1)) { + // Check week number 1 of next year as well + // orig-TODO : Check -numweeks for next year. + i = no1wkst + numweeks * 7 + if (no1wkst !== firstwkst) i -= 7 - firstwkst + if (i < this.yearlen) { + // If week starts in next year, we + // don't care about it. + for (j = 0; j < 7; j++) { + this.wnomask[i] = 1 + i += 1 + if (this.wdaymask[i] === rr.options.wkst) break + } + } + } + + if (no1wkst) { + // Check last week number of last year as + // well. If no1wkst is 0, either the year + // started on week start, or week number 1 + // got days from last year, so there are no + // days from last year's last week number in + // this year. + var lnumweeks + if (!contains(rr.options.byweekno, -1)) { + var lyearweekday = dateutil.getWeekday(new Date(year - 1, 0, 1)) + var lno1wkst = pymod(7 - lyearweekday + rr.options.wkst, 7) + var lyearlen = dateutil.isLeapYear(year - 1) ? 366 : 365 + if (lno1wkst >= 4) { + lno1wkst = 0 + lnumweeks = Math.floor(52 + + pymod(lyearlen + pymod(lyearweekday - rr.options.wkst, 7), 7) / 4) + } else { + lnumweeks = Math.floor(52 + pymod(this.yearlen - no1wkst, 7) / 4) + } + } else { + lnumweeks = -1 + } + if (contains(rr.options.byweekno, lnumweeks)) { + for (i = 0; i < no1wkst; i++) this.wnomask[i] = 1 + } + } + } + } + + if (plb(rr.options.bynweekday) && (month !== this.lastmonth || year !== this.lastyear)) { + var ranges = [] + if (rr.options.freq === RRule.YEARLY) { + if (plb(rr.options.bymonth)) { + for (j = 0; j < rr.options.bymonth.length; j++) { + month = rr.options.bymonth[j] + ranges.push(this.mrange.slice(month - 1, month + 1)) + } + } else { + ranges = [[0, this.yearlen]] + } + } else if (rr.options.freq === RRule.MONTHLY) { + ranges = [this.mrange.slice(month - 1, month + 1)] + } + if (plb(ranges)) { + // Weekly frequency won't get here, so we may not + // care about cross-year weekly periods. + this.nwdaymask = repeat(0, this.yearlen) + + for (j = 0; j < ranges.length; j++) { + var rang = ranges[j] + var first = rang[0] + var last = rang[1] + last -= 1 + for (k = 0; k < rr.options.bynweekday.length; k++) { + wday = rr.options.bynweekday[k][0] + n = rr.options.bynweekday[k][1] + if (n < 0) { + i = last + (n + 1) * 7 + i -= pymod(this.wdaymask[i] - wday, 7) + } else { + i = first + (n - 1) * 7 + i += pymod(7 - this.wdaymask[i] + wday, 7) + } + if (first <= i && i <= last) this.nwdaymask[i] = 1 + } + } + } + + this.lastyear = year + this.lastmonth = month + } + + if (rr.options.byeaster !== null) { + this.eastermask = this.easter(year, rr.options.byeaster) + } + } + + Iterinfo.prototype.ydayset = function (year, month, day) { + return [range(this.yearlen), 0, this.yearlen] + } + + Iterinfo.prototype.mdayset = function (year, month, day) { + var set = repeat(null, this.yearlen) + var start = this.mrange[month - 1] + var end = this.mrange[month] + for (var i = start; i < end; i++) set[i] = i + return [set, start, end] + } + + Iterinfo.prototype.wdayset = function (year, month, day) { + // We need to handle cross-year weeks here. + var set = repeat(null, this.yearlen + 7) + var i = dateutil.toOrdinal(new Date(year, month - 1, day)) - this.yearordinal + var start = i + for (var j = 0; j < 7; j++) { + set[i] = i + ++i + if (this.wdaymask[i] === this.rrule.options.wkst) break + } + return [set, start, i] + } + + Iterinfo.prototype.ddayset = function (year, month, day) { + var set = repeat(null, this.yearlen) + var i = dateutil.toOrdinal(new Date(year, month - 1, day)) - this.yearordinal + set[i] = i + return [set, i, i + 1] + } + + Iterinfo.prototype.htimeset = function (hour, minute, second, millisecond) { + var set = [] + var rr = this.rrule + for (var i = 0; i < rr.options.byminute.length; i++) { + minute = rr.options.byminute[i] + for (var j = 0; j < rr.options.bysecond.length; j++) { + second = rr.options.bysecond[j] + set.push(new dateutil.Time(hour, minute, second, millisecond)) + } + } + dateutil.sort(set) + return set + } + + Iterinfo.prototype.mtimeset = function (hour, minute, second, millisecond) { + var set = [] + var rr = this.rrule + for (var j = 0; j < rr.options.bysecond.length; j++) { + second = rr.options.bysecond[j] + set.push(new dateutil.Time(hour, minute, second, millisecond)) + } + dateutil.sort(set) + return set + } + + Iterinfo.prototype.stimeset = function (hour, minute, second, millisecond) { + return [new dateutil.Time(hour, minute, second, millisecond)] + } + + // ============================================================================= + // Results + // ============================================================================= + + /** + * This class helps us to emulate python's generators, sorta. + */ + var IterResult = function (method, args) { + this.init(method, args) + } + + IterResult.prototype = { + constructor: IterResult, + init: function (method, args) { + this.method = method + this.args = args + this.minDate = null + this.maxDate = null + this._result = [] + + if (method === 'between') { + this.maxDate = args.inc + ? args.before : new Date(args.before.getTime() - 1) + this.minDate = args.inc + ? args.after : new Date(args.after.getTime() + 1) + } else if (method === 'before') { + this.maxDate = args.inc ? args.dt : new Date(args.dt.getTime() - 1) + } else if (method === 'after') { + this.minDate = args.inc ? args.dt : new Date(args.dt.getTime() + 1) + } + }, + + /** + * Possibly adds a date into the result. + * + * @param {Date} date - the date isn't necessarly added to the result + * list (if it is too late/too early) + * @return {Boolean} true if it makes sense to continue the iteration + * false if we're done. + */ + accept: function (date) { + var tooEarly = this.minDate && date < this.minDate + var tooLate = this.maxDate && date > this.maxDate + + if (this.method === 'between') { + if (tooEarly) return true + if (tooLate) return false + } else if (this.method === 'before') { + if (tooLate) return false + } else if (this.method === 'after') { + if (tooEarly) return true + this.add(date) + return false + } + + return this.add(date) + }, + + /** + * + * @param {Date} date that is part of the result. + * @return {Boolean} whether we are interested in more values. + */ + add: function (date) { + this._result.push(date) + return true + }, + + /** + * 'before' and 'after' return only one date, whereas 'all' + * and 'between' an array. + * @return {Date,Array?} + */ + getValue: function () { + var res = this._result + switch (this.method) { + case 'all': + case 'between': + return res + case 'before': + case 'after': + return res.length ? res[res.length - 1] : null + } + }, + + clone: function () { + return new IterResult(this.method, this.args) + } + } + + /** + * IterResult subclass that calls a callback function on each add, + * and stops iterating when the callback returns false. + */ + var CallbackIterResult = function (method, args, iterator) { + var allowedMethods = ['all', 'between'] + if (!contains(allowedMethods, method)) { + throw new Error('Invalid method "' + method + + '". Only all and between works with iterator.') + } + this.add = function (date) { + if (iterator(date, this._result.length)) { + this._result.push(date) + return true + } + return false + } + + this.init(method, args) + } + CallbackIterResult.prototype = IterResult.prototype + + /** + * + * @param {Boolean?} noCache + * The same stratagy as RRule on cache, default to false + * @constructor + */ + + var RRuleSet = function (noCache) { + // Let RRuleSet cacheable + this._cache = noCache ? null : { + all: false, + before: [], + after: [], + between: [] + } + this._rrule = [] + this._rdate = [] + this._exrule = [] + this._exdate = [] + } + + RRuleSet.prototype = { + constructor: RRuleSet, + + /** + * @param {RRule} + */ + rrule: function (rrule) { + if (!(rrule instanceof RRule)) { + throw new TypeError(String(rrule) + ' is not RRule instance') + } + if (!contains(this._rrule.map(String), String(rrule))) { + this._rrule.push(rrule) + } + }, + + /** + * @param {Date} + */ + rdate: function (date) { + if (!(date instanceof Date)) { + throw new TypeError(String(date) + ' is not Date instance') + } + if (!contains(this._rdate.map(Number), Number(date))) { + this._rdate.push(date) + dateutil.sort(this._rdate) + } + }, + + /** + * @param {RRule} + */ + exrule: function (rrule) { + if (!(rrule instanceof RRule)) { + throw new TypeError(String(rrule) + ' is not RRule instance') + } + if (!contains(this._exrule.map(String), String(rrule))) { + this._exrule.push(rrule) + } + }, + + /** + * @param {Date} + */ + exdate: function (date) { + if (!(date instanceof Date)) { + throw new TypeError(String(date) + ' is not Date instance') + } + if (!contains(this._exdate.map(Number), Number(date))) { + this._exdate.push(date) + dateutil.sort(this._exdate) + } + }, + + valueOf: function () { + var result = [] + if (this._rrule.length) { + this._rrule.forEach(function (rrule) { + result.push('RRULE:' + rrule) + }) + } + if (this._rdate.length) { + result.push('RDATE:' + this._rdate.map(function (rdate) { + return dateutil.timeToUntilString(rdate) + }).join(',')) + } + if (this._exrule.length) { + this._exrule.forEach(function (exrule) { + result.push('EXRULE:' + exrule) + }) + } + if (this._exdate.length) { + result.push('EXDATE:' + this._exdate.map(function (exdate) { + return dateutil.timeToUntilString(exdate) + }).join(',')) + } + return result + }, + + /** + * to generate recurrence field sush as: + * ["RRULE:FREQ=YEARLY;COUNT=2;BYDAY=TU;DTSTART=19970902T010000Z","RRULE:FREQ=YEARLY;COUNT=1;BYDAY=TH;DTSTART=19970902T010000Z"] + */ + toString: function () { + return JSON.stringify(this.valueOf()) + }, + + _iter: function (iterResult) { + var _exdateHash = {} + var _exrule = this._exrule + var _accept = iterResult.accept + + function evalExdate (after, before) { + _exrule.forEach(function (rrule) { + rrule.between(after, before, true).forEach(function (date) { + _exdateHash[Number(date)] = true + }) + }) + } + + this._exdate.forEach(function (date) { + _exdateHash[Number(date)] = true + }) + + iterResult.accept = function (date) { + var dt = Number(date) + if (!_exdateHash[dt]) { + evalExdate(new Date(dt - 1), new Date(dt + 1)) + if (!_exdateHash[dt]) { + _exdateHash[dt] = true + return _accept.call(this, date) + } + } + return true + } + + if (iterResult.method === 'between') { + evalExdate(iterResult.args.after, iterResult.args.before) + iterResult.accept = function (date) { + var dt = Number(date) + if (!_exdateHash[dt]) { + _exdateHash[dt] = true + return _accept.call(this, date) + } + return true + } + } + + for (var i = 0; i < this._rdate.length; i++) { + if (!iterResult.accept(new Date(this._rdate[i]))) break + } + + this._rrule.forEach(function (rrule) { + rrule._iter(iterResult) + }) + + var res = iterResult._result + dateutil.sort(res) + switch (iterResult.method) { + case 'all': + case 'between': + return res + case 'before': + return (res.length && res[res.length - 1]) || null + case 'after': + return (res.length && res[0]) || null + default: + return null + } + }, + + /** + * Create a new RRuleSet Object completely base on current instance + */ + clone: function () { + var rrs = new RRuleSet(!!this._cache) + var i + for (i = 0; i < this._rrule.length; i++) { + rrs.rrule(this._rrule[i].clone()) + } + for (i = 0; i < this._rdate.length; i++) { + rrs.rdate(new Date(this._rdate[i])) + } + for (i = 0; i < this._exrule.length; i++) { + rrs.exrule(this._exrule[i].clone()) + } + for (i = 0; i < this._exdate.length; i++) { + rrs.exdate(new Date(this._exdate[i])) + } + return rrs + } + } + + /** + * Inherts method from RRule + * add Read interface and set RRuleSet cacheable + */ + var RRuleSetMethods = ['all', 'between', 'before', 'after', 'count', '_cacheAdd', '_cacheGet'] + RRuleSetMethods.forEach(function (method) { + RRuleSet.prototype[method] = RRule.prototype[method] + }) + + /** + * RRuleStr + * To parse a set of rrule strings + */ + + var RRuleStr = function () {} + + RRuleStr.DEFAULT_OPTIONS = { + dtstart: null, + cache: false, + unfold: false, + forceset: false, + compatible: false, + ignoretz: false, + tzinfos: null + } + + RRuleStr._freq_map = { + 'YEARLY': RRule.YEARLY, + 'MONTHLY': RRule.MONTHLY, + 'WEEKLY': RRule.WEEKLY, + 'DAILY': RRule.DAILY, + 'HOURLY': RRule.HOURLY, + 'MINUTELY': RRule.MINUTELY, + 'SECONDLY': RRule.SECONDLY + } + + RRuleStr._weekday_map = { + 'MO': 0, + 'TU': 1, + 'WE': 2, + 'TH': 3, + 'FR': 4, + 'SA': 5, + 'SU': 6 + } + + RRuleStr.prototype = { + constructor: RRuleStr, + + _handle_int: function (rrkwargs, name, value, options) { + rrkwargs[name.toLowerCase()] = parseInt(value, 10) + }, + + _handle_int_list: function (rrkwargs, name, value, options) { + rrkwargs[name.toLowerCase()] = value.split(',').map(function (x) { + return parseInt(x, 10) + }) + }, + + _handle_FREQ: function (rrkwargs, name, value, options) { + rrkwargs['freq'] = RRuleStr._freq_map[value] + }, + + _handle_UNTIL: function (rrkwargs, name, value, options) { + try { + rrkwargs['until'] = dateutil.untilStringToDate(value) + } catch (error) { + throw new Error('invalid until date') + } + }, + + _handle_WKST: function (rrkwargs, name, value, options) { + rrkwargs['wkst'] = RRuleStr._weekday_map[value] + }, + + _handle_BYWEEKDAY: function (rrkwargs, name, value, options) { + // Two ways to specify this: +1MO or MO(+1) + var splt, i, j, n, w, wday + var l = [] + var wdays = value.split(',') + + for (i = 0; i < wdays.length; i++) { + wday = wdays[i] + if (wday.indexOf('(') > -1) { + // If it's of the form TH(+1), etc. + splt = wday.split('(') + w = splt[0] + n = parseInt(splt.slice(1, -1), 10) + } else { + // # If it's of the form +1MO + for (j = 0; j < wday.length; j++) { + if ('+-0123456789'.indexOf(wday[j]) === -1) break + } + n = wday.slice(0, j) || null + w = wday.slice(j) + + if (n) n = parseInt(n, 10) + } + + var weekday = new Weekday(RRuleStr._weekday_map[w], n) + l.push(weekday) + } + rrkwargs['byweekday'] = l + }, + + _parseRfcRRule: function (line, options) { + options = options || {} + options.dtstart = options.dtstart || null + options.cache = options.cache || false + options.ignoretz = options.ignoretz || false + options.tzinfos = options.tzinfos || null + + var name, value, parts + if (line.indexOf(':') !== -1) { + parts = line.split(':') + name = parts[0] + value = parts[1] + + if (name !== 'RRULE') throw new Error('unknown parameter name') + } else { + value = line + } + + var i + var rrkwargs = {} + var pairs = value.split(';') + + for (i = 0; i < pairs.length; i++) { + parts = pairs[i].split('=') + name = parts[0].toUpperCase() + value = parts[1].toUpperCase() + + try { + this['_handle_' + name](rrkwargs, name, value, { + ignoretz: options.ignoretz, + tzinfos: options.tzinfos + }) + } catch (error) { + throw new Error("unknown parameter '" + name + "':" + value) + } + } + rrkwargs.dtstart = rrkwargs.dtstart || options.dtstart + return new RRule(rrkwargs, !options.cache) + }, + + _parseRfc: function (s, options) { + if (options.compatible) { + options.forceset = true + options.unfold = true + } + + s = s && s.toUpperCase().trim() + if (!s) throw new Error('Invalid empty string') + + var i = 0 + var line, lines + + // More info about 'unfold' option + // Go head to http://www.ietf.org/rfc/rfc2445.txt + if (options.unfold) { + lines = s.split('\n') + while (i < lines.length) { + // TODO + line = lines[i] = lines[i].replace(/\s+$/g, '') + if (!line) { + lines.splice(i, 1) + } else if (i > 0 && line[0] === ' ') { + lines[i - 1] += line.slice(1) + lines.splice(i, 1) + } else { + i += 1 + } + } + } else { + lines = s.split(/\s/) + } + + var rrulevals = [] + var rdatevals = [] + var exrulevals = [] + var exdatevals = [] + var name, value, parts, parms, parm, dtstart, rset, j, k, datestrs, datestr + + if (!options.forceset && lines.length === 1 && (s.indexOf(':') === -1 || + s.indexOf('RRULE:') === 0)) { + return this._parseRfcRRule(lines[0], { + cache: options.cache, + dtstart: options.dtstart, + ignoretz: options.ignoretz, + tzinfos: options.tzinfos + }) + } else { + for (i = 0; i < lines.length; i++) { + line = lines[i] + if (!line) continue + if (line.indexOf(':') === -1) { + name = 'RRULE' + value = line + } else { + parts = split(line, ':', 1) + name = parts[0] + value = parts[1] + } + parms = name.split(';') + if (!parms) throw new Error('empty property name') + name = parms[0] + parms = parms.slice(1) + + if (name === 'RRULE') { + for (j = 0; j < parms.length; j++) { + parm = parms[j] + throw new Error('unsupported RRULE parm: ' + parm) + } + rrulevals.push(value) + } else if (name === 'RDATE') { + for (j = 0; j < parms.length; j++) { + parm = parms[j] + if (parm !== 'VALUE=DATE-TIME') { + throw new Error('unsupported RDATE parm: ' + parm) + } + } + rdatevals.push(value) + } else if (name === 'EXRULE') { + for (j = 0; j < parms.length; j++) { + parm = parms[j] + throw new Error('unsupported EXRULE parm: ' + parm) + } + exrulevals.push(value) + } else if (name === 'EXDATE') { + for (j = 0; j < parms.length; j++) { + parm = parms[j] + if (parm !== 'VALUE=DATE-TIME') { + throw new Error('unsupported RDATE parm: ' + parm) + } + } + exdatevals.push(value) + } else if (name === 'DTSTART') { + dtstart = dateutil.untilStringToDate(value) + } else { + throw new Error('unsupported property: ' + name) + } + } + + if (options.forceset || rrulevals.length > 1 || rdatevals.length || + exrulevals.length || exdatevals.length) { + rset = new RRuleSet(!options.cache) + for (j = 0; j < rrulevals.length; j++) { + rset.rrule(this._parseRfcRRule(rrulevals[j], { + dtstart: options.dtstart || dtstart, + ignoretz: options.ignoretz, + tzinfos: options.tzinfos + })) + } + for (j = 0; j < rdatevals.length; j++) { + datestrs = rdatevals[j].split(',') + for (k = 0; k < datestrs.length; k++) { + datestr = datestrs[k] + rset.rdate(dateutil.untilStringToDate(datestr)) + } + } + for (j = 0; j < exrulevals.length; j++) { + rset.exrule(this._parseRfcRRule(exrulevals[j], { + dtstart: options.dtstart || dtstart, + ignoretz: options.ignoretz, + tzinfos: options.tzinfos + })) + } + for (j = 0; j < exdatevals.length; j++) { + datestrs = exdatevals[j].split(',') + for (k = 0; k < datestrs.length; k++) { + datestr = datestrs[k] + rset.exdate(dateutil.untilStringToDate(datestr)) + } + } + + if (options.campatiable && options.dtstart) rset.rdate(dtstart) + return rset + } else { + return this._parseRfcRRule(rrulevals[0], { + dtstart: options.dtstart || dtstart, + cache: options.cache, + ignoretz: options.ignoretz, + tzinfos: options.tzinfos + }) + } + } + }, + + parse: function (s, options) { + options = options || {} + + var invalid = [] + var keys = Object.keys(options) + var defaultKeys = Object.keys(RRuleStr.DEFAULT_OPTIONS) + + keys.forEach(function (key) { + if (!contains(defaultKeys, key)) invalid.push(key) + }, this) + + if (invalid.length) throw new Error('Invalid options: ' + invalid.join(', ')) + + // Merge in default options + defaultKeys.forEach(function (key) { + if (!contains(keys, key)) options[key] = RRuleStr.DEFAULT_OPTIONS[key] + }) + + return this._parseRfc(s, options) + } + } + + RRuleStr.prototype._handle_DTSTART = function (rrkwargs, name, value, options) { + rrkwargs[name.toLowerCase()] = dateutil.untilStringToDate(value) + } + + RRuleStr.prototype._handle_BYDAY = RRuleStr.prototype._handle_BYWEEKDAY + RRuleStr.prototype._handle_INTERVAL = RRuleStr.prototype._handle_int + RRuleStr.prototype._handle_COUNT = RRuleStr.prototype._handle_int + + ;[ + '_handle_BYSETPOS', '_handle_BYMONTH', '_handle_BYMONTHDAY', + '_handle_BYYEARDAY', '_handle_BYEASTER', '_handle_BYWEEKNO', + '_handle_BYHOUR', '_handle_BYMINUTE', '_handle_BYSECOND' + ].forEach(function (method) { + RRuleStr.prototype[method] = RRuleStr.prototype._handle_int_list + }) + + // ============================================================================= + // Export + // ============================================================================= + + // Only one RRuleStr instance for all rrule string parsing work. + var rruleStr = new RRuleStr() + var rrulestr = function () { + return rruleStr.parse.apply(rruleStr, arguments) + } + + RRule.RRule = RRule + RRule.RRuleSet = RRuleSet + RRule.rrulestr = rrulestr + return RRule + + function getnlp () { + // Lazy, runtime import to avoid circular refs. + if (!getnlp._nlp) { + if (root && root._getRRuleNLP) { + getnlp._nlp = root._getRRuleNLP(RRule) + } else if (typeof require === 'function') { + getnlp._nlp = require('./nlp')(RRule) + } else { + throw new Error('You need to include rrule/nlp.js for fromText/toText to work.') + } + } + return getnlp._nlp + } +})) diff --git a/app_v3satdemo/chrome/content/modules/default_standard/default_standard.xul b/app_v3satdemo/chrome/content/modules/default_standard/default_standard.xul new file mode 100644 index 0000000..0488464 --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/default_standard/default_standard.xul @@ -0,0 +1,11 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app_v3satdemo/chrome/content/modules/forms/forms.html b/app_v3satdemo/chrome/content/modules/forms/forms.html new file mode 100644 index 0000000..194b043 --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/forms/forms.html @@ -0,0 +1,106 @@ + + + + + + + Creorga - Creche + + + + + + + + + + + + + + + + + +
+ + + + + + + + +
+ +
+ +
+ + + + + + + + + + + + + + + + diff --git a/app_v3satdemo/chrome/content/modules/forms/forms.xul b/app_v3satdemo/chrome/content/modules/forms/forms.xul new file mode 100644 index 0000000..54eeef0 --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/forms/forms.xul @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app_v3satdemo/chrome/content/modules/forms/forms_basic.html b/app_v3satdemo/chrome/content/modules/forms/forms_basic.html new file mode 100644 index 0000000..e80e0d6 --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/forms/forms_basic.html @@ -0,0 +1,55 @@ + + + + + + + Creorga - Creche + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + diff --git a/app_v3satdemo/chrome/content/modules/forms/forms_basic.xul b/app_v3satdemo/chrome/content/modules/forms/forms_basic.xul new file mode 100644 index 0000000..b3294db --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/forms/forms_basic.xul @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app_v3satdemo/chrome/content/modules/forms/img/doc.png b/app_v3satdemo/chrome/content/modules/forms/img/doc.png new file mode 100644 index 0000000..32dbbec Binary files /dev/null and b/app_v3satdemo/chrome/content/modules/forms/img/doc.png differ diff --git a/app_v3satdemo/chrome/content/modules/forms/img/form.png b/app_v3satdemo/chrome/content/modules/forms/img/form.png new file mode 100644 index 0000000..0de6475 Binary files /dev/null and b/app_v3satdemo/chrome/content/modules/forms/img/form.png differ diff --git a/app_v3satdemo/chrome/content/modules/forms/js/forms.js b/app_v3satdemo/chrome/content/modules/forms/js/forms.js new file mode 100644 index 0000000..8c43a23 --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/forms/js/forms.js @@ -0,0 +1,86 @@ +//Source-code licensed under EUPL v1.1 ( Copyright 2016 By DKS s.à r.l. - Kilian Saffran - Luxembourg ) + +var wh= window.screen.height -400; +var myfiles = null; +var delform = null; +var cruuid = null; +function initdata(){ + curcfg.loadconfig(apppref.getpreference("support.database.currentdb.num")); + load_table_forms(); + set_infoheader(""); + } + +function load_table_forms(){ + var cname = appdb.dbquery("select uuid from creche LIMIT 1;"); + cruuid = cname.sqldata[0].uuid; + + myfiles = system.getReports(cruuid); + var atbody = new Array(); + for (var i=0;i'); + row.push(fname); + atbody.push(row); + } + + } + + $("#tbl_forms").html(""); + + + + var headerdata = getlabels("action,description"); + $("#tbl_forms").html(""); + $("#tbl_forms").dataTable({ + "language": { + "url": "js/locale/datatable_fr.json" + }, + "data": atbody, + "columns": headerdata, + "paging": false, + "scrollY": wh + "px", + "scrollCollapse": true, + "ordering": true, + "info": false, + "filter": false, + "destroy": true + }); +} + +function preview_report(fi){ + var ff = system.openFile(myfiles[fi].path); +} + + +function delete_report(fi) { + delform = fi; + confirm_delete_forms(); +} + +function dlg_addform(){ + $("#edit_forms").modal('show'); +} + +function confirm_delete_forms(){ + $("#confirm_delete_forms").modal('show'); + return false; +} + +function delete_forms(){ + OS.File.remove(myfiles[delform].path); + setTimeout(function(){load_table_forms();$("#confirm_delete_forms").modal('hide');},3000); + delform = null; + return false; +} + +function save_forms(){ + var file = $("#frmeditforms #file").val(); + var path = FileUtils.File(curcfg.path.local + system.sep() +"reports" + system.sep() + cruuid); + var newlocation= path.path + system.sep() + system.getFileName(file); + OS.File.copy(file, newlocation); + setTimeout(function(){load_table_forms();$("#edit_forms").modal('hide');},3000); +} diff --git a/app_v3satdemo/chrome/content/modules/forms/js/forms_basic.js b/app_v3satdemo/chrome/content/modules/forms/js/forms_basic.js new file mode 100644 index 0000000..a490392 --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/forms/js/forms_basic.js @@ -0,0 +1,55 @@ +//Source-code licensed under EUPL v1.1 ( Copyright 2016 By DKS s.à r.l. - Kilian Saffran - Luxembourg ) +var wh= window.screen.height -400; +var myfiles = null; +var delform = null; +var cruuid = null; +function initdata(){ + curcfg.loadconfig(apppref.getpreference("support.database.currentdb.num")); + load_table_forms(); + set_infoheader(""); + } + +function load_table_forms(){ + var cname = appdb.dbquery("select uuid from creche LIMIT 1;"); + cruuid = cname.sqldata[0].uuid; + + myfiles = system.getReports(cruuid); + var atbody = new Array(); + for (var i=0;i'); + row.push(fname.substring(0,fname.length-4)); + atbody.push(row); + } + + $("#tbl_forms").html(""); + + + + var headerdata = getlabels("action,description"); + $("#tbl_forms").html(""); + $("#tbl_forms").dataTable({ + "language": { + "url": "js/locale/datatable_fr.json" + }, + "data": atbody, + "columns": headerdata, + "paging": false, + "scrollY": wh + "px", + "scrollCollapse": true, + "ordering": true, + "info": false, + "filter": false, + "destroy": true + }); +} + +function preview_report(fi){ + var ff = system.openFile(myfiles[fi].path); +} + + + + diff --git a/app_v3satdemo/chrome/content/modules/logbook/img/logbook.png b/app_v3satdemo/chrome/content/modules/logbook/img/logbook.png new file mode 100644 index 0000000..a8c9914 Binary files /dev/null and b/app_v3satdemo/chrome/content/modules/logbook/img/logbook.png differ diff --git a/app_v3satdemo/chrome/content/modules/logbook/js/logactivity.js b/app_v3satdemo/chrome/content/modules/logbook/js/logactivity.js new file mode 100644 index 0000000..9b0711d --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/logbook/js/logactivity.js @@ -0,0 +1,326 @@ +//Source-code licensed under EUPL v1.1 ( Copyright 2016 By DKS s.à r.l. - Kilian Saffran - Luxembourg ) +var pconfig = {}; +var winh= window.innerHeight -170; +var tbllog = null; +var crecheuuid = null; +var initdate = new Date(); +var deluuid = ""; +var amonth = ['', 'Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Aôut', 'Septembre', 'Octobre','Novembre', 'Décembre']; +var myhostname = system.hostname(); + +function initdata(){ + + load_helpers(); + var configdata = apppref.getpreference("pageconfig.logactivity"); + //dump("cfdata:" + configdata +"\n"); + if ((configdata) && (configdata !== '')){ + pconfig = JSON.parse(configdata); + } + //dump("logactivity Page new loaded!\n"); + //if (!pconfig.printlayout) { + pconfig.printlayout = 'book'; + apppref.setpreference("pageconfig.logactivity",pconfig); + //} + var ccreche = appdb.dbquery("select uuid from creche LIMIT 1;"); + crecheuuid = ccreche.sqldata[0].uuid; + var edith = 270; + loadtextareas(edith); + myhostname = system.hostname(); + if (pconfig.logmonth) { + + initdate = new Date(encodeparam(pconfig.logmonth, 'month').replace(/'/g, '')); + $("#logmonth").val(pconfig.logmonth); + } else { + $("#logmonth").val(initdate.toLocaleFormat('%m.%Y')); + + pconfig.logmonth=initdate.toLocaleFormat("%m.%Y"); + apppref.setpreference("pageconfig.logactivity",pconfig); + } + var acttitle = ""; + if (pconfig.activityuuid){ + var chdata = appdb.dbquery("select logtitle from activitylog where uuid='"+ pconfig.activityuuid +"'"); + if (chdata.sqldata.length > 0){ + acttitle = chdata.sqldata[0].logtitle + " - "; + } + } + //dump(JSON.stringify(pconfig) + "\n"); + set_infoheader(acttitle + " Mois: " + amonth[parseInt(pconfig.logmonth.substring(0, 3))] + " " + pconfig.logmonth.substring(3, 8)); + + $('#logmonth').on('dp.hide', function(e) { + set_logmonth(); + }); + $("#btnedit").hide(); + $("#btnprotection").hide(); + $("#btndelete").hide(); + load_logactivity_table(); + +} + + + +function load_logactivity_table(){ + var mins = initdate.getTimezoneOffset() * -1;//dump("cur timezoneoffset:" + + "\n"); + if (mins > 0){ + mins = '+' + mins; + } + var logsql = "SELECT uuid, logtitle, strftime('%d.%m.%Y',logdatefrom) as logdatefrom, strftime('%d.%m.%Y',logdateto) as logdateto,'' || lastmodified || '' || strftime('%d.%m.%Y %H:%M',lastmodified,'"+mins+" minutes') as lastmodified,editor FROM activitylog where date(logdatefrom) between date('"+initdate.toLocaleFormat("%Y-%m")+"-01') and date('"+initdate.toLocaleFormat("%Y-%m")+"-01','+1 month','-1 day') or logdateto between date('"+initdate.toLocaleFormat("%Y-%m")+"-01') and date('"+initdate.toLocaleFormat("%Y-%m")+"-01','+1 month','-1 day');"; + var logdata = appdb.dbquery(logsql); + var headerdata = getlabels("activity,lastmodified,editor"); + $("#tbl_logactivity").html(""); + + var tblheader = ''; + + for (var h in headerdata){ + if ((headerdata[h].keyname == 'act') && (headerdata[h].class.indexOf('action1btn') == -1)){ + headerdata[h].class +=" action1btn"; + } + + tblheader += ''+ headerdata[h].title+''; + + } + tblheader += ''; + + + $("#tbl_logactivity").append("" + tblheader + ""); + $("#tbl_logactivity").append("" + tblheader + ""); + $("#tbl_logactivity").append(""); + + + for (var i in logdata.sqldata){ + var sel = ""; + var row = logdata.sqldata[i]; + if (pconfig.activityuuid && row.uuid == pconfig.activityuuid) { + sel = "selected"; + load_activitylog(); + } + // + //!= '')?'':'') +row.editor + var tr = '' + row.logtitle + '
' + row.logdatefrom +' - ' + row.logdateto + ''+ + ''+ row.lastmodified+''+''+ row.editor +''+ + ''; + + $("#tbl_logactivity").append(tr); + } + + $("#tbl_logactivity").append(""); + + + tbllog = $("#tbl_logactivity").dataTable({ + "language": { + "url": "../../web/js/locale/datatable_fr.json" + }, + "paging": false, + "ordering": true, + "bAutoWidth": false, + "scrollY": winh + "px", + "scrollCollapse": true, + "info": false, + "filter": false, + "destroy": true, + }); + + + + $('#tbl_logactivity').on( 'order.dt', function () { + pconfig.order= tbllog.fnSettings().aaSorting; + apppref.setpreference("pageconfig.logactivity",pconfig); + + } ); + + if (pconfig.order) { + + tbllog.fnSort(pconfig.order); + } + + $('#tbl_logactivity tbody').on( 'click', 'tr', function () { + //dump("select activity\n"); + if ( $(this).hasClass('selected') ) { + // $(this).removeClass('selected'); + } + else { + //dump("select activity\n"); + $("#btnedit").hide(); + $("#btnprotection").hide(); + $("#btndelete").hide(); + tbllog.$('tr.selected').removeClass('selected'); + $(this).addClass('selected'); + var curactivity = $(this).attr('data-activity'); + pconfig.activityuuid = curactivity; + var actlogsql = "SELECT editor FROM activitylog where uuid='"+ pconfig.activityuuid+"';"; + var adata = appdb.dbquery(actlogsql); + + if (adata.sqldata[0].editor == '' || adata.sqldata[0].editor == myhostname){ + $("#btnedit").show(); + $("#btndelete").show(); + } + if (adata.sqldata[0].editor != '' && adata.sqldata[0].editor != myhostname){ + $("#btnprotection").show(); + } + //setforeigneditor($(this).attr('data-editor')); + apppref.setpreference("pageconfig.logactivity",pconfig); + load_activitylog(); + } + } ); + +} + + + +function newlogactivity(){ + var nuuid = appdb.generate_uuid(); + var sql = "INSERT INTO activitylog (uuid,logtitle,logdatefrom,logdateto) VALUES ('"+nuuid+"','nouvelle Activité',date('"+initdate.toLocaleFormat('%Y-%m-%d')+"'),date('"+initdate.toLocaleFormat('%Y-%m-%d')+"'));"; + appdb.dbexec(sql); + pconfig.activityuuid=nuuid; + apppref.setpreference("pageconfig.logactivity",pconfig); + edit_activitylog(); + //load_logactivity_table(); +} + +function load_activitylog(){ + $("#btnedit").hide(); + $("#btnprotection").hide(); + $("#btndelete").hide(); + var actlogsql = "SELECT uuid, strftime('%d.%m.%Y',logdatefrom) as logdatefrom, strftime('%d.%m.%Y',logdateto) as logdateto, logtitle, logmessage,editor FROM activitylog where uuid='"+ pconfig.activityuuid+"';"; + var adata = appdb.dbquery(actlogsql); + var inftitle = ""; + if (adata.sqldata.length > 0){ + $("#activityloguuid").val(adata.sqldata[0].uuid); + $("#activitylogmessage").html(htmlUnescape(adata.sqldata[0].logmessage)) + $("#activitylogtitle").html(adata.sqldata[0].logtitle); + $("#activitylogdatefrom").html(adata.sqldata[0].logdatefrom); + $("#activitylogdateto").html(adata.sqldata[0].logdateto); + if (adata.sqldata[0].editor == '' || adata.sqldata[0].editor == myhostname){ + $("#btnedit").show(); + $("#btndelete").show(); + } + if (adata.sqldata[0].editor != '' && adata.sqldata[0].editor != myhostname){ + $("#btnprotection").show(); + } + + inftitle=adata.sqldata[0].logtitle; + }else { + $("#activityloguuid").val(0); + $("#activitylogmessage").html(""); + $("#activitylogtitle").html(''); + $("#activitylogdatefrom").html(''); + $("#activitylogdateto").html(''); + } + + set_infoheader(inftitle + " Mois: " + amonth[parseInt(pconfig.logmonth.substring(0, 3))] + " " + pconfig.logmonth.substring(3, 8)); + +} + +function edit_activitylog(){ + var actlogsql = "SELECT uuid, strftime('%d.%m.%Y',logdatefrom) as logdatefrom, strftime('%d.%m.%Y',logdateto) as logdateto, logtitle, logmessage,editor FROM activitylog where uuid='"+ pconfig.activityuuid+"';"; + + var adata = appdb.dbquery(actlogsql); + //dump("EDIT: " + JSON.stringify(chdata) + "\n"); + if ((adata.sqldata[0].editor != '') && (adata.sqldata[0].editor != myhostname)){ + system.popup("cette activité est bloqué par l'editeur: " + adata.sqldata[0].editor); + load_logactivity_table(); + return; + } + seteditorhost(); + if (adata.sqldata.length > 0){ + $('#frmeditactivitylog #loguuid').val(adata.sqldata[0].uuid); + $("#frmeditactivitylog #logtitle").val(adata.sqldata[0].logtitle); + $("#frmeditactivitylog #logdatefrom").val(adata.sqldata[0].logdatefrom); + $("#frmeditactivitylog #logdateto").val(adata.sqldata[0].logdateto); + $("#frmeditactivitylog #logmessage").summernote('reset'); + $("#frmeditactivitylog #logmessage").summernote('code',htmlUnescape(adata.sqldata[0].logmessage)); + } + $("#edit_activitylog").modal('show'); +} + +function save_activitylog(){ + var lsql = ""; + //dump($('#frmeditactivitylog #logdateto').val() + " - " + $('#frmeditactivitylog #logdatefrom').val() + "\n"); + $("#activityloguuid").val($("#frmeditactivitylog #loguuid").val()); + //var tmpdate = encodeparam(pconfig.logdate, 'date').replace(/'/g, ''); + var dt = encodeparam($("#frmeditactivitylog #logdateto").val(),"date"); + var df = encodeparam($("#frmeditactivitylog #logdatefrom").val(),"date"); + var ltitle = encodeparam($('#frmeditactivitylog #logtitle').val(),"text"); + var lmessage = encodeparam($('#frmeditactivitylog #logmessage').val(),"richtextarea"); + var uid = $("#frmeditactivitylog #loguuid").val(); + //dump(df + " - " + dt + "\n"); + var lsql = "UPDATE activitylog set logtitle="+ltitle+ + ",logmessage="+lmessage+ + ",logdatefrom=date("+df+")"+ + ",logdateto=date("+dt+") where uuid='"+uid+"';"; + //dump(lsql + "\n"); + appdb.dbexec(lsql); + removeeditorhost(); + load_logactivity_table(); + //load_activitylog(); + $("#edit_activitylog").modal('hide'); +} + +function confirm_delete_activity() { + + deluuid = $("#activityloguuid").val(); + $('#confirm_delete_logactivity').modal('show'); +} + +function delete_logactivity() { + appdb.dbexec("delete from activitylog where uuid='"+ deluuid+"';"); + load_logactivity_table(); + $('#confirm_delete_logactivity').modal('hide'); +} + +function onnextmonth() { + var tmpmonth = new Date(encodeparam(pconfig.logmonth, 'month').replace(/'/g, '')); + var nmonth = new Date(tmpmonth.getFullYear(), tmpmonth.getMonth() + 1, tmpmonth.getDate()); + pconfig.logmonth = nmonth.toLocaleFormat('%m.%Y'); + apppref.setpreference("pageconfig.logactivity", pconfig); + globelreq.send_request({ + page: 'logactivity', + module: 'logbook', + header: 'Livret des activités' + }, null); +} + +function onpreviousmonth() { + var tmpmonth = new Date(encodeparam(pconfig.logmonth, 'month').replace(/'/g, '')); + var nmonth = new Date(tmpmonth.getFullYear(), tmpmonth.getMonth() - 1, tmpmonth.getDate()); + pconfig.logmonth = nmonth.toLocaleFormat('%m.%Y'); + apppref.setpreference("pageconfig.logactivity", pconfig); + globelreq.send_request({ + page: 'logactivity', + module: 'logbook', + header: 'Livret des activités' + }, null); +} + +function set_logmonth(){ + pconfig.logmonth =$("#logmonth").val(); + apppref.setpreference("pageconfig.logactivity",pconfig); + globelreq.send_request({ + page: 'logactivity', + module: 'logbook', + header: 'Livret des activités' + }); +} + +function seteditorhost(){ + appdb.dbexec("UPDATE activitylog set editor=null where editor='"+myhostname+"';"); + appdb.dbexec("UPDATE activitylog set editor='"+myhostname+"' where uuid='"+$('#activityloguuid').val()+"';"); +} + +function removeeditorhost(){ + appdb.dbexec("UPDATE activitylog set editor=null where editor='"+myhostname+"';"); +} + + +function confirm_delete_protection(){ + $("#confirm_delete_protection").modal('show'); +} + +function delete_protection(){ + appdb.dbexec("UPDATE activitylog set editor=null where uuid='"+$('#activityloguuid').val()+"';"); + $('#editorhost').html(''); + $('#btneditorhost').removeClass('btn-danger'); + $('#btneditorhost').addClass('btn-default'); + $('#btnprotection').hide(); + load_logactivity_table(); + $("#confirm_delete_protection").modal('hide'); +} \ No newline at end of file diff --git a/app_v3satdemo/chrome/content/modules/logbook/js/logactivity_basic.js b/app_v3satdemo/chrome/content/modules/logbook/js/logactivity_basic.js new file mode 100644 index 0000000..887a475 --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/logbook/js/logactivity_basic.js @@ -0,0 +1,282 @@ +//Source-code licensed under EUPL v1.1 ( Copyright 2016 By DKS s.à r.l. - Kilian Saffran - Luxembourg ) +var pconfig = {}; +var winh= window.innerHeight -170; +var tbllog = null; +var crecheuuid = null; +var initdate = new Date(); +var deluuid = ""; +var amonth = ['', 'Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Aôut', 'Septembre', 'Octobre','Novembre', 'Décembre']; +var myhostname = system.hostname(); + +function initdata(){ + + load_helpers(); + var configdata = apppref.getpreference("pageconfig.logactivity"); + //dump("cfdata:" + configdata +"\n"); + if ((configdata) && (configdata !== '')){ + pconfig = JSON.parse(configdata); + } + //dump("logactivity Page new loaded!\n"); + //if (!pconfig.printlayout) { + pconfig.printlayout = 'book'; + apppref.setpreference("pageconfig.logactivity",pconfig); + //} + var ccreche = appdb.dbquery("select uuid from creche LIMIT 1;"); + crecheuuid = ccreche.sqldata[0].uuid; + var edith = 270; + loadtextareas(edith); + myhostname = system.hostname(); + if (pconfig.logmonth) { + + initdate = new Date(encodeparam(pconfig.logmonth, 'month').replace(/'/g, '')); + $("#logmonth").val(pconfig.logmonth); + } else { + $("#logmonth").val(initdate.toLocaleFormat('%m.%Y')); + + pconfig.logmonth=initdate.toLocaleFormat("%m.%Y"); + apppref.setpreference("pageconfig.logactivity",pconfig); + } + var acttitle = ""; + if (pconfig.activityuuid){ + var chdata = appdb.dbquery("select logtitle from activitylog where uuid='"+ pconfig.activityuuid +"'"); + if (chdata.sqldata.length > 0){ + acttitle = chdata.sqldata[0].logtitle + " - "; + } + } + //dump(JSON.stringify(pconfig) + "\n"); + set_infoheader(acttitle + " Mois: " + amonth[parseInt(pconfig.logmonth.substring(0, 3))] + " " + pconfig.logmonth.substring(3, 8)); + + $('#logmonth').on('dp.hide', function(e) { + set_logmonth(); + }); + $("#btnedit").hide(); + + load_logactivity_table(); + +} + + + +function load_logactivity_table(){ + var mins = initdate.getTimezoneOffset() * -1;//dump("cur timezoneoffset:" + + "\n"); + if (mins > 0){ + mins = '+' + mins; + } + var logsql = "SELECT uuid, logtitle, strftime('%d.%m.%Y',logdatefrom) as logdatefrom, strftime('%d.%m.%Y',logdateto) as logdateto,'' || lastmodified || '' || strftime('%d.%m.%Y %H:%M',lastmodified,'"+mins+" minutes') as lastmodified,editor FROM activitylog where date(logdatefrom) between date('"+initdate.toLocaleFormat("%Y-%m")+"-01') and date('"+initdate.toLocaleFormat("%Y-%m")+"-01','+1 month','-1 day') or logdateto between date('"+initdate.toLocaleFormat("%Y-%m")+"-01') and date('"+initdate.toLocaleFormat("%Y-%m")+"-01','+1 month','-1 day');"; + var logdata = appdb.dbquery(logsql); + var headerdata = getlabels("activity,lastmodified,editor"); + $("#tbl_logactivity").html(""); + + var tblheader = ''; + + for (var h in headerdata){ + if ((headerdata[h].keyname == 'act') && (headerdata[h].class.indexOf('action1btn') == -1)){ + headerdata[h].class +=" action1btn"; + } + + tblheader += ''+ headerdata[h].title+''; + + } + tblheader += ''; + + + $("#tbl_logactivity").append("" + tblheader + ""); + $("#tbl_logactivity").append("" + tblheader + ""); + $("#tbl_logactivity").append(""); + + + for (var i in logdata.sqldata){ + var sel = ""; + var row = logdata.sqldata[i]; + if (pconfig.activityuuid && row.uuid == pconfig.activityuuid) { + sel = "selected"; + load_activitylog(); + } + + var tr = '' + row.logtitle + '
' + row.logdatefrom +' - ' + row.logdateto + ''+ + ''+ row.lastmodified+''+''+ row.editor +''+ + ''; + + $("#tbl_logactivity").append(tr); + } + + $("#tbl_logactivity").append(""); + + + tbllog = $("#tbl_logactivity").dataTable({ + "language": { + "url": "../../web/js/locale/datatable_fr.json" + }, + "paging": false, + "ordering": true, + "bAutoWidth": false, + "scrollY": winh + "px", + "scrollCollapse": true, + "info": false, + "filter": false, + "destroy": true, + }); + + + + $('#tbl_logactivity').on( 'order.dt', function () { + pconfig.order= tbllog.fnSettings().aaSorting; + apppref.setpreference("pageconfig.logactivity",pconfig); + + } ); + + if (pconfig.order) { + + tbllog.fnSort(pconfig.order); + } + + $('#tbl_logactivity tbody').on( 'click', 'tr', function () { + //dump("select activity\n"); + if ( $(this).hasClass('selected') ) { + // $(this).removeClass('selected'); + } + else { + //dump("select activity\n"); + $("#btnedit").hide(); + tbllog.$('tr.selected').removeClass('selected'); + $(this).addClass('selected'); + var curactivity = $(this).attr('data-activity'); + var actlogsql = "SELECT editor FROM activitylog where uuid='"+ pconfig.activityuuid+"';"; + var adata = appdb.dbquery(actlogsql); + pconfig.activityuuid = curactivity; + if (adata.sqldata[0].editor == '' || adata.sqldata[0].editor == myhostname){ + $("#btnedit").show(); + } + //setforeigneditor($(this).attr('data-editor')); + apppref.setpreference("pageconfig.logactivity",pconfig); + load_activitylog(); + } + } ); + +} + + + +function newlogactivity(){ + var nuuid = appdb.generate_uuid(); + var sql = "INSERT INTO activitylog (uuid,logtitle,logdatefrom,logdateto) VALUES ('"+nuuid+"','nouvelle Activité',date('"+initdate.toLocaleFormat('%Y-%m-%d')+"'),date('"+initdate.toLocaleFormat('%Y-%m-%d')+"'));"; + appdb.dbexec(sql); + pconfig.activityuuid=nuuid; + apppref.setpreference("pageconfig.logactivity",pconfig); + edit_activitylog(); + //load_logactivity_table(); +} + +function load_activitylog(){ + $("#btnedit").hide(); + var actlogsql = "SELECT uuid, strftime('%d.%m.%Y',logdatefrom) as logdatefrom, strftime('%d.%m.%Y',logdateto) as logdateto, logtitle, logmessage,editor FROM activitylog where uuid='"+ pconfig.activityuuid+"';"; + var adata = appdb.dbquery(actlogsql); + var inftitle = ""; + if (adata.sqldata.length > 0){ + $("#activityloguuid").val(adata.sqldata[0].uuid); + $("#activitylogmessage").html(htmlUnescape(adata.sqldata[0].logmessage)) + $("#activitylogtitle").html(adata.sqldata[0].logtitle); + $("#activitylogdatefrom").html(adata.sqldata[0].logdatefrom); + $("#activitylogdateto").html(adata.sqldata[0].logdateto); + if (adata.sqldata[0].editor == '' || adata.sqldata[0].editor == myhostname){ + $("#btnedit").show(); + } + + inftitle=adata.sqldata[0].logtitle; + }else { + $("#activityloguuid").val(0); + $("#activitylogmessage").html(""); + $("#activitylogtitle").html(''); + $("#activitylogdatefrom").html(''); + $("#activitylogdateto").html(''); + } + + set_infoheader(inftitle + " Mois: " + amonth[parseInt(pconfig.logmonth.substring(0, 3))] + " " + pconfig.logmonth.substring(3, 8)); + +} + +function edit_activitylog(){ + var actlogsql = "SELECT uuid, strftime('%d.%m.%Y',logdatefrom) as logdatefrom, strftime('%d.%m.%Y',logdateto) as logdateto, logtitle, logmessage,editor FROM activitylog where uuid='"+ pconfig.activityuuid+"';"; + var adata = appdb.dbquery(actlogsql); + if ((adata.sqldata[0].editor != '') && (adata.sqldata[0].editor != myhostname)){ + system.popup("cette activité est bloqué par l'editeur: " + adata.sqldata[0].editor); + return; + } + //dump("EDIT: " + JSON.stringify(chdata) + "\n"); + seteditorhost(); + if (adata.sqldata.length > 0){ + $('#frmeditactivitylog #loguuid').val(adata.sqldata[0].uuid); + $("#frmeditactivitylog #logtitle").val(adata.sqldata[0].logtitle); + $("#frmeditactivitylog #logdatefrom").val(adata.sqldata[0].logdatefrom); + $("#frmeditactivitylog #logdateto").val(adata.sqldata[0].logdateto); + $("#frmeditactivitylog #logmessage").summernote('reset'); + $("#frmeditactivitylog #logmessage").summernote('code',htmlUnescape(adata.sqldata[0].logmessage)); + } + $("#edit_activitylog").modal('show'); +} + +function save_activitylog(){ + var lsql = ""; + //dump($('#frmeditactivitylog #logdateto').val() + " - " + $('#frmeditactivitylog #logdatefrom').val() + "\n"); + $("#activityloguuid").val($("#frmeditactivitylog #loguuid").val()); + //var tmpdate = encodeparam(pconfig.logdate, 'date').replace(/'/g, ''); + var dt = encodeparam($("#frmeditactivitylog #logdateto").val(),"date"); + var df = encodeparam($("#frmeditactivitylog #logdatefrom").val(),"date"); + var ltitle = encodeparam($('#frmeditactivitylog #logtitle').val(),"text"); + var lmessage = encodeparam($('#frmeditactivitylog #logmessage').val(),"richtextarea"); + var uid = $("#frmeditactivitylog #loguuid").val(); + //dump(df + " - " + dt + "\n"); + var lsql = "UPDATE activitylog set logtitle="+ltitle+ + ",logmessage="+lmessage+ + ",logdatefrom=date("+df+")"+ + ",logdateto=date("+dt+") where uuid='"+uid+"';"; + //dump(lsql + "\n"); + appdb.dbexec(lsql); + removeeditorhost(); + load_logactivity_table(); + //load_activitylog(); + $("#edit_activitylog").modal('hide'); +} + +function onnextmonth() { + var tmpmonth = new Date(encodeparam(pconfig.logmonth, 'month').replace(/'/g, '')); + var nmonth = new Date(tmpmonth.getFullYear(), tmpmonth.getMonth() + 1, tmpmonth.getDate()); + pconfig.logmonth = nmonth.toLocaleFormat('%m.%Y'); + apppref.setpreference("pageconfig.logactivity", pconfig); + globelreq.send_request({ + page: 'logactivity_basic', + module: 'logbook', + header: 'Livret des activités' + }, null); +} + +function onpreviousmonth() { + var tmpmonth = new Date(encodeparam(pconfig.logmonth, 'month').replace(/'/g, '')); + var nmonth = new Date(tmpmonth.getFullYear(), tmpmonth.getMonth() - 1, tmpmonth.getDate()); + pconfig.logmonth = nmonth.toLocaleFormat('%m.%Y'); + apppref.setpreference("pageconfig.logactivity", pconfig); + globelreq.send_request({ + page: 'logactivity_basic', + module: 'logbook', + header: 'Livret des activités' + }, null); +} + +function set_logmonth(){ + pconfig.logmonth =$("#logmonth").val(); + apppref.setpreference("pageconfig.logactivity",pconfig); + globelreq.send_request({ + page: 'logactivity_basic', + module: 'logbook', + header: 'Livret des activités' + }); +} + +function seteditorhost(){ + appdb.dbexec("UPDATE activitylog set editor=null where editor='"+myhostname+"';"); + appdb.dbexec("UPDATE activitylog set editor='"+myhostname+"' where uuid='"+$('#loguuid').val()+"';"); +} + +function removeeditorhost(){ + appdb.dbexec("UPDATE activitylog set editor=null where editor='"+myhostname+"';"); +} diff --git a/app_v3satdemo/chrome/content/modules/logbook/js/logactivity_free.js b/app_v3satdemo/chrome/content/modules/logbook/js/logactivity_free.js new file mode 100644 index 0000000..71973e6 --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/logbook/js/logactivity_free.js @@ -0,0 +1,327 @@ +//Source-code licensed under EUPL v1.1 ( Copyright 2016 By DKS s.à r.l. - Kilian Saffran - Luxembourg ) +var pconfig = {}; +var winh= window.innerHeight -170; +var tbllog = null; +var crecheuuid = null; +var initdate = new Date(); +var deluuid = ""; +var amonth = ['', 'Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Aôut', 'Septembre', 'Octobre','Novembre', 'Décembre']; +var myhostname = system.hostname(); + +function initdata(){ + + load_helpers(); + var configdata = apppref.getpreference("pageconfig.logactivity"); + //dump("cfdata:" + configdata +"\n"); + if ((configdata) && (configdata !== '')){ + pconfig = JSON.parse(configdata); + } + //dump("logactivity Page new loaded!\n"); + //if (!pconfig.printlayout) { + pconfig.printlayout = 'book'; + apppref.setpreference("pageconfig.logactivity",pconfig); + //} + var ccreche = appdb.dbquery("select uuid from creche LIMIT 1;"); + crecheuuid = ccreche.sqldata[0].uuid; + var edith = 270; + loadtextareas(edith); + myhostname = system.hostname(); + if (pconfig.logmonth) { + + initdate = new Date(encodeparam(pconfig.logmonth, 'month').replace(/'/g, '')); + $("#logmonth").val(pconfig.logmonth); + } else { + $("#logmonth").val(initdate.toLocaleFormat('%m.%Y')); + + pconfig.logmonth=initdate.toLocaleFormat("%m.%Y"); + apppref.setpreference("pageconfig.logactivity",pconfig); + } + var acttitle = ""; + if (pconfig.activityuuid){ + var chdata = appdb.dbquery("select logtitle from activitylog where uuid='"+ pconfig.activityuuid +"'"); + if (chdata.sqldata.length > 0){ + acttitle = chdata.sqldata[0].logtitle + " - "; + } + } + dump(JSON.stringify(pconfig) + "\n"); + set_infoheader(acttitle + " Mois: " + amonth[parseInt(pconfig.logmonth.substring(0, 3))] + " " + pconfig.logmonth.substring(3, 8)); + + $('#logmonth').on('dp.hide', function(e) { + set_logmonth(); + }); + $("#btnedit").hide(); +// $("#btnprotection").hide(); + $("#btndelete").hide(); + load_logactivity_table(); + +} + + + +function load_logactivity_table(){ + var mins = initdate.getTimezoneOffset() * -1;//dump("cur timezoneoffset:" + + "\n"); + if (mins > 0){ + mins = '+' + mins; + } + var logsql = "SELECT uuid, logtitle, strftime('%d.%m.%Y',logdatefrom) as logdatefrom, strftime('%d.%m.%Y',logdateto) as logdateto,'' || lastmodified || '' || strftime('%d.%m.%Y %H:%M',lastmodified,'"+mins+" minutes') as lastmodified,editor FROM activitylog where date(logdatefrom) between date('"+initdate.toLocaleFormat("%Y-%m")+"-01') and date('"+initdate.toLocaleFormat("%Y-%m")+"-01','+1 month','-1 day') or logdateto between date('"+initdate.toLocaleFormat("%Y-%m")+"-01') and date('"+initdate.toLocaleFormat("%Y-%m")+"-01','+1 month','-1 day');"; + var logdata = appdb.dbquery(logsql); + var headerdata = getlabels("activity,lastmodified"); + $("#tbl_logactivity").html(""); + + var tblheader = ''; + + for (var h in headerdata){ + if ((headerdata[h].keyname == 'act') && (headerdata[h].class.indexOf('action1btn') == -1)){ + headerdata[h].class +=" action1btn"; + } + + tblheader += ''+ headerdata[h].title+''; + + } + tblheader += ''; + + + $("#tbl_logactivity").append("" + tblheader + ""); + $("#tbl_logactivity").append("" + tblheader + ""); + $("#tbl_logactivity").append(""); + + + for (var i in logdata.sqldata){ + var sel = ""; + var row = logdata.sqldata[i]; + if (pconfig.activityuuid && row.uuid == pconfig.activityuuid) { + sel = "selected"; + load_activitylog(); + } + // + //!= '')?'':'') +row.editor + var tr = '' + row.logtitle + '
' + row.logdatefrom +' - ' + row.logdateto + ''+ + ''+ row.lastmodified+''+ + //''+ row.editor +''+ + ''; + + $("#tbl_logactivity").append(tr); + } + + $("#tbl_logactivity").append(""); + + + tbllog = $("#tbl_logactivity").dataTable({ + "language": { + "url": "../../web/js/locale/datatable_fr.json" + }, + "paging": false, + "ordering": true, + "bAutoWidth": false, + "scrollY": winh + "px", + "scrollCollapse": true, + "info": false, + "filter": false, + "destroy": true, + }); + + + + $('#tbl_logactivity').on( 'order.dt', function () { + pconfig.order= tbllog.fnSettings().aaSorting; + apppref.setpreference("pageconfig.logactivity",pconfig); + + } ); + + if (pconfig.order) { + + tbllog.fnSort(pconfig.order); + } + + $('#tbl_logactivity tbody').on( 'click', 'tr', function () { + //dump("select activity\n"); + if ( $(this).hasClass('selected') ) { + // $(this).removeClass('selected'); + } + else { + //dump("select activity\n"); + $("#btnedit").hide(); +// $("#btnprotection").hide(); + $("#btndelete").hide(); + tbllog.$('tr.selected').removeClass('selected'); + $(this).addClass('selected'); + var curactivity = $(this).attr('data-activity'); + pconfig.activityuuid = curactivity; + var actlogsql = "SELECT editor FROM activitylog where uuid='"+ pconfig.activityuuid+"';"; + var adata = appdb.dbquery(actlogsql); + + if (adata.sqldata[0].editor == '' || adata.sqldata[0].editor == myhostname){ + $("#btnedit").show(); + $("#btndelete").show(); + } +// if (adata.sqldata[0].editor != '' && adata.sqldata[0].editor != myhostname){ +// $("#btnprotection").show(); +// } + //setforeigneditor($(this).attr('data-editor')); + apppref.setpreference("pageconfig.logactivity",pconfig); + load_activitylog(); + } + } ); + +} + + + +function newlogactivity(){ + var nuuid = appdb.generate_uuid(); + var sql = "INSERT INTO activitylog (uuid,logtitle,logdatefrom,logdateto) VALUES ('"+nuuid+"','nouvelle Activité',date('"+initdate.toLocaleFormat('%Y-%m-%d')+"'),date('"+initdate.toLocaleFormat('%Y-%m-%d')+"'));"; + appdb.dbexec(sql); + pconfig.activityuuid=nuuid; + apppref.setpreference("pageconfig.logactivity",pconfig); + edit_activitylog(); + //load_logactivity_table(); +} + +function load_activitylog(){ + $("#btnedit").hide(); +// $("#btnprotection").hide(); + $("#btndelete").hide(); + var actlogsql = "SELECT uuid, strftime('%d.%m.%Y',logdatefrom) as logdatefrom, strftime('%d.%m.%Y',logdateto) as logdateto, logtitle, logmessage,editor FROM activitylog where uuid='"+ pconfig.activityuuid+"';"; + var adata = appdb.dbquery(actlogsql); + var inftitle = ""; + if (adata.sqldata.length > 0){ + $("#activityloguuid").val(adata.sqldata[0].uuid); + $("#activitylogmessage").html(htmlUnescape(adata.sqldata[0].logmessage)) + $("#activitylogtitle").html(adata.sqldata[0].logtitle); + $("#activitylogdatefrom").html(adata.sqldata[0].logdatefrom); + $("#activitylogdateto").html(adata.sqldata[0].logdateto); + if (adata.sqldata[0].editor == '' || adata.sqldata[0].editor == myhostname){ + $("#btnedit").show(); + $("#btndelete").show(); + } +// if (adata.sqldata[0].editor != '' && adata.sqldata[0].editor != myhostname){ +// $("#btnprotection").show(); +// } + + inftitle=adata.sqldata[0].logtitle; + }else { + $("#activityloguuid").val(0); + $("#activitylogmessage").html(""); + $("#activitylogtitle").html(''); + $("#activitylogdatefrom").html(''); + $("#activitylogdateto").html(''); + } + + set_infoheader(inftitle + " Mois: " + amonth[parseInt(pconfig.logmonth.substring(0, 3))] + " " + pconfig.logmonth.substring(3, 8)); + +} + +function edit_activitylog(){ + var actlogsql = "SELECT uuid, strftime('%d.%m.%Y',logdatefrom) as logdatefrom, strftime('%d.%m.%Y',logdateto) as logdateto, logtitle, logmessage,editor FROM activitylog where uuid='"+ pconfig.activityuuid+"';"; + + var adata = appdb.dbquery(actlogsql); + //dump("EDIT: " + JSON.stringify(chdata) + "\n"); + if ((adata.sqldata[0].editor != '') && (adata.sqldata[0].editor != myhostname)){ + system.popup("cette activité est bloqué par l'editeur: " + adata.sqldata[0].editor); + load_logactivity_table(); + return; + } + //seteditorhost(); + if (adata.sqldata.length > 0){ + $('#frmeditactivitylog #loguuid').val(adata.sqldata[0].uuid); + $("#frmeditactivitylog #logtitle").val(adata.sqldata[0].logtitle); + $("#frmeditactivitylog #logdatefrom").val(adata.sqldata[0].logdatefrom); + $("#frmeditactivitylog #logdateto").val(adata.sqldata[0].logdateto); + $("#frmeditactivitylog #logmessage").summernote('reset'); + $("#frmeditactivitylog #logmessage").summernote('code',htmlUnescape(adata.sqldata[0].logmessage)); + } + $("#edit_activitylog").modal('show'); +} + +function save_activitylog(){ + var lsql = ""; + //dump($('#frmeditactivitylog #logdateto').val() + " - " + $('#frmeditactivitylog #logdatefrom').val() + "\n"); + $("#activityloguuid").val($("#frmeditactivitylog #loguuid").val()); + //var tmpdate = encodeparam(pconfig.logdate, 'date').replace(/'/g, ''); + var dt = encodeparam($("#frmeditactivitylog #logdateto").val(),"date"); + var df = encodeparam($("#frmeditactivitylog #logdatefrom").val(),"date"); + var ltitle = encodeparam($('#frmeditactivitylog #logtitle').val(),"text"); + var lmessage = encodeparam($('#frmeditactivitylog #logmessage').val(),"richtextarea"); + var uid = $("#frmeditactivitylog #loguuid").val(); + //dump(df + " - " + dt + "\n"); + var lsql = "UPDATE activitylog set logtitle="+ltitle+ + ",logmessage="+lmessage+ + ",logdatefrom=date("+df+")"+ + ",logdateto=date("+dt+") where uuid='"+uid+"';"; + //dump(lsql + "\n"); + appdb.dbexec(lsql); + //removeeditorhost(); + load_logactivity_table(); + //load_activitylog(); + $("#edit_activitylog").modal('hide'); +} + +function confirm_delete_activity() { + + deluuid = $("#activityloguuid").val(); + $('#confirm_delete_logactivity').modal('show'); +} + +function delete_logactivity() { + appdb.dbexec("delete from activitylog where uuid='"+ deluuid+"';"); + load_logactivity_table(); + $('#confirm_delete_logactivity').modal('hide'); +} + +function onnextmonth() { + var tmpmonth = new Date(encodeparam(pconfig.logmonth, 'month').replace(/'/g, '')); + var nmonth = new Date(tmpmonth.getFullYear(), tmpmonth.getMonth() + 1, tmpmonth.getDate()); + pconfig.logmonth = nmonth.toLocaleFormat('%m.%Y'); + apppref.setpreference("pageconfig.logactivity", pconfig); + globelreq.send_request({ + page: 'logactivity', + module: 'logbook', + header: 'Livret des activités' + }, null); +} + +function onpreviousmonth() { + var tmpmonth = new Date(encodeparam(pconfig.logmonth, 'month').replace(/'/g, '')); + var nmonth = new Date(tmpmonth.getFullYear(), tmpmonth.getMonth() - 1, tmpmonth.getDate()); + pconfig.logmonth = nmonth.toLocaleFormat('%m.%Y'); + apppref.setpreference("pageconfig.logactivity", pconfig); + globelreq.send_request({ + page: 'logactivity', + module: 'logbook', + header: 'Livret des activités' + }, null); +} + +function set_logmonth(){ + pconfig.logmonth =$("#logmonth").val(); + apppref.setpreference("pageconfig.logactivity",pconfig); + globelreq.send_request({ + page: 'logactivity', + module: 'logbook', + header: 'Livret des activités' + }); +} + +//function seteditorhost(){ +// appdb.dbexec("UPDATE activitylog set editor=null where editor='"+myhostname+"';"); +// appdb.dbexec("UPDATE activitylog set editor='"+myhostname+"' where uuid='"+$('#activityloguuid').val()+"';"); +//} +// +//function removeeditorhost(){ +// appdb.dbexec("UPDATE activitylog set editor=null where editor='"+myhostname+"';"); +//} + + +//function confirm_delete_protection(){ +// $("#confirm_delete_protection").modal('show'); +//} +// +//function delete_protection(){ +// appdb.dbexec("UPDATE activitylog set editor=null where uuid='"+$('#activityloguuid').val()+"';"); +// $('#editorhost').html(''); +// $('#btneditorhost').removeClass('btn-danger'); +// $('#btneditorhost').addClass('btn-default'); +// $('#btnprotection').hide(); +// load_logactivity_table(); +// $("#confirm_delete_protection").modal('hide'); +//} \ No newline at end of file diff --git a/app_v3satdemo/chrome/content/modules/logbook/js/logchild.js b/app_v3satdemo/chrome/content/modules/logbook/js/logchild.js new file mode 100644 index 0000000..73f3284 --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/logbook/js/logchild.js @@ -0,0 +1,359 @@ +//Source-code licensed under EUPL v1.1 ( Copyright 2016 By DKS s.à r.l. - Kilian Saffran - Luxembourg ) +var pconfig = {}; +var winh= window.innerHeight -170; +var tbllog = null; +var crecheuuid = null; +var initdate = new Date(); +var myhostname = system.hostname(); + +function initdata(){ + + load_helpers(); + var configdata = apppref.getpreference("pageconfig.logchild"); + + if ((configdata) && (configdata !== '')){ + pconfig = JSON.parse(configdata); + } + //dump(JSON.stringify(pconfig) + "\n"); + //if (!pconfig.printlayout) { + pconfig.printlayout = 'logchild'; + apppref.setpreference("pageconfig.logchild",pconfig); + //} + var ccreche = appdb.dbquery("select uuid from creche LIMIT 1;"); + crecheuuid = ccreche.sqldata[0].uuid; + + loadtextareas(winh); + $("#logdate").on("dp.hide", function () { + set_logdate(); + }); + myhostname = system.hostname(); + if (pconfig.logdate) { + + initdate = new Date(encodeparam(pconfig.logdate, 'date').replace(/'/g, '')); + $("#logdate").val(pconfig.logdate); + } else { + $("#logdate").val(initdate.toLocaleFormat('%d.%m.%Y')); + pconfig.logdate = initdate.toLocaleFormat('%d.%m.%Y'); + } + var childname = ""; + if (pconfig.childuuid){ + var chdata = appdb.dbquery("select prename || ' ' || surname AS childname from childs where uuid='"+ pconfig.childuuid +"'"); + if (chdata.sqldata.length > 0){ + childname = chdata.sqldata[0].childname + " - "; + } + } + set_infoheader(childname + " Date du: " + pconfig.logdate); + load_logchild_table(); + +} + + + + + +function load_logchild_table(){ + var mins = initdate.getTimezoneOffset() * -1;//dump("cur timezoneoffset:" + + "\n"); + if (mins > 0){ + mins = '+' + mins; + } + var sqlchilds = "select distinct(ch.uuid) as uuid, ch.prename || ' ' || ch.surname AS childname, ch.checkservicenumber,gr.grpname,'' || cl.lastmodified || '' || strftime('%d.%m.%Y %H:%M',cl.lastmodified,'"+mins+" minutes') as lastmodified,cl.editor as editor from childs ch left join planning pl on (ch.uuid=pl.childuuid) left join groups gr on (pl.groupuuid=gr.uuid) left join childslog cl on (ch.uuid=cl.childuuid and logdate=date('"+initdate.toLocaleFormat('%Y-%m-%d')+"')) where date('"+ initdate.toLocaleFormat('%Y-%m-%d')+"') between pl.datebegin and pl.dateend order by childname;"; + //dump("SQLChilds:" + sqlchilds + "\n"); + var logdata = appdb.dbquery(sqlchilds); + //dump("load childs Log!\n"); + var headerdata = getlabels("childname,grpname,lastmodified,editor"); + + $("#tbl_logchild").html(""); + //if (tbllog) {tbllog.destroy();} + var tblheader = ''; + + for (var h in headerdata){ + if ((headerdata[h].keyname == 'act') && (headerdata[h].class.indexOf('action1btn') == -1)){ + headerdata[h].class +=" action1btn"; + } + if ((pconfig.hidden_columns) && (pconfig.hidden_columns.indexOf(headerdata[h].keyname) != -1)) { + if (headerdata[h].class.indexOf('colhidden') == -1) { + headerdata[h].class += " colhidden"; + } + }else { + headerdata[h].class.replace("colhidden",""); + } + tblheader += ''+ headerdata[h].title+''; + + } + tblheader += ''; + + + $("#tbl_logchild").append("" + tblheader + ""); + $("#tbl_logchild").append("" + tblheader + ""); + $("#tbl_logchild").append(""); + + //var curchld = ""; + + for (var i in logdata.sqldata){ + var row = logdata.sqldata[i]; + var sel = ""; + if (pconfig.childuuid && row.uuid == pconfig.childuuid) { + sel = "selected"; + load_childlog(); + } + var tr = ''; + //tr += ''; + tr += '' + row.childname +'
('+ row.checkservicenumber+ ')'+ ""; + tr += '' + row.grpname + ""; + tr += '' + row.lastmodified + ""; + tr += '' + row.editor + ""; + tr += ""; + $("#tbl_logchild").append(tr); + } + + $("#tbl_logchild").append(""); + + + tbllog = $("#tbl_logchild").dataTable({ + "language": { + "url": "../../web/js/locale/datatable_fr.json" + }, + "paging": false, + "ordering": true, + "bAutoWidth": false, + "scrollY": winh + "px", + "scrollCollapse": true, + "info": false, + "filter": false, + "destroy": true, + }); + +// $('#tbl_logchild').on( 'search.dt', function () { +// pconfig.filter = tbllog.api().search(); +// apppref.setpreference("pageconfig.logchild",pconfig); +// } ); + + $('#tbl_logchild').on( 'order.dt', function () { + pconfig.order= tbllog.fnSettings().aaSorting; + apppref.setpreference("pageconfig.logchild",pconfig); + + } ); +// if (pconfig.filter) { +// tbllog.fnFilter(pconfig.filter); +// } + if (pconfig.order) { + + tbllog.fnSort(pconfig.order); + } + + + + +$('#tbl_logchild tbody').on( 'click', 'tr', function () { + if ( $(this).hasClass('selected') ) { + // $(this).removeClass('selected'); + } + else { + tbllog.$('tr.selected').removeClass('selected'); + $(this).addClass('selected'); + var curchild = $(this).attr('data-child'); + pconfig.childuuid = curchild; + var chsel = appdb.dbquery("select lastmodified,editor from childslog where childuuid='"+pconfig.childuuid+"' and logdate=date('"+initdate.toLocaleFormat('%Y-%m-%d')+"');"); + //dump(JSON.stringify(chsel) + "\n"); + $("#btnadd").hide(); + $("#btnedit").hide(); + $("#btnprotection").hide(); + if (chsel.sqldata.length > 0){ + if (chsel.sqldata[0].editor == '' || chsel.sqldata[0].editor == myhostname){ + $("#btnedit").show(); + } + if (chsel.sqldata[0].editor != '' && chsel.sqldata[0].editor != myhostname){ + $("#btnprotection").show(); + } + + + load_childlog(); + } else { + $("#childlogmessage").html(""); + $("#btnadd").show(); + } + apppref.setpreference("pageconfig.logchild",pconfig); + + } + } ); +} + +function load_childlog(){ + //$("#childlogmessage").summernote('disable'); + var tmpdate = encodeparam(pconfig.logdate, 'date').replace(/'/g, ''); + var childlogsql = "select uuid,logmessage,childuuid,lastmodified,editor from childslog where logdate=date('" + tmpdate + "') and childuuid='"+ pconfig.childuuid+"';"; + var chdata = appdb.dbquery(childlogsql); + $("#btnadd").hide(); + $("#btnedit").hide(); + $("#btnprotection").hide(); + //dump(childlogsql + " -> " +JSON.stringify(chdata) + "\n"); + $("#childlogmessage").html(""); + if (chdata.sqldata.length > 0){ + if (chdata.sqldata[0].editor == '' || chdata.sqldata[0].editor == myhostname){ + $("#btnedit").show(); + } + if (chdata.sqldata[0].editor != '' && chdata.sqldata[0].editor != myhostname){ + $("#btnprotection").show(); + } + //dump("load data from db\n"); + $("#childloguuid").val(chdata.sqldata[0].uuid); + $("#childlogmessage").html(htmlUnescape(chdata.sqldata[0].logmessage)); + }else { + //$("#childlogmessage").html(""); + $("#btnadd").show(); + } + var childname = ""; + if (pconfig.childuuid){ + var chxdata = appdb.dbquery("select prename || ' ' || surname AS childname from childs where uuid='"+ pconfig.childuuid +"'"); + if (chxdata.sqldata.length > 0){ + childname = chxdata.sqldata[0].childname + " - "; + } + } + set_infoheader(childname + " Date du: " + pconfig.logdate); +} + + +function edit_childlog(){ + var childlogsql = "select uuid,logmessage,childuuid,editor from childslog where uuid='"+$("#childloguuid").val()+"';"; + var chdata = appdb.dbquery(childlogsql); + if ((chdata.sqldata[0].editor != '') && (chdata.sqldata[0].editor != myhostname)){ + system.popup("cette fiche d'évaluation est bloqué par l'editeur: " + chdata.sqldata[0].editor); + load_logchild_table()(); + return; + } + //dump("EDIT: " + JSON.stringify(chdata) + "\n"); + seteditorhost(); + if (chdata.sqldata.length > 0){ + //$('#frmeditchildlog #logmessage').summernote('reset'); + $('#frmeditchildlog #uuid').val(chdata.sqldata[0].uuid); + $('#frmeditchildlog #childuuid').val(chdata.sqldata[0].childuuid); + $("#frmeditchildlog #logmessage").summernote('reset'); + $("#frmeditchildlog #logmessage").summernote('code',htmlUnescape(chdata.sqldata[0].logmessage)); + //$('#frmeditchildlog #logmessage').val(htmlUnescape(chdata.sqldata[0].logmessage)); + } + $("#edit_childlog").modal('show'); +} + +function save_childlog(){ + var lsql = ""; + if ($('#frmeditchildlog #uuid').val() == '0'){ + //new childlog + var nuuid = appdb.generate_uuid(); + $("#childloguuid").val(nuuid); + var tmpdate = encodeparam(pconfig.logdate, 'date').replace(/'/g, ''); + lsql = "INSERT INTO childslog (uuid,childuuid,logmessage,logdate) VALUES ('"+nuuid+"','"+pconfig.childuuid+"'," + encodeparam($('#frmeditchildlog #logmessage').val(),"richtextarea")+",date('"+tmpdate+"'));"; + }else { + //update childlog; + lsql = "UPDATE childslog set logmessage="+encodeparam($('#frmeditchildlog #logmessage').val(),"richtextarea")+" where uuid='"+$("#frmeditchildlog #uuid").val()+"';"; + } + appdb.dbexec(lsql); + removeeditorhost(); + load_logchild_table(); + load_childlog(); + $("#edit_childlog").modal('hide'); +} +//$('#childlogmessage').on('summernote.focus', function() { +// seteditorhost(); +// $("#childlogmessage").summernote('enable'); +// }); +// +// +//$('#childlogmessage').on('summernote.blur', function() { +// //dump("New Data\n"); +// var lsql = ""; +// if ($("#childloguuid").val() != "0"){ +// //UPDATE +// lsql = "UPDATE childslog set logmessage="+encodeparam($('#childlogmessage').val(),"richtextarea")+" where uuid='"+$("#childloguuid").val()+"';"; +// //dump("UPDATE:" + lsql + "\n"); +// } else { +// //INSERT +// var nuuid = appdb.generate_uuid(); +// $("#childloguuid").val(nuuid); +// var tmpdate = encodeparam(pconfig.logdate, 'date').replace(/'/g, ''); +// lsql = "INSERT INTO childslog (uuid,childuuid,logmessage,logdate) VALUES ('"+nuuid+"','"+pconfig.childuuid+"'," + encodeparam($('#childlogmessage').val(),"richtextarea")+",date('"+tmpdate+"'));"; +// //dump("INSERT:" + lsql + "\n"); +// } +// appdb.dbexec(lsql); +// removeeditorhost(); +// //load_logchild_table(); +// +//}); + +function addchildlog(){ + var nuuid = appdb.generate_uuid(); + var tmpdate = encodeparam(pconfig.logdate, 'date').replace(/'/g, ''); + $("#childloguuid").val(nuuid); + var lsql = "INSERT INTO childslog (uuid,childuuid,logmessage,logdate) VALUES ('"+nuuid+"','"+pconfig.childuuid+"',null,date('"+tmpdate+"'));"; + appdb.dbexec(lsql); + edit_childlog(); + +} + + +function set_logdate(){ + pconfig.logdate =$("#logdate").val(); + //dump("set_logdate:" + JSON.stringify(pconfig) + "\n"); + apppref.setpreference("pageconfig.logchild",pconfig); + removeeditorhost(); + globelreq.send_request({ + page: 'logchild', + module: 'logbook', + data: null, + header: 'Livret d\'évaluation des enfants par date' + }); +} + + +function onnextdate() { + var tmpmonth = new Date(encodeparam(pconfig.logdate, 'date').replace(/'/g, '')); + var nmonth = new Date(tmpmonth.getFullYear(), tmpmonth.getMonth(), tmpmonth.getDate()+1); + pconfig.logdate = nmonth.toLocaleFormat('%d.%m.%Y'); + apppref.setpreference("pageconfig.logchild", pconfig); + removeeditorhost(); + globelreq.send_request({ + page: 'logchild', + module: 'logbook', + header: 'Livret d\'évaluation des enfants par date' + }, null); +} + +function onpreviousdate() { + var tmpmonth = new Date(encodeparam(pconfig.logdate, 'date').replace(/'/g, '')); + var nmonth = new Date(tmpmonth.getFullYear(), tmpmonth.getMonth(), tmpmonth.getDate()-1); + pconfig.logdate = nmonth.toLocaleFormat('%d.%m.%Y'); + apppref.setpreference("pageconfig.logchild", pconfig); + removeeditorhost(); + globelreq.send_request({ + page: 'logchild', + module: 'logbook', + header: 'Livret d\'évaluation des enfants par date' + }, null); +} + +function seteditorhost(){ + //dump('BLOCK editor '+ myhostname +"->"+ $('#childloguuid').val() +"\n"); + appdb.dbexec("UPDATE childslog set editor=null where editor='"+myhostname+"';"); + appdb.dbexec("UPDATE childslog set editor='"+myhostname+"' where uuid='"+$('#childloguuid').val()+"';"); + //load_logchild_table(); +} +// +function removeeditorhost(){ + appdb.dbexec("UPDATE childslog set editor=null where editor='"+myhostname+"';"); + //load_logchild_table(); +} + + + +function confirm_delete_protection(){ + $("#confirm_delete_protection").modal('show'); +} + +function delete_protection(){ + appdb.dbexec("UPDATE childslog set editor=null where uuid='"+$('#childloguuid').val()+"';"); + $('#editorhost').html(''); + $('#btneditorhost').removeClass('btn-danger'); + $('#btneditorhost').addClass('btn-default'); + $('#btnprotection').hide(); + load_logchild_table(); + $("#confirm_delete_protection").modal('hide'); +} diff --git a/app_v3satdemo/chrome/content/modules/logbook/js/logchild_free.js b/app_v3satdemo/chrome/content/modules/logbook/js/logchild_free.js new file mode 100644 index 0000000..701bba2 --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/logbook/js/logchild_free.js @@ -0,0 +1,359 @@ +//Source-code licensed under EUPL v1.1 ( Copyright 2016 By DKS s.à r.l. - Kilian Saffran - Luxembourg ) +var pconfig = {}; +var winh= window.innerHeight -170; +var tbllog = null; +var crecheuuid = null; +var initdate = new Date(); +var myhostname = system.hostname(); + +function initdata(){ + + load_helpers(); + var configdata = apppref.getpreference("pageconfig.logchild"); + + if ((configdata) && (configdata !== '')){ + pconfig = JSON.parse(configdata); + } + //dump(JSON.stringify(pconfig) + "\n"); + //if (!pconfig.printlayout) { + pconfig.printlayout = 'logchild'; + apppref.setpreference("pageconfig.logchild",pconfig); + //} + var ccreche = appdb.dbquery("select uuid from creche LIMIT 1;"); + crecheuuid = ccreche.sqldata[0].uuid; + + loadtextareas(winh); + $("#logdate").on("dp.hide", function () { + set_logdate(); + }); + myhostname = system.hostname(); + if (pconfig.logdate) { + + initdate = new Date(encodeparam(pconfig.logdate, 'date').replace(/'/g, '')); + $("#logdate").val(pconfig.logdate); + } else { + $("#logdate").val(initdate.toLocaleFormat('%d.%m.%Y')); + pconfig.logdate = initdate.toLocaleFormat('%d.%m.%Y'); + } + var childname = ""; + if (pconfig.childuuid){ + var chdata = appdb.dbquery("select prename || ' ' || surname AS childname from childs where uuid='"+ pconfig.childuuid +"'"); + if (chdata.sqldata.length > 0){ + childname = chdata.sqldata[0].childname + " - "; + } + } + set_infoheader(childname + " Date du: " + pconfig.logdate); + load_logchild_table(); + +} + + + + + +function load_logchild_table(){ + var mins = initdate.getTimezoneOffset() * -1;//dump("cur timezoneoffset:" + + "\n"); + if (mins > 0){ + mins = '+' + mins; + } + var sqlchilds = "select distinct(ch.uuid) as uuid, ch.prename || ' ' || ch.surname AS childname, ch.checkservicenumber,gr.grpname,'' || cl.lastmodified || '' || strftime('%d.%m.%Y %H:%M',cl.lastmodified,'"+mins+" minutes') as lastmodified,cl.editor as editor from childs ch left join planning pl on (ch.uuid=pl.childuuid) left join groups gr on (pl.groupuuid=gr.uuid) left join childslog cl on (ch.uuid=cl.childuuid and logdate=date('"+initdate.toLocaleFormat('%Y-%m-%d')+"')) where date('"+ initdate.toLocaleFormat('%Y-%m-%d')+"') between pl.datebegin and pl.dateend order by childname;"; + //dump("SQLChilds:" + sqlchilds + "\n"); + var logdata = appdb.dbquery(sqlchilds); + //dump("load childs Log!\n"); + var headerdata = getlabels("childname,grpname,lastmodified"); + + $("#tbl_logchild").html(""); + //if (tbllog) {tbllog.destroy();} + var tblheader = ''; + + for (var h in headerdata){ + if ((headerdata[h].keyname == 'act') && (headerdata[h].class.indexOf('action1btn') == -1)){ + headerdata[h].class +=" action1btn"; + } + if ((pconfig.hidden_columns) && (pconfig.hidden_columns.indexOf(headerdata[h].keyname) != -1)) { + if (headerdata[h].class.indexOf('colhidden') == -1) { + headerdata[h].class += " colhidden"; + } + }else { + headerdata[h].class.replace("colhidden",""); + } + tblheader += ''+ headerdata[h].title+''; + + } + tblheader += ''; + + + $("#tbl_logchild").append("" + tblheader + ""); + $("#tbl_logchild").append("" + tblheader + ""); + $("#tbl_logchild").append(""); + + //var curchld = ""; + + for (var i in logdata.sqldata){ + var row = logdata.sqldata[i]; + var sel = ""; + if (pconfig.childuuid && row.uuid == pconfig.childuuid) { + sel = "selected"; + load_childlog(); + } + var tr = ''; + //tr += ''; + tr += '' + row.childname +'
('+ row.checkservicenumber+ ')'+ ""; + tr += '' + row.grpname + ""; + tr += '' + row.lastmodified + ""; + //tr += '' + row.editor + ""; + tr += ""; + $("#tbl_logchild").append(tr); + } + + $("#tbl_logchild").append(""); + + + tbllog = $("#tbl_logchild").dataTable({ + "language": { + "url": "../../web/js/locale/datatable_fr.json" + }, + "paging": false, + "ordering": true, + "bAutoWidth": false, + "scrollY": winh + "px", + "scrollCollapse": true, + "info": false, + "filter": false, + "destroy": true, + }); + +// $('#tbl_logchild').on( 'search.dt', function () { +// pconfig.filter = tbllog.api().search(); +// apppref.setpreference("pageconfig.logchild",pconfig); +// } ); + + $('#tbl_logchild').on( 'order.dt', function () { + pconfig.order= tbllog.fnSettings().aaSorting; + apppref.setpreference("pageconfig.logchild",pconfig); + + } ); +// if (pconfig.filter) { +// tbllog.fnFilter(pconfig.filter); +// } + if (pconfig.order) { + + tbllog.fnSort(pconfig.order); + } + + + + +$('#tbl_logchild tbody').on( 'click', 'tr', function () { + if ( $(this).hasClass('selected') ) { + // $(this).removeClass('selected'); + } + else { + tbllog.$('tr.selected').removeClass('selected'); + $(this).addClass('selected'); + var curchild = $(this).attr('data-child'); + pconfig.childuuid = curchild; + var chsel = appdb.dbquery("select lastmodified,editor from childslog where childuuid='"+pconfig.childuuid+"' and logdate=date('"+initdate.toLocaleFormat('%Y-%m-%d')+"');"); + //dump(JSON.stringify(chsel) + "\n"); + $("#btnadd").hide(); + $("#btnedit").hide(); +// $("#btnprotection").hide(); + if (chsel.sqldata.length > 0){ +// if (chsel.sqldata[0].editor == '' || chsel.sqldata[0].editor == myhostname){ + $("#btnedit").show(); +// } +// if (chsel.sqldata[0].editor != '' && chsel.sqldata[0].editor != myhostname){ +// $("#btnprotection").show(); +// } + + + load_childlog(); + } else { + $("#childlogmessage").html(""); + $("#btnadd").show(); + } + apppref.setpreference("pageconfig.logchild",pconfig); + + } + } ); +} + +function load_childlog(){ + //$("#childlogmessage").summernote('disable'); + var tmpdate = encodeparam(pconfig.logdate, 'date').replace(/'/g, ''); + var childlogsql = "select uuid,logmessage,childuuid,lastmodified,editor from childslog where logdate=date('" + tmpdate + "') and childuuid='"+ pconfig.childuuid+"';"; + var chdata = appdb.dbquery(childlogsql); + $("#btnadd").hide(); + $("#btnedit").hide(); +// $("#btnprotection").hide(); + //dump(childlogsql + " -> " +JSON.stringify(chdata) + "\n"); + $("#childlogmessage").html(""); + if (chdata.sqldata.length > 0){ +// if (chdata.sqldata[0].editor == '' || chdata.sqldata[0].editor == myhostname){ + $("#btnedit").show(); +// } +// if (chdata.sqldata[0].editor != '' && chdata.sqldata[0].editor != myhostname){ +// $("#btnprotection").show(); +// } + //dump("load data from db\n"); + $("#childloguuid").val(chdata.sqldata[0].uuid); + $("#childlogmessage").html(htmlUnescape(chdata.sqldata[0].logmessage)); + }else { + //$("#childlogmessage").html(""); + $("#btnadd").show(); + } + var childname = ""; + if (pconfig.childuuid){ + var chxdata = appdb.dbquery("select prename || ' ' || surname AS childname from childs where uuid='"+ pconfig.childuuid +"'"); + if (chxdata.sqldata.length > 0){ + childname = chxdata.sqldata[0].childname + " - "; + } + } + set_infoheader(childname + " Date du: " + pconfig.logdate); +} + + +function edit_childlog(){ + var childlogsql = "select uuid,logmessage,childuuid,editor from childslog where uuid='"+$("#childloguuid").val()+"';"; + var chdata = appdb.dbquery(childlogsql); +// if ((chdata.sqldata[0].editor != '') && (chdata.sqldata[0].editor != myhostname)){ +// system.popup("cette fiche d'évaluation est bloqué par l'editeur: " + chdata.sqldata[0].editor); +// load_logchild_table(); +// return; +// } + //dump("EDIT: " + JSON.stringify(chdata) + "\n"); +// seteditorhost(); + if (chdata.sqldata.length > 0){ + //$('#frmeditchildlog #logmessage').summernote('reset'); + $('#frmeditchildlog #uuid').val(chdata.sqldata[0].uuid); + $('#frmeditchildlog #childuuid').val(chdata.sqldata[0].childuuid); + $("#frmeditchildlog #logmessage").summernote('reset'); + $("#frmeditchildlog #logmessage").summernote('code',htmlUnescape(chdata.sqldata[0].logmessage)); + //$('#frmeditchildlog #logmessage').val(htmlUnescape(chdata.sqldata[0].logmessage)); + } + $("#edit_childlog").modal('show'); +} + +function save_childlog(){ + var lsql = ""; + if ($('#frmeditchildlog #uuid').val() == '0'){ + //new childlog + var nuuid = appdb.generate_uuid(); + $("#childloguuid").val(nuuid); + var tmpdate = encodeparam(pconfig.logdate, 'date').replace(/'/g, ''); + lsql = "INSERT INTO childslog (uuid,childuuid,logmessage,logdate) VALUES ('"+nuuid+"','"+pconfig.childuuid+"'," + encodeparam($('#frmeditchildlog #logmessage').val(),"richtextarea")+",date('"+tmpdate+"'));"; + }else { + //update childlog; + lsql = "UPDATE childslog set logmessage="+encodeparam($('#frmeditchildlog #logmessage').val(),"richtextarea")+" where uuid='"+$("#frmeditchildlog #uuid").val()+"';"; + } + appdb.dbexec(lsql); +// removeeditorhost(); + load_logchild_table(); + load_childlog(); + $("#edit_childlog").modal('hide'); +} +//$('#childlogmessage').on('summernote.focus', function() { +// seteditorhost(); +// $("#childlogmessage").summernote('enable'); +// }); +// +// +//$('#childlogmessage').on('summernote.blur', function() { +// //dump("New Data\n"); +// var lsql = ""; +// if ($("#childloguuid").val() != "0"){ +// //UPDATE +// lsql = "UPDATE childslog set logmessage="+encodeparam($('#childlogmessage').val(),"richtextarea")+" where uuid='"+$("#childloguuid").val()+"';"; +// //dump("UPDATE:" + lsql + "\n"); +// } else { +// //INSERT +// var nuuid = appdb.generate_uuid(); +// $("#childloguuid").val(nuuid); +// var tmpdate = encodeparam(pconfig.logdate, 'date').replace(/'/g, ''); +// lsql = "INSERT INTO childslog (uuid,childuuid,logmessage,logdate) VALUES ('"+nuuid+"','"+pconfig.childuuid+"'," + encodeparam($('#childlogmessage').val(),"richtextarea")+",date('"+tmpdate+"'));"; +// //dump("INSERT:" + lsql + "\n"); +// } +// appdb.dbexec(lsql); +// removeeditorhost(); +// //load_logchild_table(); +// +//}); + +function addchildlog(){ + var nuuid = appdb.generate_uuid(); + var tmpdate = encodeparam(pconfig.logdate, 'date').replace(/'/g, ''); + $("#childloguuid").val(nuuid); + var lsql = "INSERT INTO childslog (uuid,childuuid,logmessage,logdate) VALUES ('"+nuuid+"','"+pconfig.childuuid+"',null,date('"+tmpdate+"'));"; + appdb.dbexec(lsql); + edit_childlog(); + +} + + +function set_logdate(){ + pconfig.logdate =$("#logdate").val(); + //dump("set_logdate:" + JSON.stringify(pconfig) + "\n"); + apppref.setpreference("pageconfig.logchild",pconfig); +// removeeditorhost(); + globelreq.send_request({ + page: 'logchild_free', + module: 'logbook', + data: null, + header: 'Livret d\'évaluation des enfants par date' + }); +} + + +function onnextdate() { + var tmpmonth = new Date(encodeparam(pconfig.logdate, 'date').replace(/'/g, '')); + var nmonth = new Date(tmpmonth.getFullYear(), tmpmonth.getMonth(), tmpmonth.getDate()+1); + pconfig.logdate = nmonth.toLocaleFormat('%d.%m.%Y'); + apppref.setpreference("pageconfig.logchild", pconfig); +// removeeditorhost(); + globelreq.send_request({ + page: 'logchild_free', + module: 'logbook', + header: 'Livret d\'évaluation des enfants par date' + }, null); +} + +function onpreviousdate() { + var tmpmonth = new Date(encodeparam(pconfig.logdate, 'date').replace(/'/g, '')); + var nmonth = new Date(tmpmonth.getFullYear(), tmpmonth.getMonth(), tmpmonth.getDate()-1); + pconfig.logdate = nmonth.toLocaleFormat('%d.%m.%Y'); + apppref.setpreference("pageconfig.logchild", pconfig); +// removeeditorhost(); + globelreq.send_request({ + page: 'logchild_free', + module: 'logbook', + header: 'Livret d\'évaluation des enfants par date' + }, null); +} + +//function seteditorhost(){ +// //dump('BLOCK editor '+ myhostname +"->"+ $('#childloguuid').val() +"\n"); +// appdb.dbexec("UPDATE childslog set editor=null where editor='"+myhostname+"';"); +// appdb.dbexec("UPDATE childslog set editor='"+myhostname+"' where uuid='"+$('#childloguuid').val()+"';"); +// //load_logchild_table(); +//} +//// +// function removeeditorhost(){ +// appdb.dbexec("UPDATE childslog set editor=null where editor='"+myhostname+"';"); +// //load_logchild_table(); +//} +// +// +// +//function confirm_delete_protection(){ +// $("#confirm_delete_protection").modal('show'); +//} +// +//function delete_protection(){ +// appdb.dbexec("UPDATE childslog set editor=null where uuid='"+$('#childloguuid').val()+"';"); +// $('#editorhost').html(''); +// $('#btneditorhost').removeClass('btn-danger'); +// $('#btneditorhost').addClass('btn-default'); +//// $('#btnprotection').hide(); +// load_logchild_table(); +// $("#confirm_delete_protection").modal('hide'); +//} diff --git a/app_v3satdemo/chrome/content/modules/logbook/js/logcominterne.js b/app_v3satdemo/chrome/content/modules/logbook/js/logcominterne.js new file mode 100644 index 0000000..c814574 --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/logbook/js/logcominterne.js @@ -0,0 +1,328 @@ +//Source-code licensed under EUPL v1.1 ( Copyright 2016 By DKS s.à r.l. - Kilian Saffran - Luxembourg ) +var pconfig = {}; +var winh= window.innerHeight -170; +var tbllog = null; +var crecheuuid = null; +var initdate = new Date(); +var xcurdate = new Date(); +var deluuid = ""; +var amonth = ['', 'Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Aôut', 'Septembre', 'Octobre','Novembre', 'Décembre']; +var myhostname = system.hostname(); + +function initdata(){ + + load_helpers(); + var configdata = apppref.getpreference("pageconfig.logcominterne"); + //dump("cfdata:" + configdata +"\n"); + if ((configdata) && (configdata !== '')){ + pconfig = JSON.parse(configdata); + } + + pconfig.printlayout = 'book'; + apppref.setpreference("pageconfig.logcominterne",pconfig); + + var ccreche = appdb.dbquery("select uuid from creche LIMIT 1;"); + crecheuuid = ccreche.sqldata[0].uuid; + var edith = 270; + myhostname = system.hostname(); + //dump("Current Hostname:" + myhostname + "\n"); + loadtextareas(edith); + if (pconfig.logmonth) { + + initdate = new Date(encodeparam(pconfig.logmonth, 'month').replace(/'/g, '')); + $("#logmonth").val(pconfig.logmonth); + } else { + $("#logmonth").val(initdate.toLocaleFormat('%m.%Y')); + + pconfig.logmonth=initdate.toLocaleFormat("%m.%Y"); + apppref.setpreference("pageconfig.logcominterne",pconfig); + } + var acttitle = ""; + if (pconfig.activityuuid){ + var chdata = appdb.dbquery("select logtitle from messagelog where uuid='"+ pconfig.messageuuid +"'"); + if (chdata.sqldata.length > 0){ + acttitle = chdata.sqldata[0].logtitle + " - "; + } + } + if (xcurdate.toLocaleFormat("%m.%Y") == pconfig.logmonth){ + $('#btnaddmessage').show(); + } else{ + $('#btnaddmessage').hide(); + } + set_infoheader(acttitle + " Mois: " + amonth[parseInt(pconfig.logmonth.substring(0, 3))] + " " + pconfig.logmonth.substring(3, 8)); + $('#logmonth').on('dp.hide', function(e) { + set_logmonth(); + }); + $("#btnedit").hide(); + $("#btnprotection").hide(); + $("#btndelete").hide(); + load_logmessage_table(); + +} + +function seteditorhost(){ + //dump('BLOCK editor '+ myhostname +"->"+ $('#loguuid').val() +"\n"); + appdb.dbexec("UPDATE messagelog set editor=null where editor='"+myhostname+"';"); + appdb.dbexec("UPDATE messagelog set editor='"+myhostname+"' where uuid='"+$('#cominterneloguuid').val()+"';"); + load_logmessage_table(); +} + +function removeeditorhost(){ + appdb.dbexec("UPDATE messagelog set editor=null where editor='"+myhostname+"';"); + load_logmessage_table(); +} + + +function load_logmessage_table(){ + var mins = initdate.getTimezoneOffset() * -1;//dump("cur timezoneoffset:" + + "\n"); + if (mins > 0){ + mins = '+' + mins; + } + var logsql = "SELECT uuid, logtitle,'' || logdate || '' || strftime('%d.%m.%Y',logdate) as logdate,'' || lastmodified || '' || strftime('%d.%m.%Y %H:%M',lastmodified,'"+mins+" minutes') as lastmodified,editor FROM messagelog where date(logdate) between date('"+initdate.toLocaleFormat("%Y-%m")+"-01') and date('"+initdate.toLocaleFormat("%Y-%m")+"-01','+1 month','-1 day');"; + var logdata = appdb.dbquery(logsql); + var headerdata = getlabels("subject,daydate,lastmodified,editor"); + $("#tbl_logcominterne").html(""); + //tbllog = null; + var tblheader = ''; + + for (var h in headerdata){ + if ((headerdata[h].keyname == 'act') && (headerdata[h].class.indexOf('action1btn') == -1)){ + headerdata[h].class +=" action1btn"; + } + + tblheader += ''+ headerdata[h].title+''; + + } + tblheader += ''; + + + $("#tbl_logcominterne").append("" + tblheader + ""); + $("#tbl_logcominterne").append("" + tblheader + ""); + $("#tbl_logcominterne").append(""); + + + for (var i in logdata.sqldata){ + var sel = ""; + var row = logdata.sqldata[i]; + if (pconfig.messageuuid && row.uuid == pconfig.messageuuid) { + sel = "selected"; + load_messagelog(); + } + + var tr = '' + row.logtitle + ''+ + '' + row.logdate + ''+ + ''+ row.lastmodified+''+ + ''+ row.editor +''+ + ''; + + $("#tbl_logcominterne").append(tr); + } + + $("#tbl_logcominterne").append(""); + + + tbllog = $("#tbl_logcominterne").dataTable({ + "language": { + "url": "../../web/js/locale/datatable_fr.json" + }, + "paging": false, + "ordering": true, + "bAutoWidth": false, + "scrollY": winh + "px", + "scrollCollapse": true, + "info": false, + "filter": false, + "destroy": true, + }); + + + + $('#tbl_logcominterne').on( 'order.dt', function () { + pconfig.order= tbllog.fnSettings().aaSorting; + apppref.setpreference("pageconfig.logcominterne",pconfig); + + } ); + + if (pconfig.order) { + + tbllog.fnSort(pconfig.order); + } + + + +$('#tbl_logcominterne tbody').on( 'click', 'tr', function () { + //dump("select activity\n"); + if ( $(this).hasClass('selected') ) { + // $(this).removeClass('selected'); + } + else { + $("#btnedit").hide(); + $("#btnprotection").hide(); + $("#btndelete").hide(); + tbllog.$('tr.selected').removeClass('selected'); + $(this).addClass('selected'); + var curmessage = $(this).attr('data-message'); + //setforeigneditor($(this).attr('data-editor')); + pconfig.messageuuid = curmessage; + var cilogsql = "SELECT editor FROM messagelog where uuid='"+ pconfig.messageuuid+"';"; + var cdata = appdb.dbquery(cilogsql); + if (cdata.sqldata[0].editor == '' || cdata.sqldata[0].editor == myhostname){ + $("#btnedit").show(); + $("#btndelete").show(); + } + if (cdata.sqldata[0].editor != '' && cdata.sqldata[0].editor != myhostname){ + $("#btnprotection").show(); + } + apppref.setpreference("pageconfig.logcominterne",pconfig); + load_messagelog(); + } + } ); +} + +function newlogmessage(){ + var nuuid = appdb.generate_uuid(); + var sql = "INSERT INTO messagelog (uuid,logtitle,logdate) VALUES ('"+nuuid+"','nouveau message',date('"+xcurdate.toLocaleFormat('%Y-%m-%d')+"'));"; + //dump(sql + "\n"); + appdb.dbexec(sql); + pconfig.messageuuid=nuuid; + apppref.setpreference("pageconfig.logcominterne",pconfig); + edit_cominternelog(); +} + +function edit_cominternelog(){ + var actlogsql = "SELECT uuid, strftime('%d.%m.%Y',logdate) as logdate, logtitle, logmessage,editor FROM messagelog where uuid='"+ pconfig.messageuuid+"';"; + var adata = appdb.dbquery(actlogsql); + //dump("EDIT: " + JSON.stringify(chdata) + "\n"); + if ((adata.sqldata[0].editor != '') && (adata.sqldata[0].editor != myhostname)){ + system.popup("cette communication est bloqué par l'editeur: " + adata.sqldata[0].editor); + load_logmessage_table(); + return; + } + seteditorhost(); + if (adata.sqldata.length > 0){ + $('#frmeditcominterne #loguuid').val(adata.sqldata[0].uuid); + $("#frmeditcominterne #logtitle").val(adata.sqldata[0].logtitle); + $("#frmeditcominterne #logdate").val(adata.sqldata[0].logdate); + $("#frmeditcominterne #logmessage").summernote('reset'); + $("#frmeditcominterne #logmessage").summernote('code',htmlUnescape(adata.sqldata[0].logmessage)); + } + $("#edit_cominternelog").modal('show'); +} + +function load_messagelog(){ + $("#btnedit").hide(); + $("#btnprotection").hide(); + $("#btndelete").hide(); + var actlogsql = "SELECT uuid, strftime('%d.%m.%Y',logdate) as logdate, logtitle, logmessage,editor FROM messagelog where uuid='"+ pconfig.messageuuid+"';"; + var adata = appdb.dbquery(actlogsql); + //dump(childlogsql + " -> " +JSON.stringify(chdata) + "\n"); + var inftitle = ""; + if (adata.sqldata.length > 0){ + //dump("load data from db\n"); + $("#cominterneloguuid").val(adata.sqldata[0].uuid); + $("#cominternelogmessage").html(htmlUnescape(adata.sqldata[0].logmessage)); + $("#cominternelogtitle").html(adata.sqldata[0].logtitle); + $("#cominternelogdate").html(adata.sqldata[0].logdate); + if (adata.sqldata[0].editor == '' || adata.sqldata[0].editor == myhostname){ + $("#btnedit").show(); + $("#btndelete").show(); + } + if (adata.sqldata[0].editor != '' && adata.sqldata[0].editor != myhostname){ + $("#btnprotection").show(); + } + inftitle=adata.sqldata[0].logtitle; + }else { + //dump("set data to empty fields\n"); + $("#cominterneloguuid").val('0'); + $("#cominternelogmessage").html(""); + $("#cominternelogtitle").html(""); + $("#cominternelogdate").html(""); + + } + + set_infoheader(inftitle + " Mois: " + amonth[parseInt(pconfig.logmonth.substring(0, 3))] + " " + pconfig.logmonth.substring(3, 8)); + +} + +function save_cominternelog(){ + var ld = encodeparam($("#frmeditcominterne #logdate").val(),"date"); + $("#cominterneloguuid").val($("#frmeditcominterne #loguuid").val()); + //var tmpdate = encodeparam(pconfig.logdate, 'date').replace(/'/g, ''); + var lsql = "UPDATE messagelog set logtitle="+encodeparam($('#frmeditcominterne #logtitle').val(),"text")+ + ",logmessage="+encodeparam($('#frmeditcominterne #logmessage').val(),"richtextarea")+ + ",logdate=date("+ld+") where uuid='"+$("#frmeditcominterne #loguuid").val()+"';"; + //dump("SV cominterne: "+ lsql + "\n"); + appdb.dbexec(lsql); + removeeditorhost(); + $("#edit_cominternelog").modal('hide'); + //load_logmessage_table(); + load_messagelog(); + +} + +function confirm_delete_cominterne() { + + deluuid = $("#cominterneloguuid").val(); + $('#confirm_delete_logcominterne').modal('show'); +} + +function delete_logcominterne() { + appdb.dbexec("delete from messagelog where uuid='"+ deluuid+"';"); + load_logmessage_table(); + $('#confirm_delete_logcominterne').modal('hide'); +} + +function onnextmonth() { + var tmpmonth = new Date(encodeparam(pconfig.logmonth, 'month').replace(/'/g, '')); + var nmonth = new Date(tmpmonth.getFullYear(), tmpmonth.getMonth() + 1, tmpmonth.getDate()); + pconfig.logmonth = nmonth.toLocaleFormat('%m.%Y'); + apppref.setpreference("pageconfig.logcominterne", pconfig); + removeeditorhost(); + //dump("Next Month:" +JSON.stringify(pconfig) + "\n"); + globelreq.send_request({ + page: 'logcominterne', + module: 'logbook', + header: 'Communication interne' + }, null); +} + +function onpreviousmonth() { + var tmpmonth = new Date(encodeparam(pconfig.logmonth, 'month').replace(/'/g, '')); + var nmonth = new Date(tmpmonth.getFullYear(), tmpmonth.getMonth() - 1, tmpmonth.getDate()); + pconfig.logmonth = nmonth.toLocaleFormat('%m.%Y'); + apppref.setpreference("pageconfig.logcominterne", pconfig); + removeeditorhost(); + //dump("previous Month:" +JSON.stringify(pconfig) + "\n"); + globelreq.send_request({ + page: 'logcominterne', + module: 'logbook', + header: 'Communication interne' + }, null); +} + +function set_logmonth(){ + pconfig.logmonth =$("#logmonth").val(); + apppref.setpreference("pageconfig.logcominterne",pconfig); + removeeditorhost(); + //dump("Set Month:" +JSON.stringify(pconfig) + "\n"); + globelreq.send_request({ + page: 'logcominterne', + module: 'logbook', + header: 'Communication interne' + }); +} + +function confirm_delete_protection(){ + $("#confirm_delete_protection").modal('show'); +} + +function delete_protection(){ + //dump("DELPROT: UPDATE messagelog set editor=null where uuid='"+$('#loguuid').val()+"';\n"); + appdb.dbexec("UPDATE messagelog set editor=null where uuid='"+$('#cominterneloguuid').val()+"';"); + $('#editorhost').html(''); + $('#btneditorhost').removeClass('btn-danger'); + $('#btneditorhost').addClass('btn-default'); + $('#btnprotection').hide(); + load_logmessage_table(); + $("#confirm_delete_protection").modal('hide'); +} \ No newline at end of file diff --git a/app_v3satdemo/chrome/content/modules/logbook/js/logcominterne_basic.js b/app_v3satdemo/chrome/content/modules/logbook/js/logcominterne_basic.js new file mode 100644 index 0000000..27d3135 --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/logbook/js/logcominterne_basic.js @@ -0,0 +1,296 @@ +//Source-code licensed under EUPL v1.1 ( Copyright 2016 By DKS s.à r.l. - Kilian Saffran - Luxembourg ) +var pconfig = {}; +var winh= window.innerHeight -170; +var tbllog = null; +var crecheuuid = null; +var initdate = new Date(); +var xcurdate = new Date(); +var deluuid = ""; +var amonth = ['', 'Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Aôut', 'Septembre', 'Octobre','Novembre', 'Décembre']; +var myhostname = system.hostname(); + +function initdata(){ + + load_helpers(); + var configdata = apppref.getpreference("pageconfig.logcominterne"); + //dump("cfdata:" + configdata +"\n"); + if ((configdata) && (configdata !== '')){ + pconfig = JSON.parse(configdata); + } + + pconfig.printlayout = 'book'; + apppref.setpreference("pageconfig.logcominterne",pconfig); + + var ccreche = appdb.dbquery("select uuid from creche LIMIT 1;"); + crecheuuid = ccreche.sqldata[0].uuid; + var edith = 270; + myhostname = system.hostname(); + //dump("Current Hostname:" + myhostname + "\n"); + loadtextareas(edith); + if (pconfig.logmonth) { + + initdate = new Date(encodeparam(pconfig.logmonth, 'month').replace(/'/g, '')); + $("#logmonth").val(pconfig.logmonth); + } else { + $("#logmonth").val(initdate.toLocaleFormat('%m.%Y')); + + pconfig.logmonth=initdate.toLocaleFormat("%m.%Y"); + apppref.setpreference("pageconfig.logcominterne",pconfig); + } + var acttitle = ""; + if (pconfig.activityuuid){ + var chdata = appdb.dbquery("select logtitle from messagelog where uuid='"+ pconfig.messageuuid +"'"); + if (chdata.sqldata.length > 0){ + acttitle = chdata.sqldata[0].logtitle + " - "; + } + } + if (xcurdate.toLocaleFormat("%m.%Y") == pconfig.logmonth){ + $('#btnaddmessage').show(); + } else{ + $('#btnaddmessage').hide(); + } + set_infoheader(acttitle + " Mois: " + amonth[parseInt(pconfig.logmonth.substring(0, 3))] + " " + pconfig.logmonth.substring(3, 8)); + $('#logmonth').on('dp.hide', function(e) { + set_logmonth(); + }); + $("#btnedit").hide(); + load_logmessage_table(); + +} + +function seteditorhost(){ + //dump('BLOCK editor '+ myhostname +"->"+ $('#loguuid').val() +"\n"); + appdb.dbexec("UPDATE messagelog set editor=null where editor='"+myhostname+"';"); + appdb.dbexec("UPDATE messagelog set editor='"+myhostname+"' where uuid='"+$('#loguuid').val()+"';"); + load_logmessage_table(); +} + +function removeeditorhost(){ + appdb.dbexec("UPDATE messagelog set editor=null where editor='"+myhostname+"';"); + load_logmessage_table(); +} + + +function load_logmessage_table(){ + var mins = initdate.getTimezoneOffset() * -1;//dump("cur timezoneoffset:" + + "\n"); + if (mins > 0){ + mins = '+' + mins; + } + var logsql = "SELECT uuid, logtitle,'' || logdate || '' || strftime('%d.%m.%Y',logdate) as logdate,'' || lastmodified || '' || strftime('%d.%m.%Y %H:%M',lastmodified,'"+mins+" minutes') as lastmodified,editor FROM messagelog where date(logdate) between date('"+initdate.toLocaleFormat("%Y-%m")+"-01') and date('"+initdate.toLocaleFormat("%Y-%m")+"-01','+1 month','-1 day');"; + var logdata = appdb.dbquery(logsql); + var headerdata = getlabels("subject,daydate,lastmodified,editor"); + $("#tbl_logcominterne").html(""); + //tbllog = null; + var tblheader = ''; + + for (var h in headerdata){ + if ((headerdata[h].keyname == 'act') && (headerdata[h].class.indexOf('action1btn') == -1)){ + headerdata[h].class +=" action1btn"; + } + + tblheader += ''+ headerdata[h].title+''; + + } + tblheader += ''; + + + $("#tbl_logcominterne").append("" + tblheader + ""); + $("#tbl_logcominterne").append("" + tblheader + ""); + $("#tbl_logcominterne").append(""); + + + for (var i in logdata.sqldata){ + var sel = ""; + var row = logdata.sqldata[i]; + if (pconfig.messageuuid && row.uuid == pconfig.messageuuid) { + sel = "selected"; + load_messagelog(); + } + + var tr = '' + row.logtitle + ''+ + '' + row.logdate + ''+ + ''+ row.lastmodified+''+ + ''+ row.editor +''+ + ''; + + $("#tbl_logcominterne").append(tr); + } + + $("#tbl_logcominterne").append(""); + + + tbllog = $("#tbl_logcominterne").dataTable({ + "language": { + "url": "../../web/js/locale/datatable_fr.json" + }, + "paging": false, + "ordering": true, + "bAutoWidth": false, + "scrollY": winh + "px", + "scrollCollapse": true, + "info": false, + "filter": false, + "destroy": true, + }); + + + + $('#tbl_logcominterne').on( 'order.dt', function () { + pconfig.order= tbllog.fnSettings().aaSorting; + apppref.setpreference("pageconfig.logcominterne",pconfig); + + } ); + + if (pconfig.order) { + + tbllog.fnSort(pconfig.order); + } + + + +$('#tbl_logcominterne tbody').on( 'click', 'tr', function () { + //dump("select activity\n"); + if ( $(this).hasClass('selected') ) { + // $(this).removeClass('selected'); + } + else { + $("#btnedit").hide(); + tbllog.$('tr.selected').removeClass('selected'); + $(this).addClass('selected'); + var curmessage = $(this).attr('data-message'); + //setforeigneditor($(this).attr('data-editor')); + pconfig.messageuuid = curmessage; + var cilogsql = "SELECT editor FROM messagelog where uuid='"+ pconfig.messageuuid+"';"; + var cdata = appdb.dbquery(cilogsql); + if (cdata.sqldata[0].editor == '' || cdata.sqldata[0].editor == myhostname){ + $("#btnedit").show(); + + } + + apppref.setpreference("pageconfig.logcominterne",pconfig); + load_messagelog(); + } + } ); +} + +function newlogmessage(){ + var nuuid = appdb.generate_uuid(); + var sql = "INSERT INTO messagelog (uuid,logtitle,logdate) VALUES ('"+nuuid+"','nouveau message',date('"+xcurdate.toLocaleFormat('%Y-%m-%d')+"'));"; + //dump(sql + "\n"); + appdb.dbexec(sql); + pconfig.messageuuid=nuuid; + apppref.setpreference("pageconfig.logcominterne",pconfig); + edit_cominternelog(); +} + +function edit_cominternelog(){ + var actlogsql = "SELECT uuid, strftime('%d.%m.%Y',logdate) as logdate, logtitle, logmessage,editor FROM messagelog where uuid='"+ pconfig.messageuuid+"';"; + var adata = appdb.dbquery(actlogsql); + if ((adata.sqldata[0].editor != '') && (adata.sqldata[0].editor != myhostname)){ + system.popup("cette communication est bloqué par l'editeur: " + adata.sqldata[0].editor); + load_logmessage_table(); + return; + } + //dump("EDIT: " + JSON.stringify(chdata) + "\n"); + seteditorhost(); + if (adata.sqldata.length > 0){ + $('#frmeditcominterne #loguuid').val(adata.sqldata[0].uuid); + $("#frmeditcominterne #logtitle").val(adata.sqldata[0].logtitle); + $("#frmeditcominterne #logdate").val(adata.sqldata[0].logdate); + $("#frmeditcominterne #logmessage").summernote('reset'); + $("#frmeditcominterne #logmessage").summernote('code',htmlUnescape(adata.sqldata[0].logmessage)); + } + $("#edit_cominternelog").modal('show'); +} + +function load_messagelog(){ + $("#btnedit").hide(); + $("#btnprotection").hide(); + $("#btndelete").hide(); + var actlogsql = "SELECT uuid, strftime('%d.%m.%Y',logdate) as logdate, logtitle, logmessage,editor FROM messagelog where uuid='"+ pconfig.messageuuid+"';"; + var adata = appdb.dbquery(actlogsql); + //dump(childlogsql + " -> " +JSON.stringify(chdata) + "\n"); + var inftitle = ""; + if (adata.sqldata.length > 0){ + //dump("load data from db\n"); + $("#cominterneloguuid").val(adata.sqldata[0].uuid); + $("#cominternelogmessage").html(htmlUnescape(adata.sqldata[0].logmessage)); + $("#cominternelogtitle").html(adata.sqldata[0].logtitle); + $("#cominternelogdate").html(adata.sqldata[0].logdate); + if (adata.sqldata[0].editor == '' || adata.sqldata[0].editor == myhostname){ + $("#btnedit").show(); + $("#btndelete").show(); + } + if (adata.sqldata[0].editor != '' && adata.sqldata[0].editor != myhostname){ + $("#btnprotection").show(); + } + inftitle=adata.sqldata[0].logtitle; + }else { + //dump("set data to empty fields\n"); + $("#cominterneloguuid").val('0'); + $("#cominternelogmessage").html(""); + $("#cominternelogtitle").html(""); + $("#cominternelogdate").html(""); + + } + + set_infoheader(inftitle + " Mois: " + amonth[parseInt(pconfig.logmonth.substring(0, 3))] + " " + pconfig.logmonth.substring(3, 8)); + +} + +function save_cominternelog(){ + var ld = encodeparam($("#frmeditcominterne #logdate").val(),"date"); + $("#cominterneloguuid").val($("#frmeditcominterne #loguuid").val()); + //var tmpdate = encodeparam(pconfig.logdate, 'date').replace(/'/g, ''); + var lsql = "UPDATE messagelog set logtitle="+encodeparam($('#frmeditcominterne #logtitle').val(),"text")+ + ",logmessage="+encodeparam($('#frmeditcominterne #logmessage').val(),"richtextarea")+ + ",logdate=date("+ld+") where uuid='"+$("#frmeditcominterne #loguuid").val()+"';"; + //dump("SV cominterne: "+ lsql + "\n"); + appdb.dbexec(lsql); + removeeditorhost(); + $("#edit_cominternelog").modal('hide'); + //load_logmessage_table(); + load_messagelog(); + +} + +function onnextmonth() { + var tmpmonth = new Date(encodeparam(pconfig.logmonth, 'month').replace(/'/g, '')); + var nmonth = new Date(tmpmonth.getFullYear(), tmpmonth.getMonth() + 1, tmpmonth.getDate()); + pconfig.logmonth = nmonth.toLocaleFormat('%m.%Y'); + apppref.setpreference("pageconfig.logcominterne", pconfig); + removeeditorhost(); + //dump("Next Month:" +JSON.stringify(pconfig) + "\n"); + globelreq.send_request({ + page: 'logcominterne_basic', + module: 'logbook', + header: 'Communication interne' + }, null); +} + +function onpreviousmonth() { + var tmpmonth = new Date(encodeparam(pconfig.logmonth, 'month').replace(/'/g, '')); + var nmonth = new Date(tmpmonth.getFullYear(), tmpmonth.getMonth() - 1, tmpmonth.getDate()); + pconfig.logmonth = nmonth.toLocaleFormat('%m.%Y'); + apppref.setpreference("pageconfig.logcominterne", pconfig); + removeeditorhost(); + //dump("previous Month:" +JSON.stringify(pconfig) + "\n"); + globelreq.send_request({ + page: 'logcominterne_basic', + module: 'logbook', + header: 'Communication interne' + }, null); +} + +function set_logmonth(){ + pconfig.logmonth =$("#logmonth").val(); + apppref.setpreference("pageconfig.logcominterne",pconfig); + removeeditorhost(); + //dump("Set Month:" +JSON.stringify(pconfig) + "\n"); + globelreq.send_request({ + page: 'logcominterne_basic', + module: 'logbook', + header: 'Communication interne' + }); +} + diff --git a/app_v3satdemo/chrome/content/modules/logbook/js/logcominterne_free.js b/app_v3satdemo/chrome/content/modules/logbook/js/logcominterne_free.js new file mode 100644 index 0000000..e609ef7 --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/logbook/js/logcominterne_free.js @@ -0,0 +1,328 @@ +//Source-code licensed under EUPL v1.1 ( Copyright 2016 By DKS s.à r.l. - Kilian Saffran - Luxembourg ) +var pconfig = {}; +var winh= window.innerHeight -170; +var tbllog = null; +var crecheuuid = null; +var initdate = new Date(); +var xcurdate = new Date(); +var deluuid = ""; +var amonth = ['', 'Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Aôut', 'Septembre', 'Octobre','Novembre', 'Décembre']; +var myhostname = system.hostname(); + +function initdata(){ + + load_helpers(); + var configdata = apppref.getpreference("pageconfig.logcominterne"); + //dump("cfdata:" + configdata +"\n"); + if ((configdata) && (configdata !== '')){ + pconfig = JSON.parse(configdata); + } + + pconfig.printlayout = 'book'; + apppref.setpreference("pageconfig.logcominterne",pconfig); + + var ccreche = appdb.dbquery("select uuid from creche LIMIT 1;"); + crecheuuid = ccreche.sqldata[0].uuid; + var edith = 270; + myhostname = system.hostname(); + //dump("Current Hostname:" + myhostname + "\n"); + loadtextareas(edith); + if (pconfig.logmonth) { + + initdate = new Date(encodeparam(pconfig.logmonth, 'month').replace(/'/g, '')); + $("#logmonth").val(pconfig.logmonth); + } else { + $("#logmonth").val(initdate.toLocaleFormat('%m.%Y')); + + pconfig.logmonth=initdate.toLocaleFormat("%m.%Y"); + apppref.setpreference("pageconfig.logcominterne",pconfig); + } + var acttitle = ""; + if (pconfig.activityuuid){ + var chdata = appdb.dbquery("select logtitle from messagelog where uuid='"+ pconfig.messageuuid +"'"); + if (chdata.sqldata.length > 0){ + acttitle = chdata.sqldata[0].logtitle + " - "; + } + } + if (xcurdate.toLocaleFormat("%m.%Y") == pconfig.logmonth){ + $('#btnaddmessage').show(); + } else{ + $('#btnaddmessage').hide(); + } + set_infoheader(acttitle + " Mois: " + amonth[parseInt(pconfig.logmonth.substring(0, 3))] + " " + pconfig.logmonth.substring(3, 8)); + $('#logmonth').on('dp.hide', function(e) { + set_logmonth(); + }); + $("#btnedit").hide(); +// $("#btnprotection").hide(); + $("#btndelete").hide(); + load_logmessage_table(); + +} + +//function seteditorhost(){ +// //dump('BLOCK editor '+ myhostname +"->"+ $('#loguuid').val() +"\n"); +// appdb.dbexec("UPDATE messagelog set editor=null where editor='"+myhostname+"';"); +// appdb.dbexec("UPDATE messagelog set editor='"+myhostname+"' where uuid='"+$('#cominterneloguuid').val()+"';"); +// load_logmessage_table(); +//} +// +//function removeeditorhost(){ +// appdb.dbexec("UPDATE messagelog set editor=null where editor='"+myhostname+"';"); +// load_logmessage_table(); +//} + + +function load_logmessage_table(){ + var mins = initdate.getTimezoneOffset() * -1;//dump("cur timezoneoffset:" + + "\n"); + if (mins > 0){ + mins = '+' + mins; + } + var logsql = "SELECT uuid, logtitle,'' || logdate || '' || strftime('%d.%m.%Y',logdate) as logdate,'' || lastmodified || '' || strftime('%d.%m.%Y %H:%M',lastmodified,'"+mins+" minutes') as lastmodified,editor FROM messagelog where date(logdate) between date('"+initdate.toLocaleFormat("%Y-%m")+"-01') and date('"+initdate.toLocaleFormat("%Y-%m")+"-01','+1 month','-1 day');"; + var logdata = appdb.dbquery(logsql); + var headerdata = getlabels("subject,daydate,lastmodified"); + $("#tbl_logcominterne").html(""); + //tbllog = null; + var tblheader = ''; + + for (var h in headerdata){ + if ((headerdata[h].keyname == 'act') && (headerdata[h].class.indexOf('action1btn') == -1)){ + headerdata[h].class +=" action1btn"; + } + + tblheader += ''+ headerdata[h].title+''; + + } + tblheader += ''; + + + $("#tbl_logcominterne").append("" + tblheader + ""); + $("#tbl_logcominterne").append("" + tblheader + ""); + $("#tbl_logcominterne").append(""); + + + for (var i in logdata.sqldata){ + var sel = ""; + var row = logdata.sqldata[i]; + if (pconfig.messageuuid && row.uuid == pconfig.messageuuid) { + sel = "selected"; + load_messagelog(); + } + + var tr = '' + row.logtitle + ''+ + '' + row.logdate + ''+ + ''+ row.lastmodified+''+ +// ''+ row.editor +''+ + ''; + + $("#tbl_logcominterne").append(tr); + } + + $("#tbl_logcominterne").append(""); + + + tbllog = $("#tbl_logcominterne").dataTable({ + "language": { + "url": "../../web/js/locale/datatable_fr.json" + }, + "paging": false, + "ordering": true, + "bAutoWidth": false, + "scrollY": winh + "px", + "scrollCollapse": true, + "info": false, + "filter": false, + "destroy": true, + }); + + + + $('#tbl_logcominterne').on( 'order.dt', function () { + pconfig.order= tbllog.fnSettings().aaSorting; + apppref.setpreference("pageconfig.logcominterne",pconfig); + + } ); + + if (pconfig.order) { + + tbllog.fnSort(pconfig.order); + } + + + +$('#tbl_logcominterne tbody').on( 'click', 'tr', function () { + //dump("select activity\n"); + if ( $(this).hasClass('selected') ) { + // $(this).removeClass('selected'); + } + else { + $("#btnedit").hide(); +// $("#btnprotection").hide(); + $("#btndelete").hide(); + tbllog.$('tr.selected').removeClass('selected'); + $(this).addClass('selected'); + var curmessage = $(this).attr('data-message'); + //setforeigneditor($(this).attr('data-editor')); + pconfig.messageuuid = curmessage; + var cilogsql = "SELECT editor FROM messagelog where uuid='"+ pconfig.messageuuid+"';"; + var cdata = appdb.dbquery(cilogsql); +// if (cdata.sqldata[0].editor == '' || cdata.sqldata[0].editor == myhostname){ + $("#btnedit").show(); + $("#btndelete").show(); +// } +// if (cdata.sqldata[0].editor != '' && cdata.sqldata[0].editor != myhostname){ +// $("#btnprotection").show(); +// } + apppref.setpreference("pageconfig.logcominterne",pconfig); + load_messagelog(); + } + } ); +} + +function newlogmessage(){ + var nuuid = appdb.generate_uuid(); + var sql = "INSERT INTO messagelog (uuid,logtitle,logdate) VALUES ('"+nuuid+"','nouveau message',date('"+xcurdate.toLocaleFormat('%Y-%m-%d')+"'));"; + //dump(sql + "\n"); + appdb.dbexec(sql); + pconfig.messageuuid=nuuid; + apppref.setpreference("pageconfig.logcominterne",pconfig); + edit_cominternelog(); +} + +function edit_cominternelog(){ + var actlogsql = "SELECT uuid, strftime('%d.%m.%Y',logdate) as logdate, logtitle, logmessage,editor FROM messagelog where uuid='"+ pconfig.messageuuid+"';"; + var adata = appdb.dbquery(actlogsql); + //dump("EDIT: " + JSON.stringify(chdata) + "\n"); +// if ((adata.sqldata[0].editor != '') && (adata.sqldata[0].editor != myhostname)){ +// system.popup("cette communication est bloqué par l'editeur: " + adata.sqldata[0].editor); +// load_logmessage_table(); +// return; +// } +// seteditorhost(); + if (adata.sqldata.length > 0){ + $('#frmeditcominterne #loguuid').val(adata.sqldata[0].uuid); + $("#frmeditcominterne #logtitle").val(adata.sqldata[0].logtitle); + $("#frmeditcominterne #logdate").val(adata.sqldata[0].logdate); + $("#frmeditcominterne #logmessage").summernote('reset'); + $("#frmeditcominterne #logmessage").summernote('code',htmlUnescape(adata.sqldata[0].logmessage)); + } + $("#edit_cominternelog").modal('show'); +} + +function load_messagelog(){ + $("#btnedit").hide(); +// $("#btnprotection").hide(); + $("#btndelete").hide(); + var actlogsql = "SELECT uuid, strftime('%d.%m.%Y',logdate) as logdate, logtitle, logmessage,editor FROM messagelog where uuid='"+ pconfig.messageuuid+"';"; + var adata = appdb.dbquery(actlogsql); + //dump(childlogsql + " -> " +JSON.stringify(chdata) + "\n"); + var inftitle = ""; + if (adata.sqldata.length > 0){ + //dump("load data from db\n"); + $("#cominterneloguuid").val(adata.sqldata[0].uuid); + $("#cominternelogmessage").html(htmlUnescape(adata.sqldata[0].logmessage)); + $("#cominternelogtitle").html(adata.sqldata[0].logtitle); + $("#cominternelogdate").html(adata.sqldata[0].logdate); + if (adata.sqldata[0].editor == '' || adata.sqldata[0].editor == myhostname){ + $("#btnedit").show(); + $("#btndelete").show(); + } +// if (adata.sqldata[0].editor != '' && adata.sqldata[0].editor != myhostname){ +// $("#btnprotection").show(); +// } + inftitle=adata.sqldata[0].logtitle; + }else { + //dump("set data to empty fields\n"); + $("#cominterneloguuid").val('0'); + $("#cominternelogmessage").html(""); + $("#cominternelogtitle").html(""); + $("#cominternelogdate").html(""); + + } + + set_infoheader(inftitle + " Mois: " + amonth[parseInt(pconfig.logmonth.substring(0, 3))] + " " + pconfig.logmonth.substring(3, 8)); + +} + +function save_cominternelog(){ + var ld = encodeparam($("#frmeditcominterne #logdate").val(),"date"); + $("#cominterneloguuid").val($("#frmeditcominterne #loguuid").val()); + //var tmpdate = encodeparam(pconfig.logdate, 'date').replace(/'/g, ''); + var lsql = "UPDATE messagelog set logtitle="+encodeparam($('#frmeditcominterne #logtitle').val(),"text")+ + ",logmessage="+encodeparam($('#frmeditcominterne #logmessage').val(),"richtextarea")+ + ",logdate=date("+ld+") where uuid='"+$("#frmeditcominterne #loguuid").val()+"';"; + //dump("SV cominterne: "+ lsql + "\n"); + appdb.dbexec(lsql); + //removeeditorhost(); + $("#edit_cominternelog").modal('hide'); + //load_logmessage_table(); + load_messagelog(); + +} + +function confirm_delete_cominterne() { + + deluuid = $("#cominterneloguuid").val(); + $('#confirm_delete_logcominterne').modal('show'); +} + +function delete_logcominterne() { + appdb.dbexec("delete from messagelog where uuid='"+ deluuid+"';"); + load_logmessage_table(); + $('#confirm_delete_logcominterne').modal('hide'); +} + +function onnextmonth() { + var tmpmonth = new Date(encodeparam(pconfig.logmonth, 'month').replace(/'/g, '')); + var nmonth = new Date(tmpmonth.getFullYear(), tmpmonth.getMonth() + 1, tmpmonth.getDate()); + pconfig.logmonth = nmonth.toLocaleFormat('%m.%Y'); + apppref.setpreference("pageconfig.logcominterne", pconfig); + removeeditorhost(); + //dump("Next Month:" +JSON.stringify(pconfig) + "\n"); + globelreq.send_request({ + page: 'logcominterne_free', + module: 'logbook', + header: 'Communication interne' + }, null); +} + +function onpreviousmonth() { + var tmpmonth = new Date(encodeparam(pconfig.logmonth, 'month').replace(/'/g, '')); + var nmonth = new Date(tmpmonth.getFullYear(), tmpmonth.getMonth() - 1, tmpmonth.getDate()); + pconfig.logmonth = nmonth.toLocaleFormat('%m.%Y'); + apppref.setpreference("pageconfig.logcominterne", pconfig); + removeeditorhost(); + //dump("previous Month:" +JSON.stringify(pconfig) + "\n"); + globelreq.send_request({ + page: 'logcominterne_free', + module: 'logbook', + header: 'Communication interne' + }, null); +} + +function set_logmonth(){ + pconfig.logmonth =$("#logmonth").val(); + apppref.setpreference("pageconfig.logcominterne",pconfig); + removeeditorhost(); + //dump("Set Month:" +JSON.stringify(pconfig) + "\n"); + globelreq.send_request({ + page: 'logcominterne_free', + module: 'logbook', + header: 'Communication interne' + }); +} + +//function confirm_delete_protection(){ +// $("#confirm_delete_protection").modal('show'); +//} +// +//function delete_protection(){ +// //dump("DELPROT: UPDATE messagelog set editor=null where uuid='"+$('#loguuid').val()+"';\n"); +// appdb.dbexec("UPDATE messagelog set editor=null where uuid='"+$('#cominterneloguuid').val()+"';"); +// $('#editorhost').html(''); +// $('#btneditorhost').removeClass('btn-danger'); +// $('#btneditorhost').addClass('btn-default'); +// $('#btnprotection').hide(); +// load_logmessage_table(); +// $("#confirm_delete_protection").modal('hide'); +//} \ No newline at end of file diff --git a/app_v3satdemo/chrome/content/modules/logbook/js/logstaff.js b/app_v3satdemo/chrome/content/modules/logbook/js/logstaff.js new file mode 100644 index 0000000..5b33b73 --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/logbook/js/logstaff.js @@ -0,0 +1 @@ +//Source-code licensed under EUPL v1.1 ( Copyright 2016 By DKS s.à r.l. - Kilian Saffran - Luxembourg ) \ No newline at end of file diff --git a/app_v3satdemo/chrome/content/modules/logbook/logactivity.html b/app_v3satdemo/chrome/content/modules/logbook/logactivity.html new file mode 100644 index 0000000..6899b45 --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/logbook/logactivity.html @@ -0,0 +1,165 @@ + + + + + + Livret des activités + + + + + + + + + + + + + + + + + + + + +
+
+
+ du mois: + + +
+ + + + +
+
+ + + + + + + +
+
+ + + +
+ + +
Titre:
+
Date: au
+ +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + diff --git a/app_v3satdemo/chrome/content/modules/logbook/logactivity_basic.html b/app_v3satdemo/chrome/content/modules/logbook/logactivity_basic.html new file mode 100644 index 0000000..22054fd --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/logbook/logactivity_basic.html @@ -0,0 +1,125 @@ + + + + + + Livret des activités + + + + + + + + + + + + + + + + + + + + +
+
+
+ du mois: + + +
+ + + + +
+
+ + + + + + + +
+
+ +
+ + +
Titre:
+
Date début: au
+ +
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + diff --git a/app_v3satdemo/chrome/content/modules/logbook/logbook.xul b/app_v3satdemo/chrome/content/modules/logbook/logbook.xul new file mode 100644 index 0000000..559a5b5 --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/logbook/logbook.xul @@ -0,0 +1,19 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app_v3satdemo/chrome/content/modules/logbook/logbook_basic.xul b/app_v3satdemo/chrome/content/modules/logbook/logbook_basic.xul new file mode 100644 index 0000000..802382e --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/logbook/logbook_basic.xul @@ -0,0 +1,18 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app_v3satdemo/chrome/content/modules/logbook/logchild.html b/app_v3satdemo/chrome/content/modules/logbook/logchild.html new file mode 100644 index 0000000..ffcf1e3 --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/logbook/logchild.html @@ -0,0 +1,126 @@ + + + + + + Livret d'évaluation des enfants + + + + + + + + + + + + + + + + + + + +
+
+
+ date du: + + +
+ + + +
+
+ + + + + + + +
+ +
+ + + +
+
+
+ +
+ + +
+ + + + + + + + + + + + + + + + + + + + + diff --git a/app_v3satdemo/chrome/content/modules/logbook/logcominterne.html b/app_v3satdemo/chrome/content/modules/logbook/logcominterne.html new file mode 100644 index 0000000..0647cf3 --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/logbook/logcominterne.html @@ -0,0 +1,165 @@ + + + + + + Communication interne + + + + + + + + + + + + + + + + + + + + +
+
+
+ du mois: + + +
+ + + + +
+
+ + + + + + + +
+
+ + + +
+ +
Titre:
+
Date:
+ +
+ +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + diff --git a/app_v3satdemo/chrome/content/modules/logbook/logcominterne_basic.html b/app_v3satdemo/chrome/content/modules/logbook/logcominterne_basic.html new file mode 100644 index 0000000..d7f4513 --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/logbook/logcominterne_basic.html @@ -0,0 +1,163 @@ + + + + + + Communication interne + + + + + + + + + + + + + + + + + + + + +
+
+
+ du mois: + + +
+ + + + +
+
+ + + + + + + +
+
+ +
+ +
Titre:
+
Date:
+ +
+ +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + diff --git a/app_v3satdemo/chrome/content/modules/logbook/logstaff.html b/app_v3satdemo/chrome/content/modules/logbook/logstaff.html new file mode 100644 index 0000000..e69de29 diff --git a/app_v3satdemo/chrome/content/modules/multisite/img/profile.png b/app_v3satdemo/chrome/content/modules/multisite/img/profile.png new file mode 100644 index 0000000..d8caf3f Binary files /dev/null and b/app_v3satdemo/chrome/content/modules/multisite/img/profile.png differ diff --git a/app_v3satdemo/chrome/content/modules/multisite/js/multisite_reader.js b/app_v3satdemo/chrome/content/modules/multisite/js/multisite_reader.js new file mode 100644 index 0000000..a8cb8c9 --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/multisite/js/multisite_reader.js @@ -0,0 +1,58 @@ +//Source-code licensed under EUPL v1.1 ( Copyright 2016 By DKS s.à r.l. - Kilian Saffran - Luxembourg ) +var multisite_reader = { + + getsites: function(){ + var childnames = apppref.branch.getChildList("",{}); + var clmsel = document.getElementsByClassName("clmultisite"); + var cnum = apppref.getpreference("support.database.currentdb.num"); + var xx = document.getElementById("pop_multisites"); + while(xx.hasChildNodes()){ + xx.removeChild(xx.firstChild); + } + for (var i in childnames){ + if ((childnames[i].substring(0,16) == 'support.database') && (childnames[i].indexOf("currentdb") == -1) && (childnames[i].indexOf("currentsite") == -1)) { + //dump("gsites:" + childnames[i] + "\n"); + var sitecfg = JSON.parse(apppref.getpreference(childnames[i])); + //dump("Creche loader: " + JSON.stringify(sitecfg) + "A: "+system.fileexists( sitecfg.path.local ) + system.sep() + sitecfg.uuid + ".sqlite")+ "\n"); + //if (system.fileexists( sitecfg.path.local + system.sep() + sitecfg.uuid + ".sqlite")){ + if (!document.getElementById("mnumultisite_" + sitecfg.dbnum)) + { + var item = document.createElementNS("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul", "menuitem"); + item.setAttribute("label", sitecfg.name); + item.setAttribute("id", "mnumultisite_" + sitecfg.dbnum); + item.setAttribute("value", sitecfg.dbnum); + item.setAttribute("class","clmultisite"); + item.setAttribute("oncommand","multisite_reader.setcurrent('"+ sitecfg.dbnum +"');"); + document.getElementById("pop_multisites").appendChild(item); + }else { + document.getElementById("mnumultisite_" + sitecfg.dbnum).setAttribute("label", sitecfg.name); + if (sitecfg.dbnum == cnum) { + document.getElementById("curcreche").value=sitecfg.name; + } + } + //} + + } + } + }, + setcurrent:function(num){ + if (!num) { + return; + } + apppref.setpreference("support.database.currentdb.num",num); + + curcfg.loadconfig(num); + //appdb.check_defaultdata(); + ///dump("creche loaded: " + curcfg.dbfile.local +"\ndbnum: " + curcfg.dbnum + "\nName: " + curcfg.name + "\n"); + if (system.fileexists(curcfg.dbfile.local)) { + navigation.update_dbname(curcfg.name); + var lastpageopened = JSON.parse(apppref.getpreference("pageconfig.lastpage")); + if (lastpageopened.view != "") { + navigation.load_appview(lastpageopened.view,lastpageopened.module,null,lastpageopened.header); + } + } else { + //dump("File : '" + curdb + "' does not exist!\n"); + } + + } +} \ No newline at end of file diff --git a/app_v3satdemo/chrome/content/modules/multisite/multisite.xul b/app_v3satdemo/chrome/content/modules/multisite/multisite.xul new file mode 100644 index 0000000..bdcdc3e --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/multisite/multisite.xul @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + + + + diff --git a/app_v3satdemo/chrome/content/modules/presences/img/presence.png b/app_v3satdemo/chrome/content/modules/presences/img/presence.png new file mode 100644 index 0000000..545d90b Binary files /dev/null and b/app_v3satdemo/chrome/content/modules/presences/img/presence.png differ diff --git a/app_v3satdemo/chrome/content/modules/presences/js/dailypresences.js b/app_v3satdemo/chrome/content/modules/presences/js/dailypresences.js new file mode 100644 index 0000000..703fe84 --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/presences/js/dailypresences.js @@ -0,0 +1,366 @@ +//Source-code licensed under EUPL v1.1 ( Copyright 2016 By DKS s.à r.l. - Kilian Saffran - Luxembourg ) + +var pconfig = { + "groupuuid": null, + "presday": null +}; +var weekdates = null; +var initdate = new Date(); +var cdate = initdate.toLocaleFormat('%Y-%m-%d'); +var wh= window.innerHeight -190; +//var groups = {}; +var tableheadssql = ""; +var weekday = initdate.getDay(); + +var presencedropdown = ''; + +var wdays = ["sun","mon","tue","wed","thu","fri","sat"]; + +var presences = { + "btn-default": 0, + "btn-success": 1, + "btn-warning": 2, + "btn-danger": 3, + "btn-info": 4, + "btn-primary": 5 +}; + +var presenceids = { + 0: { + text: "default", + class: "btn-default", + icon: '' + + }, + 1: { + text: "success", + class: "btn-success", + icon: '' + + }, + 2: { + text: "warning", + class: "btn-warning", + icon: '' + }, + 3: { + text: "danger", + class: "btn-danger", + icon: '' + }, + 4: { + text: "info", + class: "btn-info", + icon: '' + }, + 5: { + text: "primary", + class: "btn-primary", + icon: '' + } +}; + +function initdata() { + load_helpers(); + var pdata = apppref.getpreference("pageconfig.dailypresences"); + if (pdata !== '') { + pconfig = JSON.parse(pdata); + } + pconfig.printlayout = 'multilist'; + apppref.setpreference("pageconfig.dailypresences",pconfig); + + if (pconfig.presday) { + initdate = new Date(encodeparam(pconfig.presday, 'date').replace(/'/g, '')); + + $("#presday").val(pconfig.presday); + }else{ + $("#presday").val(initdate.toLocaleFormat('%d.%m.%Y')); + } + $("#presday").on("dp.hide", function () { + change_day(); + }); + set_infoheader(""); + cdate = initdate.toLocaleFormat('%Y-%m-%d'); + + //get initdate weekday + var daygroupsql = "SELECT ch.uuid as childuuid,gr.uuid as groupuuid, gr.grpname, grpname,ch.prename || ' ' || ch.surname AS childname,pr.begintime1 as begintime1,pr.endtime1 as endtime1,pr.begintime2 as begintime2,pr.endtime2 as endtime2,pr.status as status,pr.lunch as lunch, " + + wdays[weekday] +"timebegin as plantimebegin, "+wdays[weekday]+"timeend as plantimeend,"+ + wdays[weekday] +"timebegin2 as plantimebegin2, "+wdays[weekday]+"timeend2 as plantimeend2,"+ + wdays[weekday]+"lunch as planlunch ,case when pr.childuuid is not null then 'upd' else 'ins' end as ddltype " + + " FROM planning pl " + + " LEFT JOIN childs ch ON (pl.childuuid=ch.uuid) " + + " LEFT JOIN groups gr ON (pl.groupuuid=gr.uuid) " + + " LEFT JOIN presence pr ON (pr.childuuid=ch.uuid and pr.daydate='"+cdate+"') " + + " WHERE pl.datebegin <= '"+cdate+"' AND pl.dateend >= '"+cdate+"';"; + + set_infoheader("Date du " + initdate.toLocaleFormat("%d.%m.%Y")); + + var dpresdata = appdb.dbquery(daygroupsql); + + var headerdata = getlabels("act,grpname,childname,effectiftime,status,plannedtime"); + + var headdata = ""; + for (var h=0;h'; + } + } + $("#tbldailypresences > thead").append('' + headdata+ ''); + var dpdata = dpresdata.sqldata; + + for (var b in dpdata){ + var row = dpdata[b]; + var rdata = ''+ row.grpname +''+row.childname+''; + + rdata += '
'+ + ' de: '+ + '
' + + '
'+ + ' à: '+ + '
'+ + '
' + + 'et de: '+ + '
' + + '
'+ + ' à: '+ + '
'+ + '
' + + '

'; + rdata += ''+ + '
' + + '' +'
' + + '
' + + ''; + rdata += ''+row.plantimebegin +' - ' + row.plantimeend + ''+ ((row.planlunch == "1")?' ()':'')+''+ + ((row.plantimebegin2 != '')?'
'+row.plantimebegin2 +' - ' + row.plantimeend2 + '':'')+ + ''; + + + $("#tbldailypresences > tbody").append(''+rdata+''); + } + // // + $("#tbldailypresences").dataTable({ + "language": { + "url": "js/locale/datatable_fr.json" + }, + "paging": false, + "scrollY": wh + "px", + "scrollCollapse": true, + "info": false, + "ordering": true, + "filter": true, + "destroy": true + }); + + + $('input[id^="txt"]').focusout(function(e){ + + var fdata = $(this).attr('id').split("_"); + var timeval = $(this).val(); + var ddltype = $("#" + fdata[1]+ "_ddltype").html(); + + var psqltime = ""; + + if (timeval == ''){ + return; + } + if (ddltype == 'upd'){ + + if (fdata[0] == "txtbegintime1"){ + psqltime = "update presence set begintime1='"+timeval+"' where childuuid='"+fdata[1]+"' and daydate=date('"+initdate.toLocaleFormat('%Y-%m-%d')+"');"; + } else if (fdata[0] == "txtendtime1"){ + psqltime = "update presence set endtime1='"+timeval+"' where childuuid='"+fdata[1]+"' and daydate=date('"+initdate.toLocaleFormat('%Y-%m-%d')+"');"; + } else if (fdata[0] == "txtbegintime2"){ + psqltime = "update presence set begintime2='"+timeval+"' where childuuid='"+fdata[1]+"' and daydate=date('"+initdate.toLocaleFormat('%Y-%m-%d')+"');"; + } else if (fdata[0] == "txtendtime2") { + psqltime = "update presence set endtime2='"+timeval+"' where childuuid='"+fdata[1]+"' and daydate=date('"+initdate.toLocaleFormat('%Y-%m-%d')+"');"; + } else { + return false; + } + } else if (ddltype == 'ins'){ + var xfield = fdata[0].substring(3); + var psqltime = "INSERT INTO presence (status,childuuid,daydate,lunch,"+xfield+") VALUES "; + psqltime += "(1,'" + fdata[1] + "',date('" + initdate.toLocaleFormat("%Y-%m-%d") + "')," + + ((($("#planlunch_" + fdata[1]).exists()) && ($("#planlunch_" + fdata[1]).html() != ''))?"'1'":'null') + ",'"+timeval+"')"; + } + if (psqltime !== ""){ + + appdb.dbexec(psqltime); + if (ddltype == 'ins'){ + $("#" + fdata[1]+ "_ddltype").html('upd'); + } + } + + }); + + setallpresences(); + +} + + +function setlunch(childuuid,status) { + + var lunch = 'null'; + if (status == 1) { + $("#btn_" + childuuid+ "_lunch").removeClass('btn-default'); + $("#btn_" + childuuid+ "_lunch").addClass('btn-success'); + lunch = "'1'"; + } else { + $("#btn_" + childuuid+ "_lunch").removeClass('btn-success'); + $("#btn_" + childuuid+ "_lunch").addClass('btn-default'); + lunch = "'0'"; + } + + appdb.dbexec("update presence set lunch=" + lunch + " where daydate=date('" + initdate.toLocaleFormat("%Y-%m-%d") + "') and childuuid='" + childuuid + "';"); + +} + +function setpresence(childuuid,newstatus) { + + var ddltype = $("#" + childuuid + "_ddltype").html(); + + var usql = ""; + if (newstatus == 0){ + $("#btn_" + childuuid + "_lunch").css("display", "none"); + } else { + $("#btn_" + childuuid + "_lunch").css("display", ""); + } + if ((ddltype=='ins') && (newstatus != 0)){ + + usql = "INSERT INTO presence (status,childuuid,daydate,lunch) "+ + "VALUES (" + newstatus + ",'" + childuuid + "',date('" + initdate.toLocaleFormat("%Y-%m-%d") + "')," + + ((($("#planlunch_" + childuuid).exists()) && ($("#planlunch_" + childuuid).html() != '') && newstatus==1)?"'1'":'null') + ");"; + + } else if (newstatus == 0) { + + usql = "DELETE FROM presence where childuuid='" + childuuid + "' and daydate=date('" + initdate.toLocaleFormat("%Y-%m-%d") + "');"; + $("#txtbegintime1_" + childuuid).val(''); + $("#txtendtime1_" + childuuid).val(''); + $("#txtbegintime2_" + childuuid).val(''); + $("#txtendtime2_" + childuuid).val(''); + $("#btn_" + childuuid+ "_lunch").removeClass('btn-success'); + $("#btn_" + childuuid+ "_lunch").addClass('btn-default'); + + } else { + var usql = "UPDATE presence SET status=" + newstatus + " where childuuid='" + childuuid + "' and daydate=date('" + initdate.toLocaleFormat("%Y-%m-%d") + "');"; + + } + appdb.dbexec(usql); + $("#" + childuuid + "_ddltype").html("upd"); + $("#btn_" + childuuid).attr("class","btn " + presenceids[newstatus].class + " dropdown-toggle"); + $("#btn_" + childuuid).html(presenceids[newstatus].icon); + + if (newstatus != 0 && newstatus != 1 && newstatus != 5){ + $("#frm_" + childuuid).css("display","none"); + }else { + $("#frm_" + childuuid).css("display",""); + } + + if (($("#planlunch_" + childuuid).exists()) && ($("#planlunch_" + childuuid).html() != '') && newstatus == 1){ + setlunch(childuuid,1); + } + +} + +function setalltopresent(){ + $('body').css('cursor','wait'); + + $("button[id^=btn_]").each( + function(){ + if (($(this).attr("id").indexOf("lunch") == -1) && ($(this).attr("class").indexOf("btn-default") != -1)) { + var btnspl =$(this).attr("id").split("_"); + setpresence(btnspl[1],1); + } + + } + ); + $('body').css('cursor','auto'); +} + +function change_day() { + pconfig.presday = $('#presday').val(); + + apppref.setpreference("pageconfig.dailypresences",pconfig); + globelreq.send_request({ + page: 'dailypresences', + module: 'presences', + data: null, + header: 'Présences par jour' + }); +} + +function setallpresences() { + var prsql = "select daydate,childuuid,status,lunch from presence where daydate = date('" +initdate.toLocaleFormat("%Y-%m-%d") + "');"; + var presdata = appdb.dbquery(prsql); + presdata = presdata.sqldata; + if (presdata) { + for (var p in presdata) { + if ($("#btn_" + presdata[p].childuuid ).exists()) { + $("#btn_" + presdata[p].childuuid).attr("class","btn " + presenceids[presdata[p].status].class + " dropdown-toggle"); + $("#btn_" + presdata[p].childuuid).html(presenceids[presdata[p].status].icon); + $("#btn_" + presdata[p].childuuid + "_lunch").css("display",""); + } + if (presdata[p].lunch == 1){ + $("#btn_" + presdata[p].childuuid + "_lunch").attr("class","btn btn-success dropdown-toggle"); + + } + + + } + } +} + +function onpreviousday() { + pconfig.presday = $('#presday').val(); + var tmpweek = new Date(encodeparam(pconfig.presday, 'date').replace(/'/g, '')); + var nweek = new Date(tmpweek.getFullYear(), tmpweek.getMonth(), tmpweek.getDate()-1); + if (nweek.getDay() == 0){ + nweek = new Date(tmpweek.getFullYear(), tmpweek.getMonth(), tmpweek.getDate()-3); + } + if (nweek.getDay() == 6){ + nweek = new Date(tmpweek.getFullYear(), tmpweek.getMonth(), tmpweek.getDate()-2); + } + pconfig.presday = nweek.toLocaleFormat('%d.%m.%Y'); + apppref.setpreference("pageconfig.dailypresences",pconfig); + globelreq.send_request({ + page: 'dailypresences', + module: 'presences', + data: null, + header: 'Présences par jour' + }); +} + +function onnextday() { + pconfig.presday = $('#presday').val(); + var tmpweek = new Date(encodeparam(pconfig.presday, 'date').replace(/'/g, '')); + var nweek = new Date(tmpweek.getFullYear(), tmpweek.getMonth(), tmpweek.getDate()+1); + if (nweek.getDay() == 0){ + nweek = new Date(tmpweek.getFullYear(), tmpweek.getMonth(), tmpweek.getDate()+2); + } + if (nweek.getDay() == 6){ + nweek = new Date(tmpweek.getFullYear(), tmpweek.getMonth(), tmpweek.getDate()+3); + } + pconfig.presday = nweek.toLocaleFormat('%d.%m.%Y'); + apppref.setpreference("pageconfig.dailypresences",pconfig); + globelreq.send_request({ + page: 'dailypresences', + module: 'presences', + data: null, + header: 'Présences par jour' + }); +} + + + + diff --git a/app_v3satdemo/chrome/content/modules/presences/js/weeklypresences.js b/app_v3satdemo/chrome/content/modules/presences/js/weeklypresences.js new file mode 100644 index 0000000..17434a3 --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/presences/js/weeklypresences.js @@ -0,0 +1,447 @@ +//Source-code licensed under EUPL v1.1 ( Copyright 2016 By DKS s.à r.l. - Kilian Saffran - Luxembourg ) + +var pconfig = { + "groupuuid": null, + "presweek": null +}; +var weekdates = null; +var initdate = new Date(); +var cdate = initdate.toLocaleFormat('%Y-%m-%d'); +var wh= window.innerHeight -190; +var groups = {}; +var tableheadssql = ""; + +var presences = { + "btn-default": { + class: "btn-success", + icon: '', + nextdata: 1 + }, + "btn-success": { + class: "btn-warning", + icon: '', + nextdata: 2 + }, + "btn-warning": { + class: "btn-danger", + icon: '', + nextdata: 3 + }, + "btn-danger": { + class: "btn-info", + icon: '', + nextdata: 4 + }, + "btn-info": { + class: "btn-primary", + icon: '', + nextdata: 5 + }, + "btn-primary": { + class: "btn-default", + icon: '', + nextdata: null + } +}; + +var presenceids = { + 1: { + class: "btn-success", + icon: '', + nextdata: 1 + }, + 2: { + class: "btn-warning", + icon: '', + nextdata: 2 + }, + 3: { + class: "btn-danger", + icon: '', + nextdata: 3 + }, + 4: { + class: "btn-primary", + icon: '', + nextdata: 4 + }, + 5: { + class: "btn-info", + icon: '', + nextdata: 5 + } +}; + +function initdata() { + load_helpers(); + var pdata = apppref.getpreference("pageconfig.weeklypresences"); + if (pdata !== '') { + pconfig = JSON.parse(pdata); + } + pconfig.printlayout = 'multilist'; + apppref.setpreference("pageconfig.weeklypresences",pconfig); + + if (pconfig.presweek) { + initdate = new Date(encodeparam(pconfig.presweek, 'date').replace(/'/g, '')); + + $("#presweek").val(pconfig.presweek); + }else{ + $("#presweek").val(initdate.toLocaleFormat('%d.%m.%Y')); + } + $("#presweek").on("dp.hide", function () { + change_week(); + }); + set_infoheader(""); + cdate = initdate.toLocaleFormat('%Y-%m-%d'); + + weekdates = appdb.dbquery("select weekdaybegin as mon, date(weekdaybegin,'+1 day') as tue, date(weekdaybegin,'+2 days') as wed, date(weekdaybegin,'+3 days') as thu, date(weekdaybegin,'+4 days') as fri from (select case when strftime('%w','" + cdate + "') = '1' then strftime('%Y-%m-%d','" + cdate + "') else strftime('%Y-%m-%d', date(date('" + cdate + "','-7 days'),'weekday 1')) end as weekdaybegin) "); + + tableheadssql = "select 'Lundi, ' || strftime('%d.%m.%Y',weekdaybegin) as monday, 'Mardi, ' || strftime('%d.%m.%Y',date(weekdaybegin,'+1 day')) as tuesday, 'Mercredi, ' || strftime('%d.%m.%Y',date(weekdaybegin,'+2 days')) as wednesday, 'Jeudi, ' || strftime('%d.%m.%Y',date(weekdaybegin,'+3 days')) as thursday, 'Vendredi, ' || strftime('%d.%m.%Y',date(weekdaybegin,'+4 days')) as friday from (select case when strftime('%w','" + cdate + "') = '1' then strftime('%Y-%m-%d','" + cdate + "') else strftime('%Y-%m-%d', date(date('" + cdate + "','-7 days'),'weekday 1')) end as weekdaybegin);"; + + var tblheads = appdb.dbquery(tableheadssql); + weekdates = weekdates.sqldata[0]; + + groups = appdb.dbquery("select grpname,uuid as groupuuid,minage,maxage from groups UNION select 'Pas de groupe' as grpname,null as uuid,(select max(maxage) from creche) as minage,(select max(maxage) from creche) as maxage order by minage,maxage"); + set_infoheader("Semaine du " + tblheads.sqldata[0].monday + " au " + tblheads.sqldata[0].friday); + groups = groups.sqldata; + + var tblgrpsql = "SELECT childname, MAX(monplan) AS monplan, MAX(monlunchplan) AS monlunchplan, MAX(tueplan) AS tueplan, MAX(tuelunchplan) AS tuelunchplan, MAX(wedplan) AS wedplan, MAX(wedlunchplan) AS wedlunchplan, MAX(thuplan) AS thuplan, MAX(thulunchplan) AS thulunchplan, MAX(friplan) AS friplan, MAX(frilunchplan) AS frilunchplan FROM ( SELECT ' ' || ch.prename || ' ' || ch.surname AS childname, "; + var vacdates = appdb.dbqueryarray("select CAST(strftime(\"%w\",vacancydate) as INT)-1 as wdnum from vacancy where vacancydate between '"+weekdates.mon+"' and '"+weekdates.fri+"' and vacancydateto is null;" ); + var vacrem = ""; + if (vacdates) { + vacdates = vacdates.sqldata; + vacrem = vacdates.join(','); + } + var wda = ['mon','tue','wed','thu','fri']; + var wdsa = []; + for (var w in wda){ + + if (vacrem.indexOf(w) != -1) { + wdsa.push("null as "+wda[w]+"plan,null AS "+wda[w]+"lunchplan"); + } else { + wdsa.push(" CASE WHEN pl."+wda[w]+"timebegin != '00:00' AND '" + weekdates[wda[w]] + "' BETWEEN pl.datebegin AND pl.dateend THEN '' ELSE '' END AS "+wda[w]+"plan, " + + " CASE WHEN pl."+wda[w]+"timebegin != '00:00' AND '" + weekdates[wda[w]] + "' BETWEEN pl.datebegin AND pl.dateend THEN '' ELSE NULL END AS "+wda[w]+"lunchplan" ); + } + + } + tblgrpsql += wdsa.join(",") + + " FROM planning pl LEFT JOIN childs ch ON ( pl.childuuid=ch.uuid) LEFT JOIN groups gr ON ( pl.groupuuid=gr.uuid) WHERE gr.uuid%%goupuuid%% AND (( pl.datebegin <= '" + weekdates.mon + "' AND pl.dateend >= '" + weekdates.mon + "') OR ( pl.datebegin <= '" + weekdates.tue + "' AND pl.dateend >= '" + weekdates.tue + "') OR ( pl.datebegin <= '" + weekdates.wed + "' AND pl.dateend >= '" + weekdates.wed + "') OR ( pl.datebegin <= '" + weekdates.thu + "' AND pl.dateend >= '" + weekdates.thu + "') OR ( pl.datebegin <= '" + weekdates.fri + "' AND pl.dateend >= '" + weekdates.fri + "') ) ) chpr GROUP BY childname ORDER BY childname"; + for (var g in groups) { + if (groups[g].groupuuid !== '') { + $("#dlg_changegrp #groupuuid").append(''); + } + + $("#tabgrouphead").append('
  • ' + groups[g].grpname + '
  • '); + $("#tabgroupbody").append('
    '); + var cgrpsql = tblgrpsql.replace('%%goupuuid%%', "='" +groups[g].groupuuid + "'"); + if (groups[g].groupuuid === '') { + cgrpsql = tblgrpsql.replace('%%goupuuid%%', " is null"); + } + + var grpdata = appdb.dbqueryarray(cgrpsql); + + var headerdata = getlabels(grpdata.sqlhead.join(",")); + + $("#tabgrp_" + groups[g].groupuuid).append('
    '); + + $("#tblgrp_" + groups[g].groupuuid + " > thead").append('Enfant' + tblheads.sqldata[0].monday + '' + tblheads.sqldata[0].tuesday + '' + tblheads.sqldata[0].wednesday + '' + tblheads.sqldata[0].thursday + '' + tblheads.sqldata[0].friday + ''); + var headdata = ""; + for (var h=0;h'; + } + } + $("#tblgrp_" + groups[g].groupuuid + " > thead").append('' + headdata+ ''); + grpdata = grpdata.sqldata; + for (var b in grpdata){ + var xdata = grpdata[b]; + $("#tblgrp_" + groups[g].groupuuid + " > tbody").append(''+xdata.join('')+''); + } + // + $("#tblgrp_" + groups[g].groupuuid).dataTable({ + "language": { + "url": "js/locale/datatable_fr.json" + }, + "paging": false, + "scrollY": wh + "px", + "scrollCollapse": true, + "info": false, + "ordering": true, + "filter": true, + "destroy": true + }); + } + + setallpresences(); + $('#tabgrouphead a[data-toggle="tab"]').on('shown.bs.tab', function (e) { + var tn = e.target.toString(); + pconfig.groupuuid = tn.substring(tn.lastIndexOf("#")+8); + pconfig.activetab = 'tblgrp_' +pconfig.groupuuid; + apppref.setpreference("pageconfig.weeklypresences",pconfig); + + $("#tblgrp_" + pconfig.groupuuid).dataTable({ + "language": { + "url": "js/locale/datatable_fr.json" + }, + "paging": false, + "scrollY": wh + "px", + "scrollCollapse": true, + "info": false, + "ordering": true, + "filter": true, + "destroy": true + }); + }); + if (!pconfig.groupuuid) { + $('#tabgrouphead a[href="#tabgrp_' + groups[0].groupuuid + '"]').tab('show'); + pconfig.groupuuid = groups[0].groupuuid; + pconfig.activetab = '#tabgrp_' + groups[0].groupuuid; + apppref.setpreference("pageconfig.weeklypresences",pconfig); + } else { + $('#tabgrouphead a[href="#tabgrp_' + pconfig.groupuuid + '"]').tab('show'); + pconfig.activetab = '#tabgrp_' + groups[0].groupuuid; + apppref.setpreference("pageconfig.weeklypresences",pconfig); + } + + +} + +function setlunch(btn) { + + var clb = $(btn).attr('class').split(' '); + var ident = $(btn).attr('id').split('_'); + + var lunch = 'null'; + if (clb[1] == 'btn-default') { + $(btn).removeClass('btn-default'); + $(btn).addClass('btn-success'); + lunch = "'1'"; + } else { + $(btn).removeClass('btn-success'); + $(btn).addClass('btn-default'); + lunch = "'0'"; + } + + appdb.dbexec("update presence set lunch=" + lunch + " where daydate='" + weekdates[ident[2].substring(0, 3)] + "' and childuuid='" + ident[1] + "';"); + +} + +function setpresence(btn) { + $(btn).removeClass('2'); + var clx = $(btn).attr('class'); + var clb = clx.split(' '); + + var ident = $(btn).attr('id').split('_'); + if ((ident[0] == 'btn') && ((ident[1] == 'edit') || (ident[1] == 'changegrp'))) { + return; + } + var clblunch = $("#" + $(btn).attr('id') + 'lunch').attr('class').split(' '); + var usql = "UPDATE presence SET status=" + presences[clb[1]].nextdata + " where childuuid='" + ident[1] + "' and daydate=date('" + weekdates[ident[2]] + "');"; + + if (presences[clb[1]].nextdata == 1) { + usql = "INSERT INTO presence (status,childuuid,daydate,lunch) VALUES (" + presences[clb[1]].nextdata + ",'" + ident[1] + "',date('" + weekdates[ident[2]] + "')," + ((clblunch[1] == 'default') ? 0 : 1) + ");"; + + } else if (!presences[clb[1]].nextdata) { + usql = "DELETE FROM presence where childuuid='" + ident[1] + "' and daydate='" + weekdates[ident[2]] + "';"; + } + + appdb.dbexec(usql); + $(btn).removeClass(clb[1]); + $(btn).addClass(presences[clb[1]].class); + $(btn).html(presences[clb[1]].icon); + if ((presences[clb[1]].nextdata == 1) || (presences[clb[1]].nextdata == 5)) { + $("#" + $(btn).attr("id") + "lunch").removeClass('btn-default'); + $("#" + $(btn).attr("id") + "lunch").addClass('btn-success'); + $("#" + $(btn).attr("id") + "lunch").prop("disabled", false); + } else { + $("#" + $(btn).attr("id") + "lunch").removeClass('btn-success'); + $("#" + $(btn).attr("id") + "lunch").addClass('btn-default'); + $("#" + $(btn).attr("id") + "lunch").prop("disabled", true); + } +} + +function setalltopresent(){ + $('body').css('cursor','wait'); + + $("button[id^=btn_]").each( + function(){ + if ((this.id.indexOf("lunch") == -1) && (this.getAttribute("class").indexOf("btn-default") != -1)) { + setpresence(this); + } + + } + ); + $('body').css('cursor','auto'); +} + +function change_week() { + pconfig.presweek = $('#presweek').val(); + + apppref.setpreference("pageconfig.weeklypresences",pconfig); + globelreq.send_request({ + page: 'weeklypresences', + module: 'presences', + data: null, + header: 'Présences par semaine' + }); +} + +function setallpresences() { + var prsql = "select daydate,childuuid,status,lunch,case when weekday='1' then 'mon' when weekday='2' then 'tue' when weekday='3' then 'wed' when weekday='4' then 'thu' when weekday='5' then 'fri' else null end as weekday from (select daydate,childuuid,status,lunch,strftime('%w',daydate) as weekday from presence where daydate >= date('" + weekdates.mon + "') and daydate <=date('" + weekdates.fri + "')) group by childuuid,daydate;"; + var presdata = appdb.dbquery(prsql); + presdata = presdata.sqldata; + if (presdata) { + for (var p in presdata) { + if ($("#btn_" + presdata[p].childuuid + "_" + presdata[p].weekday)) { + $("#btn_" + presdata[p].childuuid + "_" + presdata[p].weekday).removeClass("btn-default"); + $("#btn_" + presdata[p].childuuid + "_" + presdata[p].weekday).addClass(presenceids[presdata[p].status].class); + $("#btn_" + presdata[p].childuuid + "_" + presdata[p].weekday).html(presenceids[presdata[p].status].icon); + if ((presdata[p].status == 1) || (presdata[p].status == 5)) { + $("#btn_" + presdata[p].childuuid + "_" + presdata[p].weekday + "lunch").prop("disabled", false); + } + } + if ($("#btn_" + presdata[p].childuuid + "_" + presdata[p].weekday + "lunch")) { + $("#btn_" + presdata[p].childuuid + "_" + presdata[p].weekday + "lunch").removeClass("btn-default"); + $("#btn_" + presdata[p].childuuid + "_" + presdata[p].weekday + "lunch").addClass("btn-success"); + + } + } + } +} + +function configure_presence(obj) { + var xx = obj.id.split("_"); + var chid = xx[2]; + //var lblcday=getlabels(xx[3]); + var cfgdate = new Date(weekdates[xx[3]]).toLocaleFormat("%Y-%m-%d"); + $('#planning > #plandate').val(cfgdate); + $('#planning > #childuuid').val(chid); + $('#planning > #planday').val(xx[3]); + $('#dlg_addplanning').modal('show'); +} + + +function save_planning() { + var newplandata = {}; + $("#planning :input").each(function() { + var input = $(this); + + if (input.attr("id")) { + + if ((input.attr("type") == "checkbox") && input.attr("checked")){ + newplandata[input.attr("id")] = input.val(); + } + else if (input.attr("type") != "checkbox"){ + newplandata[input.attr("id")] = input.val(); + } + } + }); + + if ((newplandata.timebegin=='00:00') || (newplandata.timeend=='00:00') || (newplandata.timebegin==newplandata.timeend)) { + return; + } + + var checkdatesplit = appdb.dbquery("select * from planning where datebegin <= '"+newplandata.plandate+"' and dateend >= '"+newplandata.plandate+"' and childuuid='"+newplandata.childuuid+"';"); + checkdatesplit = checkdatesplit.sqldata; + if (checkdatesplit.length == 1) { + // + var newuuid = appdb.generate_uuid(); + appdb.dbexec("INSERT INTO planning (datebegin, dateend, montimebegin, montimeend, monlunch, tuetimebegin, tuetimeend, tuelunch, wedtimebegin, wedtimeend, wedlunch, thutimebegin, thutimeend, thulunch, fritimebegin, fritimeend, frilunch, sattimebegin, sattimeend, satlunch, suntimebegin, suntimeend, sunlunch, childuuid, uuid, groupuuid, montimebegin2, montimeend2, tuetimebegin2, tuetimeend2, wedtimebegin2, wedtimeend2, thutimebegin2, thutimeend2, fritimebegin2, fritimeend2, sattimebegin2, sattimeend2, suntimebegin2, suntimeend2) SELECT date('"+newplandata.plandate+"','+1 day'), dateend, montimebegin, montimeend, monlunch, tuetimebegin, tuetimeend, tuelunch, wedtimebegin, wedtimeend, wedlunch, thutimebegin, thutimeend, thulunch, fritimebegin, fritimeend, frilunch, sattimebegin, sattimeend, satlunch, suntimebegin, suntimeend, sunlunch, childuuid, '"+newuuid+"', groupuuid, montimebegin2, montimeend2, tuetimebegin2, tuetimeend2, wedtimebegin2, wedtimeend2, thutimebegin2, thutimeend2, fritimebegin2, fritimeend2, sattimebegin2, sattimeend2, suntimebegin2, suntimeend2 FROM planning where uuid='"+ checkdatesplit[0].uuid +"';"); + appdb.dbexec("UPDATE planning SET dateend=date('"+newplandata.plandate+"','-1 day') where uuid='"+checkdatesplit[0].uuid+"'"); + newuuid = appdb.generate_uuid(); + appdb.dbexec("INSERT INTO planning (datebegin,dateend, "+newplandata.planday+"timebegin,"+newplandata.planday+"timeend,"+newplandata.planday+"lunch,childuuid,uuid,groupuuid) VALUES ('"+newplandata.plandate+"','"+newplandata.plandate+"','"+newplandata.timebegin+"','"+newplandata.timeend+"',"+((newplandata.lunch)?"'1'":'null')+",'"+newplandata.childuuid+"','"+newuuid+"','"+checkdatesplit[0].groupuuid+"');"); + } + $('#dlg_addplanning').modal('hide'); + globelreq.send_request({ + page: 'weeklypresences', + module: 'presences', + data: null, + header: 'Présences par semaine' + }); +} + + +function onpreviousweek() { + pconfig.presweek = $('#presweek').val(); + var tmpweek = new Date(encodeparam(pconfig.presweek, 'date').replace(/'/g, '')); + var nweek = new Date(tmpweek.getFullYear(), tmpweek.getMonth(), tmpweek.getDate()-7); + pconfig.presweek = nweek.toLocaleFormat('%d.%m.%Y'); + apppref.setpreference("pageconfig.weeklypresences",pconfig); + globelreq.send_request({ + page: 'weeklypresences', + module: 'presences', + data: null, + header: 'Présences par semaine' + }); +} + +function onnextweek() { + pconfig.presweek = $('#presweek').val(); + var tmpweek = new Date(encodeparam(pconfig.presweek, 'date').replace(/'/g, '')); + var nweek = new Date(tmpweek.getFullYear(), tmpweek.getMonth(), tmpweek.getDate()+7); + pconfig.presweek = nweek.toLocaleFormat('%d.%m.%Y'); + apppref.setpreference("pageconfig.weeklypresences",pconfig); + globelreq.send_request({ + page: 'weeklypresences', + module: 'presences', + data: null, + header: 'Présences par semaine' + }); +} + +function dlgchangegrp(obj) { + var xx = obj.id.split("_"); + var chid = xx[2]; + + var chldnames = appdb.dbquery("SELECT prename || ' ' || surname as childname from childs where uuid='"+chid+"';"); + var grps = appdb.dbquery("SELECT '' || gr.grpname || ': ' || strftime(\"%d.%m.%Y\",datebegin) || ' - ' || strftime(\"%d.%m.%Y\",dateend) as strdates,strftime(\"%d.%m.%Y\",dateend) from planning pl left join groups gr on (pl.groupuuid=gr.uuid) where pl.childuuid='"+chid+"' and (datebegin between '"+ weekdates.mon+"' and '"+ weekdates.fri+"' or dateend between '"+ weekdates.mon+"' and '"+ weekdates.fri+"' or (datebegin <= '"+ weekdates.mon+"' and dateend >= '"+ weekdates.fri+"'));"); + if (grps.sqldata) { + grps = grps.sqldata; + } + + var strgrp = ""; + if (grps) { + dgrpc = grps[0].dateend; + for (var f in grps){ + strgrp += grps[f].strdates + '
    '; + } + } + + $('#dlg_changegrp #dategrpchange').val(new Date(weekdates.mon).toLocaleFormat('%d.%m.%Y')); + $('#dlg_changegrp #childuuid').val(chid); + $('#dlg_changegrp #groupuuid').val(pconfig.groupuuid); + $('#dlg_changegrp #curgrp').val(pconfig.groupuuid); + $('#dlg_changegrp #curgrpdata').html("

    Enfant: " + chldnames.sqldata[0].childname+'
    '+ strgrp); + $('#dlg_changegrp').modal('show'); +} + +function save_grpchange() { + var newgrpplan = {}; + $("#dlg_changegrp :input").each(function() { + var input = $(this); + + if (input.attr("id")) { + + newgrpplan[input.attr("id")] = input.val(); + } + }); + newgrpplan.dategrpchange = encodeparam(newgrpplan.dategrpchange,'date').replace(/'/g,''); + + if (newgrpplan.curgrp != newgrpplan.groupuuid) { + var checkdatesplit = appdb.dbquery("select * from planning where date('"+newgrpplan.dategrpchange+"') between datebegin and dateend and childuuid='"+newgrpplan.childuuid+"';"); + checkdatesplit = checkdatesplit.sqldata; + if (checkdatesplit.length == 1) { + var newuuid = appdb.generate_uuid(); + appdb.dbexec("INSERT INTO planning (datebegin, dateend, montimebegin, montimeend, monlunch, tuetimebegin, tuetimeend, tuelunch, wedtimebegin, wedtimeend, wedlunch, thutimebegin, thutimeend, thulunch, fritimebegin, fritimeend, frilunch, sattimebegin, sattimeend, satlunch, suntimebegin, suntimeend, sunlunch, childuuid, uuid, groupuuid, montimebegin2, montimeend2, tuetimebegin2, tuetimeend2, wedtimebegin2, wedtimeend2, thutimebegin2, thutimeend2, fritimebegin2, fritimeend2, sattimebegin2, sattimeend2, suntimebegin2, suntimeend2) SELECT date('"+newgrpplan.dategrpchange+"'), dateend, montimebegin, montimeend, monlunch, tuetimebegin, tuetimeend, tuelunch, wedtimebegin, wedtimeend, wedlunch, thutimebegin, thutimeend, thulunch, fritimebegin, fritimeend, frilunch, sattimebegin, sattimeend, satlunch, suntimebegin, suntimeend, sunlunch, childuuid, '"+newuuid+"', '"+newgrpplan.groupuuid+"', montimebegin2, montimeend2, tuetimebegin2, tuetimeend2, wedtimebegin2, wedtimeend2, thutimebegin2, thutimeend2, fritimebegin2, fritimeend2, sattimebegin2, sattimeend2, suntimebegin2, suntimeend2 FROM planning where uuid='"+ checkdatesplit[0].uuid +"';"); + appdb.dbexec("UPDATE planning SET dateend=date('"+newgrpplan.dategrpchange+"','-1 day') where uuid='"+checkdatesplit[0].uuid+"'"); + $('#dlg_changegrp').modal('hide'); + globelreq.send_request({ + page: 'weeklypresences', + module: 'presences', + data: null, + header: 'Présences par semaine' + }); + } + } + +} diff --git a/app_v3satdemo/chrome/content/modules/presences/presences.xul b/app_v3satdemo/chrome/content/modules/presences/presences.xul new file mode 100644 index 0000000..1f25e88 --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/presences/presences.xul @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app_v3satdemo/chrome/content/modules/presences/weeklypresences.html b/app_v3satdemo/chrome/content/modules/presences/weeklypresences.html new file mode 100644 index 0000000..31a213c --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/presences/weeklypresences.html @@ -0,0 +1,172 @@ + + + + + + + Présences par semaine + + + + + + + + + + + + + + + + + + +
    + +
    + +
    + Semaine du: + +
    + + + + + +
    +
    + +
    +
    + + +
    + +
    +
    + +
    + + + + + + + + + + + + + + + + + + + diff --git a/app_v3satdemo/chrome/content/modules/reports/css/print.css b/app_v3satdemo/chrome/content/modules/reports/css/print.css new file mode 100644 index 0000000..a3c54fc --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/reports/css/print.css @@ -0,0 +1,138 @@ +body { + font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; + font-size: 11px; + line-height: 1.42857; + background-color: #fff; +} +h2 { + font-size: 18px; + font-weight: bold; + margin-top: 0px; + margin-bottom: 5px; +} + +h3 { + font-size: 14px; + font-style: italic; + margin-top: 0px; + margin-bottom: 5px; +} + +.dataTables_filter { + height: 0px; + width: 0px; +} + +/*.dataTable > thead > tr > th {*/ +/* padding-top: 70px;*/ +/*}*/ + +/*.dataTable > tfoot > tr > th { + padding-bottom: 40px; +}*/ + +/*tfoot { display: table-footer-group;*/ +/* position: absolute; */ +/* bottom: 0; }*/ + +.alignright{ + text-align: right; +} + +.alignleft { + text-align: left; +} + +.noprint { + display: none; +} + + + +@media print { + +@page { + margin-left: 2cm; + margin-right: 1cm; + margin-top: 1cm; + margin-bottom: 1cm; +} + +tfoot { + display: table-row-group; +} + +table { + width: 100% !Important; + border-spacing: 0; + border-collapse: collapse; +} + +table.dataTable td { + white-space: nowrap; + overflow: hidden; +} + +table.dataTable > thead > th > td { + white-space: nowrap; + overflow: hidden; +} +table.dataTable tr { + page-break-inside: avoid; + page-break-after: auto; + } + +table.dataTable tfoot { + page-break-inside: avoid; + page-break-after: auto; + } + +table.dataTable tfoot > th > td { + font-size: 2vw; +} +table.dataTable { + width: 100% !Important; + border-spacing: 0; + border-collapse: collapse; +} + +#print-head { + display: block; + position: fixed; + font-family: Arial,Helvetica, sans-serif; + z-index: 10; + top: 0pt; + left:0pt; + right: 0pt; + background-color: #fff; + text-align: center; + } + +/*#print-foot { + display: block; + position: fixed; + width: 100%; + padding-top: 5px; + bottom: 0pt; + text-align: center; + right: auto; + left: auto; + font-family: Arial,Helvetica, sans-serif; + }*/ + +/*#print-foot:after { + content: counter(page); + counter-increment: page; + }*/ + + +.dataTables_filter { + height: 0px; + width: 0px; +} + +.dataTable { + width: 100% !Important; +} + +} \ No newline at end of file diff --git a/app_v3satdemo/chrome/content/modules/reports/dlg/dlgpdfviewer.xul b/app_v3satdemo/chrome/content/modules/reports/dlg/dlgpdfviewer.xul new file mode 100644 index 0000000..255bb8c --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/reports/dlg/dlgpdfviewer.xul @@ -0,0 +1,42 @@ + + + + + + + + diff --git a/app_v3satdemo/chrome/content/modules/reports/dlg/dlgprint.xul b/app_v3satdemo/chrome/content/modules/reports/dlg/dlgprint.xul new file mode 100644 index 0000000..0817914 --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/reports/dlg/dlgprint.xul @@ -0,0 +1,164 @@ + + + + + + + + diff --git a/app_v3satdemo/chrome/content/modules/reports/img/logoprint.png b/app_v3satdemo/chrome/content/modules/reports/img/logoprint.png new file mode 100644 index 0000000..8c760e8 Binary files /dev/null and b/app_v3satdemo/chrome/content/modules/reports/img/logoprint.png differ diff --git a/app_v3satdemo/chrome/content/modules/reports/img/print.png b/app_v3satdemo/chrome/content/modules/reports/img/print.png new file mode 100644 index 0000000..335f482 Binary files /dev/null and b/app_v3satdemo/chrome/content/modules/reports/img/print.png differ diff --git a/app_v3satdemo/chrome/content/modules/reports/img/save.png b/app_v3satdemo/chrome/content/modules/reports/img/save.png new file mode 100644 index 0000000..ef5ba59 Binary files /dev/null and b/app_v3satdemo/chrome/content/modules/reports/img/save.png differ diff --git a/app_v3satdemo/chrome/content/modules/reports/img/settings.png b/app_v3satdemo/chrome/content/modules/reports/img/settings.png new file mode 100644 index 0000000..3a8b3b3 Binary files /dev/null and b/app_v3satdemo/chrome/content/modules/reports/img/settings.png differ diff --git a/app_v3satdemo/chrome/content/modules/reports/js/print.js b/app_v3satdemo/chrome/content/modules/reports/js/print.js new file mode 100644 index 0000000..4ae6ede --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/reports/js/print.js @@ -0,0 +1,64 @@ +//Source-code licensed under EUPL v1.1 ( Copyright 2016 By DKS s.à r.l. - Kilian Saffran - Luxembourg ) +document.onreadystatechange = function () { + if (document.readyState == "complete") { + try { + initdata(); + }catch(e){ + //dump("Print.js No initdata function!\n"); + } + } +} + +function encodeparam(string,type){ + if (type == "text") { + if (string == "") { + string = 'null'; + }else { + string = string.replace('<','<','g'); + string = string.replace('>','>','g'); + string = string.replace('&','&','g'); + string = string.replace('"','"','g'); + string = string.replace("'","''",'g'); + string = "'"+ string+"'"; + } + }else if(type == "date"){ + var re = /^(\d{1,2})\.(\d{1,2})\.(\d{4})$/i; + if (!string.match(re)) { + string = 'null'; + }else{ + var dspl=string.split('.'); + string = "'"+dspl[2]+'-'+dspl[1]+'-'+dspl[0]+"'"; + } + }else if(type == "number"){ + if (string == "") { + string = 'null'; + }else { + string.replace(',','.'); + string = parseFloat(string); + } + }else if(type == "boolean"){ + if (string == "") { + string = 'null'; + } + string= string.replace('true',"'1'"); + string= string.replace('false',"'0'"); + }else if(type == "month"){ + var re = /^(\d{1,2})\.(\d{4})$/i; + if (!string.match(re)) { + string = 'null'; + }else{ + var dspl=string.split('.'); + string = "'"+dspl[1]+'-'+dspl[0]+"-01'" + } + } + else { + string = string.replace('<','<','g'); + string = string.replace('>','>','g'); + string = string.replace('&','&','g'); + string = string.replace('"','"','g'); + string = string.replace("'","''",'g'); + string = "'"+ string+"'"; + } + + return string; +} \ No newline at end of file diff --git a/app_v3satdemo/chrome/content/modules/reports/js/print_book.js b/app_v3satdemo/chrome/content/modules/reports/js/print_book.js new file mode 100644 index 0000000..7f3632d --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/reports/js/print_book.js @@ -0,0 +1,41 @@ +//Source-code licensed under EUPL v1.1 ( Copyright 2016 By DKS s.à r.l. - Kilian Saffran - Luxembourg ) +var pconfig = {}; + +function initdata(){ + var configdata = apppref.getpreference("pageconfig.logactivity"); + if (configdata != '') { + pconfig = JSON.parse(configdata); + } + //"Book Ident Data:" + JSON.stringify(pconfig) + "\n"); + var windowMediator = Components.classes["@mozilla.org/appshell/window-mediator;1"] + .getService(Components.interfaces.nsIWindowMediator); + var winmain = windowMediator.getMostRecentWindow("xulcreorga"); + var maindoc = winmain.document.getElementById("brw_application").contentDocument; + + //var xdate = new Date(); + //$("#printdatetime").html(xdate.toLocaleFormat("%d.%m.%Y %H:%M:%S")); + + $("#title_sub").html(winmain.document.getElementById("infoheader").value); + + $("#title_main").html(maindoc.title); + //$("#tbl_list").css("margin-top","100px"); + var crn = appdb.dbquery("select crechename,adress,city,country,zip from creche;"); + crn = crn.sqldata[0]; + $("#creche_name").html(crn.crechename); + $("#creche_address").html(crn.adress); + $("#creche_zip").html(crn.zip); + $("#creche_city").html(crn.city); + loadactivitydata(); +} + +function loadactivitydata(){ + var actdatasql = "SELECT strftime('%d.%m.%Y',logdatefrom) || ' - ' || strftime('%d.%m.%Y',logdateto) as daterange, logtitle, logmessage FROM activitylog where uuid='"+ pconfig.activityuuid+"';"; + //dump(actdatasql + "\n"); + var data = appdb.dbquery(actdatasql); + $("#bookdata").append('

    '+ data.sqldata[0].logtitle+'

    '); + $("#bookdata").append('

    '+ data.sqldata[0].daterange+'

    '); + $("#bookdata").append('
    '+ data.sqldata[0].logmessage+'
    '); +} + + + diff --git a/app_v3satdemo/chrome/content/modules/reports/js/print_calendar.js b/app_v3satdemo/chrome/content/modules/reports/js/print_calendar.js new file mode 100644 index 0000000..7e6e2f8 --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/reports/js/print_calendar.js @@ -0,0 +1,35 @@ +//Source-code licensed under EUPL v1.1 ( Copyright 2016 By DKS s.à r.l. - Kilian Saffran - Luxembourg ) +function initdata(){ + var windowMediator = Components.classes["@mozilla.org/appshell/window-mediator;1"] + .getService(Components.interfaces.nsIWindowMediator); + var winmain = windowMediator.getMostRecentWindow("xulcreorga"); + + var maindoc = winmain.document.getElementById("brw_application").contentDocument; + + var xdate = new Date(); + $("#printdatetime").html(xdate.toLocaleFormat("%d.%m.%Y %H:%M:%S")); + $("#title_sub").html(winmain.document.getElementById("infoheader").value); + $("#title_main").html(maindoc.title); + //$("#cal_month").css("margin-top","100px"); + var crn = appdb.dbquery("select crechename,adress,city,country,zip from creche;"); + crn = crn.sqldata[0]; + $("#creche_name").html(crn.crechename); + $("#creche_address").html(crn.adress); + $("#creche_zip").html(crn.zip); + $("#creche_city").html(crn.city); + + var elx = maindoc.querySelectorAll('table[id^="cal_"]'); + + for (var i in elx) { + //dump(elx[i].id + "\n"); + if (elx[i].id) { + var elementdata = maindoc.getElementById(elx[i].id).innerHTML; + + //elementdata = elementdata.replace(/height:\ 0px;/g,''); + //elementdata = elementdata.replace(/height:0;/g,''); + $("#cal_month").append(elementdata); + //$("#tbl_list th:first-child").remove(); + //$("#tbl_list td:first-child").remove(); + } + } +} \ No newline at end of file diff --git a/app_v3satdemo/chrome/content/modules/reports/js/print_child.js b/app_v3satdemo/chrome/content/modules/reports/js/print_child.js new file mode 100644 index 0000000..d704637 --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/reports/js/print_child.js @@ -0,0 +1,155 @@ +//Source-code licensed under EUPL v1.1 ( Copyright 2016 By DKS s.à r.l. - Kilian Saffran - Luxembourg ) +var pconfig = {}; +function initdata(){ + var configdata = apppref.getpreference("pageconfig.child"); + if (configdata != '') { + pconfig = JSON.parse(configdata); + } + var windowMediator = Components.classes["@mozilla.org/appshell/window-mediator;1"] + .getService(Components.interfaces.nsIWindowMediator); + var winmain = windowMediator.getMostRecentWindow("xulcreorga"); + var maindoc = winmain.document.getElementById("brw_application").contentDocument; + + //var xdate = new Date(); + //$("#printdatetime").html(xdate.toLocaleFormat("%d.%m.%Y %H:%M:%S")); + + $("#title_sub").html(winmain.document.getElementById("infoheader").value); + + $("#title_main").html(maindoc.title); + //$("#tbl_list").css("margin-top","100px"); + var crn = appdb.dbquery("select crechename,adress,city,country,zip from creche;"); + crn = crn.sqldata[0]; + $("#creche_name").html(crn.crechename); + $("#creche_address").html(crn.adress); + $("#creche_zip").html(crn.zip); + $("#creche_city").html(crn.city); + + var cdatasql = "select child.uuid,child.clientnumber,child.prename,child.surname,strftime('%d.%m.%Y',child.birthday) as birthday,child.address,child.city,child.zip,child.country,strftime('%d.%m.%Y',child.entrydate) as entrydate,child.checkservicenumber,strftime('%d.%m.%Y',child.checkserviceexpiration) as checkserviceexpiration,strftime('%d.%m.%Y',child.leavedate) as leavedate,child.nationality,child.nativelanguage,child.bankaccount,child.bankbic,child.cautionamount,child.cautionpayed,child.cautionremark,child.cautionpayedback,child.cautionstatusdate,child.remark,child.uuid,health.docname, health.docphone,health.docaddress,health.doczip, health.doccity,health.doccountry,health.healthinfo,health.uuid as docuuid from childs child join health health on (child.uuid=health.childuuid) where child.uuid='" + pconfig.uuid + "';"; + var cdata = appdb.dbquery(cdatasql); + $('#financedata').hide(); + if (cdata) { + cdata = cdata.sqldata[0]; + var hx = true; + for (var ci in cdata) { + if (document.getElementById("childs_" + ci)) { + $("#childs_" + ci).html(cdata[ci]); + } + if (document.getElementById("health_" + ci)) { + if (cdata[ci] != '') { + hx = false; + $("#health_" + ci).html(cdata[ci]); + }else { + $("#health_" + ci).hide(); + } + + } + + } + if (hx) { + $('#healthdata').hide(); + } + } + + load_table_presence(); + load_table_parents(); + load_table_refpersons(); + var cdatea = new Date(); + //$("#printdatetime").html(cdatea.toLocaleFormat("%d.%m.%Y %H:%M:%S")); + //$("#accmonth").html(myfilter.description); + var crn = appdb.dbquery("select crechename,adress,city,country,zip from creche;"); + crn = crn.sqldata[0]; + $("#creche_name").html(crn.crechename); + $("#creche_address").html(crn.adress); + $("#creche_zip").html(crn.zip); + $("#creche_city").html(crn.city); +} + +function load_table_presence(){ + var plandatasql = "SELECT grp.grpname, strftime('%d.%m.%Y',plan.datebegin) || ' - ' || strftime('%d.%m.%Y',plan.dateend) AS planningdaterange, plan.montimebegin || ' - ' || plan.montimeend || CASE WHEN plan.monlunch='1' THEN ' ()' ELSE '' END || case when plan.montimebegin2 is not null and plan.montimeend2 is not null then '
    ' || plan.montimebegin2 || ' - ' || plan.montimeend2 else '' end AS monplanningtime, plan.tuetimebegin || ' - ' || plan.tuetimeend || CASE WHEN plan.tuelunch='1' THEN ' ()' ELSE '' END || case when plan.tuetimebegin2 is not null and plan.tuetimeend2 is not null then '
    ' || plan.tuetimebegin2 || ' - ' || plan.tuetimeend2 else '' end AS tueplanningtime, plan.wedtimebegin || ' - ' || plan.wedtimeend || CASE WHEN plan.wedlunch='1' THEN ' ()' ELSE '' END || case when plan.wedtimebegin2 is not null and plan.wedtimeend2 is not null then '
    ' || plan.wedtimebegin2 || ' - ' || plan.wedtimeend2 else '' end AS wedplanningtime, plan.thutimebegin || ' - ' || plan.thutimeend || CASE WHEN plan.thulunch='1' THEN ' ()' ELSE '' END || case when plan.thutimebegin2 is not null and plan.thutimeend2 is not null then '
    ' || plan.thutimebegin2 || ' - ' || plan.thutimeend2 else '' end AS thuplanningtime, plan.fritimebegin || ' - ' || plan.fritimeend || CASE WHEN plan.frilunch='1' THEN ' ()' ELSE '' END || case when plan.fritimebegin2 is not null and plan.fritimeend2 is not null then '
    ' || plan.fritimebegin2 || ' - ' || plan.fritimeend2 else '' end AS friplanningtime FROM planning plan LEFT JOIN groups grp ON ( plan.groupuuid=grp.uuid) WHERE plan.childuuid='" + pconfig.uuid + "' ORDER BY plan.datebegin, plan.dateend;"; + var plandata = appdb.dbqueryarray(plandatasql); + if (plandata) { + var headerdata = getlabels(plandata.sqlhead.join(",")); + $("#tbl_planning").html(""); + var tblplan = $("#tbl_planning").dataTable({ + "language": { + "url": "L../../web/js/locale/datatable_fr.json" + }, + "data": plandata.sqldata, + "columns": headerdata, + "paging": false, + "ordering": false, + "info": false, + "filter": false, + "destroy": true + }); + }else { + $('#planningdata').hide(); + } +} + +function load_table_parents() { + var labelx = getlabelswithkey('mother,father'); + var areftypes = new Array(); + for (var l in labelx){ + areftypes.push("select '"+ labelx[l].title +"' as refname, '"+labelx[l].keyname+"' as reftype"); + } + var lblsql = areftypes.join(" UNION "); + var parentssql = "SELECT rx.refname as reftype, coalesce(rp.surname,'') || ' ' || coalesce(rp.prename,'') as nameprename, coalesce(rp.address,'') || '
    ' || coalesce(rp.zip,'') || ' ' || coalesce(rp.city,'') || '
    ' || coalesce(rp.country,'') as address, case when rp.phone is not null then ': ' || rp.phone || '
    ' else '' end || case when rp.mobile is not null then': ' || rp.mobile || '
    ' else '' end || case when rp.workphone is not null then ': ' || rp.workphone || '
    ' else '' end || case when rp.email is not null then ': ' || email else '' end as phonemail, rp.job, rp.authsubscriber FROM refpersons rp join ("+lblsql+") rx on (rp.reftype=rx.reftype) where rp.childuuid='" + pconfig.uuid + "' and rp.reftype in ('mother','father');"; + + var parentsdata = appdb.dbqueryarray(parentssql); + if (parentsdata) { + var headerdata = getlabels(parentsdata.sqlhead.join(",")); + $("#tbl_parents").html(""); + $("#tbl_parents").dataTable({ +"language": { + "url": "../../web/js/locale/datatable_fr.json" + }, + "data": parentsdata.sqldata, + "columns": headerdata, + "paging": false, + "ordering": false, + "info": false, + "filter": false, + "destroy": true + }); + }else { + $('#parentdata').hide(); + } + + + +} + +function load_table_refpersons() { + var labelx = getlabelswithkey('tuteur,famillymember,famillyfriend'); + var areftypes = new Array(); + for (var l in labelx){ + areftypes.push("select '"+ labelx[l].title +"' as refname, '"+labelx[l].keyname+"' as reftype"); + } + var lblsql = areftypes.join(" UNION "); + var refpersonsql = "SELECT rx.refname as reftype, coalesce(rp.surname,'') || ' ' || coalesce(rp.prename,'') as nameprename, coalesce(rp.address,'') || '
    ' || coalesce(rp.zip,'') || ' ' || coalesce(rp.city,'') || '
    ' || coalesce(rp.country,'') as address, case when rp.phone is not null then ': ' || rp.phone || '
    ' else '' end || case when rp.mobile is not null then': ' || rp.mobile || '
    ' else '' end || case when rp.workphone is not null then ': ' || rp.workphone || '
    ' else '' end || case when rp.email is not null then ': ' || email else '' end as phonemail, rp.job, rp.authsubscriber FROM refpersons rp join ("+lblsql+") rx on (rp.reftype=rx.reftype) where rp.childuuid='" + pconfig.uuid + "' and rp.reftype not in ('mother','father');"; + + var refpersonsdata = appdb.dbqueryarray(refpersonsql); + if (refpersonsdata) { + var headerdata = getlabels(refpersonsdata.sqlhead.join(",")); + $("#tbl_refpersons").html(""); + $("#tbl_refpersons").dataTable({ + "language": { + "url": "../../web/js/locale/datatable_fr.json" + }, + "data": refpersonsdata.sqldata, + "columns": headerdata, + "paging": false, + "ordering": false, + "info": false, + "filter": false, + "destroy": true + }); + }else { + $('#refpersondata').hide(); + } + + + +} + diff --git a/app_v3satdemo/chrome/content/modules/reports/js/print_loaddata.js b/app_v3satdemo/chrome/content/modules/reports/js/print_loaddata.js new file mode 100644 index 0000000..48c9de8 --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/reports/js/print_loaddata.js @@ -0,0 +1,67 @@ +//Source-code licensed under EUPL v1.1 ( Copyright 2016 By DKS s.à r.l. - Kilian Saffran - Luxembourg ) +function initdata(){ + var windowMediator = Components.classes["@mozilla.org/appshell/window-mediator;1"] + .getService(Components.interfaces.nsIWindowMediator); + var winmain = windowMediator.getMostRecentWindow("xulcreorga"); + var maindoc = winmain.document.getElementById("brw_application").contentDocument; + + $("#title_sub").html(winmain.document.getElementById("infoheader").value); + + $("#title_main").html(maindoc.title); + var crn = appdb.dbquery("select crechename,adress,city,country,zip from creche;"); + crn = crn.sqldata[0]; + $("#creche_name").html(crn.crechename); + $("#creche_address").html(crn.adress); + $("#creche_zip").html(crn.zip); + $("#creche_city").html(crn.city); + + var elx = maindoc.querySelectorAll('div[id^="tbl"]'); + //var elx = maindoc.querySelectorAll('tfoot'); + + var tcols = 1; + var strlp = apppref.getpreference("pageconfig.lastpage"); + var lp = JSON.parse(strlp); + var strcp = apppref.getpreference("pageconfig." + lp.view); + var cp = JSON.parse(strcp); + var ctab = ""; + //"print_loaddata.js \n"); + if (cp.activetab) { + ctab = cp.activetab; + } + for (var i in elx) { + //dump(elx[i].id) + if ((elx[i].id ) && (elx[i].id.indexOf(ctab+"_wrapper") != -1)) { + + var elementdata = maindoc.getElementById(elx[i].id).innerHTML; + + elementdata = elementdata.replace(/height:\ 0px;/g,''); + elementdata = elementdata.replace(/height:0;/g,''); + elementdata = elementdata.replace(/colspan="1" rowspan="1"/g,''); + elementdata = elementdata.replace(/style="width:\s\d+px;"/g,''); + + var thead = elementdata.substring(elementdata.indexOf(''),elementdata.indexOf('')).replace('',''); + var tbody = elementdata.substring(elementdata.indexOf(''),elementdata.indexOf('')).replace('',''); + var tfoot = elementdata.substring(elementdata.lastIndexOf(''),elementdata.lastIndexOf('')).replace('',''); + + tcols = thead.split(''); + + + + $("#tbl_list > thead").append(thead); + $("#tbl_list > tbody").append(tbody); + $("#tbl_list > tfoot").append(tfoot); + + } + } + //$("#tbl_list").removeClass("dataTable"); + // $("#tbl_list").dataTable({ + // "language": { + // "url": "../../../web/js/locale/datatable_fr.json" + // }, + // "paging": false, + // "ordering": false, + // "info": false, + // "filter": false, + // "destroy": true + //}); +} \ No newline at end of file diff --git a/app_v3satdemo/chrome/content/modules/reports/js/print_logchild.js b/app_v3satdemo/chrome/content/modules/reports/js/print_logchild.js new file mode 100644 index 0000000..9fd5b9a --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/reports/js/print_logchild.js @@ -0,0 +1,45 @@ +//Source-code licensed under EUPL v1.1 ( Copyright 2016 By DKS s.à r.l. - Kilian Saffran - Luxembourg ) +var pconfig = {}; +var initdate = new Date(); + +function initdata(){ + + var configdata = apppref.getpreference("pageconfig.logchild"); + if (configdata != '') { + pconfig = JSON.parse(configdata); + } + var windowMediator = Components.classes["@mozilla.org/appshell/window-mediator;1"] + .getService(Components.interfaces.nsIWindowMediator); + var winmain = windowMediator.getMostRecentWindow("xulcreorga"); + var maindoc = winmain.document.getElementById("brw_application").contentDocument; + initdate = new Date(encodeparam(pconfig.logdate, 'date').replace(/'/g, '')); + //var xdate = new Date(); + //$("#printdatetime").html(xdate.toLocaleFormat("%d.%m.%Y %H:%M:%S")); + + $("#title_sub").html(pconfig.logdate); + + $("#title_main").html(maindoc.title); + //$("#tbl_list").css("margin-top","100px"); + var crn = appdb.dbquery("select crechename,adress,city,country,zip from creche;"); + crn = crn.sqldata[0]; + $("#creche_name").html(crn.crechename); + $("#creche_address").html(crn.adress); + $("#creche_zip").html(crn.zip); + $("#creche_city").html(crn.city); + + load_table_logchilds(); +} + +function load_table_logchilds(){ + var logsql = "select ch.prename || ' ' || ch.surname AS childname, ch.checkservicenumber,lc.logmessage from childs ch left join planning pl on (ch.uuid=pl.childuuid) left join childslog lc on (lc.childuuid=ch.uuid) where date('"+ initdate.toLocaleFormat('%Y-%m-%d')+"') between pl.datebegin and pl.dateend and lc.logmessage is not null and lc.logmessage != '' order by childname;"; + + var logdata = appdb.dbquery(logsql); + + for (var i in logdata.sqldata){ + var row = logdata.sqldata[i]; + //"initdata print_logchild! " + JSON.stringify(row)+"\n"); + var divd = '
    '+ row.childname + ' ('+ row.checkservicenumber + ')'+'
    '; + divd += '
    '+ row.logmessage+'
    '; + $("#div_data").append(divd); + } +} \ No newline at end of file diff --git a/app_v3satdemo/chrome/content/modules/reports/js/print_multilist.js b/app_v3satdemo/chrome/content/modules/reports/js/print_multilist.js new file mode 100644 index 0000000..605dc5a --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/reports/js/print_multilist.js @@ -0,0 +1,75 @@ +//Source-code licensed under EUPL v1.1 ( Copyright 2016 By DKS s.à r.l. - Kilian Saffran - Luxembourg ) +function initdata(){ + var windowMediator = Components.classes["@mozilla.org/appshell/window-mediator;1"] + .getService(Components.interfaces.nsIWindowMediator); + var winmain = windowMediator.getMostRecentWindow("xulcreorga"); + var maindoc = winmain.document.getElementById("brw_application").contentDocument; + + $("#title_sub").html(winmain.document.getElementById("infoheader").value); + + $("#title_main").html(maindoc.title); + var crn = appdb.dbquery("select crechename,adress,city,country,zip from creche;"); + crn = crn.sqldata[0]; + $("#creche_name").html(crn.crechename); + $("#creche_address").html(crn.adress); + $("#creche_zip").html(crn.zip); + $("#creche_city").html(crn.city); + + var elx = maindoc.querySelectorAll('div[id^="tbl"]'); + //var elx = maindoc.querySelectorAll('tfoot'); + //"print_multilist.js \n"); + var tcols = 1; + var strlp = apppref.getpreference("pageconfig.lastpage"); + var lp = JSON.parse(strlp); + var strcp = apppref.getpreference("pageconfig." + lp.view); + var cp = JSON.parse(strcp); + var ctab = ""; + //dump(JSON.stringify(cp) + "\n"); + var getpagedesign=$("#allpages").html(); + //dump(getpagedesign + "\n===============\n"); + var cnt = 1; + $("#allpages").html(""); + for (var i in elx) { + // //dump(elx[i].id) + if ((elx[i].id ) && (elx[i].id.indexOf(ctab+"_wrapper") != -1)) { + var npage = getpagedesign.replace(/_xxnum/g,cnt); + + var elementdata = maindoc.getElementById(elx[i].id).innerHTML; + // + elementdata = elementdata.replace(/height:\ 0px;/g,''); + elementdata = elementdata.replace(/height:0;/g,''); + elementdata = elementdata.replace(/colspan="1" rowspan="1"/g,''); + elementdata = elementdata.replace(/style="width:\s\d+px;"/g,''); + // + var thead = elementdata.substring(elementdata.indexOf(''),elementdata.indexOf('')).replace('',''); + var tbody = elementdata.substring(elementdata.indexOf(''),elementdata.indexOf('')).replace('',''); + var tfoot = elementdata.substring(elementdata.lastIndexOf(''),elementdata.lastIndexOf('')).replace('',''); + // + //tcols = thead.split(''); + //dump(tbody + "\n========\n"); + // + // + if (tbody.indexOf("dataTables_empty") == -1) { + $("#allpages").append(npage); + $("#tbl_list"+cnt+" > thead").append(thead); + $("#tbl_list"+cnt+" > tbody").append(tbody); + $("#tbl_list"+cnt+" > tfoot").append(tfoot); + + $("#tbl_list" + cnt).dataTable({ + "language": { + "url": "../../../web/js/locale/datatable_fr.json" + }, + "paging": false, + "ordering": false, + "info": false, + "filter": false, + "destroy": true + }); + cnt++; + } + + } + } + $('[id$="lunch"]').removeClass('btn-success'); + $('[id$="lunch"]').addClass('btn-default'); +} \ No newline at end of file diff --git a/app_v3satdemo/chrome/content/modules/reports/js/print_table.js b/app_v3satdemo/chrome/content/modules/reports/js/print_table.js new file mode 100644 index 0000000..525aeb5 --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/reports/js/print_table.js @@ -0,0 +1,92 @@ +//Source-code licensed under EUPL v1.1 ( Copyright 2016 By DKS s.à r.l. - Kilian Saffran - Luxembourg ) +function initdata(){ + var windowMediator = Components.classes["@mozilla.org/appshell/window-mediator;1"] + .getService(Components.interfaces.nsIWindowMediator); + var winmain = windowMediator.getMostRecentWindow("xulcreorga"); + var maindoc = winmain.document.getElementById("brw_application").contentDocument; + + $("#title_sub").html(winmain.document.getElementById("infoheader").value); + + $("#title_main").html(maindoc.title); + var crn = appdb.dbquery("select crechename,adress,city,country,zip from creche;"); + crn = crn.sqldata[0]; + $("#creche_name").html(crn.crechename); + $("#creche_address").html(crn.adress); + $("#creche_zip").html(crn.zip); + $("#creche_city").html(crn.city); + + var elx = maindoc.querySelectorAll('table[id="tbl_timetable"]'); + //var elx = maindoc.querySelectorAll('tfoot'); + + var tcols = 1; + var strlp = apppref.getpreference("pageconfig.lastpage"); + var lp = JSON.parse(strlp); + var strcp = apppref.getpreference("pageconfig." + lp.view); + var cp = JSON.parse(strcp); + var ctab = ""; + //dump(JSON.stringify(cp) + "\n"); + //if (cp.activetab) { + // ctab = cp.activetab; + //} + //var elx = maindoc.querySelectorAll('table[id^="cal_"]'); + for (var i in elx) { + if (elx[i].id) { + var elementdata = maindoc.getElementById(elx[i].id).innerHTML; + //elementdata = elementdata.replace(/height:\ 0px;/g,''); + //elementdata = elementdata.replace(/height:0;/g,''); + $("#tbl_list").append(elementdata); + //$("#tbl_list th:first-child").remove(); + //$("#tbl_list td:first-child").remove(); + } + } + + //$('td').each(function(){ + // if($(this).attr('colspan') > 1){ + // var ccol = $(this).attr('colspan'); + // $(this).attr('colspan',ccol -1); + // } + //}); + //$('th').each(function(){ + // if($(this).attr('colspan') > 1){ + // var ccol = $(this).attr('colspan'); + // $(this).attr('colspan',ccol -1); + // } + //}); + + + //for (var i in elx) { + // //dump(elx[i].id) + // if ((elx[i].id ) && (elx[i].id.indexOf(ctab+"_wrapper") != -1)) { + // + // var elementdata = maindoc.getElementById(elx[i].id).innerHTML; + // + // elementdata = elementdata.replace(/height:\ 0px;/g,''); + // elementdata = elementdata.replace(/height:0;/g,''); + // elementdata = elementdata.replace(/colspan="1" rowspan="1"/g,''); + // elementdata = elementdata.replace(/style="width:\s\d+px;"/g,''); + // + // var thead = elementdata.substring(elementdata.indexOf(''),elementdata.indexOf('')).replace('',''); + // var tbody = elementdata.substring(elementdata.indexOf(''),elementdata.indexOf('')).replace('',''); + // var tfoot = elementdata.substring(elementdata.lastIndexOf(''),elementdata.lastIndexOf('')).replace('',''); + // + // tcols = thead.split(''); + // + // + // + // $("#tbl_list > thead").append(thead); + // $("#tbl_list > tbody").append(tbody); + // $("#tbl_list > tfoot").append(tfoot); + // + // } + //} + // $("#tbl_list").dataTable({ + // "language": { + // "url": "../../../web/js/locale/datatable_fr.json" + // }, + // "paging": false, + // "ordering": false, + // "info": false, + // "filter": false, + // "destroy": true + //}); +} \ No newline at end of file diff --git a/app_v3satdemo/chrome/content/modules/reports/js/printpdf.js b/app_v3satdemo/chrome/content/modules/reports/js/printpdf.js new file mode 100644 index 0000000..c178594 --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/reports/js/printpdf.js @@ -0,0 +1,85 @@ +//Source-code licensed under EUPL v1.1 ( Copyright 2016 By DKS s.à r.l. - Kilian Saffran - Luxembourg ) +var printpdf = { + //onLoad: function() { + // // initialization code + // this.initialized = true; + // this.strings = document.getElementById("printpdf-strings"); + // this.prefs = Components.classes["@mozilla.org/preferences-service;1"] + // .getService(Components.interfaces.nsIPrefBranch).getBranch("extensions.printpdf@pavlov."); + //}, + onMenuItemCommand: function(fpath,fname,e) { + var nsIFilePicker = Components.interfaces.nsIFilePicker; + var picker = Components.classes["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker); + picker.init(window, "Save Document as PDF", nsIFilePicker.modeSave); + picker.appendFilter("PDF", "*.pdf"); + picker.defaultExtension = "pdf"; + picker.defaultString = content.document.title; + + picker.show(); + + var webBrowserPrint = window.content.QueryInterface(Components.interfaces.nsIInterfaceRequestor) + .getInterface(Components.interfaces.nsIWebBrowserPrint); + + var PSSVC = Components.classes["@mozilla.org/gfx/printsettings-service;1"] + .getService(Components.interfaces.nsIPrintSettingsService); + + var printSettings = PSSVC.newPrintSettings; + + printSettings.printToFile = true; + printSettings.toFileName = picker.file.path; + printSettings.printSilent = true; + printSettings.outputFormat = Components.interfaces.nsIPrintSettings.kOutputFormatPDF; + + // Added by bho + //var myPrintPrefs = printpdf.getPrintingPrefs(); + printSettings.printBGColors = true; + printSettings.printBGImages = true; + printSettings.unwriteableMarginTop = 0.5; + printSettings.unwriteableMarginLeft = 0.5; + printSettings.unwriteableMarginBottom = 0.5; + printSettings.unwriteableMarginRight = 0.5; + printSettings.marginTop = 0.2; /* these are in inches */ + printSettings.marginLeft = 0.2; + printSettings.marginBottom = 0.2; + printSettings.marginRight = 0.2; + //printSettings.shrinkToFit; + printSettings.paperName = "iso_a4"; /* name of paper */ + printSettings.paperSizeType = 1; /* use native data or is defined here */ + //printSettings.paperData = 9; /* native data value */ + printSettings.orientation = 1; + //"PDF Orientation:" + printSettings.orientation + "\n"); + if (printSettings.orientation == 1) { + printSettings.paperWidth = 297.0; /* width of the paper in inches or mm */ + printSettings.paperHeight = 210.0; /* height of the paper in inches or mm */ + + } else { + printSettings.paperWidth = 210.0; /* width of the paper in inches or mm */ + printSettings.paperHeight = 297.0; /* height of the paper in inches or mm */ + } + printSettings.paperSizeUnit = 1; /* paper is in inches or mm */ + //lets hide those ugly default headers + printSettings.footerStrCenter = ''; + printSettings.footerStrLeft = ''; + printSettings.footerStrRight = ''; + printSettings.headerStrCenter = ''; + printSettings.headerStrLeft = ''; + printSettings.headerStrRight = ''; + //} + // END: Added by bho + + webBrowserPrint.print(printSettings, null); + } + //onToolbarButtonCommand: function(e) { + // // just reuse the function above. you can change this, obviously! + // printpdf.onMenuItemCommand(e); + //}, + //getPrintingPrefs: function (){ + // return { + // showBGColor: this.prefs.getBoolPref("print.showBGColors"), + // showBGImages: this.prefs.getBoolPref("print.showBGImages"), + // showHeaders: this.prefs.getBoolPref("print.showHeaders") + // }; + //} + +}; +//window.addEventListener("load", function(e) { printpdf.onLoad(e); }, false); diff --git a/app_v3satdemo/chrome/content/modules/reports/js/printutils.js b/app_v3satdemo/chrome/content/modules/reports/js/printutils.js new file mode 100644 index 0000000..d3ac722 --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/reports/js/printutils.js @@ -0,0 +1,41 @@ +//Source-code licensed under EUPL v1.1 ( Copyright 2016 By DKS s.à r.l. - Kilian Saffran - Luxembourg ) +var printmanager = { + onprint: function() { + var sprdata = apppref.getpreference("pageconfig.lastpage"); + var prdata = JSON.parse(sprdata); + var spldata = apppref.getpreference("pageconfig." + prdata.view); + var pldata = JSON.parse(spldata); + if (!pldata.printlayout) { + //dump(prdata.module +" "+prdata.view+": Sorry, no printlayout defined!\n"); + }else { + //dump(JSON.stringify(pldata) + "\n"); + printmanager.load_printpreview("chrome://creorga/content/modules/reports/print_" +pldata.printlayout + ".html"); + } + }, + load_pdf: function(data){ + var params = { in : { + "uri": data.uri + }, + out: null + }; + var dlg = window.openDialog("chrome://creorga/content/modules/reports/dlg/dlgpdfviewer.xul", "dlgpdfviewer", + "chrome,centerscreen,resizable,scrollbars", params).focus(); + if (params.out) { + //code + } + }, + load_printpreview: function(path) { + var params = { in : { + "uri": path + }, + out: null + }; + var dlg = window.openDialog("chrome://creorga/content/modules/reports/dlg/dlgprint.xul", "dlgprint", + "chrome,centerscreen,resizable,scrollbars,modal", params).focus(); + if (params.out) { + if (params.out.reload == true) { + printmanager.load_printpreview(params.in.uri,params.in.type); + } + } + }, +} \ No newline at end of file diff --git a/app_v3satdemo/chrome/content/modules/reports/print_book.html b/app_v3satdemo/chrome/content/modules/reports/print_book.html new file mode 100644 index 0000000..248f817 --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/reports/print_book.html @@ -0,0 +1,43 @@ + + + + + Creorga - Enfant + + + + + + + + + + + + + + +
    + + + + + +
    +
    + +
    + + + + + + + + \ No newline at end of file diff --git a/app_v3satdemo/chrome/content/modules/reports/print_calendar.html b/app_v3satdemo/chrome/content/modules/reports/print_calendar.html new file mode 100644 index 0000000..c834e6f --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/reports/print_calendar.html @@ -0,0 +1,53 @@ + + + + + Creorga - Printing - List + + + + + + + + + + + + + + + + +
    + + + + + +
    + +
    + + + + + + + + + + \ No newline at end of file diff --git a/app_v3satdemo/chrome/content/modules/reports/print_child.html b/app_v3satdemo/chrome/content/modules/reports/print_child.html new file mode 100644 index 0000000..4e2c4d6 --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/reports/print_child.html @@ -0,0 +1,134 @@ + + + + + Creorga - Enfant + + + + + + + + + + + + + + +
    + + + + + +
    +
    +

    Données de base

    + + + + + + + + + + + + + + + + +
    Prénom
    Nom
    Date de naissance
    No. Check Service
    Date d'expiration
    No. Client
    Addresse
    Code Postale
    Ville
    Pays
    Nationalité
    Langue maternelle
    Remarque
    +
    + +
    +

    Données parents / personnes de référence

    +
    + + + +
    +
    +
    + +
    +

    Données personnes de réferences/authorisées

    +
    + + + +
    +
    +
    + +
    +

    Info Planning

    + + + + + + +
    Date d'entrée
    Date de sortie
    +
    + + + +
    +
    +
    + +
    +

    Info Santé

    + + + + + + + + + + +
    Médecin de famille
    Téléphone
    Adr. cabinet
    Code Postale
    Ville
    Pays
    Info Santé
    +
    + +
    +

    Info fincances/caution

    + + + + + + + + + + +
    Somme totale
    Somme payé
    Somme remboursé
    Date Status
    Compte bancaire
    BIC
    Remarque
    +
    + + + + + + + + + + + + + \ No newline at end of file diff --git a/app_v3satdemo/chrome/content/modules/reports/print_list.html b/app_v3satdemo/chrome/content/modules/reports/print_list.html new file mode 100644 index 0000000..13a8de5 --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/reports/print_list.html @@ -0,0 +1,69 @@ + + + + + Creorga - Printing - List + + + + + + + + + + + + + + + + +
    + + + + + +
    + + + + + + + + +
    + + + + + + + + + + + + diff --git a/app_v3satdemo/chrome/content/modules/reports/print_logchild.html b/app_v3satdemo/chrome/content/modules/reports/print_logchild.html new file mode 100644 index 0000000..f41f7bf --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/reports/print_logchild.html @@ -0,0 +1,44 @@ + + + + + Creorga - Logbook + + + + + + + + + + + + +
    + + + + + +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/app_v3satdemo/chrome/content/modules/reports/print_multilist.html b/app_v3satdemo/chrome/content/modules/reports/print_multilist.html new file mode 100644 index 0000000..30335dc --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/reports/print_multilist.html @@ -0,0 +1,62 @@ + + + + + Creorga - Printing - MultiList + + + + + + + + + + + + + + + + +
    +
    +
    + + + + + +
    + + + + + + + + + +
    +
    +
    + + + + + + + + + + diff --git a/app_v3satdemo/chrome/content/modules/reports/print_table.html b/app_v3satdemo/chrome/content/modules/reports/print_table.html new file mode 100644 index 0000000..d4a0374 --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/reports/print_table.html @@ -0,0 +1,45 @@ + + + + + Creorga - Printing - Table + + + + + + + + + + + + + + + + +
    + + + + + +
    + + +
    + + + + + + + + diff --git a/app_v3satdemo/chrome/content/modules/reports/reports.xul b/app_v3satdemo/chrome/content/modules/reports/reports.xul new file mode 100644 index 0000000..7f9abec --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/reports/reports.xul @@ -0,0 +1,10 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app_v3satdemo/chrome/content/modules/staff/coworker_basic.html b/app_v3satdemo/chrome/content/modules/staff/coworker_basic.html new file mode 100644 index 0000000..d39731d --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/staff/coworker_basic.html @@ -0,0 +1,332 @@ + + + + + + + Employé(e) + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + + + +
    +
    +
    + + + +
    + +
    + +
    + +
    + + + +
    + +
    + +
    +
    + + + +
    +
    + +
    +
    +
    + +
    + +
    + +
    + +
    +
    + +
    + +
    + + +
    + +
    + + +
    h
    +
    +
    + +
    + +
    +
    +
    + +
    +
    + +
    + +
    (Min: 4 charatères)
    +
    +
    + +
    + +
    +
    +
    + + +
    + +
    +
    + +
    + +
    + +
    + + +
    +
    +
    +
    + +
    + +
    + +
    + + +
    + + h +
    + +
    +
    + + +
    + + h +
    + +
    + +
    + + + + + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Congé
      planification 
    Typeouvertdemandévalidépris
    normale    
    exceptionelle    
    maladie    
    total    
    +
    + +
    + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + diff --git a/app_v3satdemo/chrome/content/modules/staff/img/staff.png b/app_v3satdemo/chrome/content/modules/staff/img/staff.png new file mode 100644 index 0000000..679ba25 Binary files /dev/null and b/app_v3satdemo/chrome/content/modules/staff/img/staff.png differ diff --git a/app_v3satdemo/chrome/content/modules/staff/js/coworker.js b/app_v3satdemo/chrome/content/modules/staff/js/coworker.js new file mode 100644 index 0000000..3bcec20 --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/staff/js/coworker.js @@ -0,0 +1,1097 @@ +//Source-code licensed under EUPL v1.1 ( Copyright 2016 By DKS s.à r.l. - Kilian Saffran - Luxembourg ) +var pconfig = null; +var delplan = null; +var delvacation = null; +var wh= window.innerHeight -440; +var curdatediff = null; +var redate = /\d\d.\d\d.\d\d\d\d/; +var curfreq ={}; +var maxdayhours = null; +var maxhalfdayhours = null; +//var lictype = apppref.getpreference("support.lictype"); + +function initdata() { + load_helpers(); + var pdata = apppref.getpreference("pageconfig.coworker"); + if (pdata != '') { + pconfig = JSON.parse(pdata); + } + //"get CoWorker cfg:" +JSON.stringify(pconfig) + "\n"); + if (!pconfig.year) { + pconfig.year=new Date().getFullYear(); + } + if (!pconfig.printlayout) { + pconfig.printlayout = 'list'; + apppref.setpreference("pageconfig.coworker",pconfig); + } + var cdatasql = "SELECT jobtitle, prename, surname, address, zip, city, country, strftime('%d.%m.%Y',entrydate) as entrydate, strftime('%d.%m.%Y',exitdate) as exitdate, iban, bic, accountname, phone, email, uuid,color,weekhours,case when password is not null and length(password) > 3 then 1 else 0 end as passwordset FROM staff where uuid='" + pconfig.uuid + "';"; + var cdata = appdb.dbquery(cdatasql); + cdata = cdata.sqldata[0]; + for (var ci in cdata) { + if (document.getElementById("staff_" + ci)) { + document.getElementById("staff_" + ci).setAttribute('value', cdata[ci]); + } + + } + + var crdata = appdb.dbquery("select stafflist from creche;"); + if ((crdata) && (crdata.sqldata[0].stafflist == "1")){ + $("#pwddata").hide(); + } + if (cdata) { + set_infoheader(cdata.prename + " " + cdata.surname); + } + $('#staff_color').minicolors({theme:'bootstrap'}); + set_selectyears(); + load_staff_selection('staffuuid'); + + if (pconfig && pconfig.activetab) { + $('a[href="#'+pconfig.activetab+'"]').tab('show'); + }else{ + $('a[href="#vacancy"]').tab('show'); + pconfig.activetab = 'vacancy'; + } + +// if (pconfig && pconfig.vacancyunit){ +// //dump("has vacancy unit:" + pconfig.vacancyunit + "\n"); +// $('#vacancy_unit').val(pconfig.vacancyunit); +// }else { + pconfig.vacancyunit = "hours"; +// $('#vacancy_unit').val("days"); +// } + + $('#frmeditvacancy #vacdatefrom').on("blur",function (e) { + var ok = true; + if ($('#frmeditvacancy #vacdatefrom').val().match(redate)) { + $('#btn_save_vacancy').removeAttr("disabled"); + }else { + ok = false; + $('#btn_save_vacancy').attr("disabled","1"); + } + if ((ok == true) && ($('#frmeditvacancy #vacdateto').val() != '')) { + var tmpdt1 = encodeparam($('#frmeditvacancy #vacdatefrom').val(),'date'); + var nd = new Date(tmpdt1.replace(/'/g,'')); + var xd = new Date(nd.getFullYear(),nd.getMonth(),nd.getDate() + curdatediff); + $('#frmeditvacancy #vacdateto').val(xd.toLocaleFormat("%d.%m.%Y")); + var tmpdt2 = encodeparam($('#frmeditvacancy #vacdateto').val(),'date'); + if (tmpdt1 > tmpdt2) { + $('#btn_save_vacancy').attr("disabled","1"); + } else { + $('#btn_save_vacancy').removeAttr("disabled"); + } + + } + }); + $('#frmeditvacancy #vacdateto').on("blur",function (e) { + var ok = true; + if ($('#frmeditvacancy #vacdateto').val().match(redate)) { + $('#btn_save_vacancy').removeAttr("disabled"); + }else { + ok = false; + $('#btn_save_vacancy').attr("disabled","1"); + } + curdatediff=daysBetween(new Date(encodeparam($('#frmeditvacancy #vacdatefrom').val(),'date').replace(/'/g,'')),new Date(encodeparam($('#frmeditvacancy #vacdateto').val(),'date').replace(/'/g,''))); + if ((ok == true) && ($('#frmeditvacancy #vacdateto').val() != '')) { + var tmpdt1 = encodeparam($('#frmeditvacancy #vacdatefrom').val(),'date'); + var tmpdt2 = encodeparam($('#frmeditvacancy #vacdateto').val(),'date'); + if (tmpdt1 > tmpdt2) { + $('#btn_save_vacancy').attr("disabled","1"); + } else { + $('#btn_save_vacancy').removeAttr("disabled"); + } + + } + }); + $('#dailyduration').on('change',function(e){ + if ($('#dailyduration').val() == "1.0"){ + $('#frmeditvacancy #hours').val(maxdayhours); + } + if ($('#dailyduration').val() == "0.4"){ + $('#frmeditvacancy #hours').val(maxhalfdayhours); + } + }); + $('#staff_color').on('change',function(e){ + saveonfocusout('staff_color'); + }); + $('#frmeditevent #color').minicolors({theme:'bootstrap',position: 'bottom right'}); + $("#weekly_byday :input").change(function() { + if (this.checked) { + this.setAttribute("checked",true); + }else { + this.removeAttribute("checked"); + } + +}); + $("#monthly_bydaypos :input").change(function() { + + if (this.checked) { + this.setAttribute("checked",true); + }else { + this.removeAttribute("checked"); + } + +}); + $("#monthly_bydaywday :input").change(function() { + + if (this.checked) { + this.setAttribute("checked",true); + }else { + this.removeAttribute("checked"); + } + +}); + $("#monthly_bymonthday :input").change(function() { + + if (this.checked) { + this.setAttribute("checked",true); + }else { + this.removeAttribute("checked"); + } + +}); + $("#monthly_by :input").change(function() { + var xd = this.id.split("_"); + curfreq.freqtype=xd[2]; + + this.setAttribute("checked",true); + + $('#freq_monthly_byday').hide(); + $('#freq_monthly_bymonthday').hide(); + $('#pnl_monthly_byday').removeAttr("checked"); + $('#pnl_monthly_bymonthday').removeAttr("checked"); + + $('#freq_' + this.value).show(); + +}); + + $('#frmeditevent #datefrom').on("blur",function (e) { + var ok = true; + if ($('#frmeditevent #datefrom').val().match(redate)) { + $('#btn_save_event').removeAttr("disabled"); + }else { + ok = false; + $('#btn_save_event').attr("disabled","1"); + } + if ((ok == true) && ($('#frmeditevent #dateto').val() != '')) { + var tmpdt1 = encodeparam($('#frmeditevent #datefrom').val(),'date'); + var tmpdt2 = encodeparam($('#frmeditevent #dateto').val(),'date'); + if (tmpdt1 >= tmpdt2) { + $('#btn_save_event').attr("disabled","1"); + } else { + $('#btn_save_event').removeAttr("disabled"); + } + + } + }); + $('#frmeditevent #dateto').on("blur",function (e) { + var ok = true; + if ($('#frmeditevent #dateto').val().match(redate)) { + $('#btn_save_event').removeAttr("disabled"); + }else { + ok = false; + $('#btn_save_event').attr("disabled","1"); + } + if ((ok == true) && ($('#frmeditevent #dateto').val() != '')) { + var tmpdt1 = encodeparam($('#frmeditevent #datefrom').val(),'date'); + var tmpdt2 = encodeparam($('#frmeditevent #dateto').val(),'date'); + + if (tmpdt1 >= tmpdt2) { + $('#btn_save_event').attr("disabled","1"); + } else { + $('#btn_save_event').removeAttr("disabled"); + } + + } + }); + +} + +$('.selyear').on( "change", function(e){ + e.preventDefault(); + + $(".selyear").val($(this).val()); + pconfig.year = $(this).val(); + apppref.setpreference("pageconfig.coworker",pconfig); + if ($(this).attr('id') == "year_organisation") { + load_event_data(); + }else if ($(this).attr('id') == "year_vacancy") { + load_table_vacancy(); + } +}); + +$('a[data-toggle="tab"]').on('shown.bs.tab', function (e) { + var tn = e.target.toString(); + pconfig.activetab = tn.substring(tn.lastIndexOf("#")+1); + //dump(JSON.stringify(pconfig) + "\n"); + apppref.setpreference("pageconfig.coworker",pconfig); + if (pconfig.activetab == 'activity') { + load_event_data(); + } + if (pconfig.activetab == 'vacancy') { + load_table_vacancy(); + } + }); + +function load_event_data() { + var where = new Array(); + + where.push(" st.uuid in ('"+ pconfig.uuid + "')"); + + $("div.panel-daybody").html(""); + var sql = "SELECT cal.uuid, cal.datefrom, cal.dateto, '
    ' || strftime('%Y%m%d',cal.datefrom) ||'
    ' || strftime('%d.%m.%Y',cal.datefrom) AS tbldatefrom ,strftime('%Y%m%d',cal.datefrom) AS strdatefrom, strftime('%Y%m%d',cal.dateto) AS strdateto,cal.timefrom, cal.timeto, cal.description, cal.location, cal.color, cal.freq, '[\"' || GROUP_CONCAT(sp.staffuuid,'\",\"') || '\"]' as staffuuid, GROUP_CONCAT(coalesce(st.surname,'') || ' ' || coalesce(st.prename,''), '
    ' ) as staffnames ,'[\"' || GROUP_CONCAT(st.color,'\",\"') || '\"]' as staffcolors from eventcalendar cal " +" join staffplanning sp on (cal.uuid=sp.eventcalendaruuid " + " AND sp.staffuuid in ('"+ pconfig.uuid +"')) left join staff st on (sp.staffuuid=st.uuid) "+ + " where (cal.datefrom between '" + $('#year_organisation').val() + "-01-01' and '" + $('#year_organisation').val() + "-12-31' and (cal.dateto >= '" + $('#year_organisation').val() + "-01-01' or cal.dateto is null)) or (cal.dateto between '" + $('#year_organisation').val() + "-01-01' and '" + $('#year_organisation').val() + "-12-31' and cal.datefrom < '" + $('#year_organisation').val() + "-01-01') or ((cal.datefrom <= '" + $('#year_organisation').val() + "-01-01') and ((cal.dateto >= '" + $('#year_organisation').val() + "-12-31') or cal.dateto is null)) "+ ((where.length > 0)?" AND (" + where.join(" or ") + ")":"")+" group by cal.uuid order by cal.datefrom,cal.dateto;"; + + var caldata = appdb.dbquery(sql); + + caldata = caldata.sqldata; + + var headerdata = getlabels("act,activity,coworkers,datefrom,hours,recurrance"); + $("#tbl_activity").html(""); + + var hrow = headerdata; + var tdclass= new Array(); + var tblheader = ''; + + for (var h=0;h'+ headerdata[h].title+''; + } + tblheader += ''; + + $("#tbl_activity").append("" + tblheader + ""); + $("#tbl_activity").append(""); + var tblbody = []; + for (var c in caldata) { + var tblrow = ""; + tblrow += ''; + tblrow += ""+caldata[c].description+"" + caldata[c].description + ""; + tblrow += "" + caldata[c].staffnames + ""; + tblrow += "" + caldata[c].tbldatefrom + ""; + tblrow += "" + caldata[c].timefrom + "- " + caldata[c].timeto + ""; + + var freq2 = caldata[c].freq; + if (freq2 != '') { + + freq2 += ';DTSTART='+caldata[c].strdatefrom + 'T000000Z'; + if (caldata[c].dateto != ''){ + freq2 += ';UNTIL='+caldata[c].strdateto + 'T000000Z'; + } + } + + try { + + var rule2 = RRule.fromString(freq2); + + + tblrow += "" + rule2.toText() + ""; + + } catch (ex){ + //"ERROR! loading data!" + ex + " FREQ:" + freq2 + "\n"); + } + tblrow += ""; + tblbody.push(tblrow); + } + + //load table + $("#tbl_activity").append(tblbody.join('')); + $("#tbl_activity").append(""); + + tblcal = $("#tbl_activity").dataTable({ + "language": { + "url": "../../web/js/locale/datatable_fr.json" + }, + "paging": false, + "scrollY": wh + "px", + "scrollCollapse": true, + "ordering": true, + "info": false, + "filter": false, + "destroy": true + }); + + //$('#tbl_activity').on( 'search.dt', function () { + // + // pconfig.filter = tblcal.api().search(); + // + // apppref.setpreference("pageconfig.calactivity",pconfig); + //} ); + + //$('#tbl_activity').on( 'order.dt', function () { + // pconfig.order= tblcal.fnSettings().aaSorting; + // + // apppref.setpreference("pageconfig.calactivity",pconfig); + // + //} ); + + if (pconfig.filter) { + tblcal.fnFilter(pconfig.filter); + } + if (pconfig.order) { + tblcal.fnSort(pconfig.order); + } + if ((!pconfig.filter) && (!pconfig.order)) { + tblcal.fnDraw(); + } +} + +function load_table_vacancy() { + maxdayhours = (parseFloat($("#staff_weekhours").val())/5).toFixed(2); + maxhalfdayhours = (maxdayhours/2).toFixed(2); + var vacdatasql = "SELECT ' ' AS action," + + "CASE WHEN datefrom!=dateto THEN 'du:' || strftime('%d.%m.%Y', CASE WHEN datefrom < DATE('"+ pconfig.year +"-01-01') THEN DATE('"+ pconfig.year +"-01-01') ELSE datefrom END) || '
    au: ' || strftime('%d.%m.%Y', CASE WHEN dateto > DATE('"+ pconfig.year +"-12-31') THEN DATE('"+ pconfig.year +"-12-31') ELSE dateto END) ELSE strftime('%d.%m.%Y',datefrom) END AS planningdaterange," + + //"case when datefrom!=dateto then strftime('%d.%m.%Y',case when datefrom < date('"+ pconfig.year +"-01-01') then 'de: ' date('"+ pconfig.year +"-01-01') else datefrom end) || '
    à: ' || strftime('%d.%m.%Y',case when dateto > date('"+ pconfig.year +"-12-31') then date('"+ pconfig.year +"-12-31') else dateto end) else strftime('%d.%m.%Y',datefrom) end as planningdaterange, " + +"case when timefrom=timeto then '"+ maxdayhours+ "' || 'h' else printf(\"%.2f\",cast(cast(strftime(\"%s\",timeto) as int)- cast(strftime(\"%s\",timefrom) as int) as real)/3600) || 'h' || case when timefrom!='00:00' then '
    à partir de ' || timefrom else '' end end as hourrange," + + //"case when timefrom=timeto then '8h' when (cast(substr(timeto,1,2) as int) - cast(substr(timefrom,1,2) as int))= 4 then '4h' || case when timefrom!='00:00' then '
    à partir de ' || timefrom else '' end else (cast(substr(timeto,1,2) as int) - cast(substr(timefrom,1,2) as int)) || 'h' || case when timefrom!='00:00' then '
    à partir de ' || timefrom else '' end end as hourrange, "+ +"description, " + +"case when type=0 then 'normal' when type=1 then 'exceptionnelle' when type=-1 then 'maladie' end as vacancytype,case when accepted='1' and type != -1 then 'OUI' else 'NON' end as accepted FROM vacancycalendar where staffuuid='"+ pconfig.uuid +"' and (strftime('%Y',dateto)='"+ pconfig.year +"' or strftime('%Y',datefrom)='"+ pconfig.year +"');"; +//dump("XXSQL:" + vacdatasql + "\n"); +var vacdata = appdb.dbqueryarray(vacdatasql); + + + $('#tbl_vacancy').html(""); + //$('#tbl_vacancy').append(''); + getlastyearsrest(); + calcvacancy(); + //vacdata.sqlhead.join(",") + "\n"); + var headerdata = getlabels(vacdata.sqlhead.join(",")); + + $("#tbl_vacancy").dataTable({ + "language": { + "url": "../../web/js/locale/datatable_fr.json" + }, + "data": vacdata.sqldata, + "columns": headerdata, + "paging": false, + "scrollY": wh + "px", + "scrollCollapse": true, + "ordering": true, + "info": false, + "filter": false, + "destroy": true + }); + +} + +function dlg_vacancy(uuid, type) { + //select weekhours/5 = max daily hours + maxdayhours = (parseFloat($("#staff_weekhours").val())/5).toFixed(2); + maxhalfdayhours = (maxdayhours/2).toFixed(2); + var evdata = { + uuid: 0, + description: '', + vacdatefrom:new Date().toLocaleFormat("%d.%m.%Y"), + vacdateto:new Date().toLocaleFormat("%d.%m.%Y"), + staffuuid:pconfig.uuid, + timefrom: '00:00', + hours: maxdayhours, + type:'0', + //dailyduration:'1.0', + //hourmax: whr + }; + + if (type == 'upd') { + var evsql = "select uuid,vacdatefrom,vacdateto,timefrom,description,staffuuid,case when hours = '0.00' then '" + maxdayhours +"' else hours end as hours,accepted from (SELECT uuid, strftime(\"%d.%m.%Y\",datefrom) as vacdatefrom, strftime(\"%d.%m.%Y\",dateto) as vacdateto, timefrom, description, '"+pconfig.uuid+"' as staffuuid,type, printf(\"%.2f\",cast((cast(strftime(\"%s\",timeto) as int)- cast(strftime(\"%s\",timefrom) as int))/3600 as real)) as hours,accepted FROM vacancycalendar where uuid='" + uuid.uuid + "');"; + //var evsql = "SELECT uuid, strftime(\"%d.%m.%Y\",datefrom) as vacdatefrom, strftime(\"%d.%m.%Y\",dateto) as vacdateto, timefrom, description, '"+pconfig.uuid+"' as staffuuid,type, case when timefrom!=timeto then '0.' || (cast(substr(timeto,1,2) as int) - cast(substr(timefrom,1,2) as int)) else 1.0 end as dailyduration,null as hours,accepted FROM vacancycalendar where uuid='" + uuid.uuid + "';"; + //dump("EVSQL: " + evsql + "\n"); + evdata = appdb.dbquery(evsql); + evdata = evdata.sqldata[0]; + if (evdata.type == -1){ + $("#btnacceptvacancy").hide(); + }else { + $("#btnacceptvacancy").show(); + } + if (evdata.hours >= maxdayhours) { + evdata.hours=maxdayhours; + $('#dailyduration select').val("1.0"); + } else if (evdata.hours == maxhalfdayhours){ + $('#dailyduration select').val("0.4"); + } else { + $('#dailyduration select').val("0."); + } + + }else { + $('#dailyduration select').val("1.0"); + } + for (var w in evdata) { + if ((w == 'datefrom') || (w == 'dateto')) { + w='vac' + w; + } + + if ($("#frmeditvacancy #" + w)) { + //dump(w + "->"+evdata[w]+"\n"); + if (w == "type"){ + $("#frmeditvacancy #" + w + " select").val(evdata[w]); + } else { + $("#frmeditvacancy #" + w).val(evdata[w]); + } + + + } + + } + + setdailydurationfields(); + $("#edit_vacancy").modal('show'); +} + +function confirm_delete_vacancy(uuid) { + delvacation = uuid; + $("#confirm_delete_vacancy").modal('show'); + return false; +} + +function delete_vacancy() { + var delsql = "DELETE FROM vacancycalendar where uuid='" + delvacation+"';"; + appdb.dbexec(delsql); + load_table_vacancy(); + delvacancy=null; + $("#confirm_delete_vacancy").modal('hide'); + + return false; +} + +function setdailydurationfields() { + var dd = $('#dailyduration :selected').val(); + if (dd=='1.0') { + //$("#ftimefrom").hide(); + $("#hours").prop("disabled",true); + }else if (dd=='0.4') { + //$("#ftimefrom").show(); + $("#hours").prop("disabled",true); + }else if (dd=='0.') { + //$("#ftimefrom").show(); + $("#hours").prop("disabled",false); + } +} + +function save_vacancy() { + var type = 'ins'; + var cuuid = ""; + if ($("#frmeditvacancy #uuid").val() != 0) { + type = 'upd'; + cuuid = $("#frmeditvacancy #uuid").val(); + } + var evsvdata = { + uuid:cuuid, + datefrom: $("#frmeditvacancy #vacdatefrom").val(), + dateto: $("#frmeditvacancy #vacdateto").val(), + timefrom: $("#frmeditvacancy #timefrom").val(), + hours: $("#frmeditvacancy #hours").val(), + description: $("#frmeditvacancy #description").val(), + staffuuid: $("#frmeditvacancy #staffuuid").val(), + type: $("#frmeditvacancy #type").val() + } + var savesql = ""; + if (type == 'ins') { + savesql = "INSERT INTO vacancycalendar (uuid, datefrom, dateto, timefrom, timeto, description, staffuuid, type) VALUES " + +"('" + appdb.generate_uuid() + "', date("+encodeparam(evsvdata.datefrom, 'date')+"), date("+encodeparam(evsvdata.dateto, 'date')+"), "+encodeparam(evsvdata.timefrom, 'text')+", strftime(\"%H:%M\",time("+encodeparam(evsvdata.timefrom, 'text')+",'+"+evsvdata.hours+" hours')), "+encodeparam(evsvdata.description, 'text')+", "+encodeparam(evsvdata.staffuuid, 'text')+","+evsvdata.type+");"; + } else { + savesql = "UPDATE vacancycalendar SET datefrom = date("+encodeparam(evsvdata.datefrom, 'date')+"), dateto = date("+encodeparam(evsvdata.dateto, 'date')+"), timefrom = "+encodeparam(evsvdata.timefrom, 'text')+", timeto = strftime(\"%H:%M\",time("+encodeparam(evsvdata.timefrom, 'text')+",'+"+evsvdata.hours+" hours')), description = "+encodeparam(evsvdata.description, 'text')+", staffuuid = "+encodeparam(evsvdata.staffuuid, 'text')+", type = "+evsvdata.type+" WHERE uuid = '"+evsvdata.uuid+"';"; + } + //dump("VACSAVESQL:" + savesql + "\n"); + appdb.dbexec(savesql); + load_table_vacancy(); + + $("#frmeditvacancy #uuid").val("0"); + $("#edit_vacancy").modal('hide'); +} + + +function set_selectyears() { + + var years = appdb.dbquery("select strftime('%Y',coalesce(min(entrydate),date('now','-1 year'))) as minyear, strftime('%Y',date('now', '+1 year')) as maxyear from staff where uuid='"+pconfig.uuid+"';"); + var minyear = parseInt(years.sqldata[0].minyear); + var maxyear = parseInt(years.sqldata[0].maxyear); + for (var y=minyear;y<=maxyear;y++){ + + var sel = ""; + if (y == pconfig.year) { + sel=' selected="1" '; + + } + + $(".selyear").append(""); + } + +} + +function calcvacancy() { + //"Calc Vacancy Data!\n"); + var csel = "select days,hours from staffvacancydays where staffuuid='"+pconfig.uuid+"' and vacancyyear='"+pconfig.year+"';"; + //"SQL:"+ csel +"\n"); + var cnum = appdb.dbquery(csel); + + if (cnum.sqldata.length > 0) { + if (pconfig.vacancyunit == "hours"){ + if ((!cnum.sqldata[0].hours) || (cnum.sqldata[0].hours === "")){ + cnum.sqldata[0].hours = cnum.sqldata[0].days * 8; + } + $('#vacancyyeartotal').val(cnum.sqldata[0].hours); + }else{ + $('#vacancyyeartotal').val(cnum.sqldata[0].days); + } + + }else { + $('#vacancyyeartotal').val(""); + } + var vdays = (($('#vacancyyeartotal').val() === "")?"":cnum.sqldata[0].days); + var weekhours = $('#staff_weekhours').val(); + if (vdays === '') { + $('#vacancystatus').html('
    Pas de jours de congés configuré pour l\'année '+ pconfig.year+'!
    '); + return; + }else if (weekhours === '') { + $('#vacancystatus').html('
    Pas de heures par semaine configurées!
    '); + return; + } + + var vcalcsql = "select printf(\"%.2f\",(sum(dayhours) / ("+weekhours+"/5))) as days, printf(\"%.2f\",SUM(dayhours)) as hours,"+ + "taken,type,accepted from (" + + "select vd.daydate,case when daydate <= date('now') then 1 else 0 end as taken,case when vc.timefrom=vc.timeto then cast ("+weekhours+"/5 as real) else cast(cast(strftime(\"%s\",vc.timeto) as int)- cast(strftime(\"%s\",vc.timefrom) as int) as real)/3600 end as dayhours,type,case when type != -1 then accepted else '1' end as accepted "+ + "from vacancycalendar vc left join ( "+ + "select daydate from ( "; + var df = new Date(pconfig.year,0,1); + var dt = new Date(pconfig.year,11,31); + var yd = []; + for (var dx=df;dx<=dt;dx.setDate(dx.getDate()+1)){ + yd.push("select date('"+dx.toLocaleFormat('%Y-%m-%d')+"') as daydate"); + } + vcalcsql += yd.join(" UNION ") + + ") yd where strftime('%w',daydate) not in ('0','6') and daydate not in (select vacancydate from vacancy where vacancydate between '"+pconfig.year+"-01-01' and '"+pconfig.year+"-12-31' and vacancydateto is null) " + + ") vd on (vd.daydate between vc.datefrom and vc.dateto) " + + "left join staffvacancydays svd on (vc.staffuuid=svd.staffuuid) " + + "where vc.staffuuid='"+pconfig.uuid+ "' and daydate is not null group by daydate) group by type,taken,accepted;"; + //dump("SQL2:" + vcalcsql + "\n"); + var vcalc = appdb.dbquery(vcalcsql); + vcalc = vcalc.sqldata; + //dump(JSON.stringify(vcalc)+ "\n"); + vhours = vdays * 8; + var vac = {}; + $("#lblyear").html(pconfig.year); + vac.normal = {taken:{hours:0,days:0},open:{vhours:parseFloat(vhours), days:parseFloat(vdays)},accepted:{hours:0,days:0},asked:{hours:0,days:0}}; + vac.extra = {taken:{hours:0,days:0},open:{hours:0, days:0},accepted:{hours:0,days:0},asked:{hours:0,days:0}}; + vac.ill = {taken:{hours:0,days:0},open:{hours:0, days:0},accepted:{hours:0,days:0},asked:{hours:0,days:0}}; + vac.total = {taken:{hours:0,days:0},open:{hours:0, days:0},accepted:{hours:0,days:0},asked:{hours:0,days:0}}; + //dump(JSON.stringify(vac) + "\n"); + if (vcalc) { + for (var c in vcalc){ + if (vcalc[c].type == '0' ){ //normal + if (vcalc[c].taken == '1'){ + if (vcalc[c].accepted=='1'){ + vac.normal.taken.days = vac.normal.taken.days + parseFloat(vcalc[c].days); + vac.normal.taken.hours = vac.normal.taken.hours + parseFloat(vcalc[c].hours); + } else { + vac.normal.asked.days = vac.normal.asked.days + parseFloat(vcalc[c].days); + vac.normal.asked.hours = vac.normal.asked.hours + parseFloat(vcalc[c].hours); + } + + } else if (vcalc[c].taken == '0') { + if (vcalc[c].accepted=='1'){ + vac.normal.accepted.days = vac.normal.accepted.days + parseFloat(vcalc[c].days); + vac.normal.accepted.hours = vac.normal.accepted.hours + parseFloat(vcalc[c].hours); + } else { + vac.normal.asked.days = vac.normal.asked.days + parseFloat(vcalc[c].days); + vac.normal.asked.hours = vac.normal.asked.hours + parseFloat(vcalc[c].hours); + } + + } + vac.normal.open.days = parseFloat(vdays) - vac.normal.taken.days - vac.normal.accepted.days - vac.normal.asked.days; + vac.normal.open.hours = parseFloat(vhours) - vac.normal.taken.hours - vac.normal.accepted.hours - vac.normal.asked.hours; + //total + + } else if (vcalc[c].type == '1' ){ //extra + if (vcalc[c].taken == '1'){ + if (vcalc[c].accepted=='1'){ + vac.extra.taken.days = vac.extra.taken.days + parseFloat(vcalc[c].days); + vac.extra.taken.hours = vac.extra.taken.hours + parseFloat(vcalc[c].hours); + } else { + vac.extra.asked.days = vac.extra.asked.days + parseFloat(vcalc[c].days); + vac.extra.asked.hours = vac.extra.asked.hours + parseFloat(vcalc[c].hours); + } + } else if (vcalc[c].taken == '0'){ + if (vcalc[c].accepted=='1'){ + vac.extra.accepted.days = vac.extra.accepted.days + parseFloat(vcalc[c].days); + vac.extra.accepted.hours = vac.extra.accepted.hours + parseFloat(vcalc[c].hours); + } else { + vac.extra.asked.days = vac.extra.asked.days + parseFloat(vcalc[c].days); + vac.extra.asked.hours = vac.extra.asked.hours + parseFloat(vcalc[c].hours); + } + } + vac.extra.open.days = 0; + vac.extra.open.hours = 0; + } else if (vcalc[c].type == '-1' ){ //ill + if (vcalc[c].taken == '1'){ + vac.ill.taken.days = vac.ill.taken.days + parseFloat(vcalc[c].days); + vac.ill.taken.hours = vac.ill.taken.hours + parseFloat(vcalc[c].hours); + } else if (vcalc[c].taken == '0'){ + if (vcalc[c].accepted=='1'){ + vac.ill.accepted.days = vac.ill.accepted.days + parseFloat(vcalc[c].days); + vac.ill.accepted.hours = vac.ill.accepted.hours + parseFloat(vcalc[c].hours); + } else { + vac.ill.asked.days = vac.ill.asked.days + parseFloat(vcalc[c].days); + vac.ill.asked.hours = vac.ill.asked.hours + parseFloat(vcalc[c].hours); + } + } + vac.ill.open.days = 0; + vac.ill.open.hours = 0; + + } + vac.total.taken.days = vac.normal.taken.days + vac.extra.taken.days + vac.ill.taken.days; + vac.total.taken.hours = vac.normal.taken.hours + vac.extra.taken.hours + vac.ill.taken.hours; + vac.total.open.days = vac.normal.open.days + vac.extra.open.days + vac.ill.open.days; + vac.total.open.hours = vac.normal.open.hours + vac.extra.open.hours + vac.ill.open.hours; + vac.total.accepted.days = vac.normal.accepted.days + vac.extra.accepted.days + vac.ill.accepted.days; + vac.total.accepted.hours = vac.normal.accepted.hours + vac.extra.accepted.hours + vac.ill.accepted.hours; + vac.total.asked.days = vac.normal.asked.days + vac.extra.asked.days + vac.ill.asked.days; + vac.total.asked.hours = vac.normal.asked.hours + vac.extra.asked.hours + vac.ill.asked.hours; + } + //JSON.stringify(vac) + "\n"); + if (pconfig.vacancyunit == 'days'){ + $("#vacnopen").html(((vac.normal.open.days && vac.normal.open.days != 0)?vac.normal.open.days.toFixed(2)+" j":" ")); + $("#vacntaken").html(vac.normal.taken.days.toFixed(2)+" j"); + $("#vacnasked").html(vac.normal.asked.days.toFixed(2)+" j"); + $("#vacnplanned").html(vac.normal.accepted.days.toFixed(2)+" j"); + + $("#vaceopen").html(" "); + $("#vacetaken").html(vac.extra.taken.days.toFixed(2)+" j"); + $("#vaceasked").html(vac.extra.asked.days.toFixed(2)+" j"); + $("#vaceplanned").html(vac.extra.accepted.days.toFixed(2)+" j"); + + $("#vacmopen").html(" "); + $("#vacmtaken").html(vac.ill.taken.days.toFixed(2)+" j"); + $("#vacmasked").html(vac.ill.asked.days.toFixed(2)+" j"); + $("#vacmplanned").html(vac.ill.accepted.days.toFixed(2)+" j"); + + $("#vactopen").html(vac.total.open.days.toFixed(2)+" j"); + $("#vacttaken").html(vac.total.taken.days.toFixed(2)+" j"); + $("#vactasked").html(vac.total.asked.days.toFixed(2)+" j"); + $("#vactplanned").html(vac.total.accepted.days.toFixed(2)+" j"); + } else { + vac.normal.open.hours=vac.normal.open.hours + parseInt($("#vacancylastyearrest").val()); + $("#vacnopen").html(((vac.normal.open.hours && vac.normal.open.hours != 0)?vac.normal.open.hours.toFixed(2)+" h":" ")); + $("#vacntaken").html(((vac.normal.taken.hours && vac.normal.taken.hours > 0)?vac.normal.taken.hours.toFixed(2)+" h":" ")); + $("#vacnasked").html(((vac.normal.asked.hours && vac.normal.asked.hours > 0)?vac.normal.asked.hours.toFixed(2)+" h":" ")); + $("#vacnplanned").html(((vac.normal.accepted.hours && vac.normal.accepted.hours > 0)?vac.normal.accepted.hours.toFixed(2)+" h":" ")); + + $("#vacetaken").html(((vac.extra.taken.hours && vac.extra.taken.hours > 0)?vac.extra.taken.hours.toFixed(2)+" h":" ")); + $("#vaceasked").html(((vac.extra.asked.hours && vac.extra.asked.hours > 0)?vac.extra.asked.hours.toFixed(2)+" h":" ")); + $("#vaceplanned").html(((vac.extra.accepted.hours && vac.extra.accepted.hours > 0)?vac.extra.accepted.hours.toFixed(2)+" h":" ")); + + $("#vacmtaken").html(((vac.ill.taken.hours && vac.ill.taken.hours > 0)?vac.ill.taken.hours.toFixed(2)+" h":" ")); + $("#vacmasked").html(((vac.ill.asked.hours && vac.ill.asked.hours > 0)?vac.ill.asked.hours.toFixed(2)+" h":" ")); + $("#vacmplanned").html(((vac.ill.accepted.hours && vac.ill.accepted.hours > 0)?vac.ill.accepted.hours.toFixed(2)+" h":" ")); + + $("#vactopen").html(((vac.total.open.hours && vac.total.open.hours > 0)?vac.total.open.hours.toFixed(2)+" h":" ")); + $("#vacttaken").html(((vac.total.taken.hours && vac.total.taken.hours > 0)?vac.total.taken.hours.toFixed(2)+" h":" ")); + $("#vactasked").html(((vac.total.asked.hours && vac.total.asked.hours > 0)?vac.total.asked.hours.toFixed(2)+" h":" ")); + $("#vactplanned").html(((vac.total.accepted.hours && vac.total.accepted.hours > 0)?vac.total.accepted.hours.toFixed(2)+" h":" ")); + + } + + //dump(JSON.stringify(vac) + " - Set data vacancy status\n"); + // var hdata = " pris: "+ vac.taken.hours +" h ("+ vac.taken.days.toFixed(2)+" jour(s)) - "; + // hdata += " planifié: "+ vac.rest.hours+" h ("+ vac.rest.days.toFixed(2)+" jour(s)) - "; + // hdata += " ouvert: "+ vac.open.hours +" h ("+ vac.open.days.toFixed(2)+" jour(s))"; + // if (vac.ill > 0) { + // hdata += " -  (maladie: "+ vac.ill.hours+" h ("+ vac.ill.days.toFixed(2)+" jour(s)))"; + // } + //dump("HTML: --" + document.getElementById("vacancystatus").innerHTML +"//\n->" + hdata + "\n"); + //$("#vacancystatus").html(""); + //if ($("#vacancystatus")){ + //dump("vacancystatus exists\n"); + // + //} + $("#vacancystatus").html(""); + } + else { + $("#vacancystatus").html(""); + } +} + +function saveyearvacdays() { + var csel = "select * from staffvacancydays where staffuuid='"+pconfig.uuid+"' and vacancyyear='"+pconfig.year+"';"; + var days = 0; + var hours = 0; + if ($('#vacancyyeartotal').val() === ""){ + return; + } + if (pconfig.vacancyunit == "hours"){ + days = parseFloat($('#vacancyyeartotal').val().replace(',','.')) / 8; + hours = $('#vacancyyeartotal').val(); + }else { + days = parseFloat($('#vacancyyeartotal').val().replace(',','.')); + hours = parseFloat($('#vacancyyeartotal').val().replace(',','.')) * 8; + } + var cnum = appdb.dbquery(csel); + var inssql = "INSERT INTO staffvacancydays (staffuuid,vacancyyear,days,hours) VALUES ('"+pconfig.uuid+"','"+pconfig.year+"',"+days+","+hours+");"; + if (cnum.sqldata.length > 0) { + inssql = "UPDATE staffvacancydays SET days="+days+",hours="+hours+" where staffuuid='"+pconfig.uuid+"' and vacancyyear='"+pconfig.year+"';"; + } + appdb.dbexec(inssql); + calcvacancy(); +} + +function setvacancyunit(){ + var vacunit = $('#vacancy_unit').val(); + if ($('#vacancyyeartotal').val() !== ""){ + var vacval = parseFloat($('#vacancyyeartotal').val().replace(',','.')); + if (((!pconfig.vacancyunit) || (pconfig.vacancyunit == 'days')) && (vacunit == 'hours')){ + $('#vacancyyeartotal').val(vacval * 8); + }else if (pconfig.vacancyunit != vacunit){ + $('#vacancyyeartotal').val(vacval / 8); + } + } + //dump("vacunit: " + vacunit + "\n"); + pconfig.vacancyunit = vacunit; + apppref.setpreference("pageconfig.coworker",pconfig); +} + +function dlg_event(uuid, type) { + + $('#staffuuid').multiselect('deselectAll', false); + $('#staffuuid').multiselect('updateButtonText'); + if (type== "ins") { + + $('#btndeleteevent').hide(); + + }else { + $('#btndeleteevent').show(); + } + $('#frmeditevent #freqinterval').hide(); + $('#frmeditevent #freqmonthly').hide(); + $('#frmeditevent #freqweekly').hide(); + $('#frmeditevent #freq_monthly_byday').show(); + $('#frmeditevent #freq_monthly_bymonthday').hide(); + $('#frmeditevent #freq').val(""); + $('#frmeditevent .active').removeClass('active'); + if ((type == 'upd') || (type == 'ins')) { + + var evdata = { + uuid: '0', + description: '', + activityuuid:'', + location: '', + color: '', + datefrom:new Date().toLocaleFormat("%d.%m.%Y"), + dateto:'', + staffuuid:'', + timefrom: '00:00', + timeto: '00:00', + freq: '' + }; + + if (type == 'upd') { + var evsql = "SELECT uuid, strftime(\"%d.%m.%Y\",datefrom) as datefrom, strftime(\"%d.%m.%Y\",dateto) as dateto, timefrom, timeto, description, location, color, freq, GROUP_CONCAT(st.staffuuid,',') as staffuuid FROM eventcalendar ev left join staffplanning st on (ev.uuid=st.eventcalendaruuid) where ev.uuid='" + uuid.uuid + "' group by ev.uuid;"; + evdata = appdb.dbquery(evsql); + evdata = evdata.sqldata[0]; + if (evdata.freq != '') { + var tmpfreq = evdata.freq.split(';'); + for (var t in tmpfreq){ + if (tmpfreq[t] != '') { + var spl = tmpfreq[t].split("="); + evdata[spl[0].toLowerCase()] = spl[1].toLowerCase(); + } + } + } + } + for (var w in evdata) { + if ($("#frmeditevent #" + w)) { + if (w == 'staffuuid') { + if (evdata[w] == '') { + $("#frmeditevent #" + w).multiselect('select',[]); + } else { + $("#frmeditevent #" + w).multiselect('select',evdata[w].split(',')); + } + + }else if (w == 'color') { + $("#frmeditevent #color").val(evdata[w]); + $('#frmeditevent #color').minicolors('value',{color: evdata[w]}); + } + else { + $("#frmeditevent #" + w).val(evdata[w]); + } + } + } + if ((evdata.freq == 'weekly') && (evdata.byday)) { + var bd = evdata.byday.split(','); + for (var i in bd){ + document.getElementById('weekly_byday_' + bd[i]).setAttribute("checked",true); + $('#frmeditevent #weekly_byday_' + bd[i]).parent().addClass("active"); + } + } + if (evdata.freq == 'monthly') { + $('#freq_monthly_byday').hide(); + $('#freq_monthly_bymonthday').hide(); + $('#pnl_monthly_byday').removeAttr("checked"); + $('#pnl_monthly_bymonthday').removeAttr("checked"); + if (evdata.byday) { + document.getElementById('pnl_monthly_byday').setAttribute("checked",true); + $('#frmeditevent #pnl_monthly_byday').parent().addClass("active"); + $('#freq_monthly_byday').show(); + var bd = evdata.byday.split(','); + var adpos = new Array(); + var awday = new Array(); + for (var i in bd){ + var wday = bd[i].substr(bd[i].length-2); + var pos = bd[i].substring(0,bd[i].length-2); + awday.push(wday.toLowerCase()); + adpos.push(pos); + } + + for (var i in adpos){ + document.getElementById('monthly_bydaypos_' + adpos[i]).setAttribute("checked",true); + $('#frmeditevent #monthly_bydaypos_' + adpos[i]).parent().addClass("active"); + } + for (var i in awday){ + document.getElementById('monthly_bydaywday_' + awday[i]).setAttribute("checked",true); + $('#frmeditevent #monthly_bydaywday_' + awday[i]).parent().addClass("active"); + } + }else if (evdata.bymonthday) { + document.getElementById('pnl_monthly_bymonthday').setAttribute("checked",true); + $('#frmeditevent #pnl_monthly_bymonthday').parent().addClass("active"); + $('#freq_monthly_bymonthday').show(); + var bd = evdata.bymonthday.split(','); + for (var i in bd){ + document.getElementById('monthly_bymonthday_' + bd[i]).setAttribute("checked",true); + $('#frmeditevent #monthly_bymonthday_' + bd[i]).parent().addClass("active"); + } + } + } + setfreq(); + $("#edit_event").modal('show'); + } +} + + +function save_event() { + var sql1 = new Array(); + var sql2 = new Array(); + if ($('#dateto').val() != '' && (encodeparam($('#datefrom').val()) > encodeparam($('#dateto').val())) ) { + errormsg("Erreur","La Date début ne peut pas être supérieur à la date fin!"); + return false; + } + if ($('#timeto').val() != '' && (encodeparam($('#timefrom').val()) > encodeparam($('#timeto').val())) ) { + errormsg("Erreur","L'heure de début ne peut pas être supérieur à la heure de fin!"); + return false; + } + var type = 'ins'; + var cuuid = ""; + if ($("#frmeditevent #uuid").val() != 0) { + type = 'upd'; + cuuid = $("#frmeditevent #uuid").val(); + } else { + cuuid = appdb.generate_uuid(); + } + var freqdata = {}; + var cfreq = $("#frmeditevent #freq").val(); + $("#frmeditevent :input").each(function() { + var input = $(this); + + if (input.attr("id") && (input.attr("id") != "staffuuid")) { + if ((input.attr("type") == "checkbox") && (input.attr("id").indexOf(cfreq) >= 0)){ + var xd = input.attr("id").split("_"); + if (input.attr("checked")) { + if (!freqdata[xd[1]]) { + freqdata[xd[1]] = new Array(); + } + freqdata[xd[1]].push(input.val()); + } + } + else if ((input.attr("type") == "radio") && (input.attr("id").indexOf(cfreq) >= 0)) { + var xd = input.attr("id").split("_"); + if (input.attr("checked")) { + freqdata['freqtype'] = xd[2]; + } + } + else if ((input.attr("type") != "checkbox") && ((input.attr("type") != "radio"))){ + if ((input.attr("id") == 'interval') || (input.attr("id") == 'freq')) { + freqdata[input.attr("id")] = input.val(); + } else if ((type == 'ins') && (input.attr("id") != 'staffuuid')) { + + sql1.push('"' + input.attr("id") + '"'); + if (input.attr("id") == 'uuid') { + if (input.val() == "" || input.val() == "0") { + sql2.push("'" + cuuid + "'"); + } else { + sql2.push("'" + input.val() + "'"); + } + } else { + var ival = encodeparam(input.val(), input.attr('type')); + sql2.push(ival); + } + } else { + if ((input.attr("id") != 'uuid') && (input.attr("id") != 'staffuuid')){ + var ival = encodeparam(input.val(), input.attr('type')); + sql2.push('"' + input.attr("id") + '"=' + ival); + } + } + } + } + + }); + if (!freqdata.freqtype) { + freqdata['freqtype'] = curfreq.freqtype; + } + + var strfreq =""; + if (cfreq != "") { + strfreq='FREQ=' + cfreq.toUpperCase()+';INTERVAL=' + freqdata.interval +';'; + if ((cfreq == 'weekly') && (freqdata.byday)){ + strfreq += 'BYDAY=' + freqdata.byday.join(","); + } + if ((cfreq == 'monthly') && (freqdata.bydaypos) || ((freqdata.bydaywday)) || (freqdata.bymonthday)){ + strfreq += freqdata.freqtype.toUpperCase() + '='; + if (freqdata.freqtype == 'bymonthday') { + strfreq += freqdata.bymonthday.join(',') + ";" + }else { + var abyday = new Array(); + for (var p in freqdata.bydaypos){ + for (var w in freqdata.bydaywday){ + abyday.push(freqdata.bydaypos[p] + freqdata.bydaywday[w]); + } + } + strfreq += abyday.join(","); + } + } + if (strfreq.slice(-1) == ';') { + strfreq = strfreq.substring(0,strfreq.length-1); + } + } + var staffuuids = $('#staffuuid').val(); + var delsql = ""; + var xsql = []; + if (type != 'ins') { + xsql.push("DELETE FROM staffplanning where eventcalendaruuid = '"+cuuid+"';"); + } + var staffinssql = ""; + if (staffuuids && (staffuuids.length != 0)) { + staffinssql = "INSERT INTO staffplanning (eventcalendaruuid,staffuuid) VALUES "; + var tmps = [] + for (var s in staffuuids){ + tmps.push("('"+cuuid+"','"+staffuuids[s]+"')"); + } + staffinssql += tmps.join(',') + ";"; + xsql.push(staffinssql); + } + + + if (type == 'upd') { + sql2.push('freq=' + encodeparam(strfreq)); + xsql.push("UPDATE eventcalendar SET " + sql2.join(',') + " where \"uuid\"='" + cuuid + "';"); + } else { + sql1.push('freq'); + sql2.push(encodeparam(strfreq)); + xsql.push("INSERT INTO eventcalendar (" + sql1.join(',') + ") VALUES (" + sql2.join(',') + ");"); + } + for (var i in xsql){ + appdb.dbexec(xsql[i]); + } + + load_event_data(); + + $("#frmeditevent #uuid").val("0"); + $("#edit_event").modal('hide'); +} + +function confirm_delete_event() { + $("#confirm_delete_event").modal('show'); + return false; +} + +function delete_event() { + appdb.dbexec("DELETE FROM eventcalendar where uuid='" + $('#frmeditevent #uuid').val()+"';"); + appdb.dbexec("DELETE FROM staffplanning where eventcalendaruuid='" + $('#frmeditevent #uuid').val()+"';"); + load_event_data(); + $("#confirm_delete_event").modal('hide'); + + return false; +} + + + +function setfreq() { + + curfreq.freq = $('#freq option:selected').val(); + + $('#freqinterval').hide(); + $('#freqmonthly').hide(); + $('#freqweekly').hide(); + if (curfreq.freq != "") { + + $('#lblfreq').text(lblfreq[curfreq.freq]); + $('#freqinterval').show(); + if (curfreq.freq != 'daily') { + $('#freq' + curfreq.freq).show(); + } + } + +} + +function load_staff_selection(objid,option){ + var stdata = appdb.dbquery("select uuid, coalesce(surname,'') || ' ' || coalesce(prename,'') as name,case when color is null then '#000' else color end as color from staff order by surname,prename"); + + stdata = stdata.sqldata; + for (var s in stdata){ + $('#' + objid).append(''); + } + + var copt = {}; + if (option) { + copt = option; + } + copt['enableHTML'] = true; + copt['nonSelectedText']="Sélectionner un(e) employé(e)..."; + copt['numberDisplayed']=5; + copt['allSelectedText']='Tous'; + copt['nSelectedText']=' selections'; + + $('#' + objid).multiselect(copt); + +} + +function accept_vacancy(){ + var cuuid = ""; + if ($("#frmeditvacancy #uuid").val() != 0) { + type = 'upd'; + cuuid = $("#frmeditvacancy #uuid").val(); + } + var xsql = "UPDATE vacancycalendar SET accepted='1' where \"uuid\"='" + cuuid + "';"; + appdb.dbexec(xsql); + load_table_vacancy(); + + $("#frmeditvacancy #uuid").val("0"); + $("#edit_vacancy").modal('hide'); +} + +function getlastyearsrest(){ + var weekhours = $('#staff_weekhours').val(); + if (weekhours === '') { + $("#vacancylastyearrest").val(0); + return; + } + var df = new Date(pconfig.year-1,0,1); + var dt = new Date(pconfig.year-1,11,31); + var vcalcrestsql = "select (select hours from staffvacancydays where staffuuid='"+pconfig.uuid+ "' and vacancyyear="+df.getFullYear()+")-SUM(dayhours) AS hours from (" + + "select vd.daydate,case when daydate <= date('now') then 1 else 0 end as taken,case when vc.timefrom=vc.timeto then cast ("+weekhours+"/5 as real) else (cast (substr(vc.timeto,1,2) as int) + (cast(substr(vc.timeto,4,5) as int)/60)) - (cast(substr(vc.timefrom,1,2) as int) + (cast(substr(vc.timeto,4,5) as int)/60)) end as dayhours,type,case when type != -1 then accepted else '1' end as accepted "+ + "from vacancycalendar vc left join ( "+ + "select daydate from ( "; + + var yd = []; + for (var dx=df;dx<=dt;dx.setDate(dx.getDate()+1)){ + yd.push("select date('"+dx.toLocaleFormat('%Y-%m-%d')+"') as daydate"); + } + vcalcrestsql += yd.join(" UNION ") + + ") yd where strftime('%w',daydate) not in ('0','6') and daydate not in (select vacancydate from vacancy where vacancydate between '"+df.getFullYear()+"-01-01' and '"+dt.getFullYear()+"-12-31' and vacancydateto is null) " + + ") vd on (vd.daydate between vc.datefrom and vc.dateto) " + + "left join staffvacancydays svd on (vc.staffuuid=svd.staffuuid) " + + "where vc.staffuuid='"+pconfig.uuid+ "' and daydate is not null group by daydate) where type in (0,1) and taken=1 and accepted=1 group by taken,accepted;"; + //dump("SQLREST:" + vcalcrestsql + "\n"); + var vcalc = appdb.dbquery(vcalcrestsql); + //dump(JSON.stringify(vcalc) + "\n"); + if (vcalc && vcalc.sqldata[0]){ + + $("#vacancylastyearrest").val(vcalc.sqldata[0].hours); + }else { + $("#vacancylastyearrest").val(0); + } + return; +} diff --git a/app_v3satdemo/chrome/content/modules/staff/js/coworker_basic.js b/app_v3satdemo/chrome/content/modules/staff/js/coworker_basic.js new file mode 100644 index 0000000..8d7b59b --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/staff/js/coworker_basic.js @@ -0,0 +1,827 @@ +//Source-code licensed under EUPL v1.1 ( Copyright 2016 By DKS s.à r.l. - Kilian Saffran - Luxembourg ) +var pconfig = null; +var delplan = null; +var delvacation = null; +var wh= window.innerHeight -440; +var curdatediff = null; +var redate = /\d\d.\d\d.\d\d\d\d/; +var curfreq ={}; +//var lictype = apppref.getpreference("support.lictype"); + +function initdata() { + load_helpers(); + var pdata = apppref.getpreference("pageconfig.coworker"); + if (pdata != '') { + pconfig = JSON.parse(pdata); + } + //"get CoWorker cfg:" +JSON.stringify(pconfig) + "\n"); + if (!pconfig.year) { + pconfig.year=new Date().getFullYear(); + } + if (!pconfig.printlayout) { + pconfig.printlayout = 'list'; + apppref.setpreference("pageconfig.coworker",pconfig); + } + var cdatasql = "SELECT jobtitle, prename, surname, address, zip, city, country, strftime('%d.%m.%Y',entrydate) as entrydate, strftime('%d.%m.%Y',exitdate) as exitdate, iban, bic, accountname, phone, email, uuid,color,weekhours,case when password is not null and length(password) > 3 then 1 else 0 end as passwordset FROM staff where uuid='" + pconfig.uuid + "';"; + var cdata = appdb.dbquery(cdatasql); + cdata = cdata.sqldata[0]; + for (var ci in cdata) { + if (document.getElementById("staff_" + ci)) { + + $("#staff_" + ci).val(cdata[ci]); + if (ci == "color"){ + $("#staff_color").css("background-color",cdata[ci]); + $("#staff_color").val(""); + } + + } + + } + var crdata = appdb.dbquery("select stafflist from creche;"); + if ((crdata) && (crdata.sqldata[0].stafflist == "1")){ + $("#pwddata").hide(); + } + if (cdata) { + set_infoheader(cdata.prename + " " + cdata.surname); + } + set_selectyears(); + + if (pconfig && pconfig.activetab) { + $('a[href="#'+pconfig.activetab+'"]').tab('show'); + }else{ + $('a[href="#vacancy"]').tab('show'); + pconfig.activetab = 'vacancy'; + } + +//if (pconfig && pconfig.vacancyunit){ +////dump("has vacancy unit:" + pconfig.vacancyunit + "\n"); +//$('#vacancy_unit').val(pconfig.vacancyunit); +//}else { +pconfig.vacancyunit = "hours"; +//$('#vacancy_unit').val("days"); +//} + + $('#frmeditvacancy #vacdatefrom').on("blur",function (e) { + var ok = true; + if ($('#frmeditvacancy #vacdatefrom').val().match(redate)) { + $('#btn_save_vacancy').removeAttr("disabled"); + }else { + ok = false; + $('#btn_save_vacancy').attr("disabled","1"); + } + if ((ok == true) && ($('#frmeditvacancy #vacdateto').val() != '')) { + var tmpdt1 = encodeparam($('#frmeditvacancy #vacdatefrom').val(),'date'); + var nd = new Date(tmpdt1.replace(/'/g,'')); + var xd = new Date(nd.getFullYear(),nd.getMonth(),nd.getDate() + curdatediff); + $('#frmeditvacancy #vacdateto').val(xd.toLocaleFormat("%d.%m.%Y")); + var tmpdt2 = encodeparam($('#frmeditvacancy #vacdateto').val(),'date'); + if (tmpdt1 > tmpdt2) { + $('#btn_save_vacancy').attr("disabled","1"); + } else { + $('#btn_save_vacancy').removeAttr("disabled"); + } + + } + }); + $('#frmeditvacancy #vacdateto').on("blur",function (e) { + var ok = true; + if ($('#frmeditvacancy #vacdateto').val().match(redate)) { + $('#btn_save_vacancy').removeAttr("disabled"); + }else { + ok = false; + $('#btn_save_vacancy').attr("disabled","1"); + } + curdatediff=daysBetween(new Date(encodeparam($('#frmeditvacancy #vacdatefrom').val(),'date').replace(/'/g,'')),new Date(encodeparam($('#frmeditvacancy #vacdateto').val(),'date').replace(/'/g,''))); + if ((ok == true) && ($('#frmeditvacancy #vacdateto').val() != '')) { + var tmpdt1 = encodeparam($('#frmeditvacancy #vacdatefrom').val(),'date'); + var tmpdt2 = encodeparam($('#frmeditvacancy #vacdateto').val(),'date'); + if (tmpdt1 > tmpdt2) { + $('#btn_save_vacancy').attr("disabled","1"); + } else { + $('#btn_save_vacancy').removeAttr("disabled"); + } + + } + }); + + + $("#weekly_byday :input").change(function() { + if (this.checked) { + this.setAttribute("checked",true); + }else { + this.removeAttribute("checked"); + } + +}); + $("#monthly_bydaypos :input").change(function() { + + if (this.checked) { + this.setAttribute("checked",true); + }else { + this.removeAttribute("checked"); + } + +}); + $("#monthly_bydaywday :input").change(function() { + + if (this.checked) { + this.setAttribute("checked",true); + }else { + this.removeAttribute("checked"); + } + +}); + $("#monthly_bymonthday :input").change(function() { + + if (this.checked) { + this.setAttribute("checked",true); + }else { + this.removeAttribute("checked"); + } + +}); + $("#monthly_by :input").change(function() { + var xd = this.id.split("_"); + curfreq.freqtype=xd[2]; + + this.setAttribute("checked",true); + + $('#freq_monthly_byday').hide(); + $('#freq_monthly_bymonthday').hide(); + $('#pnl_monthly_byday').removeAttr("checked"); + $('#pnl_monthly_bymonthday').removeAttr("checked"); + + $('#freq_' + this.value).show(); + +}); + + $('#frmeditevent #datefrom').on("blur",function (e) { + var ok = true; + if ($('#frmeditevent #datefrom').val().match(redate)) { + $('#btn_save_event').removeAttr("disabled"); + }else { + ok = false; + $('#btn_save_event').attr("disabled","1"); + } + if ((ok == true) && ($('#frmeditevent #dateto').val() != '')) { + var tmpdt1 = encodeparam($('#frmeditevent #datefrom').val(),'date'); + var tmpdt2 = encodeparam($('#frmeditevent #dateto').val(),'date'); + if (tmpdt1 >= tmpdt2) { + $('#btn_save_event').attr("disabled","1"); + } else { + $('#btn_save_event').removeAttr("disabled"); + } + + } + }); + $('#frmeditevent #dateto').on("blur",function (e) { + var ok = true; + if ($('#frmeditevent #dateto').val().match(redate)) { + $('#btn_save_event').removeAttr("disabled"); + }else { + ok = false; + $('#btn_save_event').attr("disabled","1"); + } + if ((ok == true) && ($('#frmeditevent #dateto').val() != '')) { + var tmpdt1 = encodeparam($('#frmeditevent #datefrom').val(),'date'); + var tmpdt2 = encodeparam($('#frmeditevent #dateto').val(),'date'); + + if (tmpdt1 >= tmpdt2) { + $('#btn_save_event').attr("disabled","1"); + } else { + $('#btn_save_event').removeAttr("disabled"); + } + + } + }); + +} + +$('.selyear').on( "change", function(e){ + e.preventDefault(); + + $(".selyear").val($(this).val()); + pconfig.year = $(this).val(); + apppref.setpreference("pageconfig.coworker",pconfig); + if ($(this).attr('id') == "year_organisation") { + load_event_data(); + }else if ($(this).attr('id') == "year_vacancy") { + load_table_vacancy(); + } +}); + +$('a[data-toggle="tab"]').on('shown.bs.tab', function (e) { + var tn = e.target.toString(); + pconfig.activetab = tn.substring(tn.lastIndexOf("#")+1); + //dump(JSON.stringify(pconfig) + "\n"); + apppref.setpreference("pageconfig.coworker",pconfig); + if (pconfig.activetab == 'activity') { + load_event_data(); + } + if (pconfig.activetab == 'vacancy') { + load_table_vacancy(); + } + }); + +function load_event_data() { + var where = new Array(); + + where.push(" st.uuid in ('"+ pconfig.uuid + "')"); + + $("div.panel-daybody").html(""); + var sql = "SELECT cal.uuid, cal.datefrom, cal.dateto, '
    ' || strftime('%Y%m%d',cal.datefrom) ||'
    ' || strftime('%d.%m.%Y',cal.datefrom) AS tbldatefrom ,strftime('%Y%m%d',cal.datefrom) AS strdatefrom, strftime('%Y%m%d',cal.dateto) AS strdateto,cal.timefrom, cal.timeto, cal.description, cal.location, cal.color, cal.freq, '[\"' || GROUP_CONCAT(sp.staffuuid,'\",\"') || '\"]' as staffuuid, GROUP_CONCAT(coalesce(st.surname,'') || ' ' || coalesce(st.prename,''), '
    ' ) as staffnames ,'[\"' || GROUP_CONCAT(st.color,'\",\"') || '\"]' as staffcolors from eventcalendar cal " +" join staffplanning sp on (cal.uuid=sp.eventcalendaruuid " + " AND sp.staffuuid in ('"+ pconfig.uuid +"')) left join staff st on (sp.staffuuid=st.uuid) "+ + " where (cal.datefrom between '" + $('#year_organisation').val() + "-01-01' and '" + $('#year_organisation').val() + "-12-31' and (cal.dateto >= '" + $('#year_organisation').val() + "-01-01' or cal.dateto is null)) or (cal.dateto between '" + $('#year_organisation').val() + "-01-01' and '" + $('#year_organisation').val() + "-12-31' and cal.datefrom < '" + $('#year_organisation').val() + "-01-01') or ((cal.datefrom <= '" + $('#year_organisation').val() + "-01-01') and ((cal.dateto >= '" + $('#year_organisation').val() + "-12-31') or cal.dateto is null)) "+ ((where.length > 0)?" AND (" + where.join(" or ") + ")":"")+" group by cal.uuid order by cal.datefrom,cal.dateto;"; + + var caldata = appdb.dbquery(sql); + + caldata = caldata.sqldata; + + var headerdata = getlabels("act,activity,datefrom,hours,recurrance"); + $("#tbl_activity").html(""); + + var hrow = headerdata; + var tdclass= new Array(); + var tblheader = ''; + + for (var h=0;h'+ headerdata[h].title+''; + } + tblheader += ''; + + $("#tbl_activity").append("" + tblheader + ""); + $("#tbl_activity").append(""); + var tblbody = []; + for (var c in caldata) { + var tblrow = ""; + tblrow += ' '; + tblrow += ""+caldata[c].description+"" + caldata[c].description + ""; + tblrow += "" + caldata[c].tbldatefrom + ""; + tblrow += "" + caldata[c].timefrom + "- " + caldata[c].timeto + ""; + + var freq2 = caldata[c].freq; + if (freq2 != '') { + + freq2 += ';DTSTART='+caldata[c].strdatefrom + 'T000000Z'; + if (caldata[c].dateto != ''){ + freq2 += ';UNTIL='+caldata[c].strdateto + 'T000000Z'; + } + } + + try { + + var rule2 = RRule.fromString(freq2); + + + tblrow += "" + rule2.toText() + ""; + + } catch (ex){ + //"ERROR! loading data!" + ex + " FREQ:" + freq2 + "\n"); + } + tblrow += ""; + tblbody.push(tblrow); + } + + //load table + $("#tbl_activity").append(tblbody.join('')); + $("#tbl_activity").append(""); + + tblcal = $("#tbl_activity").dataTable({ + "language": { + "url": "../../web/js/locale/datatable_fr.json" + }, + "paging": false, + "scrollY": wh + "px", + "scrollCollapse": true, + "ordering": true, + "info": false, + "filter": false, + "destroy": true + }); + + //$('#tbl_activity').on( 'search.dt', function () { + // + // pconfig.filter = tblcal.api().search(); + // + // apppref.setpreference("pageconfig.calactivity",pconfig); + //} ); + + //$('#tbl_activity').on( 'order.dt', function () { + // pconfig.order= tblcal.fnSettings().aaSorting; + // + // apppref.setpreference("pageconfig.calactivity",pconfig); + // + //} ); + + if (pconfig.filter) { + tblcal.fnFilter(pconfig.filter); + } + if (pconfig.order) { + tblcal.fnSort(pconfig.order); + } + if ((!pconfig.filter) && (!pconfig.order)) { + tblcal.fnDraw(); + } +} + +function load_table_vacancy() { + + var vacdatasql = "SELECT case when (datefrom > date('now') or accepted!='1') and type != -1 then ' ' else ' ' end AS action," + + "CASE WHEN datefrom!=dateto THEN 'du:' || strftime('%d.%m.%Y', CASE WHEN datefrom < DATE('"+ pconfig.year +"-01-01') THEN DATE('"+ pconfig.year +"-01-01') ELSE datefrom END) || '
    au: ' || strftime('%d.%m.%Y', CASE WHEN dateto > DATE('"+ pconfig.year +"-12-31') THEN DATE('"+ pconfig.year +"-12-31') ELSE dateto END) ELSE strftime('%d.%m.%Y',datefrom) END AS planningdaterange," + + //"case when datefrom!=dateto then strftime('%d.%m.%Y',case when datefrom < date('"+ pconfig.year +"-01-01') then 'de: ' date('"+ pconfig.year +"-01-01') else datefrom end) || '
    à: ' || strftime('%d.%m.%Y',case when dateto > date('"+ pconfig.year +"-12-31') then date('"+ pconfig.year +"-12-31') else dateto end) else strftime('%d.%m.%Y',datefrom) end as planningdaterange, " + + "case when timefrom=timeto then '8h' when (cast(substr(timeto,1,2) as int) - cast(substr(timefrom,1,2) as int))= 4 then '4h' || case when timefrom!='00:00' then '
    à partir de ' || timefrom else '' end else (cast(substr(timeto,1,2) as int) - cast(substr(timefrom,1,2) as int)) || 'h' || case when timefrom!='00:00' then '
    à partir de ' || timefrom else '' end end as hourrange, "+ + "description, " + + "case when type=0 then 'normal' when type=1 then 'exceptionnelle' when type=-1 then 'maladie' end as vacancytype,case when accepted='1' and type != -1 then 'OUI' else 'NON' end as accepted FROM vacancycalendar where staffuuid='"+ pconfig.uuid +"' and (strftime('%Y',dateto)='"+ pconfig.year +"' or strftime('%Y',datefrom)='"+ pconfig.year +"');"; + //dump("XXSQL:" + vacdatasql + "\n"); +var vacdata = appdb.dbqueryarray(vacdatasql); + + + $('#tbl_vacancy').html(""); + //$('#tbl_vacancy').append(''); + getlastyearsrest(); + calcvacancy(); + //vacdata.sqlhead.join(",") + "\n"); + var headerdata = getlabels(vacdata.sqlhead.join(",")); + + $("#tbl_vacancy").dataTable({ + "language": { + "url": "../../web/js/locale/datatable_fr.json" + }, + "data": vacdata.sqldata, + "columns": headerdata, + "paging": false, + "scrollY": wh + "px", + "scrollCollapse": true, + "ordering": true, + "info": false, + "filter": false, + "destroy": true + }); + +} + +//function add_coworker() { +// var newuuid = appdb.generate_uuid(); +// appdb.dbexec("insert into staff (uuid) VALUES ('" + newuuid + "');"); +// globelreq.send_request({ +// page: 'coworker', +// data: { +// "uuid": newuuid +// }, +// header: 'HEADER TODO' +// }); +//} + +function dlg_vacancy(uuid, type) { + var evdata = { + uuid: 0, + description: '', + vacdatefrom:new Date().toLocaleFormat("%d.%m.%Y"), + vacdateto:new Date().toLocaleFormat("%d.%m.%Y"), + staffuuid:pconfig.uuid, + timefrom: '00:00', + hours: '1', + type:'0', + dailyduration:'1.0' + }; + + if (type == 'upd') { + var evsql = "SELECT uuid, strftime(\"%d.%m.%Y\",datefrom) as vacdatefrom, strftime(\"%d.%m.%Y\",dateto) as vacdateto, timefrom, description, '"+pconfig.uuid+"' as staffuuid,type, case when timefrom!=timeto then '0.' || (cast(substr(timeto,1,2) as int) - cast(substr(timefrom,1,2) as int)) else 1.0 end as dailyduration,null as hours,accepted FROM vacancycalendar where uuid='" + uuid.uuid + "';"; + + evdata = appdb.dbquery(evsql); + evdata = evdata.sqldata[0]; + if (evdata.type == -1){ + $("#btnacceptvacancy").hide(); + }else { + $("#btnacceptvacancy").show(); + } + if (evdata.dailyduration == '1') { + evdata.dailyduration = '1.0'; + evdata.hours = '8'; + }else { + evdata.hours = evdata.dailyduration.substring(2,3); + if (evdata.dailyduration != '0.4') { + evdata.dailyduration = '0.'; + } + } + + } + + for (var w in evdata) { + if ((w == 'datefrom') || (w == 'dateto')) { + w='vac' + w; + } + //dump(w + "\n"); + if ($("#frmeditvacancy #" + w)) { + $("#frmeditvacancy #" + w).val(evdata[w]); + } + } + setdailydurationfields(); + $("#edit_vacancy").modal('show'); +} + +function confirm_delete_vacancy(uuid) { + delvacation = uuid; + $("#confirm_delete_vacancy").modal('show'); + return false; +} + +function delete_vacancy() { + var delsql = "DELETE FROM vacancycalendar where uuid='" + delvacation+"';"; + appdb.dbexec(delsql); + load_table_vacancy(); + delvacancy=null; + $("#confirm_delete_vacancy").modal('hide'); + + return false; +} + +function setdailydurationfields() { + var dd = $('#dailyduration :selected').val(); + if (dd=='1.0') { + $("#ftimefrom").hide(); + $("#fhours").hide(); + }else if (dd=='0.4') { + $("#ftimefrom").show(); + $("#fhours").hide(); + }else if (dd=='0.') { + $("#ftimefrom").show(); + $("#fhours").show(); + } +} + +function save_vacancy() { + var sql1 = new Array(); + var sql2 = new Array(); + var type = 'ins'; + var cuuid = ""; + if ($("#frmeditvacancy #uuid").val() != 0) { + type = 'upd'; + cuuid = $("#frmeditvacancy #uuid").val(); + } + + $("#frmeditvacancy :input").each(function() { + var input = $(this); + + if (input.attr("id")) { + + if (type == 'ins') { + + + if (input.attr("id") == 'uuid') { + sql1.push('"' + input.attr("id") + '"'); + if (input.val() == "" || input.val() == "0") { + sql2.push("'" + appdb.generate_uuid() + "'"); + } else { + sql2.push("'" + input.val() + "'"); + } + } else if (input.attr("id") == 'dailyduration') { + sql1.push('"timeto"'); + if (input.val() == '1.0') { + sql2.push("'" +$('#timefrom').val() + "'"); + }else if (input.val() == '0.4') { + var xval = parseInt($('#timefrom').val().substring(1,2)) + 4; + if (xval < 10) { xval = "0" + xval;} + xval += ":00"; + sql2.push("'" + xval + "'"); + }else { + var xval = parseInt($('#timefrom').val().substring(1,2)) + parseInt($('#hours').val()); + if (xval < 10) { xval = "0" + xval;} + xval += ":00"; + sql2.push("'" + xval + "'"); + } + } else if ((input.attr("id") != 'dailyduration') && (input.attr("id") != 'hours')) { + var xid = input.attr("id") + if ((input.attr("id") == 'vacdatefrom') || (input.attr("id") == 'vacdateto')) { + + sql1.push('"' + input.attr("id").substring(3) + '"'); + }else { + sql1.push('"' + input.attr("id") + '"'); + } + + var ival = encodeparam(input.val(), input.attr('type')); + sql2.push(ival); + } + } else { + if ((input.attr("id") != 'uuid') && (input.attr("id") != 'dailyduration') && (input.attr("id") != 'hours')) { + var ival = encodeparam(input.val(), input.attr('type')); + var xid =input.attr("id"); + if ((input.attr("id") == 'vacdatefrom') || (input.attr("id") == 'vacdateto')) { + xid =input.attr("id").substring(3); + } + sql2.push('"' + xid + '"=' + ival); + } else if (input.attr("id") == 'dailyduration') { + if (input.val() == '1.0') { + sql2.push('"timeto"='+ "'" + $('#timefrom').val() + "'"); + }else if (input.val() == '0.4') { + var xval = parseInt($('#timefrom').val().substring(1,2)) + 4; + if (xval < 10) { xval = "0" + xval;} + xval += ":00"; + sql2.push('"timeto"=' +"'" + xval + "'"); + }else { + var xval = parseInt($('#timefrom').val().substring(1,2)) + parseInt($('#hours').val()); + if (xval < 10) { xval = "0" + xval;} + xval += ":00"; + sql2.push('"timeto"=' +"'" + xval + "'"); + } + } + } + + } + + }); + + var xsql = ""; + if (type == 'upd') { + xsql = "UPDATE vacancycalendar SET " + sql2.join(',') + " where \"uuid\"='" + cuuid + "';"; + } else { + + xsql = "INSERT INTO vacancycalendar (" + sql1.join(',') + ") VALUES (" + sql2.join(',') + ");"; + } + + appdb.dbexec(xsql); + load_table_vacancy(); + + $("#frmeditvacancy #uuid").val("0"); + $("#edit_vacancy").modal('hide'); +} + + +function set_selectyears() { + + var years = appdb.dbquery("select strftime('%Y',coalesce(min(entrydate),date('now','-1 year'))) as minyear, strftime('%Y',date('now', '+1 year')) as maxyear from staff where uuid='"+pconfig.uuid+"';"); + var minyear = parseInt(years.sqldata[0].minyear); + var maxyear = parseInt(years.sqldata[0].maxyear); + for (var y=minyear;y<=maxyear;y++){ + + var sel = ""; + if (y == pconfig.year) { + sel=' selected="1" '; + + } + + $(".selyear").append(""); + } + +} + +function calcvacancy() { + //"Calc Vacancy Data!\n"); + var csel = "select days,hours from staffvacancydays where staffuuid='"+pconfig.uuid+"' and vacancyyear='"+pconfig.year+"';"; + //"SQL:"+ csel +"\n"); + var cnum = appdb.dbquery(csel); + + if (cnum.sqldata.length > 0) { + if (pconfig.vacancyunit == "hours"){ + if ((!cnum.sqldata[0].hours) || (cnum.sqldata[0].hours === "")){ + cnum.sqldata[0].hours = cnum.sqldata[0].days * 8; + } + $('#vacancyyeartotal').val(cnum.sqldata[0].hours); + }else{ + $('#vacancyyeartotal').val(cnum.sqldata[0].days); + } + + }else { + $('#vacancyyeartotal').val(""); + } + var vdays = (($('#vacancyyeartotal').val() === "")?"":cnum.sqldata[0].days); + var weekhours = $('#staff_weekhours').val(); + if (vdays === '') { + $('#vacancystatus').html('
    Pas de jours de congés configuré pour l\'année '+ pconfig.year+'!
    '); + return; + }else if (weekhours === '') { + $('#vacancystatus').html('
    Pas de heures par semaine configurées!
    '); + return; + } + + var vcalcsql = "select printf(\"%.2f\",(sum(dayhours) / ("+weekhours+"/5))) as days, SUM(dayhours) as hours,"+ + "taken,type,accepted from (" + + "select vd.daydate,case when daydate <= date('now') then 1 else 0 end as taken,case when vc.timefrom=vc.timeto then cast ("+weekhours+"/5 as real) else (cast (substr(vc.timeto,1,2) as int) + (cast(substr(vc.timeto,4,5) as int)/60)) - (cast(substr(vc.timefrom,1,2) as int) + (cast(substr(vc.timeto,4,5) as int)/60)) end as dayhours,type,case when type != -1 then accepted else '1' end as accepted "+ + "from vacancycalendar vc left join ( "+ + "select daydate from ( "; + var df = new Date(pconfig.year,0,1); + var dt = new Date(pconfig.year,11,31); + var yd = []; + for (var dx=df;dx<=dt;dx.setDate(dx.getDate()+1)){ + yd.push("select date('"+dx.toLocaleFormat('%Y-%m-%d')+"') as daydate"); + } + vcalcsql += yd.join(" UNION ") + + ") yd where strftime('%w',daydate) not in ('0','6') and daydate not in (select vacancydate from vacancy where vacancydate between '"+pconfig.year+"-01-01' and '"+pconfig.year+"-12-31' and vacancydateto is null) " + + ") vd on (vd.daydate between vc.datefrom and vc.dateto) " + + "left join staffvacancydays svd on (vc.staffuuid=svd.staffuuid) " + + "where vc.staffuuid='"+pconfig.uuid+ "' and daydate is not null group by daydate) group by type,taken,accepted;"; + //dump("SQL2:" + vcalcsql + "\n"); + var vcalc = appdb.dbquery(vcalcsql); + vcalc = vcalc.sqldata; + //dump(JSON.stringify(vcalc)+ "\n"); + vhours = vdays * 8; + var vac = {}; + $("#lblyear").html(pconfig.year); + vac.normal = {taken:{hours:0,days:0},open:{vhours:parseFloat(vhours), days:parseFloat(vdays)},accepted:{hours:0,days:0},asked:{hours:0,days:0}}; + vac.extra = {taken:{hours:0,days:0},open:{hours:0, days:0},accepted:{hours:0,days:0},asked:{hours:0,days:0}}; + vac.ill = {taken:{hours:0,days:0},open:{hours:0, days:0},accepted:{hours:0,days:0},asked:{hours:0,days:0}}; + vac.total = {taken:{hours:0,days:0},open:{hours:0, days:0},accepted:{hours:0,days:0},asked:{hours:0,days:0}}; + //dump(JSON.stringify(vac) + "\n"); + if (vcalc) { + for (var c in vcalc){ + if (vcalc[c].type == '0' ){ //normal + if (vcalc[c].taken == '1'){ + if (vcalc[c].accepted=='1'){ + vac.normal.taken.days = vac.normal.taken.days + parseFloat(vcalc[c].days); + vac.normal.taken.hours = vac.normal.taken.hours + parseFloat(vcalc[c].hours); + } else { + vac.normal.asked.days = vac.normal.asked.days + parseFloat(vcalc[c].days); + vac.normal.asked.hours = vac.normal.asked.hours + parseFloat(vcalc[c].hours); + } + + } else if (vcalc[c].taken == '0') { + if (vcalc[c].accepted=='1'){ + vac.normal.accepted.days = vac.normal.accepted.days + parseFloat(vcalc[c].days); + vac.normal.accepted.hours = vac.normal.accepted.hours + parseFloat(vcalc[c].hours); + } else { + vac.normal.asked.days = vac.normal.asked.days + parseFloat(vcalc[c].days); + vac.normal.asked.hours = vac.normal.asked.hours + parseFloat(vcalc[c].hours); + } + + } + vac.normal.open.days = parseFloat(vdays) - vac.normal.taken.days - vac.normal.accepted.days - vac.normal.asked.days; + vac.normal.open.hours = parseFloat(vhours) - vac.normal.taken.hours - vac.normal.accepted.hours - vac.normal.asked.hours; + //total + + } else if (vcalc[c].type == '1' ){ //extra + if (vcalc[c].taken == '1'){ + if (vcalc[c].accepted=='1'){ + vac.extra.taken.days = vac.extra.taken.days + parseFloat(vcalc[c].days); + vac.extra.taken.hours = vac.extra.taken.hours + parseFloat(vcalc[c].hours); + } else { + vac.extra.asked.days = vac.extra.asked.days + parseFloat(vcalc[c].days); + vac.extra.asked.hours = vac.extra.asked.hours + parseFloat(vcalc[c].hours); + } + } else if (vcalc[c].taken == '0'){ + if (vcalc[c].accepted=='1'){ + vac.extra.accepted.days = vac.extra.accepted.days + parseFloat(vcalc[c].days); + vac.extra.accepted.hours = vac.extra.accepted.hours + parseFloat(vcalc[c].hours); + } else { + vac.extra.asked.days = vac.extra.asked.days + parseFloat(vcalc[c].days); + vac.extra.asked.hours = vac.extra.asked.hours + parseFloat(vcalc[c].hours); + } + } + vac.extra.open.days = 0; + vac.extra.open.hours = 0; + } else if (vcalc[c].type == '-1' ){ //ill + if (vcalc[c].taken == '1'){ + vac.ill.taken.days = vac.ill.taken.days + parseFloat(vcalc[c].days); + vac.ill.taken.hours = vac.ill.taken.hours + parseFloat(vcalc[c].hours); + } else if (vcalc[c].taken == '0'){ + if (vcalc[c].accepted=='1'){ + vac.ill.accepted.days = vac.ill.accepted.days + parseFloat(vcalc[c].days); + vac.ill.accepted.hours = vac.ill.accepted.hours + parseFloat(vcalc[c].hours); + } else { + vac.ill.asked.days = vac.ill.asked.days + parseFloat(vcalc[c].days); + vac.ill.asked.hours = vac.ill.asked.hours + parseFloat(vcalc[c].hours); + } + } + vac.ill.open.days = 0; + vac.ill.open.hours = 0; + + } + vac.total.taken.days = vac.normal.taken.days + vac.extra.taken.days + vac.ill.taken.days; + vac.total.taken.hours = vac.normal.taken.hours + vac.extra.taken.hours + vac.ill.taken.hours; + vac.total.open.days = vac.normal.open.days + vac.extra.open.days + vac.ill.open.days; + vac.total.open.hours = vac.normal.open.hours + vac.extra.open.hours + vac.ill.open.hours; + vac.total.accepted.days = vac.normal.accepted.days + vac.extra.accepted.days + vac.ill.accepted.days; + vac.total.accepted.hours = vac.normal.accepted.hours + vac.extra.accepted.hours + vac.ill.accepted.hours; + vac.total.asked.days = vac.normal.asked.days + vac.extra.asked.days + vac.ill.asked.days; + vac.total.asked.hours = vac.normal.asked.hours + vac.extra.asked.hours + vac.ill.asked.hours; + } + //JSON.stringify(vac) + "\n"); + if (pconfig.vacancyunit == 'days'){ + $("#vacnopen").html(((vac.normal.open.days && vac.normal.open.days != 0)?vac.normal.open.days.toFixed(2)+" j":" ")); + $("#vacntaken").html(vac.normal.taken.days.toFixed(2)+" j"); + $("#vacnasked").html(vac.normal.asked.days.toFixed(2)+" j"); + $("#vacnplanned").html(vac.normal.accepted.days.toFixed(2)+" j"); + + $("#vaceopen").html(" "); + $("#vacetaken").html(vac.extra.taken.days.toFixed(2)+" j"); + $("#vaceasked").html(vac.extra.asked.days.toFixed(2)+" j"); + $("#vaceplanned").html(vac.extra.accepted.days.toFixed(2)+" j"); + + $("#vacmopen").html(" "); + $("#vacmtaken").html(vac.ill.taken.days.toFixed(2)+" j"); + $("#vacmasked").html(vac.ill.asked.days.toFixed(2)+" j"); + $("#vacmplanned").html(vac.ill.accepted.days.toFixed(2)+" j"); + + $("#vactopen").html(vac.total.open.days.toFixed(2)+" j"); + $("#vacttaken").html(vac.total.taken.days.toFixed(2)+" j"); + $("#vactasked").html(vac.total.asked.days.toFixed(2)+" j"); + $("#vactplanned").html(vac.total.accepted.days.toFixed(2)+" j"); + } else { + vac.normal.open.hours=vac.normal.open.hours + parseInt($("#vacancylastyearrest").val()); + $("#vacnopen").html(((vac.normal.open.hours && vac.normal.open.hours != 0)?vac.normal.open.hours+" h":" ")); + $("#vacntaken").html(((vac.normal.taken.hours && vac.normal.taken.hours > 0)?vac.normal.taken.hours+" h":" ")); + $("#vacnasked").html(((vac.normal.asked.hours && vac.normal.asked.hours > 0)?vac.normal.asked.hours+" h":" ")); + $("#vacnplanned").html(((vac.normal.accepted.hours && vac.normal.accepted.hours > 0)?vac.normal.accepted.hours+" h":" ")); + + $("#vacetaken").html(((vac.extra.taken.hours && vac.extra.taken.hours > 0)?vac.extra.taken.hours+" h":" ")); + $("#vaceasked").html(((vac.extra.asked.hours && vac.extra.asked.hours > 0)?vac.extra.asked.hours+" h":" ")); + $("#vaceplanned").html(((vac.extra.accepted.hours && vac.extra.accepted.hours > 0)?vac.extra.accepted.hours+" h":" ")); + + $("#vacmtaken").html(((vac.ill.taken.hours && vac.ill.taken.hours > 0)?vac.ill.taken.hours+" h":" ")); + $("#vacmasked").html(((vac.ill.asked.hours && vac.ill.asked.hours > 0)?vac.ill.asked.hours+" h":" ")); + $("#vacmplanned").html(((vac.ill.accepted.hours && vac.ill.accepted.hours > 0)?vac.ill.accepted.hours+" h":" ")); + + $("#vactopen").html(((vac.total.open.hours && vac.total.open.hours > 0)?vac.total.open.hours+" h":" ")); + $("#vacttaken").html(((vac.total.taken.hours && vac.total.taken.hours > 0)?vac.total.taken.hours+" h":" ")); + $("#vactasked").html(((vac.total.asked.hours && vac.total.asked.hours > 0)?vac.total.asked.hours+" h":" ")); + $("#vactplanned").html(((vac.total.accepted.hours && vac.total.accepted.hours > 0)?vac.total.accepted.hours+" h":" ")); + + } + + //dump(JSON.stringify(vac) + " - Set data vacancy status\n"); + // var hdata = " pris: "+ vac.taken.hours +" h ("+ vac.taken.days.toFixed(2)+" jour(s)) - "; + // hdata += " planifié: "+ vac.rest.hours+" h ("+ vac.rest.days.toFixed(2)+" jour(s)) - "; + // hdata += " ouvert: "+ vac.open.hours +" h ("+ vac.open.days.toFixed(2)+" jour(s))"; + // if (vac.ill > 0) { + // hdata += " -  (maladie: "+ vac.ill.hours+" h ("+ vac.ill.days.toFixed(2)+" jour(s)))"; + // } + //dump("HTML: --" + document.getElementById("vacancystatus").innerHTML +"//\n->" + hdata + "\n"); + //$("#vacancystatus").html(""); + //if ($("#vacancystatus")){ + //dump("vacancystatus exists\n"); + // + //} + $("#vacancystatus").html(""); + } + else { + $("#vacancystatus").html(""); + } + } + + +function setvacancyunit(){ + var vacunit = $('#vacancy_unit').val(); + if ($('#vacancyyeartotal').val() !== ""){ + var vacval = parseFloat($('#vacancyyeartotal').val().replace(',','.')); + if (((!pconfig.vacancyunit) || (pconfig.vacancyunit == 'days')) && (vacunit == 'hours')){ + $('#vacancyyeartotal').val(vacval * 8); + }else if (pconfig.vacancyunit != vacunit){ + $('#vacancyyeartotal').val(vacval / 8); + } + } + //dump("vacunit: " + vacunit + "\n"); + pconfig.vacancyunit = vacunit; + apppref.setpreference("pageconfig.coworker",pconfig); +} + +function setfreq() { + + curfreq.freq = $('#freq option:selected').val(); + + $('#freqinterval').hide(); + $('#freqmonthly').hide(); + $('#freqweekly').hide(); + if (curfreq.freq != "") { + + $('#lblfreq').text(lblfreq[curfreq.freq]); + $('#freqinterval').show(); + if (curfreq.freq != 'daily') { + $('#freq' + curfreq.freq).show(); + } + } + +} + +function getlastyearsrest(){ + var weekhours = $('#staff_weekhours').val(); + if (weekhours === '') { + $("#vacancylastyearrest").val(0); + return; + } + var df = new Date(pconfig.year-1,0,1); + var dt = new Date(pconfig.year-1,11,31); + var vcalcrestsql = "select (select hours from staffvacancydays where staffuuid='"+pconfig.uuid+ "' and vacancyyear="+df.getFullYear()+")-SUM(dayhours) AS hours from (" + + "select vd.daydate,case when daydate <= date('now') then 1 else 0 end as taken,case when vc.timefrom=vc.timeto then cast ("+weekhours+"/5 as real) else (cast (substr(vc.timeto,1,2) as int) + (cast(substr(vc.timeto,4,5) as int)/60)) - (cast(substr(vc.timefrom,1,2) as int) + (cast(substr(vc.timeto,4,5) as int)/60)) end as dayhours,type,case when type != -1 then accepted else '1' end as accepted "+ + "from vacancycalendar vc left join ( "+ + "select daydate from ( "; + + var yd = []; + for (var dx=df;dx<=dt;dx.setDate(dx.getDate()+1)){ + yd.push("select date('"+dx.toLocaleFormat('%Y-%m-%d')+"') as daydate"); + } + vcalcrestsql += yd.join(" UNION ") + + ") yd where strftime('%w',daydate) not in ('0','6') and daydate not in (select vacancydate from vacancy where vacancydate between '"+df.getFullYear()+"-01-01' and '"+dt.getFullYear()+"-12-31' and vacancydateto is null) " + + ") vd on (vd.daydate between vc.datefrom and vc.dateto) " + + "left join staffvacancydays svd on (vc.staffuuid=svd.staffuuid) " + + "where vc.staffuuid='"+pconfig.uuid+ "' and daydate is not null group by daydate) where type in (0,1) and taken=1 and accepted=1 group by taken,accepted;"; + //dump("SQLREST:" + vcalcrestsql + "\n"); + var vcalc = appdb.dbquery(vcalcrestsql); + //dump(JSON.stringify(vcalc) + "\n"); + if (vcalc && vcalc.sqldata[0]){ + + $("#vacancylastyearrest").val(vcalc.sqldata[0].hours); + }else { + $("#vacancylastyearrest").val(0); + } + return; +} + diff --git a/app_v3satdemo/chrome/content/modules/staff/js/staff.js b/app_v3satdemo/chrome/content/modules/staff/js/staff.js new file mode 100644 index 0000000..454d6fb --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/staff/js/staff.js @@ -0,0 +1,120 @@ +//Source-code licensed under EUPL v1.1 ( Copyright 2016 By DKS s.à r.l. - Kilian Saffran - Luxembourg ) +var pconfig = {}; +var delcoworker = null; +var wh = window.innerHeight - 100; +var tblstaff = null; + +function initdata() { + + loadtable(); + set_infoheader(""); + if (!pconfig.printlayout) { + pconfig.printlayout = 'list'; + apppref.setpreference("pageconfig.staff", pconfig); + } + } + +function loadtable() { + var sql = "SELECT ' ' as action, coalesce(prename,'') || '
    ' || coalesce(surname,'') as name,case when color is not null then '
    ' else null end color, coalesce(address,'')|| '
    ' || coalesce(zip,'') || ' ' || coalesce(city,'') || '
    ' || coalesce(country,'') as address, case when phone is not null then ': ' || phone || '
    ' else '' end || case when email is not null then ':' || email else '' end as phonemail, coalesce(jobtitle,'') || '
    ' || case when entrydate is not null then 'à partir du: ' || strftime('%d.%m.%Y',entrydate) else '' end || case when exitdate is not null then ' jusqu''au: ' || strftime('%d.%m.%Y',exitdate) else '' end as jobtitle FROM staff;"; + //dump("STAFFSQL:" +sql + "\n"); + var data = appdb.dbqueryarray(sql); + + var headerdata = getlabels(data.sqlhead.join(",")); + $("#tbl_staff").html(""); + tblstaff = $("#tbl_staff").dataTable({ + "language": { + "url": "../../web/js/locale/datatable_fr.json" + }, + "data": data.sqldata, + "columns": headerdata, + "paging": false, + "scrollY": wh + "px", + "scrollCollapse": true, + "ordering": true, + "info": false, + "filter": true, + "destroy": true + }); + $('#tbl_staff').on('search.dt', function() { + pconfig.filter = tblstaff.api().search(); + apppref.setpreference("pageconfig.staff", pconfig); + }); + + $('#tbl_staff').on('order.dt', function() { + pconfig.order = tblstaff.fnSettings().aaSorting; + apppref.setpreference("pageconfig.staff", pconfig); + + }); + if (pconfig.filter) { + tblstaff.fnFilter(pconfig.filter); + } + if (pconfig.order) { + tblstaff.fnSort(pconfig.order); + } + if ((!pconfig.filter) && (!pconfig.order)) { + tblstaff.fnDraw(); + } +} + + + +function add_coworker() { + var newuuid = appdb.generate_uuid(); + appdb.dbexec("insert into staff (uuid) VALUES ('" + newuuid + "');"); + + globelreq.send_request({ + page: 'coworker', + module: 'staff', + data: { + "uuid": newuuid + }, + header: 'Employé(e)' + }); +} + +function confirm_delete_coworker(myuuid) { + //alert('TEST'); + delcoworker = myuuid; + $("#confirm_delete_coworker").modal('show'); + return false; +} + +function delete_coworker() { + //var frmdata = new Object(); + //appdb.dbexec("DELETE FROM planningstaff where staffuuid='"+delcoworker +"';"); + var evdel = appdb.dbquery("select eventcalendaruuid,count(staffuuid) as cnt from staffplanning where staffuuid='" + delcoworker + "';"); + + appdb.dbexec("DELETE FROM staffvacancydays where staffuuid='" + delcoworker + "';"); + appdb.dbexec("DELETE FROM vacancycalendar where staffuuid='" + delcoworker + "';"); + appdb.dbexec("DELETE FROM staffplanning where staffuuid='" + delcoworker + "';"); + appdb.dbexec("DELETE FROM staff where uuid='" + delcoworker + "';"); + for (var e in evdel.sqldata) { + if (evdel.sqldata[e].cnt == 1) { + appdb.dbexec("DELETE FROM eventcalendar where uuid='" + evdel.sqldata[e].eventcalendaruuid + "';"); + } + } + // + delcoworker = null; + loadtable(); + // + $("#confirm_delete_coworker").modal('hide'); + +} + +function load_coworker(couuid){ + //"coworker uuid:" + couuid + "\n"); + var cwdata = apppref.getpreference("pageconfig.coworker"); + var cow = new Object(); + if (cwdata && cwdata !== ""){ + cow = JSON.parse(cwdata); + } + //dump("Current CoWorker cfg:" +JSON.stringify(cow) + "\n"); + cow.uuid = couuid; + //dump("New CoWorker cfg:" +JSON.stringify(cow) + "\n"); + apppref.setpreference("pageconfig.coworker",cow); + globelreq.send_request({page:'coworker', + module:'staff', + data:null, + header:'Employé(e)'}); + +} \ No newline at end of file diff --git a/app_v3satdemo/chrome/content/modules/staff/js/staff_basic.js b/app_v3satdemo/chrome/content/modules/staff/js/staff_basic.js new file mode 100644 index 0000000..fa72690 --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/staff/js/staff_basic.js @@ -0,0 +1,122 @@ +//Source-code licensed under EUPL v1.1 ( Copyright 2016 By DKS s.à r.l. - Kilian Saffran - Luxembourg ) +var pconfig = {}; +var wh = window.innerHeight - 100; + +function initdata() { + set_infoheader(""); + if (!pconfig.printlayout) { + pconfig.printlayout = 'list'; + apppref.setpreference("pageconfig.staff", pconfig); + } + load_staff_selection(); + var stlist = appdb.dbquery("select * from creche;"); + //dump(JSON.stringify(stlist) + "\n"); + if ((stlist.sqldata) && stlist.sqldata[0].stafflist == '1'){ + $("#stafflist").show(); + loadtable_staff(); + $("#stafflogin").hide(); + } +} + +function loadtable_staff() { + var sql = "SELECT ' ' as action, coalesce(prename,'') || '
    ' || coalesce(surname,'') as name,case when color is not null then '
    ' else null end color, coalesce(address,'')|| '
    ' || coalesce(zip,'') || ' ' || coalesce(city,'') || '
    ' || coalesce(country,'') as address, case when phone is not null then ': ' || phone || '
    ' else '' end || case when email is not null then ':' || email else '' end as phonemail, coalesce(jobtitle,'') || '
    ' || case when entrydate is not null then 'à partir du: ' || strftime('%d.%m.%Y',entrydate) else '' end || case when exitdate is not null then ' jusqu''au: ' || strftime('%d.%m.%Y',exitdate) else '' end as jobtitle FROM staff;"; + //dump(sql + "\n"); + var data = appdb.dbqueryarray(sql); + + var headerdata = getlabels(data.sqlhead.join(",")); + $("#tbl_staff").html(""); + tblstaff = $("#tbl_staff").dataTable({ + "language": { + "url": "../../web/js/locale/datatable_fr.json" + }, + "data": data.sqldata, + "columns": headerdata, + "paging": false, + "scrollY": wh + "px", + "scrollCollapse": true, + "ordering": true, + "info": false, + "filter": true, + "destroy": true + }); + $('#tbl_staff').on('search.dt', function() { + pconfig.filter = tblstaff.api().search(); + apppref.setpreference("pageconfig.staff", pconfig); + }); + + $('#tbl_staff').on('order.dt', function() { + pconfig.order = tblstaff.fnSettings().aaSorting; + apppref.setpreference("pageconfig.staff", pconfig); + + }); + if (pconfig.filter) { + tblstaff.fnFilter(pconfig.filter); + } + if (pconfig.order) { + tblstaff.fnSort(pconfig.order); + } + if ((!pconfig.filter) && (!pconfig.order)) { + tblstaff.fnDraw(); + } + } + +function load_coworker_basic(){ + var couuid= $('#sel_staff :selected').val(); + var copwd = $('#txtpasswd').val(); + var encpwd = MD5(copwd); + var cwpwd = appdb.dbquery("select password from staff where uuid='"+couuid+"';"); + //dump(cwpwd + "\n"); + //dump("SQL: select password from staff where uuid='"+couuid+"';\n"); + //dump("PWD: " + copwd + " ENC: " + encpwd + " CMP: "+ cwpwd.sqldata[0].password +"\n"); + if (cwpwd.sqldata[0].password == encpwd){ + var cwdata = apppref.getpreference("pageconfig.coworker"); + var cow = new Object(); + if (cwdata && cwdata !== ""){ + cow = JSON.parse(cwdata); + } + cow.uuid = couuid; + //dump("New CoWorker cfg:" +JSON.stringify(cow) + "\n"); + apppref.setpreference("pageconfig.coworker",cow); + globelreq.send_request({page:'coworker_basic', + module:'staff', + data:null, + header:'Employé(e)'}); + + } + + +} + +function load_coworker(couuid){ + //"coworker uuid:" + couuid + "\n"); + var cwdata = apppref.getpreference("pageconfig.coworker"); + var cow = new Object(); + if (cwdata && cwdata !== ""){ + cow = JSON.parse(cwdata); + } + //dump("Current CoWorker cfg:" +JSON.stringify(cow) + "\n"); + cow.uuid = couuid; + //dump("New CoWorker cfg:" +JSON.stringify(cow) + "\n"); + apppref.setpreference("pageconfig.coworker",cow); + globelreq.send_request({page:'coworker_basic', + module:'staff', + data:null, + header:'Employé(e)'}); + + } + +function load_staff_selection(){ + var stdata = appdb.dbquery("select uuid, coalesce(surname,'') || ' ' || coalesce(prename,'') as name,case when color is null then '#000' else color end as color from staff where password is not null order by surname,prename"); + stdata = stdata.sqldata; + //JSON.stringify(stdata)); + for (var s in stdata){ + $('#sel_staff').append(''); + } +} + +function onselstaff(objid) { + + //pconfig.filterstaff = $('#' + objid).val(); + //apppref.setpreference("pageconfig.calactivity",pconfig); + //load_calendar_data(); +} \ No newline at end of file diff --git a/app_v3satdemo/chrome/content/modules/staff/staff.html b/app_v3satdemo/chrome/content/modules/staff/staff.html new file mode 100644 index 0000000..7c05876 --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/staff/staff.html @@ -0,0 +1,69 @@ + + + + + + + Creorga - Staff + + + + + + + + + + + + + + + + + + +
    + +
    + +
    +
    + +
    +
    + +
    + + + + + + + + + + + + + diff --git a/app_v3satdemo/chrome/content/modules/staff/staff.xul b/app_v3satdemo/chrome/content/modules/staff/staff.xul new file mode 100644 index 0000000..4bcd895 --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/staff/staff.xul @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app_v3satdemo/chrome/content/modules/staff/staff_basic.html b/app_v3satdemo/chrome/content/modules/staff/staff_basic.html new file mode 100644 index 0000000..4688e9b --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/staff/staff_basic.html @@ -0,0 +1,77 @@ + + + + + + + Creorga - Staff Basic + + + + + + + + + + + + + + + + + + +
    + +
    +
    +
    +
    +

    Login

    +
    +
    +
    +
    + + + + + +
    +
    +
    +
    + + + + +
    +
    + +
    +
    +
    +
    + + + + + + + + + + + + + + diff --git a/app_v3satdemo/chrome/content/modules/staff/staff_basic.xul b/app_v3satdemo/chrome/content/modules/staff/staff_basic.xul new file mode 100644 index 0000000..b8daf7f --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/staff/staff_basic.xul @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app_v3satdemo/chrome/content/modules/support/img/info.png b/app_v3satdemo/chrome/content/modules/support/img/info.png new file mode 100644 index 0000000..ba72adc Binary files /dev/null and b/app_v3satdemo/chrome/content/modules/support/img/info.png differ diff --git a/app_v3satdemo/chrome/content/modules/support/js/multisite.js b/app_v3satdemo/chrome/content/modules/support/js/multisite.js new file mode 100644 index 0000000..9c7b5ac --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/support/js/multisite.js @@ -0,0 +1,376 @@ +//Source-code licensed under EUPL v1.1 ( Copyright 2016 By DKS s.à r.l. - Kilian Saffran - Luxembourg ) + +var pconfig = {}; +var wh= window.screen.height -200; +var delms = null; +var tblmultisite = null; +var sitenum = 0; +var maxsites = 1; +var shared = false; +var newrsite = false; +var higestdbnum = 0; +function initdata(){ + //load_helpers(); + var pdata = apppref.getpreference("pageconfig.multisite"); + //maxsites = apppref.getpreference("support.sites"); + //shared = apppref.getpreference("support.sharesites"); + if (pdata != '') { + pconfig = JSON.parse(pdata); + } + set_infoheader(""); + curcfg.loadconfig(apppref.getpreference("support.database.currentdb.num")); + if (system.os == "Darwin"){ + $('#btnvpnconfig').show(); + $('#btnvpnconnection').show(); + } else { + + $('#btncheckdb').show(); + } + $('#btnsyncconfig').show(); + load_multisite_table(); + //$("#remoteshared").on('change',function(){ + // + // if ($("#remoteshared").is(':checked')){ + // $('#sharedfolderdata').show(); + // }else { + // $('#sharedfolderdata').hide(); + // } + //}); +} + + + +function load_multisite_table(){ + sitenum = 0; + $("#tbl_multisite").html(""); + $("#tbl_multisite").append("ActionNom du SiteBase de données"); + + var childnames = apppref.branch.getChildList("",{}); + var tbodydata = ''; + + + for (var i in childnames){ + if ((childnames[i].substring(0,16) == 'support.database') && (childnames[i].indexOf("currentdb") == -1) && (childnames[i].indexOf("currentsite") == -1)){ + var sitecfg = JSON.parse(apppref.getpreference(childnames[i])); + sitenum++; + + //var ltype = "private"; + //if (sitecfg.path.local == system.commondir()) { + // ltype = "localshare"; + //} + + //dump(JSON.stringify(sitecfg) + "\n"); + if (higestdbnum < sitecfg.dbnum){ + higestdbnum = sitecfg.dbnum; + } + var btndel =''; + var btnshare = ''; + //var btnvpn = ''; + var msgaccess = ''; + if (curcfg.dbnum != sitecfg.dbnum) { + btndel = ""; + } + if (system.fileexists(sitecfg.path.local + system.sep() +sitecfg.uuid+".sqlite")){ + btnshare = ""; + } else { + msgaccess = "cette base de donnée n'est pas accessible! Vérifiez l'access au répertoire (et/ou la VPN)"; + } +// if (sitecfg.vpncheck){ +// btnvpn = ""; +// } + + + tbodydata += ""+btndel+btnshare+""+sitecfg.name+""+ + ((msgaccess != "")?'
    ' + msgaccess:"") + +""; + tbodydata +=""; + + } + } + tbodydata += ''; + $("#tbl_multisite").append(tbodydata); + $("#btnnewsite").show(); + $("#btnremotesite").show(); + + tblmultisite = $("#tbl_multisite").dataTable({ + "paging": false, + "ordering": false, + "scrollY": wh + "px", + "scrollCollapse": true, + "info": false, + "filter": false, + "destroy": true + }); + +} + +function getremotefolder() { + var r = system.selectdirectory('',"selectionner le répertoire"); + if (r) { + $('#sharedfolder').val(r.path); + } +} + +function vpnconnection(){ + if (system.os == "Darwin" && system.fileexists(system.profilerootdir() + system.sep() + 'vpncfg.txt')){ + system.runcmdline("/bin/bash",[system.toolsdir() + system.sep() + "vpnconnect.sh",system.profilerootdir() + system.sep() + 'vpncfg.txt']); + } +} + +function getremotefile() { + var r = system.selectfile('',"selectionner la base de donnée (*.sqlite)"); + if (r) { + $('#sharedfile').val(r.path); + } +} + +function getvpnfile() { + var r = system.selectvpnfile('',"selectionner le fichier (*.privkey)"); + if (r) { + $('#vpnkeyfile').val(r.path); + } +} + +//function run_vpncheck(vpnapp){ +// var ff = system.openFile(vpnapp); +//} + +function dlg_remotesite(sitenum){ + //dump("Remote site:" + sitenum + "\n"); + if (sitenum > 0){ + var strsitepref = apppref.getpreference("support.database." +sitenum); + var sitepref; + if (strsitepref.length > 0){ + sitepref = JSON.parse(strsitepref); + $("#sharedfolder").val(sitepref.path.local); + $("#oldfolder").val(sitepref.path.local); + if (sitepref.vpncheck){ + $("#vpnfile").val(sitepref.vpncheck); + }else { + $("#vpnfile").val(""); + } + $("#dbnum").val(sitepref.dbnum); + $("#gluuid").val(sitepref.uuid); + $("#gluuid").prop("readonly",true); + $("#dlg_movesite").modal('show'); + } + } + } + +function dlg_addsite(){ + $("#sharedfile").val(""); + $("#dlg_addsite").modal('show'); + } +function dlg_vpn(){ + var strvpnpref = apppref.getpreference("support.vpn.data"); + var vpnpref; + if ((strvpnpref) && (strvpnpref.length > 0)){ + vpnpref = JSON.parse(strvpnpref); + $("#vpnhost").val(vpnpref.vpnhost); + $("#smbuser").val(vpnpref.smbuser); + $("#smbpassword").val(vpnpref.smbpassword); + $("#vpnkeyfile").val(vpnpref.vpnkeyfile); + $("#smbsharedfolder").val(vpnpref.smbsharedfolder); + } + $("#dlg_vpnconfig").modal('show'); + +} + +function dlg_sync(){ + var strsyncpref = apppref.getpreference("support.sync.data"); + var syncpref; + if ((strsyncpref) && (strsyncpref.length > 0)){ + syncpref = JSON.parse(strsyncpref); + $("#synchost").val(syncpref.host); + $("#syncport").val(syncpref.port); + $("#syncuser").val(syncpref.user); + $("#syncpassword").val(syncpref.password); + $("#syncfolder").val(syncpref.folder); + $("#syncinterval").val(syncpref.interval); + + } + $("#dlg_syncconfig").modal('show'); + +} + + + +function save_vpnconfig(){ + var vpnpref = {vpnhost:"",smbuser:"",smbpassword:"",vpnkeyfile:"",smbsharedfolder:""}; + var strvpnpref=""; + vpnpref.vpnhost = $("#vpnhost").val(); + vpnpref.smbuser = $("#smbuser").val(); + vpnpref.smbpassword = $("#smbpassword").val(); + vpnpref.vpnkeyfile = $("#vpnkeyfile").val(); + vpnpref.smbsharedfolder = $("#smbsharedfolder").val(); + apppref.setpreference("support.vpn.data",vpnpref); + + strvpnpref+="LOCALPORT=52187\n"; + + if (vpnpref.vpnhost.indexOf(":") != -1){ + //var vpnport = vpnpref.vpnhost.substring(vpnpref.vpnhost.indexOf(":")); + strvpnpref+="SSHHOST=" + vpnpref.vpnhost.substring(0,vpnpref.vpnhost.indexOf(":")) + "\n"; + strvpnpref+="SSHPORT=" + vpnpref.vpnhost.substring(vpnpref.vpnhost.indexOf(":")+1) + "\n"; + }else { + strvpnpref+="SSHHOST=" + vpnpref.vpnhost + "\n"; + } + + strvpnpref+="SMBUSER=" + vpnpref.smbuser + "\n"; + strvpnpref+="SMBPWD=" + vpnpref.smbpassword + "\n"; + strvpnpref+="SMBFOLDER=" + vpnpref.smbsharedfolder + "\n"; + strvpnpref+="SSHKEYFILE=" + vpnpref.vpnkeyfile + "\n"; + dump(strvpnpref +"\n->" + system.profilerootdir() + "/vpncfg.txt\n"); + system.WriteTextFile(strvpnpref,system.profilerootdir() + "/vpncfg.txt"); + $("#dlg_vpnconfig").modal('hide'); +} + +function save_syncconfig(){ + var syncpref = {type:"",host:"",port:"",user:"",password:"",folder:"",interval:""}; + var strsyncpref=""; + syncpref.host = $("#synchost").val(); + syncpref.user = $("#syncuser").val(); + syncpref.password = $("#syncpassword").val(); + syncpref.port = $("#syncport").val(); + syncpref.type = $("#synctype").val(); + syncpref.folder = $("#syncfolder").val(); + syncpref.interval = $("#syncinterval").val(); + + if ((syncpref.interval == "") || (parseInt(syncpref.interval) < 5)){ + syncpref.interval = 5; + } + apppref.setpreference("support.sync.data",syncpref); + + //strvpnpref+="LOCALPORT=52187\n"; + var secintval = parseInt(syncpref.interval) * 60; + strsyncpref+="HOST=" + syncpref.host + "\n"; + strsyncpref+="PORT=" + syncpref.port + "\n"; + strsyncpref+="USER=" + syncpref.user + "\n"; + strsyncpref+="PASSWORD=" + syncpref.password + "\n"; + strsyncpref+="TYPE=" + syncpref.type + "\n"; + strsyncpref+="INTERVAL=" + secintval + "\n"; + strsyncpref+="FOLDER=" + syncpref.folder + "\n"; + //dump(strvpnpref +"\n->" + system.profilerootdir() + "/sync.conf\n"); + system.WriteTextFile(strsyncpref,system.profilerootdir() + system.sep() + "sync.conf"); + $("#dlg_syncconfig").modal('hide'); +} + +function remove_vpnconfig(){ + OS.File.remove(system.profiledir() + "/vpncfg.txt"); + apppref.setpreference("support.vpn.data",null); + $("#dlg_vpnconfig").modal('hide'); +} + +function remove_syncconfig(){ + OS.File.remove(system.profiledir() + "/sync.conf"); + //apppref.setpreference("support.vpn.data",null); + $("#dlg_syncconfig").modal('hide'); +} + + + function confirm_delete_multisite(dbnum){ + + delms = dbnum; + $("#confirm_delete_multisite").modal('show'); + return false; + } + + function delete_multisite(){ + var deldbsite = JSON.parse(apppref.getpreference("support.database." + delms)); + apppref.deletepreference("support.database." + delms); + //"delete " + deldbsite.path.local + system.sep() + deldbsite.uuid + ".sqlite\n"); + if (deldbsite.path.local == system.profiledir()) { + OS.File.remove(deldbsite.path.local + system.sep() + deldbsite.uuid + ".sqlite",{ ignoreAbsent:true}); + OS.File.removeDir(deldbsite.path.local + system.sep() + 'imports' +system.sep() + deldbsite.uuid,{ ignoreAbsent:true}); + OS.File.removeDir(deldbsite.path.local + system.sep() + 'reports' +system.sep() + deldbsite.uuid,{ ignoreAbsent:true}); + } + delms =null; + globelreq.send_request({page:'updatesiteslist',data:null}); + load_multisite_table(); + + $("#confirm_delete_multisite").modal('hide'); + + return false; + } + + function save_multisite(){ + var cuuid = ""; + var rowCount = higestdbnum + 1; + var syspath= system.profiledir(); + var newid=appdb.generate_uuid(); + + var dbname = syspath + system.sep() + newid +".sqlite"; + var dbclone = system.appdir() + system.sep() +"defaults"+system.sep()+"profile"+system.sep()+"creorga.sqlite"; + var sitecfg = {name:"Nouvelle crèche",dbnum:rowCount,uuid:newid,path:{local:system.profiledir(),remote:""},lastsync:""}; + apppref.setpreference("support.database." + rowCount,sitecfg); + globelreq.send_request({page:'updatesiteslist',data:null}); + OS.File.copy(dbclone, dbname); + load_multisite_table(); + } + + + function save_remotesite() { + //if move site partagé + var fld = $("#sharedfolder").val(); + var nuuid = $("#frmeditmultisite #gluuid").val(); + if ((fld === "") || (nuuid === "")) { + errormsg("ERREUR","pas de données!"); + }else if (($("#oldfolder").val() !== "") && ($("#sharedfolder").val() !== $("#oldfolder").val())) { + tools.movecreche($("#oldfolder").val(),$("#sharedfolder").val(),nuuid,$("#dbnum").val()); + + } + var strcfgx = apppref.getpreference("support.database."+$("#dbnum").val()); +// cfgx = JSON.parse(strcfgx); +// cfgx.vpncheck=$("#vpnfile").val(); +// +// //dump("new Config: " + JSON.stringify(cfgx) + "\n"); +// apppref.setpreference("support.database."+$("#dbnum").val(),cfgx); + load_multisite_table(); + $("#dlg_movesite").modal('hide'); + } + + function add_remotesite() { + //if new site partagé + var fld = $("#sharedfile").val(); + if (fld === "") { + errormsg("ERREUR","pas de données!"); + $("#dlg_addsite").modal('hide'); + return; + } + if (!system.fileexists(fld)){ + errormsg("ERREUR","ce fichier n'existe pas!"); + $("#dlg_addsite").modal('hide'); + return; + } + var rowCount = higestdbnum + 1; + var tcurdbnum = curcfg.dbnum; + var nuuid = system.getFileName(fld); + nuuid = nuuid.substring(0,nuuid.length-7); + var bdpath = system.getDirectory(fld); + //dump("new nuuid:" + nuuid + "\n"); + var sitecfg = {name:"Crèche Partagé",dbnum:rowCount,uuid:nuuid,path:{local:bdpath,remote:""},lastsync:""}; + apppref.setpreference("support.database." + rowCount,sitecfg); + try { + curcfg.loadconfig(rowCount); + var xsn = appdb.dbquery("select crechename from creche where uuid='"+nuuid+"';"); + sitecfg.name = xsn.sqldata[0].crechename; + apppref.setpreference("support.database." + rowCount,sitecfg); + } catch(e){ + errormsg("ERREUR","Ne peux pas lire la b.d. partagé!"); + } + curcfg.loadconfig(tcurdbnum); + globelreq.send_request({page:'updatesiteslist',data:null}); + load_multisite_table(); + $("#dlg_addsite").modal('hide'); + + } + + function checkdatabases(){ + appdb.check_schema(); + } + function syncstart(){ + + } + function syncstop(){ + + } + \ No newline at end of file diff --git a/app_v3satdemo/chrome/content/modules/support/js/update.js b/app_v3satdemo/chrome/content/modules/support/js/update.js new file mode 100644 index 0000000..a598aa2 --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/support/js/update.js @@ -0,0 +1,10 @@ +function initdata(){ + + var appdata = system.appinfo(); + var urlquery= "os=" + appdata.OS + "&id=" + appdata.ID + "&version=" + appdata.version; + + window.location.href = "http://www.dks.lu/download/update.php?" + urlquery; + + set_infoheader("Creorga mise à jour"); + +} \ No newline at end of file diff --git a/app_v3satdemo/chrome/content/modules/support/multisite.html b/app_v3satdemo/chrome/content/modules/support/multisite.html new file mode 100644 index 0000000..e3b4f89 --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/support/multisite.html @@ -0,0 +1,242 @@ + + + + + + Creorga - Configuration Site + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app_v3satdemo/chrome/content/modules/support/support.xul b/app_v3satdemo/chrome/content/modules/support/support.xul new file mode 100644 index 0000000..735eaa4 --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/support/support.xul @@ -0,0 +1,12 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app_v3satdemo/chrome/content/modules/support/update.html b/app_v3satdemo/chrome/content/modules/support/update.html new file mode 100644 index 0000000..cd179c2 --- /dev/null +++ b/app_v3satdemo/chrome/content/modules/support/update.html @@ -0,0 +1,47 @@ + + + + + + Creorga - Update + + + + + + + + + + + + + + +
    + +
    +
    +
    +
    +

    icon Info mise à jour

    +
    +
    + pas d'informations pour l'instant! +
    +
    +
    + + +
    + + + + + + + + + + + \ No newline at end of file diff --git a/app_v3satdemo/chrome/content/web/child.html b/app_v3satdemo/chrome/content/web/child.html new file mode 100644 index 0000000..2d5f658 --- /dev/null +++ b/app_v3satdemo/chrome/content/web/child.html @@ -0,0 +1,769 @@ + + + + + + + Détails - Enfant + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + + +
    + +
    +
    +
    +
    + + +
    + +
    +
    + + +
    + +
    +
    + +
    + + +
    + +
    +
    +
    +
    + + +
    +
    + + + + + + + + +
    +
    + +
    +
    + +
    + +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    + + +
    +
    +
    + +
    +
    +
    + + +
    + + + + + + + +
    +
    + +
    + +
    + + + +
    +
    +
    + + +
    +
    +
    +
    + + +
    + +
    +
    + + +
    +
    + +
    + +
    €
    +
    +
    +
    + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + + + +
    + +
    +
    +
    + + + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + diff --git a/app_v3satdemo/chrome/content/web/childs.html b/app_v3satdemo/chrome/content/web/childs.html new file mode 100644 index 0000000..2ddad6d --- /dev/null +++ b/app_v3satdemo/chrome/content/web/childs.html @@ -0,0 +1,84 @@ + + + + + + + Enfants + + + + + + + + + + + + + + + + +
    + +
    + + +
    + + +
    +
    + + + +
    + + + + + +
    + + +
    + + + + + + + + + + + + + + + diff --git a/app_v3satdemo/chrome/content/web/childs_basic.html b/app_v3satdemo/chrome/content/web/childs_basic.html new file mode 100644 index 0000000..00a15b3 --- /dev/null +++ b/app_v3satdemo/chrome/content/web/childs_basic.html @@ -0,0 +1,61 @@ + + + + + + + Enfants + + + + + + + + + + + + + + + + +
    + +
    + + +
    + + +
    +
    + + + +
    + + + + + +
    +
    + + + + + + + + + + + + + + + diff --git a/app_v3satdemo/chrome/content/web/creche.html b/app_v3satdemo/chrome/content/web/creche.html new file mode 100644 index 0000000..2d6417b --- /dev/null +++ b/app_v3satdemo/chrome/content/web/creche.html @@ -0,0 +1,700 @@ + + + + + + + Crèche + + + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + +
    + +
    + +
    + + +
    +
    + +
    +
    +
    + + +
    + +
    + + +
    +
    +
    +
    +
    + +
    + +
    Enfants
    +
    +
    +
    +
    +
    + + +
    + +
    Mois
    +
    +
    +
    +
    + +
    + +
    Mois
    +
    +
    +
    +
    + + + +
    +
    + + +
    + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + + + + + + + + + + diff --git a/app_v3satdemo/chrome/content/web/css/bootstrap-datetimepicker.css b/app_v3satdemo/chrome/content/web/css/bootstrap-datetimepicker.css new file mode 100644 index 0000000..80abaa5 --- /dev/null +++ b/app_v3satdemo/chrome/content/web/css/bootstrap-datetimepicker.css @@ -0,0 +1,373 @@ +/*! + * Datetimepicker for Bootstrap 3 + * version : 4.17.37 + * https://github.com/Eonasdan/bootstrap-datetimepicker/ + */ +.bootstrap-datetimepicker-widget { + list-style: none; +} +.bootstrap-datetimepicker-widget.dropdown-menu { + margin: 2px 0; + padding: 4px; + width: 19em; +} +@media (min-width: 768px) { + .bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs { + width: 38em; + } +} +@media (min-width: 992px) { + .bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs { + width: 38em; + } +} +@media (min-width: 1200px) { + .bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs { + width: 38em; + } +} +.bootstrap-datetimepicker-widget.dropdown-menu:before, +.bootstrap-datetimepicker-widget.dropdown-menu:after { + content: ''; + display: inline-block; + position: absolute; +} +.bootstrap-datetimepicker-widget.dropdown-menu.bottom:before { + border-left: 7px solid transparent; + border-right: 7px solid transparent; + border-bottom: 7px solid #cccccc; + border-bottom-color: rgba(0, 0, 0, 0.2); + top: -7px; + left: 7px; +} +.bootstrap-datetimepicker-widget.dropdown-menu.bottom:after { + border-left: 6px solid transparent; + border-right: 6px solid transparent; + border-bottom: 6px solid white; + top: -6px; + left: 8px; +} +.bootstrap-datetimepicker-widget.dropdown-menu.top:before { + border-left: 7px solid transparent; + border-right: 7px solid transparent; + border-top: 7px solid #cccccc; + border-top-color: rgba(0, 0, 0, 0.2); + bottom: -7px; + left: 6px; +} +.bootstrap-datetimepicker-widget.dropdown-menu.top:after { + border-left: 6px solid transparent; + border-right: 6px solid transparent; + border-top: 6px solid white; + bottom: -6px; + left: 7px; +} +.bootstrap-datetimepicker-widget.dropdown-menu.pull-right:before { + left: auto; + right: 6px; +} +.bootstrap-datetimepicker-widget.dropdown-menu.pull-right:after { + left: auto; + right: 7px; +} +.bootstrap-datetimepicker-widget .list-unstyled { + margin: 0; +} +.bootstrap-datetimepicker-widget a[data-action] { + padding: 6px 0; +} +.bootstrap-datetimepicker-widget a[data-action]:active { + box-shadow: none; +} +.bootstrap-datetimepicker-widget .timepicker-hour, +.bootstrap-datetimepicker-widget .timepicker-minute, +.bootstrap-datetimepicker-widget .timepicker-second { + width: 54px; + font-weight: bold; + font-size: 1.2em; + margin: 0; +} +.bootstrap-datetimepicker-widget button[data-action] { + padding: 6px; +} +.bootstrap-datetimepicker-widget .btn[data-action="incrementHours"]::after { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; + content: "Increment Hours"; +} +.bootstrap-datetimepicker-widget .btn[data-action="incrementMinutes"]::after { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; + content: "Increment Minutes"; +} +.bootstrap-datetimepicker-widget .btn[data-action="decrementHours"]::after { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; + content: "Decrement Hours"; +} +.bootstrap-datetimepicker-widget .btn[data-action="decrementMinutes"]::after { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; + content: "Decrement Minutes"; +} +.bootstrap-datetimepicker-widget .btn[data-action="showHours"]::after { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; + content: "Show Hours"; +} +.bootstrap-datetimepicker-widget .btn[data-action="showMinutes"]::after { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; + content: "Show Minutes"; +} +.bootstrap-datetimepicker-widget .btn[data-action="togglePeriod"]::after { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; + content: "Toggle AM/PM"; +} +.bootstrap-datetimepicker-widget .btn[data-action="clear"]::after { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; + content: "Clear the picker"; +} +.bootstrap-datetimepicker-widget .btn[data-action="today"]::after { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; + content: "Set the date to today"; +} +.bootstrap-datetimepicker-widget .picker-switch { + text-align: center; +} +.bootstrap-datetimepicker-widget .picker-switch::after { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; + content: "Toggle Date and Time Screens"; +} +.bootstrap-datetimepicker-widget .picker-switch td { + padding: 0; + margin: 0; + height: auto; + width: auto; + line-height: inherit; +} +.bootstrap-datetimepicker-widget .picker-switch td span { + line-height: 2.5; + height: 2.5em; + width: 100%; +} +.bootstrap-datetimepicker-widget table { + width: 100%; + margin: 0; +} +.bootstrap-datetimepicker-widget table td, +.bootstrap-datetimepicker-widget table th { + text-align: center; + /*border-radius: 4px;*/ +} +.bootstrap-datetimepicker-widget table th { + height: 20px; + line-height: 20px; + width: 20px; +} +.bootstrap-datetimepicker-widget table th.picker-switch { + width: 145px; +} +.bootstrap-datetimepicker-widget table th.disabled, +.bootstrap-datetimepicker-widget table th.disabled:hover { + background: none; + color: #777777; + cursor: not-allowed; +} +.bootstrap-datetimepicker-widget table th.prev::after { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; + content: "Previous Month"; +} +.bootstrap-datetimepicker-widget table th.next::after { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; + content: "Next Month"; +} +.bootstrap-datetimepicker-widget table thead tr:first-child th { + cursor: pointer; +} +.bootstrap-datetimepicker-widget table thead tr:first-child th:hover { + background: #90c8f6; +} +.bootstrap-datetimepicker-widget table td { + height: 54px; + line-height: 54px; + width: 54px; +} +.bootstrap-datetimepicker-widget table td.cw { + font-size: .8em; + height: 20px; + line-height: 20px; + color: #777777; +} +.bootstrap-datetimepicker-widget table td.day { + height: 20px; + line-height: 20px; + width: 20px; +} +.bootstrap-datetimepicker-widget table td.day:hover, +.bootstrap-datetimepicker-widget table td.hour:hover, +.bootstrap-datetimepicker-widget table td.minute:hover, +.bootstrap-datetimepicker-widget table td.second:hover { + background: #90c8f6; + cursor: pointer; +} +.bootstrap-datetimepicker-widget table td.old, +.bootstrap-datetimepicker-widget table td.new { + color: #777777; +} +.bootstrap-datetimepicker-widget table td.today { + position: relative; +} +.bootstrap-datetimepicker-widget table td.today:before { + content: ''; + display: inline-block; + border: solid transparent; + border-width: 0 0 7px 7px; + border-bottom-color: #337ab7; + border-top-color: rgba(0, 0, 0, 0.2); + position: absolute; + bottom: 4px; + right: 4px; +} +.bootstrap-datetimepicker-widget table td.active, +.bootstrap-datetimepicker-widget table td.active:hover { + background-color: #337ab7; + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} +.bootstrap-datetimepicker-widget table td.active.today:before { + border-bottom-color: #fff; +} +.bootstrap-datetimepicker-widget table td.disabled, +.bootstrap-datetimepicker-widget table td.disabled:hover { + background: none; + color: #777777; + cursor: not-allowed; +} +.bootstrap-datetimepicker-widget table td span { + display: inline-block; + width: 54px; + height: 54px; + line-height: 54px; + margin: 2px 1.5px; + cursor: pointer; + /*border-radius: 4px;*/ +} +.bootstrap-datetimepicker-widget table td span:hover { + background: #90c8f6; +} +.bootstrap-datetimepicker-widget table td span.active { + background-color: #337ab7; + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} +.bootstrap-datetimepicker-widget table td span.old { + color: #777777; +} +.bootstrap-datetimepicker-widget table td span.disabled, +.bootstrap-datetimepicker-widget table td span.disabled:hover { + background: none; + color: #777777; + cursor: not-allowed; +} +.bootstrap-datetimepicker-widget.usetwentyfour td.hour { + height: 27px; + line-height: 27px; +} +.bootstrap-datetimepicker-widget.wider { + width: 21em; +} +.bootstrap-datetimepicker-widget .datepicker-decades .decade { + line-height: 1.8em !important; +} +.input-group.date .input-group-addon { + cursor: pointer; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} diff --git a/app_v3satdemo/chrome/content/web/css/bootstrap-datetimepicker.min.css b/app_v3satdemo/chrome/content/web/css/bootstrap-datetimepicker.min.css new file mode 100644 index 0000000..21d35d6 --- /dev/null +++ b/app_v3satdemo/chrome/content/web/css/bootstrap-datetimepicker.min.css @@ -0,0 +1,6 @@ +/*! + * Datetimepicker for Bootstrap 3 + * version : 4.17.37 + * https://github.com/Eonasdan/bootstrap-datetimepicker/ + */ +.bootstrap-datetimepicker-widget{list-style:none}.bootstrap-datetimepicker-widget.dropdown-menu{margin:2px 0;padding:4px;width:19em}@media (min-width: 768px){.bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs{width:38em}}@media (min-width: 992px){.bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs{width:38em}}@media (min-width: 1200px){.bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs{width:38em}}.bootstrap-datetimepicker-widget.dropdown-menu:before,.bootstrap-datetimepicker-widget.dropdown-menu:after{content:'';display:inline-block;position:absolute}.bootstrap-datetimepicker-widget.dropdown-menu.bottom:before{border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #cccccc;border-bottom-color:rgba(0, 0, 0, 0.2);top:-7px;left:7px}.bootstrap-datetimepicker-widget.dropdown-menu.bottom:after{border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid white;top:-6px;left:8px}.bootstrap-datetimepicker-widget.dropdown-menu.top:before{border-left:7px solid transparent;border-right:7px solid transparent;border-top:7px solid #cccccc;border-top-color:rgba(0, 0, 0, 0.2);bottom:-7px;left:6px}.bootstrap-datetimepicker-widget.dropdown-menu.top:after{border-left:6px solid transparent;border-right:6px solid transparent;border-top:6px solid white;bottom:-6px;left:7px}.bootstrap-datetimepicker-widget.dropdown-menu.pull-right:before{left:auto;right:6px}.bootstrap-datetimepicker-widget.dropdown-menu.pull-right:after{left:auto;right:7px}.bootstrap-datetimepicker-widget .list-unstyled{margin:0}.bootstrap-datetimepicker-widget a[data-action]{padding:6px 0}.bootstrap-datetimepicker-widget a[data-action]:active{box-shadow:none}.bootstrap-datetimepicker-widget .timepicker-hour,.bootstrap-datetimepicker-widget .timepicker-minute,.bootstrap-datetimepicker-widget .timepicker-second{width:54px;font-weight:bold;font-size:1.2em;margin:0}.bootstrap-datetimepicker-widget button[data-action]{padding:6px}.bootstrap-datetimepicker-widget .btn[data-action="incrementHours"]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Increment Hours"}.bootstrap-datetimepicker-widget .btn[data-action="incrementMinutes"]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Increment Minutes"}.bootstrap-datetimepicker-widget .btn[data-action="decrementHours"]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Decrement Hours"}.bootstrap-datetimepicker-widget .btn[data-action="decrementMinutes"]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Decrement Minutes"}.bootstrap-datetimepicker-widget .btn[data-action="showHours"]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Show Hours"}.bootstrap-datetimepicker-widget .btn[data-action="showMinutes"]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Show Minutes"}.bootstrap-datetimepicker-widget .btn[data-action="togglePeriod"]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Toggle AM/PM"}.bootstrap-datetimepicker-widget .btn[data-action="clear"]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Clear the picker"}.bootstrap-datetimepicker-widget .btn[data-action="today"]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Set the date to today"}.bootstrap-datetimepicker-widget .picker-switch{text-align:center}.bootstrap-datetimepicker-widget .picker-switch::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Toggle Date and Time Screens"}.bootstrap-datetimepicker-widget .picker-switch td{padding:0;margin:0;height:auto;width:auto;line-height:inherit}.bootstrap-datetimepicker-widget .picker-switch td span{line-height:2.5;height:2.5em;width:100%}.bootstrap-datetimepicker-widget table{width:100%;margin:0}.bootstrap-datetimepicker-widget table td,.bootstrap-datetimepicker-widget table th{text-align:center}.bootstrap-datetimepicker-widget table th{height:20px;line-height:20px;width:20px}.bootstrap-datetimepicker-widget table th.picker-switch{width:145px}.bootstrap-datetimepicker-widget table th.disabled,.bootstrap-datetimepicker-widget table th.disabled:hover{background:none;color:#777777;cursor:not-allowed}.bootstrap-datetimepicker-widget table th.prev::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Previous Month"}.bootstrap-datetimepicker-widget table th.next::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Next Month"}.bootstrap-datetimepicker-widget table thead tr:first-child th{cursor:pointer}.bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#90c8f6}.bootstrap-datetimepicker-widget table td{height:54px;line-height:54px;width:54px}.bootstrap-datetimepicker-widget table td.cw{font-size:.8em;height:20px;line-height:20px;color:#777777}.bootstrap-datetimepicker-widget table td.day{height:20px;line-height:20px;width:20px}.bootstrap-datetimepicker-widget table td.day:hover,.bootstrap-datetimepicker-widget table td.hour:hover,.bootstrap-datetimepicker-widget table td.minute:hover,.bootstrap-datetimepicker-widget table td.second:hover{background:#90c8f6;cursor:pointer}.bootstrap-datetimepicker-widget table td.old,.bootstrap-datetimepicker-widget table td.new{color:#777777}.bootstrap-datetimepicker-widget table td.today{position:relative}.bootstrap-datetimepicker-widget table td.today:before{content:'';display:inline-block;border:solid transparent;border-width:0 0 7px 7px;border-bottom-color:#337ab7;border-top-color:rgba(0, 0, 0, 0.2);position:absolute;bottom:4px;right:4px}.bootstrap-datetimepicker-widget table td.active,.bootstrap-datetimepicker-widget table td.active:hover{background-color:#337ab7;color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25)}.bootstrap-datetimepicker-widget table td.active.today:before{border-bottom-color:#fff}.bootstrap-datetimepicker-widget table td.disabled,.bootstrap-datetimepicker-widget table td.disabled:hover{background:none;color:#777777;cursor:not-allowed}.bootstrap-datetimepicker-widget table td span{display:inline-block;width:54px;height:54px;line-height:54px;margin:2px 1.5px;cursor:pointer}.bootstrap-datetimepicker-widget table td span:hover{background:#90c8f6}.bootstrap-datetimepicker-widget table td span.active{background-color:#337ab7;color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25)}.bootstrap-datetimepicker-widget table td span.old{color:#777777}.bootstrap-datetimepicker-widget table td span.disabled,.bootstrap-datetimepicker-widget table td span.disabled:hover{background:none;color:#777777;cursor:not-allowed}.bootstrap-datetimepicker-widget.usetwentyfour td.hour{height:27px;line-height:27px}.bootstrap-datetimepicker-widget.wider{width:21em}.bootstrap-datetimepicker-widget .datepicker-decades .decade{line-height:1.8em !important}.input-group.date .input-group-addon{cursor:pointer}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0} diff --git a/app_v3satdemo/chrome/content/web/css/bootstrap-multiselect.css b/app_v3satdemo/chrome/content/web/css/bootstrap-multiselect.css new file mode 100644 index 0000000..032e079 --- /dev/null +++ b/app_v3satdemo/chrome/content/web/css/bootstrap-multiselect.css @@ -0,0 +1,63 @@ +.multiselect-container { + position: absolute; + list-style-type: none; + margin: 0; + padding: 0 +} + +.multiselect-container .input-group { + margin: 5px +} + +.multiselect-container>li { + padding: 0 +} + +.multiselect-container>li>a.multiselect-all label { + font-weight: 700 +} + +.multiselect-container>li.multiselect-group label { + margin: 0; + padding: 3px 20px 3px 20px; + height: 100%; + font-weight: 700 +} + +.multiselect-container>li.multiselect-group-clickable label { + cursor: pointer +} + +.multiselect-container>li>a { + padding: 0 +} + +.multiselect-container>li>a>label { + margin: 0; + height: 100%; + cursor: pointer; + font-weight: 400; + padding: 3px 20px 3px 40px +} + +.multiselect-container>li>a>label.radio,.multiselect-container>li>a>label.checkbox { + margin: 0 +} + +.multiselect-container>li>a>label>input[type=checkbox] { + margin-bottom: 5px +} + +.btn-group>.btn-group:nth-child(2)>.multiselect.btn { + border-top-left-radius: 4px; + border-bottom-left-radius: 4px +} + +.form-inline .multiselect-container label.checkbox,.form-inline .multiselect-container label.radio { + padding: 3px 20px 3px 40px +} + +.form-inline .multiselect-container li a label.checkbox input[type=checkbox],.form-inline .multiselect-container li a label.radio input[type=radio] { + margin-left: -20px; + margin-right: 0 +} \ No newline at end of file diff --git a/app_v3satdemo/chrome/content/web/css/bootstrap-theme.css b/app_v3satdemo/chrome/content/web/css/bootstrap-theme.css new file mode 100644 index 0000000..ebe57fb --- /dev/null +++ b/app_v3satdemo/chrome/content/web/css/bootstrap-theme.css @@ -0,0 +1,587 @@ +/*! + * Bootstrap v3.3.6 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +.btn-default, +.btn-primary, +.btn-success, +.btn-info, +.btn-warning, +.btn-danger { + text-shadow: 0 -1px 0 rgba(0, 0, 0, .2); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); +} +.btn-default:active, +.btn-primary:active, +.btn-success:active, +.btn-info:active, +.btn-warning:active, +.btn-danger:active, +.btn-default.active, +.btn-primary.active, +.btn-success.active, +.btn-info.active, +.btn-warning.active, +.btn-danger.active { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn-default.disabled, +.btn-primary.disabled, +.btn-success.disabled, +.btn-info.disabled, +.btn-warning.disabled, +.btn-danger.disabled, +.btn-default[disabled], +.btn-primary[disabled], +.btn-success[disabled], +.btn-info[disabled], +.btn-warning[disabled], +.btn-danger[disabled], +fieldset[disabled] .btn-default, +fieldset[disabled] .btn-primary, +fieldset[disabled] .btn-success, +fieldset[disabled] .btn-info, +fieldset[disabled] .btn-warning, +fieldset[disabled] .btn-danger { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-default .badge, +.btn-primary .badge, +.btn-success .badge, +.btn-info .badge, +.btn-warning .badge, +.btn-danger .badge { + text-shadow: none; +} +.btn:active, +.btn.active { + background-image: none; +} +.btn-default { + text-shadow: 0 1px 0 #fff; + background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%); + background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0)); + background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #dbdbdb; + border-color: #ccc; +} +.btn-default:hover, +.btn-default:focus { + background-color: #e0e0e0; + background-position: 0 -15px; +} +.btn-default:active, +.btn-default.active { + background-color: #e0e0e0; + border-color: #dbdbdb; +} +.btn-default.disabled, +.btn-default[disabled], +fieldset[disabled] .btn-default, +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled.focus, +.btn-default[disabled].focus, +fieldset[disabled] .btn-default.focus, +.btn-default.disabled:active, +.btn-default[disabled]:active, +fieldset[disabled] .btn-default:active, +.btn-default.disabled.active, +.btn-default[disabled].active, +fieldset[disabled] .btn-default.active { + background-color: #e0e0e0; + background-image: none; +} +.btn-primary { + background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88)); + background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #245580; +} +.btn-primary:hover, +.btn-primary:focus { + background-color: #265a88; + background-position: 0 -15px; +} +.btn-primary:active, +.btn-primary.active { + background-color: #265a88; + border-color: #245580; +} +.btn-primary.disabled, +.btn-primary[disabled], +fieldset[disabled] .btn-primary, +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled.focus, +.btn-primary[disabled].focus, +fieldset[disabled] .btn-primary.focus, +.btn-primary.disabled:active, +.btn-primary[disabled]:active, +fieldset[disabled] .btn-primary:active, +.btn-primary.disabled.active, +.btn-primary[disabled].active, +fieldset[disabled] .btn-primary.active { + background-color: #265a88; + background-image: none; +} +.btn-success { + background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%); + background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641)); + background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #3e8f3e; +} +.btn-success:hover, +.btn-success:focus { + background-color: #419641; + background-position: 0 -15px; +} +.btn-success:active, +.btn-success.active { + background-color: #419641; + border-color: #3e8f3e; +} +.btn-success.disabled, +.btn-success[disabled], +fieldset[disabled] .btn-success, +.btn-success.disabled:hover, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success:hover, +.btn-success.disabled:focus, +.btn-success[disabled]:focus, +fieldset[disabled] .btn-success:focus, +.btn-success.disabled.focus, +.btn-success[disabled].focus, +fieldset[disabled] .btn-success.focus, +.btn-success.disabled:active, +.btn-success[disabled]:active, +fieldset[disabled] .btn-success:active, +.btn-success.disabled.active, +.btn-success[disabled].active, +fieldset[disabled] .btn-success.active { + background-color: #419641; + background-image: none; +} +.btn-info { + background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); + background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2)); + background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #28a4c9; +} +.btn-info:hover, +.btn-info:focus { + background-color: #2aabd2; + background-position: 0 -15px; +} +.btn-info:active, +.btn-info.active { + background-color: #2aabd2; + border-color: #28a4c9; +} +.btn-info.disabled, +.btn-info[disabled], +fieldset[disabled] .btn-info, +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled.focus, +.btn-info[disabled].focus, +fieldset[disabled] .btn-info.focus, +.btn-info.disabled:active, +.btn-info[disabled]:active, +fieldset[disabled] .btn-info:active, +.btn-info.disabled.active, +.btn-info[disabled].active, +fieldset[disabled] .btn-info.active { + background-color: #2aabd2; + background-image: none; +} +.btn-warning { + background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); + background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316)); + background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #e38d13; +} +.btn-warning:hover, +.btn-warning:focus { + background-color: #eb9316; + background-position: 0 -15px; +} +.btn-warning:active, +.btn-warning.active { + background-color: #eb9316; + border-color: #e38d13; +} +.btn-warning.disabled, +.btn-warning[disabled], +fieldset[disabled] .btn-warning, +.btn-warning.disabled:hover, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning:hover, +.btn-warning.disabled:focus, +.btn-warning[disabled]:focus, +fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled.focus, +.btn-warning[disabled].focus, +fieldset[disabled] .btn-warning.focus, +.btn-warning.disabled:active, +.btn-warning[disabled]:active, +fieldset[disabled] .btn-warning:active, +.btn-warning.disabled.active, +.btn-warning[disabled].active, +fieldset[disabled] .btn-warning.active { + background-color: #eb9316; + background-image: none; +} +.btn-danger { + background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%); + background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a)); + background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #b92c28; +} +.btn-danger:hover, +.btn-danger:focus { + background-color: #c12e2a; + background-position: 0 -15px; +} +.btn-danger:active, +.btn-danger.active { + background-color: #c12e2a; + border-color: #b92c28; +} +.btn-danger.disabled, +.btn-danger[disabled], +fieldset[disabled] .btn-danger, +.btn-danger.disabled:hover, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger:hover, +.btn-danger.disabled:focus, +.btn-danger[disabled]:focus, +fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled.focus, +.btn-danger[disabled].focus, +fieldset[disabled] .btn-danger.focus, +.btn-danger.disabled:active, +.btn-danger[disabled]:active, +fieldset[disabled] .btn-danger:active, +.btn-danger.disabled.active, +.btn-danger[disabled].active, +fieldset[disabled] .btn-danger.active { + background-color: #c12e2a; + background-image: none; +} +.thumbnail, +.img-thumbnail { + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); + box-shadow: 0 1px 2px rgba(0, 0, 0, .075); +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + background-color: #e8e8e8; + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); + background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); + background-repeat: repeat-x; +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + background-color: #2e6da4; + background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); + background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); + background-repeat: repeat-x; +} +.navbar-default { + background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%); + background-image: -o-linear-gradient(top, #fff 0%, #f8f8f8 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8)); + background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); +} +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .active > a { + background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); + background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2)); + background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0); + background-repeat: repeat-x; + -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); + box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); +} +.navbar-brand, +.navbar-nav > li > a { + text-shadow: 0 1px 0 rgba(255, 255, 255, .25); +} +.navbar-inverse { + background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%); + background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222)); + background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-radius: 4px; +} +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .active > a { + background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%); + background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f)); + background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0); + background-repeat: repeat-x; + -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); + box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); +} +.navbar-inverse .navbar-brand, +.navbar-inverse .navbar-nav > li > a { + text-shadow: 0 -1px 0 rgba(0, 0, 0, .25); +} +.navbar-static-top, +.navbar-fixed-top, +.navbar-fixed-bottom { + border-radius: 0; +} +@media (max-width: 767px) { + .navbar .navbar-nav .open .dropdown-menu > .active > a, + .navbar .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #fff; + background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); + background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); + background-repeat: repeat-x; + } +} +.alert { + text-shadow: 0 1px 0 rgba(255, 255, 255, .2); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); +} +.alert-success { + background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); + background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc)); + background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); + background-repeat: repeat-x; + border-color: #b2dba1; +} +.alert-info { + background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%); + background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0)); + background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); + background-repeat: repeat-x; + border-color: #9acfea; +} +.alert-warning { + background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); + background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0)); + background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); + background-repeat: repeat-x; + border-color: #f5e79e; +} +.alert-danger { + background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); + background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3)); + background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); + background-repeat: repeat-x; + border-color: #dca7a7; +} +.progress { + background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); + background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5)); + background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar { + background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090)); + background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-success { + background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%); + background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44)); + background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-info { + background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); + background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5)); + background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-warning { + background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); + background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f)); + background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-danger { + background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); + background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c)); + background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.list-group { + border-radius: 4px; + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); + box-shadow: 0 1px 2px rgba(0, 0, 0, .075); +} +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + text-shadow: 0 -1px 0 #286090; + background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a)); + background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0); + background-repeat: repeat-x; + border-color: #2b669a; +} +.list-group-item.active .badge, +.list-group-item.active:hover .badge, +.list-group-item.active:focus .badge { + text-shadow: none; +} +.panel { + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05); + box-shadow: 0 1px 2px rgba(0, 0, 0, .05); +} +.panel-default > .panel-heading { + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); + background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); + background-repeat: repeat-x; +} +.panel-primary > .panel-heading { + background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); + background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); + background-repeat: repeat-x; +} +.panel-success > .panel-heading { + background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); + background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6)); + background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); + background-repeat: repeat-x; +} +.panel-info > .panel-heading { + background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); + background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3)); + background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); + background-repeat: repeat-x; +} +.panel-warning > .panel-heading { + background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); + background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc)); + background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); + background-repeat: repeat-x; +} +.panel-danger > .panel-heading { + background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); + background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc)); + background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); + background-repeat: repeat-x; +} +.well { + background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); + background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5)); + background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); + background-repeat: repeat-x; + border-color: #dcdcdc; + -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); +} +/*# sourceMappingURL=bootstrap-theme.css.map */ diff --git a/app_v3satdemo/chrome/content/web/css/bootstrap-theme.min.css b/app_v3satdemo/chrome/content/web/css/bootstrap-theme.min.css new file mode 100644 index 0000000..dc95d8e --- /dev/null +++ b/app_v3satdemo/chrome/content/web/css/bootstrap-theme.min.css @@ -0,0 +1,6 @@ +/*! + * Bootstrap v3.3.6 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger.disabled,.btn-danger[disabled],.btn-default.disabled,.btn-default[disabled],.btn-info.disabled,.btn-info[disabled],.btn-primary.disabled,.btn-primary[disabled],.btn-success.disabled,.btn-success[disabled],.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-default,fieldset[disabled] .btn-info,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-warning{-webkit-box-shadow:none;box-shadow:none}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-color:#2e6da4;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)} +/*# sourceMappingURL=bootstrap-theme.min.css.map */ \ No newline at end of file diff --git a/app_v3satdemo/chrome/content/web/css/bootstrap-timepicker.min.css b/app_v3satdemo/chrome/content/web/css/bootstrap-timepicker.min.css new file mode 100644 index 0000000..b59d6f7 --- /dev/null +++ b/app_v3satdemo/chrome/content/web/css/bootstrap-timepicker.min.css @@ -0,0 +1,10 @@ +/*! + * Timepicker Component for Twitter Bootstrap + * + * Copyright 2013 Joris de Wit + * + * Contributors https://github.com/jdewit/bootstrap-timepicker/graphs/contributors + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */.bootstrap-timepicker{position:relative}.bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu{left:auto;right:0}.bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu:before{left:auto;right:12px}.bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu:after{left:auto;right:13px}.bootstrap-timepicker .add-on{cursor:pointer}.bootstrap-timepicker .add-on i{display:inline-block;width:16px;height:16px}.bootstrap-timepicker-widget.dropdown-menu{padding:2px 3px 2px 2px}.bootstrap-timepicker-widget.dropdown-menu.open{display:inline-block}.bootstrap-timepicker-widget.dropdown-menu:before{border-bottom:7px solid rgba(0,0,0,0.2);border-left:7px solid transparent;border-right:7px solid transparent;content:"";display:inline-block;left:9px;position:absolute;top:-7px}.bootstrap-timepicker-widget.dropdown-menu:after{border-bottom:6px solid #fff;border-left:6px solid transparent;border-right:6px solid transparent;content:"";display:inline-block;left:10px;position:absolute;top:-6px}.bootstrap-timepicker-widget a.btn,.bootstrap-timepicker-widget input{border-radius:4px}.bootstrap-timepicker-widget table{width:100%;margin:0}.bootstrap-timepicker-widget table td{text-align:center;height:30px;margin:0;padding:2px}.bootstrap-timepicker-widget table td:not(.separator){min-width:30px}.bootstrap-timepicker-widget table td span{width:100%}.bootstrap-timepicker-widget table td a{border:1px transparent solid;width:100%;display:inline-block;margin:0;padding:8px 0;outline:0;color:#333}.bootstrap-timepicker-widget table td a:hover{text-decoration:none;background-color:#eee;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;border-color:#ddd}.bootstrap-timepicker-widget table td a i{margin-top:2px}.bootstrap-timepicker-widget table td input{width:25px;margin:0;text-align:center}.bootstrap-timepicker-widget .modal-content{padding:4px}@media(min-width:767px){.bootstrap-timepicker-widget.modal{width:200px;margin-left:-100px}}@media(max-width:767px){.bootstrap-timepicker{width:100%}.bootstrap-timepicker .dropdown-menu{width:100%}} \ No newline at end of file diff --git a/app_v3satdemo/chrome/content/web/css/bootstrap.css b/app_v3satdemo/chrome/content/web/css/bootstrap.css new file mode 100644 index 0000000..42c79d6 --- /dev/null +++ b/app_v3satdemo/chrome/content/web/css/bootstrap.css @@ -0,0 +1,6760 @@ +/*! + * Bootstrap v3.3.6 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ +html { + font-family: sans-serif; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} +body { + margin: 0; +} +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} +audio, +canvas, +progress, +video { + display: inline-block; + vertical-align: baseline; +} +audio:not([controls]) { + display: none; + height: 0; +} +[hidden], +template { + display: none; +} +a { + background-color: transparent; +} +a:active, +a:hover { + outline: 0; +} +abbr[title] { + border-bottom: 1px dotted; +} +b, +strong { + font-weight: bold; +} +dfn { + font-style: italic; +} +h1 { + margin: .67em 0; + font-size: 2em; +} +mark { + color: #000; + background: #ff0; +} +small { + font-size: 80%; +} +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} +sup { + top: -.5em; +} +sub { + bottom: -.25em; +} +img { + border: 0; +} +svg:not(:root) { + overflow: hidden; +} +figure { + margin: 1em 40px; +} +hr { + height: 0; + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} +pre { + overflow: auto; +} +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} +button, +input, +optgroup, +select, +textarea { + margin: 0; + font: inherit; + color: inherit; +} +button { + overflow: visible; +} +button, +select { + text-transform: none; +} +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; +} +button[disabled], +html input[disabled] { + cursor: default; +} +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} +input { + line-height: normal; +} +input[type="checkbox"], +input[type="radio"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 0; +} +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; +} +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} +fieldset { + padding: .35em .625em .75em; + margin: 0 2px; + border: 1px solid #c0c0c0; +} +legend { + padding: 0; + border: 0; +} +textarea { + overflow: auto; +} +optgroup { + font-weight: bold; +} +table { + border-spacing: 0; + border-collapse: collapse; +} +td, +th { + padding: 0; +} +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ +@media print { + *, + *:before, + *:after { + color: #000 !important; + text-shadow: none !important; + background: transparent !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + a[href^="#"]:after, + a[href^="javascript:"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } + .navbar { + display: none; + } + .btn > .caret, + .dropup > .btn > .caret { + border-top-color: #000 !important; + } + .label { + border: 1px solid #000; + } + .table { + border-collapse: collapse !important; + } + .table td, + .table th { + background-color: #fff !important; + } + .table-bordered th, + .table-bordered td { + border: 1px solid #ddd !important; + } +} +@font-face { + font-family: 'Glyphicons Halflings'; + + src: url('../fonts/glyphicons-halflings-regular.eot'); + src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); +} +.glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: normal; + line-height: 1; + + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.glyphicon-asterisk:before { + content: "\002a"; +} +.glyphicon-plus:before { + content: "\002b"; +} +.glyphicon-euro:before, +.glyphicon-eur:before { + content: "\20ac"; +} +.glyphicon-minus:before { + content: "\2212"; +} +.glyphicon-cloud:before { + content: "\2601"; +} +.glyphicon-envelope:before { + content: "\2709"; +} +.glyphicon-pencil:before { + content: "\270f"; +} +.glyphicon-glass:before { + content: "\e001"; +} +.glyphicon-music:before { + content: "\e002"; +} +.glyphicon-search:before { + content: "\e003"; +} +.glyphicon-heart:before { + content: "\e005"; +} +.glyphicon-star:before { + content: "\e006"; +} +.glyphicon-star-empty:before { + content: "\e007"; +} +.glyphicon-user:before { + content: "\e008"; +} +.glyphicon-film:before { + content: "\e009"; +} +.glyphicon-th-large:before { + content: "\e010"; +} +.glyphicon-th:before { + content: "\e011"; +} +.glyphicon-th-list:before { + content: "\e012"; +} +.glyphicon-ok:before { + content: "\e013"; +} +.glyphicon-remove:before { + content: "\e014"; +} +.glyphicon-zoom-in:before { + content: "\e015"; +} +.glyphicon-zoom-out:before { + content: "\e016"; +} +.glyphicon-off:before { + content: "\e017"; +} +.glyphicon-signal:before { + content: "\e018"; +} +.glyphicon-cog:before { + content: "\e019"; +} +.glyphicon-trash:before { + content: "\e020"; +} +.glyphicon-home:before { + content: "\e021"; +} +.glyphicon-file:before { + content: "\e022"; +} +.glyphicon-time:before { + content: "\e023"; +} +.glyphicon-road:before { + content: "\e024"; +} +.glyphicon-download-alt:before { + content: "\e025"; +} +.glyphicon-download:before { + content: "\e026"; +} +.glyphicon-upload:before { + content: "\e027"; +} +.glyphicon-inbox:before { + content: "\e028"; +} +.glyphicon-play-circle:before { + content: "\e029"; +} +.glyphicon-repeat:before { + content: "\e030"; +} +.glyphicon-refresh:before { + content: "\e031"; +} +.glyphicon-list-alt:before { + content: "\e032"; +} +.glyphicon-lock:before { + content: "\e033"; +} +.glyphicon-flag:before { + content: "\e034"; +} +.glyphicon-headphones:before { + content: "\e035"; +} +.glyphicon-volume-off:before { + content: "\e036"; +} +.glyphicon-volume-down:before { + content: "\e037"; +} +.glyphicon-volume-up:before { + content: "\e038"; +} +.glyphicon-qrcode:before { + content: "\e039"; +} +.glyphicon-barcode:before { + content: "\e040"; +} +.glyphicon-tag:before { + content: "\e041"; +} +.glyphicon-tags:before { + content: "\e042"; +} +.glyphicon-book:before { + content: "\e043"; +} +.glyphicon-bookmark:before { + content: "\e044"; +} +.glyphicon-print:before { + content: "\e045"; +} +.glyphicon-camera:before { + content: "\e046"; +} +.glyphicon-font:before { + content: "\e047"; +} +.glyphicon-bold:before { + content: "\e048"; +} +.glyphicon-italic:before { + content: "\e049"; +} +.glyphicon-text-height:before { + content: "\e050"; +} +.glyphicon-text-width:before { + content: "\e051"; +} +.glyphicon-align-left:before { + content: "\e052"; +} +.glyphicon-align-center:before { + content: "\e053"; +} +.glyphicon-align-right:before { + content: "\e054"; +} +.glyphicon-align-justify:before { + content: "\e055"; +} +.glyphicon-list:before { + content: "\e056"; +} +.glyphicon-indent-left:before { + content: "\e057"; +} +.glyphicon-indent-right:before { + content: "\e058"; +} +.glyphicon-facetime-video:before { + content: "\e059"; +} +.glyphicon-picture:before { + content: "\e060"; +} +.glyphicon-map-marker:before { + content: "\e062"; +} +.glyphicon-adjust:before { + content: "\e063"; +} +.glyphicon-tint:before { + content: "\e064"; +} +.glyphicon-edit:before { + content: "\e065"; +} +.glyphicon-share:before { + content: "\e066"; +} +.glyphicon-check:before { + content: "\e067"; +} +.glyphicon-move:before { + content: "\e068"; +} +.glyphicon-step-backward:before { + content: "\e069"; +} +.glyphicon-fast-backward:before { + content: "\e070"; +} +.glyphicon-backward:before { + content: "\e071"; +} +.glyphicon-play:before { + content: "\e072"; +} +.glyphicon-pause:before { + content: "\e073"; +} +.glyphicon-stop:before { + content: "\e074"; +} +.glyphicon-forward:before { + content: "\e075"; +} +.glyphicon-fast-forward:before { + content: "\e076"; +} +.glyphicon-step-forward:before { + content: "\e077"; +} +.glyphicon-eject:before { + content: "\e078"; +} +.glyphicon-chevron-left:before { + content: "\e079"; +} +.glyphicon-chevron-right:before { + content: "\e080"; +} +.glyphicon-plus-sign:before { + content: "\e081"; +} +.glyphicon-minus-sign:before { + content: "\e082"; +} +.glyphicon-remove-sign:before { + content: "\e083"; +} +.glyphicon-ok-sign:before { + content: "\e084"; +} +.glyphicon-question-sign:before { + content: "\e085"; +} +.glyphicon-info-sign:before { + content: "\e086"; +} +.glyphicon-screenshot:before { + content: "\e087"; +} +.glyphicon-remove-circle:before { + content: "\e088"; +} +.glyphicon-ok-circle:before { + content: "\e089"; +} +.glyphicon-ban-circle:before { + content: "\e090"; +} +.glyphicon-arrow-left:before { + content: "\e091"; +} +.glyphicon-arrow-right:before { + content: "\e092"; +} +.glyphicon-arrow-up:before { + content: "\e093"; +} +.glyphicon-arrow-down:before { + content: "\e094"; +} +.glyphicon-share-alt:before { + content: "\e095"; +} +.glyphicon-resize-full:before { + content: "\e096"; +} +.glyphicon-resize-small:before { + content: "\e097"; +} +.glyphicon-exclamation-sign:before { + content: "\e101"; +} +.glyphicon-gift:before { + content: "\e102"; +} +.glyphicon-leaf:before { + content: "\e103"; +} +.glyphicon-fire:before { + content: "\e104"; +} +.glyphicon-eye-open:before { + content: "\e105"; +} +.glyphicon-eye-close:before { + content: "\e106"; +} +.glyphicon-warning-sign:before { + content: "\e107"; +} +.glyphicon-plane:before { + content: "\e108"; +} +.glyphicon-calendar:before { + content: "\e109"; +} +.glyphicon-random:before { + content: "\e110"; +} +.glyphicon-comment:before { + content: "\e111"; +} +.glyphicon-magnet:before { + content: "\e112"; +} +.glyphicon-chevron-up:before { + content: "\e113"; +} +.glyphicon-chevron-down:before { + content: "\e114"; +} +.glyphicon-retweet:before { + content: "\e115"; +} +.glyphicon-shopping-cart:before { + content: "\e116"; +} +.glyphicon-folder-close:before { + content: "\e117"; +} +.glyphicon-folder-open:before { + content: "\e118"; +} +.glyphicon-resize-vertical:before { + content: "\e119"; +} +.glyphicon-resize-horizontal:before { + content: "\e120"; +} +.glyphicon-hdd:before { + content: "\e121"; +} +.glyphicon-bullhorn:before { + content: "\e122"; +} +.glyphicon-bell:before { + content: "\e123"; +} +.glyphicon-certificate:before { + content: "\e124"; +} +.glyphicon-thumbs-up:before { + content: "\e125"; +} +.glyphicon-thumbs-down:before { + content: "\e126"; +} +.glyphicon-hand-right:before { + content: "\e127"; +} +.glyphicon-hand-left:before { + content: "\e128"; +} +.glyphicon-hand-up:before { + content: "\e129"; +} +.glyphicon-hand-down:before { + content: "\e130"; +} +.glyphicon-circle-arrow-right:before { + content: "\e131"; +} +.glyphicon-circle-arrow-left:before { + content: "\e132"; +} +.glyphicon-circle-arrow-up:before { + content: "\e133"; +} +.glyphicon-circle-arrow-down:before { + content: "\e134"; +} +.glyphicon-globe:before { + content: "\e135"; +} +.glyphicon-wrench:before { + content: "\e136"; +} +.glyphicon-tasks:before { + content: "\e137"; +} +.glyphicon-filter:before { + content: "\e138"; +} +.glyphicon-briefcase:before { + content: "\e139"; +} +.glyphicon-fullscreen:before { + content: "\e140"; +} +.glyphicon-dashboard:before { + content: "\e141"; +} +.glyphicon-paperclip:before { + content: "\e142"; +} +.glyphicon-heart-empty:before { + content: "\e143"; +} +.glyphicon-link:before { + content: "\e144"; +} +.glyphicon-phone:before { + content: "\e145"; +} +.glyphicon-pushpin:before { + content: "\e146"; +} +.glyphicon-usd:before { + content: "\e148"; +} +.glyphicon-gbp:before { + content: "\e149"; +} +.glyphicon-sort:before { + content: "\e150"; +} +.glyphicon-sort-by-alphabet:before { + content: "\e151"; +} +.glyphicon-sort-by-alphabet-alt:before { + content: "\e152"; +} +.glyphicon-sort-by-order:before { + content: "\e153"; +} +.glyphicon-sort-by-order-alt:before { + content: "\e154"; +} +.glyphicon-sort-by-attributes:before { + content: "\e155"; +} +.glyphicon-sort-by-attributes-alt:before { + content: "\e156"; +} +.glyphicon-unchecked:before { + content: "\e157"; +} +.glyphicon-expand:before { + content: "\e158"; +} +.glyphicon-collapse-down:before { + content: "\e159"; +} +.glyphicon-collapse-up:before { + content: "\e160"; +} +.glyphicon-log-in:before { + content: "\e161"; +} +.glyphicon-flash:before { + content: "\e162"; +} +.glyphicon-log-out:before { + content: "\e163"; +} +.glyphicon-new-window:before { + content: "\e164"; +} +.glyphicon-record:before { + content: "\e165"; +} +.glyphicon-save:before { + content: "\e166"; +} +.glyphicon-open:before { + content: "\e167"; +} +.glyphicon-saved:before { + content: "\e168"; +} +.glyphicon-import:before { + content: "\e169"; +} +.glyphicon-export:before { + content: "\e170"; +} +.glyphicon-send:before { + content: "\e171"; +} +.glyphicon-floppy-disk:before { + content: "\e172"; +} +.glyphicon-floppy-saved:before { + content: "\e173"; +} +.glyphicon-floppy-remove:before { + content: "\e174"; +} +.glyphicon-floppy-save:before { + content: "\e175"; +} +.glyphicon-floppy-open:before { + content: "\e176"; +} +.glyphicon-credit-card:before { + content: "\e177"; +} +.glyphicon-transfer:before { + content: "\e178"; +} +.glyphicon-cutlery:before { + content: "\e179"; +} +.glyphicon-header:before { + content: "\e180"; +} +.glyphicon-compressed:before { + content: "\e181"; +} +.glyphicon-earphone:before { + content: "\e182"; +} +.glyphicon-phone-alt:before { + content: "\e183"; +} +.glyphicon-tower:before { + content: "\e184"; +} +.glyphicon-stats:before { + content: "\e185"; +} +.glyphicon-sd-video:before { + content: "\e186"; +} +.glyphicon-hd-video:before { + content: "\e187"; +} +.glyphicon-subtitles:before { + content: "\e188"; +} +.glyphicon-sound-stereo:before { + content: "\e189"; +} +.glyphicon-sound-dolby:before { + content: "\e190"; +} +.glyphicon-sound-5-1:before { + content: "\e191"; +} +.glyphicon-sound-6-1:before { + content: "\e192"; +} +.glyphicon-sound-7-1:before { + content: "\e193"; +} +.glyphicon-copyright-mark:before { + content: "\e194"; +} +.glyphicon-registration-mark:before { + content: "\e195"; +} +.glyphicon-cloud-download:before { + content: "\e197"; +} +.glyphicon-cloud-upload:before { + content: "\e198"; +} +.glyphicon-tree-conifer:before { + content: "\e199"; +} +.glyphicon-tree-deciduous:before { + content: "\e200"; +} +.glyphicon-cd:before { + content: "\e201"; +} +.glyphicon-save-file:before { + content: "\e202"; +} +.glyphicon-open-file:before { + content: "\e203"; +} +.glyphicon-level-up:before { + content: "\e204"; +} +.glyphicon-copy:before { + content: "\e205"; +} +.glyphicon-paste:before { + content: "\e206"; +} +.glyphicon-alert:before { + content: "\e209"; +} +.glyphicon-equalizer:before { + content: "\e210"; +} +.glyphicon-king:before { + content: "\e211"; +} +.glyphicon-queen:before { + content: "\e212"; +} +.glyphicon-pawn:before { + content: "\e213"; +} +.glyphicon-bishop:before { + content: "\e214"; +} +.glyphicon-knight:before { + content: "\e215"; +} +.glyphicon-baby-formula:before { + content: "\e216"; +} +.glyphicon-tent:before { + content: "\26fa"; +} +.glyphicon-blackboard:before { + content: "\e218"; +} +.glyphicon-bed:before { + content: "\e219"; +} +.glyphicon-apple:before { + content: "\f8ff"; +} +.glyphicon-erase:before { + content: "\e221"; +} +.glyphicon-hourglass:before { + content: "\231b"; +} +.glyphicon-lamp:before { + content: "\e223"; +} +.glyphicon-duplicate:before { + content: "\e224"; +} +.glyphicon-piggy-bank:before { + content: "\e225"; +} +.glyphicon-scissors:before { + content: "\e226"; +} +.glyphicon-bitcoin:before { + content: "\e227"; +} +.glyphicon-btc:before { + content: "\e227"; +} +.glyphicon-xbt:before { + content: "\e227"; +} +.glyphicon-yen:before { + content: "\00a5"; +} +.glyphicon-jpy:before { + content: "\00a5"; +} +.glyphicon-ruble:before { + content: "\20bd"; +} +.glyphicon-rub:before { + content: "\20bd"; +} +.glyphicon-scale:before { + content: "\e230"; +} +.glyphicon-ice-lolly:before { + content: "\e231"; +} +.glyphicon-ice-lolly-tasted:before { + content: "\e232"; +} +.glyphicon-education:before { + content: "\e233"; +} +.glyphicon-option-horizontal:before { + content: "\e234"; +} +.glyphicon-option-vertical:before { + content: "\e235"; +} +.glyphicon-menu-hamburger:before { + content: "\e236"; +} +.glyphicon-modal-window:before { + content: "\e237"; +} +.glyphicon-oil:before { + content: "\e238"; +} +.glyphicon-grain:before { + content: "\e239"; +} +.glyphicon-sunglasses:before { + content: "\e240"; +} +.glyphicon-text-size:before { + content: "\e241"; +} +.glyphicon-text-color:before { + content: "\e242"; +} +.glyphicon-text-background:before { + content: "\e243"; +} +.glyphicon-object-align-top:before { + content: "\e244"; +} +.glyphicon-object-align-bottom:before { + content: "\e245"; +} +.glyphicon-object-align-horizontal:before { + content: "\e246"; +} +.glyphicon-object-align-left:before { + content: "\e247"; +} +.glyphicon-object-align-vertical:before { + content: "\e248"; +} +.glyphicon-object-align-right:before { + content: "\e249"; +} +.glyphicon-triangle-right:before { + content: "\e250"; +} +.glyphicon-triangle-left:before { + content: "\e251"; +} +.glyphicon-triangle-bottom:before { + content: "\e252"; +} +.glyphicon-triangle-top:before { + content: "\e253"; +} +.glyphicon-console:before { + content: "\e254"; +} +.glyphicon-superscript:before { + content: "\e255"; +} +.glyphicon-subscript:before { + content: "\e256"; +} +.glyphicon-menu-left:before { + content: "\e257"; +} +.glyphicon-menu-right:before { + content: "\e258"; +} +.glyphicon-menu-down:before { + content: "\e259"; +} +.glyphicon-menu-up:before { + content: "\e260"; +} +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +*:before, +*:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +html { + font-size: 10px; + + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +body { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.42857143; + color: #333; + background-color: #fff; +} +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} +a { + color: #337ab7; + text-decoration: none; +} +a:hover, +a:focus { + color: #23527c; + text-decoration: underline; +} +a:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +figure { + margin: 0; +} +img { + vertical-align: middle; +} +.img-responsive, +.thumbnail > img, +.thumbnail a > img, +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + max-width: 100%; + height: auto; +} +.img-rounded { + border-radius: 6px; +} +.img-thumbnail { + display: inline-block; + max-width: 100%; + height: auto; + padding: 4px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: all .2s ease-in-out; + -o-transition: all .2s ease-in-out; + transition: all .2s ease-in-out; +} +.img-circle { + border-radius: 50%; +} +hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eee; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} +[role="button"] { + cursor: pointer; +} +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: inherit; + font-weight: 500; + line-height: 1.1; + color: inherit; +} +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small, +.h1 small, +.h2 small, +.h3 small, +.h4 small, +.h5 small, +.h6 small, +h1 .small, +h2 .small, +h3 .small, +h4 .small, +h5 .small, +h6 .small, +.h1 .small, +.h2 .small, +.h3 .small, +.h4 .small, +.h5 .small, +.h6 .small { + font-weight: normal; + line-height: 1; + color: #777; +} +h1, +.h1, +h2, +.h2, +h3, +.h3 { + margin-top: 20px; + margin-bottom: 10px; +} +h1 small, +.h1 small, +h2 small, +.h2 small, +h3 small, +.h3 small, +h1 .small, +.h1 .small, +h2 .small, +.h2 .small, +h3 .small, +.h3 .small { + font-size: 65%; +} +h4, +.h4, +h5, +.h5, +h6, +.h6 { + margin-top: 10px; + margin-bottom: 10px; +} +h4 small, +.h4 small, +h5 small, +.h5 small, +h6 small, +.h6 small, +h4 .small, +.h4 .small, +h5 .small, +.h5 .small, +h6 .small, +.h6 .small { + font-size: 75%; +} +h1, +.h1 { + font-size: 36px; +} +h2, +.h2 { + font-size: 30px; +} +h3, +.h3 { + font-size: 24px; +} +h4, +.h4 { + font-size: 18px; +} +h5, +.h5 { + font-size: 14px; +} +h6, +.h6 { + font-size: 12px; +} +p { + margin: 0 0 10px; +} +.lead { + margin-bottom: 20px; + font-size: 16px; + font-weight: 300; + line-height: 1.4; +} +@media (min-width: 768px) { + .lead { + font-size: 21px; + } +} +small, +.small { + font-size: 85%; +} +mark, +.mark { + padding: .2em; + background-color: #fcf8e3; +} +.text-left { + text-align: left; +} +.text-right { + text-align: right; +} +.text-center { + text-align: center; +} +.text-justify { + text-align: justify; +} +.text-nowrap { + white-space: nowrap; +} +.text-lowercase { + text-transform: lowercase; +} +.text-uppercase { + text-transform: uppercase; +} +.text-capitalize { + text-transform: capitalize; +} +.text-muted { + color: #777; +} +.text-primary { + color: #337ab7; +} +a.text-primary:hover, +a.text-primary:focus { + color: #286090; +} +.text-success { + color: #3c763d; +} +a.text-success:hover, +a.text-success:focus { + color: #2b542c; +} +.text-info { + color: #31708f; +} +a.text-info:hover, +a.text-info:focus { + color: #245269; +} +.text-warning { + color: #8a6d3b; +} +a.text-warning:hover, +a.text-warning:focus { + color: #66512c; +} +.text-danger { + color: #a94442; +} +a.text-danger:hover, +a.text-danger:focus { + color: #843534; +} +.bg-primary { + color: #fff; + background-color: #337ab7; +} +a.bg-primary:hover, +a.bg-primary:focus { + background-color: #286090; +} +.bg-success { + background-color: #dff0d8; +} +a.bg-success:hover, +a.bg-success:focus { + background-color: #c1e2b3; +} +.bg-info { + background-color: #d9edf7; +} +a.bg-info:hover, +a.bg-info:focus { + background-color: #afd9ee; +} +.bg-warning { + background-color: #fcf8e3; +} +a.bg-warning:hover, +a.bg-warning:focus { + background-color: #f7ecb5; +} +.bg-danger { + background-color: #f2dede; +} +a.bg-danger:hover, +a.bg-danger:focus { + background-color: #e4b9b9; +} +.page-header { + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid #eee; +} +ul, +ol { + margin-top: 0; + margin-bottom: 10px; +} +ul ul, +ol ul, +ul ol, +ol ol { + margin-bottom: 0; +} +.list-unstyled { + padding-left: 0; + list-style: none; +} +.list-inline { + padding-left: 0; + margin-left: -5px; + list-style: none; +} +.list-inline > li { + display: inline-block; + padding-right: 5px; + padding-left: 5px; +} +dl { + margin-top: 0; + margin-bottom: 20px; +} +dt, +dd { + line-height: 1.42857143; +} +dt { + font-weight: bold; +} +dd { + margin-left: 0; +} +@media (min-width: 768px) { + .dl-horizontal dt { + float: left; + width: 160px; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; + } + .dl-horizontal dd { + margin-left: 180px; + } +} +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #777; +} +.initialism { + font-size: 90%; + text-transform: uppercase; +} +blockquote { + padding: 10px 20px; + margin: 0 0 20px; + font-size: 17.5px; + border-left: 5px solid #eee; +} +blockquote p:last-child, +blockquote ul:last-child, +blockquote ol:last-child { + margin-bottom: 0; +} +blockquote footer, +blockquote small, +blockquote .small { + display: block; + font-size: 80%; + line-height: 1.42857143; + color: #777; +} +blockquote footer:before, +blockquote small:before, +blockquote .small:before { + content: '\2014 \00A0'; +} +.blockquote-reverse, +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + text-align: right; + border-right: 5px solid #eee; + border-left: 0; +} +.blockquote-reverse footer:before, +blockquote.pull-right footer:before, +.blockquote-reverse small:before, +blockquote.pull-right small:before, +.blockquote-reverse .small:before, +blockquote.pull-right .small:before { + content: ''; +} +.blockquote-reverse footer:after, +blockquote.pull-right footer:after, +.blockquote-reverse small:after, +blockquote.pull-right small:after, +.blockquote-reverse .small:after, +blockquote.pull-right .small:after { + content: '\00A0 \2014'; +} +address { + margin-bottom: 20px; + font-style: normal; + line-height: 1.42857143; +} +code, +kbd, +pre, +samp { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; +} +code { + padding: 2px 4px; + font-size: 90%; + color: #c7254e; + background-color: #f9f2f4; + border-radius: 4px; +} +kbd { + padding: 2px 4px; + font-size: 90%; + color: #fff; + background-color: #333; + border-radius: 3px; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); +} +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: bold; + -webkit-box-shadow: none; + box-shadow: none; +} +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.42857143; + color: #333; + word-break: break-all; + word-wrap: break-word; + background-color: #f5f5f5; + border: 1px solid #ccc; + border-radius: 4px; +} +pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; +} +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} +.container { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +@media (min-width: 768px) { + .container { + width: 750px; + } +} +@media (min-width: 992px) { + .container { + width: 970px; + } +} +@media (min-width: 1200px) { + .container { + width: 1170px; + } +} +.container-fluid { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +.row { + margin-right: -15px; + margin-left: -15px; +} +.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; +} +.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { + float: left; +} +.col-xs-12 { + width: 100%; +} +.col-xs-11 { + width: 91.66666667%; +} +.col-xs-10 { + width: 83.33333333%; +} +.col-xs-9 { + width: 75%; +} +.col-xs-8 { + width: 66.66666667%; +} +.col-xs-7 { + width: 58.33333333%; +} +.col-xs-6 { + width: 50%; +} +.col-xs-5 { + width: 41.66666667%; +} +.col-xs-4 { + width: 33.33333333%; +} +.col-xs-3 { + width: 25%; +} +.col-xs-2 { + width: 16.66666667%; +} +.col-xs-1 { + width: 8.33333333%; +} +.col-xs-pull-12 { + right: 100%; +} +.col-xs-pull-11 { + right: 91.66666667%; +} +.col-xs-pull-10 { + right: 83.33333333%; +} +.col-xs-pull-9 { + right: 75%; +} +.col-xs-pull-8 { + right: 66.66666667%; +} +.col-xs-pull-7 { + right: 58.33333333%; +} +.col-xs-pull-6 { + right: 50%; +} +.col-xs-pull-5 { + right: 41.66666667%; +} +.col-xs-pull-4 { + right: 33.33333333%; +} +.col-xs-pull-3 { + right: 25%; +} +.col-xs-pull-2 { + right: 16.66666667%; +} +.col-xs-pull-1 { + right: 8.33333333%; +} +.col-xs-pull-0 { + right: auto; +} +.col-xs-push-12 { + left: 100%; +} +.col-xs-push-11 { + left: 91.66666667%; +} +.col-xs-push-10 { + left: 83.33333333%; +} +.col-xs-push-9 { + left: 75%; +} +.col-xs-push-8 { + left: 66.66666667%; +} +.col-xs-push-7 { + left: 58.33333333%; +} +.col-xs-push-6 { + left: 50%; +} +.col-xs-push-5 { + left: 41.66666667%; +} +.col-xs-push-4 { + left: 33.33333333%; +} +.col-xs-push-3 { + left: 25%; +} +.col-xs-push-2 { + left: 16.66666667%; +} +.col-xs-push-1 { + left: 8.33333333%; +} +.col-xs-push-0 { + left: auto; +} +.col-xs-offset-12 { + margin-left: 100%; +} +.col-xs-offset-11 { + margin-left: 91.66666667%; +} +.col-xs-offset-10 { + margin-left: 83.33333333%; +} +.col-xs-offset-9 { + margin-left: 75%; +} +.col-xs-offset-8 { + margin-left: 66.66666667%; +} +.col-xs-offset-7 { + margin-left: 58.33333333%; +} +.col-xs-offset-6 { + margin-left: 50%; +} +.col-xs-offset-5 { + margin-left: 41.66666667%; +} +.col-xs-offset-4 { + margin-left: 33.33333333%; +} +.col-xs-offset-3 { + margin-left: 25%; +} +.col-xs-offset-2 { + margin-left: 16.66666667%; +} +.col-xs-offset-1 { + margin-left: 8.33333333%; +} +.col-xs-offset-0 { + margin-left: 0; +} +@media (min-width: 768px) { + .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { + float: left; + } + .col-sm-12 { + width: 100%; + } + .col-sm-11 { + width: 91.66666667%; + } + .col-sm-10 { + width: 83.33333333%; + } + .col-sm-9 { + width: 75%; + } + .col-sm-8 { + width: 66.66666667%; + } + .col-sm-7 { + width: 58.33333333%; + } + .col-sm-6 { + width: 50%; + } + .col-sm-5 { + width: 41.66666667%; + } + .col-sm-4 { + width: 33.33333333%; + } + .col-sm-3 { + width: 25%; + } + .col-sm-2 { + width: 16.66666667%; + } + .col-sm-1 { + width: 8.33333333%; + } + .col-sm-pull-12 { + right: 100%; + } + .col-sm-pull-11 { + right: 91.66666667%; + } + .col-sm-pull-10 { + right: 83.33333333%; + } + .col-sm-pull-9 { + right: 75%; + } + .col-sm-pull-8 { + right: 66.66666667%; + } + .col-sm-pull-7 { + right: 58.33333333%; + } + .col-sm-pull-6 { + right: 50%; + } + .col-sm-pull-5 { + right: 41.66666667%; + } + .col-sm-pull-4 { + right: 33.33333333%; + } + .col-sm-pull-3 { + right: 25%; + } + .col-sm-pull-2 { + right: 16.66666667%; + } + .col-sm-pull-1 { + right: 8.33333333%; + } + .col-sm-pull-0 { + right: auto; + } + .col-sm-push-12 { + left: 100%; + } + .col-sm-push-11 { + left: 91.66666667%; + } + .col-sm-push-10 { + left: 83.33333333%; + } + .col-sm-push-9 { + left: 75%; + } + .col-sm-push-8 { + left: 66.66666667%; + } + .col-sm-push-7 { + left: 58.33333333%; + } + .col-sm-push-6 { + left: 50%; + } + .col-sm-push-5 { + left: 41.66666667%; + } + .col-sm-push-4 { + left: 33.33333333%; + } + .col-sm-push-3 { + left: 25%; + } + .col-sm-push-2 { + left: 16.66666667%; + } + .col-sm-push-1 { + left: 8.33333333%; + } + .col-sm-push-0 { + left: auto; + } + .col-sm-offset-12 { + margin-left: 100%; + } + .col-sm-offset-11 { + margin-left: 91.66666667%; + } + .col-sm-offset-10 { + margin-left: 83.33333333%; + } + .col-sm-offset-9 { + margin-left: 75%; + } + .col-sm-offset-8 { + margin-left: 66.66666667%; + } + .col-sm-offset-7 { + margin-left: 58.33333333%; + } + .col-sm-offset-6 { + margin-left: 50%; + } + .col-sm-offset-5 { + margin-left: 41.66666667%; + } + .col-sm-offset-4 { + margin-left: 33.33333333%; + } + .col-sm-offset-3 { + margin-left: 25%; + } + .col-sm-offset-2 { + margin-left: 16.66666667%; + } + .col-sm-offset-1 { + margin-left: 8.33333333%; + } + .col-sm-offset-0 { + margin-left: 0; + } +} +@media (min-width: 992px) { + .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { + float: left; + } + .col-md-12 { + width: 100%; + } + .col-md-11 { + width: 91.66666667%; + } + .col-md-10 { + width: 83.33333333%; + } + .col-md-9 { + width: 75%; + } + .col-md-8 { + width: 66.66666667%; + } + .col-md-7 { + width: 58.33333333%; + } + .col-md-6 { + width: 50%; + } + .col-md-5 { + width: 41.66666667%; + } + .col-md-4 { + width: 33.33333333%; + } + .col-md-3 { + width: 25%; + } + .col-md-2 { + width: 16.66666667%; + } + .col-md-1 { + width: 8.33333333%; + } + .col-md-pull-12 { + right: 100%; + } + .col-md-pull-11 { + right: 91.66666667%; + } + .col-md-pull-10 { + right: 83.33333333%; + } + .col-md-pull-9 { + right: 75%; + } + .col-md-pull-8 { + right: 66.66666667%; + } + .col-md-pull-7 { + right: 58.33333333%; + } + .col-md-pull-6 { + right: 50%; + } + .col-md-pull-5 { + right: 41.66666667%; + } + .col-md-pull-4 { + right: 33.33333333%; + } + .col-md-pull-3 { + right: 25%; + } + .col-md-pull-2 { + right: 16.66666667%; + } + .col-md-pull-1 { + right: 8.33333333%; + } + .col-md-pull-0 { + right: auto; + } + .col-md-push-12 { + left: 100%; + } + .col-md-push-11 { + left: 91.66666667%; + } + .col-md-push-10 { + left: 83.33333333%; + } + .col-md-push-9 { + left: 75%; + } + .col-md-push-8 { + left: 66.66666667%; + } + .col-md-push-7 { + left: 58.33333333%; + } + .col-md-push-6 { + left: 50%; + } + .col-md-push-5 { + left: 41.66666667%; + } + .col-md-push-4 { + left: 33.33333333%; + } + .col-md-push-3 { + left: 25%; + } + .col-md-push-2 { + left: 16.66666667%; + } + .col-md-push-1 { + left: 8.33333333%; + } + .col-md-push-0 { + left: auto; + } + .col-md-offset-12 { + margin-left: 100%; + } + .col-md-offset-11 { + margin-left: 91.66666667%; + } + .col-md-offset-10 { + margin-left: 83.33333333%; + } + .col-md-offset-9 { + margin-left: 75%; + } + .col-md-offset-8 { + margin-left: 66.66666667%; + } + .col-md-offset-7 { + margin-left: 58.33333333%; + } + .col-md-offset-6 { + margin-left: 50%; + } + .col-md-offset-5 { + margin-left: 41.66666667%; + } + .col-md-offset-4 { + margin-left: 33.33333333%; + } + .col-md-offset-3 { + margin-left: 25%; + } + .col-md-offset-2 { + margin-left: 16.66666667%; + } + .col-md-offset-1 { + margin-left: 8.33333333%; + } + .col-md-offset-0 { + margin-left: 0; + } +} +@media (min-width: 1200px) { + .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { + float: left; + } + .col-lg-12 { + width: 100%; + } + .col-lg-11 { + width: 91.66666667%; + } + .col-lg-10 { + width: 83.33333333%; + } + .col-lg-9 { + width: 75%; + } + .col-lg-8 { + width: 66.66666667%; + } + .col-lg-7 { + width: 58.33333333%; + } + .col-lg-6 { + width: 50%; + } + .col-lg-5 { + width: 41.66666667%; + } + .col-lg-4 { + width: 33.33333333%; + } + .col-lg-3 { + width: 25%; + } + .col-lg-2 { + width: 16.66666667%; + } + .col-lg-1 { + width: 8.33333333%; + } + .col-lg-pull-12 { + right: 100%; + } + .col-lg-pull-11 { + right: 91.66666667%; + } + .col-lg-pull-10 { + right: 83.33333333%; + } + .col-lg-pull-9 { + right: 75%; + } + .col-lg-pull-8 { + right: 66.66666667%; + } + .col-lg-pull-7 { + right: 58.33333333%; + } + .col-lg-pull-6 { + right: 50%; + } + .col-lg-pull-5 { + right: 41.66666667%; + } + .col-lg-pull-4 { + right: 33.33333333%; + } + .col-lg-pull-3 { + right: 25%; + } + .col-lg-pull-2 { + right: 16.66666667%; + } + .col-lg-pull-1 { + right: 8.33333333%; + } + .col-lg-pull-0 { + right: auto; + } + .col-lg-push-12 { + left: 100%; + } + .col-lg-push-11 { + left: 91.66666667%; + } + .col-lg-push-10 { + left: 83.33333333%; + } + .col-lg-push-9 { + left: 75%; + } + .col-lg-push-8 { + left: 66.66666667%; + } + .col-lg-push-7 { + left: 58.33333333%; + } + .col-lg-push-6 { + left: 50%; + } + .col-lg-push-5 { + left: 41.66666667%; + } + .col-lg-push-4 { + left: 33.33333333%; + } + .col-lg-push-3 { + left: 25%; + } + .col-lg-push-2 { + left: 16.66666667%; + } + .col-lg-push-1 { + left: 8.33333333%; + } + .col-lg-push-0 { + left: auto; + } + .col-lg-offset-12 { + margin-left: 100%; + } + .col-lg-offset-11 { + margin-left: 91.66666667%; + } + .col-lg-offset-10 { + margin-left: 83.33333333%; + } + .col-lg-offset-9 { + margin-left: 75%; + } + .col-lg-offset-8 { + margin-left: 66.66666667%; + } + .col-lg-offset-7 { + margin-left: 58.33333333%; + } + .col-lg-offset-6 { + margin-left: 50%; + } + .col-lg-offset-5 { + margin-left: 41.66666667%; + } + .col-lg-offset-4 { + margin-left: 33.33333333%; + } + .col-lg-offset-3 { + margin-left: 25%; + } + .col-lg-offset-2 { + margin-left: 16.66666667%; + } + .col-lg-offset-1 { + margin-left: 8.33333333%; + } + .col-lg-offset-0 { + margin-left: 0; + } +} +table { + background-color: transparent; +} +caption { + padding-top: 8px; + padding-bottom: 8px; + color: #777; + text-align: left; +} +th { + text-align: left; +} +.table { + width: 100%; + max-width: 100%; + margin-bottom: 20px; +} +.table > thead > tr > th, +.table > tbody > tr > th, +.table > tfoot > tr > th, +.table > thead > tr > td, +.table > tbody > tr > td, +.table > tfoot > tr > td { + padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border-top: 1px solid #ddd; +} +.table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #ddd; +} +.table > caption + thead > tr:first-child > th, +.table > colgroup + thead > tr:first-child > th, +.table > thead:first-child > tr:first-child > th, +.table > caption + thead > tr:first-child > td, +.table > colgroup + thead > tr:first-child > td, +.table > thead:first-child > tr:first-child > td { + border-top: 0; +} +.table > tbody + tbody { + border-top: 2px solid #ddd; +} +.table .table { + background-color: #fff; +} +.table-condensed > thead > tr > th, +.table-condensed > tbody > tr > th, +.table-condensed > tfoot > tr > th, +.table-condensed > thead > tr > td, +.table-condensed > tbody > tr > td, +.table-condensed > tfoot > tr > td { + padding: 5px; +} +.table-bordered { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > tbody > tr > th, +.table-bordered > tfoot > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > td { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; +} +.table-striped > tbody > tr:nth-of-type(odd) { + background-color: #f9f9f9; +} +.table-hover > tbody > tr:hover { + background-color: #f5f5f5; +} +table col[class*="col-"] { + position: static; + display: table-column; + float: none; +} +table td[class*="col-"], +table th[class*="col-"] { + position: static; + display: table-cell; + float: none; +} +.table > thead > tr > td.active, +.table > tbody > tr > td.active, +.table > tfoot > tr > td.active, +.table > thead > tr > th.active, +.table > tbody > tr > th.active, +.table > tfoot > tr > th.active, +.table > thead > tr.active > td, +.table > tbody > tr.active > td, +.table > tfoot > tr.active > td, +.table > thead > tr.active > th, +.table > tbody > tr.active > th, +.table > tfoot > tr.active > th { + background-color: #f5f5f5; +} +.table-hover > tbody > tr > td.active:hover, +.table-hover > tbody > tr > th.active:hover, +.table-hover > tbody > tr.active:hover > td, +.table-hover > tbody > tr:hover > .active, +.table-hover > tbody > tr.active:hover > th { + background-color: #e8e8e8; +} +.table > thead > tr > td.success, +.table > tbody > tr > td.success, +.table > tfoot > tr > td.success, +.table > thead > tr > th.success, +.table > tbody > tr > th.success, +.table > tfoot > tr > th.success, +.table > thead > tr.success > td, +.table > tbody > tr.success > td, +.table > tfoot > tr.success > td, +.table > thead > tr.success > th, +.table > tbody > tr.success > th, +.table > tfoot > tr.success > th { + background-color: #dff0d8; +} +.table-hover > tbody > tr > td.success:hover, +.table-hover > tbody > tr > th.success:hover, +.table-hover > tbody > tr.success:hover > td, +.table-hover > tbody > tr:hover > .success, +.table-hover > tbody > tr.success:hover > th { + background-color: #d0e9c6; +} +.table > thead > tr > td.info, +.table > tbody > tr > td.info, +.table > tfoot > tr > td.info, +.table > thead > tr > th.info, +.table > tbody > tr > th.info, +.table > tfoot > tr > th.info, +.table > thead > tr.info > td, +.table > tbody > tr.info > td, +.table > tfoot > tr.info > td, +.table > thead > tr.info > th, +.table > tbody > tr.info > th, +.table > tfoot > tr.info > th { + background-color: #d9edf7; +} +.table-hover > tbody > tr > td.info:hover, +.table-hover > tbody > tr > th.info:hover, +.table-hover > tbody > tr.info:hover > td, +.table-hover > tbody > tr:hover > .info, +.table-hover > tbody > tr.info:hover > th { + background-color: #c4e3f3; +} +.table > thead > tr > td.warning, +.table > tbody > tr > td.warning, +.table > tfoot > tr > td.warning, +.table > thead > tr > th.warning, +.table > tbody > tr > th.warning, +.table > tfoot > tr > th.warning, +.table > thead > tr.warning > td, +.table > tbody > tr.warning > td, +.table > tfoot > tr.warning > td, +.table > thead > tr.warning > th, +.table > tbody > tr.warning > th, +.table > tfoot > tr.warning > th { + background-color: #fcf8e3; +} +.table-hover > tbody > tr > td.warning:hover, +.table-hover > tbody > tr > th.warning:hover, +.table-hover > tbody > tr.warning:hover > td, +.table-hover > tbody > tr:hover > .warning, +.table-hover > tbody > tr.warning:hover > th { + background-color: #faf2cc; +} +.table > thead > tr > td.danger, +.table > tbody > tr > td.danger, +.table > tfoot > tr > td.danger, +.table > thead > tr > th.danger, +.table > tbody > tr > th.danger, +.table > tfoot > tr > th.danger, +.table > thead > tr.danger > td, +.table > tbody > tr.danger > td, +.table > tfoot > tr.danger > td, +.table > thead > tr.danger > th, +.table > tbody > tr.danger > th, +.table > tfoot > tr.danger > th { + background-color: #f2dede; +} +.table-hover > tbody > tr > td.danger:hover, +.table-hover > tbody > tr > th.danger:hover, +.table-hover > tbody > tr.danger:hover > td, +.table-hover > tbody > tr:hover > .danger, +.table-hover > tbody > tr.danger:hover > th { + background-color: #ebcccc; +} +.table-responsive { + min-height: .01%; + overflow-x: auto; +} +@media screen and (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 15px; + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #ddd; + } + .table-responsive > .table { + margin-bottom: 0; + } + .table-responsive > .table > thead > tr > th, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tfoot > tr > th, + .table-responsive > .table > thead > tr > td, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > td { + white-space: nowrap; + } + .table-responsive > .table-bordered { + border: 0; + } + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; + } + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; + } + .table-responsive > .table-bordered > tbody > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; + } +} +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: #333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} +label { + display: inline-block; + max-width: 100%; + margin-bottom: 5px; + font-weight: bold; +} +input[type="search"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + line-height: normal; +} +input[type="file"] { + display: block; +} +input[type="range"] { + display: block; + width: 100%; +} +select[multiple], +select[size] { + height: auto; +} +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +output { + display: block; + padding-top: 7px; + font-size: 14px; + line-height: 1.42857143; + color: #555; +} +.form-control { + display: block; + width: 100%; + height: 34px; + padding: 6px 12px; + font-size: 14px; + line-height: 1.42857143; + color: #555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; + -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; +} +.form-control:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); +} +.form-control::-moz-placeholder { + color: #999; + opacity: 1; +} +.form-control:-ms-input-placeholder { + color: #999; +} +.form-control::-webkit-input-placeholder { + color: #999; +} +.form-control::-ms-expand { + background-color: transparent; + border: 0; +} +.form-control[disabled], +.form-control[readonly], +fieldset[disabled] .form-control { + background-color: #eee; + opacity: 1; +} +.form-control[disabled], +fieldset[disabled] .form-control { + cursor: not-allowed; +} +textarea.form-control { + height: auto; +} +input[type="search"] { + -webkit-appearance: none; +} +@media screen and (-webkit-min-device-pixel-ratio: 0) { + input[type="date"].form-control, + input[type="time"].form-control, + input[type="datetime-local"].form-control, + input[type="month"].form-control { + line-height: 34px; + } + input[type="date"].input-sm, + input[type="time"].input-sm, + input[type="datetime-local"].input-sm, + input[type="month"].input-sm, + .input-group-sm input[type="date"], + .input-group-sm input[type="time"], + .input-group-sm input[type="datetime-local"], + .input-group-sm input[type="month"] { + line-height: 30px; + } + input[type="date"].input-lg, + input[type="time"].input-lg, + input[type="datetime-local"].input-lg, + input[type="month"].input-lg, + .input-group-lg input[type="date"], + .input-group-lg input[type="time"], + .input-group-lg input[type="datetime-local"], + .input-group-lg input[type="month"] { + line-height: 46px; + } +} +.form-group { + margin-bottom: 15px; +} +.radio, +.checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; +} +.radio label, +.checkbox label { + min-height: 20px; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; +} +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + position: absolute; + margin-top: 4px \9; + margin-left: -20px; +} +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; +} +.radio-inline, +.checkbox-inline { + position: relative; + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + vertical-align: middle; + cursor: pointer; +} +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; +} +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"].disabled, +input[type="checkbox"].disabled, +fieldset[disabled] input[type="radio"], +fieldset[disabled] input[type="checkbox"] { + cursor: not-allowed; +} +.radio-inline.disabled, +.checkbox-inline.disabled, +fieldset[disabled] .radio-inline, +fieldset[disabled] .checkbox-inline { + cursor: not-allowed; +} +.radio.disabled label, +.checkbox.disabled label, +fieldset[disabled] .radio label, +fieldset[disabled] .checkbox label { + cursor: not-allowed; +} +.form-control-static { + min-height: 34px; + padding-top: 7px; + padding-bottom: 7px; + margin-bottom: 0; +} +.form-control-static.input-lg, +.form-control-static.input-sm { + padding-right: 0; + padding-left: 0; +} +.input-sm { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-sm { + height: 30px; + line-height: 30px; +} +textarea.input-sm, +select[multiple].input-sm { + height: auto; +} +.form-group-sm .form-control { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.form-group-sm select.form-control { + height: 30px; + line-height: 30px; +} +.form-group-sm textarea.form-control, +.form-group-sm select[multiple].form-control { + height: auto; +} +.form-group-sm .form-control-static { + height: 30px; + min-height: 32px; + padding: 6px 10px; + font-size: 12px; + line-height: 1.5; +} +.input-lg { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-lg { + height: 46px; + line-height: 46px; +} +textarea.input-lg, +select[multiple].input-lg { + height: auto; +} +.form-group-lg .form-control { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +.form-group-lg select.form-control { + height: 46px; + line-height: 46px; +} +.form-group-lg textarea.form-control, +.form-group-lg select[multiple].form-control { + height: auto; +} +.form-group-lg .form-control-static { + height: 46px; + min-height: 38px; + padding: 11px 16px; + font-size: 18px; + line-height: 1.3333333; +} +.has-feedback { + position: relative; +} +.has-feedback .form-control { + padding-right: 42.5px; +} +.form-control-feedback { + position: absolute; + top: 0; + right: 0; + z-index: 2; + display: block; + width: 34px; + height: 34px; + line-height: 34px; + text-align: center; + pointer-events: none; +} +.input-lg + .form-control-feedback, +.input-group-lg + .form-control-feedback, +.form-group-lg .form-control + .form-control-feedback { + width: 46px; + height: 46px; + line-height: 46px; +} +.input-sm + .form-control-feedback, +.input-group-sm + .form-control-feedback, +.form-group-sm .form-control + .form-control-feedback { + width: 30px; + height: 30px; + line-height: 30px; +} +.has-success .help-block, +.has-success .control-label, +.has-success .radio, +.has-success .checkbox, +.has-success .radio-inline, +.has-success .checkbox-inline, +.has-success.radio label, +.has-success.checkbox label, +.has-success.radio-inline label, +.has-success.checkbox-inline label { + color: #3c763d; +} +.has-success .form-control { + border-color: #3c763d; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-success .form-control:focus { + border-color: #2b542c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; +} +.has-success .input-group-addon { + color: #3c763d; + background-color: #dff0d8; + border-color: #3c763d; +} +.has-success .form-control-feedback { + color: #3c763d; +} +.has-warning .help-block, +.has-warning .control-label, +.has-warning .radio, +.has-warning .checkbox, +.has-warning .radio-inline, +.has-warning .checkbox-inline, +.has-warning.radio label, +.has-warning.checkbox label, +.has-warning.radio-inline label, +.has-warning.checkbox-inline label { + color: #8a6d3b; +} +.has-warning .form-control { + border-color: #8a6d3b; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-warning .form-control:focus { + border-color: #66512c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; +} +.has-warning .input-group-addon { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #8a6d3b; +} +.has-warning .form-control-feedback { + color: #8a6d3b; +} +.has-error .help-block, +.has-error .control-label, +.has-error .radio, +.has-error .checkbox, +.has-error .radio-inline, +.has-error .checkbox-inline, +.has-error.radio label, +.has-error.checkbox label, +.has-error.radio-inline label, +.has-error.checkbox-inline label { + color: #a94442; +} +.has-error .form-control { + border-color: #a94442; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-error .form-control:focus { + border-color: #843534; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; +} +.has-error .input-group-addon { + color: #a94442; + background-color: #f2dede; + border-color: #a94442; +} +.has-error .form-control-feedback { + color: #a94442; +} +.has-feedback label ~ .form-control-feedback { + top: 25px; +} +.has-feedback label.sr-only ~ .form-control-feedback { + top: 0; +} +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #737373; +} +@media (min-width: 768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .form-inline .form-control-static { + display: inline-block; + } + .form-inline .input-group { + display: inline-table; + vertical-align: middle; + } + .form-inline .input-group .input-group-addon, + .form-inline .input-group .input-group-btn, + .form-inline .input-group .form-control { + width: auto; + } + .form-inline .input-group > .form-control { + width: 100%; + } + .form-inline .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio, + .form-inline .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio label, + .form-inline .checkbox label { + padding-left: 0; + } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .form-inline .has-feedback .form-control-feedback { + top: 0; + } +} +.form-horizontal .radio, +.form-horizontal .checkbox, +.form-horizontal .radio-inline, +.form-horizontal .checkbox-inline { + padding-top: 7px; + margin-top: 0; + margin-bottom: 0; +} +.form-horizontal .radio, +.form-horizontal .checkbox { + min-height: 27px; +} +.form-horizontal .form-group { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .form-horizontal .control-label { + padding-top: 7px; + margin-bottom: 0; + text-align: right; + } +} +.form-horizontal .has-feedback .form-control-feedback { + right: 15px; +} +@media (min-width: 768px) { + .form-horizontal .form-group-lg .control-label { + padding-top: 11px; + font-size: 18px; + } +} +@media (min-width: 768px) { + .form-horizontal .form-group-sm .control-label { + padding-top: 6px; + font-size: 12px; + } +} +.btn { + display: inline-block; + padding: 6px 12px; + margin-bottom: 0; + font-size: 14px; + font-weight: normal; + line-height: 1.42857143; + text-align: center; + white-space: nowrap; + vertical-align: middle; + -ms-touch-action: manipulation; + touch-action: manipulation; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.btn:focus, +.btn:active:focus, +.btn.active:focus, +.btn.focus, +.btn:active.focus, +.btn.active.focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.btn:hover, +.btn:focus, +.btn.focus { + color: #333; + text-decoration: none; +} +.btn:active, +.btn.active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn.disabled, +.btn[disabled], +fieldset[disabled] .btn { + cursor: not-allowed; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; + opacity: .65; +} +a.btn.disabled, +fieldset[disabled] a.btn { + pointer-events: none; +} +.btn-default { + color: #333; + background-color: #fff; + border-color: #ccc; +} +.btn-default:focus, +.btn-default.focus { + color: #333; + background-color: #e6e6e6; + border-color: #8c8c8c; +} +.btn-default:hover { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; +} +.btn-default:active:hover, +.btn-default.active:hover, +.open > .dropdown-toggle.btn-default:hover, +.btn-default:active:focus, +.btn-default.active:focus, +.open > .dropdown-toggle.btn-default:focus, +.btn-default:active.focus, +.btn-default.active.focus, +.open > .dropdown-toggle.btn-default.focus { + color: #333; + background-color: #d4d4d4; + border-color: #8c8c8c; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + background-image: none; +} +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled.focus, +.btn-default[disabled].focus, +fieldset[disabled] .btn-default.focus { + background-color: #fff; + border-color: #ccc; +} +.btn-default .badge { + color: #fff; + background-color: #333; +} +.btn-primary { + color: #fff; + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary:focus, +.btn-primary.focus { + color: #fff; + background-color: #286090; + border-color: #122b40; +} +.btn-primary:hover { + color: #fff; + background-color: #286090; + border-color: #204d74; +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + color: #fff; + background-color: #286090; + border-color: #204d74; +} +.btn-primary:active:hover, +.btn-primary.active:hover, +.open > .dropdown-toggle.btn-primary:hover, +.btn-primary:active:focus, +.btn-primary.active:focus, +.open > .dropdown-toggle.btn-primary:focus, +.btn-primary:active.focus, +.btn-primary.active.focus, +.open > .dropdown-toggle.btn-primary.focus { + color: #fff; + background-color: #204d74; + border-color: #122b40; +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + background-image: none; +} +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled.focus, +.btn-primary[disabled].focus, +fieldset[disabled] .btn-primary.focus { + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary .badge { + color: #337ab7; + background-color: #fff; +} +.btn-success { + color: #fff; + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success:focus, +.btn-success.focus { + color: #fff; + background-color: #449d44; + border-color: #255625; +} +.btn-success:hover { + color: #fff; + background-color: #449d44; + border-color: #398439; +} +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + color: #fff; + background-color: #449d44; + border-color: #398439; +} +.btn-success:active:hover, +.btn-success.active:hover, +.open > .dropdown-toggle.btn-success:hover, +.btn-success:active:focus, +.btn-success.active:focus, +.open > .dropdown-toggle.btn-success:focus, +.btn-success:active.focus, +.btn-success.active.focus, +.open > .dropdown-toggle.btn-success.focus { + color: #fff; + background-color: #398439; + border-color: #255625; +} +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + background-image: none; +} +.btn-success.disabled:hover, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success:hover, +.btn-success.disabled:focus, +.btn-success[disabled]:focus, +fieldset[disabled] .btn-success:focus, +.btn-success.disabled.focus, +.btn-success[disabled].focus, +fieldset[disabled] .btn-success.focus { + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success .badge { + color: #5cb85c; + background-color: #fff; +} +.btn-info { + color: #fff; + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info:focus, +.btn-info.focus { + color: #fff; + background-color: #31b0d5; + border-color: #1b6d85; +} +.btn-info:hover { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; +} +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; +} +.btn-info:active:hover, +.btn-info.active:hover, +.open > .dropdown-toggle.btn-info:hover, +.btn-info:active:focus, +.btn-info.active:focus, +.open > .dropdown-toggle.btn-info:focus, +.btn-info:active.focus, +.btn-info.active.focus, +.open > .dropdown-toggle.btn-info.focus { + color: #fff; + background-color: #269abc; + border-color: #1b6d85; +} +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + background-image: none; +} +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled.focus, +.btn-info[disabled].focus, +fieldset[disabled] .btn-info.focus { + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info .badge { + color: #5bc0de; + background-color: #fff; +} +.btn-warning { + color: #fff; + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning:focus, +.btn-warning.focus { + color: #fff; + background-color: #ec971f; + border-color: #985f0d; +} +.btn-warning:hover { + color: #fff; + background-color: #ec971f; + border-color: #d58512; +} +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + color: #fff; + background-color: #ec971f; + border-color: #d58512; +} +.btn-warning:active:hover, +.btn-warning.active:hover, +.open > .dropdown-toggle.btn-warning:hover, +.btn-warning:active:focus, +.btn-warning.active:focus, +.open > .dropdown-toggle.btn-warning:focus, +.btn-warning:active.focus, +.btn-warning.active.focus, +.open > .dropdown-toggle.btn-warning.focus { + color: #fff; + background-color: #d58512; + border-color: #985f0d; +} +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + background-image: none; +} +.btn-warning.disabled:hover, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning:hover, +.btn-warning.disabled:focus, +.btn-warning[disabled]:focus, +fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled.focus, +.btn-warning[disabled].focus, +fieldset[disabled] .btn-warning.focus { + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning .badge { + color: #f0ad4e; + background-color: #fff; +} +.btn-danger { + color: #fff; + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger:focus, +.btn-danger.focus { + color: #fff; + background-color: #c9302c; + border-color: #761c19; +} +.btn-danger:hover { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; +} +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; +} +.btn-danger:active:hover, +.btn-danger.active:hover, +.open > .dropdown-toggle.btn-danger:hover, +.btn-danger:active:focus, +.btn-danger.active:focus, +.open > .dropdown-toggle.btn-danger:focus, +.btn-danger:active.focus, +.btn-danger.active.focus, +.open > .dropdown-toggle.btn-danger.focus { + color: #fff; + background-color: #ac2925; + border-color: #761c19; +} +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + background-image: none; +} +.btn-danger.disabled:hover, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger:hover, +.btn-danger.disabled:focus, +.btn-danger[disabled]:focus, +fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled.focus, +.btn-danger[disabled].focus, +fieldset[disabled] .btn-danger.focus { + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger .badge { + color: #d9534f; + background-color: #fff; +} +.btn-link { + font-weight: normal; + color: #337ab7; + border-radius: 0; +} +.btn-link, +.btn-link:active, +.btn-link.active, +.btn-link[disabled], +fieldset[disabled] .btn-link { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-link, +.btn-link:hover, +.btn-link:focus, +.btn-link:active { + border-color: transparent; +} +.btn-link:hover, +.btn-link:focus { + color: #23527c; + text-decoration: underline; + background-color: transparent; +} +.btn-link[disabled]:hover, +fieldset[disabled] .btn-link:hover, +.btn-link[disabled]:focus, +fieldset[disabled] .btn-link:focus { + color: #777; + text-decoration: none; +} +.btn-lg, +.btn-group-lg > .btn { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +.btn-sm, +.btn-group-sm > .btn { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-xs, +.btn-group-xs > .btn { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-block { + display: block; + width: 100%; +} +.btn-block + .btn-block { + margin-top: 5px; +} +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} +.fade { + opacity: 0; + -webkit-transition: opacity .15s linear; + -o-transition: opacity .15s linear; + transition: opacity .15s linear; +} +.fade.in { + opacity: 1; +} +.collapse { + display: none; +} +.collapse.in { + display: block; +} +tr.collapse.in { + display: table-row; +} +tbody.collapse.in { + display: table-row-group; +} +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition-timing-function: ease; + -o-transition-timing-function: ease; + transition-timing-function: ease; + -webkit-transition-duration: .35s; + -o-transition-duration: .35s; + transition-duration: .35s; + -webkit-transition-property: height, visibility; + -o-transition-property: height, visibility; + transition-property: height, visibility; +} +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px dashed; + border-top: 4px solid \9; + border-right: 4px solid transparent; + border-left: 4px solid transparent; +} +.dropup, +.dropdown { + position: relative; +} +.dropdown-toggle:focus { + outline: 0; +} +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + font-size: 14px; + text-align: left; + list-style: none; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, .15); + border-radius: 4px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175); + box-shadow: 0 6px 12px rgba(0, 0, 0, .175); +} +.dropdown-menu.pull-right { + right: 0; + left: auto; +} +.dropdown-menu .divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.42857143; + color: #333; + white-space: nowrap; +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + color: #262626; + text-decoration: none; + background-color: #f5f5f5; +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #fff; + text-decoration: none; + background-color: #337ab7; + outline: 0; +} +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #777; +} +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + cursor: not-allowed; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.open > .dropdown-menu { + display: block; +} +.open > a { + outline: 0; +} +.dropdown-menu-right { + right: 0; + left: auto; +} +.dropdown-menu-left { + right: auto; + left: 0; +} +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.42857143; + color: #777; + white-space: nowrap; +} +.dropdown-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 990; +} +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + content: ""; + border-top: 0; + border-bottom: 4px dashed; + border-bottom: 4px solid \9; +} +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px; +} +@media (min-width: 768px) { + .navbar-right .dropdown-menu { + right: 0; + left: auto; + } + .navbar-right .dropdown-menu-left { + right: auto; + left: 0; + } +} +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + float: left; +} +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover, +.btn-group > .btn:focus, +.btn-group-vertical > .btn:focus, +.btn-group > .btn:active, +.btn-group-vertical > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn.active { + z-index: 2; +} +.btn-group .btn + .btn, +.btn-group .btn + .btn-group, +.btn-group .btn-group + .btn, +.btn-group .btn-group + .btn-group { + margin-left: -1px; +} +.btn-toolbar { + margin-left: -5px; +} +.btn-toolbar .btn, +.btn-toolbar .btn-group, +.btn-toolbar .input-group { + float: left; +} +.btn-toolbar > .btn, +.btn-toolbar > .btn-group, +.btn-toolbar > .input-group { + margin-left: 5px; +} +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; +} +.btn-group > .btn:first-child { + margin-left: 0; +} +.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group > .btn-group { + float: left; +} +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} +.btn-group > .btn + .dropdown-toggle { + padding-right: 8px; + padding-left: 8px; +} +.btn-group > .btn-lg + .dropdown-toggle { + padding-right: 12px; + padding-left: 12px; +} +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn-group.open .dropdown-toggle.btn-link { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn .caret { + margin-left: 0; +} +.btn-lg .caret { + border-width: 5px 5px 0; + border-bottom-width: 0; +} +.dropup .btn-lg .caret { + border-width: 0 5px 5px; +} +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group, +.btn-group-vertical > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; +} +.btn-group-vertical > .btn-group > .btn { + float: none; +} +.btn-group-vertical > .btn + .btn, +.btn-group-vertical > .btn + .btn-group, +.btn-group-vertical > .btn-group + .btn, +.btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; +} +.btn-group-vertical > .btn:not(:first-child):not(:last-child) { + border-radius: 0; +} +.btn-group-vertical > .btn:first-child:not(:last-child) { + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn:last-child:not(:first-child) { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; +} +.btn-group-justified > .btn, +.btn-group-justified > .btn-group { + display: table-cell; + float: none; + width: 1%; +} +.btn-group-justified > .btn-group .btn { + width: 100%; +} +.btn-group-justified > .btn-group .dropdown-menu { + left: auto; +} +[data-toggle="buttons"] > .btn input[type="radio"], +[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], +[data-toggle="buttons"] > .btn input[type="checkbox"], +[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} +.input-group { + position: relative; + display: table; + border-collapse: separate; +} +.input-group[class*="col-"] { + float: none; + padding-right: 0; + padding-left: 0; +} +.input-group .form-control { + position: relative; + z-index: 2; + float: left; + width: 100%; + margin-bottom: 0; +} +.input-group .form-control:focus { + z-index: 3; +} +.input-group-lg > .form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .btn { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-group-lg > .form-control, +select.input-group-lg > .input-group-addon, +select.input-group-lg > .input-group-btn > .btn { + height: 46px; + line-height: 46px; +} +textarea.input-group-lg > .form-control, +textarea.input-group-lg > .input-group-addon, +textarea.input-group-lg > .input-group-btn > .btn, +select[multiple].input-group-lg > .form-control, +select[multiple].input-group-lg > .input-group-addon, +select[multiple].input-group-lg > .input-group-btn > .btn { + height: auto; +} +.input-group-sm > .form-control, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .btn { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-group-sm > .form-control, +select.input-group-sm > .input-group-addon, +select.input-group-sm > .input-group-btn > .btn { + height: 30px; + line-height: 30px; +} +textarea.input-group-sm > .form-control, +textarea.input-group-sm > .input-group-addon, +textarea.input-group-sm > .input-group-btn > .btn, +select[multiple].input-group-sm > .form-control, +select[multiple].input-group-sm > .input-group-addon, +select[multiple].input-group-sm > .input-group-btn > .btn { + height: auto; +} +.input-group-addon, +.input-group-btn, +.input-group .form-control { + display: table-cell; +} +.input-group-addon:not(:first-child):not(:last-child), +.input-group-btn:not(:first-child):not(:last-child), +.input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0; +} +.input-group-addon, +.input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; +} +.input-group-addon { + padding: 6px 12px; + font-size: 14px; + font-weight: normal; + line-height: 1; + color: #555; + text-align: center; + background-color: #eee; + border: 1px solid #ccc; + border-radius: 4px; +} +.input-group-addon.input-sm { + padding: 5px 10px; + font-size: 12px; + border-radius: 3px; +} +.input-group-addon.input-lg { + padding: 10px 16px; + font-size: 18px; + border-radius: 6px; +} +.input-group-addon input[type="radio"], +.input-group-addon input[type="checkbox"] { + margin-top: 0; +} +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group > .btn, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group-addon:first-child { + border-right: 0; +} +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group > .btn, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child), +.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.input-group-addon:last-child { + border-left: 0; +} +.input-group-btn { + position: relative; + font-size: 0; + white-space: nowrap; +} +.input-group-btn > .btn { + position: relative; +} +.input-group-btn > .btn + .btn { + margin-left: -1px; +} +.input-group-btn > .btn:hover, +.input-group-btn > .btn:focus, +.input-group-btn > .btn:active { + z-index: 2; +} +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group { + margin-right: -1px; +} +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group { + z-index: 2; + margin-left: -1px; +} +.nav { + padding-left: 0; + margin-bottom: 0; + list-style: none; +} +.nav > li { + position: relative; + display: block; +} +.nav > li > a { + position: relative; + display: block; + padding: 10px 15px; +} +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; + background-color: #eee; +} +.nav > li.disabled > a { + color: #777; +} +.nav > li.disabled > a:hover, +.nav > li.disabled > a:focus { + color: #777; + text-decoration: none; + cursor: not-allowed; + background-color: transparent; +} +.nav .open > a, +.nav .open > a:hover, +.nav .open > a:focus { + background-color: #eee; + border-color: #337ab7; +} +.nav .nav-divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.nav > li > a > img { + max-width: none; +} +.nav-tabs { + border-bottom: 1px solid #ddd; +} +.nav-tabs > li { + float: left; + margin-bottom: -1px; +} +.nav-tabs > li > a { + margin-right: 2px; + line-height: 1.42857143; + border: 1px solid transparent; + border-radius: 4px 4px 0 0; +} +.nav-tabs > li > a:hover { + border-color: #eee #eee #ddd; +} +.nav-tabs > li.active > a, +.nav-tabs > li.active > a:hover, +.nav-tabs > li.active > a:focus { + color: #555; + cursor: default; + background-color: #fff; + border: 1px solid #ddd; + border-bottom-color: transparent; +} +.nav-tabs.nav-justified { + width: 100%; + border-bottom: 0; +} +.nav-tabs.nav-justified > li { + float: none; +} +.nav-tabs.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} +.nav-tabs.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-tabs.nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs.nav-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs.nav-justified > .active > a, +.nav-tabs.nav-justified > .active > a:hover, +.nav-tabs.nav-justified > .active > a:focus { + border: 1px solid #ddd; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs.nav-justified > .active > a, + .nav-tabs.nav-justified > .active > a:hover, + .nav-tabs.nav-justified > .active > a:focus { + border-bottom-color: #fff; + } +} +.nav-pills > li { + float: left; +} +.nav-pills > li > a { + border-radius: 4px; +} +.nav-pills > li + li { + margin-left: 2px; +} +.nav-pills > li.active > a, +.nav-pills > li.active > a:hover, +.nav-pills > li.active > a:focus { + color: #fff; + background-color: #337ab7; +} +.nav-stacked > li { + float: none; +} +.nav-stacked > li + li { + margin-top: 2px; + margin-left: 0; +} +.nav-justified { + width: 100%; +} +.nav-justified > li { + float: none; +} +.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} +.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs-justified { + border-bottom: 0; +} +.nav-tabs-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs-justified > .active > a, +.nav-tabs-justified > .active > a:hover, +.nav-tabs-justified > .active > a:focus { + border: 1px solid #ddd; +} +@media (min-width: 768px) { + .nav-tabs-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus { + border-bottom-color: #fff; + } +} +.tab-content > .tab-pane { + display: none; +} +.tab-content > .active { + display: block; +} +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.navbar { + position: relative; + min-height: 50px; + margin-bottom: 20px; + border: 1px solid transparent; +} +@media (min-width: 768px) { + .navbar { + border-radius: 4px; + } +} +@media (min-width: 768px) { + .navbar-header { + float: left; + } +} +.navbar-collapse { + padding-right: 15px; + padding-left: 15px; + overflow-x: visible; + -webkit-overflow-scrolling: touch; + border-top: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); +} +.navbar-collapse.in { + overflow-y: auto; +} +@media (min-width: 768px) { + .navbar-collapse { + width: auto; + border-top: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-collapse.collapse { + display: block !important; + height: auto !important; + padding-bottom: 0; + overflow: visible !important; + } + .navbar-collapse.in { + overflow-y: visible; + } + .navbar-fixed-top .navbar-collapse, + .navbar-static-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + padding-right: 0; + padding-left: 0; + } +} +.navbar-fixed-top .navbar-collapse, +.navbar-fixed-bottom .navbar-collapse { + max-height: 340px; +} +@media (max-device-width: 480px) and (orientation: landscape) { + .navbar-fixed-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + max-height: 200px; + } +} +.container > .navbar-header, +.container-fluid > .navbar-header, +.container > .navbar-collapse, +.container-fluid > .navbar-collapse { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .container > .navbar-header, + .container-fluid > .navbar-header, + .container > .navbar-collapse, + .container-fluid > .navbar-collapse { + margin-right: 0; + margin-left: 0; + } +} +.navbar-static-top { + z-index: 1000; + border-width: 0 0 1px; +} +@media (min-width: 768px) { + .navbar-static-top { + border-radius: 0; + } +} +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; +} +@media (min-width: 768px) { + .navbar-fixed-top, + .navbar-fixed-bottom { + border-radius: 0; + } +} +.navbar-fixed-top { + top: 0; + border-width: 0 0 1px; +} +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; + border-width: 1px 0 0; +} +.navbar-brand { + float: left; + height: 50px; + padding: 15px 15px; + font-size: 18px; + line-height: 20px; +} +.navbar-brand:hover, +.navbar-brand:focus { + text-decoration: none; +} +.navbar-brand > img { + display: block; +} +@media (min-width: 768px) { + .navbar > .container .navbar-brand, + .navbar > .container-fluid .navbar-brand { + margin-left: -15px; + } +} +.navbar-toggle { + position: relative; + float: right; + padding: 9px 10px; + margin-top: 8px; + margin-right: 15px; + margin-bottom: 8px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.navbar-toggle:focus { + outline: 0; +} +.navbar-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px; +} +.navbar-toggle .icon-bar + .icon-bar { + margin-top: 4px; +} +@media (min-width: 768px) { + .navbar-toggle { + display: none; + } +} +.navbar-nav { + margin: 7.5px -15px; +} +.navbar-nav > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 20px; +} +@media (max-width: 767px) { + .navbar-nav .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-nav .open .dropdown-menu > li > a, + .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 15px 5px 25px; + } + .navbar-nav .open .dropdown-menu > li > a { + line-height: 20px; + } + .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-nav .open .dropdown-menu > li > a:focus { + background-image: none; + } +} +@media (min-width: 768px) { + .navbar-nav { + float: left; + margin: 0; + } + .navbar-nav > li { + float: left; + } + .navbar-nav > li > a { + padding-top: 15px; + padding-bottom: 15px; + } +} +.navbar-form { + padding: 10px 15px; + margin-top: 8px; + margin-right: -15px; + margin-bottom: 8px; + margin-left: -15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); +} +@media (min-width: 768px) { + .navbar-form .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .navbar-form .form-control-static { + display: inline-block; + } + .navbar-form .input-group { + display: inline-table; + vertical-align: middle; + } + .navbar-form .input-group .input-group-addon, + .navbar-form .input-group .input-group-btn, + .navbar-form .input-group .form-control { + width: auto; + } + .navbar-form .input-group > .form-control { + width: 100%; + } + .navbar-form .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio, + .navbar-form .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio label, + .navbar-form .checkbox label { + padding-left: 0; + } + .navbar-form .radio input[type="radio"], + .navbar-form .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .navbar-form .has-feedback .form-control-feedback { + top: 0; + } +} +@media (max-width: 767px) { + .navbar-form .form-group { + margin-bottom: 5px; + } + .navbar-form .form-group:last-child { + margin-bottom: 0; + } +} +@media (min-width: 768px) { + .navbar-form { + width: auto; + padding-top: 0; + padding-bottom: 0; + margin-right: 0; + margin-left: 0; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } +} +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + margin-bottom: 0; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.navbar-btn { + margin-top: 8px; + margin-bottom: 8px; +} +.navbar-btn.btn-sm { + margin-top: 10px; + margin-bottom: 10px; +} +.navbar-btn.btn-xs { + margin-top: 14px; + margin-bottom: 14px; +} +.navbar-text { + margin-top: 15px; + margin-bottom: 15px; +} +@media (min-width: 768px) { + .navbar-text { + float: left; + margin-right: 15px; + margin-left: 15px; + } +} +@media (min-width: 768px) { + .navbar-left { + float: left !important; + } + .navbar-right { + float: right !important; + margin-right: -15px; + } + .navbar-right ~ .navbar-right { + margin-right: 0; + } +} +.navbar-default { + background-color: #f8f8f8; + border-color: #e7e7e7; +} +.navbar-default .navbar-brand { + color: #777; +} +.navbar-default .navbar-brand:hover, +.navbar-default .navbar-brand:focus { + color: #5e5e5e; + background-color: transparent; +} +.navbar-default .navbar-text { + color: #777; +} +.navbar-default .navbar-nav > li > a { + color: #777; +} +.navbar-default .navbar-nav > li > a:hover, +.navbar-default .navbar-nav > li > a:focus { + color: #333; + background-color: transparent; +} +.navbar-default .navbar-nav > .active > a, +.navbar-default .navbar-nav > .active > a:hover, +.navbar-default .navbar-nav > .active > a:focus { + color: #555; + background-color: #e7e7e7; +} +.navbar-default .navbar-nav > .disabled > a, +.navbar-default .navbar-nav > .disabled > a:hover, +.navbar-default .navbar-nav > .disabled > a:focus { + color: #ccc; + background-color: transparent; +} +.navbar-default .navbar-toggle { + border-color: #ddd; +} +.navbar-default .navbar-toggle:hover, +.navbar-default .navbar-toggle:focus { + background-color: #ddd; +} +.navbar-default .navbar-toggle .icon-bar { + background-color: #888; +} +.navbar-default .navbar-collapse, +.navbar-default .navbar-form { + border-color: #e7e7e7; +} +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .open > a:hover, +.navbar-default .navbar-nav > .open > a:focus { + color: #555; + background-color: #e7e7e7; +} +@media (max-width: 767px) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #777; + } + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #333; + background-color: transparent; + } + .navbar-default .navbar-nav .open .dropdown-menu > .active > a, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #555; + background-color: #e7e7e7; + } + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #ccc; + background-color: transparent; + } +} +.navbar-default .navbar-link { + color: #777; +} +.navbar-default .navbar-link:hover { + color: #333; +} +.navbar-default .btn-link { + color: #777; +} +.navbar-default .btn-link:hover, +.navbar-default .btn-link:focus { + color: #333; +} +.navbar-default .btn-link[disabled]:hover, +fieldset[disabled] .navbar-default .btn-link:hover, +.navbar-default .btn-link[disabled]:focus, +fieldset[disabled] .navbar-default .btn-link:focus { + color: #ccc; +} +.navbar-inverse { + background-color: #222; + border-color: #080808; +} +.navbar-inverse .navbar-brand { + color: #9d9d9d; +} +.navbar-inverse .navbar-brand:hover, +.navbar-inverse .navbar-brand:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-text { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a:hover, +.navbar-inverse .navbar-nav > li > a:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-nav > .active > a, +.navbar-inverse .navbar-nav > .active > a:hover, +.navbar-inverse .navbar-nav > .active > a:focus { + color: #fff; + background-color: #080808; +} +.navbar-inverse .navbar-nav > .disabled > a, +.navbar-inverse .navbar-nav > .disabled > a:hover, +.navbar-inverse .navbar-nav > .disabled > a:focus { + color: #444; + background-color: transparent; +} +.navbar-inverse .navbar-toggle { + border-color: #333; +} +.navbar-inverse .navbar-toggle:hover, +.navbar-inverse .navbar-toggle:focus { + background-color: #333; +} +.navbar-inverse .navbar-toggle .icon-bar { + background-color: #fff; +} +.navbar-inverse .navbar-collapse, +.navbar-inverse .navbar-form { + border-color: #101010; +} +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .open > a:hover, +.navbar-inverse .navbar-nav > .open > a:focus { + color: #fff; + background-color: #080808; +} +@media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #9d9d9d; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: #fff; + background-color: transparent; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #fff; + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #444; + background-color: transparent; + } +} +.navbar-inverse .navbar-link { + color: #9d9d9d; +} +.navbar-inverse .navbar-link:hover { + color: #fff; +} +.navbar-inverse .btn-link { + color: #9d9d9d; +} +.navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link:focus { + color: #fff; +} +.navbar-inverse .btn-link[disabled]:hover, +fieldset[disabled] .navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link[disabled]:focus, +fieldset[disabled] .navbar-inverse .btn-link:focus { + color: #444; +} +.breadcrumb { + padding: 8px 15px; + margin-bottom: 20px; + list-style: none; + background-color: #f5f5f5; + border-radius: 4px; +} +.breadcrumb > li { + display: inline-block; +} +.breadcrumb > li + li:before { + padding: 0 5px; + color: #ccc; + content: "/\00a0"; +} +.breadcrumb > .active { + color: #777; +} +.pagination { + display: inline-block; + padding-left: 0; + margin: 20px 0; + border-radius: 4px; +} +.pagination > li { + display: inline; +} +.pagination > li > a, +.pagination > li > span { + position: relative; + float: left; + padding: 6px 12px; + margin-left: -1px; + line-height: 1.42857143; + color: #337ab7; + text-decoration: none; + background-color: #fff; + border: 1px solid #ddd; +} +.pagination > li:first-child > a, +.pagination > li:first-child > span { + margin-left: 0; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; +} +.pagination > li:last-child > a, +.pagination > li:last-child > span { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +} +.pagination > li > a:hover, +.pagination > li > span:hover, +.pagination > li > a:focus, +.pagination > li > span:focus { + z-index: 2; + color: #23527c; + background-color: #eee; + border-color: #ddd; +} +.pagination > .active > a, +.pagination > .active > span, +.pagination > .active > a:hover, +.pagination > .active > span:hover, +.pagination > .active > a:focus, +.pagination > .active > span:focus { + z-index: 3; + color: #fff; + cursor: default; + background-color: #337ab7; + border-color: #337ab7; +} +.pagination > .disabled > span, +.pagination > .disabled > span:hover, +.pagination > .disabled > span:focus, +.pagination > .disabled > a, +.pagination > .disabled > a:hover, +.pagination > .disabled > a:focus { + color: #777; + cursor: not-allowed; + background-color: #fff; + border-color: #ddd; +} +.pagination-lg > li > a, +.pagination-lg > li > span { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; +} +.pagination-lg > li:first-child > a, +.pagination-lg > li:first-child > span { + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; +} +.pagination-lg > li:last-child > a, +.pagination-lg > li:last-child > span { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; +} +.pagination-sm > li > a, +.pagination-sm > li > span { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; +} +.pagination-sm > li:first-child > a, +.pagination-sm > li:first-child > span { + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; +} +.pagination-sm > li:last-child > a, +.pagination-sm > li:last-child > span { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} +.pager { + padding-left: 0; + margin: 20px 0; + text-align: center; + list-style: none; +} +.pager li { + display: inline; +} +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 15px; +} +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #eee; +} +.pager .next > a, +.pager .next > span { + float: right; +} +.pager .previous > a, +.pager .previous > span { + float: left; +} +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #777; + cursor: not-allowed; + background-color: #fff; +} +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; +} +a.label:hover, +a.label:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} +.label:empty { + display: none; +} +.btn .label { + position: relative; + top: -1px; +} +.label-default { + background-color: #777; +} +.label-default[href]:hover, +.label-default[href]:focus { + background-color: #5e5e5e; +} +.label-primary { + background-color: #337ab7; +} +.label-primary[href]:hover, +.label-primary[href]:focus { + background-color: #286090; +} +.label-success { + background-color: #5cb85c; +} +.label-success[href]:hover, +.label-success[href]:focus { + background-color: #449d44; +} +.label-info { + background-color: #5bc0de; +} +.label-info[href]:hover, +.label-info[href]:focus { + background-color: #31b0d5; +} +.label-warning { + background-color: #f0ad4e; +} +.label-warning[href]:hover, +.label-warning[href]:focus { + background-color: #ec971f; +} +.label-danger { + background-color: #d9534f; +} +.label-danger[href]:hover, +.label-danger[href]:focus { + background-color: #c9302c; +} +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: middle; + background-color: #777; + border-radius: 10px; +} +.badge:empty { + display: none; +} +.btn .badge { + position: relative; + top: -1px; +} +.btn-xs .badge, +.btn-group-xs > .btn .badge { + top: 0; + padding: 1px 5px; +} +a.badge:hover, +a.badge:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} +.list-group-item.active > .badge, +.nav-pills > .active > a > .badge { + color: #337ab7; + background-color: #fff; +} +.list-group-item > .badge { + float: right; +} +.list-group-item > .badge + .badge { + margin-right: 5px; +} +.nav-pills > li > a > .badge { + margin-left: 3px; +} +.jumbotron { + padding-top: 30px; + padding-bottom: 30px; + margin-bottom: 30px; + color: inherit; + background-color: #eee; +} +.jumbotron h1, +.jumbotron .h1 { + color: inherit; +} +.jumbotron p { + margin-bottom: 15px; + font-size: 21px; + font-weight: 200; +} +.jumbotron > hr { + border-top-color: #d5d5d5; +} +.container .jumbotron, +.container-fluid .jumbotron { + padding-right: 15px; + padding-left: 15px; + border-radius: 6px; +} +.jumbotron .container { + max-width: 100%; +} +@media screen and (min-width: 768px) { + .jumbotron { + padding-top: 48px; + padding-bottom: 48px; + } + .container .jumbotron, + .container-fluid .jumbotron { + padding-right: 60px; + padding-left: 60px; + } + .jumbotron h1, + .jumbotron .h1 { + font-size: 63px; + } +} +.thumbnail { + display: block; + padding: 4px; + margin-bottom: 20px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: border .2s ease-in-out; + -o-transition: border .2s ease-in-out; + transition: border .2s ease-in-out; +} +.thumbnail > img, +.thumbnail a > img { + margin-right: auto; + margin-left: auto; +} +a.thumbnail:hover, +a.thumbnail:focus, +a.thumbnail.active { + border-color: #337ab7; +} +.thumbnail .caption { + padding: 9px; + color: #333; +} +.alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px; +} +.alert h4 { + margin-top: 0; + color: inherit; +} +.alert .alert-link { + font-weight: bold; +} +.alert > p, +.alert > ul { + margin-bottom: 0; +} +.alert > p + p { + margin-top: 5px; +} +.alert-dismissable, +.alert-dismissible { + padding-right: 35px; +} +.alert-dismissable .close, +.alert-dismissible .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; +} +.alert-success { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.alert-success hr { + border-top-color: #c9e2b3; +} +.alert-success .alert-link { + color: #2b542c; +} +.alert-info { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.alert-info hr { + border-top-color: #a6e1ec; +} +.alert-info .alert-link { + color: #245269; +} +.alert-warning { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.alert-warning hr { + border-top-color: #f7e1b5; +} +.alert-warning .alert-link { + color: #66512c; +} +.alert-danger { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.alert-danger hr { + border-top-color: #e4b9c0; +} +.alert-danger .alert-link { + color: #843534; +} +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@-o-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +.progress { + height: 20px; + margin-bottom: 20px; + overflow: hidden; + background-color: #f5f5f5; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); +} +.progress-bar { + float: left; + width: 0; + height: 100%; + font-size: 12px; + line-height: 20px; + color: #fff; + text-align: center; + background-color: #337ab7; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); + -webkit-transition: width .6s ease; + -o-transition: width .6s ease; + transition: width .6s ease; +} +.progress-striped .progress-bar, +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + background-size: 40px 40px; +} +.progress.active .progress-bar, +.progress-bar.active { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} +.progress-bar-success { + background-color: #5cb85c; +} +.progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-info { + background-color: #5bc0de; +} +.progress-striped .progress-bar-info { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-warning { + background-color: #f0ad4e; +} +.progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-danger { + background-color: #d9534f; +} +.progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.media { + margin-top: 15px; +} +.media:first-child { + margin-top: 0; +} +.media, +.media-body { + overflow: hidden; + zoom: 1; +} +.media-body { + width: 10000px; +} +.media-object { + display: block; +} +.media-object.img-thumbnail { + max-width: none; +} +.media-right, +.media > .pull-right { + padding-left: 10px; +} +.media-left, +.media > .pull-left { + padding-right: 10px; +} +.media-left, +.media-right, +.media-body { + display: table-cell; + vertical-align: top; +} +.media-middle { + vertical-align: middle; +} +.media-bottom { + vertical-align: bottom; +} +.media-heading { + margin-top: 0; + margin-bottom: 5px; +} +.media-list { + padding-left: 0; + list-style: none; +} +.list-group { + padding-left: 0; + margin-bottom: 20px; +} +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #fff; + border: 1px solid #ddd; +} +.list-group-item:first-child { + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +a.list-group-item, +button.list-group-item { + color: #555; +} +a.list-group-item .list-group-item-heading, +button.list-group-item .list-group-item-heading { + color: #333; +} +a.list-group-item:hover, +button.list-group-item:hover, +a.list-group-item:focus, +button.list-group-item:focus { + color: #555; + text-decoration: none; + background-color: #f5f5f5; +} +button.list-group-item { + width: 100%; + text-align: left; +} +.list-group-item.disabled, +.list-group-item.disabled:hover, +.list-group-item.disabled:focus { + color: #777; + cursor: not-allowed; + background-color: #eee; +} +.list-group-item.disabled .list-group-item-heading, +.list-group-item.disabled:hover .list-group-item-heading, +.list-group-item.disabled:focus .list-group-item-heading { + color: inherit; +} +.list-group-item.disabled .list-group-item-text, +.list-group-item.disabled:hover .list-group-item-text, +.list-group-item.disabled:focus .list-group-item-text { + color: #777; +} +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + z-index: 2; + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.list-group-item.active .list-group-item-heading, +.list-group-item.active:hover .list-group-item-heading, +.list-group-item.active:focus .list-group-item-heading, +.list-group-item.active .list-group-item-heading > small, +.list-group-item.active:hover .list-group-item-heading > small, +.list-group-item.active:focus .list-group-item-heading > small, +.list-group-item.active .list-group-item-heading > .small, +.list-group-item.active:hover .list-group-item-heading > .small, +.list-group-item.active:focus .list-group-item-heading > .small { + color: inherit; +} +.list-group-item.active .list-group-item-text, +.list-group-item.active:hover .list-group-item-text, +.list-group-item.active:focus .list-group-item-text { + color: #c7ddef; +} +.list-group-item-success { + color: #3c763d; + background-color: #dff0d8; +} +a.list-group-item-success, +button.list-group-item-success { + color: #3c763d; +} +a.list-group-item-success .list-group-item-heading, +button.list-group-item-success .list-group-item-heading { + color: inherit; +} +a.list-group-item-success:hover, +button.list-group-item-success:hover, +a.list-group-item-success:focus, +button.list-group-item-success:focus { + color: #3c763d; + background-color: #d0e9c6; +} +a.list-group-item-success.active, +button.list-group-item-success.active, +a.list-group-item-success.active:hover, +button.list-group-item-success.active:hover, +a.list-group-item-success.active:focus, +button.list-group-item-success.active:focus { + color: #fff; + background-color: #3c763d; + border-color: #3c763d; +} +.list-group-item-info { + color: #31708f; + background-color: #d9edf7; +} +a.list-group-item-info, +button.list-group-item-info { + color: #31708f; +} +a.list-group-item-info .list-group-item-heading, +button.list-group-item-info .list-group-item-heading { + color: inherit; +} +a.list-group-item-info:hover, +button.list-group-item-info:hover, +a.list-group-item-info:focus, +button.list-group-item-info:focus { + color: #31708f; + background-color: #c4e3f3; +} +a.list-group-item-info.active, +button.list-group-item-info.active, +a.list-group-item-info.active:hover, +button.list-group-item-info.active:hover, +a.list-group-item-info.active:focus, +button.list-group-item-info.active:focus { + color: #fff; + background-color: #31708f; + border-color: #31708f; +} +.list-group-item-warning { + color: #8a6d3b; + background-color: #fcf8e3; +} +a.list-group-item-warning, +button.list-group-item-warning { + color: #8a6d3b; +} +a.list-group-item-warning .list-group-item-heading, +button.list-group-item-warning .list-group-item-heading { + color: inherit; +} +a.list-group-item-warning:hover, +button.list-group-item-warning:hover, +a.list-group-item-warning:focus, +button.list-group-item-warning:focus { + color: #8a6d3b; + background-color: #faf2cc; +} +a.list-group-item-warning.active, +button.list-group-item-warning.active, +a.list-group-item-warning.active:hover, +button.list-group-item-warning.active:hover, +a.list-group-item-warning.active:focus, +button.list-group-item-warning.active:focus { + color: #fff; + background-color: #8a6d3b; + border-color: #8a6d3b; +} +.list-group-item-danger { + color: #a94442; + background-color: #f2dede; +} +a.list-group-item-danger, +button.list-group-item-danger { + color: #a94442; +} +a.list-group-item-danger .list-group-item-heading, +button.list-group-item-danger .list-group-item-heading { + color: inherit; +} +a.list-group-item-danger:hover, +button.list-group-item-danger:hover, +a.list-group-item-danger:focus, +button.list-group-item-danger:focus { + color: #a94442; + background-color: #ebcccc; +} +a.list-group-item-danger.active, +button.list-group-item-danger.active, +a.list-group-item-danger.active:hover, +button.list-group-item-danger.active:hover, +a.list-group-item-danger.active:focus, +button.list-group-item-danger.active:focus { + color: #fff; + background-color: #a94442; + border-color: #a94442; +} +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; +} +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; +} +.panel { + margin-bottom: 20px; + background-color: #fff; + border: 1px solid transparent; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05); + box-shadow: 0 1px 1px rgba(0, 0, 0, .05); +} +.panel-body { + padding: 15px; +} +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel-heading > .dropdown .dropdown-toggle { + color: inherit; +} +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit; +} +.panel-title > a, +.panel-title > small, +.panel-title > .small, +.panel-title > small > a, +.panel-title > .small > a { + color: inherit; +} +.panel-footer { + padding: 10px 15px; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .list-group, +.panel > .panel-collapse > .list-group { + margin-bottom: 0; +} +.panel > .list-group .list-group-item, +.panel > .panel-collapse > .list-group .list-group-item { + border-width: 1px 0; + border-radius: 0; +} +.panel > .list-group:first-child .list-group-item:first-child, +.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { + border-top: 0; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .list-group:last-child .list-group-item:last-child, +.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { + border-bottom: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.panel-heading + .list-group .list-group-item:first-child { + border-top-width: 0; +} +.list-group + .panel-footer { + border-top-width: 0; +} +.panel > .table, +.panel > .table-responsive > .table, +.panel > .panel-collapse > .table { + margin-bottom: 0; +} +.panel > .table caption, +.panel > .table-responsive > .table caption, +.panel > .panel-collapse > .table caption { + padding-right: 15px; + padding-left: 15px; +} +.panel > .table:first-child, +.panel > .table-responsive:first-child > .table:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { + border-top-left-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { + border-top-right-radius: 3px; +} +.panel > .table:last-child, +.panel > .table-responsive:last-child > .table:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { + border-bottom-right-radius: 3px; +} +.panel > .panel-body + .table, +.panel > .panel-body + .table-responsive, +.panel > .table + .panel-body, +.panel > .table-responsive + .panel-body { + border-top: 1px solid #ddd; +} +.panel > .table > tbody:first-child > tr:first-child th, +.panel > .table > tbody:first-child > tr:first-child td { + border-top: 0; +} +.panel > .table-bordered, +.panel > .table-responsive > .table-bordered { + border: 0; +} +.panel > .table-bordered > thead > tr > th:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, +.panel > .table-bordered > tbody > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, +.panel > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-bordered > thead > tr > td:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, +.panel > .table-bordered > tbody > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, +.panel > .table-bordered > tfoot > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; +} +.panel > .table-bordered > thead > tr > th:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, +.panel > .table-bordered > tbody > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, +.panel > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-bordered > thead > tr > td:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, +.panel > .table-bordered > tbody > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, +.panel > .table-bordered > tfoot > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; +} +.panel > .table-bordered > thead > tr:first-child > td, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, +.panel > .table-bordered > tbody > tr:first-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, +.panel > .table-bordered > thead > tr:first-child > th, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, +.panel > .table-bordered > tbody > tr:first-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { + border-bottom: 0; +} +.panel > .table-bordered > tbody > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, +.panel > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-bordered > tbody > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, +.panel > .table-bordered > tfoot > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { + border-bottom: 0; +} +.panel > .table-responsive { + margin-bottom: 0; + border: 0; +} +.panel-group { + margin-bottom: 20px; +} +.panel-group .panel { + margin-bottom: 0; + border-radius: 4px; +} +.panel-group .panel + .panel { + margin-top: 5px; +} +.panel-group .panel-heading { + border-bottom: 0; +} +.panel-group .panel-heading + .panel-collapse > .panel-body, +.panel-group .panel-heading + .panel-collapse > .list-group { + border-top: 1px solid #ddd; +} +.panel-group .panel-footer { + border-top: 0; +} +.panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid #ddd; +} +.panel-default { + border-color: #ddd; +} +.panel-default > .panel-heading { + color: #333; + background-color: #f5f5f5; + border-color: #ddd; +} +.panel-default > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ddd; +} +.panel-default > .panel-heading .badge { + color: #f5f5f5; + background-color: #333; +} +.panel-default > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ddd; +} +.panel-primary { + border-color: #337ab7; +} +.panel-primary > .panel-heading { + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.panel-primary > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #337ab7; +} +.panel-primary > .panel-heading .badge { + color: #337ab7; + background-color: #fff; +} +.panel-primary > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #337ab7; +} +.panel-success { + border-color: #d6e9c6; +} +.panel-success > .panel-heading { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.panel-success > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #d6e9c6; +} +.panel-success > .panel-heading .badge { + color: #dff0d8; + background-color: #3c763d; +} +.panel-success > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #d6e9c6; +} +.panel-info { + border-color: #bce8f1; +} +.panel-info > .panel-heading { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.panel-info > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #bce8f1; +} +.panel-info > .panel-heading .badge { + color: #d9edf7; + background-color: #31708f; +} +.panel-info > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #bce8f1; +} +.panel-warning { + border-color: #faebcc; +} +.panel-warning > .panel-heading { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.panel-warning > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #faebcc; +} +.panel-warning > .panel-heading .badge { + color: #fcf8e3; + background-color: #8a6d3b; +} +.panel-warning > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #faebcc; +} +.panel-danger { + border-color: #ebccd1; +} +.panel-danger > .panel-heading { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.panel-danger > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ebccd1; +} +.panel-danger > .panel-heading .badge { + color: #f2dede; + background-color: #a94442; +} +.panel-danger > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ebccd1; +} +.embed-responsive { + position: relative; + display: block; + height: 0; + padding: 0; + overflow: hidden; +} +.embed-responsive .embed-responsive-item, +.embed-responsive iframe, +.embed-responsive embed, +.embed-responsive object, +.embed-responsive video { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0; +} +.embed-responsive-16by9 { + padding-bottom: 56.25%; +} +.embed-responsive-4by3 { + padding-bottom: 75%; +} +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); +} +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, .15); +} +.well-lg { + padding: 24px; + border-radius: 6px; +} +.well-sm { + padding: 9px; + border-radius: 3px; +} +.close { + float: right; + font-size: 21px; + font-weight: bold; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + filter: alpha(opacity=20); + opacity: .2; +} +.close:hover, +.close:focus { + color: #000; + text-decoration: none; + cursor: pointer; + filter: alpha(opacity=50); + opacity: .5; +} +button.close { + -webkit-appearance: none; + padding: 0; + cursor: pointer; + background: transparent; + border: 0; +} +.modal-open { + overflow: hidden; +} +.modal { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1050; + display: none; + overflow: hidden; + -webkit-overflow-scrolling: touch; + outline: 0; +} +.modal.fade .modal-dialog { + -webkit-transition: -webkit-transform .3s ease-out; + -o-transition: -o-transform .3s ease-out; + transition: transform .3s ease-out; + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + -o-transform: translate(0, -25%); + transform: translate(0, -25%); +} +.modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); +} +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} +.modal-dialog { + position: relative; + width: auto; + margin: 10px; +} +.modal-content { + position: relative; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 6px; + outline: 0; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5); + box-shadow: 0 3px 9px rgba(0, 0, 0, .5); +} +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000; +} +.modal-backdrop.fade { + filter: alpha(opacity=0); + opacity: 0; +} +.modal-backdrop.in { + filter: alpha(opacity=50); + opacity: .5; +} +.modal-header { + padding: 15px; + border-bottom: 1px solid #e5e5e5; +} +.modal-header .close { + margin-top: -2px; +} +.modal-title { + margin: 0; + line-height: 1.42857143; +} +.modal-body { + position: relative; + padding: 15px; +} +.modal-footer { + padding: 15px; + text-align: right; + border-top: 1px solid #e5e5e5; +} +.modal-footer .btn + .btn { + margin-bottom: 0; + margin-left: 5px; +} +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} +@media (min-width: 768px) { + .modal-dialog { + width: 600px; + margin: 30px auto; + } + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5); + box-shadow: 0 5px 15px rgba(0, 0, 0, .5); + } + .modal-sm { + width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg { + width: 900px; + } +} +.tooltip { + position: absolute; + z-index: 1070; + display: block; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 12px; + font-style: normal; + font-weight: normal; + line-height: 1.42857143; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + white-space: normal; + filter: alpha(opacity=0); + opacity: 0; + + line-break: auto; +} +.tooltip.in { + filter: alpha(opacity=90); + opacity: .9; +} +.tooltip.top { + padding: 5px 0; + margin-top: -3px; +} +.tooltip.right { + padding: 0 5px; + margin-left: 3px; +} +.tooltip.bottom { + padding: 5px 0; + margin-top: 3px; +} +.tooltip.left { + padding: 0 5px; + margin-left: -3px; +} +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #fff; + text-align: center; + background-color: #000; + border-radius: 4px; +} +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-left .tooltip-arrow { + right: 5px; + bottom: 0; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-right .tooltip-arrow { + bottom: 0; + left: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #000; +} +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #000; +} +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-left .tooltip-arrow { + top: 0; + right: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-right .tooltip-arrow { + top: 0; + left: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: none; + max-width: 276px; + padding: 1px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + font-style: normal; + font-weight: normal; + line-height: 1.42857143; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + white-space: normal; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2); + box-shadow: 0 5px 10px rgba(0, 0, 0, .2); + + line-break: auto; +} +.popover.top { + margin-top: -10px; +} +.popover.right { + margin-left: 10px; +} +.popover.bottom { + margin-top: 10px; +} +.popover.left { + margin-left: -10px; +} +.popover-title { + padding: 8px 14px; + margin: 0; + font-size: 14px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-radius: 5px 5px 0 0; +} +.popover-content { + padding: 9px 14px; +} +.popover > .arrow, +.popover > .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.popover > .arrow { + border-width: 11px; +} +.popover > .arrow:after { + content: ""; + border-width: 10px; +} +.popover.top > .arrow { + bottom: -11px; + left: 50%; + margin-left: -11px; + border-top-color: #999; + border-top-color: rgba(0, 0, 0, .25); + border-bottom-width: 0; +} +.popover.top > .arrow:after { + bottom: 1px; + margin-left: -10px; + content: " "; + border-top-color: #fff; + border-bottom-width: 0; +} +.popover.right > .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-right-color: #999; + border-right-color: rgba(0, 0, 0, .25); + border-left-width: 0; +} +.popover.right > .arrow:after { + bottom: -10px; + left: 1px; + content: " "; + border-right-color: #fff; + border-left-width: 0; +} +.popover.bottom > .arrow { + top: -11px; + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #999; + border-bottom-color: rgba(0, 0, 0, .25); +} +.popover.bottom > .arrow:after { + top: 1px; + margin-left: -10px; + content: " "; + border-top-width: 0; + border-bottom-color: #fff; +} +.popover.left > .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #999; + border-left-color: rgba(0, 0, 0, .25); +} +.popover.left > .arrow:after { + right: 1px; + bottom: -10px; + content: " "; + border-right-width: 0; + border-left-color: #fff; +} +.carousel { + position: relative; +} +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} +.carousel-inner > .item { + position: relative; + display: none; + -webkit-transition: .6s ease-in-out left; + -o-transition: .6s ease-in-out left; + transition: .6s ease-in-out left; +} +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + line-height: 1; +} +@media all and (transform-3d), (-webkit-transform-3d) { + .carousel-inner > .item { + -webkit-transition: -webkit-transform .6s ease-in-out; + -o-transition: -o-transform .6s ease-in-out; + transition: transform .6s ease-in-out; + + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-perspective: 1000px; + perspective: 1000px; + } + .carousel-inner > .item.next, + .carousel-inner > .item.active.right { + left: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } + .carousel-inner > .item.prev, + .carousel-inner > .item.active.left { + left: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } + .carousel-inner > .item.next.left, + .carousel-inner > .item.prev.right, + .carousel-inner > .item.active { + left: 0; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} +.carousel-inner > .active { + left: 0; +} +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} +.carousel-inner > .next { + left: 100%; +} +.carousel-inner > .prev { + left: -100%; +} +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} +.carousel-inner > .active.left { + left: -100%; +} +.carousel-inner > .active.right { + left: 100%; +} +.carousel-control { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 15%; + font-size: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, .6); + background-color: rgba(0, 0, 0, 0); + filter: alpha(opacity=50); + opacity: .5; +} +.carousel-control.left { + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001))); + background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); + background-repeat: repeat-x; +} +.carousel-control.right { + right: 0; + left: auto; + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5))); + background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); + background-repeat: repeat-x; +} +.carousel-control:hover, +.carousel-control:focus { + color: #fff; + text-decoration: none; + filter: alpha(opacity=90); + outline: 0; + opacity: .9; +} +.carousel-control .icon-prev, +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-left, +.carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; + margin-top: -10px; +} +.carousel-control .icon-prev, +.carousel-control .glyphicon-chevron-left { + left: 50%; + margin-left: -10px; +} +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-right { + right: 50%; + margin-right: -10px; +} +.carousel-control .icon-prev, +.carousel-control .icon-next { + width: 20px; + height: 20px; + font-family: serif; + line-height: 1; +} +.carousel-control .icon-prev:before { + content: '\2039'; +} +.carousel-control .icon-next:before { + content: '\203a'; +} +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + padding-left: 0; + margin-left: -30%; + text-align: center; + list-style: none; +} +.carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + cursor: pointer; + background-color: #000 \9; + background-color: rgba(0, 0, 0, 0); + border: 1px solid #fff; + border-radius: 10px; +} +.carousel-indicators .active { + width: 12px; + height: 12px; + margin: 0; + background-color: #fff; +} +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, .6); +} +.carousel-caption .btn { + text-shadow: none; +} +@media screen and (min-width: 768px) { + .carousel-control .glyphicon-chevron-left, + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-prev, + .carousel-control .icon-next { + width: 30px; + height: 30px; + margin-top: -10px; + font-size: 30px; + } + .carousel-control .glyphicon-chevron-left, + .carousel-control .icon-prev { + margin-left: -10px; + } + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-next { + margin-right: -10px; + } + .carousel-caption { + right: 20%; + left: 20%; + padding-bottom: 30px; + } + .carousel-indicators { + bottom: 20px; + } +} +.clearfix:before, +.clearfix:after, +.dl-horizontal dd:before, +.dl-horizontal dd:after, +.container:before, +.container:after, +.container-fluid:before, +.container-fluid:after, +.row:before, +.row:after, +.form-horizontal .form-group:before, +.form-horizontal .form-group:after, +.btn-toolbar:before, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:before, +.btn-group-vertical > .btn-group:after, +.nav:before, +.nav:after, +.navbar:before, +.navbar:after, +.navbar-header:before, +.navbar-header:after, +.navbar-collapse:before, +.navbar-collapse:after, +.pager:before, +.pager:after, +.panel-body:before, +.panel-body:after, +.modal-header:before, +.modal-header:after, +.modal-footer:before, +.modal-footer:after { + display: table; + content: " "; +} +.clearfix:after, +.dl-horizontal dd:after, +.container:after, +.container-fluid:after, +.row:after, +.form-horizontal .form-group:after, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:after, +.nav:after, +.navbar:after, +.navbar-header:after, +.navbar-collapse:after, +.pager:after, +.panel-body:after, +.modal-header:after, +.modal-footer:after { + clear: both; +} +.center-block { + display: block; + margin-right: auto; + margin-left: auto; +} +.pull-right { + float: right !important; +} +.pull-left { + float: left !important; +} +.hide { + display: none !important; +} +.show { + display: block !important; +} +.invisible { + visibility: hidden; +} +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} +.hidden { + display: none !important; +} +.affix { + position: fixed; +} +@-ms-viewport { + width: device-width; +} +.visible-xs, +.visible-sm, +.visible-md, +.visible-lg { + display: none !important; +} +.visible-xs-block, +.visible-xs-inline, +.visible-xs-inline-block, +.visible-sm-block, +.visible-sm-inline, +.visible-sm-inline-block, +.visible-md-block, +.visible-md-inline, +.visible-md-inline-block, +.visible-lg-block, +.visible-lg-inline, +.visible-lg-inline-block { + display: none !important; +} +@media (max-width: 767px) { + .visible-xs { + display: block !important; + } + table.visible-xs { + display: table !important; + } + tr.visible-xs { + display: table-row !important; + } + th.visible-xs, + td.visible-xs { + display: table-cell !important; + } +} +@media (max-width: 767px) { + .visible-xs-block { + display: block !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline { + display: inline !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline-block { + display: inline-block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm { + display: block !important; + } + table.visible-sm { + display: table !important; + } + tr.visible-sm { + display: table-row !important; + } + th.visible-sm, + td.visible-sm { + display: table-cell !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-block { + display: block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline { + display: inline !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline-block { + display: inline-block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md { + display: block !important; + } + table.visible-md { + display: table !important; + } + tr.visible-md { + display: table-row !important; + } + th.visible-md, + td.visible-md { + display: table-cell !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-block { + display: block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline { + display: inline !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline-block { + display: inline-block !important; + } +} +@media (min-width: 1200px) { + .visible-lg { + display: block !important; + } + table.visible-lg { + display: table !important; + } + tr.visible-lg { + display: table-row !important; + } + th.visible-lg, + td.visible-lg { + display: table-cell !important; + } +} +@media (min-width: 1200px) { + .visible-lg-block { + display: block !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline { + display: inline !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline-block { + display: inline-block !important; + } +} +@media (max-width: 767px) { + .hidden-xs { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .hidden-sm { + display: none !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-md { + display: none !important; + } +} +@media (min-width: 1200px) { + .hidden-lg { + display: none !important; + } +} +.visible-print { + display: none !important; +} +@media print { + .visible-print { + display: block !important; + } + table.visible-print { + display: table !important; + } + tr.visible-print { + display: table-row !important; + } + th.visible-print, + td.visible-print { + display: table-cell !important; + } +} +.visible-print-block { + display: none !important; +} +@media print { + .visible-print-block { + display: block !important; + } +} +.visible-print-inline { + display: none !important; +} +@media print { + .visible-print-inline { + display: inline !important; + } +} +.visible-print-inline-block { + display: none !important; +} +@media print { + .visible-print-inline-block { + display: inline-block !important; + } +} +@media print { + .hidden-print { + display: none !important; + } +} +/*# sourceMappingURL=bootstrap.css.map */ diff --git a/app_v3satdemo/chrome/content/web/css/bootstrap.min.css b/app_v3satdemo/chrome/content/web/css/bootstrap.min.css new file mode 100644 index 0000000..4cf729e --- /dev/null +++ b/app_v3satdemo/chrome/content/web/css/bootstrap.min.css @@ -0,0 +1,6 @@ +/*! + * Bootstrap v3.3.6 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} +/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/app_v3satdemo/chrome/content/web/css/calendar.css b/app_v3satdemo/chrome/content/web/css/calendar.css new file mode 100644 index 0000000..fa7115e --- /dev/null +++ b/app_v3satdemo/chrome/content/web/css/calendar.css @@ -0,0 +1,91 @@ +.panel-day { + width: 100%; + padding: 0px; + margin: 0px; +} + +.panel-dayhead { + padding: 3px; + width: 100%; + text-align: right; + border-bottom: 1px solid lightgrey; +} + +.panel-dayheadcurrent { + font-weight: bold; +} + +.panel-dayweekend{ + background-color: #d1d1d1; +} + +.panel-dayother { + background-color: #969696; +} + + + +.panel-daybody { + height: 10.5vh; + max-height: 10.5vh; + overflow-y: auto; + padding: 3px; +} + +.calevent { + display: block; + width: 100%; + border: 1px solid black; + /*border-radius: 5px;*/ + cursor: pointer; +} + +.calactivity { + display: inline-block; + margin: 2px; + padding: 3px; + border: 1px solid black; + /*border-radius: 5px;*/ + cursor: pointer; + mix-blend-mode: screen; +} +table#cal_month > tbody > tr > td { + width: calc(100vw/7); + max-width: calc(100vw/7); + padding: 0px; + margin: 0px; +} + +.tdweek { + background-color: #d1d1d1; +} + +.calvacrange { + background-color: #FF9C2A !important; + /*color: #fff !important;*/ +} + +.calvacancy { + background-color: #FF7145 !important; +} + +.calvacheader { + text-align: left; + max-width: 80%; + float: left; + overflow: hidden; + white-space: nowrap; +} + +.noprint2 { + width: 50px; + min-width: 50px; +} + +@media print { + .noprint2 { + display: none; + } + +} + diff --git a/app_v3satdemo/chrome/content/web/css/creorga.css b/app_v3satdemo/chrome/content/web/css/creorga.css new file mode 100644 index 0000000..ccea2c2 --- /dev/null +++ b/app_v3satdemo/chrome/content/web/css/creorga.css @@ -0,0 +1,209 @@ +html,body { + /*padding-top: 60px; + padding-bottom: 40px;*/ + /*background-color: #f5f5f5;*/ + background-color: #fff; + -moz-user-select: none; + /*padding-top: 50px;*/ + } + +.pagehead { + font-size: 18px; + font-weight: bold; +} +.main { + padding: 0px; +} +@media (min-width: 768px) { + .main { + padding: 0px; + padding-right: 10px; + padding-left: 10px; + } +} +.main .page-header { + margin-top: 0; +} + +.action1btn { + min-width: 50px; +} + +.infoweek { + width: 320px; +} + +.modal .modal-body { + max-height: 420px; + overflow-y: auto; +} +/*.btn-primary { + margin-bottom: 10px; +}*/ + + +/*.table-hover tbody tr:hover td { + background-color: #FCF8E3; +} */ + +/*@media (min-width: 768px) { + .main { + padding-right: 40px; + padding-left: 40px; + } +}*/ +.main .page-header { + margin-top: 0; +} + +/* hides the spin-button for firefox */ +input[type=number] { + -moz-appearance: textfield; +} +/* hides the spin-button for chrome*/ +/*input[type=number]::-webkit-outer-spin-button, +input[type=number]::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; +}*/ + +.checkbox { + margin-left: 30px; + padding-top: 0px; +} + +.field { + margin-bottom: 5px; + } + .field label { + float: left; + width: 160px; + + text-align: right; + padding-right: 10px; + margin: 5px 0px 5px 0px; + } + .field input { + width: 300px; + margin: 0px; + } + + .field textarea { + width: 300px; + margin: 0px; + } + + .field button { + margin: 0px; + } +.date { + width: 145px; +} +.month , .week { + width: 180px; +} +.number { + width: 145px; +} +.time { + width: 120px; +} +.hidden { + visibility: hidden; +} + +input[type="date"]:disabled, input[type="text"]:disabled { + background-color: #fff; +} { + background-color: #fff; +} +.tab-pane { + margin-top: 20px; +} + +select { + background-color: #fff; + border: 1px solid #cccccc; + border-radius: 3px; + font-size: 14px; + height: 34px; + line-height: 1.42857; + padding: 6px 12px; +} + + +.table td.align-right { + text-align: right; +} + +.alignright{ + text-align: right; +} + +.alignleft { + text-align: left; +} + +.aligntop { + vertical-align: top; +} + +.weekwidth { + width: 60px; +} + +.totalwidth { + width: 90px; +} + +.modal.modal-wide .modal-dialog { + width: 90%; +} +.modal-wide .modal-body { + overflow-y: auto; +} + +#print-head { + display: none; +} + +#print-foot { + display: none; +} + +.colhidden { + display: none; + max-width: 0px; +} + +.btn-default:hover { + background: #90c8f6; +} + +.summernote, .note-editable, .panel-body { + -moz-user-select: text; +} +.input-group-addon { + background-color: #337ab7; + border-color: #2e6da4; + color: #fff; +} + +.modal-header { + background-color: #4F4F4F; + color: #fff; +} + +.modal-footer { + background-color: #4F4F4F; +} + +.timepicker { + max-width: 65px; +} + +.warning { + background-color: orange; +} + +/*.note-editor .note-dropzone { opacity: 0 !important; }*/ diff --git a/app_v3satdemo/chrome/content/web/css/dataTables.bootstrap.min.css b/app_v3satdemo/chrome/content/web/css/dataTables.bootstrap.min.css new file mode 100644 index 0000000..0fb9757 --- /dev/null +++ b/app_v3satdemo/chrome/content/web/css/dataTables.bootstrap.min.css @@ -0,0 +1 @@ +table.dataTable{clear:both;margin-top:6px !important;margin-bottom:6px !important;max-width:none !important}table.dataTable td,table.dataTable th{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}table.dataTable td.dataTables_empty,table.dataTable th.dataTables_empty{text-align:center}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}div.dataTables_wrapper div.dataTables_length label{font-weight:normal;text-align:left;white-space:nowrap}div.dataTables_wrapper div.dataTables_length select{width:75px;display:inline-block}div.dataTables_wrapper div.dataTables_filter{text-align:right}div.dataTables_wrapper div.dataTables_filter label{font-weight:normal;white-space:nowrap;text-align:left}div.dataTables_wrapper div.dataTables_filter input{margin-left:0.5em;display:inline-block;width:auto}div.dataTables_wrapper div.dataTables_info{padding-top:8px;white-space:nowrap}div.dataTables_wrapper div.dataTables_paginate{margin:0;white-space:nowrap;text-align:right}div.dataTables_wrapper div.dataTables_paginate ul.pagination{margin:2px 0;white-space:nowrap}table.dataTable thead>tr>th.sorting_asc,table.dataTable thead>tr>th.sorting_desc,table.dataTable thead>tr>th.sorting,table.dataTable thead>tr>td.sorting_asc,table.dataTable thead>tr>td.sorting_desc,table.dataTable thead>tr>td.sorting{padding-right:30px}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{cursor:pointer;position:relative}table.dataTable thead .sorting:after,table.dataTable thead .sorting_asc:after,table.dataTable thead .sorting_desc:after,table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:after{position:absolute;bottom:8px;right:8px;display:block;font-family:'Glyphicons Halflings';opacity:0.5}table.dataTable thead .sorting:after{opacity:0.2;content:"\e150"}table.dataTable thead .sorting_asc:after{content:"\e155"}table.dataTable thead .sorting_desc:after{content:"\e156"}table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:after{color:#eee}div.dataTables_scrollHead table.dataTable{margin-bottom:0 !important}div.dataTables_scrollBody table{border-top:none;margin-top:0 !important;margin-bottom:0 !important}div.dataTables_scrollBody table thead .sorting:after,div.dataTables_scrollBody table thead .sorting_asc:after,div.dataTables_scrollBody table thead .sorting_desc:after{display:none}div.dataTables_scrollBody table tbody tr:first-child th,div.dataTables_scrollBody table tbody tr:first-child td{border-top:none}div.dataTables_scrollFoot table{margin-top:0 !important;border-top:none}@media screen and (max-width: 767px){div.dataTables_wrapper div.dataTables_length,div.dataTables_wrapper div.dataTables_filter,div.dataTables_wrapper div.dataTables_info,div.dataTables_wrapper div.dataTables_paginate{text-align:center}}table.dataTable.table-condensed>thead>tr>th{padding-right:20px}table.dataTable.table-condensed .sorting:after,table.dataTable.table-condensed .sorting_asc:after,table.dataTable.table-condensed .sorting_desc:after{top:6px;right:6px}table.table-bordered.dataTable{border-collapse:separate !important}table.table-bordered.dataTable th,table.table-bordered.dataTable td{border-left-width:0}table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable td:last-child,table.table-bordered.dataTable td:last-child{border-right-width:0}table.table-bordered.dataTable tbody th,table.table-bordered.dataTable tbody td{border-bottom-width:0}div.dataTables_scrollHead table.table-bordered{border-bottom-width:0} diff --git a/app_v3satdemo/chrome/content/web/css/datatables.min.css b/app_v3satdemo/chrome/content/web/css/datatables.min.css new file mode 100644 index 0000000..492dc28 --- /dev/null +++ b/app_v3satdemo/chrome/content/web/css/datatables.min.css @@ -0,0 +1,139 @@ +/* + * This combined file was created by the DataTables downloader builder: + * https://datatables.net/download + * + * To rebuild or modify this file with the latest versions of the included + * software please visit: + * https://datatables.net/download/#dt/dt-1.10.9,af-2.0.0,b-1.0.3,b-colvis-1.0.3,cr-1.2.0,fc-3.1.0,fh-3.0.0,sc-1.3.0,se-1.0.1 + * + * Included libraries: + * DataTables 1.10.9, AutoFill 2.0.0, Buttons 1.0.3, Column visibility 1.0.3, ColReorder 1.2.0, FixedColumns 3.1.0, FixedHeader 3.0.0, Scroller 1.3.0, Select 1.0.1 + */ + +table.dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:bold}table.dataTable thead th,table.dataTable thead td{padding:10px 18px;border-bottom:1px solid #111}table.dataTable thead th:active,table.dataTable thead td:active{outline:none}table.dataTable tfoot th,table.dataTable tfoot td{padding:10px 18px 6px 18px;border-top:1px solid #111}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc{cursor:pointer;*cursor:hand}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{background-repeat:no-repeat;background-position:center right}table.dataTable thead .sorting{background-image:url("DataTables-1.10.9/images/sort_both.png")}table.dataTable thead .sorting_asc{background-image:url("DataTables-1.10.9/images/sort_asc.png")}table.dataTable thead .sorting_desc{background-image:url("DataTables-1.10.9/images/sort_desc.png")}table.dataTable thead .sorting_asc_disabled{background-image:url("DataTables-1.10.9/images/sort_asc_disabled.png")}table.dataTable thead .sorting_desc_disabled{background-image:url("DataTables-1.10.9/images/sort_desc_disabled.png")}table.dataTable tbody tr{background-color:#ffffff}table.dataTable tbody tr.selected{background-color:#B0BED9}table.dataTable tbody th,table.dataTable tbody td{padding:8px 10px}table.dataTable.row-border tbody th,table.dataTable.row-border tbody td,table.dataTable.display tbody th,table.dataTable.display tbody td{border-top:1px solid #ddd}table.dataTable.row-border tbody tr:first-child th,table.dataTable.row-border tbody tr:first-child td,table.dataTable.display tbody tr:first-child th,table.dataTable.display tbody tr:first-child td{border-top:none}table.dataTable.cell-border tbody th,table.dataTable.cell-border tbody td{border-top:1px solid #ddd;border-right:1px solid #ddd}table.dataTable.cell-border tbody tr th:first-child,table.dataTable.cell-border tbody tr td:first-child{border-left:1px solid #ddd}table.dataTable.cell-border tbody tr:first-child th,table.dataTable.cell-border tbody tr:first-child td{border-top:none}table.dataTable.stripe tbody tr.odd,table.dataTable.display tbody tr.odd{background-color:#f9f9f9}table.dataTable.stripe tbody tr.odd.selected,table.dataTable.display tbody tr.odd.selected{background-color:#acbad4}table.dataTable.hover tbody tr:hover,table.dataTable.display tbody tr:hover{background-color:#f6f6f6}table.dataTable.hover tbody tr:hover.selected,table.dataTable.display tbody tr:hover.selected{background-color:#aab7d1}table.dataTable.order-column tbody tr>.sorting_1,table.dataTable.order-column tbody tr>.sorting_2,table.dataTable.order-column tbody tr>.sorting_3,table.dataTable.display tbody tr>.sorting_1,table.dataTable.display tbody tr>.sorting_2,table.dataTable.display tbody tr>.sorting_3{background-color:#fafafa}table.dataTable.order-column tbody tr.selected>.sorting_1,table.dataTable.order-column tbody tr.selected>.sorting_2,table.dataTable.order-column tbody tr.selected>.sorting_3,table.dataTable.display tbody tr.selected>.sorting_1,table.dataTable.display tbody tr.selected>.sorting_2,table.dataTable.display tbody tr.selected>.sorting_3{background-color:#acbad5}table.dataTable.display tbody tr.odd>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd>.sorting_1{background-color:#f1f1f1}table.dataTable.display tbody tr.odd>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd>.sorting_2{background-color:#f3f3f3}table.dataTable.display tbody tr.odd>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd>.sorting_3{background-color:whitesmoke}table.dataTable.display tbody tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_1{background-color:#a6b4cd}table.dataTable.display tbody tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_2{background-color:#a8b5cf}table.dataTable.display tbody tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_3{background-color:#a9b7d1}table.dataTable.display tbody tr.even>.sorting_1,table.dataTable.order-column.stripe tbody tr.even>.sorting_1{background-color:#fafafa}table.dataTable.display tbody tr.even>.sorting_2,table.dataTable.order-column.stripe tbody tr.even>.sorting_2{background-color:#fcfcfc}table.dataTable.display tbody tr.even>.sorting_3,table.dataTable.order-column.stripe tbody tr.even>.sorting_3{background-color:#fefefe}table.dataTable.display tbody tr.even.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_1{background-color:#acbad5}table.dataTable.display tbody tr.even.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_2{background-color:#aebcd6}table.dataTable.display tbody tr.even.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_3{background-color:#afbdd8}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1{background-color:#eaeaea}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2{background-color:#ececec}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3{background-color:#efefef}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1{background-color:#a2aec7}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2{background-color:#a3b0c9}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3{background-color:#a5b2cb}table.dataTable.no-footer{border-bottom:1px solid #111}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable.compact thead th,table.dataTable.compact thead td{padding:4px 17px 4px 4px}table.dataTable.compact tfoot th,table.dataTable.compact tfoot td{padding:4px}table.dataTable.compact tbody th,table.dataTable.compact tbody td{padding:4px}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable,table.dataTable th,table.dataTable td{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.dataTables_wrapper{position:relative;clear:both;*zoom:1;zoom:1}.dataTables_wrapper .dataTables_length{float:left}.dataTables_wrapper .dataTables_filter{float:right;text-align:right}.dataTables_wrapper .dataTables_filter input{margin-left:0.5em}.dataTables_wrapper .dataTables_info{clear:both;float:left;padding-top:0.755em}.dataTables_wrapper .dataTables_paginate{float:right;text-align:right;padding-top:0.25em}.dataTables_wrapper .dataTables_paginate .paginate_button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:0.5em 1em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;*cursor:hand;color:#333 !important;border:1px solid transparent;border-radius:2px}.dataTables_wrapper .dataTables_paginate .paginate_button.current,.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{color:#333 !important;border:1px solid #979797;background-color:white;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #fff), color-stop(100%, #dcdcdc));background:-webkit-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-moz-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-ms-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-o-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:linear-gradient(to bottom, #fff 0%, #dcdcdc 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button.disabled,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{cursor:default;color:#666 !important;border:1px solid transparent;background:transparent;box-shadow:none}.dataTables_wrapper .dataTables_paginate .paginate_button:hover{color:white !important;border:1px solid #111;background-color:#585858;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));background:-webkit-linear-gradient(top, #585858 0%, #111 100%);background:-moz-linear-gradient(top, #585858 0%, #111 100%);background:-ms-linear-gradient(top, #585858 0%, #111 100%);background:-o-linear-gradient(top, #585858 0%, #111 100%);background:linear-gradient(to bottom, #585858 0%, #111 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button:active{outline:none;background-color:#2b2b2b;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));background:-webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);box-shadow:inset 0 0 3px #111}.dataTables_wrapper .dataTables_paginate .ellipsis{padding:0 1em}.dataTables_wrapper .dataTables_processing{position:absolute;top:50%;left:50%;width:100%;height:40px;margin-left:-50%;margin-top:-25px;padding-top:20px;text-align:center;font-size:1.2em;background-color:white;background:-webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255,255,255,0)), color-stop(25%, rgba(255,255,255,0.9)), color-stop(75%, rgba(255,255,255,0.9)), color-stop(100%, rgba(255,255,255,0)));background:-webkit-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-moz-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-ms-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-o-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:linear-gradient(to right, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%)}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_processing,.dataTables_wrapper .dataTables_paginate{color:#333}.dataTables_wrapper .dataTables_scroll{clear:both}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody{*margin-top:-1px;-webkit-overflow-scrolling:touch}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody td>div.dataTables_sizing{height:0;overflow:hidden;margin:0 !important;padding:0 !important}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:1px solid #111}.dataTables_wrapper.no-footer div.dataTables_scrollHead table,.dataTables_wrapper.no-footer div.dataTables_scrollBody table{border-bottom:none}.dataTables_wrapper:after{visibility:hidden;display:block;content:"";clear:both;height:0}@media screen and (max-width: 767px){.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_paginate{float:none;text-align:center}.dataTables_wrapper .dataTables_paginate{margin-top:0.5em}}@media screen and (max-width: 640px){.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter{float:none;text-align:center}.dataTables_wrapper .dataTables_filter{margin-top:0.5em}} + + +table.dataTable tbody td, +table.dataTable tbody th { + position: relative; +} + +div.dt-autofill-handle { + position: absolute; + bottom: 0; + right: 0; + height: 8px; + width: 8px; + z-index: 1; + box-sizing: border-box; + border: 1px solid #316ad1; + background: linear-gradient(to bottom, #abcffb 0%, #4989de 100%); +} + +td.focus div.dt-autofill-handle { + bottom: -4px; + right: -5px; +} + +div.dt-autofill-select { + position: absolute; + z-index: 1001; + background-color: #4989de; + background-image: repeating-linear-gradient(45deg, transparent, transparent 5px, rgba(255, 255, 255, 0.5) 5px, rgba(255, 255, 255, 0.5) 10px); +} +div.dt-autofill-select.top, div.dt-autofill-select.bottom { + height: 3px; + margin-top: -1px; +} +div.dt-autofill-select.left, div.dt-autofill-select.right { + width: 3px; + margin-left: -1px; +} + +div.dt-autofill-list { + position: fixed; + top: 50%; + left: 50%; + width: 500px; + margin-left: -250px; + background-color: white; + border-radius: 6px; + box-shadow: 0 0 5px #555; + border: 2px solid #444; + z-index: 11; + box-sizing: border-box; + padding: 1.5em 2em; +} +div.dt-autofill-list ul { + display: table; + margin: 0; + padding: 0; + list-style: none; + width: 100%; +} +div.dt-autofill-list ul li { + display: table-row; +} +div.dt-autofill-list ul li:last-child div.dt-autofill-question, div.dt-autofill-list ul li:last-child div.dt-autofill-button { + border-bottom: none; +} +div.dt-autofill-list ul li:hover { + background-color: #f6f6f6; +} +div.dt-autofill-list div.dt-autofill-question { + display: table-cell; + padding: 0.5em 0; + border-bottom: 1px solid #ccc; +} +div.dt-autofill-list div.dt-autofill-question input[type=number] { + padding: 6px; + width: 30px; + margin: -2px 0; +} +div.dt-autofill-list div.dt-autofill-button { + display: table-cell; + padding: 0.5em 0; + border-bottom: 1px solid #ccc; +} +div.dt-autofill-list div.dt-autofill-button button { + color: white; + margin: 0; + padding: 6px 12px; + text-align: center; + border: 1px solid #2e6da4; + background-color: #337ab7; + border-radius: 4px; + cursor: pointer; + vertical-align: middle; +} + +div.dt-autofill-background { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(0, 0, 0, 0.7); + background: radial-gradient(ellipse farthest-corner at center, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%); + z-index: 10; +} + + +div.dt-button-info{position:fixed;top:50%;left:50%;width:400px;margin-top:-100px;margin-left:-200px;background-color:white;border:2px solid #111;box-shadow:3px 3px 8px rgba(0,0,0,0.3);border-radius:3px;text-align:center;z-index:21}div.dt-button-info h2{padding:0.5em;margin:0;font-weight:normal;border-bottom:1px solid #ddd;background-color:#f3f3f3}div.dt-button-info>div{padding:1em}button.dt-button,div.dt-button,a.dt-button{position:relative;display:inline-block;box-sizing:border-box;margin-right:0.333em;padding:0.5em 1em;border:1px solid #999;border-radius:2px;cursor:pointer;font-size:0.88em;color:black;white-space:nowrap;overflow:hidden;background-color:#e9e9e9;background-image:-webkit-linear-gradient(top, #fff 0%, #e9e9e9 100%);background-image:-moz-linear-gradient(top, #fff 0%, #e9e9e9 100%);background-image:-ms-linear-gradient(top, #fff 0%, #e9e9e9 100%);background-image:-o-linear-gradient(top, #fff 0%, #e9e9e9 100%);background-image:linear-gradient(top, #fff 0%, #e9e9e9 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='white', EndColorStr='#e9e9e9');-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-decoration:none;outline:none}button.dt-button.disabled,div.dt-button.disabled,a.dt-button.disabled{color:#999;border:1px solid #d0d0d0;cursor:default;background-color:#f9f9f9;background-image:-webkit-linear-gradient(top, #fff 0%, #f9f9f9 100%);background-image:-moz-linear-gradient(top, #fff 0%, #f9f9f9 100%);background-image:-ms-linear-gradient(top, #fff 0%, #f9f9f9 100%);background-image:-o-linear-gradient(top, #fff 0%, #f9f9f9 100%);background-image:linear-gradient(top, #fff 0%, #f9f9f9 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#ffffff', EndColorStr='#f9f9f9')}button.dt-button:active:not(.disabled),button.dt-button.active:not(.disabled),div.dt-button:active:not(.disabled),div.dt-button.active:not(.disabled),a.dt-button:active:not(.disabled),a.dt-button.active:not(.disabled){background-color:#e2e2e2;background-image:-webkit-linear-gradient(top, #f3f3f3 0%, #e2e2e2 100%);background-image:-moz-linear-gradient(top, #f3f3f3 0%, #e2e2e2 100%);background-image:-ms-linear-gradient(top, #f3f3f3 0%, #e2e2e2 100%);background-image:-o-linear-gradient(top, #f3f3f3 0%, #e2e2e2 100%);background-image:linear-gradient(top, #f3f3f3 0%, #e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#f3f3f3', EndColorStr='#e2e2e2');box-shadow:inset 1px 1px 3px #999999}button.dt-button:active:not(.disabled):hover:not(.disabled),button.dt-button.active:not(.disabled):hover:not(.disabled),div.dt-button:active:not(.disabled):hover:not(.disabled),div.dt-button.active:not(.disabled):hover:not(.disabled),a.dt-button:active:not(.disabled):hover:not(.disabled),a.dt-button.active:not(.disabled):hover:not(.disabled){box-shadow:inset 1px 1px 3px #999999;background-color:#cccccc;background-image:-webkit-linear-gradient(top, #eaeaea 0%, #ccc 100%);background-image:-moz-linear-gradient(top, #eaeaea 0%, #ccc 100%);background-image:-ms-linear-gradient(top, #eaeaea 0%, #ccc 100%);background-image:-o-linear-gradient(top, #eaeaea 0%, #ccc 100%);background-image:linear-gradient(top, #eaeaea 0%, #ccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#eaeaea', EndColorStr='#cccccc')}button.dt-button:hover,div.dt-button:hover,a.dt-button:hover{text-decoration:none}button.dt-button:hover:not(.disabled),div.dt-button:hover:not(.disabled),a.dt-button:hover:not(.disabled){border:1px solid #666;background-color:#e0e0e0;background-image:-webkit-linear-gradient(top, #f9f9f9 0%, #e0e0e0 100%);background-image:-moz-linear-gradient(top, #f9f9f9 0%, #e0e0e0 100%);background-image:-ms-linear-gradient(top, #f9f9f9 0%, #e0e0e0 100%);background-image:-o-linear-gradient(top, #f9f9f9 0%, #e0e0e0 100%);background-image:linear-gradient(top, #f9f9f9 0%, #e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#f9f9f9', EndColorStr='#e0e0e0')}button.dt-button:focus:not(.disabled),div.dt-button:focus:not(.disabled),a.dt-button:focus:not(.disabled){border:1px solid #426c9e;text-shadow:0 1px 0 #c4def1;outline:none;background-color:#79ace9;background-image:-webkit-linear-gradient(top, #bddef4 0%, #79ace9 100%);background-image:-moz-linear-gradient(top, #bddef4 0%, #79ace9 100%);background-image:-ms-linear-gradient(top, #bddef4 0%, #79ace9 100%);background-image:-o-linear-gradient(top, #bddef4 0%, #79ace9 100%);background-image:linear-gradient(top, #bddef4 0%, #79ace9 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#bddef4', EndColorStr='#79ace9')}.dt-button embed{outline:none}div.dt-buttons{position:relative;float:left}div.dt-buttons.buttons-right{float:right}div.dt-button-collection{position:absolute;top:0;left:0;width:150px;margin-top:3px;padding:8px 8px 4px 8px;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.4);background-color:white;overflow:hidden;z-index:2002;border-radius:5px;box-shadow:3px 3px 5px rgba(0,0,0,0.3);z-index:2002;-webkit-column-gap:8px;-moz-column-gap:8px;-ms-column-gap:8px;-o-column-gap:8px;column-gap:8px}div.dt-button-collection button.dt-button,div.dt-button-collection div.dt-button,div.dt-button-collection a.dt-button{position:relative;left:0;right:0;display:block;float:none;margin-bottom:4px;margin-right:0}div.dt-button-collection button.dt-button:active:not(.disabled),div.dt-button-collection button.dt-button.active:not(.disabled),div.dt-button-collection div.dt-button:active:not(.disabled),div.dt-button-collection div.dt-button.active:not(.disabled),div.dt-button-collection a.dt-button:active:not(.disabled),div.dt-button-collection a.dt-button.active:not(.disabled){background-color:#dadada;background-image:-webkit-linear-gradient(top, #f0f0f0 0%, #dadada 100%);background-image:-moz-linear-gradient(top, #f0f0f0 0%, #dadada 100%);background-image:-ms-linear-gradient(top, #f0f0f0 0%, #dadada 100%);background-image:-o-linear-gradient(top, #f0f0f0 0%, #dadada 100%);background-image:linear-gradient(top, #f0f0f0 0%, #dadada 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#f0f0f0', EndColorStr='#dadada');box-shadow:inset 1px 1px 3px #666}div.dt-button-collection.fixed{position:fixed;top:50%;left:50%;margin-left:-75px}div.dt-button-collection.fixed.two-column{margin-left:-150px}div.dt-button-collection.fixed.three-column{margin-left:-225px}div.dt-button-collection.fixed.four-column{margin-left:-300px}div.dt-button-collection>*{-webkit-column-break-inside:avoid;break-inside:avoid}div.dt-button-collection.two-column{width:300px;padding-bottom:1px;-webkit-column-count:2;-moz-column-count:2;-ms-column-count:2;-o-column-count:2;column-count:2}div.dt-button-collection.three-column{width:450px;padding-bottom:1px;-webkit-column-count:3;-moz-column-count:3;-ms-column-count:3;-o-column-count:3;column-count:3}div.dt-button-collection.four-column{width:600px;padding-bottom:1px;-webkit-column-count:4;-moz-column-count:4;-ms-column-count:4;-o-column-count:4;column-count:4}div.dt-button-background{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.7);background:-ms-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-moz-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-o-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-webkit-gradient(radial, center center, 0, center center, 497, color-stop(0, rgba(0,0,0,0.3)), color-stop(1, rgba(0,0,0,0.7)));background:-webkit-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:radial-gradient(ellipse farthest-corner at center, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);z-index:2001}@media screen and (max-width: 640px){div.dt-buttons{float:none !important;text-align:center}} + + +table.DTCR_clonedTable{background-color:rgba(255,255,255,0.7);z-index:202}div.DTCR_pointer{width:1px;background-color:#0259C4;z-index:201} + + +table.DTFC_Cloned thead,table.DTFC_Cloned tfoot{background-color:white}div.DTFC_Blocker{background-color:white}div.DTFC_LeftWrapper table.dataTable,div.DTFC_RightWrapper table.dataTable{margin-bottom:0;z-index:2}div.DTFC_LeftWrapper table.dataTable.no-footer,div.DTFC_RightWrapper table.dataTable.no-footer{border-bottom:none} + + +table.fixedHeader-floating{position:fixed;background-color:white}table.fixedHeader-floating.no-footer{border-bottom-width:0}table.fixedHeader-locked{position:absolute;background-color:white}table.fixedHeader-locked{position:absolute;background-color:white} + + +div.DTS tbody th,div.DTS tbody td{white-space:nowrap}div.DTS tbody tr.even{background-color:white}div.DTS div.DTS_Loading{z-index:1}div.DTS div.dataTables_scrollBody{background:repeating-linear-gradient(45deg, #edeeff, #edeeff 10px, #fff 10px, #fff 20px)}div.DTS div.dataTables_scrollBody table{z-index:2}div.DTS div.dataTables_paginate{display:none} + + +table.dataTable tbody>tr.selected,table.dataTable tbody>tr>.selected{background-color:#B0BED9}table.dataTable.stripe tbody>tr.odd.selected,table.dataTable.stripe tbody>tr.odd>.selected,table.dataTable.display tbody>tr.odd.selected,table.dataTable.display tbody>tr.odd>.selected{background-color:#acbad4}table.dataTable.hover tbody>tr.selected:hover,table.dataTable.hover tbody>tr>.selected:hover,table.dataTable.display tbody>tr.selected:hover,table.dataTable.display tbody>tr>.selected:hover{background-color:#aab7d1}table.dataTable.order-column tbody>tr.selected>.sorting_1,table.dataTable.order-column tbody>tr.selected>.sorting_2,table.dataTable.order-column tbody>tr.selected>.sorting_3,table.dataTable.order-column tbody>tr>.selected,table.dataTable.display tbody>tr.selected>.sorting_1,table.dataTable.display tbody>tr.selected>.sorting_2,table.dataTable.display tbody>tr.selected>.sorting_3,table.dataTable.display tbody>tr>.selected{background-color:#acbad5}table.dataTable.display tbody>tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe tbody>tr.odd.selected>.sorting_1{background-color:#a6b4cd}table.dataTable.display tbody>tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe tbody>tr.odd.selected>.sorting_2{background-color:#a8b5cf}table.dataTable.display tbody>tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe tbody>tr.odd.selected>.sorting_3{background-color:#a9b7d1}table.dataTable.display tbody>tr.even.selected>.sorting_1,table.dataTable.order-column.stripe tbody>tr.even.selected>.sorting_1{background-color:#acbad5}table.dataTable.display tbody>tr.even.selected>.sorting_2,table.dataTable.order-column.stripe tbody>tr.even.selected>.sorting_2{background-color:#aebcd6}table.dataTable.display tbody>tr.even.selected>.sorting_3,table.dataTable.order-column.stripe tbody>tr.even.selected>.sorting_3{background-color:#afbdd8}table.dataTable.display tbody>tr.odd>.selected,table.dataTable.order-column.stripe tbody>tr.odd>.selected{background-color:#a6b4cd}table.dataTable.display tbody>tr.even>.selected,table.dataTable.order-column.stripe tbody>tr.even>.selected{background-color:#acbad5}table.dataTable.display tbody>tr.selected:hover>.sorting_1,table.dataTable.order-column.hover tbody>tr.selected:hover>.sorting_1{background-color:#a2aec7}table.dataTable.display tbody>tr.selected:hover>.sorting_2,table.dataTable.order-column.hover tbody>tr.selected:hover>.sorting_2{background-color:#a3b0c9}table.dataTable.display tbody>tr.selected:hover>.sorting_3,table.dataTable.order-column.hover tbody>tr.selected:hover>.sorting_3{background-color:#a5b2cb}table.dataTable.display tbody>tr:hover>.selected,table.dataTable.display tbody>tr>.selected:hover,table.dataTable.order-column.hover tbody>tr:hover>.selected,table.dataTable.order-column.hover tbody>tr>.selected:hover{background-color:#a2aec7}table.dataTable td.select-checkbox{position:relative}table.dataTable td.select-checkbox:before,table.dataTable td.select-checkbox:after{display:block;position:absolute;top:1.2em;left:50%;width:12px;height:12px;box-sizing:border-box}table.dataTable td.select-checkbox:before{content:' ';margin-top:-6px;margin-left:-6px;border:1px solid black;border-radius:3px}table.dataTable tr.selected td.select-checkbox:after{content:'\2714';margin-top:-11px;margin-left:-4px;text-align:center;text-shadow:1px 1px #B0BED9, -1px -1px #B0BED9, 1px -1px #B0BED9, -1px 1px #B0BED9}div.dataTables_wrapper span.select-info,div.dataTables_wrapper span.select-item{margin-left:0.5em}@media screen and (max-width: 640px){div.dataTables_wrapper span.select-info,div.dataTables_wrapper span.select-item{margin-left:0;display:block}} + + diff --git a/app_v3satdemo/chrome/content/web/css/glyphicons-bootstrap.css b/app_v3satdemo/chrome/content/web/css/glyphicons-bootstrap.css new file mode 100644 index 0000000..e5e95f9 --- /dev/null +++ b/app_v3satdemo/chrome/content/web/css/glyphicons-bootstrap.css @@ -0,0 +1,27 @@ +/* + * BOOTSTRAP HELPER + */ +.btn .glyphicons, +.btn .halflings, +.btn .filetypes, +.btn .social{ + margin-right:.3em; +} +.dropdown-menu li .glyphicons, +.dropdown-menu li .halflings, +.dropdown-menu li .filetypes, +.dropdown-menu li .social{ + margin-right:.3em; +} +.list-group .list-group-item .glyphicons, +.list-group .list-group-item .halflings, +.list-group .list-group-item .filetypes, +.list-group .list-group-item .social{ + margin-right:.5em; +} + +a.btn +{ +line-height: 1.28; +} + diff --git a/app_v3satdemo/chrome/content/web/css/glyphicons-halflings.css b/app_v3satdemo/chrome/content/web/css/glyphicons-halflings.css new file mode 100644 index 0000000..6aa27e5 --- /dev/null +++ b/app_v3satdemo/chrome/content/web/css/glyphicons-halflings.css @@ -0,0 +1,1062 @@ +@font-face { + font-family: 'Glyphicons Halflings'; + src: url('../fonts/glyphicons-halflings-regular.eot'); + src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); +} +.halflings { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: normal; + line-height: 1; + vertical-align: top; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.halflings.x05 { + font-size: 6px; +} +.halflings.x2 { + font-size: 24px; +} +.halflings.x3 { + font-size: 36px; +} +.halflings.x4 { + font-size: 48px; +} +.halflings.x5 { + font-size: 60px; +} +.halflings.x6 { + font-size: 72px; +} +.halflings.x7 { + font-size: 84px; +} +.halflings.x8 { + font-size: 96px; +} +.halflings.light:before { + color: #f2f2f2; +} +.halflings.drop:before { + text-shadow: -1px 1px 3px rgba(0, 0, 0, 0.3); +} +.halflings.flip { + -moz-transform: scaleX(-1); + -o-transform: scaleX(-1); + -webkit-transform: scaleX(-1); + transform: scaleX(-1); + filter: FlipH; + -ms-filter: "FlipH"; +} +.halflings.flipv { + -moz-transform: scaleY(-1); + -o-transform: scaleY(-1); + -webkit-transform: scaleY(-1); + transform: scaleY(-1); + filter: FlipV; + -ms-filter: "FlipV"; +} +.halflings.rotate90 { + -webkit-transform: rotate(90deg); + -moz-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); +} +.halflings.rotate180 { + -webkit-transform: rotate(180deg); + -moz-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); +} +.halflings.rotate270 { + -webkit-transform: rotate(270deg); + -moz-transform: rotate(270deg); + -ms-transform: rotate(270deg); + transform: rotate(270deg); +} +.halflings-glass:before { + content: "\E001"; +} +.halflings-music:before { + content: "\E002"; +} +.halflings-search:before { + content: "\E003"; +} +.halflings-envelope:before { + content: "\2709"; +} +.halflings-heart:before { + content: "\E005"; +} +.halflings-star:before { + content: "\E006"; +} +.halflings-star-empty:before { + content: "\E007"; +} +.halflings-user:before { + content: "\E008"; +} +.halflings-film:before { + content: "\E009"; +} +.halflings-th-large:before { + content: "\E010"; +} +.halflings-th:before { + content: "\E011"; +} +.halflings-th-list:before { + content: "\E012"; +} +.halflings-ok:before { + content: "\E013"; +} +.halflings-remove:before { + content: "\E014"; +} +.halflings-zoom-in:before { + content: "\E015"; +} +.halflings-zoom-out:before { + content: "\E016"; +} +.halflings-off:before { + content: "\E017"; +} +.halflings-signal:before { + content: "\E018"; +} +.halflings-cog:before { + content: "\E019"; +} +.halflings-trash:before { + content: "\E020"; +} +.halflings-home:before { + content: "\E021"; +} +.halflings-file:before { + content: "\E022"; +} +.halflings-time:before { + content: "\E023"; +} +.halflings-road:before { + content: "\E024"; +} +.halflings-download-alt:before { + content: "\E025"; +} +.halflings-download:before { + content: "\E026"; +} +.halflings-upload:before { + content: "\E027"; +} +.halflings-inbox:before { + content: "\E028"; +} +.halflings-play-circle:before { + content: "\E029"; +} +.halflings-repeat:before { + content: "\E030"; +} +.halflings-refresh:before { + content: "\E031"; +} +.halflings-list-alt:before { + content: "\E032"; +} +.halflings-glyph-lock:before { + content: "\E033"; +} +.halflings-flag:before { + content: "\E034"; +} +.halflings-headphones:before { + content: "\E035"; +} +.halflings-volume-off:before { + content: "\E036"; +} +.halflings-volume-down:before { + content: "\E037"; +} +.halflings-volume-up:before { + content: "\E038"; +} +.halflings-qrcode:before { + content: "\E039"; +} +.halflings-barcode:before { + content: "\E040"; +} +.halflings-tag:before { + content: "\E041"; +} +.halflings-tags:before { + content: "\E042"; +} +.halflings-book:before { + content: "\E043"; +} +.halflings-glyph-bookmark:before { + content: "\E044"; +} +.halflings-print:before { + content: "\E045"; +} +.halflings-glyph-camera:before { + content: "\E046"; +} +.halflings-font:before { + content: "\E047"; +} +.halflings-bold:before { + content: "\E048"; +} +.halflings-italic:before { + content: "\E049"; +} +.halflings-text-height:before { + content: "\E050"; +} +.halflings-text-width:before { + content: "\E051"; +} +.halflings-align-left:before { + content: "\E052"; +} +.halflings-align-center:before { + content: "\E053"; +} +.halflings-align-right:before { + content: "\E054"; +} +.halflings-align-justify:before { + content: "\E055"; +} +.halflings-list:before { + content: "\E056"; +} +.halflings-indent-left:before { + content: "\E057"; +} +.halflings-indent-right:before { + content: "\E058"; +} +.halflings-facetime-video:before { + content: "\E059"; +} +.halflings-picture:before { + content: "\E060"; +} +.halflings-pencil:before { + content: "\270F"; +} +.halflings-map-marker:before { + content: "\E062"; +} +.halflings-adjust:before { + content: "\E063"; +} +.halflings-tint:before { + content: "\E064"; +} +.halflings-edit:before { + content: "\E065"; +} +.halflings-share:before { + content: "\E066"; +} +.halflings-check:before { + content: "\E067"; +} +.halflings-move:before { + content: "\E068"; +} +.halflings-step-backward:before { + content: "\E069"; +} +.halflings-fast-backward:before { + content: "\E070"; +} +.halflings-backward:before { + content: "\E071"; +} +.halflings-play:before { + content: "\E072"; +} +.halflings-pause:before { + content: "\E073"; +} +.halflings-stop:before { + content: "\E074"; +} +.halflings-forward:before { + content: "\E075"; +} +.halflings-fast-forward:before { + content: "\E076"; +} +.halflings-step-forward:before { + content: "\E077"; +} +.halflings-eject:before { + content: "\E078"; +} +.halflings-chevron-left:before { + content: "\E079"; +} +.halflings-chevron-right:before { + content: "\E080"; +} +.halflings-plus-sign:before { + content: "\E081"; +} +.halflings-minus-sign:before { + content: "\E082"; +} +.halflings-remove-sign:before { + content: "\E083"; +} +.halflings-ok-sign:before { + content: "\E084"; +} +.halflings-question-sign:before { + content: "\E085"; +} +.halflings-info-sign:before { + content: "\E086"; +} +.halflings-screenshot:before { + content: "\E087"; +} +.halflings-remove-circle:before { + content: "\E088"; +} +.halflings-ok-circle:before { + content: "\E089"; +} +.halflings-ban-circle:before { + content: "\E090"; +} +.halflings-arrow-left:before { + content: "\E091"; +} +.halflings-arrow-right:before { + content: "\E092"; +} +.halflings-arrow-up:before { + content: "\E093"; +} +.halflings-arrow-down:before { + content: "\E094"; +} +.halflings-share-alt:before { + content: "\E095"; +} +.halflings-resize-full:before { + content: "\E096"; +} +.halflings-resize-small:before { + content: "\E097"; +} +.halflings-plus:before { + content: "\002B"; +} +.halflings-minus:before { + content: "\2212"; +} +.halflings-asterisk:before { + content: "\002A"; +} +.halflings-exclamation-sign:before { + content: "\E101"; +} +.halflings-gift:before { + content: "\E102"; +} +.halflings-leaf:before { + content: "\E103"; +} +.halflings-glyph-fire:before { + content: "\E104"; +} +.halflings-eye-open:before { + content: "\E105"; +} +.halflings-eye-close:before { + content: "\E106"; +} +.halflings-warning-sign:before { + content: "\E107"; +} +.halflings-plane:before { + content: "\E108"; +} +.halflings-glyph-calendar:before { + content: "\E109"; +} +.halflings-random:before { + content: "\E110"; +} +.halflings-comments:before { + content: "\E111"; +} +.halflings-magnet:before { + content: "\E112"; +} +.halflings-chevron-up:before { + content: "\E113"; +} +.halflings-chevron-down:before { + content: "\E114"; +} +.halflings-retweet:before { + content: "\E115"; +} +.halflings-shopping-cart:before { + content: "\E116"; +} +.halflings-folder-close:before { + content: "\E117"; +} +.halflings-folder-open:before { + content: "\E118"; +} +.halflings-resize-vertical:before { + content: "\E119"; +} +.halflings-resize-horizontal:before { + content: "\E120"; +} +.halflings-hdd:before { + content: "\E121"; +} +.halflings-bullhorn:before { + content: "\E122"; +} +.halflings-glyph-bell:before { + content: "\E123"; +} +.halflings-certificate:before { + content: "\E124"; +} +.halflings-thumbs-up:before { + content: "\E125"; +} +.halflings-thumbs-down:before { + content: "\E126"; +} +.halflings-hand-right:before { + content: "\E127"; +} +.halflings-hand-left:before { + content: "\E128"; +} +.halflings-hand-top:before { + content: "\E129"; +} +.halflings-hand-down:before { + content: "\E130"; +} +.halflings-circle-arrow-right:before { + content: "\E131"; +} +.halflings-circle-arrow-left:before { + content: "\E132"; +} +.halflings-circle-arrow-top:before { + content: "\E133"; +} +.halflings-circle-arrow-down:before { + content: "\E134"; +} +.halflings-globe:before { + content: "\E135"; +} +.halflings-glyph-wrench:before { + content: "\E136"; +} +.halflings-tasks:before { + content: "\E137"; +} +.halflings-filter:before { + content: "\E138"; +} +.halflings-glyph-briefcase:before { + content: "\E139"; +} +.halflings-fullscreen:before { + content: "\E140"; +} +.halflings-dashboard:before { + content: "\E141"; +} +.halflings-glyph-paperclip:before { + content: "\E142"; +} +.halflings-heart-empty:before { + content: "\E143"; +} +.halflings-link:before { + content: "\E144"; +} +.halflings-phone:before { + content: "\E145"; +} +.halflings-glyph-pushpin:before { + content: "\E146"; +} +.halflings-euro:before { + content: "\20AC"; +} +.halflings-usd:before { + content: "\E148"; +} +.halflings-gbp:before { + content: "\E149"; +} +.halflings-sort:before { + content: "\E150"; +} +.halflings-sort-by-alphabet:before { + content: "\E151"; +} +.halflings-sort-by-alphabet-alt:before { + content: "\E152"; +} +.halflings-sort-by-order:before { + content: "\E153"; +} +.halflings-sort-by-order-alt:before { + content: "\E154"; +} +.halflings-sort-by-attributes:before { + content: "\E155"; +} +.halflings-sort-by-attributes-alt:before { + content: "\E156"; +} +.halflings-unchecked:before { + content: "\E157"; +} +.halflings-expand:before { + content: "\E158"; +} +.halflings-collapse:before { + content: "\E159"; +} +.halflings-collapse-top:before { + content: "\E160"; +} +.halflings-log-in:before { + content: "\E161"; +} +.halflings-flash:before { + content: "\E162"; +} +.halflings-log-out:before { + content: "\E163"; +} +.halflings-new-window:before { + content: "\E164"; +} +.halflings-record:before { + content: "\E165"; +} +.halflings-save:before { + content: "\E166"; +} +.halflings-open:before { + content: "\E167"; +} +.halflings-saved:before { + content: "\E168"; +} +.halflings-import:before { + content: "\E169"; +} +.halflings-export:before { + content: "\E170"; +} +.halflings-send:before { + content: "\E171"; +} +.halflings-floppy-disk:before { + content: "\E172"; +} +.halflings-floppy-saved:before { + content: "\E173"; +} +.halflings-floppy-remove:before { + content: "\E174"; +} +.halflings-floppy-save:before { + content: "\E175"; +} +.halflings-floppy-open:before { + content: "\E176"; +} +.halflings-credit-card:before { + content: "\E177"; +} +.halflings-transfer:before { + content: "\E178"; +} +.halflings-cutlery:before { + content: "\E179"; +} +.halflings-header:before { + content: "\E180"; +} +.halflings-compressed:before { + content: "\E181"; +} +.halflings-earphone:before { + content: "\E182"; +} +.halflings-phone-alt:before { + content: "\E183"; +} +.halflings-tower:before { + content: "\E184"; +} +.halflings-stats:before { + content: "\E185"; +} +.halflings-sd-video:before { + content: "\E186"; +} +.halflings-hd-video:before { + content: "\E187"; +} +.halflings-subtitles:before { + content: "\E188"; +} +.halflings-sound-stereo:before { + content: "\E189"; +} +.halflings-sound-dolby:before { + content: "\E190"; +} +.halflings-sound-5-1:before { + content: "\E191"; +} +.halflings-sound-6-1:before { + content: "\E192"; +} +.halflings-sound-7-1:before { + content: "\E193"; +} +.halflings-copyright-mark:before { + content: "\E194"; +} +.halflings-registration-mark:before { + content: "\E195"; +} +.halflings-cloud:before { + content: "\2601"; +} +.halflings-cloud-download:before { + content: "\E197"; +} +.halflings-cloud-upload:before { + content: "\E198"; +} +.halflings-tree-conifer:before { + content: "\E199"; +} +.halflings-tree-deciduous:before { + content: "\E200"; +} +.halflings-cd:before { + content: "\E201"; +} +.halflings-save-file:before { + content: "\E202"; +} +.halflings-open-file:before { + content: "\E203"; +} +.halflings-level-up:before { + content: "\E204"; +} +.halflings-copy:before { + content: "\E205"; +} +.halflings-paste:before { + content: "\E206"; +} +.halflings-door:before { + content: "\1F6AA"; +} +.halflings-key:before { + content: "\1F511"; +} +.halflings-alert:before { + content: "\E209"; +} +.halflings-equalizer:before { + content: "\E210"; +} +.halflings-king:before { + content: "\E211"; +} +.halflings-queen:before { + content: "\E212"; +} +.halflings-pawn:before { + content: "\E213"; +} +.halflings-bishop:before { + content: "\E214"; +} +.halflings-knight:before { + content: "\E215"; +} +.halflings-baby-formula:before { + content: "\E216"; +} +.halflings-tent:before { + content: "\26FA"; +} +.halflings-blackboard:before { + content: "\E218"; +} +.halflings-bed:before { + content: "\E219"; +} +.halflings-apple:before { + content: "\F8FF"; +} +.halflings-erase:before { + content: "\E221"; +} +.halflings-hourglass:before { + content: "\231B"; +} +.halflings-lamp:before { + content: "\E223"; +} +.halflings-duplicate:before { + content: "\E224"; +} +.halflings-piggy-bank:before { + content: "\E225"; +} +.halflings-scissors:before { + content: "\E226"; +} +.halflings-bitcoin:before { + content: "\E227"; +} +.halflings-yen:before { + content: "\00A5"; +} +.halflings-ruble:before { + content: "\20BD"; +} +.halflings-scale:before { + content: "\E230"; +} +.halflings-ice-lolly:before { + content: "\E231"; +} +.halflings-ice-lolly-tasted:before { + content: "\E232"; +} +.halflings-education:before { + content: "\E233"; +} +.halflings-option-horizontal:before { + content: "\E234"; +} +.halflings-option-vertical:before { + content: "\E235"; +} +.halflings-menu-hamburger:before { + content: "\E236"; +} +.halflings-modal-window:before { + content: "\E237"; +} +.halflings-oil:before { + content: "\E238"; +} +.halflings-grain:before { + content: "\E239"; +} +.halflings-sunglasses:before { + content: "\E240"; +} +.halflings-text-size:before { + content: "\E241"; +} +.halflings-text-color:before { + content: "\E242"; +} +.halflings-text-background:before { + content: "\E243"; +} +.halflings-object-align-top:before { + content: "\E244"; +} +.halflings-object-align-bottom:before { + content: "\E245"; +} +.halflings-object-align-horizontal:before { + content: "\E246"; +} +.halflings-object-align-left:before { + content: "\E247"; +} +.halflings-object-align-vertical:before { + content: "\E248"; +} +.halflings-object-align-right:before { + content: "\E249"; +} +.halflings-triangle-right:before { + content: "\E250"; +} +.halflings-triangle-left:before { + content: "\E251"; +} +.halflings-triangle-bottom:before { + content: "\E252"; +} +.halflings-triangle-top:before { + content: "\E253"; +} +.halflings-terminal:before { + content: "\E254"; +} +.halflings-superscript:before { + content: "\E255"; +} +.halflings-subscript:before { + content: "\E256"; +} +.halflings-menu-left:before { + content: "\E257"; +} +.halflings-menu-right:before { + content: "\E258"; +} +.halflings-menu-down:before { + content: "\E259"; +} +.halflings-menu-up:before { + content: "\E260"; +} +/* +* +* THIS IS A SMALL BONUS FOR ALL CURIOUS PEOPLE :) +* Just add class .animated and .pulse, .rotateIn, .bounce, .swing or .tada to you HTML element with icons. You may find other great css animations here: http://coveloping.com/tools/css-animation-generator +* +*/ +.animated { + -webkit-animation-duration: 1s; + animation-duration: 1s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + animation-iteration-count: infinite; + -webkit-animation-iteration-count: infinite; +} +@-webkit-keyframes pulse { + 0% { + -webkit-transform: scale(1); + } + 50% { + -webkit-transform: scale(1.1); + } + 100% { + -webkit-transform: scale(1); + } +} +@keyframes pulse { + 0% { + transform: scale(1); + } + 50% { + transform: scale(1.1); + } + 100% { + transform: scale(1); + } +} +.pulse { + -webkit-animation-name: pulse; + animation-name: pulse; +} +@-webkit-keyframes rotateIn { + 0% { + -webkit-transform-origin: center center; + -webkit-transform: rotate(-200deg); + opacity: 0; + } + 100% { + -webkit-transform-origin: center center; + -webkit-transform: rotate(0); + opacity: 1; + } +} +@keyframes rotateIn { + 0% { + transform-origin: center center; + transform: rotate(-200deg); + opacity: 0; + } + 100% { + transform-origin: center center; + transform: rotate(0); + opacity: 1; + } +} +.rotateIn { + -webkit-animation-name: rotateIn; + animation-name: rotateIn; +} +@-webkit-keyframes bounce { + 0%, + 20%, + 50%, + 80%, + 100% { + -webkit-transform: translateY(0); + } + 40% { + -webkit-transform: translateY(-30px); + } + 60% { + -webkit-transform: translateY(-15px); + } +} +@keyframes bounce { + 0%, + 20%, + 50%, + 80%, + 100% { + transform: translateY(0); + } + 40% { + transform: translateY(-30px); + } + 60% { + transform: translateY(-15px); + } +} +.bounce { + -webkit-animation-name: bounce; + animation-name: bounce; +} +@-webkit-keyframes swing { + 20%, + 40%, + 60%, + 80%, + 100% { + -webkit-transform-origin: top center; + } + 20% { + -webkit-transform: rotate(15deg); + } + 40% { + -webkit-transform: rotate(-10deg); + } + 60% { + -webkit-transform: rotate(5deg); + } + 80% { + -webkit-transform: rotate(-5deg); + } + 100% { + -webkit-transform: rotate(0deg); + } +} +@keyframes swing { + 20% { + transform: rotate(15deg); + } + 40% { + transform: rotate(-10deg); + } + 60% { + transform: rotate(5deg); + } + 80% { + transform: rotate(-5deg); + } + 100% { + transform: rotate(0deg); + } +} +.swing { + -webkit-transform-origin: top center; + transform-origin: top center; + -webkit-animation-name: swing; + animation-name: swing; +} +@-webkit-keyframes tada { + 0% { + -webkit-transform: scale(1); + } + 10%, + 20% { + -webkit-transform: scale(0.9) rotate(-3deg); + } + 30%, + 50%, + 70%, + 90% { + -webkit-transform: scale(1.1) rotate(3deg); + } + 40%, + 60%, + 80% { + -webkit-transform: scale(1.1) rotate(-3deg); + } + 100% { + -webkit-transform: scale(1) rotate(0); + } +} +@keyframes tada { + 0% { + transform: scale(1); + } + 10%, + 20% { + transform: scale(0.9) rotate(-3deg); + } + 30%, + 50%, + 70%, + 90% { + transform: scale(1.1) rotate(3deg); + } + 40%, + 60%, + 80% { + transform: scale(1.1) rotate(-3deg); + } + 100% { + transform: scale(1) rotate(0); + } +} +.tada { + -webkit-animation-name: tada; + animation-name: tada; +} diff --git a/app_v3satdemo/chrome/content/web/css/glyphicons.css b/app_v3satdemo/chrome/content/web/css/glyphicons.css new file mode 100644 index 0000000..cbb85cb --- /dev/null +++ b/app_v3satdemo/chrome/content/web/css/glyphicons.css @@ -0,0 +1 @@ +@font-face{font-family:'Glyphicons Regular';src:url('../fonts/glyphicons-regular.eot');src:url('../fonts/glyphicons-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-regular.woff2') format('woff2'),url('../fonts/glyphicons-regular.woff') format('woff'),url('../fonts/glyphicons-regular.ttf') format('truetype'),url('../fonts/glyphicons-regular.svg#glyphiconsregular') format('svg')}.glyphicons{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Regular';font-style:normal;font-weight:normal;line-height:1;vertical-align:top;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicons.x05{font-size:12px}.glyphicons.x2{font-size:48px}.glyphicons.x3{font-size:72px}.glyphicons.x4{font-size:96px}.glyphicons.x5{font-size:120px}.glyphicons.light:before{color:#f2f2f2}.glyphicons.drop:before{text-shadow:-1px 1px 3px rgba(0,0,0,0.3)}.glyphicons.flip{-moz-transform:scaleX(-1);-o-transform:scaleX(-1);-webkit-transform:scaleX(-1);transform:scaleX(-1);filter:FlipH;-ms-filter:"FlipH"}.glyphicons.flipv{-moz-transform:scaleY(-1);-o-transform:scaleY(-1);-webkit-transform:scaleY(-1);transform:scaleY(-1);filter:FlipV;-ms-filter:"FlipV"}.glyphicons.rotate90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.glyphicons.rotate180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.glyphicons.rotate270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.glyphicons-glass:before{content:"\E001"}.glyphicons-leaf:before{content:"\E002"}.glyphicons-dog:before{content:"\E003"}.glyphicons-user:before{content:"\E004"}.glyphicons-girl:before{content:"\E005"}.glyphicons-car:before{content:"\E006"}.glyphicons-user-add:before{content:"\E007"}.glyphicons-user-remove:before{content:"\E008"}.glyphicons-film:before{content:"\E009"}.glyphicons-magic:before{content:"\E010"}.glyphicons-envelope:before{content:"\2709"}.glyphicons-camera:before{content:"\E011"}.glyphicons-heart:before{content:"\E013"}.glyphicons-beach-umbrella:before{content:"\E014"}.glyphicons-train:before{content:"\E015"}.glyphicons-print:before{content:"\E016"}.glyphicons-bin:before{content:"\E017"}.glyphicons-music:before{content:"\E018"}.glyphicons-note:before{content:"\E019"}.glyphicons-heart-empty:before{content:"\E020"}.glyphicons-home:before{content:"\E021"}.glyphicons-snowflake:before{content:"\2744"}.glyphicons-fire:before{content:"\E023"}.glyphicons-magnet:before{content:"\E024"}.glyphicons-parents:before{content:"\E025"}.glyphicons-binoculars:before{content:"\E026"}.glyphicons-road:before{content:"\E027"}.glyphicons-search:before{content:"\E028"}.glyphicons-cars:before{content:"\E029"}.glyphicons-notes-2:before{content:"\E030"}.glyphicons-pencil:before{content:"\270F"}.glyphicons-bus:before{content:"\E032"}.glyphicons-wifi-alt:before{content:"\E033"}.glyphicons-luggage:before{content:"\E034"}.glyphicons-old-man:before{content:"\E035"}.glyphicons-woman:before{content:"\E036"}.glyphicons-file:before{content:"\E037"}.glyphicons-coins:before{content:"\E038"}.glyphicons-airplane:before{content:"\2708"}.glyphicons-notes:before{content:"\E040"}.glyphicons-stats:before{content:"\E041"}.glyphicons-charts:before{content:"\E042"}.glyphicons-pie-chart:before{content:"\E043"}.glyphicons-group:before{content:"\E044"}.glyphicons-keys:before{content:"\E045"}.glyphicons-calendar:before{content:"\E046"}.glyphicons-router:before{content:"\E047"}.glyphicons-camera-small:before{content:"\E048"}.glyphicons-star-empty:before{content:"\E049"}.glyphicons-star:before{content:"\E050"}.glyphicons-link:before{content:"\E051"}.glyphicons-eye-open:before{content:"\E052"}.glyphicons-eye-close:before{content:"\E053"}.glyphicons-alarm:before{content:"\E054"}.glyphicons-clock:before{content:"\E055"}.glyphicons-stopwatch:before{content:"\E056"}.glyphicons-projector:before{content:"\E057"}.glyphicons-history:before{content:"\E058"}.glyphicons-truck:before{content:"\E059"}.glyphicons-cargo:before{content:"\E060"}.glyphicons-compass:before{content:"\E061"}.glyphicons-keynote:before{content:"\E062"}.glyphicons-paperclip:before{content:"\E063"}.glyphicons-power:before{content:"\E064"}.glyphicons-lightbulb:before{content:"\E065"}.glyphicons-tag:before{content:"\E066"}.glyphicons-tags:before{content:"\E067"}.glyphicons-cleaning:before{content:"\E068"}.glyphicons-ruler:before{content:"\E069"}.glyphicons-gift:before{content:"\E070"}.glyphicons-umbrella:before{content:"\2602"}.glyphicons-book:before{content:"\E072"}.glyphicons-bookmark:before{content:"\E073"}.glyphicons-wifi:before{content:"\E074"}.glyphicons-cup:before{content:"\E075"}.glyphicons-stroller:before{content:"\E076"}.glyphicons-headphones:before{content:"\E077"}.glyphicons-headset:before{content:"\E078"}.glyphicons-warning-sign:before{content:"\E079"}.glyphicons-signal:before{content:"\E080"}.glyphicons-retweet:before{content:"\E081"}.glyphicons-refresh:before{content:"\E082"}.glyphicons-roundabout:before{content:"\E083"}.glyphicons-random:before{content:"\E084"}.glyphicons-heat:before{content:"\E085"}.glyphicons-repeat:before{content:"\E086"}.glyphicons-display:before{content:"\E087"}.glyphicons-log-book:before{content:"\E088"}.glyphicons-address-book:before{content:"\E089"}.glyphicons-building:before{content:"\E090"}.glyphicons-eyedropper:before{content:"\E091"}.glyphicons-adjust:before{content:"\E092"}.glyphicons-tint:before{content:"\E093"}.glyphicons-crop:before{content:"\E094"}.glyphicons-vector-path-square:before{content:"\E095"}.glyphicons-vector-path-circle:before{content:"\E096"}.glyphicons-vector-path-polygon:before{content:"\E097"}.glyphicons-vector-path-line:before{content:"\E098"}.glyphicons-vector-path-curve:before{content:"\E099"}.glyphicons-vector-path-all:before{content:"\E100"}.glyphicons-font:before{content:"\E101"}.glyphicons-italic:before{content:"\E102"}.glyphicons-bold:before{content:"\E103"}.glyphicons-text-underline:before{content:"\E104"}.glyphicons-text-strike:before{content:"\E105"}.glyphicons-text-height:before{content:"\E106"}.glyphicons-text-width:before{content:"\E107"}.glyphicons-text-resize:before{content:"\E108"}.glyphicons-left-indent:before{content:"\E109"}.glyphicons-right-indent:before{content:"\E110"}.glyphicons-align-left:before{content:"\E111"}.glyphicons-align-center:before{content:"\E112"}.glyphicons-align-right:before{content:"\E113"}.glyphicons-justify:before{content:"\E114"}.glyphicons-list:before{content:"\E115"}.glyphicons-text-smaller:before{content:"\E116"}.glyphicons-text-bigger:before{content:"\E117"}.glyphicons-embed:before{content:"\E118"}.glyphicons-embed-close:before{content:"\E119"}.glyphicons-table:before{content:"\E120"}.glyphicons-message-full:before{content:"\E121"}.glyphicons-message-empty:before{content:"\E122"}.glyphicons-message-in:before{content:"\E123"}.glyphicons-message-out:before{content:"\E124"}.glyphicons-message-plus:before{content:"\E125"}.glyphicons-message-minus:before{content:"\E126"}.glyphicons-message-ban:before{content:"\E127"}.glyphicons-message-flag:before{content:"\E128"}.glyphicons-message-lock:before{content:"\E129"}.glyphicons-message-new:before{content:"\E130"}.glyphicons-inbox:before{content:"\E131"}.glyphicons-inbox-plus:before{content:"\E132"}.glyphicons-inbox-minus:before{content:"\E133"}.glyphicons-inbox-lock:before{content:"\E134"}.glyphicons-inbox-in:before{content:"\E135"}.glyphicons-inbox-out:before{content:"\E136"}.glyphicons-cogwheel:before{content:"\E137"}.glyphicons-cogwheels:before{content:"\E138"}.glyphicons-picture:before{content:"\E139"}.glyphicons-adjust-alt:before{content:"\E140"}.glyphicons-database-lock:before{content:"\E141"}.glyphicons-database-plus:before{content:"\E142"}.glyphicons-database-minus:before{content:"\E143"}.glyphicons-database-ban:before{content:"\E144"}.glyphicons-folder-open:before{content:"\E145"}.glyphicons-folder-plus:before{content:"\E146"}.glyphicons-folder-minus:before{content:"\E147"}.glyphicons-folder-lock:before{content:"\E148"}.glyphicons-folder-flag:before{content:"\E149"}.glyphicons-folder-new:before{content:"\E150"}.glyphicons-edit:before{content:"\E151"}.glyphicons-new-window:before{content:"\E152"}.glyphicons-check:before{content:"\E153"}.glyphicons-unchecked:before{content:"\E154"}.glyphicons-more-windows:before{content:"\E155"}.glyphicons-show-big-thumbnails:before{content:"\E156"}.glyphicons-show-thumbnails:before{content:"\E157"}.glyphicons-show-thumbnails-with-lines:before{content:"\E158"}.glyphicons-show-lines:before{content:"\E159"}.glyphicons-playlist:before{content:"\E160"}.glyphicons-imac:before{content:"\E161"}.glyphicons-macbook:before{content:"\E162"}.glyphicons-ipad:before{content:"\E163"}.glyphicons-iphone:before{content:"\E164"}.glyphicons-iphone-transfer:before{content:"\E165"}.glyphicons-iphone-exchange:before{content:"\E166"}.glyphicons-ipod:before{content:"\E167"}.glyphicons-ipod-shuffle:before{content:"\E168"}.glyphicons-ear-plugs:before{content:"\E169"}.glyphicons-record:before{content:"\E170"}.glyphicons-step-backward:before{content:"\E171"}.glyphicons-fast-backward:before{content:"\E172"}.glyphicons-rewind:before{content:"\E173"}.glyphicons-play:before{content:"\E174"}.glyphicons-pause:before{content:"\E175"}.glyphicons-stop:before{content:"\E176"}.glyphicons-forward:before{content:"\E177"}.glyphicons-fast-forward:before{content:"\E178"}.glyphicons-step-forward:before{content:"\E179"}.glyphicons-eject:before{content:"\E180"}.glyphicons-facetime-video:before{content:"\E181"}.glyphicons-download-alt:before{content:"\E182"}.glyphicons-mute:before{content:"\E183"}.glyphicons-volume-down:before{content:"\E184"}.glyphicons-volume-up:before{content:"\E185"}.glyphicons-screenshot:before{content:"\E186"}.glyphicons-move:before{content:"\E187"}.glyphicons-more:before{content:"\E188"}.glyphicons-brightness-reduce:before{content:"\E189"}.glyphicons-brightness-increase:before{content:"\E190"}.glyphicons-circle-plus:before{content:"\E191"}.glyphicons-circle-minus:before{content:"\E192"}.glyphicons-circle-remove:before{content:"\E193"}.glyphicons-circle-ok:before{content:"\E194"}.glyphicons-circle-question-mark:before{content:"\E195"}.glyphicons-circle-info:before{content:"\E196"}.glyphicons-circle-exclamation-mark:before{content:"\E197"}.glyphicons-remove:before{content:"\E198"}.glyphicons-ok:before{content:"\E199"}.glyphicons-ban:before{content:"\E200"}.glyphicons-download:before{content:"\E201"}.glyphicons-upload:before{content:"\E202"}.glyphicons-shopping-cart:before{content:"\E203"}.glyphicons-lock:before{content:"\E204"}.glyphicons-unlock:before{content:"\E205"}.glyphicons-electricity:before{content:"\E206"}.glyphicons-ok-2:before{content:"\E207"}.glyphicons-remove-2:before{content:"\E208"}.glyphicons-cart-out:before{content:"\E209"}.glyphicons-cart-in:before{content:"\E210"}.glyphicons-left-arrow:before{content:"\E211"}.glyphicons-right-arrow:before{content:"\E212"}.glyphicons-down-arrow:before{content:"\E213"}.glyphicons-up-arrow:before{content:"\E214"}.glyphicons-resize-small:before{content:"\E215"}.glyphicons-resize-full:before{content:"\E216"}.glyphicons-circle-arrow-left:before{content:"\E217"}.glyphicons-circle-arrow-right:before{content:"\E218"}.glyphicons-circle-arrow-top:before{content:"\E219"}.glyphicons-circle-arrow-down:before{content:"\E220"}.glyphicons-play-button:before{content:"\E221"}.glyphicons-unshare:before{content:"\E222"}.glyphicons-share:before{content:"\E223"}.glyphicons-chevron-right:before{content:"\E224"}.glyphicons-chevron-left:before{content:"\E225"}.glyphicons-bluetooth:before{content:"\E226"}.glyphicons-euro:before{content:"\20AC"}.glyphicons-usd:before{content:"\E228"}.glyphicons-gbp:before{content:"\E229"}.glyphicons-retweet-2:before{content:"\E230"}.glyphicons-moon:before{content:"\E231"}.glyphicons-sun:before{content:"\2609"}.glyphicons-cloud:before{content:"\2601"}.glyphicons-direction:before{content:"\E234"}.glyphicons-brush:before{content:"\E235"}.glyphicons-pen:before{content:"\E236"}.glyphicons-zoom-in:before{content:"\E237"}.glyphicons-zoom-out:before{content:"\E238"}.glyphicons-pin:before{content:"\E239"}.glyphicons-albums:before{content:"\E240"}.glyphicons-rotation-lock:before{content:"\E241"}.glyphicons-flash:before{content:"\E242"}.glyphicons-google-maps:before{content:"\E243"}.glyphicons-anchor:before{content:"\2693"}.glyphicons-conversation:before{content:"\E245"}.glyphicons-chat:before{content:"\E246"}.glyphicons-male:before{content:"\E247"}.glyphicons-female:before{content:"\E248"}.glyphicons-asterisk:before{content:"\002A"}.glyphicons-divide:before{content:"\00F7"}.glyphicons-snorkel-diving:before{content:"\E251"}.glyphicons-scuba-diving:before{content:"\E252"}.glyphicons-oxygen-bottle:before{content:"\E253"}.glyphicons-fins:before{content:"\E254"}.glyphicons-fishes:before{content:"\E255"}.glyphicons-boat:before{content:"\E256"}.glyphicons-delete:before{content:"\E257"}.glyphicons-sheriffs-star:before{content:"\E258"}.glyphicons-qrcode:before{content:"\E259"}.glyphicons-barcode:before{content:"\E260"}.glyphicons-pool:before{content:"\E261"}.glyphicons-buoy:before{content:"\E262"}.glyphicons-spade:before{content:"\E263"}.glyphicons-bank:before{content:"\E264"}.glyphicons-vcard:before{content:"\E265"}.glyphicons-electrical-plug:before{content:"\E266"}.glyphicons-flag:before{content:"\E267"}.glyphicons-credit-card:before{content:"\E268"}.glyphicons-keyboard-wireless:before{content:"\E269"}.glyphicons-keyboard-wired:before{content:"\E270"}.glyphicons-shield:before{content:"\E271"}.glyphicons-ring:before{content:"\02DA"}.glyphicons-cake:before{content:"\E273"}.glyphicons-drink:before{content:"\E274"}.glyphicons-beer:before{content:"\E275"}.glyphicons-fast-food:before{content:"\E276"}.glyphicons-cutlery:before{content:"\E277"}.glyphicons-pizza:before{content:"\E278"}.glyphicons-birthday-cake:before{content:"\E279"}.glyphicons-tablet:before{content:"\E280"}.glyphicons-settings:before{content:"\E281"}.glyphicons-bullets:before{content:"\E282"}.glyphicons-cardio:before{content:"\E283"}.glyphicons-t-shirt:before{content:"\E284"}.glyphicons-pants:before{content:"\E285"}.glyphicons-sweater:before{content:"\E286"}.glyphicons-fabric:before{content:"\E287"}.glyphicons-leather:before{content:"\E288"}.glyphicons-scissors:before{content:"\E289"}.glyphicons-bomb:before{content:"\E290"}.glyphicons-skull:before{content:"\E291"}.glyphicons-celebration:before{content:"\E292"}.glyphicons-tea-kettle:before{content:"\E293"}.glyphicons-french-press:before{content:"\E294"}.glyphicons-coffee-cup:before{content:"\E295"}.glyphicons-pot:before{content:"\E296"}.glyphicons-grater:before{content:"\E297"}.glyphicons-kettle:before{content:"\E298"}.glyphicons-hospital:before{content:"\E299"}.glyphicons-hospital-h:before{content:"\E300"}.glyphicons-microphone:before{content:"\E301"}.glyphicons-webcam:before{content:"\E302"}.glyphicons-temple-christianity-church:before{content:"\E303"}.glyphicons-temple-islam:before{content:"\E304"}.glyphicons-temple-hindu:before{content:"\E305"}.glyphicons-temple-buddhist:before{content:"\E306"}.glyphicons-bicycle:before{content:"\E307"}.glyphicons-life-preserver:before{content:"\E308"}.glyphicons-share-alt:before{content:"\E309"}.glyphicons-comments:before{content:"\E310"}.glyphicons-flower:before{content:"\2698"}.glyphicons-baseball:before{content:"\26BE"}.glyphicons-rugby:before{content:"\E313"}.glyphicons-ax:before{content:"\E314"}.glyphicons-table-tennis:before{content:"\E315"}.glyphicons-bowling:before{content:"\E316"}.glyphicons-tree-conifer:before{content:"\E317"}.glyphicons-tree-deciduous:before{content:"\E318"}.glyphicons-more-items:before{content:"\E319"}.glyphicons-sort:before{content:"\E320"}.glyphicons-filter:before{content:"\E321"}.glyphicons-gamepad:before{content:"\E322"}.glyphicons-playing-dices:before{content:"\E323"}.glyphicons-calculator:before{content:"\E324"}.glyphicons-tie:before{content:"\E325"}.glyphicons-wallet:before{content:"\E326"}.glyphicons-piano:before{content:"\E327"}.glyphicons-sampler:before{content:"\E328"}.glyphicons-podium:before{content:"\E329"}.glyphicons-soccer-ball:before{content:"\E330"}.glyphicons-blog:before{content:"\E331"}.glyphicons-dashboard:before{content:"\E332"}.glyphicons-certificate:before{content:"\E333"}.glyphicons-bell:before{content:"\E334"}.glyphicons-candle:before{content:"\E335"}.glyphicons-pushpin:before{content:"\E336"}.glyphicons-iphone-shake:before{content:"\E337"}.glyphicons-pin-flag:before{content:"\E338"}.glyphicons-turtle:before{content:"\E339"}.glyphicons-rabbit:before{content:"\E340"}.glyphicons-globe:before{content:"\E341"}.glyphicons-briefcase:before{content:"\E342"}.glyphicons-hdd:before{content:"\E343"}.glyphicons-thumbs-up:before{content:"\E344"}.glyphicons-thumbs-down:before{content:"\E345"}.glyphicons-hand-right:before{content:"\E346"}.glyphicons-hand-left:before{content:"\E347"}.glyphicons-hand-up:before{content:"\E348"}.glyphicons-hand-down:before{content:"\E349"}.glyphicons-fullscreen:before{content:"\E350"}.glyphicons-shopping-bag:before{content:"\E351"}.glyphicons-book-open:before{content:"\E352"}.glyphicons-nameplate:before{content:"\E353"}.glyphicons-nameplate-alt:before{content:"\E354"}.glyphicons-vases:before{content:"\E355"}.glyphicons-bullhorn:before{content:"\E356"}.glyphicons-dumbbell:before{content:"\E357"}.glyphicons-suitcase:before{content:"\E358"}.glyphicons-file-import:before{content:"\E359"}.glyphicons-file-export:before{content:"\E360"}.glyphicons-bug:before{content:"\E361"}.glyphicons-crown:before{content:"\E362"}.glyphicons-smoking:before{content:"\E363"}.glyphicons-cloud-download:before{content:"\E364"}.glyphicons-cloud-upload:before{content:"\E365"}.glyphicons-restart:before{content:"\E366"}.glyphicons-security-camera:before{content:"\E367"}.glyphicons-expand:before{content:"\E368"}.glyphicons-collapse:before{content:"\E369"}.glyphicons-collapse-top:before{content:"\E370"}.glyphicons-globe-af:before{content:"\E371"}.glyphicons-global:before{content:"\E372"}.glyphicons-spray:before{content:"\E373"}.glyphicons-nails:before{content:"\E374"}.glyphicons-claw-hammer:before{content:"\E375"}.glyphicons-classic-hammer:before{content:"\E376"}.glyphicons-hand-saw:before{content:"\E377"}.glyphicons-riflescope:before{content:"\E378"}.glyphicons-electrical-socket-eu:before{content:"\E379"}.glyphicons-electrical-socket-us:before{content:"\E380"}.glyphicons-message-forward:before{content:"\E381"}.glyphicons-coat-hanger:before{content:"\E382"}.glyphicons-dress:before{content:"\E383"}.glyphicons-bathrobe:before{content:"\E384"}.glyphicons-shirt:before{content:"\E385"}.glyphicons-underwear:before{content:"\E386"}.glyphicons-log-in:before{content:"\E387"}.glyphicons-log-out:before{content:"\E388"}.glyphicons-exit:before{content:"\E389"}.glyphicons-new-window-alt:before{content:"\E390"}.glyphicons-video-sd:before{content:"\E391"}.glyphicons-video-hd:before{content:"\E392"}.glyphicons-subtitles:before{content:"\E393"}.glyphicons-sound-stereo:before{content:"\E394"}.glyphicons-sound-dolby:before{content:"\E395"}.glyphicons-sound-5-1:before{content:"\E396"}.glyphicons-sound-6-1:before{content:"\E397"}.glyphicons-sound-7-1:before{content:"\E398"}.glyphicons-copyright-mark:before{content:"\E399"}.glyphicons-registration-mark:before{content:"\E400"}.glyphicons-radar:before{content:"\E401"}.glyphicons-skateboard:before{content:"\E402"}.glyphicons-golf-course:before{content:"\E403"}.glyphicons-sorting:before{content:"\E404"}.glyphicons-sort-by-alphabet:before{content:"\E405"}.glyphicons-sort-by-alphabet-alt:before{content:"\E406"}.glyphicons-sort-by-order:before{content:"\E407"}.glyphicons-sort-by-order-alt:before{content:"\E408"}.glyphicons-sort-by-attributes:before{content:"\E409"}.glyphicons-sort-by-attributes-alt:before{content:"\E410"}.glyphicons-compressed:before{content:"\E411"}.glyphicons-package:before{content:"\E412"}.glyphicons-cloud-plus:before{content:"\E413"}.glyphicons-cloud-minus:before{content:"\E414"}.glyphicons-disk-save:before{content:"\E415"}.glyphicons-disk-open:before{content:"\E416"}.glyphicons-disk-saved:before{content:"\E417"}.glyphicons-disk-remove:before{content:"\E418"}.glyphicons-disk-import:before{content:"\E419"}.glyphicons-disk-export:before{content:"\E420"}.glyphicons-tower:before{content:"\E421"}.glyphicons-send:before{content:"\E422"}.glyphicons-git-branch:before{content:"\E423"}.glyphicons-git-create:before{content:"\E424"}.glyphicons-git-private:before{content:"\E425"}.glyphicons-git-delete:before{content:"\E426"}.glyphicons-git-merge:before{content:"\E427"}.glyphicons-git-pull-request:before{content:"\E428"}.glyphicons-git-compare:before{content:"\E429"}.glyphicons-git-commit:before{content:"\E430"}.glyphicons-construction-cone:before{content:"\E431"}.glyphicons-shoe-steps:before{content:"\E432"}.glyphicons-plus:before{content:"\002B"}.glyphicons-minus:before{content:"\2212"}.glyphicons-redo:before{content:"\E435"}.glyphicons-undo:before{content:"\E436"}.glyphicons-golf:before{content:"\E437"}.glyphicons-hockey:before{content:"\E438"}.glyphicons-pipe:before{content:"\E439"}.glyphicons-wrench:before{content:"\E440"}.glyphicons-folder-closed:before{content:"\E441"}.glyphicons-phone-alt:before{content:"\E442"}.glyphicons-earphone:before{content:"\E443"}.glyphicons-floppy-disk:before{content:"\E444"}.glyphicons-floppy-saved:before{content:"\E445"}.glyphicons-floppy-remove:before{content:"\E446"}.glyphicons-floppy-save:before{content:"\E447"}.glyphicons-floppy-open:before{content:"\E448"}.glyphicons-translate:before{content:"\E449"}.glyphicons-fax:before{content:"\E450"}.glyphicons-factory:before{content:"\E451"}.glyphicons-shop-window:before{content:"\E452"}.glyphicons-shop:before{content:"\E453"}.glyphicons-kiosk:before{content:"\E454"}.glyphicons-kiosk-wheels:before{content:"\E455"}.glyphicons-kiosk-light:before{content:"\E456"}.glyphicons-kiosk-food:before{content:"\E457"}.glyphicons-transfer:before{content:"\E458"}.glyphicons-money:before{content:"\E459"}.glyphicons-header:before{content:"\E460"}.glyphicons-blacksmith:before{content:"\E461"}.glyphicons-saw-blade:before{content:"\E462"}.glyphicons-basketball:before{content:"\E463"}.glyphicons-server:before{content:"\E464"}.glyphicons-server-plus:before{content:"\E465"}.glyphicons-server-minus:before{content:"\E466"}.glyphicons-server-ban:before{content:"\E467"}.glyphicons-server-flag:before{content:"\E468"}.glyphicons-server-lock:before{content:"\E469"}.glyphicons-server-new:before{content:"\E470"}.glyphicons-charging-station:before{content:"\F471"}.glyphicons-gas-station:before{content:"\E472"}.glyphicons-target:before{content:"\E473"}.glyphicons-bed-alt:before{content:"\E474"}.glyphicons-mosquito-net:before{content:"\E475"}.glyphicons-dining-set:before{content:"\E476"}.glyphicons-plate-of-food:before{content:"\E477"}.glyphicons-hygiene-kit:before{content:"\E478"}.glyphicons-blackboard:before{content:"\E479"}.glyphicons-marriage:before{content:"\E480"}.glyphicons-bucket:before{content:"\E481"}.glyphicons-none-color-swatch:before{content:"\E482"}.glyphicons-bring-forward:before{content:"\E483"}.glyphicons-bring-to-front:before{content:"\E484"}.glyphicons-send-backward:before{content:"\E485"}.glyphicons-send-to-back:before{content:"\E486"}.glyphicons-fit-frame-to-image:before{content:"\E487"}.glyphicons-fit-image-to-frame:before{content:"\E488"}.glyphicons-multiple-displays:before{content:"\E489"}.glyphicons-handshake:before{content:"\E490"}.glyphicons-child:before{content:"\E491"}.glyphicons-baby-formula:before{content:"\E492"}.glyphicons-medicine:before{content:"\E493"}.glyphicons-atv-vehicle:before{content:"\E494"}.glyphicons-motorcycle:before{content:"\E495"}.glyphicons-bed:before{content:"\E496"}.glyphicons-tent:before{content:"\26FA"}.glyphicons-glasses:before{content:"\E498"}.glyphicons-sunglasses:before{content:"\E499"}.glyphicons-family:before{content:"\E500"}.glyphicons-education:before{content:"\E501"}.glyphicons-shoes:before{content:"\E502"}.glyphicons-map:before{content:"\E503"}.glyphicons-cd:before{content:"\E504"}.glyphicons-alert:before{content:"\E505"}.glyphicons-piggy-bank:before{content:"\E506"}.glyphicons-star-half:before{content:"\E507"}.glyphicons-cluster:before{content:"\E508"}.glyphicons-flowchart:before{content:"\E509"}.glyphicons-commodities:before{content:"\E510"}.glyphicons-duplicate:before{content:"\E511"}.glyphicons-copy:before{content:"\E512"}.glyphicons-paste:before{content:"\E513"}.glyphicons-bath-bathtub:before{content:"\E514"}.glyphicons-bath-shower:before{content:"\E515"}.glyphicons-shower:before{content:"\1F6BF"}.glyphicons-menu-hamburger:before{content:"\E517"}.glyphicons-option-vertical:before{content:"\E518"}.glyphicons-option-horizontal:before{content:"\E519"}.glyphicons-currency-conversion:before{content:"\E520"}.glyphicons-user-ban:before{content:"\E521"}.glyphicons-user-lock:before{content:"\E522"}.glyphicons-user-flag:before{content:"\E523"}.glyphicons-user-asterisk:before{content:"\E524"}.glyphicons-user-alert:before{content:"\E525"}.glyphicons-user-key:before{content:"\E526"}.glyphicons-user-conversation:before{content:"\E527"}.glyphicons-database:before{content:"\E528"}.glyphicons-database-search:before{content:"\E529"}.glyphicons-list-alt:before{content:"\E530"}.glyphicons-hazard-sign:before{content:"\E531"}.glyphicons-hazard:before{content:"\E532"}.glyphicons-stop-sign:before{content:"\E533"}.glyphicons-lab:before{content:"\E534"}.glyphicons-lab-alt:before{content:"\E535"}.glyphicons-ice-cream:before{content:"\E536"}.glyphicons-ice-lolly:before{content:"\E537"}.glyphicons-ice-lolly-tasted:before{content:"\E538"}.glyphicons-invoice:before{content:"\E539"}.glyphicons-cart-tick:before{content:"\E540"}.glyphicons-hourglass:before{content:"\231B"}.glyphicons-cat:before{content:"\1F408"}.glyphicons-lamp:before{content:"\E543"}.glyphicons-scale-classic:before{content:"\E544"}.glyphicons-eye-plus:before{content:"\E545"}.glyphicons-eye-minus:before{content:"\E546"}.glyphicons-quote:before{content:"\E547"}.glyphicons-bitcoin:before{content:"\E548"}.glyphicons-yen:before{content:"\00A5"}.glyphicons-ruble:before{content:"\20BD"}.glyphicons-erase:before{content:"\E551"}.glyphicons-podcast:before{content:"\E552"}.glyphicons-firework:before{content:"\E553"}.glyphicons-scale:before{content:"\E554"}.glyphicons-king:before{content:"\E555"}.glyphicons-queen:before{content:"\E556"}.glyphicons-pawn:before{content:"\E557"}.glyphicons-bishop:before{content:"\E558"}.glyphicons-knight:before{content:"\E559"}.glyphicons-mic-mute:before{content:"\E560"}.glyphicons-voicemail:before{content:"\E561"}.glyphicons-paragraph:before{content:"\00B6"}.glyphicons-person-walking:before{content:"\E563"}.glyphicons-person-wheelchair:before{content:"\E564"}.glyphicons-underground:before{content:"\E565"}.glyphicons-car-hov:before{content:"\E566"}.glyphicons-car-rental:before{content:"\E567"}.glyphicons-transport:before{content:"\E568"}.glyphicons-taxi:before{content:"\1F695"}.glyphicons-ice-cream-no:before{content:"\E570"}.glyphicons-uk-rat-u:before{content:"\E571"}.glyphicons-uk-rat-pg:before{content:"\E572"}.glyphicons-uk-rat-12a:before{content:"\E573"}.glyphicons-uk-rat-12:before{content:"\E574"}.glyphicons-uk-rat-15:before{content:"\E575"}.glyphicons-uk-rat-18:before{content:"\E576"}.glyphicons-uk-rat-r18:before{content:"\E577"}.glyphicons-tv:before{content:"\E578"}.glyphicons-sms:before{content:"\E579"}.glyphicons-mms:before{content:"\E580"}.glyphicons-us-rat-g:before{content:"\E581"}.glyphicons-us-rat-pg:before{content:"\E582"}.glyphicons-us-rat-pg-13:before{content:"\E583"}.glyphicons-us-rat-restricted:before{content:"\E584"}.glyphicons-us-rat-no-one-17:before{content:"\E585"}.glyphicons-equalizer:before{content:"\E586"}.glyphicons-speakers:before{content:"\E587"}.glyphicons-remote-control:before{content:"\E588"}.glyphicons-remote-control-tv:before{content:"\E589"}.glyphicons-shredder:before{content:"\E590"}.glyphicons-folder-heart:before{content:"\E591"}.glyphicons-person-running:before{content:"\E592"}.glyphicons-person:before{content:"\E593"}.glyphicons-voice:before{content:"\E594"}.glyphicons-stethoscope:before{content:"\E595"}.glyphicons-hotspot:before{content:"\E596"}.glyphicons-activity:before{content:"\E597"}.glyphicons-watch:before{content:"\231A"}.glyphicons-scissors-alt:before{content:"\E599"}.glyphicons-car-wheel:before{content:"\E600"}.glyphicons-chevron-up:before{content:"\E601"}.glyphicons-chevron-down:before{content:"\E602"}.glyphicons-superscript:before{content:"\E603"}.glyphicons-subscript:before{content:"\E604"}.glyphicons-text-size:before{content:"\E605"}.glyphicons-text-color:before{content:"\E606"}.glyphicons-text-background:before{content:"\E607"}.glyphicons-modal-window:before{content:"\E608"}.glyphicons-newspaper:before{content:"\1F4F0"}.glyphicons-tractor:before{content:"\1F69C"}.animated{-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;animation-iteration-count:infinite;-webkit-animation-iteration-count:infinite}@-webkit-keyframes pulse{0%{-webkit-transform:scale(1)}50%{-webkit-transform:scale(1.1)}100%{-webkit-transform:scale(1)}}@keyframes pulse{0%{transform:scale(1)}50%{transform:scale(1.1)}100%{transform:scale(1)}}.pulse{-webkit-animation-name:pulse;animation-name:pulse}@-webkit-keyframes rotateIn{0%{-webkit-transform-origin:center center;-webkit-transform:rotate(-200deg);opacity:0}100%{-webkit-transform-origin:center center;-webkit-transform:rotate(0);opacity:1}}@keyframes rotateIn{0%{transform-origin:center center;transform:rotate(-200deg);opacity:0}100%{transform-origin:center center;transform:rotate(0);opacity:1}}.rotateIn{-webkit-animation-name:rotateIn;animation-name:rotateIn}@-webkit-keyframes bounce{0%,20%,50%,80%,100%{-webkit-transform:translateY(0)}40%{-webkit-transform:translateY(-30px)}60%{-webkit-transform:translateY(-15px)}}@keyframes bounce{0%,20%,50%,80%,100%{transform:translateY(0)}40%{transform:translateY(-30px)}60%{transform:translateY(-15px)}}.bounce{-webkit-animation-name:bounce;animation-name:bounce}@-webkit-keyframes swing{20%,40%,60%,80%,100%{-webkit-transform-origin:top center}20%{-webkit-transform:rotate(15deg)}40%{-webkit-transform:rotate(-10deg)}60%{-webkit-transform:rotate(5deg)}80%{-webkit-transform:rotate(-5deg)}100%{-webkit-transform:rotate(0deg)}}@keyframes swing{20%{transform:rotate(15deg)}40%{transform:rotate(-10deg)}60%{transform:rotate(5deg)}80%{transform:rotate(-5deg)}100%{transform:rotate(0deg)}}.swing{-webkit-transform-origin:top center;transform-origin:top center;-webkit-animation-name:swing;animation-name:swing}@-webkit-keyframes tada{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.1) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.1) rotate(-3deg)}100%{-webkit-transform:scale(1) rotate(0)}}@keyframes tada{0%{transform:scale(1)}10%,20%{transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{transform:scale(1.1) rotate(3deg)}40%,60%,80%{transform:scale(1.1) rotate(-3deg)}100%{transform:scale(1) rotate(0)}}.tada{-webkit-animation-name:tada;animation-name:tada} \ No newline at end of file diff --git a/app_v3satdemo/chrome/content/web/css/jquery.dataTables.min.css b/app_v3satdemo/chrome/content/web/css/jquery.dataTables.min.css new file mode 100644 index 0000000..a2c5489 --- /dev/null +++ b/app_v3satdemo/chrome/content/web/css/jquery.dataTables.min.css @@ -0,0 +1 @@ +table.dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:bold}table.dataTable thead th,table.dataTable thead td{padding:10px 18px;border-bottom:1px solid #111}table.dataTable thead th:active,table.dataTable thead td:active{outline:none}table.dataTable tfoot th,table.dataTable tfoot td{padding:10px 18px 6px 18px;border-top:1px solid #111}table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting{cursor:pointer;*cursor:hand}table.dataTable thead .sorting{background:url("../images/sort_both.png") no-repeat center right}table.dataTable thead .sorting_asc{background:url("../images/sort_asc.png") no-repeat center right}table.dataTable thead .sorting_desc{background:url("../images/sort_desc.png") no-repeat center right}table.dataTable thead .sorting_asc_disabled{background:url("../images/sort_asc_disabled.png") no-repeat center right}table.dataTable thead .sorting_desc_disabled{background:url("../images/sort_desc_disabled.png") no-repeat center right}table.dataTable tbody tr{background-color:#fff}table.dataTable tbody tr.selected{background-color:#b0bed9}table.dataTable tbody th,table.dataTable tbody td{padding:8px 10px}table.dataTable.row-border tbody th,table.dataTable.row-border tbody td,table.dataTable.display tbody th,table.dataTable.display tbody td{border-top:1px solid #ddd}table.dataTable.row-border tbody tr:first-child th,table.dataTable.row-border tbody tr:first-child td,table.dataTable.display tbody tr:first-child th,table.dataTable.display tbody tr:first-child td{border-top:none}table.dataTable.cell-border tbody th,table.dataTable.cell-border tbody td{border-top:1px solid #ddd;border-right:1px solid #ddd}table.dataTable.cell-border tbody tr th:first-child,table.dataTable.cell-border tbody tr td:first-child{border-left:1px solid #ddd}table.dataTable.cell-border tbody tr:first-child th,table.dataTable.cell-border tbody tr:first-child td{border-top:none}table.dataTable.stripe tbody tr.odd,table.dataTable.display tbody tr.odd{background-color:#f9f9f9}table.dataTable.stripe tbody tr.odd.selected,table.dataTable.display tbody tr.odd.selected{background-color:#abb9d3}table.dataTable.hover tbody tr:hover,table.dataTable.hover tbody tr.odd:hover,table.dataTable.hover tbody tr.even:hover,table.dataTable.display tbody tr:hover,table.dataTable.display tbody tr.odd:hover,table.dataTable.display tbody tr.even:hover{background-color:#f5f5f5}table.dataTable.hover tbody tr:hover.selected,table.dataTable.hover tbody tr.odd:hover.selected,table.dataTable.hover tbody tr.even:hover.selected,table.dataTable.display tbody tr:hover.selected,table.dataTable.display tbody tr.odd:hover.selected,table.dataTable.display tbody tr.even:hover.selected{background-color:#a9b7d1}table.dataTable.order-column tbody tr>.sorting_1,table.dataTable.order-column tbody tr>.sorting_2,table.dataTable.order-column tbody tr>.sorting_3,table.dataTable.display tbody tr>.sorting_1,table.dataTable.display tbody tr>.sorting_2,table.dataTable.display tbody tr>.sorting_3{background-color:#f9f9f9}table.dataTable.order-column tbody tr.selected>.sorting_1,table.dataTable.order-column tbody tr.selected>.sorting_2,table.dataTable.order-column tbody tr.selected>.sorting_3,table.dataTable.display tbody tr.selected>.sorting_1,table.dataTable.display tbody tr.selected>.sorting_2,table.dataTable.display tbody tr.selected>.sorting_3{background-color:#acbad4}table.dataTable.display tbody tr.odd>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd>.sorting_1{background-color:#f1f1f1}table.dataTable.display tbody tr.odd>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd>.sorting_2{background-color:#f3f3f3}table.dataTable.display tbody tr.odd>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd>.sorting_3{background-color:#f5f5f5}table.dataTable.display tbody tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_1{background-color:#a6b3cd}table.dataTable.display tbody tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_2{background-color:#a7b5ce}table.dataTable.display tbody tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_3{background-color:#a9b6d0}table.dataTable.display tbody tr.even>.sorting_1,table.dataTable.order-column.stripe tbody tr.even>.sorting_1{background-color:#f9f9f9}table.dataTable.display tbody tr.even>.sorting_2,table.dataTable.order-column.stripe tbody tr.even>.sorting_2{background-color:#fbfbfb}table.dataTable.display tbody tr.even>.sorting_3,table.dataTable.order-column.stripe tbody tr.even>.sorting_3{background-color:#fdfdfd}table.dataTable.display tbody tr.even.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_1{background-color:#acbad4}table.dataTable.display tbody tr.even.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_2{background-color:#adbbd6}table.dataTable.display tbody tr.even.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_3{background-color:#afbdd8}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.display tbody tr.odd:hover>.sorting_1,table.dataTable.display tbody tr.even:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr.odd:hover>.sorting_1,table.dataTable.order-column.hover tbody tr.even:hover>.sorting_1{background-color:#eaeaea}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.display tbody tr.odd:hover>.sorting_2,table.dataTable.display tbody tr.even:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr.odd:hover>.sorting_2,table.dataTable.order-column.hover tbody tr.even:hover>.sorting_2{background-color:#ebebeb}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.display tbody tr.odd:hover>.sorting_3,table.dataTable.display tbody tr.even:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr.odd:hover>.sorting_3,table.dataTable.order-column.hover tbody tr.even:hover>.sorting_3{background-color:#eee}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.display tbody tr.odd:hover.selected>.sorting_1,table.dataTable.display tbody tr.even:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr.odd:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr.even:hover.selected>.sorting_1{background-color:#a1aec7}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.display tbody tr.odd:hover.selected>.sorting_2,table.dataTable.display tbody tr.even:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr.odd:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr.even:hover.selected>.sorting_2{background-color:#a2afc8}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.display tbody tr.odd:hover.selected>.sorting_3,table.dataTable.display tbody tr.even:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr.odd:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr.even:hover.selected>.sorting_3{background-color:#a4b2cb}table.dataTable.no-footer{border-bottom:1px solid #111}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable.compact thead th,table.dataTable.compact thead td{padding:5px 9px}table.dataTable.compact tfoot th,table.dataTable.compact tfoot td{padding:5px 9px 3px 9px}table.dataTable.compact tbody th,table.dataTable.compact tbody td{padding:4px 5px}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable,table.dataTable th,table.dataTable td{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.dataTables_wrapper{position:relative;clear:both;*zoom:1;zoom:1}.dataTables_wrapper .dataTables_length{float:left}.dataTables_wrapper .dataTables_filter{float:right;text-align:right}.dataTables_wrapper .dataTables_filter input{margin-left:0.5em}.dataTables_wrapper .dataTables_info{clear:both;float:left;padding-top:0.755em}.dataTables_wrapper .dataTables_paginate{float:right;text-align:right;padding-top:0.25em}.dataTables_wrapper .dataTables_paginate .paginate_button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:0.5em 1em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;*cursor:hand;color:#333 !important;border:1px solid transparent}.dataTables_wrapper .dataTables_paginate .paginate_button.current,.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{color:#333 !important;border:1px solid #cacaca;background-color:#fff;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #fff), color-stop(100%, #dcdcdc));background:-webkit-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-moz-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-ms-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-o-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:linear-gradient(to bottom, #fff 0%, #dcdcdc 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button.disabled,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{cursor:default;color:#666 !important;border:1px solid transparent;background:transparent;box-shadow:none}.dataTables_wrapper .dataTables_paginate .paginate_button:hover{color:white !important;border:1px solid #111;background-color:#585858;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));background:-webkit-linear-gradient(top, #585858 0%, #111 100%);background:-moz-linear-gradient(top, #585858 0%, #111 100%);background:-ms-linear-gradient(top, #585858 0%, #111 100%);background:-o-linear-gradient(top, #585858 0%, #111 100%);background:linear-gradient(to bottom, #585858 0%, #111 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button:active{outline:none;background-color:#2b2b2b;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));background:-webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);box-shadow:inset 0 0 3px #111}.dataTables_wrapper .dataTables_processing{position:absolute;top:50%;left:50%;width:100%;height:40px;margin-left:-50%;margin-top:-25px;padding-top:20px;text-align:center;font-size:1.2em;background-color:white;background:-webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255,255,255,0)), color-stop(25%, rgba(255,255,255,0.9)), color-stop(75%, rgba(255,255,255,0.9)), color-stop(100%, rgba(255,255,255,0)));background:-webkit-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-moz-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-ms-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-o-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:linear-gradient(to right, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%)}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_processing,.dataTables_wrapper .dataTables_paginate{color:#333}.dataTables_wrapper .dataTables_scroll{clear:both}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody{*margin-top:-1px;-webkit-overflow-scrolling:touch}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody td>div.dataTables_sizing{height:0;overflow:hidden;margin:0 !important;padding:0 !important}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:1px solid #111}.dataTables_wrapper.no-footer div.dataTables_scrollHead table,.dataTables_wrapper.no-footer div.dataTables_scrollBody table{border-bottom:none}.dataTables_wrapper:after{visibility:hidden;display:block;content:"";clear:both;height:0}@media screen and (max-width: 767px){.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_paginate{float:none;text-align:center}.dataTables_wrapper .dataTables_paginate{margin-top:0.5em}}@media screen and (max-width: 640px){.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter{float:none;text-align:center}.dataTables_wrapper .dataTables_filter{margin-top:0.5em}} diff --git a/app_v3satdemo/chrome/content/web/css/jquery.dataTables_themeroller.css b/app_v3satdemo/chrome/content/web/css/jquery.dataTables_themeroller.css new file mode 100644 index 0000000..5a56d97 --- /dev/null +++ b/app_v3satdemo/chrome/content/web/css/jquery.dataTables_themeroller.css @@ -0,0 +1,330 @@ +/* + * Table styles + */ +table.dataTable { + width: 100%; + margin: 0 auto; + clear: both; + border-collapse: separate; + border-spacing: 0; + /* + * Header and footer styles + */ + /* + * Body styles + */ +} +table.dataTable thead th, +table.dataTable thead td, +table.dataTable tfoot th, +table.dataTable tfoot td { + padding: 4px 10px; +} +table.dataTable thead th, +table.dataTable tfoot th { + font-weight: bold; +} +table.dataTable thead th:active, +table.dataTable thead td:active { + outline: none; +} +table.dataTable thead .sorting_asc, +table.dataTable thead .sorting_desc, +table.dataTable thead .sorting { + cursor: pointer; + *cursor: hand; +} +table.dataTable thead th div.DataTables_sort_wrapper { + position: relative; + padding-right: 10px; +} +table.dataTable thead th div.DataTables_sort_wrapper span { + position: absolute; + top: 50%; + margin-top: -8px; + right: -5px; +} +table.dataTable thead th.ui-state-default { + border-right-width: 0; +} +table.dataTable thead th.ui-state-default:last-child { + border-right-width: 1px; +} +table.dataTable tbody tr { + background-color: white; +} +table.dataTable tbody tr.selected { + background-color: #b0bed9; +} +table.dataTable tbody th, +table.dataTable tbody td { + padding: 8px 10px; +} +table.dataTable th.center, +table.dataTable td.center, +table.dataTable td.dataTables_empty { + text-align: center; +} +table.dataTable th.right, +table.dataTable td.right { + text-align: right; +} +table.dataTable.row-border tbody th, table.dataTable.row-border tbody td, table.dataTable.display tbody th, table.dataTable.display tbody td { + border-top: 1px solid #dddddd; +} +table.dataTable.row-border tbody tr:first-child th, +table.dataTable.row-border tbody tr:first-child td, table.dataTable.display tbody tr:first-child th, +table.dataTable.display tbody tr:first-child td { + border-top: none; +} +table.dataTable.cell-border tbody th, table.dataTable.cell-border tbody td { + border-top: 1px solid #dddddd; + border-right: 1px solid #dddddd; +} +table.dataTable.cell-border tbody tr th:first-child, +table.dataTable.cell-border tbody tr td:first-child { + border-left: 1px solid #dddddd; +} +table.dataTable.cell-border tbody tr:first-child th, +table.dataTable.cell-border tbody tr:first-child td { + border-top: none; +} +table.dataTable.stripe tbody tr.odd, table.dataTable.display tbody tr.odd { + background-color: #f9f9f9; +} +table.dataTable.stripe tbody tr.odd.selected, table.dataTable.display tbody tr.odd.selected { + background-color: #abb9d3; +} +table.dataTable.hover tbody tr:hover, +table.dataTable.hover tbody tr.odd:hover, +table.dataTable.hover tbody tr.even:hover, table.dataTable.display tbody tr:hover, +table.dataTable.display tbody tr.odd:hover, +table.dataTable.display tbody tr.even:hover { + background-color: whitesmoke; +} +table.dataTable.hover tbody tr:hover.selected, +table.dataTable.hover tbody tr.odd:hover.selected, +table.dataTable.hover tbody tr.even:hover.selected, table.dataTable.display tbody tr:hover.selected, +table.dataTable.display tbody tr.odd:hover.selected, +table.dataTable.display tbody tr.even:hover.selected { + background-color: #a9b7d1; +} +table.dataTable.order-column tbody tr > .sorting_1, +table.dataTable.order-column tbody tr > .sorting_2, +table.dataTable.order-column tbody tr > .sorting_3, table.dataTable.display tbody tr > .sorting_1, +table.dataTable.display tbody tr > .sorting_2, +table.dataTable.display tbody tr > .sorting_3 { + background-color: #f9f9f9; +} +table.dataTable.order-column tbody tr.selected > .sorting_1, +table.dataTable.order-column tbody tr.selected > .sorting_2, +table.dataTable.order-column tbody tr.selected > .sorting_3, table.dataTable.display tbody tr.selected > .sorting_1, +table.dataTable.display tbody tr.selected > .sorting_2, +table.dataTable.display tbody tr.selected > .sorting_3 { + background-color: #acbad4; +} +table.dataTable.display tbody tr.odd > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd > .sorting_1 { + background-color: #f1f1f1; +} +table.dataTable.display tbody tr.odd > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd > .sorting_2 { + background-color: #f3f3f3; +} +table.dataTable.display tbody tr.odd > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd > .sorting_3 { + background-color: whitesmoke; +} +table.dataTable.display tbody tr.odd.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_1 { + background-color: #a6b3cd; +} +table.dataTable.display tbody tr.odd.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_2 { + background-color: #a7b5ce; +} +table.dataTable.display tbody tr.odd.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_3 { + background-color: #a9b6d0; +} +table.dataTable.display tbody tr.even > .sorting_1, table.dataTable.order-column.stripe tbody tr.even > .sorting_1 { + background-color: #f9f9f9; +} +table.dataTable.display tbody tr.even > .sorting_2, table.dataTable.order-column.stripe tbody tr.even > .sorting_2 { + background-color: #fbfbfb; +} +table.dataTable.display tbody tr.even > .sorting_3, table.dataTable.order-column.stripe tbody tr.even > .sorting_3 { + background-color: #fdfdfd; +} +table.dataTable.display tbody tr.even.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_1 { + background-color: #acbad4; +} +table.dataTable.display tbody tr.even.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_2 { + background-color: #adbbd6; +} +table.dataTable.display tbody tr.even.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_3 { + background-color: #afbdd8; +} +table.dataTable.display tbody tr:hover > .sorting_1, +table.dataTable.display tbody tr.odd:hover > .sorting_1, +table.dataTable.display tbody tr.even:hover > .sorting_1, table.dataTable.order-column.hover tbody tr:hover > .sorting_1, +table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_1, +table.dataTable.order-column.hover tbody tr.even:hover > .sorting_1 { + background-color: #eaeaea; +} +table.dataTable.display tbody tr:hover > .sorting_2, +table.dataTable.display tbody tr.odd:hover > .sorting_2, +table.dataTable.display tbody tr.even:hover > .sorting_2, table.dataTable.order-column.hover tbody tr:hover > .sorting_2, +table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_2, +table.dataTable.order-column.hover tbody tr.even:hover > .sorting_2 { + background-color: #ebebeb; +} +table.dataTable.display tbody tr:hover > .sorting_3, +table.dataTable.display tbody tr.odd:hover > .sorting_3, +table.dataTable.display tbody tr.even:hover > .sorting_3, table.dataTable.order-column.hover tbody tr:hover > .sorting_3, +table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_3, +table.dataTable.order-column.hover tbody tr.even:hover > .sorting_3 { + background-color: #eeeeee; +} +table.dataTable.display tbody tr:hover.selected > .sorting_1, +table.dataTable.display tbody tr.odd:hover.selected > .sorting_1, +table.dataTable.display tbody tr.even:hover.selected > .sorting_1, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_1, +table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_1, +table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_1 { + background-color: #a1aec7; +} +table.dataTable.display tbody tr:hover.selected > .sorting_2, +table.dataTable.display tbody tr.odd:hover.selected > .sorting_2, +table.dataTable.display tbody tr.even:hover.selected > .sorting_2, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_2, +table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_2, +table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_2 { + background-color: #a2afc8; +} +table.dataTable.display tbody tr:hover.selected > .sorting_3, +table.dataTable.display tbody tr.odd:hover.selected > .sorting_3, +table.dataTable.display tbody tr.even:hover.selected > .sorting_3, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_3, +table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_3, +table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_3 { + background-color: #a4b2cb; +} + +table.dataTable, +table.dataTable th, +table.dataTable td { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} + +/* + * Control feature layout + */ +.dataTables_wrapper { + position: relative; + clear: both; + *zoom: 1; + zoom: 1; +} +.dataTables_wrapper .dataTables_length { + float: left; +} +.dataTables_wrapper .dataTables_filter { + float: right; + text-align: right; +} +.dataTables_wrapper .dataTables_filter input { + margin-left: 0.5em; +} +.dataTables_wrapper .dataTables_info { + clear: both; + float: left; + padding-top: 0.55em; +} +.dataTables_wrapper .dataTables_paginate { + float: right; + text-align: right; +} +.dataTables_wrapper .dataTables_paginate .fg-button { + box-sizing: border-box; + display: inline-block; + min-width: 1.5em; + padding: 0.5em; + margin-left: 2px; + text-align: center; + text-decoration: none !important; + cursor: pointer; + *cursor: hand; + color: #333333 !important; + border: 1px solid transparent; +} +.dataTables_wrapper .dataTables_paginate .fg-button:active { + outline: none; +} +.dataTables_wrapper .dataTables_paginate .fg-button:first-child { + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; +} +.dataTables_wrapper .dataTables_paginate .fg-button:last-child { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} +.dataTables_wrapper .dataTables_processing { + position: absolute; + top: 50%; + left: 50%; + width: 100%; + height: 40px; + margin-left: -50%; + margin-top: -25px; + padding-top: 20px; + text-align: center; + font-size: 1.2em; + background-color: white; + background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255, 255, 255, 0)), color-stop(25%, rgba(255, 255, 255, 0.9)), color-stop(75%, rgba(255, 255, 255, 0.9)), color-stop(100%, rgba(255, 255, 255, 0))); + /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + /* FF3.6+ */ + background: -ms-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + /* IE10+ */ + background: -o-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + /* Opera 11.10+ */ + background: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + /* W3C */ +} +.dataTables_wrapper .dataTables_length, +.dataTables_wrapper .dataTables_filter, +.dataTables_wrapper .dataTables_info, +.dataTables_wrapper .dataTables_processing, +.dataTables_wrapper .dataTables_paginate { + color: #333333; +} +.dataTables_wrapper .dataTables_scroll { + clear: both; +} +.dataTables_wrapper .dataTables_scrollBody { + *margin-top: -1px; + -webkit-overflow-scrolling: touch; +} +.dataTables_wrapper .ui-widget-header { + font-weight: normal; +} +.dataTables_wrapper .ui-toolbar { + padding: 8px; +} +.dataTables_wrapper:after { + visibility: hidden; + display: block; + content: ""; + clear: both; + height: 0; +} + +@media screen and (max-width: 767px) { + .dataTables_wrapper .dataTables_length, + .dataTables_wrapper .dataTables_filter, + .dataTables_wrapper .dataTables_info, + .dataTables_wrapper .dataTables_paginate { + float: none; + text-align: center; + } + .dataTables_wrapper .dataTables_filter, + .dataTables_wrapper .dataTables_paginate { + margin-top: 0.5em; + } +} diff --git a/app_v3satdemo/chrome/content/web/css/jquery.minicolors.css b/app_v3satdemo/chrome/content/web/css/jquery.minicolors.css new file mode 100644 index 0000000..7f0c242 --- /dev/null +++ b/app_v3satdemo/chrome/content/web/css/jquery.minicolors.css @@ -0,0 +1,333 @@ +.minicolors { + position: relative; +} + +.minicolors-sprite { + background-image: url(data:image/png;base64,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); +} + +.minicolors-no-data-uris .minicolors-sprite { + background-image: url(jquery.minicolors.png); +} + +.minicolors-swatch { + position: absolute; + vertical-align: middle; + background-position: -80px 0; + border: solid 1px #ccc; + cursor: text; + padding: 0; + margin: 0; + display: inline-block; +} + +.minicolors-swatch-color { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +.minicolors input[type=hidden] + .minicolors-swatch { + width: 28px; + position: static; + cursor: pointer; +} + +.minicolors input[type=hidden][disabled] + .minicolors-swatch { + cursor: default; +} + +/* Panel */ +.minicolors-panel { + position: absolute; + width: 173px; + height: 152px; + background: white; + border: solid 1px #CCC; + box-shadow: 0 0 20px rgba(0, 0, 0, .2); + z-index: 99999; + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; + box-sizing: content-box; + display: none; +} + +.minicolors-panel.minicolors-with-swatches { + height: 182px; +} + +.minicolors-panel.minicolors-visible { + display: block; +} + +/* Panel positioning */ +.minicolors-position-top .minicolors-panel { + top: -154px; +} + +.minicolors-position-right .minicolors-panel { + right: 0; +} + +.minicolors-position-bottom .minicolors-panel { + top: auto; +} + +.minicolors-position-left .minicolors-panel { + left: 0; +} + +.minicolors-with-opacity .minicolors-panel { + width: 194px; +} + +.minicolors .minicolors-grid { + position: absolute; + top: 1px; + left: 1px; + width: 150px; + height: 150px; + background-position: -120px 0; + cursor: crosshair; +} + +.minicolors .minicolors-grid-inner { + position: absolute; + top: 0; + left: 0; + width: 150px; + height: 150px; +} + +.minicolors-slider-saturation .minicolors-grid { + background-position: -420px 0; +} + +.minicolors-slider-saturation .minicolors-grid-inner { + background-position: -270px 0; + background-image: inherit; +} + +.minicolors-slider-brightness .minicolors-grid { + background-position: -570px 0; +} + +.minicolors-slider-brightness .minicolors-grid-inner { + background-color: black; +} + +.minicolors-slider-wheel .minicolors-grid { + background-position: -720px 0; +} + +.minicolors-slider, +.minicolors-opacity-slider { + position: absolute; + top: 1px; + left: 152px; + width: 20px; + height: 150px; + background-color: white; + background-position: 0 0; + cursor: row-resize; +} + +.minicolors-slider-saturation .minicolors-slider { + background-position: -60px 0; +} + +.minicolors-slider-brightness .minicolors-slider { + background-position: -20px 0; +} + +.minicolors-slider-wheel .minicolors-slider { + background-position: -20px 0; +} + +.minicolors-opacity-slider { + left: 173px; + background-position: -40px 0; + display: none; +} + +.minicolors-with-opacity .minicolors-opacity-slider { + display: block; +} + +/* Pickers */ +.minicolors-grid .minicolors-picker { + position: absolute; + top: 70px; + left: 70px; + width: 12px; + height: 12px; + border: solid 1px black; + border-radius: 10px; + margin-top: -6px; + margin-left: -6px; + background: none; +} + +.minicolors-grid .minicolors-picker > div { + position: absolute; + top: 0; + left: 0; + width: 8px; + height: 8px; + border-radius: 8px; + border: solid 2px white; + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; + box-sizing: content-box; +} + +.minicolors-picker { + position: absolute; + top: 0; + left: 0; + width: 18px; + height: 2px; + background: white; + border: solid 1px black; + margin-top: -2px; + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; + box-sizing: content-box; +} + +/* Swatches */ +.minicolors-swatches,.minicolors-swatches li { + margin: 0; + padding: 0; + list-style: none; + overflow: hidden; + position: absolute; + top: 157px; + left: 5px; +} + +.minicolors-swatches .minicolors-swatch { + position: relative; + float: left; + cursor: pointer; + margin:0 4px 0 0; +} + +.minicolors-with-opacity .minicolors-swatches .minicolors-swatch { + margin-right:7px; +} + +.minicolors-swatch.selected { + border-color:#000; +} + +/* Inline controls */ +.minicolors-inline { + display: inline-block; +} + +.minicolors-inline .minicolors-input { + display: none !important; +} + +.minicolors-inline .minicolors-panel { + position: relative; + top: auto; + left: auto; + box-shadow: none; + z-index: auto; + display: inline-block; +} + +/* Default theme */ +.minicolors-theme-default .minicolors-swatch { + top: 5px; + left: 5px; + width: 18px; + height: 18px; +} +.minicolors-theme-default .minicolors-swatches .minicolors-swatch { + top: 0; + left: 0; + width: 18px; + height: 18px; +} +.minicolors-theme-default .minicolors-swatches { + height: 20px; +} +.minicolors-theme-default.minicolors-position-right .minicolors-swatch { + left: auto; + right: 5px; +} +.minicolors-theme-default.minicolors { + width: auto; + display: inline-block; +} +.minicolors-theme-default .minicolors-input { + height: 20px; + width: auto; + display: inline-block; + padding-left: 26px; +} +.minicolors-theme-default.minicolors-position-right .minicolors-input { + padding-right: 26px; + padding-left: inherit; +} + +/* Bootstrap theme */ +.minicolors-theme-bootstrap .minicolors-swatch { + z-index: 2; + top: 3px; + left: 3px; + width: 28px; + height: 28px; + border-radius: 3px; +} +.minicolors-theme-bootstrap .minicolors-swatches .minicolors-swatch { + top: 0; + left: 0; + width: 20px; + height: 20px; +} +.minicolors-theme-bootstrap .minicolors-swatch-color { + border-radius: inherit; +} +.minicolors-theme-bootstrap.minicolors-position-right .minicolors-swatch { + left: auto; + right: 3px; +} +.minicolors-theme-bootstrap .minicolors-input { + float: none; + padding-left: 44px; +} +.minicolors-theme-bootstrap.minicolors-position-right .minicolors-input { + padding-right: 44px; + padding-left: 12px; +} +.minicolors-theme-bootstrap .minicolors-input.input-lg + .minicolors-swatch { + top: 4px; + left: 4px; + width: 37px; + height: 37px; + border-radius: 5px; +} +.minicolors-theme-bootstrap .minicolors-input.input-sm + .minicolors-swatch { + width: 24px; + height: 24px; +} +.input-group .minicolors-theme-bootstrap:not(:first-child) .minicolors-input { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +/* Semantic Ui theme */ +.minicolors-theme-semanticui .minicolors-swatch { + top: 0; + left: 0; + padding: 18px; +} +.minicolors-theme-semanticui input { + text-indent: 30px; +} diff --git a/app_v3satdemo/chrome/content/web/css/style.css b/app_v3satdemo/chrome/content/web/css/style.css new file mode 100644 index 0000000..e69de29 diff --git a/app_v3satdemo/chrome/content/web/css/summernote.css b/app_v3satdemo/chrome/content/web/css/summernote.css new file mode 100644 index 0000000..a5e211c --- /dev/null +++ b/app_v3satdemo/chrome/content/web/css/summernote.css @@ -0,0 +1 @@ +@font-face{font-family:"summernote";font-style:normal;font-weight:normal;src:url("../font/summernote.eot?546c01739436985e5a21a8cb325521f3");src:url("../font/summernote.eot?#iefix") format("embedded-opentype"),url("../font/summernote.woff?546c01739436985e5a21a8cb325521f3") format("woff"),url("../font/summernote.ttf?546c01739436985e5a21a8cb325521f3") format("truetype")}[class^="note-icon-"]:before,[class*=" note-icon-"]:before{display:inline-block;font:normal normal normal 14px summernote;font-size:inherit;-webkit-font-smoothing:antialiased;text-decoration:inherit;text-rendering:auto;text-transform:none;vertical-align:middle;speak:none;-moz-osx-font-smoothing:grayscale}.note-icon-align-center:before{content:"\f101"}.note-icon-align-indent:before{content:"\f102"}.note-icon-align-justify:before{content:"\f103"}.note-icon-align-left:before{content:"\f104"}.note-icon-align-outdent:before{content:"\f105"}.note-icon-align-right:before{content:"\f106"}.note-icon-align:before{content:"\f107"}.note-icon-arrows-alt:before{content:"\f108"}.note-icon-bold:before{content:"\f109"}.note-icon-caret:before{content:"\f10a"}.note-icon-chain-broken:before{content:"\f10b"}.note-icon-circle:before{content:"\f10c"}.note-icon-close:before{content:"\f10d"}.note-icon-code:before{content:"\f10e"}.note-icon-eraser:before{content:"\f10f"}.note-icon-font:before{content:"\f110"}.note-icon-frame:before{content:"\f111"}.note-icon-italic:before{content:"\f112"}.note-icon-link:before{content:"\f113"}.note-icon-magic:before{content:"\f114"}.note-icon-menu-check:before{content:"\f115"}.note-icon-minus:before{content:"\f116"}.note-icon-orderedlist:before{content:"\f117"}.note-icon-pencil:before{content:"\f118"}.note-icon-picture:before{content:"\f119"}.note-icon-question:before{content:"\f11a"}.note-icon-redo:before{content:"\f11b"}.note-icon-special-character:before{content:"\f11c"}.note-icon-square:before{content:"\f11d"}.note-icon-strikethrough:before{content:"\f11e"}.note-icon-subscript:before{content:"\f11f"}.note-icon-summernote:before{content:"\f120"}.note-icon-superscript:before{content:"\f121"}.note-icon-table:before{content:"\f122"}.note-icon-text-height:before{content:"\f123"}.note-icon-trash:before{content:"\f124"}.note-icon-underline:before{content:"\f125"}.note-icon-undo:before{content:"\f126"}.note-icon-unorderedlist:before{content:"\f127"}.note-icon-video:before{content:"\f128"}.note-editor{position:relative}.note-editor .note-dropzone{position:absolute;z-index:100;display:none;color:#87cefa;background-color:white;opacity:.95}.note-editor .note-dropzone .note-dropzone-message{display:table-cell;font-size:28px;font-weight:bold;text-align:center;vertical-align:middle}.note-editor .note-dropzone.hover{color:#098ddf}.note-editor.dragover .note-dropzone{display:table}.note-editor .note-editing-area{position:relative}.note-editor .note-editing-area .note-editable{outline:0}.note-editor .note-editing-area .note-editable sup{vertical-align:super}.note-editor .note-editing-area .note-editable sub{vertical-align:sub}.note-editor.note-frame{border:1px solid #a9a9a9}.note-editor.note-frame.codeview .note-editing-area .note-editable{display:none}.note-editor.note-frame.codeview .note-editing-area .note-codable{display:block}.note-editor.note-frame .note-editing-area{overflow:hidden}.note-editor.note-frame .note-editing-area .note-editable{padding:10px;overflow:auto;color:#000;background-color:#fff}.note-editor.note-frame .note-editing-area .note-editable[contenteditable="false"]{background-color:#e5e5e5}.note-editor.note-frame .note-editing-area .note-codable{display:none;width:100%;padding:10px;margin-bottom:0;font-family:Menlo,Monaco,monospace,sans-serif;font-size:14px;color:#ccc;background-color:#222;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;box-shadow:none;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;resize:none}.note-editor.note-frame.fullscreen{position:fixed;top:0;left:0;z-index:1050;width:100%!important}.note-editor.note-frame.fullscreen .note-editable{background-color:white}.note-editor.note-frame.fullscreen .note-resizebar{display:none}.note-editor.note-frame .note-statusbar{background-color:#f5f5f5;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.note-editor.note-frame .note-statusbar .note-resizebar{width:100%;height:8px;padding-top:1px;cursor:ns-resize}.note-editor.note-frame .note-statusbar .note-resizebar .note-icon-bar{width:20px;margin:1px auto;border-top:1px solid #a9a9a9}.note-editor.note-frame .note-placeholder{padding:10px}.note-popover.popover{max-width:none}.note-popover.popover .popover-content a{display:inline-block;max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:middle}.note-popover.popover .arrow{left:20px!important}.note-popover .popover-content,.panel-heading.note-toolbar{padding:0 0 5px 5px;margin:0}.note-popover .popover-content>.btn-group,.panel-heading.note-toolbar>.btn-group{margin-top:5px;margin-right:5px;margin-left:0}.note-popover .popover-content .btn-group .note-table,.panel-heading.note-toolbar .btn-group .note-table{min-width:0;padding:5px}.note-popover .popover-content .btn-group .note-table .note-dimension-picker,.panel-heading.note-toolbar .btn-group .note-table .note-dimension-picker{font-size:18px}.note-popover .popover-content .btn-group .note-table .note-dimension-picker .note-dimension-picker-mousecatcher,.panel-heading.note-toolbar .btn-group .note-table .note-dimension-picker .note-dimension-picker-mousecatcher{position:absolute!important;z-index:3;width:10em;height:10em;cursor:pointer}.note-popover .popover-content .btn-group .note-table .note-dimension-picker .note-dimension-picker-unhighlighted,.panel-heading.note-toolbar .btn-group .note-table .note-dimension-picker .note-dimension-picker-unhighlighted{position:relative!important;z-index:1;width:5em;height:5em;background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIj4+Pjp6ekKlAqjAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKhmnaJzPAAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC') repeat}.note-popover .popover-content .btn-group .note-table .note-dimension-picker .note-dimension-picker-highlighted,.panel-heading.note-toolbar .btn-group .note-table .note-dimension-picker .note-dimension-picker-highlighted{position:absolute!important;z-index:2;width:1em;height:1em;background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIjd6vvD2f9LKLW+AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKwNDEVT0AAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC') repeat}.note-popover .popover-content .note-style h1,.panel-heading.note-toolbar .note-style h1,.note-popover .popover-content .note-style h2,.panel-heading.note-toolbar .note-style h2,.note-popover .popover-content .note-style h3,.panel-heading.note-toolbar .note-style h3,.note-popover .popover-content .note-style h4,.panel-heading.note-toolbar .note-style h4,.note-popover .popover-content .note-style h5,.panel-heading.note-toolbar .note-style h5,.note-popover .popover-content .note-style h6,.panel-heading.note-toolbar .note-style h6,.note-popover .popover-content .note-style blockquote,.panel-heading.note-toolbar .note-style blockquote{margin:0}.note-popover .popover-content .note-color .dropdown-toggle,.panel-heading.note-toolbar .note-color .dropdown-toggle{width:20px;padding-left:5px}.note-popover .popover-content .note-color .dropdown-menu,.panel-heading.note-toolbar .note-color .dropdown-menu{min-width:340px}.note-popover .popover-content .note-color .dropdown-menu .btn-group,.panel-heading.note-toolbar .note-color .dropdown-menu .btn-group{margin:0}.note-popover .popover-content .note-color .dropdown-menu .btn-group:first-child,.panel-heading.note-toolbar .note-color .dropdown-menu .btn-group:first-child{margin:0 5px}.note-popover .popover-content .note-color .dropdown-menu .btn-group .note-palette-title,.panel-heading.note-toolbar .note-color .dropdown-menu .btn-group .note-palette-title{margin:2px 7px;font-size:12px;text-align:center;border-bottom:1px solid #eee}.note-popover .popover-content .note-color .dropdown-menu .btn-group .note-color-reset,.panel-heading.note-toolbar .note-color .dropdown-menu .btn-group .note-color-reset{width:100%;padding:0 3px;margin:3px;font-size:11px;cursor:pointer;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.note-popover .popover-content .note-color .dropdown-menu .btn-group .note-color-row,.panel-heading.note-toolbar .note-color .dropdown-menu .btn-group .note-color-row{height:20px}.note-popover .popover-content .note-color .dropdown-menu .btn-group .note-color-reset:hover,.panel-heading.note-toolbar .note-color .dropdown-menu .btn-group .note-color-reset:hover{background:#eee}.note-popover .popover-content .note-para .dropdown-menu,.panel-heading.note-toolbar .note-para .dropdown-menu{min-width:216px;padding:5px}.note-popover .popover-content .note-para .dropdown-menu>div:first-child,.panel-heading.note-toolbar .note-para .dropdown-menu>div:first-child{margin-right:5px}.note-popover .popover-content .dropdown-menu,.panel-heading.note-toolbar .dropdown-menu{min-width:90px}.note-popover .popover-content .dropdown-menu.right,.panel-heading.note-toolbar .dropdown-menu.right{right:0;left:auto}.note-popover .popover-content .dropdown-menu.right::before,.panel-heading.note-toolbar .dropdown-menu.right::before{right:9px;left:auto!important}.note-popover .popover-content .dropdown-menu.right::after,.panel-heading.note-toolbar .dropdown-menu.right::after{right:10px;left:auto!important}.note-popover .popover-content .dropdown-menu.note-check li a i,.panel-heading.note-toolbar .dropdown-menu.note-check li a i{color:deepskyblue;visibility:hidden}.note-popover .popover-content .dropdown-menu.note-check li a.checked i,.panel-heading.note-toolbar .dropdown-menu.note-check li a.checked i{visibility:visible}.note-popover .popover-content .note-fontsize-10,.panel-heading.note-toolbar .note-fontsize-10{font-size:10px}.note-popover .popover-content .note-color-palette,.panel-heading.note-toolbar .note-color-palette{line-height:1}.note-popover .popover-content .note-color-palette div .note-color-btn,.panel-heading.note-toolbar .note-color-palette div .note-color-btn{width:20px;height:20px;padding:0;margin:0;border:1px solid #fff}.note-popover .popover-content .note-color-palette div .note-color-btn:hover,.panel-heading.note-toolbar .note-color-palette div .note-color-btn:hover{border:1px solid #000}.note-dialog>div{display:none}.note-dialog .form-group{margin-right:0;margin-left:0}.note-dialog .note-modal-form{margin:0}.note-dialog .note-image-dialog .note-dropzone{min-height:100px;margin-bottom:10px;font-size:30px;line-height:4;color:lightgray;text-align:center;border:4px dashed lightgray}@-moz-document url-prefix(){.note-image-input{height:auto}}.note-placeholder{position:absolute;display:none;color:gray}.note-handle .note-control-selection{position:absolute;display:none;border:1px solid black}.note-handle .note-control-selection>div{position:absolute}.note-handle .note-control-selection .note-control-selection-bg{width:100%;height:100%;background-color:black;-webkit-opacity:.3;-khtml-opacity:.3;-moz-opacity:.3;opacity:.3;-ms-filter:alpha(opacity=30);filter:alpha(opacity=30)}.note-handle .note-control-selection .note-control-handle{width:7px;height:7px;border:1px solid black}.note-handle .note-control-selection .note-control-holder{width:7px;height:7px;border:1px solid black}.note-handle .note-control-selection .note-control-sizing{width:7px;height:7px;background-color:white;border:1px solid black}.note-handle .note-control-selection .note-control-nw{top:-5px;left:-5px;border-right:0;border-bottom:0}.note-handle .note-control-selection .note-control-ne{top:-5px;right:-5px;border-bottom:0;border-left:none}.note-handle .note-control-selection .note-control-sw{bottom:-5px;left:-5px;border-top:0;border-right:0}.note-handle .note-control-selection .note-control-se{right:-5px;bottom:-5px;cursor:se-resize}.note-handle .note-control-selection .note-control-se.note-control-holder{cursor:default;border-top:0;border-left:none}.note-handle .note-control-selection .note-control-selection-info{right:0;bottom:0;padding:5px;margin:5px;font-size:12px;color:white;background-color:black;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;-webkit-opacity:.7;-khtml-opacity:.7;-moz-opacity:.7;opacity:.7;-ms-filter:alpha(opacity=70);filter:alpha(opacity=70)}.note-hint-popover{min-width:100px;padding:2px}.note-hint-popover .popover-content{max-height:150px;padding:3px;overflow:auto}.note-hint-popover .popover-content .note-hint-group .note-hint-item{display:block!important;padding:3px}.note-hint-popover .popover-content .note-hint-group .note-hint-item.active,.note-hint-popover .popover-content .note-hint-group .note-hint-item:hover{display:block;clear:both;font-weight:400;line-height:1.4;color:white;text-decoration:none;white-space:nowrap;cursor:pointer;background-color:#428bca;outline:0} \ No newline at end of file diff --git a/app_v3satdemo/chrome/content/web/font/summernote.eot b/app_v3satdemo/chrome/content/web/font/summernote.eot new file mode 100644 index 0000000..dc87b81 Binary files /dev/null and b/app_v3satdemo/chrome/content/web/font/summernote.eot differ diff --git a/app_v3satdemo/chrome/content/web/font/summernote.ttf b/app_v3satdemo/chrome/content/web/font/summernote.ttf new file mode 100644 index 0000000..0c98879 Binary files /dev/null and b/app_v3satdemo/chrome/content/web/font/summernote.ttf differ diff --git a/app_v3satdemo/chrome/content/web/font/summernote.woff b/app_v3satdemo/chrome/content/web/font/summernote.woff new file mode 100644 index 0000000..98baae7 Binary files /dev/null and b/app_v3satdemo/chrome/content/web/font/summernote.woff differ diff --git a/app_v3satdemo/chrome/content/web/fonts/glyphicons-halflings-regular.eot b/app_v3satdemo/chrome/content/web/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 0000000..b93a495 Binary files /dev/null and b/app_v3satdemo/chrome/content/web/fonts/glyphicons-halflings-regular.eot differ diff --git a/app_v3satdemo/chrome/content/web/fonts/glyphicons-halflings-regular.svg b/app_v3satdemo/chrome/content/web/fonts/glyphicons-halflings-regular.svg new file mode 100644 index 0000000..94fb549 --- /dev/null +++ b/app_v3satdemo/chrome/content/web/fonts/glyphicons-halflings-regular.svg @@ -0,0 +1,288 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app_v3satdemo/chrome/content/web/fonts/glyphicons-halflings-regular.ttf b/app_v3satdemo/chrome/content/web/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000..1413fc6 Binary files /dev/null and b/app_v3satdemo/chrome/content/web/fonts/glyphicons-halflings-regular.ttf differ diff --git a/app_v3satdemo/chrome/content/web/fonts/glyphicons-halflings-regular.woff b/app_v3satdemo/chrome/content/web/fonts/glyphicons-halflings-regular.woff new file mode 100644 index 0000000..9e61285 Binary files /dev/null and b/app_v3satdemo/chrome/content/web/fonts/glyphicons-halflings-regular.woff differ diff --git a/app_v3satdemo/chrome/content/web/fonts/glyphicons-halflings-regular.woff2 b/app_v3satdemo/chrome/content/web/fonts/glyphicons-halflings-regular.woff2 new file mode 100644 index 0000000..64539b5 Binary files /dev/null and b/app_v3satdemo/chrome/content/web/fonts/glyphicons-halflings-regular.woff2 differ diff --git a/app_v3satdemo/chrome/content/web/fonts/glyphicons-regular.eot b/app_v3satdemo/chrome/content/web/fonts/glyphicons-regular.eot new file mode 100644 index 0000000..17abfb9 Binary files /dev/null and b/app_v3satdemo/chrome/content/web/fonts/glyphicons-regular.eot differ diff --git a/app_v3satdemo/chrome/content/web/fonts/glyphicons-regular.svg b/app_v3satdemo/chrome/content/web/fonts/glyphicons-regular.svg new file mode 100644 index 0000000..f7c0392 --- /dev/null +++ b/app_v3satdemo/chrome/content/web/fonts/glyphicons-regular.svg @@ -0,0 +1,638 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app_v3satdemo/chrome/content/web/fonts/glyphicons-regular.ttf b/app_v3satdemo/chrome/content/web/fonts/glyphicons-regular.ttf new file mode 100644 index 0000000..cf34636 Binary files /dev/null and b/app_v3satdemo/chrome/content/web/fonts/glyphicons-regular.ttf differ diff --git a/app_v3satdemo/chrome/content/web/fonts/glyphicons-regular.woff b/app_v3satdemo/chrome/content/web/fonts/glyphicons-regular.woff new file mode 100644 index 0000000..953e38b Binary files /dev/null and b/app_v3satdemo/chrome/content/web/fonts/glyphicons-regular.woff differ diff --git a/app_v3satdemo/chrome/content/web/fonts/glyphicons-regular.woff2 b/app_v3satdemo/chrome/content/web/fonts/glyphicons-regular.woff2 new file mode 100644 index 0000000..ed05abd Binary files /dev/null and b/app_v3satdemo/chrome/content/web/fonts/glyphicons-regular.woff2 differ diff --git a/app_v3satdemo/chrome/content/web/home.html b/app_v3satdemo/chrome/content/web/home.html new file mode 100644 index 0000000..05e4de4 --- /dev/null +++ b/app_v3satdemo/chrome/content/web/home.html @@ -0,0 +1,50 @@ + + + + Home + + + + + + + + + + + + + + +
    + +
    +
    +
    +
    +

    icon Informations Utiles

    +
    +
    + pas d'informations utiles pour l'instant! +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + diff --git a/app_v3satdemo/chrome/content/web/images/Sorting icons.psd b/app_v3satdemo/chrome/content/web/images/Sorting icons.psd new file mode 100644 index 0000000..53b2e06 Binary files /dev/null and b/app_v3satdemo/chrome/content/web/images/Sorting icons.psd differ diff --git a/app_v3satdemo/chrome/content/web/images/back_disabled.png b/app_v3satdemo/chrome/content/web/images/back_disabled.png new file mode 100644 index 0000000..881de79 Binary files /dev/null and b/app_v3satdemo/chrome/content/web/images/back_disabled.png differ diff --git a/app_v3satdemo/chrome/content/web/images/back_enabled.png b/app_v3satdemo/chrome/content/web/images/back_enabled.png new file mode 100644 index 0000000..c608682 Binary files /dev/null and b/app_v3satdemo/chrome/content/web/images/back_enabled.png differ diff --git a/app_v3satdemo/chrome/content/web/images/back_enabled_hover.png b/app_v3satdemo/chrome/content/web/images/back_enabled_hover.png new file mode 100644 index 0000000..d300f10 Binary files /dev/null and b/app_v3satdemo/chrome/content/web/images/back_enabled_hover.png differ diff --git a/app_v3satdemo/chrome/content/web/images/forward_disabled.png b/app_v3satdemo/chrome/content/web/images/forward_disabled.png new file mode 100644 index 0000000..6a6ded7 Binary files /dev/null and b/app_v3satdemo/chrome/content/web/images/forward_disabled.png differ diff --git a/app_v3satdemo/chrome/content/web/images/forward_enabled.png b/app_v3satdemo/chrome/content/web/images/forward_enabled.png new file mode 100644 index 0000000..a4e6b53 Binary files /dev/null and b/app_v3satdemo/chrome/content/web/images/forward_enabled.png differ diff --git a/app_v3satdemo/chrome/content/web/images/forward_enabled_hover.png b/app_v3satdemo/chrome/content/web/images/forward_enabled_hover.png new file mode 100644 index 0000000..fc46c5e Binary files /dev/null and b/app_v3satdemo/chrome/content/web/images/forward_enabled_hover.png differ diff --git a/app_v3satdemo/chrome/content/web/images/sort_asc.png b/app_v3satdemo/chrome/content/web/images/sort_asc.png new file mode 100644 index 0000000..a88d797 Binary files /dev/null and b/app_v3satdemo/chrome/content/web/images/sort_asc.png differ diff --git a/app_v3satdemo/chrome/content/web/images/sort_asc_disabled.png b/app_v3satdemo/chrome/content/web/images/sort_asc_disabled.png new file mode 100644 index 0000000..0914972 Binary files /dev/null and b/app_v3satdemo/chrome/content/web/images/sort_asc_disabled.png differ diff --git a/app_v3satdemo/chrome/content/web/images/sort_both.png b/app_v3satdemo/chrome/content/web/images/sort_both.png new file mode 100644 index 0000000..4897113 Binary files /dev/null and b/app_v3satdemo/chrome/content/web/images/sort_both.png differ diff --git a/app_v3satdemo/chrome/content/web/images/sort_desc.png b/app_v3satdemo/chrome/content/web/images/sort_desc.png new file mode 100644 index 0000000..def071e Binary files /dev/null and b/app_v3satdemo/chrome/content/web/images/sort_desc.png differ diff --git a/app_v3satdemo/chrome/content/web/images/sort_desc_disabled.png b/app_v3satdemo/chrome/content/web/images/sort_desc_disabled.png new file mode 100644 index 0000000..c5ef012 Binary files /dev/null and b/app_v3satdemo/chrome/content/web/images/sort_desc_disabled.png differ diff --git a/app_v3satdemo/chrome/content/web/img/glyphicons-halflings-white.png b/app_v3satdemo/chrome/content/web/img/glyphicons-halflings-white.png new file mode 100644 index 0000000..3bf6484 Binary files /dev/null and b/app_v3satdemo/chrome/content/web/img/glyphicons-halflings-white.png differ diff --git a/app_v3satdemo/chrome/content/web/img/glyphicons-halflings.png b/app_v3satdemo/chrome/content/web/img/glyphicons-halflings.png new file mode 100644 index 0000000..a996999 Binary files /dev/null and b/app_v3satdemo/chrome/content/web/img/glyphicons-halflings.png differ diff --git a/app_v3satdemo/chrome/content/web/js/bootstrap-datetimepicker.min.js b/app_v3satdemo/chrome/content/web/js/bootstrap-datetimepicker.min.js new file mode 100644 index 0000000..db3d085 --- /dev/null +++ b/app_v3satdemo/chrome/content/web/js/bootstrap-datetimepicker.min.js @@ -0,0 +1,9 @@ +/*! version : 4.17.37 + ========================================================= + bootstrap-datetimejs + https://github.com/Eonasdan/bootstrap-datetimepicker + Copyright (c) 2015 Jonathan Peterson + ========================================================= + */ +!function(a){"use strict";if("function"==typeof define&&define.amd)define(["jquery","moment"],a);else if("object"==typeof exports)a(require("jquery"),require("moment"));else{if("undefined"==typeof jQuery)throw"bootstrap-datetimepicker requires jQuery to be loaded first";if("undefined"==typeof moment)throw"bootstrap-datetimepicker requires Moment.js to be loaded first";a(jQuery,moment)}}(function(a,b){"use strict";if(!b)throw new Error("bootstrap-datetimepicker requires Moment.js to be loaded first");var c=function(c,d){var e,f,g,h,i,j,k,l={},m=!0,n=!1,o=!1,p=0,q=[{clsName:"days",navFnc:"M",navStep:1},{clsName:"months",navFnc:"y",navStep:1},{clsName:"years",navFnc:"y",navStep:10},{clsName:"decades",navFnc:"y",navStep:100}],r=["days","months","years","decades"],s=["top","bottom","auto"],t=["left","right","auto"],u=["default","top","bottom"],v={up:38,38:"up",down:40,40:"down",left:37,37:"left",right:39,39:"right",tab:9,9:"tab",escape:27,27:"escape",enter:13,13:"enter",pageUp:33,33:"pageUp",pageDown:34,34:"pageDown",shift:16,16:"shift",control:17,17:"control",space:32,32:"space",t:84,84:"t","delete":46,46:"delete"},w={},x=function(a){var c,e,f,g,h,i=!1;return void 0!==b.tz&&void 0!==d.timeZone&&null!==d.timeZone&&""!==d.timeZone&&(i=!0),void 0===a||null===a?c=i?b().tz(d.timeZone).startOf("d"):b().startOf("d"):i?(e=b().tz(d.timeZone).utcOffset(),f=b(a,j,d.useStrict).utcOffset(),f!==e?(g=b().tz(d.timeZone).format("Z"),h=b(a,j,d.useStrict).format("YYYY-MM-DD[T]HH:mm:ss")+g,c=b(h,j,d.useStrict).tz(d.timeZone)):c=b(a,j,d.useStrict).tz(d.timeZone)):c=b(a,j,d.useStrict),c},y=function(a){if("string"!=typeof a||a.length>1)throw new TypeError("isEnabled expects a single character string parameter");switch(a){case"y":return-1!==i.indexOf("Y");case"M":return-1!==i.indexOf("M");case"d":return-1!==i.toLowerCase().indexOf("d");case"h":case"H":return-1!==i.toLowerCase().indexOf("h");case"m":return-1!==i.indexOf("m");case"s":return-1!==i.indexOf("s");default:return!1}},z=function(){return y("h")||y("m")||y("s")},A=function(){return y("y")||y("M")||y("d")},B=function(){var b=a("").append(a("").append(a("").addClass("prev").attr("data-action","previous").append(a("").addClass(d.icons.previous))).append(a("").addClass("picker-switch").attr("data-action","pickerSwitch").attr("colspan",d.calendarWeeks?"6":"5")).append(a("").addClass("next").attr("data-action","next").append(a("").addClass(d.icons.next)))),c=a("").append(a("").append(a("").attr("colspan",d.calendarWeeks?"8":"7")));return[a("
    ").addClass("datepicker-days").append(a("").addClass("table-condensed").append(b).append(a(""))),a("
    ").addClass("datepicker-months").append(a("
    ").addClass("table-condensed").append(b.clone()).append(c.clone())),a("
    ").addClass("datepicker-years").append(a("
    ").addClass("table-condensed").append(b.clone()).append(c.clone())),a("
    ").addClass("datepicker-decades").append(a("
    ").addClass("table-condensed").append(b.clone()).append(c.clone()))]},C=function(){var b=a(""),c=a(""),e=a("");return y("h")&&(b.append(a("\s*$/g,rb={option:[1,""],legend:[1,"
    ","
    "],area:[1,"",""],param:[1,"",""],thead:[1,"
    ").append(a("").attr({href:"#",tabindex:"-1",title:d.tooltips.incrementHour}).addClass("btn").attr("data-action","incrementHours").append(a("").addClass(d.icons.up)))),c.append(a("").append(a("").addClass("timepicker-hour").attr({"data-time-component":"hours",title:d.tooltips.pickHour}).attr("data-action","showHours"))),e.append(a("").append(a("").attr({href:"#",tabindex:"-1",title:d.tooltips.decrementHour}).addClass("btn").attr("data-action","decrementHours").append(a("").addClass(d.icons.down))))),y("m")&&(y("h")&&(b.append(a("").addClass("separator")),c.append(a("").addClass("separator").html(":")),e.append(a("").addClass("separator"))),b.append(a("").append(a("").attr({href:"#",tabindex:"-1",title:d.tooltips.incrementMinute}).addClass("btn").attr("data-action","incrementMinutes").append(a("").addClass(d.icons.up)))),c.append(a("").append(a("").addClass("timepicker-minute").attr({"data-time-component":"minutes",title:d.tooltips.pickMinute}).attr("data-action","showMinutes"))),e.append(a("").append(a("").attr({href:"#",tabindex:"-1",title:d.tooltips.decrementMinute}).addClass("btn").attr("data-action","decrementMinutes").append(a("").addClass(d.icons.down))))),y("s")&&(y("m")&&(b.append(a("").addClass("separator")),c.append(a("").addClass("separator").html(":")),e.append(a("").addClass("separator"))),b.append(a("").append(a("").attr({href:"#",tabindex:"-1",title:d.tooltips.incrementSecond}).addClass("btn").attr("data-action","incrementSeconds").append(a("").addClass(d.icons.up)))),c.append(a("").append(a("").addClass("timepicker-second").attr({"data-time-component":"seconds",title:d.tooltips.pickSecond}).attr("data-action","showSeconds"))),e.append(a("").append(a("").attr({href:"#",tabindex:"-1",title:d.tooltips.decrementSecond}).addClass("btn").attr("data-action","decrementSeconds").append(a("").addClass(d.icons.down))))),h||(b.append(a("").addClass("separator")),c.append(a("").append(a("").addClass("separator"))),a("
    ").addClass("timepicker-picker").append(a("").addClass("table-condensed").append([b,c,e]))},D=function(){var b=a("
    ").addClass("timepicker-hours").append(a("
    ").addClass("table-condensed")),c=a("
    ").addClass("timepicker-minutes").append(a("
    ").addClass("table-condensed")),d=a("
    ").addClass("timepicker-seconds").append(a("
    ").addClass("table-condensed")),e=[C()];return y("h")&&e.push(b),y("m")&&e.push(c),y("s")&&e.push(d),e},E=function(){var b=[];return d.showTodayButton&&b.push(a("").appendTo(this));o.nTBody=i[0];i=r.children("tfoot");if(0===i.length&&0").appendTo(this);0===i.length||0===i.children().length?r.addClass(j.sNoFooter): +0a?new t(b[a],this[a]):null},filter:function(a){var b=[];if(x.filter)b=x.filter.call(this,a,this);else for(var c=0,d=this.length;c").addClass(b),h("td",c).addClass(b).html(a)[0].colSpan=ca(d),e.push(c[0]))};f(a,b);c._details&&c._details.remove();c._details=h(e);c._detailsShow&&c._details.insertAfter(c.nTr)}return this});p(["row().child.show()","row().child().show()"],function(){Vb(this,!0);return this});p(["row().child.hide()","row().child().hide()"],function(){Vb(this,!1);return this});p(["row().child.remove()", +"row().child().remove()"],function(){bb(this);return this});p("row().child.isShown()",function(){var a=this.context;return a.length&&this.length?a[0].aoData[this[0]]._detailsShow||!1:!1});var dc=/^(.+):(name|visIdx|visible)$/,Wb=function(a,b,c,d,e){for(var c=[],d=0,f=e.length;d=0?b:g.length+b];if(typeof a==="function"){var e=Da(c,f);return h.map(g,function(b,f){return a(f,Wb(c,f,0,0,e),j[f])?f:null})}var k=typeof a==="string"?a.match(dc):"";if(k)switch(k[2]){case "visIdx":case "visible":b=parseInt(k[1],10);if(b<0){var m=h.map(g,function(a,b){return a.bVisible?b:null});return[m[m.length+b]]}return[$(c,b)];case "name":return h.map(i,function(a,b){return a===k[1]?b:null})}else return h(j).filter(a).map(function(){return h.inArray(this, +j)}).toArray()},c,f)},1);c.selector.cols=a;c.selector.opts=b;return c});s("columns().header()","column().header()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].nTh},1)});s("columns().footer()","column().footer()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].nTf},1)});s("columns().data()","column().data()",function(){return this.iterator("column-rows",Wb,1)});s("columns().dataSrc()","column().dataSrc()",function(){return this.iterator("column", +function(a,b){return a.aoColumns[b].mData},1)});s("columns().cache()","column().cache()",function(a){return this.iterator("column-rows",function(b,c,d,e,f){return ja(b.aoData,f,"search"===a?"_aFilterData":"_aSortData",c)},1)});s("columns().nodes()","column().nodes()",function(){return this.iterator("column-rows",function(a,b,c,d,e){return ja(a.aoData,e,"anCells",b)},1)});s("columns().visible()","column().visible()",function(a,b){return this.iterator("column",function(c,d){if(a===k)return c.aoColumns[d].bVisible; +var e=c.aoColumns,f=e[d],g=c.aoData,i,j,m;if(a!==k&&f.bVisible!==a){if(a){var l=h.inArray(!0,D(e,"bVisible"),d+1);i=0;for(j=g.length;id;return!0};m.isDataTable=m.fnIsDataTable=function(a){var b=h(a).get(0),c=!1;h.each(m.settings,function(a,e){var f=e.nScrollHead?h("table",e.nScrollHead)[0]:null,g=e.nScrollFoot?h("table",e.nScrollFoot)[0]:null;if(e.nTable===b||f===b||g===b)c=!0});return c};m.tables=m.fnTables=function(a){var b=!1;h.isPlainObject(a)&&(b=a.api,a=a.visible);var c=h.map(m.settings,function(b){if(!a||a&&h(b.nTable).is(":visible"))return b.nTable}); +return b?new t(c):c};m.util={throttle:ua,escapeRegex:va};m.camelToHungarian=I;p("$()",function(a,b){var c=this.rows(b).nodes(),c=h(c);return h([].concat(c.filter(a).toArray(),c.find(a).toArray()))});h.each(["on","one","off"],function(a,b){p(b+"()",function(){var a=Array.prototype.slice.call(arguments);a[0].match(/\.dt\b/)||(a[0]+=".dt");var d=h(this.tables().nodes());d[b].apply(d,a);return this})});p("clear()",function(){return this.iterator("table",function(a){na(a)})});p("settings()",function(){return new t(this.context, +this.context)});p("init()",function(){var a=this.context;return a.length?a[0].oInit:null});p("data()",function(){return this.iterator("table",function(a){return D(a.aoData,"_aData")}).flatten()});p("destroy()",function(a){a=a||!1;return this.iterator("table",function(b){var c=b.nTableWrapper.parentNode,d=b.oClasses,e=b.nTable,f=b.nTBody,g=b.nTHead,i=b.nTFoot,j=h(e),f=h(f),k=h(b.nTableWrapper),l=h.map(b.aoData,function(a){return a.nTr}),p;b.bDestroying=!0;w(b,"aoDestroyCallback","destroy",[b]);a|| +(new t(b)).columns().visible(!0);k.unbind(".DT").find(":not(tbody *)").unbind(".DT");h(Fa).unbind(".DT-"+b.sInstance);e!=g.parentNode&&(j.children("thead").detach(),j.append(g));i&&e!=i.parentNode&&(j.children("tfoot").detach(),j.append(i));b.aaSorting=[];b.aaSortingFixed=[];xa(b);h(l).removeClass(b.asStripeClasses.join(" "));h("th, td",g).removeClass(d.sSortable+" "+d.sSortableAsc+" "+d.sSortableDesc+" "+d.sSortableNone);b.bJUI&&(h("th span."+d.sSortIcon+", td span."+d.sSortIcon,g).detach(),h("th, td", +g).each(function(){var a=h("div."+d.sSortJUIWrapper,this);h(this).append(a.contents());a.detach()}));f.children().detach();f.append(l);g=a?"remove":"detach";j[g]();k[g]();!a&&c&&(c.insertBefore(e,b.nTableReinsertBefore),j.css("width",b.sDestroyWidth).removeClass(d.sTable),(p=b.asDestroyStripes.length)&&f.children().each(function(a){h(this).addClass(b.asDestroyStripes[a%p])}));c=h.inArray(b,m.settings);-1!==c&&m.settings.splice(c,1)})});h.each(["column","row","cell"],function(a,b){p(b+"s().every()", +function(a){return this.iterator(b,function(d,e,f,g,h){a.call((new t(d))[b](e,"cell"===b?f:k),e,f,g,h)})})});p("i18n()",function(a,b,c){var d=this.context[0],a=P(a)(d.oLanguage);a===k&&(a=b);c!==k&&h.isPlainObject(a)&&(a=a[c]!==k?a[c]:a._);return a.replace("%d",c)});m.version="1.10.9";m.settings=[];m.models={};m.models.oSearch={bCaseInsensitive:!0,sSearch:"",bRegex:!1,bSmart:!0};m.models.oRow={nTr:null,anCells:null,_aData:[],_aSortData:null,_aFilterData:null,_sFilterRow:null,_sRowStripe:"",src:null, +idx:-1};m.models.oColumn={idx:null,aDataSort:null,asSorting:null,bSearchable:null,bSortable:null,bVisible:null,_sManualType:null,_bAttrSrc:!1,fnCreatedCell:null,fnGetData:null,fnSetData:null,mData:null,mRender:null,nTh:null,nTf:null,sClass:null,sContentPadding:null,sDefaultContent:null,sName:null,sSortDataType:"std",sSortingClass:null,sSortingClassJUI:null,sTitle:null,sType:null,sWidth:null,sWidthOrig:null};m.defaults={aaData:null,aaSorting:[[0,"asc"]],aaSortingFixed:[],ajax:null,aLengthMenu:[10, +25,50,100],aoColumns:null,aoColumnDefs:null,aoSearchCols:[],asStripeClasses:null,bAutoWidth:!0,bDeferRender:!1,bDestroy:!1,bFilter:!0,bInfo:!0,bJQueryUI:!1,bLengthChange:!0,bPaginate:!0,bProcessing:!1,bRetrieve:!1,bScrollCollapse:!1,bServerSide:!1,bSort:!0,bSortMulti:!0,bSortCellsTop:!1,bSortClasses:!0,bStateSave:!1,fnCreatedRow:null,fnDrawCallback:null,fnFooterCallback:null,fnFormatNumber:function(a){return a.toString().replace(/\B(?=(\d{3})+(?!\d))/g,this.oLanguage.sThousands)},fnHeaderCallback:null, +fnInfoCallback:null,fnInitComplete:null,fnPreDrawCallback:null,fnRowCallback:null,fnServerData:null,fnServerParams:null,fnStateLoadCallback:function(a){try{return JSON.parse((-1===a.iStateDuration?sessionStorage:localStorage).getItem("DataTables_"+a.sInstance+"_"+location.pathname))}catch(b){}},fnStateLoadParams:null,fnStateLoaded:null,fnStateSaveCallback:function(a,b){try{(-1===a.iStateDuration?sessionStorage:localStorage).setItem("DataTables_"+a.sInstance+"_"+location.pathname,JSON.stringify(b))}catch(c){}}, +fnStateSaveParams:null,iStateDuration:7200,iDeferLoading:null,iDisplayLength:10,iDisplayStart:0,iTabIndex:0,oClasses:{},oLanguage:{oAria:{sSortAscending:": activate to sort column ascending",sSortDescending:": activate to sort column descending"},oPaginate:{sFirst:"First",sLast:"Last",sNext:"Next",sPrevious:"Previous"},sEmptyTable:"No data available in table",sInfo:"Showing _START_ to _END_ of _TOTAL_ entries",sInfoEmpty:"Showing 0 to 0 of 0 entries",sInfoFiltered:"(filtered from _MAX_ total entries)", +sInfoPostFix:"",sDecimal:"",sThousands:",",sLengthMenu:"Show _MENU_ entries",sLoadingRecords:"Loading...",sProcessing:"Processing...",sSearch:"Search:",sSearchPlaceholder:"",sUrl:"",sZeroRecords:"No matching records found"},oSearch:h.extend({},m.models.oSearch),sAjaxDataProp:"data",sAjaxSource:null,sDom:"lfrtip",searchDelay:null,sPaginationType:"simple_numbers",sScrollX:"",sScrollXInner:"",sScrollY:"",sServerMethod:"GET",renderer:null,rowId:"DT_RowId"};X(m.defaults);m.defaults.column={aDataSort:null, +iDataSort:-1,asSorting:["asc","desc"],bSearchable:!0,bSortable:!0,bVisible:!0,fnCreatedCell:null,mData:null,mRender:null,sCellType:"td",sClass:"",sContentPadding:"",sDefaultContent:null,sName:"",sSortDataType:"std",sTitle:null,sType:null,sWidth:null};X(m.defaults.column);m.models.oSettings={oFeatures:{bAutoWidth:null,bDeferRender:null,bFilter:null,bInfo:null,bLengthChange:null,bPaginate:null,bProcessing:null,bServerSide:null,bSort:null,bSortMulti:null,bSortClasses:null,bStateSave:null},oScroll:{bCollapse:null, +iBarWidth:0,sX:null,sXInner:null,sY:null},oLanguage:{fnInfoCallback:null},oBrowser:{bScrollOversize:!1,bScrollbarLeft:!1,bBounding:!1,barWidth:0},ajax:null,aanFeatures:[],aoData:[],aiDisplay:[],aiDisplayMaster:[],aIds:{},aoColumns:[],aoHeader:[],aoFooter:[],oPreviousSearch:{},aoPreSearchCols:[],aaSorting:null,aaSortingFixed:[],asStripeClasses:null,asDestroyStripes:[],sDestroyWidth:0,aoRowCallback:[],aoHeaderCallback:[],aoFooterCallback:[],aoDrawCallback:[],aoRowCreatedCallback:[],aoPreDrawCallback:[], +aoInitComplete:[],aoStateSaveParams:[],aoStateLoadParams:[],aoStateLoaded:[],sTableId:"",nTable:null,nTHead:null,nTFoot:null,nTBody:null,nTableWrapper:null,bDeferLoading:!1,bInitialised:!1,aoOpenRows:[],sDom:null,searchDelay:null,sPaginationType:"two_button",iStateDuration:0,aoStateSave:[],aoStateLoad:[],oSavedState:null,oLoadedState:null,sAjaxSource:null,sAjaxDataProp:null,bAjaxDataGet:!0,jqXHR:null,json:k,oAjaxData:k,fnServerData:null,aoServerParams:[],sServerMethod:null,fnFormatNumber:null,aLengthMenu:null, +iDraw:0,bDrawing:!1,iDrawError:-1,_iDisplayLength:10,_iDisplayStart:0,_iRecordsTotal:0,_iRecordsDisplay:0,bJUI:null,oClasses:{},bFiltered:!1,bSorted:!1,bSortCellsTop:null,oInit:null,aoDestroyCallback:[],fnRecordsTotal:function(){return"ssp"==y(this)?1*this._iRecordsTotal:this.aiDisplayMaster.length},fnRecordsDisplay:function(){return"ssp"==y(this)?1*this._iRecordsDisplay:this.aiDisplay.length},fnDisplayEnd:function(){var a=this._iDisplayLength,b=this._iDisplayStart,c=b+a,d=this.aiDisplay.length,e= +this.oFeatures,f=e.bPaginate;return e.bServerSide?!1===f||-1===a?b+d:Math.min(b+a,this._iRecordsDisplay):!f||c>d||-1===a?d:c},oInstance:null,sInstance:null,iTabIndex:0,nScrollHead:null,nScrollFoot:null,aLastSort:[],oPlugins:{},rowIdFn:null,rowId:null};m.ext=v={buttons:{},classes:{},errMode:"alert",feature:[],search:[],selector:{cell:[],column:[],row:[]},internal:{},legacy:{ajax:null},pager:{},renderer:{pageButton:{},header:{}},order:{},type:{detect:[],search:{},order:{}},_unique:0,fnVersionCheck:m.fnVersionCheck, +iApiIndex:0,oJUIClasses:{},sVersion:m.version};h.extend(v,{afnFiltering:v.search,aTypes:v.type.detect,ofnSearch:v.type.search,oSort:v.type.order,afnSortData:v.order,aoFeatures:v.feature,oApi:v.internal,oStdClasses:v.classes,oPagination:v.pager});h.extend(m.ext.classes,{sTable:"dataTable",sNoFooter:"no-footer",sPageButton:"paginate_button",sPageButtonActive:"current",sPageButtonDisabled:"disabled",sStripeOdd:"odd",sStripeEven:"even",sRowEmpty:"dataTables_empty",sWrapper:"dataTables_wrapper",sFilter:"dataTables_filter", +sInfo:"dataTables_info",sPaging:"dataTables_paginate paging_",sLength:"dataTables_length",sProcessing:"dataTables_processing",sSortAsc:"sorting_asc",sSortDesc:"sorting_desc",sSortable:"sorting",sSortableAsc:"sorting_asc_disabled",sSortableDesc:"sorting_desc_disabled",sSortableNone:"sorting_disabled",sSortColumn:"sorting_",sFilterInput:"",sLengthSelect:"",sScrollWrapper:"dataTables_scroll",sScrollHead:"dataTables_scrollHead",sScrollHeadInner:"dataTables_scrollHeadInner",sScrollBody:"dataTables_scrollBody", +sScrollFoot:"dataTables_scrollFoot",sScrollFootInner:"dataTables_scrollFootInner",sHeaderTH:"",sFooterTH:"",sSortJUIAsc:"",sSortJUIDesc:"",sSortJUI:"",sSortJUIAscAllowed:"",sSortJUIDescAllowed:"",sSortJUIWrapper:"",sSortIcon:"",sJUIHeader:"",sJUIFooter:""});var Ea="",Ea="",G=Ea+"ui-state-default",ka=Ea+"css_right ui-icon ui-icon-",Xb=Ea+"fg-toolbar ui-toolbar ui-widget-header ui-helper-clearfix";h.extend(m.ext.oJUIClasses,m.ext.classes,{sPageButton:"fg-button ui-button "+G,sPageButtonActive:"ui-state-disabled", +sPageButtonDisabled:"ui-state-disabled",sPaging:"dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi ui-buttonset-multi paging_",sSortAsc:G+" sorting_asc",sSortDesc:G+" sorting_desc",sSortable:G+" sorting",sSortableAsc:G+" sorting_asc_disabled",sSortableDesc:G+" sorting_desc_disabled",sSortableNone:G+" sorting_disabled",sSortJUIAsc:ka+"triangle-1-n",sSortJUIDesc:ka+"triangle-1-s",sSortJUI:ka+"carat-2-n-s",sSortJUIAscAllowed:ka+"carat-1-n",sSortJUIDescAllowed:ka+"carat-1-s",sSortJUIWrapper:"DataTables_sort_wrapper", +sSortIcon:"DataTables_sort_icon",sScrollHead:"dataTables_scrollHead "+G,sScrollFoot:"dataTables_scrollFoot "+G,sHeaderTH:G,sFooterTH:G,sJUIHeader:Xb+" ui-corner-tl ui-corner-tr",sJUIFooter:Xb+" ui-corner-bl ui-corner-br"});var Mb=m.ext.pager;h.extend(Mb,{simple:function(){return["previous","next"]},full:function(){return["first","previous","next","last"]},numbers:function(a,b){return[Aa(a,b)]},simple_numbers:function(a,b){return["previous",Aa(a,b),"next"]},full_numbers:function(a,b){return["first", +"previous",Aa(a,b),"next","last"]},_numbers:Aa,numbers_length:7});h.extend(!0,m.ext.renderer,{pageButton:{_:function(a,b,c,d,e,f){var g=a.oClasses,i=a.oLanguage.oPaginate,j,k,l=0,m=function(b,d){var p,q,t,s,u=function(b){Ta(a,b.data.action,true)};p=0;for(q=d.length;p").appendTo(b);m(t,s)}else{j=null;k="";switch(s){case "ellipsis":b.append('');break;case "first":j=i.sFirst;k=s+(e>0?"":" "+g.sPageButtonDisabled); +break;case "previous":j=i.sPrevious;k=s+(e>0?"":" "+g.sPageButtonDisabled);break;case "next":j=i.sNext;k=s+(e",{"class":g.sPageButton+" "+k,"aria-controls":a.sTableId,"data-dt-idx":l,tabindex:a.iTabIndex,id:c===0&&typeof s==="string"?a.sTableId+"_"+s:null}).html(j).appendTo(b);Va(t,{action:s},u);l++}}}},p;try{p=h(b).find(T.activeElement).data("dt-idx")}catch(t){}m(h(b).empty(), +d);p&&h(b).find("[data-dt-idx="+p+"]").focus()}}});h.extend(m.ext.type.detect,[function(a,b){var c=b.oLanguage.sDecimal;return Ya(a,c)?"num"+c:null},function(a){if(a&&!(a instanceof Date)&&(!ac.test(a)||!bc.test(a)))return null;var b=Date.parse(a);return null!==b&&!isNaN(b)||K(a)?"date":null},function(a,b){var c=b.oLanguage.sDecimal;return Ya(a,c,!0)?"num-fmt"+c:null},function(a,b){var c=b.oLanguage.sDecimal;return Rb(a,c)?"html-num"+c:null},function(a,b){var c=b.oLanguage.sDecimal;return Rb(a,c, +!0)?"html-num-fmt"+c:null},function(a){return K(a)||"string"===typeof a&&-1!==a.indexOf("<")?"html":null}]);h.extend(m.ext.type.search,{html:function(a){return K(a)?a:"string"===typeof a?a.replace(Ob," ").replace(Ca,""):""},string:function(a){return K(a)?a:"string"===typeof a?a.replace(Ob," "):a}});var Ba=function(a,b,c,d){if(0!==a&&(!a||"-"===a))return-Infinity;b&&(a=Qb(a,b));a.replace&&(c&&(a=a.replace(c,"")),d&&(a=a.replace(d,"")));return 1*a};h.extend(v.type.order,{"date-pre":function(a){return Date.parse(a)|| +0},"html-pre":function(a){return K(a)?"":a.replace?a.replace(/<.*?>/g,"").toLowerCase():a+""},"string-pre":function(a){return K(a)?"":"string"===typeof a?a.toLowerCase():!a.toString?"":a.toString()},"string-asc":function(a,b){return ab?1:0},"string-desc":function(a,b){return ab?-1:0}});cb("");h.extend(!0,m.ext.renderer,{header:{_:function(a,b,c,d){h(a.nTable).on("order.dt.DT",function(e,f,g,h){if(a===f){e=c.idx;b.removeClass(c.sSortingClass+" "+d.sSortAsc+" "+d.sSortDesc).addClass(h[e]== +"asc"?d.sSortAsc:h[e]=="desc"?d.sSortDesc:c.sSortingClass)}})},jqueryui:function(a,b,c,d){h("
    ").addClass(d.sSortJUIWrapper).append(b.contents()).append(h("").addClass(d.sSortIcon+" "+c.sSortingClassJUI)).appendTo(b);h(a.nTable).on("order.dt.DT",function(e,f,g,h){if(a===f){e=c.idx;b.removeClass(d.sSortAsc+" "+d.sSortDesc).addClass(h[e]=="asc"?d.sSortAsc:h[e]=="desc"?d.sSortDesc:c.sSortingClass);b.find("span."+d.sSortIcon).removeClass(d.sSortJUIAsc+" "+d.sSortJUIDesc+" "+d.sSortJUI+" "+ +d.sSortJUIAscAllowed+" "+d.sSortJUIDescAllowed).addClass(h[e]=="asc"?d.sSortJUIAsc:h[e]=="desc"?d.sSortJUIDesc:c.sSortingClassJUI)}})}}});m.render={number:function(a,b,c,d,e){return{display:function(f){if("number"!==typeof f&&"string"!==typeof f)return f;var g=0>f?"-":"",f=Math.abs(parseFloat(f)),h=parseInt(f,10),f=c?b+(f-h).toFixed(c).substring(2):"";return g+(d||"")+h.toString().replace(/\B(?=(\d{3})+(?!\d))/g,a)+f+(e||"")}}}};h.extend(m.ext.internal,{_fnExternApiFunc:Nb,_fnBuildAjax:ra,_fnAjaxUpdate:lb, +_fnAjaxParameters:ub,_fnAjaxUpdateDraw:vb,_fnAjaxDataSrc:sa,_fnAddColumn:Ga,_fnColumnOptions:la,_fnAdjustColumnSizing:Y,_fnVisibleToColumnIndex:$,_fnColumnIndexToVisible:ba,_fnVisbleColumns:ca,_fnGetColumns:aa,_fnColumnTypes:Ia,_fnApplyColumnDefs:hb,_fnHungarianMap:X,_fnCamelToHungarian:I,_fnLanguageCompat:S,_fnBrowserDetect:fb,_fnAddData:L,_fnAddTr:ma,_fnNodeToDataIndex:function(a,b){return b._DT_RowIndex!==k?b._DT_RowIndex:null},_fnNodeToColumnIndex:function(a,b,c){return h.inArray(c,a.aoData[b].anCells)}, +_fnGetCellData:B,_fnSetCellData:ib,_fnSplitObjNotation:La,_fnGetObjectDataFn:P,_fnSetObjectDataFn:Q,_fnGetDataMaster:Ma,_fnClearTable:na,_fnDeleteIndex:oa,_fnInvalidate:ea,_fnGetRowElements:Ka,_fnCreateTr:Ja,_fnBuildHead:kb,_fnDrawHead:ga,_fnDraw:M,_fnReDraw:R,_fnAddOptionsHtml:nb,_fnDetectHeader:fa,_fnGetUniqueThs:qa,_fnFeatureHtmlFilter:pb,_fnFilterComplete:ha,_fnFilterCustom:yb,_fnFilterColumn:xb,_fnFilter:wb,_fnFilterCreateSearch:Qa,_fnEscapeRegex:va,_fnFilterData:zb,_fnFeatureHtmlInfo:sb,_fnUpdateInfo:Cb, +_fnInfoMacros:Db,_fnInitialise:ia,_fnInitComplete:ta,_fnLengthChange:Ra,_fnFeatureHtmlLength:ob,_fnFeatureHtmlPaginate:tb,_fnPageChange:Ta,_fnFeatureHtmlProcessing:qb,_fnProcessingDisplay:C,_fnFeatureHtmlTable:rb,_fnScrollDraw:Z,_fnApplyToChildren:H,_fnCalculateColumnWidths:Ha,_fnThrottle:ua,_fnConvertToWidth:Fb,_fnGetWidestNode:Gb,_fnGetMaxLenString:Hb,_fnStringToCss:u,_fnSortFlatten:V,_fnSort:mb,_fnSortAria:Jb,_fnSortListener:Ua,_fnSortAttachListener:Oa,_fnSortingClasses:xa,_fnSortData:Ib,_fnSaveState:ya, +_fnLoadState:Kb,_fnSettingsFromNode:za,_fnLog:J,_fnMap:F,_fnBindAction:Va,_fnCallbackReg:z,_fnCallbackFire:w,_fnLengthOverflow:Sa,_fnRenderer:Pa,_fnDataSource:y,_fnRowAttributes:Na,_fnCalculateEnd:function(){}});h.fn.dataTable=m;h.fn.dataTableSettings=m.settings;h.fn.dataTableExt=m.ext;h.fn.DataTable=function(a){return h(this).dataTable(a).api()};h.each(m,function(a,b){h.fn.DataTable[a]=b});return h.fn.dataTable};"function"===typeof define&&define.amd?define("datatables",["jquery"],S):"object"=== +typeof exports?module.exports=S(require("jquery")):jQuery&&!jQuery.fn.dataTable&&S(jQuery)})(window,document); + + +jQuery.fn.dataTable.ext.builder = "dt\/dt-1.10.9,af-2.0.0,b-1.0.3,b-colvis-1.0.3,cr-1.2.0,fc-3.1.0,fh-3.0.0,sc-1.3.0,se-1.0.1"; + +/*! + AutoFill 2.0.0 + ©2008-2015 SpryMedia Ltd - datatables.net/license +*/ +(function(o,i,p){var n=function(f,j){var n=0,g=function(c,b){if(!j.versionCheck||!j.versionCheck("1.10.8"))throw"Warning: AutoFill requires DataTables 1.10.8 or greater";this.c=f.extend(!0,{},j.defaults.autoFill,g.defaults,b);this.s={dt:new j.Api(c),namespace:".autoFill"+n++,scroll:{},scrollInterval:null};this.dom={handle:f('
    '),select:{top:f('
    '),right:f('
    '),bottom:f('
    '), +left:f('
    ')},background:f('
    '),list:f('
    '+this.s.dt.i18n("autoFill.info","")+"
      "),dtScroll:null};this._constructor()};g.prototype={_constructor:function(){var c=this,b=this.s.dt,a=f("div.dataTables_scrollBody",this.s.dt.table().container());a.length&&(this.dom.dtScroll=a,"static"===a.css("position")&&a.css("position","relative"));this._focusListener();this.dom.handle.on("mousedown",function(a){c._mousedown(a); +return false});b.on("destroy.autoFill",function(){b.off(".autoFill");f(b.table().body()).off(c.s.namespace);f(i.body).off(c.s.namespace)})},_attach:function(c){var b=this.s.dt,a=b.cell(c).index();!a||-1===b.columns(this.c.columns).indexes().indexOf(a.column)?this._detach():(this.dom.attachedTo=c,this.dom.handle.appendTo(c))},_actionSelector:function(c){var b=this,a=this.s.dt,d=g.actions,e=[];f.each(d,function(b,d){d.available(a,c)&&e.push(b)});if(1===e.length&&!1===this.c.alwaysAsk){var h=d[e[0]].execute(a, +c);this._update(h,c)}else{var k=this.dom.list.children("ul").empty();e.push("cancel");f.each(e,function(e,h){k.append(f("
    • ").append('
      '+d[h].option(a,c)+"
      ").append(f('
      ').append(f('").on("click",function(){var e=d[h].execute(a,c,f(this).closest("li"));b._update(e,c);b.dom.background.remove();b.dom.list.remove()}))))});this.dom.background.appendTo("body"); +this.dom.list.appendTo("body");this.dom.list.css("margin-top",-1*(this.dom.list.outerHeight()/2))}},_detach:function(){this.dom.attachedTo=null;this.dom.handle.detach()},_drawSelection:function(c){var b=this.s.dt,a=this.s.start,d=f(this.dom.start),e=f(c),h={row:e.parent().index(),column:e.index()};if(b.cell(e).any()&&-1!==b.columns(this.c.columns).indexes().indexOf(h.column)){this.s.end=h;var k,b=a.row=b;d--)a.push(d);return a},_shiftScroll:function(c){var b=this,a=this.s.scroll,d=!1,e=c.pageY-i.body.scrollTop,f=c.pageX-i.body.scrollLeft,k,g,j,l;65>e?k=-5:e> +a.windowHeight-65&&(k=5);65>f?g=-5:f>a.windowWidth-65&&(g=5);null!==a.dtTop&&c.pageYa.dtTop+a.dtHeight-65&&(j=5);null!==a.dtLeft&&c.pageXa.dtLeft+a.dtWidth-65&&(l=5);k||g||j||l?(a.windowVert=k,a.windowHoriz=g,a.dtVert=j,a.dtHoriz=l,d=!0):this.s.scrollInterval&&(clearInterval(this.s.scrollInterval),this.s.scrollInterval=null);!this.s.scrollInterval&&d&&(this.s.scrollInterval=setInterval(function(){if(a.windowVert)i.body.scrollTop= +i.body.scrollTop+a.windowVert;if(a.windowHoriz)i.body.scrollLeft=i.body.scrollLeft+a.windowHoriz;if(a.dtVert||a.dtHoriz){var c=b.dom.dtScroll[0];if(a.dtVert)c.scrollTop=c.scrollTop+a.dtVert;if(a.dtHoriz)c.scrollLeft=c.scrollLeft+a.dtHoriz}},20))},_update:function(c,b){if(!1!==c){var a=this.s.dt,d;this._emitEvent("preAutoFill",[a,b]);this._editor(b);if(null!==this.c.update?this.c.update:!this.c.editor){for(var e=0,f=b.length;e')},execute:function(c,b,a){for(var c=1*b[0][0].data,a=1*f("input",a).val(),d=0,e=b.length;d"+b[0][0].data+"")}, +execute:function(c,b){for(var a=b[0][0].data,d=0,e=b.length;d").addClass(this.c.dom.container.className)};this._constructor()};e.extend(l.prototype,{action:function(a,b){var c=this._indexToButton(a).conf;if(b===m)return c.action; +c.action=b;return this},active:function(a,b){this._indexToButton(a).node.toggleClass(this.c.dom.button.active,b===m?!0:b);return this},add:function(a,b){if("string"===typeof a&&-1!==a.indexOf("-")){var c=a.split("-");this.c.buttons[1*c[0]].buttons.splice(1*c[1],0,b)}else this.c.buttons.splice(1*a,0,b);this.dom.container.empty();this._buildButtons(this.c.buttons);return this},container:function(){return this.dom.container},disable:function(a){this._indexToButton(a).node.addClass(this.c.dom.button.disabled); +return this},destroy:function(){e("body").off("keyup."+this.s.namespace);var a=this.s.buttons,b=this.s.subButtons,c,d,f;c=0;for(a=a.length;c").addClass(i.className),this._buildButtons(h.buttons,h._collection,f));h.init&&h.init.call(d.button(q),d,q,h)}}}},_buildButton:function(a,b){var c=this.c.dom.button,d=this.c.dom.buttonLiner,f= +this.c.dom.collection,g=this.s.dt,h=function(b){return"function"===typeof b?b(g,i,a):b};b&&f.button&&(c=f.button);b&&f.buttonLiner&&(d=f.buttonLiner);if(a.available&&!a.available(g,a))return!1;var i=e("<"+c.tag+"/>").addClass(c.className).attr("tabindex",this.s.dt.settings()[0].iTabIndex).attr("aria-controls",this.s.dt.table().node().id).on("click.dtb",function(b){b.preventDefault();!i.hasClass(c.disabled)&&a.action&&a.action.call(g.button(i),b,g,i,a);i.blur()}).on("keyup.dtb",function(b){b.keyCode=== +13&&!i.hasClass(c.disabled)&&a.action&&a.action.call(g.button(i),b,g,i,a)});d.tag?i.append(e("<"+d.tag+"/>").html(h(a.text)).addClass(d.className)):i.html(h(a.text));!1===a.enabled&&i.addClass(c.disabled);a.className&&i.addClass(a.className);a.namespace||(a.namespace=".dt-button-"+s++);d=(d=this.c.dom.buttonContainer)?e("<"+d.tag+"/>").addClass(d.className).append(i):i;this._addKey(a);return{node:i,inserter:d}},_indexToButton:function(a){if("number"===typeof a||-1===a.indexOf("-"))return this.s.buttons[1* +a];a=a.split("-");return this.s.subButtons[1*a[0]][1*a[1]]},_keypress:function(a,b){var c,d,f,g;f=this.s.buttons;var h=this.s.subButtons,i=function(c,d){if(c.key)if(c.key===a)d.click();else if(e.isPlainObject(c.key)&&c.key.key===a&&(!c.key.shiftKey||b.shiftKey))if(!c.key.altKey||b.altKey)if(!c.key.ctrlKey||b.ctrlKey)(!c.key.metaKey||b.metaKey)&&d.click()};c=0;for(d=f.length;c").addClass(b).css("display","none").appendTo("body").fadeIn(c): +e("body > div."+b).fadeOut(c,function(){e(this).remove()})};l.instanceSelector=function(a,b){if(!a)return e.map(b,function(a){return a.inst});var c=[],d=e.map(b,function(a){return a.name}),f=function(a){if(e.isArray(a))for(var h=0,i=a.length;hb&&d._collection.css("left",a.left-(c-b))):(a=d._collection.height()/2,a>e(r).height()/2&&(a=e(r).height()/2),d._collection.css("marginTop",-1*a));d.background&&l.background(!0,d.backgroundClassName,d.fade);setTimeout(function(){e(n).on("click.dtb-collection",function(a){if(!e(a.target).parents().andSelf().filter(d._collection).length){d._collection.fadeOut(d.fade, +function(){d._collection.detach()});l.background(false,d.backgroundClassName,d.fade);e(n).off("click.dtb-collection")}})},10)},background:!0,collectionLayout:"",backgroundClassName:"dt-button-background",fade:400},copy:function(a,b){if(b.preferHtml&&k.copyHtml5)return"copyHtml5";if(k.copyFlash&&k.copyFlash.available(a,b))return"copyFlash";if(k.copyHtml5)return"copyHtml5"},csv:function(a,b){if(k.csvHtml5&&k.csvHtml5.available(a,b))return"csvHtml5";if(k.csvFlash&&k.csvFlash.available(a,b))return"csvFlash"}, +excel:function(a,b){if(k.excelHtml5&&k.excelHtml5.available(a,b))return"excelHtml5";if(k.excelFlash&&k.excelFlash.available(a,b))return"excelFlash"},pdf:function(a,b){if(k.pdfHtml5&&k.pdfHtml5.available(a,b))return"pdfHtml5";if(k.pdfFlash&&k.pdfFlash.available(a,b))return"pdfFlash"}});j.Api.register("buttons()",function(a,b){b===m&&(b=a,a=m);return this.iterator(!0,"table",function(c){if(c._buttons)return l.buttonSelector(l.instanceSelector(a,c._buttons),b)},!0)});j.Api.register("button()",function(a, +b){var c=this.buttons(a,b);1').html(a? +"

      "+a+"

      ":"").append(e("
      ")["string"===typeof b?"html":"append"](b)).css("display","none").appendTo("body").fadeIn();c!==m&&0!==c&&(o=setTimeout(function(){d.buttons.info(!1)},c));return this});j.Api.register("buttons.exportData()",function(a){if(this.context.length){for(var b=new j.Api(this.context[0]),c=e.extend(!0,{},{rows:null,columns:"",modifier:{search:"applied",order:"applied"},orthogonal:"display",stripHtml:!0,stripNewlines:!0,trim:!0},a),d=function(a){if("string"!==typeof a)return a; +c.stripHtml&&(a=a.replace(/<.*?>/g,""));c.trim&&(a=a.replace(/^\s+|\s+$/g,""));c.stripNewlines&&(a=a.replace(/\n/g," "));return a},a=b.columns(c.columns).indexes().map(function(a){return d(b.column(a).header().innerHTML)}).toArray(),f=b.table().footer()?b.columns(c.columns).indexes().map(function(a){return(a=b.column(a).footer())?d(a.innerHTML):""}).toArray():null,g=b.cells(c.rows,c.columns,c.modifier).render(c.orthogonal).toArray(),h=a.length,i=g.length/h,k=Array(i),l=0,m=0;m/g,"").replace(/^\s+|\s+$/g,"")}},colvisRestore:{className:"buttons-colvisRestore",text:function(a){return a.i18n("buttons.colvisRestore","Restore visibility")},init:function(a,b,c){c._visOriginal=a.columns().indexes().map(function(b){return a.column(b).visible()}).toArray()}, +action:function(a,b,c,d){b.columns().every(function(a){this.visible(d._visOriginal[a])})}},colvisGroup:{className:"buttons-colvisGroup",action:function(a,b,c,d){b.columns(d.show).visible(!0);b.columns(d.hide).visible(!1)},show:[],hide:[]}})})(jQuery,jQuery.fn.dataTable); + + +/*! + ColReorder 1.2.0 + ©2010-2014 SpryMedia Ltd - datatables.net/license +*/ +(function(n,p,r){function o(d){for(var h=[],g=0,a=d.length;gc||c>=h)this.oApi._fnLog(a,1,"ColReorder 'from' index is out of bounds: "+c);else if(0>e||e>=h)this.oApi._fnLog(a,1,"ColReorder 'to' index is out of bounds: "+e);else{k=[];b=0;for(f=h;bthis.s.fixed-1&&bMath.pow(Math.pow(a.pageX-this.s.mouse.startX,2)+Math.pow(a.pageY- +this.s.mouse.startY,2),0.5))return;this._fnCreateDragNode()}this.dom.drag.css({left:a.pageX-this.s.mouse.offsetX,top:a.pageY-this.s.mouse.offsetY});for(var c=!1,d=this.s.mouse.toIndex,b=1,f=this.s.aoTargets.length;b
      ").addClass("DTCR_pointer").css({position:"absolute",top:a?d("div.dataTables_scroll",this.s.dt.nTableWrapper).offset().top:d(this.s.dt.nTable).offset().top,height:a?d("div.dataTables_scroll",this.s.dt.nTableWrapper).height():d(this.s.dt.nTable).height()}).appendTo("body")},_fnSetColumnIndexes:function(){d.each(this.s.dt.aoColumns,function(a,c){d(c.nTh).attr("data-column-index",a)})}};g.defaults= +{aiOrder:null,bRealtime:!0,iFixedColumnsLeft:0,iFixedColumnsRight:0,fnReorderCallback:null};g.version="1.2.0";d.fn.dataTable.ColReorder=g;d.fn.DataTable.ColReorder=g;"function"==typeof d.fn.dataTable&&"function"==typeof d.fn.dataTableExt.fnVersionCheck&&d.fn.dataTableExt.fnVersionCheck("1.10.8")?d.fn.dataTableExt.aoFeatures.push({fnInit:function(a){var c=a.oInstance;a._colReorder?c.oApi._fnLog(a,1,"ColReorder attempted to initialise twice. Ignoring second"):(c=a.oInit,new g(a,c.colReorder||c.oColReorder|| +{}));return null},cFeature:"R",sFeature:"ColReorder"}):alert("Warning: ColReorder requires DataTables 1.10.8 or greater - www.datatables.net/download");d(p).on("preInit.dt.colReorder",function(a,c){if("dt"===a.namespace){var e=c.oInit.colReorder,b=h.defaults.colReorder;if(e||b)b=d.extend({},e,b),!1!==e&&new g(c,b)}});d.fn.dataTable.Api.register("colReorder.reset()",function(){return this.iterator("table",function(a){a._colReorder.fnReset()})});d.fn.dataTable.Api.register("colReorder.order()",function(a){return a? +this.iterator("table",function(c){c._colReorder.fnOrder(a)}):this.context.length?this.context[0]._colReorder.fnOrder():null});return g};"function"===typeof define&&define.amd?define(["jquery","datatables"],n):"object"===typeof exports?n(require("jquery"),require("datatables")):jQuery&&!jQuery.fn.dataTable.ColReorder&&n(jQuery,jQuery.fn.dataTable)})(window,document); + + +/*! + FixedColumns 3.1.0 + ©2010-2014 SpryMedia Ltd - datatables.net/license +*/ +(function(s,t,u){var r=function(d,q){var m=function(a,b){var c=this;if(this instanceof m){if(b===u||!0===b)b={};var e=d.fn.dataTable.camelToHungarian;e&&(e(m.defaults,m.defaults,!0),e(m.defaults,b));e=(new d.fn.dataTable.Api(a)).settings()[0];this.s={dt:e,iTableColumns:e.aoColumns.length,aiOuterWidths:[],aiInnerWidths:[]};this.dom={scroller:null,header:null,body:null,footer:null,grid:{wrapper:null,dt:null,left:{wrapper:null,head:null,body:null,foot:null},right:{wrapper:null,head:null,body:null,foot:null}}, +clone:{left:{header:null,body:null,footer:null},right:{header:null,body:null,footer:null}}};if(e._oFixedColumns)throw"FixedColumns already initialised on this table";e._oFixedColumns=this;e._bInitComplete?this._fnConstruct(b):e.oApi._fnCallbackReg(e,"aoInitComplete",function(){c._fnConstruct(b)},"FixedColumns")}else alert("FixedColumns warning: FixedColumns must be initialised with the 'new' keyword.")};m.prototype={fnUpdate:function(){this._fnDraw(!0)},fnRedrawLayout:function(){this._fnColCalc(); +this._fnGridLayout();this.fnUpdate()},fnRecalculateHeight:function(a){delete a._DTTC_iHeight;a.style.height="auto"},fnSetRowHeight:function(a,b){a.style.height=b+"px"},fnGetPosition:function(a){var b=this.s.dt.oInstance;if(d(a).parents(".DTFC_Cloned").length){if("tr"===a.nodeName.toLowerCase())return a=d(a).index(),b.fnGetPosition(d("tr",this.s.dt.nTBody)[a]);var c=d(a).index(),a=d(a.parentNode).index();return[b.fnGetPosition(d("tr",this.s.dt.nTBody)[a]),c,b.oApi._fnVisibleToColumnIndex(this.s.dt, +c)]}return b.fnGetPosition(a)},_fnConstruct:function(a){var b=this;if("function"!=typeof this.s.dt.oInstance.fnVersionCheck||!0!==this.s.dt.oInstance.fnVersionCheck("1.8.0"))alert("FixedColumns "+m.VERSION+" required DataTables 1.8.0 or later. Please upgrade your DataTables installation");else if(""===this.s.dt.oScroll.sX)this.s.dt.oInstance.oApi._fnLog(this.s.dt,1,"FixedColumns is not needed (no x-scrolling in DataTables enabled), so no action will be taken. Use 'FixedHeader' for column fixing when scrolling is not enabled"); +else{this.s=d.extend(!0,this.s,m.defaults,a);a=this.s.dt.oClasses;this.dom.grid.dt=d(this.s.dt.nTable).parents("div."+a.sScrollWrapper)[0];this.dom.scroller=d("div."+a.sScrollBody,this.dom.grid.dt)[0];this._fnColCalc();this._fnGridSetup();var c;d(this.dom.scroller).on("mouseover.DTFC touchstart.DTFC",function(){c="main"}).on("scroll.DTFC",function(a){!c&&a.originalEvent&&(c="main");if("main"===c&&(0
      ')[0], +e=c.childNodes[0],f=c.childNodes[1];this.dom.grid.dt.parentNode.insertBefore(c,this.dom.grid.dt);c.appendChild(this.dom.grid.dt);this.dom.grid.wrapper=c;0b.clientWidth&&(c.x=!0);a.offsetHeight>b.clientHeight&&(c.y=!0);return c},_fnDraw:function(a){this._fnGridLayout();this._fnCloneLeft(a);this._fnCloneRight(a);null!==this.s.fnDrawCallback&&this.s.fnDrawCallback.call(this,this.dom.clone.left,this.dom.clone.right);d(this).trigger("draw.dtfc",{leftClone:this.dom.clone.left,rightClone:this.dom.clone.right})},_fnCloneRight:function(a){if(!(0>= +this.s.iRightColumns)){var b,c=[];for(b=this.s.iTableColumns-this.s.iRightColumns;b=this.s.iLeftColumns)){var b,c=[];for(b=0;bthead",a.header);k.empty();g=0;for(h=n.length;gthead",a.header)[0]);g=0;for(h=n.length;gtbody>tr",f.dom.body).css("height","auto");null!==a.body&&(d(a.body).remove(),a.body=null);a.body=d(this.dom.body).clone(!0)[0];a.body.className+=" DTFC_Cloned";a.body.style.paddingBottom=j.oScroll.iBarWidth+"px";a.body.style.marginBottom=2*j.oScroll.iBarWidth+"px";null!==a.body.getAttribute("id")&&a.body.removeAttribute("id");d(">thead>tr",a.body).empty();d(">tfoot",a.body).remove();var q=d("tbody",a.body)[0];d(q).empty();if(0thead>tr",a.body)[0];for(o=0;otbody>tr",f.dom.body).each(function(a){var b=this.cloneNode(false);b.removeAttribute("id");a=f.s.dt.aoData[f.s.dt.oFeatures.bServerSide===false?f.s.dt.aiDisplay[f.s.dt._iDisplayStart+a]:a].anCells||d(this).children("td, th");for(o=0;o0){p=d(a[l]).clone(true,true)[0];b.appendChild(p)}}q.appendChild(b)})}else d(">tbody>tr",f.dom.body).each(function(){p=this.cloneNode(true);p.className=p.className+" DTFC_NoData";d("td",p).html("");q.appendChild(p)});a.body.style.width="100%";a.body.style.margin="0";a.body.style.padding="0";j.oScroller!==u&&(h=j.oScroller.dom.force,b.forcer?b.forcer.style.height=h.style.height:(b.forcer=h.cloneNode(!0),b.liner.appendChild(b.forcer)));b.liner.appendChild(a.body);this._fnEqualiseHeights("tbody", +f.dom.body,a.body);if(null!==j.nTFoot){if(e){null!==a.footer&&a.footer.parentNode.removeChild(a.footer);a.footer=d(this.dom.footer).clone(!0,!0)[0];a.footer.className+=" DTFC_Cloned";a.footer.style.width="100%";b.foot.appendChild(a.footer);n=this._fnCopyLayout(j.aoFooter,c,!0);b=d(">tfoot",a.footer);b.empty();g=0;for(h=n.length;gtfoot",a.footer)[0]);g=0;for(h=n.length;g< +h;g++){i=0;for(k=n[g].length;ithead",a.header)[0]);d(b).each(function(a){l=c[a];this.style.width=f.s.aiInnerWidths[l]+"px"});null!==f.s.dt.nTFoot&&(b=j.oApi._fnGetUniqueThs(j,d(">tfoot",a.footer)[0]),d(b).each(function(a){l=c[a];this.style.width=f.s.aiInnerWidths[l]+"px"}))},_fnGetTrNodes:function(a){for(var b=[],c=0,d=a.childNodes.length;c"+a+">tr:eq(0)",b).children(":first");a.outerHeight();a.height();for(var g=this._fnGetTrNodes(g),b=this._fnGetTrNodes(c),h=[],c=0,a=b.length;ce?f:e,"semiauto"==this.s.sHeightMatch&&(g[c]._DTTC_iHeight=e),h.push(e);c=0;for(a=b.length;c=c.tfootBottom+this.c.footerOffset?"in-place":c.windowHeight+a>c.tbodyTop+c.tfootHeight+this.c.footerOffset?"in":"above",(b||a!==this.s.footerMode)&&this._modeChange(a,"footer",b))}};f.version="3.0.0";f.defaults={header:!0,footer:!1,headerOffset:0,footerOffset:0}; +e.fn.dataTable.FixedHeader=f;e.fn.DataTable.FixedHeader=f;e(j).on("init.dt.dtb",function(b,a){if("dt"===b.namespace){var c=a.oInit.fixedHeader||i.defaults.fixedHeader;c&&!a._buttons&&new f(a,c)}});i.Api.register("fixedHeader()",function(){});i.Api.register("fixedHeader.adjust()",function(){return this.iterator("table",function(b){(b=b._fixedHeader)&&b.update()})});return f};"function"===typeof define&&define.amd?define(["jquery","datatables"],g):"object"===typeof exports?g(require("jquery"),require("datatables")): +jQuery&&!jQuery.fn.dataTable.FixedHeader&&g(jQuery,jQuery.fn.dataTable)})(window,document); + + +/*! + Scroller 1.3.0 + ©2011-2015 SpryMedia Ltd - datatables.net/license +*/ +(function(m,n,k){var j=function(e,j){var g=function(a,b){this instanceof g?(b===k&&(b={}),this.s={dt:e.fn.dataTable.Api(a).settings()[0],tableTop:0,tableBottom:0,redrawTop:0,redrawBottom:0,autoHeight:!0,viewportRows:0,stateTO:null,drawTO:null,heights:{jump:null,page:null,virtual:null,scroll:null,row:null,viewport:null},topRowFloat:0,scrollDrawDiff:null,loaderVisible:!1},this.s=e.extend(this.s,g.oDefaults,b),this.s.heights.row=this.s.rowHeight,this.dom={force:n.createElement("div"),scroller:null,table:null, +loader:null},this.s.dt.oScroller||(this.s.dt.oScroller=this,this._fnConstruct())):alert("Scroller warning: Scroller must be initialised with the 'new' keyword.")};g.prototype={fnRowToPixels:function(a,b,c){a=c?this._domain("virtualToPhysical",a*this.s.heights.row):this.s.baseScrollTop+(a-this.s.baseRowTop)*this.s.heights.row;return b||b===k?parseInt(a,10):a},fnPixelsToRow:function(a,b,c){var d=a-this.s.baseScrollTop,a=c?this._domain("physicalToVirtual",a)/this.s.heights.row:d/this.s.heights.row+this.s.baseRowTop; +return b||b===k?parseInt(a,10):a},fnScrollToRow:function(a,b){var c=this,d=!1,f=this.fnRowToPixels(a),i=a-(this.s.displayBuffer-1)/2*this.s.viewportRows;0>i&&(i=0);if((f>this.s.redrawBottom||ftable",this.dom.scroller)[0];this.dom.table.style.position="absolute";this.dom.table.style.top="0px";this.dom.table.style.left="0px";e(this.s.dt.nTableWrapper).addClass("DTS");this.s.loadingIndicator&&(this.dom.loader=e('
      '+this.s.dt.oLanguage.sLoadingRecords+"
      ").css("display","none"),e(this.dom.scroller.parentNode).css("position","relative").append(this.dom.loader)); +this.s.heights.row&&"auto"!=this.s.heights.row&&(this.s.autoHeight=!1);this.fnMeasure(!1);this.s.ingnoreScroll=!0;this.s.stateSaveThrottle=this.s.dt.oApi._fnThrottle(function(){a.s.dt.oApi._fnSaveState(a.s.dt)},500);e(this.dom.scroller).on("scroll.DTS",function(){a._fnScroll.call(a)});e(this.dom.scroller).on("touchstart.DTS",function(){a._fnScroll.call(a)});this.s.dt.aoDrawCallback.push({fn:function(){a.s.dt.bInitialised&&a._fnDrawCallback.call(a)},sName:"Scroller"});e(m).on("resize.DTS",function(){a.fnMeasure(false); +a._fnInfo()});var b=!0;this.s.dt.oApi._fnCallbackReg(this.s.dt,"aoStateSaveParams",function(c,d){if(b&&a.s.dt.oLoadedState){d.iScroller=a.s.dt.oLoadedState.iScroller;d.iScrollerTopRow=a.s.dt.oLoadedState.iScrollerTopRow;b=false}else{d.iScroller=a.dom.scroller.scrollTop;d.iScrollerTopRow=a.s.topRowFloat}},"Scroller_State");this.s.dt.oLoadedState&&(this.s.topRowFloat=this.s.dt.oLoadedState.iScrollerTopRow||0);e(this.s.dt.nTable).on("init.dt",function(){a.fnMeasure()});this.s.dt.aoDestroyCallback.push({sName:"Scroller", +fn:function(){e(m).off("resize.DTS");e(a.dom.scroller).off("touchstart.DTS scroll.DTS");e(a.s.dt.nTableWrapper).removeClass("DTS");e("div.DTS_Loading",a.dom.scroller.parentNode).remove();e(a.s.dt.nTable).off("init.dt");a.dom.table.style.position="";a.dom.table.style.top="";a.dom.table.style.left=""}})}else this.s.dt.oApi._fnLog(this.s.dt,0,"Pagination must be enabled for Scroller")},_fnScroll:function(){var a=this,b=this.s.heights,c=this.dom.scroller.scrollTop,d;if(!this.s.skip&&!this.s.ingnoreScroll)if(this.s.dt.bFiltered|| +this.s.dt.bSorted)this.s.lastScrollTop=0;else{this._fnInfo();clearTimeout(this.s.stateTO);this.s.stateTO=setTimeout(function(){a.s.dt.oApi._fnSaveState(a.s.dt)},250);if(cthis.s.redrawBottom){var f=Math.ceil((this.s.displayBuffer-1)/2*this.s.viewportRows);Math.abs(c-this.s.lastScrollTop)>b.viewport||this.s.ani?(d=parseInt(this._domain("physicalToVirtual",c)/b.row,10)-f,this.s.topRowFloat=this._domain("physicalToVirtual",c)/b.row):(d=this.fnPixelsToRow(c)-f,this.s.topRowFloat=this.fnPixelsToRow(c, +!1));0>=d?d=0:d+this.s.dt._iDisplayLength>this.s.dt.fnRecordsDisplay()?(d=this.s.dt.fnRecordsDisplay()-this.s.dt._iDisplayLength,0>d&&(d=0)):0!==d%2&&d++;if(d!=this.s.dt._iDisplayStart&&(this.s.tableTop=e(this.s.dt.nTable).offset().top,this.s.tableBottom=e(this.s.dt.nTable).height()+this.s.tableTop,b=function(){if(a.s.scrollDrawReq===null)a.s.scrollDrawReq=c;a.s.dt._iDisplayStart=d;a.s.dt.oApi._fnDraw(a.s.dt)},this.s.dt.oFeatures.bServerSide?(clearTimeout(this.s.drawTO),this.s.drawTO=setTimeout(b, +this.s.serverWait)):b(),this.dom.loader&&!this.s.loaderVisible))this.dom.loader.css("display","block"),this.s.loaderVisible=!0}this.s.lastScrollTop=c;this.s.stateSaveThrottle()}},_domain:function(a,b){var c=this.s.heights,d;if(c.virtual===c.scroll){d=(c.virtual-c.viewport)/(c.scroll-c.viewport);if("virtualToPhysical"===a)return b/d;if("physicalToVirtual"===a)return b*d}var e=(c.scroll-c.viewport)/2,i=(c.virtual-c.viewport)/2;d=i/(e*e);if("virtualToPhysical"===a){if(bb?c.scroll:2*e-Math.pow(b/d,0.5)}if("physicalToVirtual"===a){if(bb?c.virtual:2*i-b*b*d}},_fnDrawCallback:function(){var a=this,b=this.s.heights,c=this.dom.scroller.scrollTop,d=e(this.s.dt.nTable).height(),f=this.s.dt._iDisplayStart,i=this.s.dt._iDisplayLength,g=this.s.dt.fnRecordsDisplay();this.s.skip=!0;this._fnScrollForce();c=0===f?this.s.topRowFloat*b.row:f+i>=g?b.scroll-(g-this.s.topRowFloat)*b.row:this._domain("virtualToPhysical",this.s.topRowFloat* +b.row);this.dom.scroller.scrollTop=c;this.s.baseScrollTop=c;this.s.baseRowTop=this.s.topRowFloat;var l=c-(this.s.topRowFloat-f)*b.row;0===f?l=0:f+i>=g&&(l=b.scroll-d);this.dom.table.style.top=l+"px";this.s.tableTop=l;this.s.tableBottom=d+this.s.tableTop;d=(c-this.s.tableTop)*this.s.boundaryScale;this.s.redrawTop=c-d;this.s.redrawBottom=c+d;this.s.skip=!1;this.s.dt.oFeatures.bStateSave&&null!==this.s.dt.oLoadedState&&"undefined"!=typeof this.s.dt.oLoadedState.iScroller?((c=(this.s.dt.sAjaxSource|| +a.s.dt.ajax)&&!this.s.dt.oFeatures.bServerSide?!0:!1)&&2==this.s.dt.iDraw||!c&&1==this.s.dt.iDraw)&&setTimeout(function(){e(a.dom.scroller).scrollTop(a.s.dt.oLoadedState.iScroller);a.s.redrawTop=a.s.dt.oLoadedState.iScroller-b.viewport/2;setTimeout(function(){a.s.ingnoreScroll=!1},0)},0):a.s.ingnoreScroll=!1;setTimeout(function(){a._fnInfo.call(a)},0);this.dom.loader&&this.s.loaderVisible&&(this.dom.loader.css("display","none"),this.s.loaderVisible=!1)},_fnScrollForce:function(){var a=this.s.heights; +a.virtual=a.row*this.s.dt.fnRecordsDisplay();a.scroll=a.virtual;1E6this.s.heights.row?a.scroll+"px":this.s.heights.row+"px"},_fnCalcRowHeight:function(){var a=this.s.dt,b=a.nTable,c=b.cloneNode(!1),d=e("
    • ").appendTo(c),f=e('
      ');for(e("tbody tr:lt(4)",b).clone().appendTo(d);3>e("tr",d).length;)d.append(""); +e("div."+a.oClasses.sScrollBody,f).append(c);f.appendTo(this.s.dt.nHolding||b.parentNode);this.s.heights.row=e("tr",d).eq(1).outerHeight();f.remove()},_fnInfo:function(){if(this.s.dt.oFeatures.bInfo){var a=this.s.dt,b=a.oLanguage,c=this.dom.scroller.scrollTop,d=Math.floor(this.fnPixelsToRow(c,!1,this.s.ani)+1),f=a.fnRecordsTotal(),g=a.fnRecordsDisplay(),c=Math.ceil(this.fnPixelsToRow(c+this.s.heights.viewport,!1,this.s.ani)),c=g'),d=function(c,d){b.append(e('').append(a.i18n("select."+c+"s",{_:"%d "+c+"s selected","0":"",1:"1 "+c+" selected"},d)))};d("row",a.rows({selected:!0}).flatten().length);d("column",a.columns({selected:!0}).flatten().length);d("cell",a.cells({selected:!0}).flatten().length); +e.each(c.aanFeatures.i,function(c,a){var a=e(a),d=a.children("span.select-info");d.length&&d.remove();""!==b.text()&&a.append(b)})}}function o(a,c){if(c||"single"===a._select.style){var b=new h.Api(a);b.rows({selected:!0}).deselect();b.columns({selected:!0}).deselect();b.cells({selected:!0}).deselect()}}function r(a,c,b,d,g){var q=c.select.style(),f=c[d](g,{selected:!0}).any();"os"===q?a.ctrlKey||a.metaKey?c[d](g).select(!f):a.shiftKey?"cell"===d?(d=b._select_lastCell||null,f=function(b,a){if(b>a)var d= +a,a=b,b=d;var f=!1;return c.columns(":visible").indexes().filter(function(c){c===b&&(f=!0);return c===a?(f=!1,!0):f})},a=function(b,a){var d=c.rows({search:"applied"}).indexes();if(d.indexOf(b)>d.indexOf(a))var f=a,a=b,b=f;var g=!1;return d.filter(function(c){c===b&&(g=!0);return c===a?(g=!1,!0):g})},!c.cells({selected:!0}).any()&&!d?(f=f(0,g.column),d=a(0,g.row)):(f=f(d.column,g.column),d=a(d.row,g.row)),d=c.cells(d,f).flatten(),c.cells(g,{selected:!0}).any()?c.cells(d).deselect():c.cells(d).select()): +(a=b._select_lastCell?b._select_lastCell[d]:null,f=c[d+"s"]({search:"applied"}).indexes(),a=e.inArray(a,f),b=e.inArray(g,f),!c[d+"s"]({selected:!0}).any()&&-1===a?f.splice(e.inArray(g,f)+1,f.length):(a>b&&(q=b,b=a,a=q),f.splice(b+1,f.length),f.splice(0,a)),c[d](g,{selected:!0}).any())?(f.splice(e.inArray(g,f),1),c[d+"s"](f).deselect()):c[d+"s"](f).select():(a=c[d+"s"]({selected:!0}),f&&1===a.flatten().length?c[d](g).deselect():(a.deselect(),c[d](g).select())):c[d](g).select(!f)}function p(a,c){return function(b){return b.i18n("buttons."+ +a,c)}}h.select={};h.select.version="1.0.1";e.each([{type:"row",prop:"aoData"},{type:"column",prop:"aoColumns"}],function(a,c){h.ext.selector[c.type].push(function(b,a,g){var a=a.selected,e,f=[];if(a===i)return g;for(var k=0,h=g.length;k' || strftime('%Y-%m-%d',birthday) || '' || strftime('%d.%m.%Y',birthday) as birthday from childs where leavedate >= date('now')", +"heads":"action,checkservicenumber,prename,surname,birthday", +"description":"courants (date actuelle <= date de sortie)"}, +{"sql":"select '%%ACTION%%' as action, checkservicenumber, prename,surname, '' || strftime('%Y-%m-%d',birthday) || '' || strftime('%d.%m.%Y',birthday) as birthday from childs where checkserviceexpiration >= date('now','-1 months')", +"heads":"action,checkservicenumber,prename,surname,birthday", +"description":"expiration checkservice (<= 1 mois)"}, +{"sql":"select '%%ACTION%%' as action, checkservicenumber, prename,surname, '' || strftime('%Y-%m-%d',birthday) || '' || strftime('%d.%m.%Y',birthday) as birthday from childs where entrydate >= date('now')", +"heads":"action,checkservicenumber,prename,surname,birthday", +"description":"futur (date d'entrée >= date actuelle)"}, +{"sql":"select '%%ACTION%%' as action, checkservicenumber, prename,surname, '' || strftime('%Y-%m-%d',birthday) || '' || strftime('%d.%m.%Y',birthday) as birthday from childs", +"heads":"action,checkservicenumber,prename,surname,birthday", +"description":"tous"}, +{"sql":"select '%%ACTION%%' as action, checkservicenumber, prename,surname, '' || strftime('%Y-%m-%d',birthday) || '' || strftime('%d.%m.%Y',birthday) as birthday from childs where leavedate < date('now')", +"heads":"action,checkservicenumber,prename,surname,birthday" , +"description":"anciens (date actuelle > date de sortie)"}, +{"sql":"select '%%ACTION%%' as action, checkservicenumber, prename,surname, '' || strftime('%Y-%m-%d',birthday) || '' || strftime('%d.%m.%Y',birthday) as birthday from childs where leavedate >= date('now','-2 months') and cautionamount is not null and cautionpayedback is null", +"heads":"action,checkservicenumber,prename,surname,birthday", +"description":"Caution à rembourser (sorties < 2 mois)"}, +{"sql":"select '%%ACTION2%%' as action, coalesce(ch.prename,'') || ' ' || coalesce(ch.surname,'') || '
      ' || '(' || coalesce(ch.checkservicenumber,'') || ')' as childname, rp.priority, "+ +" coalesce(rp.prename,'') || ' ' || coalesce(rp.surname,'') as nameprename, "+ + " case when rp.phone is not null then ': ' || rp.phone || '
      ' else '' end || case when rp.mobile is not null then': ' || rp.mobile || '
      ' else '' end || case when rp.workphone is not null then ': ' || rp.workphone || '
      ' else '' end as phone, coalesce(rp.address,'') || '
      ' || coalesce(rp.zip,'') || ' ' || coalesce(rp.city,'') || '
      ' || coalesce(rp.country,'') as address, coalesce(rp.remark,'') as divers "+ + " from childs ch left join refpersons rp on (ch.uuid=rp.childuuid) where ch.leavedate >= date('now') and ch.checkservicenumber is not null "+ +" order by ch.prename,ch.surname,rp.priority,rp.reftype DESC", +"heads":"action,childname,priority,nameprename,phone,address", +"description":"Parents / Personnes de référence"}, +{"sql":"select '%%ACTION2%%' as action,ch.checkservicenumber as checkservicenumber,ch.prename as prename,ch.surname as surname," + + "'' || strftime('%Y-%m-%d',plnow.datebegin) || '' || strftime('%d.%m.%Y',plnow.datebegin) as datebeginnow,'' || strftime('%Y-%m-%d',plnow.dateend) || '' || strftime('%d.%m.%Y',plnow.dateend) as dateendnow,gr.grpname as grpname, " + + "'' || strftime('%Y-%m-%d',plnext.nextdatebegin) || '' || strftime('%d.%m.%Y',plnext.nextdatebegin) as datebeginnext, '' || strftime('%Y-%m-%d',plnext.nextdateend) || '' || strftime('%d.%m.%Y',plnext.nextdateend) as dateendnext, gr2.grpname as nextgroup " + + "from (select uuid, prename,surname,checkservicenumber from childs where date('now') between entrydate and leavedate) ch left join (select * from planning where date('now') between datebegin and dateend) plnow on (ch.uuid=plnow.childuuid) left join groups gr on (plnow.groupuuid=gr.uuid) " + + "left join (select childuuid, groupuuid,max(datebegin) as nextdatebegin,max(dateend) as nextdateend from planning where datebegin > date('now') group by childuuid ) plnext on (ch.uuid=plnext.childuuid) left join groups gr2 on (plnext.groupuuid = gr2.uuid);", + "heads":"action,checkservicenumber,prename,surname,datebeginnow,dateendnow,grpname,datebeginnext,dateendnext,grpname", + "description":"Planification groupes courrant et prochain" +} + +]; + +function getallfilters(){ + var ret = new Array(); + for (var f=0;fa?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b=a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+-new Date,v=a.document,w=0,x=0,y=gb(),z=gb(),A=gb(),B=function(a,b){return a===b&&(l=!0),0},C="undefined",D=1<<31,E={}.hasOwnProperty,F=[],G=F.pop,H=F.push,I=F.push,J=F.slice,K=F.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},L="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",N="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=N.replace("w","w#"),P="\\["+M+"*("+N+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+O+"))|)"+M+"*\\]",Q=":("+N+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+P+")*)|.*)\\)|)",R=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),S=new RegExp("^"+M+"*,"+M+"*"),T=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),V=new RegExp(Q),W=new RegExp("^"+O+"$"),X={ID:new RegExp("^#("+N+")"),CLASS:new RegExp("^\\.("+N+")"),TAG:new RegExp("^("+N.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+Q),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+L+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{I.apply(F=J.call(v.childNodes),v.childNodes),F[v.childNodes.length].nodeType}catch(eb){I={apply:F.length?function(a,b){H.apply(a,J.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],!a||"string"!=typeof a)return d;if(1!==(k=b.nodeType)&&9!==k)return[];if(p&&!e){if(f=_.exec(a))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return I.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return I.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=9===k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+qb(o[l]);w=ab.test(a)&&ob(b.parentNode)||b,x=o.join(",")}if(x)try{return I.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function gb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function hb(a){return a[u]=!0,a}function ib(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function jb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function kb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||D)-(~a.sourceIndex||D);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function lb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function nb(a){return hb(function(b){return b=+b,hb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function ob(a){return a&&typeof a.getElementsByTagName!==C&&a}c=fb.support={},f=fb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fb.setDocument=function(a){var b,e=a?a.ownerDocument||a:v,g=e.defaultView;return e!==n&&9===e.nodeType&&e.documentElement?(n=e,o=e.documentElement,p=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){m()},!1):g.attachEvent&&g.attachEvent("onunload",function(){m()})),c.attributes=ib(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ib(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(e.getElementsByClassName)&&ib(function(a){return a.innerHTML="
      ",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=ib(function(a){return o.appendChild(a).id=u,!e.getElementsByName||!e.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==C&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c=typeof a.getAttributeNode!==C&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==C?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==C&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(e.querySelectorAll))&&(ib(function(a){a.innerHTML="",a.querySelectorAll("[msallowclip^='']").length&&q.push("[*^$]="+M+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+M+"*(?:value|"+L+")"),a.querySelectorAll(":checked").length||q.push(":checked")}),ib(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+M+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ib(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",Q)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===v&&t(v,a)?-1:b===e||b.ownerDocument===v&&t(v,b)?1:k?K.call(k,a)-K.call(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],i=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:k?K.call(k,a)-K.call(k,b):0;if(f===g)return kb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?kb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},e):n},fb.matches=function(a,b){return fb(a,null,null,b)},fb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fb(b,n,null,[a]).length>0},fb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&E.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fb.selectors={cacheLength:50,createPseudo:hb,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+M+")"+a+"("+M+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==C&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?hb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=K.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:hb(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?hb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:hb(function(a){return function(b){return fb(a,b).length>0}}),contains:hb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:hb(function(a){return W.test(a||"")||fb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:nb(function(){return[0]}),last:nb(function(a,b){return[b-1]}),eq:nb(function(a,b,c){return[0>c?c+b:c]}),even:nb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:nb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:nb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:nb(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function rb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function sb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function tb(a,b,c){for(var d=0,e=b.length;e>d;d++)fb(a,b[d],c);return c}function ub(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function vb(a,b,c,d,e,f){return d&&!d[u]&&(d=vb(d)),e&&!e[u]&&(e=vb(e,f)),hb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||tb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ub(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ub(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?K.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ub(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):I.apply(g,r)})}function wb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=rb(function(a){return a===b},h,!0),l=rb(function(a){return K.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>i;i++)if(c=d.relative[a[i].type])m=[rb(sb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return vb(i>1&&sb(m),i>1&&qb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&wb(a.slice(i,e)),f>e&&wb(a=a.slice(e)),f>e&&qb(a))}m.push(c)}return sb(m)}function xb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=G.call(i));s=ub(s)}I.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&fb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?hb(f):f}return h=fb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xb(e,d)),f.selector=a}return f},i=fb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&ob(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qb(j),!a)return I.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&ob(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ib(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ib(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||jb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ib(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||jb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ib(function(a){return null==a.getAttribute("disabled")})||jb(L,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fb}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h; +if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML="
      ").append(a("").attr({"data-action":"today",title:d.tooltips.today}).append(a("").addClass(d.icons.today)))),!d.sideBySide&&A()&&z()&&b.push(a("").append(a("").attr({"data-action":"togglePicker",title:d.tooltips.selectTime}).append(a("").addClass(d.icons.time)))),d.showClear&&b.push(a("").append(a("").attr({"data-action":"clear",title:d.tooltips.clear}).append(a("").addClass(d.icons.clear)))),d.showClose&&b.push(a("").append(a("").attr({"data-action":"close",title:d.tooltips.close}).append(a("").addClass(d.icons.close)))),a("").addClass("table-condensed").append(a("").append(a("").append(b)))},F=function(){var b=a("
      ").addClass("bootstrap-datetimepicker-widget dropdown-menu"),c=a("
      ").addClass("datepicker").append(B()),e=a("
      ").addClass("timepicker").append(D()),f=a("
        ").addClass("list-unstyled"),g=a("
      • ").addClass("picker-switch"+(d.collapse?" accordion-toggle":"")).append(E());return d.inline&&b.removeClass("dropdown-menu"),h&&b.addClass("usetwentyfour"),y("s")&&!h&&b.addClass("wider"),d.sideBySide&&A()&&z()?(b.addClass("timepicker-sbs"),"top"===d.toolbarPlacement&&b.append(g),b.append(a("
        ").addClass("row").append(c.addClass("col-md-6")).append(e.addClass("col-md-6"))),"bottom"===d.toolbarPlacement&&b.append(g),b):("top"===d.toolbarPlacement&&f.append(g),A()&&f.append(a("
      • ").addClass(d.collapse&&z()?"collapse in":"").append(c)),"default"===d.toolbarPlacement&&f.append(g),z()&&f.append(a("
      • ").addClass(d.collapse&&A()?"collapse":"").append(e)),"bottom"===d.toolbarPlacement&&f.append(g),b.append(f))},G=function(){var b,e={};return b=c.is("input")||d.inline?c.data():c.find("input").data(),b.dateOptions&&b.dateOptions instanceof Object&&(e=a.extend(!0,e,b.dateOptions)),a.each(d,function(a){var c="date"+a.charAt(0).toUpperCase()+a.slice(1);void 0!==b[c]&&(e[a]=b[c])}),e},H=function(){var b,e=(n||c).position(),f=(n||c).offset(),g=d.widgetPositioning.vertical,h=d.widgetPositioning.horizontal;if(d.widgetParent)b=d.widgetParent.append(o);else if(c.is("input"))b=c.after(o).parent();else{if(d.inline)return void(b=c.append(o));b=c,c.children().first().after(o)}if("auto"===g&&(g=f.top+1.5*o.height()>=a(window).height()+a(window).scrollTop()&&o.height()+c.outerHeight()a(window).width()?"right":"left"),"top"===g?o.addClass("top").removeClass("bottom"):o.addClass("bottom").removeClass("top"),"right"===h?o.addClass("pull-right"):o.removeClass("pull-right"),"relative"!==b.css("position")&&(b=b.parents().filter(function(){return"relative"===a(this).css("position")}).first()),0===b.length)throw new Error("datetimepicker component should be placed within a relative positioned container");o.css({top:"top"===g?"auto":e.top+c.outerHeight(),bottom:"top"===g?e.top+c.outerHeight():"auto",left:"left"===h?b===c?0:e.left:"auto",right:"left"===h?"auto":b.outerWidth()-c.outerWidth()-(b===c?0:e.left)})},I=function(a){"dp.change"===a.type&&(a.date&&a.date.isSame(a.oldDate)||!a.date&&!a.oldDate)||c.trigger(a)},J=function(a){"y"===a&&(a="YYYY"),I({type:"dp.update",change:a,viewDate:f.clone()})},K=function(a){o&&(a&&(k=Math.max(p,Math.min(3,k+a))),o.find(".datepicker > div").hide().filter(".datepicker-"+q[k].clsName).show())},L=function(){var b=a("
      "),c=f.clone().startOf("w").startOf("d");for(d.calendarWeeks===!0&&b.append(a(""),d.calendarWeeks&&c.append('"),k.push(c)),g="",b.isBefore(f,"M")&&(g+=" old"),b.isAfter(f,"M")&&(g+=" new"),b.isSame(e,"d")&&!m&&(g+=" active"),Q(b,"d")||(g+=" disabled"),b.isSame(x(),"d")&&(g+=" today"),(0===b.day()||6===b.day())&&(g+=" weekend"),c.append('"),b.add(1,"d");i.find("tbody").empty().append(k),S(),T(),U()}},W=function(){var b=o.find(".timepicker-hours table"),c=f.clone().startOf("d"),d=[],e=a("");for(f.hour()>11&&!h&&c.hour(12);c.isSame(f,"d")&&(h||f.hour()<12&&c.hour()<12||f.hour()>11);)c.hour()%4===0&&(e=a(""),d.push(e)),e.append('"),c.add(1,"h");b.empty().append(d)},X=function(){for(var b=o.find(".timepicker-minutes table"),c=f.clone().startOf("h"),e=[],g=a(""),h=1===d.stepping?5:d.stepping;f.isSame(c,"h");)c.minute()%(4*h)===0&&(g=a(""),e.push(g)),g.append('"),c.add(h,"m");b.empty().append(e)},Y=function(){for(var b=o.find(".timepicker-seconds table"),c=f.clone().startOf("m"),d=[],e=a("");f.isSame(c,"m");)c.second()%20===0&&(e=a(""),d.push(e)),e.append('"),c.add(5,"s");b.empty().append(d)},Z=function(){var a,b,c=o.find(".timepicker span[data-time-component]");h||(a=o.find(".timepicker [data-action=togglePeriod]"),b=e.clone().add(e.hours()>=12?-12:12,"h"),a.text(e.format("A")),Q(b,"h")?a.removeClass("disabled"):a.addClass("disabled")),c.filter("[data-time-component=hours]").text(e.format(h?"HH":"hh")),c.filter("[data-time-component=minutes]").text(e.format("mm")),c.filter("[data-time-component=seconds]").text(e.format("ss")),W(),X(),Y()},$=function(){o&&(V(),Z())},_=function(a){var b=m?null:e;return a?(a=a.clone().locale(d.locale),1!==d.stepping&&a.minutes(Math.round(a.minutes()/d.stepping)*d.stepping%60).seconds(0),void(Q(a)?(e=a,f=e.clone(),g.val(e.format(i)),c.data("date",e.format(i)),m=!1,$(),I({type:"dp.change",date:e.clone(),oldDate:b})):(d.keepInvalid||g.val(m?"":e.format(i)),I({type:"dp.error",date:a})))):(m=!0,g.val(""),c.data("date",""),I({type:"dp.change",date:!1,oldDate:b}),void $())},aa=function(){var b=!1;return o?(o.find(".collapse").each(function(){var c=a(this).data("collapse");return c&&c.transitioning?(b=!0,!1):!0}),b?l:(n&&n.hasClass("btn")&&n.toggleClass("active"),o.hide(),a(window).off("resize",H),o.off("click","[data-action]"),o.off("mousedown",!1),o.remove(),o=!1,I({type:"dp.hide",date:e.clone()}),g.blur(),l)):l},ba=function(){_(null)},ca={next:function(){var a=q[k].navFnc;f.add(q[k].navStep,a),V(),J(a)},previous:function(){var a=q[k].navFnc;f.subtract(q[k].navStep,a),V(),J(a)},pickerSwitch:function(){K(1)},selectMonth:function(b){var c=a(b.target).closest("tbody").find("span").index(a(b.target));f.month(c),k===p?(_(e.clone().year(f.year()).month(f.month())),d.inline||aa()):(K(-1),V()),J("M")},selectYear:function(b){var c=parseInt(a(b.target).text(),10)||0;f.year(c),k===p?(_(e.clone().year(f.year())),d.inline||aa()):(K(-1),V()),J("YYYY")},selectDecade:function(b){var c=parseInt(a(b.target).data("selection"),10)||0;f.year(c),k===p?(_(e.clone().year(f.year())),d.inline||aa()):(K(-1),V()),J("YYYY")},selectDay:function(b){var c=f.clone();a(b.target).is(".old")&&c.subtract(1,"M"),a(b.target).is(".new")&&c.add(1,"M"),_(c.date(parseInt(a(b.target).text(),10))),z()||d.keepOpen||d.inline||aa()},incrementHours:function(){var a=e.clone().add(1,"h");Q(a,"h")&&_(a)},incrementMinutes:function(){var a=e.clone().add(d.stepping,"m");Q(a,"m")&&_(a)},incrementSeconds:function(){var a=e.clone().add(1,"s");Q(a,"s")&&_(a)},decrementHours:function(){var a=e.clone().subtract(1,"h");Q(a,"h")&&_(a)},decrementMinutes:function(){var a=e.clone().subtract(d.stepping,"m");Q(a,"m")&&_(a)},decrementSeconds:function(){var a=e.clone().subtract(1,"s");Q(a,"s")&&_(a)},togglePeriod:function(){_(e.clone().add(e.hours()>=12?-12:12,"h"))},togglePicker:function(b){var c,e=a(b.target),f=e.closest("ul"),g=f.find(".in"),h=f.find(".collapse:not(.in)");if(g&&g.length){if(c=g.data("collapse"),c&&c.transitioning)return;g.collapse?(g.collapse("hide"),h.collapse("show")):(g.removeClass("in"),h.addClass("in")),e.is("span")?e.toggleClass(d.icons.time+" "+d.icons.date):e.find("span").toggleClass(d.icons.time+" "+d.icons.date)}},showPicker:function(){o.find(".timepicker > div:not(.timepicker-picker)").hide(),o.find(".timepicker .timepicker-picker").show()},showHours:function(){o.find(".timepicker .timepicker-picker").hide(),o.find(".timepicker .timepicker-hours").show()},showMinutes:function(){o.find(".timepicker .timepicker-picker").hide(),o.find(".timepicker .timepicker-minutes").show()},showSeconds:function(){o.find(".timepicker .timepicker-picker").hide(),o.find(".timepicker .timepicker-seconds").show()},selectHour:function(b){var c=parseInt(a(b.target).text(),10);h||(e.hours()>=12?12!==c&&(c+=12):12===c&&(c=0)),_(e.clone().hours(c)),ca.showPicker.call(l)},selectMinute:function(b){_(e.clone().minutes(parseInt(a(b.target).text(),10))),ca.showPicker.call(l)},selectSecond:function(b){_(e.clone().seconds(parseInt(a(b.target).text(),10))),ca.showPicker.call(l)},clear:ba,today:function(){var a=x();Q(a,"d")&&_(a)},close:aa},da=function(b){return a(b.currentTarget).is(".disabled")?!1:(ca[a(b.currentTarget).data("action")].apply(l,arguments),!1)},ea=function(){var b,c={year:function(a){return a.month(0).date(1).hours(0).seconds(0).minutes(0)},month:function(a){return a.date(1).hours(0).seconds(0).minutes(0)},day:function(a){return a.hours(0).seconds(0).minutes(0)},hour:function(a){return a.seconds(0).minutes(0)},minute:function(a){return a.seconds(0)}};return g.prop("disabled")||!d.ignoreReadonly&&g.prop("readonly")||o?l:(void 0!==g.val()&&0!==g.val().trim().length?_(ga(g.val().trim())):d.useCurrent&&m&&(g.is("input")&&0===g.val().trim().length||d.inline)&&(b=x(),"string"==typeof d.useCurrent&&(b=c[d.useCurrent](b)),_(b)),o=F(),L(),R(),o.find(".timepicker-hours").hide(),o.find(".timepicker-minutes").hide(),o.find(".timepicker-seconds").hide(),$(),K(),a(window).on("resize",H),o.on("click","[data-action]",da),o.on("mousedown",!1),n&&n.hasClass("btn")&&n.toggleClass("active"),o.show(),H(),d.focusOnShow&&!g.is(":focus")&&g.focus(),I({type:"dp.show"}),l)},fa=function(){return o?aa():ea()},ga=function(a){return a=void 0===d.parseInputDate?b.isMoment(a)||a instanceof Date?b(a):x(a):d.parseInputDate(a),a.locale(d.locale),a},ha=function(a){var b,c,e,f,g=null,h=[],i={},j=a.which,k="p";w[j]=k;for(b in w)w.hasOwnProperty(b)&&w[b]===k&&(h.push(b),parseInt(b,10)!==j&&(i[b]=!0));for(b in d.keyBinds)if(d.keyBinds.hasOwnProperty(b)&&"function"==typeof d.keyBinds[b]&&(e=b.split(" "),e.length===h.length&&v[j]===e[e.length-1])){for(f=!0,c=e.length-2;c>=0;c--)if(!(v[e[c]]in i)){f=!1;break}if(f){g=d.keyBinds[b];break}}g&&(g.call(l,o),a.stopPropagation(),a.preventDefault())},ia=function(a){w[a.which]="r",a.stopPropagation(),a.preventDefault()},ja=function(b){var c=a(b.target).val().trim(),d=c?ga(c):null;return _(d),b.stopImmediatePropagation(),!1},ka=function(){g.on({change:ja,blur:d.debug?"":aa,keydown:ha,keyup:ia,focus:d.allowInputToggle?ea:""}),c.is("input")?g.on({focus:ea}):n&&(n.on("click",fa),n.on("mousedown",!1))},la=function(){g.off({change:ja,blur:blur,keydown:ha,keyup:ia,focus:d.allowInputToggle?aa:""}),c.is("input")?g.off({focus:ea}):n&&(n.off("click",fa),n.off("mousedown",!1))},ma=function(b){var c={};return a.each(b,function(){var a=ga(this);a.isValid()&&(c[a.format("YYYY-MM-DD")]=!0)}),Object.keys(c).length?c:!1},na=function(b){var c={};return a.each(b,function(){c[this]=!0}),Object.keys(c).length?c:!1},oa=function(){var a=d.format||"L LT";i=a.replace(/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,function(a){var b=e.localeData().longDateFormat(a)||a;return b.replace(/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,function(a){return e.localeData().longDateFormat(a)||a})}),j=d.extraFormats?d.extraFormats.slice():[],j.indexOf(a)<0&&j.indexOf(i)<0&&j.push(i),h=i.toLowerCase().indexOf("a")<1&&i.replace(/\[.*?\]/g,"").indexOf("h")<1,y("y")&&(p=2),y("M")&&(p=1),y("d")&&(p=0),k=Math.max(p,k),m||_(e)};if(l.destroy=function(){aa(),la(),c.removeData("DateTimePicker"),c.removeData("date")},l.toggle=fa,l.show=ea,l.hide=aa,l.disable=function(){return aa(),n&&n.hasClass("btn")&&n.addClass("disabled"),g.prop("disabled",!0),l},l.enable=function(){return n&&n.hasClass("btn")&&n.removeClass("disabled"),g.prop("disabled",!1),l},l.ignoreReadonly=function(a){if(0===arguments.length)return d.ignoreReadonly;if("boolean"!=typeof a)throw new TypeError("ignoreReadonly () expects a boolean parameter");return d.ignoreReadonly=a,l},l.options=function(b){if(0===arguments.length)return a.extend(!0,{},d);if(!(b instanceof Object))throw new TypeError("options() options parameter should be an object");return a.extend(!0,d,b),a.each(d,function(a,b){if(void 0===l[a])throw new TypeError("option "+a+" is not recognized!");l[a](b)}),l},l.date=function(a){if(0===arguments.length)return m?null:e.clone();if(!(null===a||"string"==typeof a||b.isMoment(a)||a instanceof Date))throw new TypeError("date() parameter must be one of [null, string, moment or Date]");return _(null===a?null:ga(a)),l},l.format=function(a){if(0===arguments.length)return d.format;if("string"!=typeof a&&("boolean"!=typeof a||a!==!1))throw new TypeError("format() expects a sting or boolean:false parameter "+a);return d.format=a,i&&oa(),l},l.timeZone=function(a){return 0===arguments.length?d.timeZone:(d.timeZone=a,l)},l.dayViewHeaderFormat=function(a){if(0===arguments.length)return d.dayViewHeaderFormat;if("string"!=typeof a)throw new TypeError("dayViewHeaderFormat() expects a string parameter");return d.dayViewHeaderFormat=a,l},l.extraFormats=function(a){if(0===arguments.length)return d.extraFormats;if(a!==!1&&!(a instanceof Array))throw new TypeError("extraFormats() expects an array or false parameter");return d.extraFormats=a,j&&oa(),l},l.disabledDates=function(b){if(0===arguments.length)return d.disabledDates?a.extend({},d.disabledDates):d.disabledDates;if(!b)return d.disabledDates=!1,$(),l;if(!(b instanceof Array))throw new TypeError("disabledDates() expects an array parameter");return d.disabledDates=ma(b),d.enabledDates=!1,$(),l},l.enabledDates=function(b){if(0===arguments.length)return d.enabledDates?a.extend({},d.enabledDates):d.enabledDates;if(!b)return d.enabledDates=!1,$(),l;if(!(b instanceof Array))throw new TypeError("enabledDates() expects an array parameter");return d.enabledDates=ma(b),d.disabledDates=!1,$(),l},l.daysOfWeekDisabled=function(a){if(0===arguments.length)return d.daysOfWeekDisabled.splice(0);if("boolean"==typeof a&&!a)return d.daysOfWeekDisabled=!1,$(),l;if(!(a instanceof Array))throw new TypeError("daysOfWeekDisabled() expects an array parameter");if(d.daysOfWeekDisabled=a.reduce(function(a,b){return b=parseInt(b,10),b>6||0>b||isNaN(b)?a:(-1===a.indexOf(b)&&a.push(b),a)},[]).sort(),d.useCurrent&&!d.keepInvalid){for(var b=0;!Q(e,"d");){if(e.add(1,"d"),7===b)throw"Tried 7 times to find a valid date";b++}_(e)}return $(),l},l.maxDate=function(a){if(0===arguments.length)return d.maxDate?d.maxDate.clone():d.maxDate;if("boolean"==typeof a&&a===!1)return d.maxDate=!1,$(),l;"string"==typeof a&&("now"===a||"moment"===a)&&(a=x());var b=ga(a);if(!b.isValid())throw new TypeError("maxDate() Could not parse date parameter: "+a);if(d.minDate&&b.isBefore(d.minDate))throw new TypeError("maxDate() date parameter is before options.minDate: "+b.format(i));return d.maxDate=b,d.useCurrent&&!d.keepInvalid&&e.isAfter(a)&&_(d.maxDate),f.isAfter(b)&&(f=b.clone().subtract(d.stepping,"m")),$(),l},l.minDate=function(a){if(0===arguments.length)return d.minDate?d.minDate.clone():d.minDate;if("boolean"==typeof a&&a===!1)return d.minDate=!1,$(),l;"string"==typeof a&&("now"===a||"moment"===a)&&(a=x());var b=ga(a);if(!b.isValid())throw new TypeError("minDate() Could not parse date parameter: "+a);if(d.maxDate&&b.isAfter(d.maxDate))throw new TypeError("minDate() date parameter is after options.maxDate: "+b.format(i));return d.minDate=b,d.useCurrent&&!d.keepInvalid&&e.isBefore(a)&&_(d.minDate),f.isBefore(b)&&(f=b.clone().add(d.stepping,"m")),$(),l},l.defaultDate=function(a){if(0===arguments.length)return d.defaultDate?d.defaultDate.clone():d.defaultDate;if(!a)return d.defaultDate=!1,l;"string"==typeof a&&("now"===a||"moment"===a)&&(a=x());var b=ga(a);if(!b.isValid())throw new TypeError("defaultDate() Could not parse date parameter: "+a);if(!Q(b))throw new TypeError("defaultDate() date passed is invalid according to component setup validations");return d.defaultDate=b,(d.defaultDate&&d.inline||""===g.val().trim())&&_(d.defaultDate),l},l.locale=function(a){if(0===arguments.length)return d.locale;if(!b.localeData(a))throw new TypeError("locale() locale "+a+" is not loaded from moment locales!");return d.locale=a,e.locale(d.locale),f.locale(d.locale),i&&oa(),o&&(aa(),ea()),l},l.stepping=function(a){return 0===arguments.length?d.stepping:(a=parseInt(a,10),(isNaN(a)||1>a)&&(a=1),d.stepping=a,l)},l.useCurrent=function(a){var b=["year","month","day","hour","minute"];if(0===arguments.length)return d.useCurrent;if("boolean"!=typeof a&&"string"!=typeof a)throw new TypeError("useCurrent() expects a boolean or string parameter");if("string"==typeof a&&-1===b.indexOf(a.toLowerCase()))throw new TypeError("useCurrent() expects a string parameter of "+b.join(", "));return d.useCurrent=a,l},l.collapse=function(a){if(0===arguments.length)return d.collapse;if("boolean"!=typeof a)throw new TypeError("collapse() expects a boolean parameter");return d.collapse===a?l:(d.collapse=a,o&&(aa(),ea()),l)},l.icons=function(b){if(0===arguments.length)return a.extend({},d.icons);if(!(b instanceof Object))throw new TypeError("icons() expects parameter to be an Object");return a.extend(d.icons,b),o&&(aa(),ea()),l},l.tooltips=function(b){if(0===arguments.length)return a.extend({},d.tooltips);if(!(b instanceof Object))throw new TypeError("tooltips() expects parameter to be an Object");return a.extend(d.tooltips,b),o&&(aa(),ea()),l},l.useStrict=function(a){if(0===arguments.length)return d.useStrict;if("boolean"!=typeof a)throw new TypeError("useStrict() expects a boolean parameter");return d.useStrict=a,l},l.sideBySide=function(a){if(0===arguments.length)return d.sideBySide;if("boolean"!=typeof a)throw new TypeError("sideBySide() expects a boolean parameter");return d.sideBySide=a,o&&(aa(),ea()),l},l.viewMode=function(a){if(0===arguments.length)return d.viewMode;if("string"!=typeof a)throw new TypeError("viewMode() expects a string parameter");if(-1===r.indexOf(a))throw new TypeError("viewMode() parameter must be one of ("+r.join(", ")+") value");return d.viewMode=a,k=Math.max(r.indexOf(a),p),K(),l},l.toolbarPlacement=function(a){if(0===arguments.length)return d.toolbarPlacement;if("string"!=typeof a)throw new TypeError("toolbarPlacement() expects a string parameter");if(-1===u.indexOf(a))throw new TypeError("toolbarPlacement() parameter must be one of ("+u.join(", ")+") value");return d.toolbarPlacement=a,o&&(aa(),ea()),l},l.widgetPositioning=function(b){if(0===arguments.length)return a.extend({},d.widgetPositioning);if("[object Object]"!=={}.toString.call(b))throw new TypeError("widgetPositioning() expects an object variable");if(b.horizontal){if("string"!=typeof b.horizontal)throw new TypeError("widgetPositioning() horizontal variable must be a string");if(b.horizontal=b.horizontal.toLowerCase(),-1===t.indexOf(b.horizontal))throw new TypeError("widgetPositioning() expects horizontal parameter to be one of ("+t.join(", ")+")");d.widgetPositioning.horizontal=b.horizontal}if(b.vertical){if("string"!=typeof b.vertical)throw new TypeError("widgetPositioning() vertical variable must be a string");if(b.vertical=b.vertical.toLowerCase(),-1===s.indexOf(b.vertical))throw new TypeError("widgetPositioning() expects vertical parameter to be one of ("+s.join(", ")+")");d.widgetPositioning.vertical=b.vertical}return $(),l},l.calendarWeeks=function(a){if(0===arguments.length)return d.calendarWeeks;if("boolean"!=typeof a)throw new TypeError("calendarWeeks() expects parameter to be a boolean value");return d.calendarWeeks=a,$(),l},l.showTodayButton=function(a){if(0===arguments.length)return d.showTodayButton;if("boolean"!=typeof a)throw new TypeError("showTodayButton() expects a boolean parameter");return d.showTodayButton=a,o&&(aa(),ea()),l},l.showClear=function(a){if(0===arguments.length)return d.showClear;if("boolean"!=typeof a)throw new TypeError("showClear() expects a boolean parameter");return d.showClear=a,o&&(aa(),ea()),l},l.widgetParent=function(b){if(0===arguments.length)return d.widgetParent;if("string"==typeof b&&(b=a(b)),null!==b&&"string"!=typeof b&&!(b instanceof a))throw new TypeError("widgetParent() expects a string or a jQuery object parameter");return d.widgetParent=b,o&&(aa(),ea()),l},l.keepOpen=function(a){if(0===arguments.length)return d.keepOpen;if("boolean"!=typeof a)throw new TypeError("keepOpen() expects a boolean parameter");return d.keepOpen=a,l},l.focusOnShow=function(a){if(0===arguments.length)return d.focusOnShow;if("boolean"!=typeof a)throw new TypeError("focusOnShow() expects a boolean parameter");return d.focusOnShow=a,l},l.inline=function(a){if(0===arguments.length)return d.inline;if("boolean"!=typeof a)throw new TypeError("inline() expects a boolean parameter");return d.inline=a,l},l.clear=function(){return ba(),l},l.keyBinds=function(a){return d.keyBinds=a,l},l.getMoment=function(a){return x(a)},l.debug=function(a){if("boolean"!=typeof a)throw new TypeError("debug() expects a boolean parameter");return d.debug=a,l},l.allowInputToggle=function(a){if(0===arguments.length)return d.allowInputToggle;if("boolean"!=typeof a)throw new TypeError("allowInputToggle() expects a boolean parameter");return d.allowInputToggle=a,l},l.showClose=function(a){if(0===arguments.length)return d.showClose;if("boolean"!=typeof a)throw new TypeError("showClose() expects a boolean parameter");return d.showClose=a,l},l.keepInvalid=function(a){if(0===arguments.length)return d.keepInvalid;if("boolean"!=typeof a)throw new TypeError("keepInvalid() expects a boolean parameter");return d.keepInvalid=a,l},l.datepickerInput=function(a){if(0===arguments.length)return d.datepickerInput;if("string"!=typeof a)throw new TypeError("datepickerInput() expects a string parameter");return d.datepickerInput=a,l},l.parseInputDate=function(a){if(0===arguments.length)return d.parseInputDate; +if("function"!=typeof a)throw new TypeError("parseInputDate() sholud be as function");return d.parseInputDate=a,l},l.disabledTimeIntervals=function(b){if(0===arguments.length)return d.disabledTimeIntervals?a.extend({},d.disabledTimeIntervals):d.disabledTimeIntervals;if(!b)return d.disabledTimeIntervals=!1,$(),l;if(!(b instanceof Array))throw new TypeError("disabledTimeIntervals() expects an array parameter");return d.disabledTimeIntervals=b,$(),l},l.disabledHours=function(b){if(0===arguments.length)return d.disabledHours?a.extend({},d.disabledHours):d.disabledHours;if(!b)return d.disabledHours=!1,$(),l;if(!(b instanceof Array))throw new TypeError("disabledHours() expects an array parameter");if(d.disabledHours=na(b),d.enabledHours=!1,d.useCurrent&&!d.keepInvalid){for(var c=0;!Q(e,"h");){if(e.add(1,"h"),24===c)throw"Tried 24 times to find a valid date";c++}_(e)}return $(),l},l.enabledHours=function(b){if(0===arguments.length)return d.enabledHours?a.extend({},d.enabledHours):d.enabledHours;if(!b)return d.enabledHours=!1,$(),l;if(!(b instanceof Array))throw new TypeError("enabledHours() expects an array parameter");if(d.enabledHours=na(b),d.disabledHours=!1,d.useCurrent&&!d.keepInvalid){for(var c=0;!Q(e,"h");){if(e.add(1,"h"),24===c)throw"Tried 24 times to find a valid date";c++}_(e)}return $(),l},l.viewDate=function(a){if(0===arguments.length)return f.clone();if(!a)return f=e.clone(),l;if(!("string"==typeof a||b.isMoment(a)||a instanceof Date))throw new TypeError("viewDate() parameter must be one of [string, moment or Date]");return f=ga(a),J(),l},c.is("input"))g=c;else if(g=c.find(d.datepickerInput),0===g.size())g=c.find("input");else if(!g.is("input"))throw new Error('CSS class "'+d.datepickerInput+'" cannot be applied to non input element');if(c.hasClass("input-group")&&(n=0===c.find(".datepickerbutton").size()?c.find(".input-group-addon"):c.find(".datepickerbutton")),!d.inline&&!g.is("input"))throw new Error("Could not initialize DateTimePicker without an input element");return e=x(),f=e.clone(),a.extend(!0,d,G()),l.options(d),oa(),ka(),g.prop("disabled")&&l.disable(),g.is("input")&&0!==g.val().trim().length?_(ga(g.val().trim())):d.defaultDate&&void 0===g.attr("placeholder")&&_(d.defaultDate),d.inline&&ea(),l};a.fn.datetimepicker=function(b){return this.each(function(){var d=a(this);d.data("DateTimePicker")||(b=a.extend(!0,{},a.fn.datetimepicker.defaults,b),d.data("DateTimePicker",c(d,b)))})},a.fn.datetimepicker.defaults={timeZone:"Etc/UTC",format:!1,dayViewHeaderFormat:"MMMM YYYY",extraFormats:!1,stepping:1,minDate:!1,maxDate:!1,useCurrent:!0,collapse:!0,locale:b.locale(),defaultDate:!1,disabledDates:!1,enabledDates:!1,icons:{time:"glyphicon glyphicon-time",date:"glyphicon glyphicon-calendar",up:"glyphicon glyphicon-chevron-up",down:"glyphicon glyphicon-chevron-down",previous:"glyphicon glyphicon-chevron-left",next:"glyphicon glyphicon-chevron-right",today:"glyphicon glyphicon-screenshot",clear:"glyphicon glyphicon-trash",close:"glyphicon glyphicon-remove"},tooltips:{today:"Go to today",clear:"Clear selection",close:"Close the picker",selectMonth:"Select Month",prevMonth:"Previous Month",nextMonth:"Next Month",selectYear:"Select Year",prevYear:"Previous Year",nextYear:"Next Year",selectDecade:"Select Decade",prevDecade:"Previous Decade",nextDecade:"Next Decade",prevCentury:"Previous Century",nextCentury:"Next Century",pickHour:"Pick Hour",incrementHour:"Increment Hour",decrementHour:"Decrement Hour",pickMinute:"Pick Minute",incrementMinute:"Increment Minute",decrementMinute:"Decrement Minute",pickSecond:"Pick Second",incrementSecond:"Increment Second",decrementSecond:"Decrement Second",togglePeriod:"Toggle Period",selectTime:"Select Time"},useStrict:!1,sideBySide:!1,daysOfWeekDisabled:!1,calendarWeeks:!1,viewMode:"days",toolbarPlacement:"default",showTodayButton:!1,showClear:!1,showClose:!1,widgetPositioning:{horizontal:"auto",vertical:"auto"},widgetParent:null,ignoreReadonly:!1,keepOpen:!1,focusOnShow:!0,inline:!1,keepInvalid:!1,datepickerInput:".datepickerinput",keyBinds:{up:function(a){if(a){var b=this.date()||this.getMoment();a.find(".datepicker").is(":visible")?this.date(b.clone().subtract(7,"d")):this.date(b.clone().add(this.stepping(),"m"))}},down:function(a){if(!a)return void this.show();var b=this.date()||this.getMoment();a.find(".datepicker").is(":visible")?this.date(b.clone().add(7,"d")):this.date(b.clone().subtract(this.stepping(),"m"))},"control up":function(a){if(a){var b=this.date()||this.getMoment();a.find(".datepicker").is(":visible")?this.date(b.clone().subtract(1,"y")):this.date(b.clone().add(1,"h"))}},"control down":function(a){if(a){var b=this.date()||this.getMoment();a.find(".datepicker").is(":visible")?this.date(b.clone().add(1,"y")):this.date(b.clone().subtract(1,"h"))}},left:function(a){if(a){var b=this.date()||this.getMoment();a.find(".datepicker").is(":visible")&&this.date(b.clone().subtract(1,"d"))}},right:function(a){if(a){var b=this.date()||this.getMoment();a.find(".datepicker").is(":visible")&&this.date(b.clone().add(1,"d"))}},pageUp:function(a){if(a){var b=this.date()||this.getMoment();a.find(".datepicker").is(":visible")&&this.date(b.clone().subtract(1,"M"))}},pageDown:function(a){if(a){var b=this.date()||this.getMoment();a.find(".datepicker").is(":visible")&&this.date(b.clone().add(1,"M"))}},enter:function(){this.hide()},escape:function(){this.hide()},"control space":function(a){a.find(".timepicker").is(":visible")&&a.find('.btn[data-action="togglePeriod"]').click()},t:function(){this.date(this.getMoment())},"delete":function(){this.clear()}},debug:!1,allowInputToggle:!1,disabledTimeIntervals:!1,disabledHours:!1,enabledHours:!1,viewDate:!1}}); \ No newline at end of file diff --git a/app_v3satdemo/chrome/content/web/js/bootstrap-multiselect.js b/app_v3satdemo/chrome/content/web/js/bootstrap-multiselect.js new file mode 100644 index 0000000..970e86a --- /dev/null +++ b/app_v3satdemo/chrome/content/web/js/bootstrap-multiselect.js @@ -0,0 +1,1630 @@ +/** + * Bootstrap Multiselect (https://github.com/davidstutz/bootstrap-multiselect) + * + * Apache License, Version 2.0: + * Copyright (c) 2012 - 2015 David Stutz + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a + * copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * BSD 3-Clause License: + * Copyright (c) 2012 - 2015 David Stutz + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * - Neither the name of David Stutz nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +!function ($) { + "use strict";// jshint ;_; + + if (typeof ko !== 'undefined' && ko.bindingHandlers && !ko.bindingHandlers.multiselect) { + ko.bindingHandlers.multiselect = { + after: ['options', 'value', 'selectedOptions', 'enable', 'disable'], + + init: function(element, valueAccessor, allBindings, viewModel, bindingContext) { + var $element = $(element); + var config = ko.toJS(valueAccessor()); + + $element.multiselect(config); + + if (allBindings.has('options')) { + var options = allBindings.get('options'); + if (ko.isObservable(options)) { + ko.computed({ + read: function() { + options(); + setTimeout(function() { + var ms = $element.data('multiselect'); + if (ms) + ms.updateOriginalOptions();//Not sure how beneficial this is. + $element.multiselect('rebuild'); + }, 1); + }, + disposeWhenNodeIsRemoved: element + }); + } + } + + //value and selectedOptions are two-way, so these will be triggered even by our own actions. + //It needs some way to tell if they are triggered because of us or because of outside change. + //It doesn't loop but it's a waste of processing. + if (allBindings.has('value')) { + var value = allBindings.get('value'); + if (ko.isObservable(value)) { + ko.computed({ + read: function() { + value(); + setTimeout(function() { + $element.multiselect('refresh'); + }, 1); + }, + disposeWhenNodeIsRemoved: element + }).extend({ rateLimit: 100, notifyWhenChangesStop: true }); + } + } + + //Switched from arrayChange subscription to general subscription using 'refresh'. + //Not sure performance is any better using 'select' and 'deselect'. + if (allBindings.has('selectedOptions')) { + var selectedOptions = allBindings.get('selectedOptions'); + if (ko.isObservable(selectedOptions)) { + ko.computed({ + read: function() { + selectedOptions(); + setTimeout(function() { + $element.multiselect('refresh'); + }, 1); + }, + disposeWhenNodeIsRemoved: element + }).extend({ rateLimit: 100, notifyWhenChangesStop: true }); + } + } + + var setEnabled = function (enable) { + setTimeout(function () { + if (enable) + $element.multiselect('enable'); + else + $element.multiselect('disable'); + }); + }; + + if (allBindings.has('enable')) { + var enable = allBindings.get('enable'); + if (ko.isObservable(enable)) { + ko.computed({ + read: function () { + setEnabled(enable()); + }, + disposeWhenNodeIsRemoved: element + }).extend({ rateLimit: 100, notifyWhenChangesStop: true }); + } else { + setEnabled(enable); + } + } + + if (allBindings.has('disable')) { + var disable = allBindings.get('disable'); + if (ko.isObservable(disable)) { + ko.computed({ + read: function () { + setEnabled(!disable()); + }, + disposeWhenNodeIsRemoved: element + }).extend({ rateLimit: 100, notifyWhenChangesStop: true }); + } else { + setEnabled(!disable); + } + } + + ko.utils.domNodeDisposal.addDisposeCallback(element, function() { + $element.multiselect('destroy'); + }); + }, + + update: function(element, valueAccessor, allBindings, viewModel, bindingContext) { + var $element = $(element); + var config = ko.toJS(valueAccessor()); + + $element.multiselect('setOptions', config); + $element.multiselect('rebuild'); + } + }; + } + + function forEach(array, callback) { + for (var index = 0; index < array.length; ++index) { + callback(array[index], index); + } + } + + /** + * Constructor to create a new multiselect using the given select. + * + * @param {jQuery} select + * @param {Object} options + * @returns {Multiselect} + */ + function Multiselect(select, options) { + + this.$select = $(select); + + // Placeholder via data attributes + if (this.$select.attr("data-placeholder")) { + options.nonSelectedText = this.$select.data("placeholder"); + } + + this.options = this.mergeOptions($.extend({}, options, this.$select.data())); + + // Initialization. + // We have to clone to create a new reference. + this.originalOptions = this.$select.clone()[0].options; + this.query = ''; + this.searchTimeout = null; + this.lastToggledInput = null; + + this.options.multiple = this.$select.attr('multiple') === "multiple"; + this.options.onChange = $.proxy(this.options.onChange, this); + this.options.onDropdownShow = $.proxy(this.options.onDropdownShow, this); + this.options.onDropdownHide = $.proxy(this.options.onDropdownHide, this); + this.options.onDropdownShown = $.proxy(this.options.onDropdownShown, this); + this.options.onDropdownHidden = $.proxy(this.options.onDropdownHidden, this); + this.options.onInitialized = $.proxy(this.options.onInitialized, this); + + // Build select all if enabled. + this.buildContainer(); + this.buildButton(); + this.buildDropdown(); + this.buildSelectAll(); + this.buildDropdownOptions(); + this.buildFilter(); + + this.updateButtonText(); + this.updateSelectAll(true); + + if (this.options.disableIfEmpty && $('option', this.$select).length <= 0) { + this.disable(); + } + + this.$select.hide().after(this.$container); + this.options.onInitialized(this.$select, this.$container); + } + + Multiselect.prototype = { + + defaults: { + /** + * Default text function will either print 'None selected' in case no + * option is selected or a list of the selected options up to a length + * of 3 selected options. + * + * @param {jQuery} options + * @param {jQuery} select + * @returns {String} + */ + buttonText: function(options, select) { + if (this.disabledText.length > 0 + && (this.disableIfEmpty || select.prop('disabled')) + && options.length == 0) { + + return this.disabledText; + } + else if (options.length === 0) { + return this.nonSelectedText; + } + else if (this.allSelectedText + && options.length === $('option', $(select)).length + && $('option', $(select)).length !== 1 + && this.multiple) { + + if (this.selectAllNumber) { + return this.allSelectedText + ' (' + options.length + ')'; + } + else { + return this.allSelectedText; + } + } + else if (options.length > this.numberDisplayed) { + return options.length + ' ' + this.nSelectedText; + } + else { + var selected = ''; + var delimiter = this.delimiterText; + + options.each(function() { + var label = ($(this).attr('label') !== undefined) ? $(this).attr('label') : $(this).text(); + selected += label + delimiter; + }); + + return selected.substr(0, selected.length - 2); + } + }, + /** + * Updates the title of the button similar to the buttonText function. + * + * @param {jQuery} options + * @param {jQuery} select + * @returns {@exp;selected@call;substr} + */ + buttonTitle: function(options, select) { + if (options.length === 0) { + return this.nonSelectedText; + } + else { + var selected = ''; + var delimiter = this.delimiterText; + + options.each(function () { + var label = ($(this).attr('label') !== undefined) ? $(this).attr('label') : $(this).text(); + selected += label + delimiter; + }); + return selected.substr(0, selected.length - 2); + } + }, + /** + * Create a label. + * + * @param {jQuery} element + * @returns {String} + */ + optionLabel: function(element){ + return $(element).attr('label') || $(element).text(); + }, + /** + * Create a class. + * + * @param {jQuery} element + * @returns {String} + */ + optionClass: function(element) { + return $(element).attr('class') || ''; + }, + /** + * Triggered on change of the multiselect. + * + * Not triggered when selecting/deselecting options manually. + * + * @param {jQuery} option + * @param {Boolean} checked + */ + onChange : function(option, checked) { + + }, + /** + * Triggered when the dropdown is shown. + * + * @param {jQuery} event + */ + onDropdownShow: function(event) { + + }, + /** + * Triggered when the dropdown is hidden. + * + * @param {jQuery} event + */ + onDropdownHide: function(event) { + + }, + /** + * Triggered after the dropdown is shown. + * + * @param {jQuery} event + */ + onDropdownShown: function(event) { + + }, + /** + * Triggered after the dropdown is hidden. + * + * @param {jQuery} event + */ + onDropdownHidden: function(event) { + + }, + /** + * Triggered on select all. + */ + onSelectAll: function(checked) { + + }, + /** + * Triggered after initializing. + * + * @param {jQuery} $select + * @param {jQuery} $container + */ + onInitialized: function($select, $container) { + + }, + enableHTML: false, + buttonClass: 'btn btn-default', + inheritClass: false, + buttonWidth: 'auto', + buttonContainer: '
      ', + dropRight: false, + dropUp: false, + selectedClass: 'active', + // Maximum height of the dropdown menu. + // If maximum height is exceeded a scrollbar will be displayed. + maxHeight: false, + checkboxName: false, + includeSelectAllOption: false, + includeSelectAllIfMoreThan: 0, + selectAllText: ' Select all', + selectAllValue: 'multiselect-all', + selectAllName: false, + selectAllNumber: true, + selectAllJustVisible: true, + enableFiltering: false, + enableCaseInsensitiveFiltering: false, + enableFullValueFiltering: false, + enableClickableOptGroups: false, + enableCollapsibelOptGroups: false, + filterPlaceholder: 'Search', + // possible options: 'text', 'value', 'both' + filterBehavior: 'text', + includeFilterClearBtn: true, + preventInputChangeEvent: false, + nonSelectedText: 'None selected', + nSelectedText: 'selected', + allSelectedText: 'All selected', + numberDisplayed: 3, + disableIfEmpty: false, + disabledText: '', + delimiterText: ', ', + templates: { + button: '', + ul: '', + filter: '
    • ', + filterClearBtn: '', + li: '
    • ', + divider: '
    • ', + liGroup: '
    • ' + } + }, + + constructor: Multiselect, + + /** + * Builds the container of the multiselect. + */ + buildContainer: function() { + this.$container = $(this.options.buttonContainer); + this.$container.on('show.bs.dropdown', this.options.onDropdownShow); + this.$container.on('hide.bs.dropdown', this.options.onDropdownHide); + this.$container.on('shown.bs.dropdown', this.options.onDropdownShown); + this.$container.on('hidden.bs.dropdown', this.options.onDropdownHidden); + }, + + /** + * Builds the button of the multiselect. + */ + buildButton: function() { + this.$button = $(this.options.templates.button).addClass(this.options.buttonClass); + if (this.$select.attr('class') && this.options.inheritClass) { + this.$button.addClass(this.$select.attr('class')); + } + // Adopt active state. + if (this.$select.prop('disabled')) { + this.disable(); + } + else { + this.enable(); + } + + // Manually add button width if set. + if (this.options.buttonWidth && this.options.buttonWidth !== 'auto') { + this.$button.css({ + 'width' : this.options.buttonWidth, + 'overflow' : 'hidden', + 'text-overflow' : 'ellipsis' + }); + this.$container.css({ + 'width': this.options.buttonWidth + }); + } + + // Keep the tab index from the select. + var tabindex = this.$select.attr('tabindex'); + if (tabindex) { + this.$button.attr('tabindex', tabindex); + } + + this.$container.prepend(this.$button); + }, + + /** + * Builds the ul representing the dropdown menu. + */ + buildDropdown: function() { + + // Build ul. + this.$ul = $(this.options.templates.ul); + + if (this.options.dropRight) { + this.$ul.addClass('pull-right'); + } + + // Set max height of dropdown menu to activate auto scrollbar. + if (this.options.maxHeight) { + // TODO: Add a class for this option to move the css declarations. + this.$ul.css({ + 'max-height': this.options.maxHeight + 'px', + 'overflow-y': 'auto', + 'overflow-x': 'hidden' + }); + } + + if (this.options.dropUp) { + + var height = Math.min(this.options.maxHeight, $('option[data-role!="divider"]', this.$select).length*26 + $('option[data-role="divider"]', this.$select).length*19 + (this.options.includeSelectAllOption ? 26 : 0) + (this.options.enableFiltering || this.options.enableCaseInsensitiveFiltering ? 44 : 0)); + var moveCalc = height + 34; + + this.$ul.css({ + 'max-height': height + 'px', + 'overflow-y': 'auto', + 'overflow-x': 'hidden', + 'margin-top': "-" + moveCalc + 'px' + }); + } + + this.$container.append(this.$ul); + }, + + /** + * Build the dropdown options and binds all nessecary events. + * + * Uses createDivider and createOptionValue to create the necessary options. + */ + buildDropdownOptions: function() { + + this.$select.children().each($.proxy(function(index, element) { + + var $element = $(element); + // Support optgroups and options without a group simultaneously. + var tag = $element.prop('tagName') + .toLowerCase(); + + if ($element.prop('value') === this.options.selectAllValue) { + return; + } + + if (tag === 'optgroup') { + this.createOptgroup(element); + } + else if (tag === 'option') { + + if ($element.data('role') === 'divider') { + this.createDivider(); + } + else { + this.createOptionValue(element); + } + + } + + // Other illegal tags will be ignored. + }, this)); + + // Bind the change event on the dropdown elements. + $('li input', this.$ul).on('change', $.proxy(function(event) { + var $target = $(event.target); + + var checked = $target.prop('checked') || false; + var isSelectAllOption = $target.val() === this.options.selectAllValue; + + // Apply or unapply the configured selected class. + if (this.options.selectedClass) { + if (checked) { + $target.closest('li') + .addClass(this.options.selectedClass); + } + else { + $target.closest('li') + .removeClass(this.options.selectedClass); + } + } + + // Get the corresponding option. + var value = $target.val(); + var $option = this.getOptionByValue(value); + + var $optionsNotThis = $('option', this.$select).not($option); + var $checkboxesNotThis = $('input', this.$container).not($target); + + if (isSelectAllOption) { + if (checked) { + this.selectAll(this.options.selectAllJustVisible); + } + else { + this.deselectAll(this.options.selectAllJustVisible); + } + } + else { + if (checked) { + $option.prop('selected', true); + + if (this.options.multiple) { + // Simply select additional option. + $option.prop('selected', true); + } + else { + // Unselect all other options and corresponding checkboxes. + if (this.options.selectedClass) { + $($checkboxesNotThis).closest('li').removeClass(this.options.selectedClass); + } + + $($checkboxesNotThis).prop('checked', false); + $optionsNotThis.prop('selected', false); + + // It's a single selection, so close. + this.$button.click(); + } + + if (this.options.selectedClass === "active") { + $optionsNotThis.closest("a").css("outline", ""); + } + } + else { + // Unselect option. + $option.prop('selected', false); + } + + // To prevent select all from firing onChange: #575 + this.options.onChange($option, checked); + } + + this.$select.change(); + + this.updateButtonText(); + this.updateSelectAll(); + + if(this.options.preventInputChangeEvent) { + return false; + } + }, this)); + + $('li a', this.$ul).on('mousedown', function(e) { + if (e.shiftKey) { + // Prevent selecting text by Shift+click + return false; + } + }); + + $('li a', this.$ul).on('touchstart click', $.proxy(function(event) { + event.stopPropagation(); + + var $target = $(event.target); + + if (event.shiftKey && this.options.multiple) { + if($target.is("label")){ // Handles checkbox selection manually (see https://github.com/davidstutz/bootstrap-multiselect/issues/431) + event.preventDefault(); + $target = $target.find("input"); + $target.prop("checked", !$target.prop("checked")); + } + var checked = $target.prop('checked') || false; + + if (this.lastToggledInput !== null && this.lastToggledInput !== $target) { // Make sure we actually have a range + var from = $target.closest("li").index(); + var to = this.lastToggledInput.closest("li").index(); + + if (from > to) { // Swap the indices + var tmp = to; + to = from; + from = tmp; + } + + // Make sure we grab all elements since slice excludes the last index + ++to; + + // Change the checkboxes and underlying options + var range = this.$ul.find("li").slice(from, to).find("input"); + + range.prop('checked', checked); + + if (this.options.selectedClass) { + range.closest('li') + .toggleClass(this.options.selectedClass, checked); + } + + for (var i = 0, j = range.length; i < j; i++) { + var $checkbox = $(range[i]); + + var $option = this.getOptionByValue($checkbox.val()); + + $option.prop('selected', checked); + } + } + + // Trigger the select "change" event + $target.trigger("change"); + } + + // Remembers last clicked option + if($target.is("input") && !$target.closest("li").is(".multiselect-item")){ + this.lastToggledInput = $target; + } + + $target.blur(); + }, this)); + + // Keyboard support. + this.$container.off('keydown.multiselect').on('keydown.multiselect', $.proxy(function(event) { + if ($('input[type="text"]', this.$container).is(':focus')) { + return; + } + + if (event.keyCode === 9 && this.$container.hasClass('open')) { + this.$button.click(); + } + else { + var $items = $(this.$container).find("li:not(.divider):not(.disabled) a").filter(":visible"); + + if (!$items.length) { + return; + } + + var index = $items.index($items.filter(':focus')); + + // Navigation up. + if (event.keyCode === 38 && index > 0) { + index--; + } + // Navigate down. + else if (event.keyCode === 40 && index < $items.length - 1) { + index++; + } + else if (!~index) { + index = 0; + } + + var $current = $items.eq(index); + $current.focus(); + + if (event.keyCode === 32 || event.keyCode === 13) { + var $checkbox = $current.find('input'); + + $checkbox.prop("checked", !$checkbox.prop("checked")); + $checkbox.change(); + } + + event.stopPropagation(); + event.preventDefault(); + } + }, this)); + + if(this.options.enableClickableOptGroups && this.options.multiple) { + $('li.multiselect-group', this.$ul).on('click', $.proxy(function(event) { + event.stopPropagation(); + console.log('test'); + var group = $(event.target).parent(); + + // Search all option in optgroup + var $options = group.nextUntil('li.multiselect-group'); + var $visibleOptions = $options.filter(":visible:not(.disabled)"); + + // check or uncheck items + var allChecked = true; + var optionInputs = $visibleOptions.find('input'); + var values = []; + + optionInputs.each(function() { + allChecked = allChecked && $(this).prop('checked'); + values.push($(this).val()); + }); + + if (!allChecked) { + this.select(values, false); + } + else { + this.deselect(values, false); + } + + this.options.onChange(optionInputs, !allChecked); + }, this)); + } + + if (this.options.enableCollapsibleOptGroups && this.options.multiple) { + $("li.multiselect-group input", this.$ul).off(); + $("li.multiselect-group", this.$ul).siblings().not("li.multiselect-group, li.multiselect-all", this.$ul).each( function () { + $(this).toggleClass('hidden', true); + }); + + $("li.multiselect-group", this.$ul).on("click", $.proxy(function(group) { + group.stopPropagation(); + }, this)); + + $("li.multiselect-group > a > b", this.$ul).on("click", $.proxy(function(t) { + t.stopPropagation(); + var n = $(t.target).closest('li'); + var r = n.nextUntil("li.multiselect-group"); + var i = true; + + r.each(function() { + i = i && $(this).hasClass('hidden'); + }); + + r.toggleClass('hidden', !i); + }, this)); + + $("li.multiselect-group > a > input", this.$ul).on("change", $.proxy(function(t) { + t.stopPropagation(); + var n = $(t.target).closest('li'); + var r = n.nextUntil("li.multiselect-group", ':not(.disabled)'); + var s = r.find("input"); + + var i = true; + s.each(function() { + i = i && $(this).prop("checked"); + }); + + s.prop("checked", !i).trigger("change"); + }, this)); + + // Set the initial selection state of the groups. + $('li.multiselect-group', this.$ul).each(function() { + var r = $(this).nextUntil("li.multiselect-group", ':not(.disabled)'); + var s = r.find("input"); + + var i = true; + s.each(function() { + i = i && $(this).prop("checked"); + }); + + $(this).find('input').prop("checked", i); + }); + + // Update the group checkbox based on new selections among the + // corresponding children. + $("li input", this.$ul).on("change", $.proxy(function(t) { + t.stopPropagation(); + var n = $(t.target).closest('li'); + var r1 = n.prevUntil("li.multiselect-group", ':not(.disabled)'); + var r2 = n.nextUntil("li.multiselect-group", ':not(.disabled)'); + var s1 = r1.find("input"); + var s2 = r2.find("input"); + + var i = $(t.target).prop('checked'); + s1.each(function() { + i = i && $(this).prop("checked"); + }); + + s2.each(function() { + i = i && $(this).prop("checked"); + }); + + n.prevAll('.multiselect-group').find('input').prop('checked', i); + }, this)); + + $("li.multiselect-all", this.$ul).css('background', '#f3f3f3').css('border-bottom', '1px solid #eaeaea'); + $("li.multiselect-group > a, li.multiselect-all > a > label.checkbox", this.$ul).css('padding', '3px 20px 3px 35px'); + $("li.multiselect-group > a > input", this.$ul).css('margin', '4px 0px 5px -20px'); + } + }, + + /** + * Create an option using the given select option. + * + * @param {jQuery} element + */ + createOptionValue: function(element) { + var $element = $(element); + if ($element.is(':selected')) { + $element.prop('selected', true); + } + + // Support the label attribute on options. + var label = this.options.optionLabel(element); + var classes = this.options.optionClass(element); + var value = $element.val(); + var inputType = this.options.multiple ? "checkbox" : "radio"; + + var $li = $(this.options.templates.li); + var $label = $('label', $li); + $label.addClass(inputType); + $li.addClass(classes); + + if (this.options.enableHTML) { + $label.html(" " + label); + } + else { + $label.text(" " + label); + } + + var $checkbox = $('').attr('type', inputType); + + if (this.options.checkboxName) { + $checkbox.attr('name', this.options.checkboxName); + } + $label.prepend($checkbox); + + var selected = $element.prop('selected') || false; + $checkbox.val(value); + + if (value === this.options.selectAllValue) { + $li.addClass("multiselect-item multiselect-all"); + $checkbox.parent().parent() + .addClass('multiselect-all'); + } + + $label.attr('title', $element.attr('title')); + + this.$ul.append($li); + + if ($element.is(':disabled')) { + $checkbox.attr('disabled', 'disabled') + .prop('disabled', true) + .closest('a') + .attr("tabindex", "-1") + .closest('li') + .addClass('disabled'); + } + + //$checkbox.prop('checked', selected); + + if (selected && this.options.selectedClass) { + $checkbox.closest('li') + .addClass(this.options.selectedClass); + } + }, + + /** + * Creates a divider using the given select option. + * + * @param {jQuery} element + */ + createDivider: function(element) { + var $divider = $(this.options.templates.divider); + this.$ul.append($divider); + }, + + /** + * Creates an optgroup. + * + * @param {jQuery} group + */ + createOptgroup: function(group) { + if (this.options.enableCollapsibleOptGroups && this.options.multiple) { + var label = $(group).attr("label"); + var value = $(group).attr("value"); + var r = $('
    • ' + label + '
    • '); + + if (this.options.enableClickableOptGroups) { + r.addClass("multiselect-group-clickable") + } + this.$ul.append(r); + if ($(group).is(":disabled")) { + r.addClass("disabled") + } + $("option", group).each($.proxy(function($, group) { + this.createOptionValue(group) + }, this)) + } + else { + var groupName = $(group).prop('label'); + + // Add a header for the group. + var $li = $(this.options.templates.liGroup); + + if (this.options.enableHTML) { + $('label', $li).html(groupName); + } + else { + $('label', $li).text(groupName); + } + + if (this.options.enableClickableOptGroups) { + $li.addClass('multiselect-group-clickable'); + } + + this.$ul.append($li); + + if ($(group).is(':disabled')) { + $li.addClass('disabled'); + } + + // Add the options of the group. + $('option', group).each($.proxy(function(index, element) { + this.createOptionValue(element); + }, this)); + } + }, + + /** + * Build the select all. + * + * Checks if a select all has already been created. + */ + buildSelectAll: function() { + if (typeof this.options.selectAllValue === 'number') { + this.options.selectAllValue = this.options.selectAllValue.toString(); + } + + var alreadyHasSelectAll = this.hasSelectAll(); + + if (!alreadyHasSelectAll && this.options.includeSelectAllOption && this.options.multiple + && $('option', this.$select).length > this.options.includeSelectAllIfMoreThan) { + + // Check whether to add a divider after the select all. + if (this.options.includeSelectAllDivider) { + this.$ul.prepend($(this.options.templates.divider)); + } + + var $li = $(this.options.templates.li); + $('label', $li).addClass("checkbox"); + + if (this.options.enableHTML) { + $('label', $li).html(" " + this.options.selectAllText); + } + else { + $('label', $li).text(" " + this.options.selectAllText); + } + + if (this.options.selectAllName) { + $('label', $li).prepend(''); + } + else { + $('label', $li).prepend(''); + } + + var $checkbox = $('input', $li); + $checkbox.val(this.options.selectAllValue); + + $li.addClass("multiselect-item multiselect-all"); + $checkbox.parent().parent() + .addClass('multiselect-all'); + + this.$ul.prepend($li); + + $checkbox.prop('checked', false); + } + }, + + /** + * Builds the filter. + */ + buildFilter: function() { + + // Build filter if filtering OR case insensitive filtering is enabled and the number of options exceeds (or equals) enableFilterLength. + if (this.options.enableFiltering || this.options.enableCaseInsensitiveFiltering) { + var enableFilterLength = Math.max(this.options.enableFiltering, this.options.enableCaseInsensitiveFiltering); + + if (this.$select.find('option').length >= enableFilterLength) { + + this.$filter = $(this.options.templates.filter); + $('input', this.$filter).attr('placeholder', this.options.filterPlaceholder); + + // Adds optional filter clear button + if(this.options.includeFilterClearBtn){ + var clearBtn = $(this.options.templates.filterClearBtn); + clearBtn.on('click', $.proxy(function(event){ + clearTimeout(this.searchTimeout); + this.$filter.find('.multiselect-search').val(''); + $('li', this.$ul).show().removeClass("filter-hidden"); + this.updateSelectAll(); + }, this)); + this.$filter.find('.input-group').append(clearBtn); + } + + this.$ul.prepend(this.$filter); + + this.$filter.val(this.query).on('click', function(event) { + event.stopPropagation(); + }).on('input keydown', $.proxy(function(event) { + // Cancel enter key default behaviour + if (event.which === 13) { + event.preventDefault(); + } + + // This is useful to catch "keydown" events after the browser has updated the control. + clearTimeout(this.searchTimeout); + + this.searchTimeout = this.asyncFunction($.proxy(function() { + + if (this.query !== event.target.value) { + this.query = event.target.value; + + var currentGroup, currentGroupVisible; + $.each($('li', this.$ul), $.proxy(function(index, element) { + var value = $('input', element).length > 0 ? $('input', element).val() : ""; + var text = $('label', element).text(); + + var filterCandidate = ''; + if ((this.options.filterBehavior === 'text')) { + filterCandidate = text; + } + else if ((this.options.filterBehavior === 'value')) { + filterCandidate = value; + } + else if (this.options.filterBehavior === 'both') { + filterCandidate = text + '\n' + value; + } + + if (value !== this.options.selectAllValue && text) { + + // By default lets assume that element is not + // interesting for this search. + var showElement = false; + + if (this.options.enableCaseInsensitiveFiltering) { + filterCandidate = filterCandidate.toLowerCase(); + this.query = this.query.toLowerCase(); + } + + if (this.options.enableFullValueFiltering && this.options.filterBehavior !== 'both') { + var valueToMatch = filterCandidate.trim().substring(0, this.query.length); + if (this.query.indexOf(valueToMatch) > -1) { + showElement = true; + } + } + else if (filterCandidate.indexOf(this.query) > -1) { + showElement = true; + } + + // Toggle current element (group or group item) according to showElement boolean. + $(element).toggle(showElement).toggleClass('filter-hidden', !showElement); + + // Differentiate groups and group items. + if ($(element).hasClass('multiselect-group')) { + // Remember group status. + currentGroup = element; + currentGroupVisible = showElement; + } + else { + // Show group name when at least one of its items is visible. + if (showElement) { + $(currentGroup).show().removeClass('filter-hidden'); + } + + // Show all group items when group name satisfies filter. + if (!showElement && currentGroupVisible) { + $(element).show().removeClass('filter-hidden'); + } + } + } + }, this)); + } + + this.updateSelectAll(); + }, this), 300, this); + }, this)); + } + } + }, + + /** + * Unbinds the whole plugin. + */ + destroy: function() { + this.$container.remove(); + this.$select.show(); + this.$select.data('multiselect', null); + }, + + /** + * Refreshs the multiselect based on the selected options of the select. + */ + refresh: function () { + var inputs = $.map($('li input', this.$ul), $); + + $('option', this.$select).each($.proxy(function (index, element) { + var $elem = $(element); + var value = $elem.val(); + var $input; + for (var i = inputs.length; 0 < i--; /**/) { + if (value !== ($input = inputs[i]).val()) + continue; // wrong li + + if ($elem.is(':selected')) { + $input.prop('checked', true); + + if (this.options.selectedClass) { + $input.closest('li') + .addClass(this.options.selectedClass); + } + } + else { + $input.prop('checked', false); + + if (this.options.selectedClass) { + $input.closest('li') + .removeClass(this.options.selectedClass); + } + } + + if ($elem.is(":disabled")) { + $input.attr('disabled', 'disabled') + .prop('disabled', true) + .closest('li') + .addClass('disabled'); + } + else { + $input.prop('disabled', false) + .closest('li') + .removeClass('disabled'); + } + break; // assumes unique values + } + }, this)); + + this.updateButtonText(); + this.updateSelectAll(); + }, + + /** + * Select all options of the given values. + * + * If triggerOnChange is set to true, the on change event is triggered if + * and only if one value is passed. + * + * @param {Array} selectValues + * @param {Boolean} triggerOnChange + */ + select: function(selectValues, triggerOnChange) { + if(!$.isArray(selectValues)) { + selectValues = [selectValues]; + } + + for (var i = 0; i < selectValues.length; i++) { + var value = selectValues[i]; + + if (value === null || value === undefined) { + continue; + } + + var $option = this.getOptionByValue(value); + var $checkbox = this.getInputByValue(value); + + if($option === undefined || $checkbox === undefined) { + continue; + } + + if (!this.options.multiple) { + this.deselectAll(false); + } + + if (this.options.selectedClass) { + $checkbox.closest('li') + .addClass(this.options.selectedClass); + } + + $checkbox.prop('checked', true); + $option.prop('selected', true); + + if (triggerOnChange) { + this.options.onChange($option, true); + } + } + + this.updateButtonText(); + this.updateSelectAll(); + }, + + /** + * Clears all selected items. + */ + clearSelection: function () { + this.deselectAll(false); + this.updateButtonText(); + this.updateSelectAll(); + }, + + /** + * Deselects all options of the given values. + * + * If triggerOnChange is set to true, the on change event is triggered, if + * and only if one value is passed. + * + * @param {Array} deselectValues + * @param {Boolean} triggerOnChange + */ + deselect: function(deselectValues, triggerOnChange) { + if(!$.isArray(deselectValues)) { + deselectValues = [deselectValues]; + } + + for (var i = 0; i < deselectValues.length; i++) { + var value = deselectValues[i]; + + if (value === null || value === undefined) { + continue; + } + + var $option = this.getOptionByValue(value); + var $checkbox = this.getInputByValue(value); + + if($option === undefined || $checkbox === undefined) { + continue; + } + + if (this.options.selectedClass) { + $checkbox.closest('li') + .removeClass(this.options.selectedClass); + } + + $checkbox.prop('checked', false); + $option.prop('selected', false); + + if (triggerOnChange) { + this.options.onChange($option, false); + } + } + + this.updateButtonText(); + this.updateSelectAll(); + }, + + /** + * Selects all enabled & visible options. + * + * If justVisible is true or not specified, only visible options are selected. + * + * @param {Boolean} justVisible + * @param {Boolean} triggerOnSelectAll + */ + selectAll: function (justVisible, triggerOnSelectAll) { + justVisible = (this.options.enableCollapsibleOptGroups && this.options.multiple) ? false : justVisible; + + var justVisible = typeof justVisible === 'undefined' ? true : justVisible; + var allCheckboxes = $("li input[type='checkbox']:enabled", this.$ul); + var visibleCheckboxes = allCheckboxes.filter(":visible"); + var allCheckboxesCount = allCheckboxes.length; + var visibleCheckboxesCount = visibleCheckboxes.length; + + if(justVisible) { + visibleCheckboxes.prop('checked', true); + $("li:not(.divider):not(.disabled)", this.$ul).filter(":visible").addClass(this.options.selectedClass); + } + else { + allCheckboxes.prop('checked', true); + $("li:not(.divider):not(.disabled)", this.$ul).addClass(this.options.selectedClass); + } + + if (allCheckboxesCount === visibleCheckboxesCount || justVisible === false) { + $("option:not([data-role='divider']):enabled", this.$select).prop('selected', true); + } + else { + var values = visibleCheckboxes.map(function() { + return $(this).val(); + }).get(); + + $("option:enabled", this.$select).filter(function(index) { + return $.inArray($(this).val(), values) !== -1; + }).prop('selected', true); + } + + if (triggerOnSelectAll) { + this.options.onSelectAll(); + } + }, + + /** + * Deselects all options. + * + * If justVisible is true or not specified, only visible options are deselected. + * + * @param {Boolean} justVisible + */ + deselectAll: function (justVisible) { + justVisible = (this.options.enableCollapsibleOptGroups && this.options.multiple) ? false : justVisible; + justVisible = typeof justVisible === 'undefined' ? true : justVisible; + + if(justVisible) { + var visibleCheckboxes = $("li input[type='checkbox']:not(:disabled)", this.$ul).filter(":visible"); + visibleCheckboxes.prop('checked', false); + + var values = visibleCheckboxes.map(function() { + return $(this).val(); + }).get(); + + $("option:enabled", this.$select).filter(function(index) { + return $.inArray($(this).val(), values) !== -1; + }).prop('selected', false); + + if (this.options.selectedClass) { + $("li:not(.divider):not(.disabled)", this.$ul).filter(":visible").removeClass(this.options.selectedClass); + } + } + else { + $("li input[type='checkbox']:enabled", this.$ul).prop('checked', false); + $("option:enabled", this.$select).prop('selected', false); + + if (this.options.selectedClass) { + $("li:not(.divider):not(.disabled)", this.$ul).removeClass(this.options.selectedClass); + } + } + }, + + /** + * Rebuild the plugin. + * + * Rebuilds the dropdown, the filter and the select all option. + */ + rebuild: function() { + this.$ul.html(''); + + // Important to distinguish between radios and checkboxes. + this.options.multiple = this.$select.attr('multiple') === "multiple"; + + this.buildSelectAll(); + this.buildDropdownOptions(); + this.buildFilter(); + + this.updateButtonText(); + this.updateSelectAll(true); + + if (this.options.disableIfEmpty && $('option', this.$select).length <= 0) { + this.disable(); + } + else { + this.enable(); + } + + if (this.options.dropRight) { + this.$ul.addClass('pull-right'); + } + }, + + /** + * The provided data will be used to build the dropdown. + */ + dataprovider: function(dataprovider) { + + var groupCounter = 0; + var $select = this.$select.empty(); + + $.each(dataprovider, function (index, option) { + var $tag; + + if ($.isArray(option.children)) { // create optiongroup tag + groupCounter++; + + $tag = $('').attr({ + label: option.label || 'Group ' + groupCounter, + disabled: !!option.disabled + }); + + forEach(option.children, function(subOption) { // add children option tags + $tag.append($('
      ").addClass("cw").text("#"));c.isBefore(f.clone().endOf("w"));)b.append(a("").addClass("dow").text(c.format("dd"))),c.add(1,"d");o.find(".datepicker-days thead").append(b)},M=function(a){return d.disabledDates[a.format("YYYY-MM-DD")]===!0},N=function(a){return d.enabledDates[a.format("YYYY-MM-DD")]===!0},O=function(a){return d.disabledHours[a.format("H")]===!0},P=function(a){return d.enabledHours[a.format("H")]===!0},Q=function(b,c){if(!b.isValid())return!1;if(d.disabledDates&&"d"===c&&M(b))return!1;if(d.enabledDates&&"d"===c&&!N(b))return!1;if(d.minDate&&b.isBefore(d.minDate,c))return!1;if(d.maxDate&&b.isAfter(d.maxDate,c))return!1;if(d.daysOfWeekDisabled&&"d"===c&&-1!==d.daysOfWeekDisabled.indexOf(b.day()))return!1;if(d.disabledHours&&("h"===c||"m"===c||"s"===c)&&O(b))return!1;if(d.enabledHours&&("h"===c||"m"===c||"s"===c)&&!P(b))return!1;if(d.disabledTimeIntervals&&("h"===c||"m"===c||"s"===c)){var e=!1;if(a.each(d.disabledTimeIntervals,function(){return b.isBetween(this[0],this[1])?(e=!0,!1):void 0}),e)return!1}return!0},R=function(){for(var b=[],c=f.clone().startOf("y").startOf("d");c.isSame(f,"y");)b.push(a("").attr("data-action","selectMonth").addClass("month").text(c.format("MMM"))),c.add(1,"M");o.find(".datepicker-months td").empty().append(b)},S=function(){var b=o.find(".datepicker-months"),c=b.find("th"),g=b.find("tbody").find("span");c.eq(0).find("span").attr("title",d.tooltips.prevYear),c.eq(1).attr("title",d.tooltips.selectYear),c.eq(2).find("span").attr("title",d.tooltips.nextYear),b.find(".disabled").removeClass("disabled"),Q(f.clone().subtract(1,"y"),"y")||c.eq(0).addClass("disabled"),c.eq(1).text(f.year()),Q(f.clone().add(1,"y"),"y")||c.eq(2).addClass("disabled"),g.removeClass("active"),e.isSame(f,"y")&&!m&&g.eq(e.month()).addClass("active"),g.each(function(b){Q(f.clone().month(b),"M")||a(this).addClass("disabled")})},T=function(){var a=o.find(".datepicker-years"),b=a.find("th"),c=f.clone().subtract(5,"y"),g=f.clone().add(6,"y"),h="";for(b.eq(0).find("span").attr("title",d.tooltips.prevDecade),b.eq(1).attr("title",d.tooltips.selectDecade),b.eq(2).find("span").attr("title",d.tooltips.nextDecade),a.find(".disabled").removeClass("disabled"),d.minDate&&d.minDate.isAfter(c,"y")&&b.eq(0).addClass("disabled"),b.eq(1).text(c.year()+"-"+g.year()),d.maxDate&&d.maxDate.isBefore(g,"y")&&b.eq(2).addClass("disabled");!c.isAfter(g,"y");)h+=''+c.year()+"",c.add(1,"y");a.find("td").html(h)},U=function(){var a=o.find(".datepicker-decades"),c=a.find("th"),g=b({y:f.year()-f.year()%100-1}),h=g.clone().add(100,"y"),i=g.clone(),j="";for(c.eq(0).find("span").attr("title",d.tooltips.prevCentury),c.eq(2).find("span").attr("title",d.tooltips.nextCentury),a.find(".disabled").removeClass("disabled"),(g.isSame(b({y:1900}))||d.minDate&&d.minDate.isAfter(g,"y"))&&c.eq(0).addClass("disabled"),c.eq(1).text(g.year()+"-"+h.year()),(g.isSame(b({y:2e3}))||d.maxDate&&d.maxDate.isBefore(h,"y"))&&c.eq(2).addClass("disabled");!g.isAfter(h,"y");)j+=''+(g.year()+1)+" - "+(g.year()+12)+"",g.add(12,"y");j+="",a.find("td").html(j),c.eq(1).text(i.year()+1+"-"+g.year())},V=function(){var b,c,g,h,i=o.find(".datepicker-days"),j=i.find("th"),k=[];if(A()){for(j.eq(0).find("span").attr("title",d.tooltips.prevMonth),j.eq(1).attr("title",d.tooltips.selectMonth),j.eq(2).find("span").attr("title",d.tooltips.nextMonth),i.find(".disabled").removeClass("disabled"),j.eq(1).text(f.format(d.dayViewHeaderFormat)),Q(f.clone().subtract(1,"M"),"M")||j.eq(0).addClass("disabled"),Q(f.clone().add(1,"M"),"M")||j.eq(2).addClass("disabled"),b=f.clone().startOf("M").startOf("w").startOf("d"),h=0;42>h;h++)0===b.weekday()&&(c=a("
      '+b.week()+"'+b.date()+"
      '+c.format(h?"HH":"hh")+"
      '+c.format("mm")+"
      '+c.format("ss")+"
      '+(this.showSeconds?'':"")+(this.showMeridian?'':"")+" "+(this.showSeconds?'":"")+(this.showMeridian?'":"")+''+(this.showSeconds?'':"")+(this.showMeridian?'':"")+"
         
      "+b+' :'+c+":'+d+" '+e+"
        
      ",this.template){case"modal":a='';break;case"dropdown":a='"}return a},getTime:function(){return this.formatTime(this.hour,this.minute,this.second,this.meridian)},hideWidget:function(){this.isOpen!==!1&&(this.showInputs&&this.updateFromWidgetInputs(),this.$element.trigger({type:"hide.timepicker",time:{value:this.getTime(),hours:this.hour,minutes:this.minute,seconds:this.second,meridian:this.meridian}}),"modal"===this.template&&this.$widget.modal?this.$widget.modal("hide"):this.$widget.removeClass("open"),a(c).off("mousedown.timepicker"),this.isOpen=!1)},highlightUnit:function(){this.position=this.getCursorPosition(),this.position>=0&&this.position<=2?this.highlightHour():this.position>=3&&this.position<=5?this.highlightMinute():this.position>=6&&this.position<=8?this.showSeconds?this.highlightSecond():this.highlightMeridian():this.position>=9&&this.position<=11&&this.highlightMeridian()},highlightNextUnit:function(){switch(this.highlightedUnit){case"hour":this.highlightMinute();break;case"minute":this.showSeconds?this.highlightSecond():this.showMeridian?this.highlightMeridian():this.highlightHour();break;case"second":this.showMeridian?this.highlightMeridian():this.highlightHour();break;case"meridian":this.highlightHour()}},highlightPrevUnit:function(){switch(this.highlightedUnit){case"hour":this.highlightMeridian();break;case"minute":this.highlightHour();break;case"second":this.highlightMinute();break;case"meridian":this.showSeconds?this.highlightSecond():this.highlightMinute()}},highlightHour:function(){var a=this.$element.get(0);this.highlightedUnit="hour",a.setSelectionRange&&setTimeout(function(){a.setSelectionRange(0,2)},0)},highlightMinute:function(){var a=this.$element.get(0);this.highlightedUnit="minute",a.setSelectionRange&&setTimeout(function(){a.setSelectionRange(3,5)},0)},highlightSecond:function(){var a=this.$element.get(0);this.highlightedUnit="second",a.setSelectionRange&&setTimeout(function(){a.setSelectionRange(6,8)},0)},highlightMeridian:function(){var a=this.$element.get(0);this.highlightedUnit="meridian",a.setSelectionRange&&(this.showSeconds?setTimeout(function(){a.setSelectionRange(9,11)},0):setTimeout(function(){a.setSelectionRange(6,8)},0))},incrementHour:function(){if(this.showMeridian){if(11===this.hour)return this.hour++,this.toggleMeridian();12===this.hour&&(this.hour=0)}return 23===this.hour?void(this.hour=0):(this.hour++,void this.update())},incrementMinute:function(a){var b;b=a?this.minute+a:this.minute+this.minuteStep-this.minute%this.minuteStep,b>59?(this.incrementHour(),this.minute=b-60):this.minute=b,this.update()},incrementSecond:function(){var a=this.second+this.secondStep-this.second%this.secondStep;a>59?(this.incrementMinute(!0),this.second=a-60):this.second=a,this.update()},remove:function(){a("document").off(".timepicker"),this.$widget&&this.$widget.remove(),delete this.$element.data().timepicker},setDefaultTime:function(a){if(this.$element.val())this.updateFromElementVal();else if("current"===a){var b=new Date,c=b.getHours(),d=Math.floor(b.getMinutes()/this.minuteStep)*this.minuteStep,e=Math.floor(b.getSeconds()/this.secondStep)*this.secondStep,f="AM";this.showMeridian&&(0===c?c=12:c>=12?(c>12&&(c-=12),f="PM"):f="AM"),this.hour=c,this.minute=d,this.second=e,this.meridian=f,this.update()}else a===!1?(this.hour=0,this.minute=0,this.second=0,this.meridian="AM"):this.setTime(a)},setTime:function(a){var b,c;this.showMeridian?(b=a.split(" "),c=b[0].split(":"),this.meridian=b[1]):c=a.split(":"),this.hour=parseInt(c[0],10),this.minute=parseInt(c[1],10),this.second=parseInt(c[2],10),isNaN(this.hour)&&(this.hour=0),isNaN(this.minute)&&(this.minute=0),this.showMeridian?(this.hour>12?this.hour=12:this.hour<1&&(this.hour=12),"am"===this.meridian||"a"===this.meridian?this.meridian="AM":("pm"===this.meridian||"p"===this.meridian)&&(this.meridian="PM"),"AM"!==this.meridian&&"PM"!==this.meridian&&(this.meridian="AM")):this.hour>=24?this.hour=23:this.hour<0&&(this.hour=0),this.minute<0?this.minute=0:this.minute>=60&&(this.minute=59),this.showSeconds&&(isNaN(this.second)?this.second=0:this.second<0?this.second=0:this.second>=60&&(this.second=59)),this.update()},showWidget:function(){if(!this.isOpen&&!this.$element.is(":disabled")){var b=this;a(c).on("mousedown.timepicker",function(c){0===a(c.target).closest(".bootstrap-timepicker-widget").length&&b.hideWidget()}),this.$element.trigger({type:"show.timepicker",time:{value:this.getTime(),hours:this.hour,minutes:this.minute,seconds:this.second,meridian:this.meridian}}),this.disableFocus&&this.$element.blur(),this.updateFromElementVal(),"modal"===this.template&&this.$widget.modal?this.$widget.modal("show").on("hidden",a.proxy(this.hideWidget,this)):this.isOpen===!1&&this.$widget.addClass("open"),this.isOpen=!0}},toggleMeridian:function(){this.meridian="AM"===this.meridian?"PM":"AM",this.update()},update:function(){this.$element.trigger({type:"changeTime.timepicker",time:{value:this.getTime(),hours:this.hour,minutes:this.minute,seconds:this.second,meridian:this.meridian}}),this.updateElement(),this.updateWidget()},updateElement:function(){this.$element.val(this.getTime()).change()},updateFromElementVal:function(){var a=this.$element.val();a&&this.setTime(a)},updateWidget:function(){if(this.$widget!==!1){var a=this.hour<10?"0"+this.hour:this.hour,b=this.minute<10?"0"+this.minute:this.minute,c=this.second<10?"0"+this.second:this.second;this.showInputs?(this.$widget.find("input.bootstrap-timepicker-hour").val(a),this.$widget.find("input.bootstrap-timepicker-minute").val(b),this.showSeconds&&this.$widget.find("input.bootstrap-timepicker-second").val(c),this.showMeridian&&this.$widget.find("input.bootstrap-timepicker-meridian").val(this.meridian)):(this.$widget.find("span.bootstrap-timepicker-hour").text(a),this.$widget.find("span.bootstrap-timepicker-minute").text(b),this.showSeconds&&this.$widget.find("span.bootstrap-timepicker-second").text(c),this.showMeridian&&this.$widget.find("span.bootstrap-timepicker-meridian").text(this.meridian))}},updateFromWidgetInputs:function(){if(this.$widget!==!1){var b=a("input.bootstrap-timepicker-hour",this.$widget).val()+":"+a("input.bootstrap-timepicker-minute",this.$widget).val()+(this.showSeconds?":"+a("input.bootstrap-timepicker-second",this.$widget).val():"")+(this.showMeridian?" "+a("input.bootstrap-timepicker-meridian",this.$widget).val():"");this.setTime(b)}},widgetClick:function(b){b.stopPropagation(),b.preventDefault();var c=a(b.target).closest("a").data("action");c&&this[c]()},widgetKeydown:function(b){var c=a(b.target).closest("input"),d=c.attr("name");switch(b.keyCode){case 9:if(this.showMeridian){if("meridian"===d)return this.hideWidget()}else if(this.showSeconds){if("second"===d)return this.hideWidget()}else if("minute"===d)return this.hideWidget();this.updateFromWidgetInputs();break;case 27:this.hideWidget();break;case 38:switch(b.preventDefault(),d){case"hour":this.incrementHour();break;case"minute":this.incrementMinute();break;case"second":this.incrementSecond();break;case"meridian":this.toggleMeridian()}break;case 40:switch(b.preventDefault(),d){case"hour":this.decrementHour();break;case"minute":this.decrementMinute();break;case"second":this.decrementSecond();break;case"meridian":this.toggleMeridian()}}}},a.fn.timepicker=function(b){var c=Array.apply(null,arguments);return c.shift(),this.each(function(){var d=a(this),f=d.data("timepicker"),g="object"==typeof b&&b;f||d.data("timepicker",f=new e(this,a.extend({},a.fn.timepicker.defaults,g,a(this).data()))),"string"==typeof b&&f[b].apply(f,c)})},a.fn.timepicker.defaults={defaultTime:"current",disableFocus:!1,isOpen:!1,minuteStep:15,modalBackdrop:!1,secondStep:15,showSeconds:!1,showInputs:!0,showMeridian:!0,template:"dropdown",appendWidgetTo:".bootstrap-timepicker",upArrowStyle:"glyphicon glyphicon-chevron-up",downArrowStyle:"glyphicon glyphicon-chevron-down",containerClass:"bootstrap-timepicker"},a.fn.timepicker.Constructor=e}(jQuery,window,document); \ No newline at end of file diff --git a/app_v3satdemo/chrome/content/web/js/bootstrap.js b/app_v3satdemo/chrome/content/web/js/bootstrap.js new file mode 100644 index 0000000..070555a --- /dev/null +++ b/app_v3satdemo/chrome/content/web/js/bootstrap.js @@ -0,0 +1,2366 @@ +/*! + * Bootstrap v3.3.5 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +/*! + * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=740c67a06e3b1a9f71ea) + * Config saved to config.json and https://gist.github.com/740c67a06e3b1a9f71ea + */ +if (typeof jQuery === 'undefined') { + throw new Error('Bootstrap\'s JavaScript requires jQuery') +} ++function ($) { + 'use strict'; + var version = $.fn.jquery.split(' ')[0].split('.') + if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] > 2)) { + throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 3') + } +}(jQuery); + +/* ======================================================================== + * Bootstrap: alert.js v3.3.6 + * http://getbootstrap.com/javascript/#alerts + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // ALERT CLASS DEFINITION + // ====================== + + var dismiss = '[data-dismiss="alert"]' + var Alert = function (el) { + $(el).on('click', dismiss, this.close) + } + + Alert.VERSION = '3.3.6' + + Alert.TRANSITION_DURATION = 150 + + Alert.prototype.close = function (e) { + var $this = $(this) + var selector = $this.attr('data-target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + var $parent = $(selector) + + if (e) e.preventDefault() + + if (!$parent.length) { + $parent = $this.closest('.alert') + } + + $parent.trigger(e = $.Event('close.bs.alert')) + + if (e.isDefaultPrevented()) return + + $parent.removeClass('in') + + function removeElement() { + // detach from parent, fire event then clean up data + $parent.detach().trigger('closed.bs.alert').remove() + } + + $.support.transition && $parent.hasClass('fade') ? + $parent + .one('bsTransitionEnd', removeElement) + .emulateTransitionEnd(Alert.TRANSITION_DURATION) : + removeElement() + } + + + // ALERT PLUGIN DEFINITION + // ======================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.alert') + + if (!data) $this.data('bs.alert', (data = new Alert(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + var old = $.fn.alert + + $.fn.alert = Plugin + $.fn.alert.Constructor = Alert + + + // ALERT NO CONFLICT + // ================= + + $.fn.alert.noConflict = function () { + $.fn.alert = old + return this + } + + + // ALERT DATA-API + // ============== + + $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: button.js v3.3.6 + * http://getbootstrap.com/javascript/#buttons + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // BUTTON PUBLIC CLASS DEFINITION + // ============================== + + var Button = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, Button.DEFAULTS, options) + this.isLoading = false + } + + Button.VERSION = '3.3.6' + + Button.DEFAULTS = { + loadingText: 'loading...' + } + + Button.prototype.setState = function (state) { + var d = 'disabled' + var $el = this.$element + var val = $el.is('input') ? 'val' : 'html' + var data = $el.data() + + state += 'Text' + + if (data.resetText == null) $el.data('resetText', $el[val]()) + + // push to event loop to allow forms to submit + setTimeout($.proxy(function () { + $el[val](data[state] == null ? this.options[state] : data[state]) + + if (state == 'loadingText') { + this.isLoading = true + $el.addClass(d).attr(d, d) + } else if (this.isLoading) { + this.isLoading = false + $el.removeClass(d).removeAttr(d) + } + }, this), 0) + } + + Button.prototype.toggle = function () { + var changed = true + var $parent = this.$element.closest('[data-toggle="buttons"]') + + if ($parent.length) { + var $input = this.$element.find('input') + if ($input.prop('type') == 'radio') { + if ($input.prop('checked')) changed = false + $parent.find('.active').removeClass('active') + this.$element.addClass('active') + } else if ($input.prop('type') == 'checkbox') { + if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false + this.$element.toggleClass('active') + } + $input.prop('checked', this.$element.hasClass('active')) + if (changed) $input.trigger('change') + } else { + this.$element.attr('aria-pressed', !this.$element.hasClass('active')) + this.$element.toggleClass('active') + } + } + + + // BUTTON PLUGIN DEFINITION + // ======================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.button') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.button', (data = new Button(this, options))) + + if (option == 'toggle') data.toggle() + else if (option) data.setState(option) + }) + } + + var old = $.fn.button + + $.fn.button = Plugin + $.fn.button.Constructor = Button + + + // BUTTON NO CONFLICT + // ================== + + $.fn.button.noConflict = function () { + $.fn.button = old + return this + } + + + // BUTTON DATA-API + // =============== + + $(document) + .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) { + var $btn = $(e.target) + if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') + Plugin.call($btn, 'toggle') + if (!($(e.target).is('input[type="radio"]') || $(e.target).is('input[type="checkbox"]'))) e.preventDefault() + }) + .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) { + $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type)) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: carousel.js v3.3.6 + * http://getbootstrap.com/javascript/#carousel + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // CAROUSEL CLASS DEFINITION + // ========================= + + var Carousel = function (element, options) { + this.$element = $(element) + this.$indicators = this.$element.find('.carousel-indicators') + this.options = options + this.paused = null + this.sliding = null + this.interval = null + this.$active = null + this.$items = null + + this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this)) + + this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element + .on('mouseenter.bs.carousel', $.proxy(this.pause, this)) + .on('mouseleave.bs.carousel', $.proxy(this.cycle, this)) + } + + Carousel.VERSION = '3.3.6' + + Carousel.TRANSITION_DURATION = 600 + + Carousel.DEFAULTS = { + interval: 5000, + pause: 'hover', + wrap: true, + keyboard: true + } + + Carousel.prototype.keydown = function (e) { + if (/input|textarea/i.test(e.target.tagName)) return + switch (e.which) { + case 37: this.prev(); break + case 39: this.next(); break + default: return + } + + e.preventDefault() + } + + Carousel.prototype.cycle = function (e) { + e || (this.paused = false) + + this.interval && clearInterval(this.interval) + + this.options.interval + && !this.paused + && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) + + return this + } + + Carousel.prototype.getItemIndex = function (item) { + this.$items = item.parent().children('.item') + return this.$items.index(item || this.$active) + } + + Carousel.prototype.getItemForDirection = function (direction, active) { + var activeIndex = this.getItemIndex(active) + var willWrap = (direction == 'prev' && activeIndex === 0) + || (direction == 'next' && activeIndex == (this.$items.length - 1)) + if (willWrap && !this.options.wrap) return active + var delta = direction == 'prev' ? -1 : 1 + var itemIndex = (activeIndex + delta) % this.$items.length + return this.$items.eq(itemIndex) + } + + Carousel.prototype.to = function (pos) { + var that = this + var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active')) + + if (pos > (this.$items.length - 1) || pos < 0) return + + if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid" + if (activeIndex == pos) return this.pause().cycle() + + return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos)) + } + + Carousel.prototype.pause = function (e) { + e || (this.paused = true) + + if (this.$element.find('.next, .prev').length && $.support.transition) { + this.$element.trigger($.support.transition.end) + this.cycle(true) + } + + this.interval = clearInterval(this.interval) + + return this + } + + Carousel.prototype.next = function () { + if (this.sliding) return + return this.slide('next') + } + + Carousel.prototype.prev = function () { + if (this.sliding) return + return this.slide('prev') + } + + Carousel.prototype.slide = function (type, next) { + var $active = this.$element.find('.item.active') + var $next = next || this.getItemForDirection(type, $active) + var isCycling = this.interval + var direction = type == 'next' ? 'left' : 'right' + var that = this + + if ($next.hasClass('active')) return (this.sliding = false) + + var relatedTarget = $next[0] + var slideEvent = $.Event('slide.bs.carousel', { + relatedTarget: relatedTarget, + direction: direction + }) + this.$element.trigger(slideEvent) + if (slideEvent.isDefaultPrevented()) return + + this.sliding = true + + isCycling && this.pause() + + if (this.$indicators.length) { + this.$indicators.find('.active').removeClass('active') + var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)]) + $nextIndicator && $nextIndicator.addClass('active') + } + + var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid" + if ($.support.transition && this.$element.hasClass('slide')) { + $next.addClass(type) + $next[0].offsetWidth // force reflow + $active.addClass(direction) + $next.addClass(direction) + $active + .one('bsTransitionEnd', function () { + $next.removeClass([type, direction].join(' ')).addClass('active') + $active.removeClass(['active', direction].join(' ')) + that.sliding = false + setTimeout(function () { + that.$element.trigger(slidEvent) + }, 0) + }) + .emulateTransitionEnd(Carousel.TRANSITION_DURATION) + } else { + $active.removeClass('active') + $next.addClass('active') + this.sliding = false + this.$element.trigger(slidEvent) + } + + isCycling && this.cycle() + + return this + } + + + // CAROUSEL PLUGIN DEFINITION + // ========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.carousel') + var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) + var action = typeof option == 'string' ? option : options.slide + + if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) + if (typeof option == 'number') data.to(option) + else if (action) data[action]() + else if (options.interval) data.pause().cycle() + }) + } + + var old = $.fn.carousel + + $.fn.carousel = Plugin + $.fn.carousel.Constructor = Carousel + + + // CAROUSEL NO CONFLICT + // ==================== + + $.fn.carousel.noConflict = function () { + $.fn.carousel = old + return this + } + + + // CAROUSEL DATA-API + // ================= + + var clickHandler = function (e) { + var href + var $this = $(this) + var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7 + if (!$target.hasClass('carousel')) return + var options = $.extend({}, $target.data(), $this.data()) + var slideIndex = $this.attr('data-slide-to') + if (slideIndex) options.interval = false + + Plugin.call($target, options) + + if (slideIndex) { + $target.data('bs.carousel').to(slideIndex) + } + + e.preventDefault() + } + + $(document) + .on('click.bs.carousel.data-api', '[data-slide]', clickHandler) + .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler) + + $(window).on('load', function () { + $('[data-ride="carousel"]').each(function () { + var $carousel = $(this) + Plugin.call($carousel, $carousel.data()) + }) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: dropdown.js v3.3.6 + * http://getbootstrap.com/javascript/#dropdowns + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // DROPDOWN CLASS DEFINITION + // ========================= + + var backdrop = '.dropdown-backdrop' + var toggle = '[data-toggle="dropdown"]' + var Dropdown = function (element) { + $(element).on('click.bs.dropdown', this.toggle) + } + + Dropdown.VERSION = '3.3.6' + + function getParent($this) { + var selector = $this.attr('data-target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + var $parent = selector && $(selector) + + return $parent && $parent.length ? $parent : $this.parent() + } + + function clearMenus(e) { + if (e && e.which === 3) return + $(backdrop).remove() + $(toggle).each(function () { + var $this = $(this) + var $parent = getParent($this) + var relatedTarget = { relatedTarget: this } + + if (!$parent.hasClass('open')) return + + if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return + + $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget)) + + if (e.isDefaultPrevented()) return + + $this.attr('aria-expanded', 'false') + $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget)) + }) + } + + Dropdown.prototype.toggle = function (e) { + var $this = $(this) + + if ($this.is('.disabled, :disabled')) return + + var $parent = getParent($this) + var isActive = $parent.hasClass('open') + + clearMenus() + + if (!isActive) { + if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { + // if mobile we use a backdrop because click events don't delegate + $(document.createElement('div')) + .addClass('dropdown-backdrop') + .insertAfter($(this)) + .on('click', clearMenus) + } + + var relatedTarget = { relatedTarget: this } + $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget)) + + if (e.isDefaultPrevented()) return + + $this + .trigger('focus') + .attr('aria-expanded', 'true') + + $parent + .toggleClass('open') + .trigger($.Event('shown.bs.dropdown', relatedTarget)) + } + + return false + } + + Dropdown.prototype.keydown = function (e) { + if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return + + var $this = $(this) + + e.preventDefault() + e.stopPropagation() + + if ($this.is('.disabled, :disabled')) return + + var $parent = getParent($this) + var isActive = $parent.hasClass('open') + + if (!isActive && e.which != 27 || isActive && e.which == 27) { + if (e.which == 27) $parent.find(toggle).trigger('focus') + return $this.trigger('click') + } + + var desc = ' li:not(.disabled):visible a' + var $items = $parent.find('.dropdown-menu' + desc) + + if (!$items.length) return + + var index = $items.index(e.target) + + if (e.which == 38 && index > 0) index-- // up + if (e.which == 40 && index < $items.length - 1) index++ // down + if (!~index) index = 0 + + $items.eq(index).trigger('focus') + } + + + // DROPDOWN PLUGIN DEFINITION + // ========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.dropdown') + + if (!data) $this.data('bs.dropdown', (data = new Dropdown(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + var old = $.fn.dropdown + + $.fn.dropdown = Plugin + $.fn.dropdown.Constructor = Dropdown + + + // DROPDOWN NO CONFLICT + // ==================== + + $.fn.dropdown.noConflict = function () { + $.fn.dropdown = old + return this + } + + + // APPLY TO STANDARD DROPDOWN ELEMENTS + // =================================== + + $(document) + .on('click.bs.dropdown.data-api', clearMenus) + .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) + .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle) + .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown) + .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: modal.js v3.3.6 + * http://getbootstrap.com/javascript/#modals + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // MODAL CLASS DEFINITION + // ====================== + + var Modal = function (element, options) { + this.options = options + this.$body = $(document.body) + this.$element = $(element) + this.$dialog = this.$element.find('.modal-dialog') + this.$backdrop = null + this.isShown = null + this.originalBodyPad = null + this.scrollbarWidth = 0 + this.ignoreBackdropClick = false + + if (this.options.remote) { + this.$element + .find('.modal-content') + .load(this.options.remote, $.proxy(function () { + this.$element.trigger('loaded.bs.modal') + }, this)) + } + } + + Modal.VERSION = '3.3.6' + + Modal.TRANSITION_DURATION = 300 + Modal.BACKDROP_TRANSITION_DURATION = 150 + + Modal.DEFAULTS = { + backdrop: true, + keyboard: true, + show: true + } + + Modal.prototype.toggle = function (_relatedTarget) { + return this.isShown ? this.hide() : this.show(_relatedTarget) + } + + Modal.prototype.show = function (_relatedTarget) { + var that = this + var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget }) + + this.$element.trigger(e) + + if (this.isShown || e.isDefaultPrevented()) return + + this.isShown = true + + this.checkScrollbar() + this.setScrollbar() + this.$body.addClass('modal-open') + + this.escape() + this.resize() + + this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this)) + + this.$dialog.on('mousedown.dismiss.bs.modal', function () { + that.$element.one('mouseup.dismiss.bs.modal', function (e) { + if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true + }) + }) + + this.backdrop(function () { + var transition = $.support.transition && that.$element.hasClass('fade') + + if (!that.$element.parent().length) { + that.$element.appendTo(that.$body) // don't move modals dom position + } + + that.$element + .show() + .scrollTop(0) + + that.adjustDialog() + + if (transition) { + that.$element[0].offsetWidth // force reflow + } + + that.$element.addClass('in') + + that.enforceFocus() + + var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget }) + + transition ? + that.$dialog // wait for modal to slide in + .one('bsTransitionEnd', function () { + that.$element.trigger('focus').trigger(e) + }) + .emulateTransitionEnd(Modal.TRANSITION_DURATION) : + that.$element.trigger('focus').trigger(e) + }) + } + + Modal.prototype.hide = function (e) { + if (e) e.preventDefault() + + e = $.Event('hide.bs.modal') + + this.$element.trigger(e) + + if (!this.isShown || e.isDefaultPrevented()) return + + this.isShown = false + + this.escape() + this.resize() + + $(document).off('focusin.bs.modal') + + this.$element + .removeClass('in') + .off('click.dismiss.bs.modal') + .off('mouseup.dismiss.bs.modal') + + this.$dialog.off('mousedown.dismiss.bs.modal') + + $.support.transition && this.$element.hasClass('fade') ? + this.$element + .one('bsTransitionEnd', $.proxy(this.hideModal, this)) + .emulateTransitionEnd(Modal.TRANSITION_DURATION) : + this.hideModal() + } + + Modal.prototype.enforceFocus = function () { + $(document) + .off('focusin.bs.modal') // guard against infinite focus loop + .on('focusin.bs.modal', $.proxy(function (e) { + if (this.$element[0] !== e.target && !this.$element.has(e.target).length) { + this.$element.trigger('focus') + } + }, this)) + } + + Modal.prototype.escape = function () { + if (this.isShown && this.options.keyboard) { + this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) { + e.which == 27 && this.hide() + }, this)) + } else if (!this.isShown) { + this.$element.off('keydown.dismiss.bs.modal') + } + } + + Modal.prototype.resize = function () { + if (this.isShown) { + $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this)) + } else { + $(window).off('resize.bs.modal') + } + } + + Modal.prototype.hideModal = function () { + var that = this + this.$element.hide() + this.backdrop(function () { + that.$body.removeClass('modal-open') + that.resetAdjustments() + that.resetScrollbar() + that.$element.trigger('hidden.bs.modal') + }) + } + + Modal.prototype.removeBackdrop = function () { + this.$backdrop && this.$backdrop.remove() + this.$backdrop = null + } + + Modal.prototype.backdrop = function (callback) { + var that = this + var animate = this.$element.hasClass('fade') ? 'fade' : '' + + if (this.isShown && this.options.backdrop) { + var doAnimate = $.support.transition && animate + + this.$backdrop = $(document.createElement('div')) + .addClass('modal-backdrop ' + animate) + .appendTo(this.$body) + + this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) { + if (this.ignoreBackdropClick) { + this.ignoreBackdropClick = false + return + } + if (e.target !== e.currentTarget) return + this.options.backdrop == 'static' + ? this.$element[0].focus() + : this.hide() + }, this)) + + if (doAnimate) this.$backdrop[0].offsetWidth // force reflow + + this.$backdrop.addClass('in') + + if (!callback) return + + doAnimate ? + this.$backdrop + .one('bsTransitionEnd', callback) + .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : + callback() + + } else if (!this.isShown && this.$backdrop) { + this.$backdrop.removeClass('in') + + var callbackRemove = function () { + that.removeBackdrop() + callback && callback() + } + $.support.transition && this.$element.hasClass('fade') ? + this.$backdrop + .one('bsTransitionEnd', callbackRemove) + .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : + callbackRemove() + + } else if (callback) { + callback() + } + } + + // these following methods are used to handle overflowing modals + + Modal.prototype.handleUpdate = function () { + this.adjustDialog() + } + + Modal.prototype.adjustDialog = function () { + var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight + + this.$element.css({ + paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '', + paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : '' + }) + } + + Modal.prototype.resetAdjustments = function () { + this.$element.css({ + paddingLeft: '', + paddingRight: '' + }) + } + + Modal.prototype.checkScrollbar = function () { + var fullWindowWidth = window.innerWidth + if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8 + var documentElementRect = document.documentElement.getBoundingClientRect() + fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left) + } + this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth + this.scrollbarWidth = this.measureScrollbar() + } + + Modal.prototype.setScrollbar = function () { + var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10) + this.originalBodyPad = document.body.style.paddingRight || '' + if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth) + } + + Modal.prototype.resetScrollbar = function () { + this.$body.css('padding-right', this.originalBodyPad) + } + + Modal.prototype.measureScrollbar = function () { // thx walsh + var scrollDiv = document.createElement('div') + scrollDiv.className = 'modal-scrollbar-measure' + this.$body.append(scrollDiv) + var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth + this.$body[0].removeChild(scrollDiv) + return scrollbarWidth + } + + + // MODAL PLUGIN DEFINITION + // ======================= + + function Plugin(option, _relatedTarget) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.modal') + var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option) + + if (!data) $this.data('bs.modal', (data = new Modal(this, options))) + if (typeof option == 'string') data[option](_relatedTarget) + else if (options.show) data.show(_relatedTarget) + }) + } + + var old = $.fn.modal + + $.fn.modal = Plugin + $.fn.modal.Constructor = Modal + + + // MODAL NO CONFLICT + // ================= + + $.fn.modal.noConflict = function () { + $.fn.modal = old + return this + } + + + // MODAL DATA-API + // ============== + + $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) { + var $this = $(this) + var href = $this.attr('href') + var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7 + var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data()) + + if ($this.is('a')) e.preventDefault() + + $target.one('show.bs.modal', function (showEvent) { + if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown + $target.one('hidden.bs.modal', function () { + $this.is(':visible') && $this.trigger('focus') + }) + }) + Plugin.call($target, option, this) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: tooltip.js v3.3.6 + * http://getbootstrap.com/javascript/#tooltip + * Inspired by the original jQuery.tipsy by Jason Frame + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // TOOLTIP PUBLIC CLASS DEFINITION + // =============================== + + var Tooltip = function (element, options) { + this.type = null + this.options = null + this.enabled = null + this.timeout = null + this.hoverState = null + this.$element = null + this.inState = null + + this.init('tooltip', element, options) + } + + Tooltip.VERSION = '3.3.6' + + Tooltip.TRANSITION_DURATION = 150 + + Tooltip.DEFAULTS = { + animation: true, + placement: 'top', + selector: false, + template: '', + trigger: 'hover focus', + title: '', + delay: 0, + html: false, + container: false, + viewport: { + selector: 'body', + padding: 0 + } + } + + Tooltip.prototype.init = function (type, element, options) { + this.enabled = true + this.type = type + this.$element = $(element) + this.options = this.getOptions(options) + this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport)) + this.inState = { click: false, hover: false, focus: false } + + if (this.$element[0] instanceof document.constructor && !this.options.selector) { + throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!') + } + + var triggers = this.options.trigger.split(' ') + + for (var i = triggers.length; i--;) { + var trigger = triggers[i] + + if (trigger == 'click') { + this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this)) + } else if (trigger != 'manual') { + var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin' + var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout' + + this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this)) + this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this)) + } + } + + this.options.selector ? + (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : + this.fixTitle() + } + + Tooltip.prototype.getDefaults = function () { + return Tooltip.DEFAULTS + } + + Tooltip.prototype.getOptions = function (options) { + options = $.extend({}, this.getDefaults(), this.$element.data(), options) + + if (options.delay && typeof options.delay == 'number') { + options.delay = { + show: options.delay, + hide: options.delay + } + } + + return options + } + + Tooltip.prototype.getDelegateOptions = function () { + var options = {} + var defaults = this.getDefaults() + + this._options && $.each(this._options, function (key, value) { + if (defaults[key] != value) options[key] = value + }) + + return options + } + + Tooltip.prototype.enter = function (obj) { + var self = obj instanceof this.constructor ? + obj : $(obj.currentTarget).data('bs.' + this.type) + + if (!self) { + self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) + $(obj.currentTarget).data('bs.' + this.type, self) + } + + if (obj instanceof $.Event) { + self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true + } + + if (self.tip().hasClass('in') || self.hoverState == 'in') { + self.hoverState = 'in' + return + } + + clearTimeout(self.timeout) + + self.hoverState = 'in' + + if (!self.options.delay || !self.options.delay.show) return self.show() + + self.timeout = setTimeout(function () { + if (self.hoverState == 'in') self.show() + }, self.options.delay.show) + } + + Tooltip.prototype.isInStateTrue = function () { + for (var key in this.inState) { + if (this.inState[key]) return true + } + + return false + } + + Tooltip.prototype.leave = function (obj) { + var self = obj instanceof this.constructor ? + obj : $(obj.currentTarget).data('bs.' + this.type) + + if (!self) { + self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) + $(obj.currentTarget).data('bs.' + this.type, self) + } + + if (obj instanceof $.Event) { + self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false + } + + if (self.isInStateTrue()) return + + clearTimeout(self.timeout) + + self.hoverState = 'out' + + if (!self.options.delay || !self.options.delay.hide) return self.hide() + + self.timeout = setTimeout(function () { + if (self.hoverState == 'out') self.hide() + }, self.options.delay.hide) + } + + Tooltip.prototype.show = function () { + var e = $.Event('show.bs.' + this.type) + + if (this.hasContent() && this.enabled) { + this.$element.trigger(e) + + var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0]) + if (e.isDefaultPrevented() || !inDom) return + var that = this + + var $tip = this.tip() + + var tipId = this.getUID(this.type) + + this.setContent() + $tip.attr('id', tipId) + this.$element.attr('aria-describedby', tipId) + + if (this.options.animation) $tip.addClass('fade') + + var placement = typeof this.options.placement == 'function' ? + this.options.placement.call(this, $tip[0], this.$element[0]) : + this.options.placement + + var autoToken = /\s?auto?\s?/i + var autoPlace = autoToken.test(placement) + if (autoPlace) placement = placement.replace(autoToken, '') || 'top' + + $tip + .detach() + .css({ top: 0, left: 0, display: 'block' }) + .addClass(placement) + .data('bs.' + this.type, this) + + this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element) + this.$element.trigger('inserted.bs.' + this.type) + + var pos = this.getPosition() + var actualWidth = $tip[0].offsetWidth + var actualHeight = $tip[0].offsetHeight + + if (autoPlace) { + var orgPlacement = placement + var viewportDim = this.getPosition(this.$viewport) + + placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top' : + placement == 'top' && pos.top - actualHeight < viewportDim.top ? 'bottom' : + placement == 'right' && pos.right + actualWidth > viewportDim.width ? 'left' : + placement == 'left' && pos.left - actualWidth < viewportDim.left ? 'right' : + placement + + $tip + .removeClass(orgPlacement) + .addClass(placement) + } + + var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight) + + this.applyPlacement(calculatedOffset, placement) + + var complete = function () { + var prevHoverState = that.hoverState + that.$element.trigger('shown.bs.' + that.type) + that.hoverState = null + + if (prevHoverState == 'out') that.leave(that) + } + + $.support.transition && this.$tip.hasClass('fade') ? + $tip + .one('bsTransitionEnd', complete) + .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : + complete() + } + } + + Tooltip.prototype.applyPlacement = function (offset, placement) { + var $tip = this.tip() + var width = $tip[0].offsetWidth + var height = $tip[0].offsetHeight + + // manually read margins because getBoundingClientRect includes difference + var marginTop = parseInt($tip.css('margin-top'), 10) + var marginLeft = parseInt($tip.css('margin-left'), 10) + + // we must check for NaN for ie 8/9 + if (isNaN(marginTop)) marginTop = 0 + if (isNaN(marginLeft)) marginLeft = 0 + + offset.top += marginTop + offset.left += marginLeft + + // $.fn.offset doesn't round pixel values + // so we use setOffset directly with our own function B-0 + $.offset.setOffset($tip[0], $.extend({ + using: function (props) { + $tip.css({ + top: Math.round(props.top), + left: Math.round(props.left) + }) + } + }, offset), 0) + + $tip.addClass('in') + + // check to see if placing tip in new offset caused the tip to resize itself + var actualWidth = $tip[0].offsetWidth + var actualHeight = $tip[0].offsetHeight + + if (placement == 'top' && actualHeight != height) { + offset.top = offset.top + height - actualHeight + } + + var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight) + + if (delta.left) offset.left += delta.left + else offset.top += delta.top + + var isVertical = /top|bottom/.test(placement) + var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight + var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight' + + $tip.offset(offset) + this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical) + } + + Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) { + this.arrow() + .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%') + .css(isVertical ? 'top' : 'left', '') + } + + Tooltip.prototype.setContent = function () { + var $tip = this.tip() + var title = this.getTitle() + + $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title) + $tip.removeClass('fade in top bottom left right') + } + + Tooltip.prototype.hide = function (callback) { + var that = this + var $tip = $(this.$tip) + var e = $.Event('hide.bs.' + this.type) + + function complete() { + if (that.hoverState != 'in') $tip.detach() + that.$element + .removeAttr('aria-describedby') + .trigger('hidden.bs.' + that.type) + callback && callback() + } + + this.$element.trigger(e) + + if (e.isDefaultPrevented()) return + + $tip.removeClass('in') + + $.support.transition && $tip.hasClass('fade') ? + $tip + .one('bsTransitionEnd', complete) + .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : + complete() + + this.hoverState = null + + return this + } + + Tooltip.prototype.fixTitle = function () { + var $e = this.$element + if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') { + $e.attr('data-original-title', $e.attr('title') || '').attr('title', '') + } + } + + Tooltip.prototype.hasContent = function () { + return this.getTitle() + } + + Tooltip.prototype.getPosition = function ($element) { + $element = $element || this.$element + + var el = $element[0] + var isBody = el.tagName == 'BODY' + + var elRect = el.getBoundingClientRect() + if (elRect.width == null) { + // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093 + elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top }) + } + var elOffset = isBody ? { top: 0, left: 0 } : $element.offset() + var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() } + var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null + + return $.extend({}, elRect, scroll, outerDims, elOffset) + } + + Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) { + return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } : + placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } : + placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } : + /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width } + + } + + Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) { + var delta = { top: 0, left: 0 } + if (!this.$viewport) return delta + + var viewportPadding = this.options.viewport && this.options.viewport.padding || 0 + var viewportDimensions = this.getPosition(this.$viewport) + + if (/right|left/.test(placement)) { + var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll + var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight + if (topEdgeOffset < viewportDimensions.top) { // top overflow + delta.top = viewportDimensions.top - topEdgeOffset + } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow + delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset + } + } else { + var leftEdgeOffset = pos.left - viewportPadding + var rightEdgeOffset = pos.left + viewportPadding + actualWidth + if (leftEdgeOffset < viewportDimensions.left) { // left overflow + delta.left = viewportDimensions.left - leftEdgeOffset + } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow + delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset + } + } + + return delta + } + + Tooltip.prototype.getTitle = function () { + var title + var $e = this.$element + var o = this.options + + title = $e.attr('data-original-title') + || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) + + return title + } + + Tooltip.prototype.getUID = function (prefix) { + do prefix += ~~(Math.random() * 1000000) + while (document.getElementById(prefix)) + return prefix + } + + Tooltip.prototype.tip = function () { + if (!this.$tip) { + this.$tip = $(this.options.template) + if (this.$tip.length != 1) { + throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!') + } + } + return this.$tip + } + + Tooltip.prototype.arrow = function () { + return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')) + } + + Tooltip.prototype.enable = function () { + this.enabled = true + } + + Tooltip.prototype.disable = function () { + this.enabled = false + } + + Tooltip.prototype.toggleEnabled = function () { + this.enabled = !this.enabled + } + + Tooltip.prototype.toggle = function (e) { + var self = this + if (e) { + self = $(e.currentTarget).data('bs.' + this.type) + if (!self) { + self = new this.constructor(e.currentTarget, this.getDelegateOptions()) + $(e.currentTarget).data('bs.' + this.type, self) + } + } + + if (e) { + self.inState.click = !self.inState.click + if (self.isInStateTrue()) self.enter(self) + else self.leave(self) + } else { + self.tip().hasClass('in') ? self.leave(self) : self.enter(self) + } + } + + Tooltip.prototype.destroy = function () { + var that = this + clearTimeout(this.timeout) + this.hide(function () { + that.$element.off('.' + that.type).removeData('bs.' + that.type) + if (that.$tip) { + that.$tip.detach() + } + that.$tip = null + that.$arrow = null + that.$viewport = null + }) + } + + + // TOOLTIP PLUGIN DEFINITION + // ========================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.tooltip') + var options = typeof option == 'object' && option + + if (!data && /destroy|hide/.test(option)) return + if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.tooltip + + $.fn.tooltip = Plugin + $.fn.tooltip.Constructor = Tooltip + + + // TOOLTIP NO CONFLICT + // =================== + + $.fn.tooltip.noConflict = function () { + $.fn.tooltip = old + return this + } + +}(jQuery); + +/* ======================================================================== + * Bootstrap: popover.js v3.3.6 + * http://getbootstrap.com/javascript/#popovers + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // POPOVER PUBLIC CLASS DEFINITION + // =============================== + + var Popover = function (element, options) { + this.init('popover', element, options) + } + + if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js') + + Popover.VERSION = '3.3.6' + + Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, { + placement: 'right', + trigger: 'click', + content: '', + template: '' + }) + + + // NOTE: POPOVER EXTENDS tooltip.js + // ================================ + + Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype) + + Popover.prototype.constructor = Popover + + Popover.prototype.getDefaults = function () { + return Popover.DEFAULTS + } + + Popover.prototype.setContent = function () { + var $tip = this.tip() + var title = this.getTitle() + var content = this.getContent() + + $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title) + $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events + this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text' + ](content) + + $tip.removeClass('fade top bottom left right in') + + // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do + // this manually by checking the contents. + if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide() + } + + Popover.prototype.hasContent = function () { + return this.getTitle() || this.getContent() + } + + Popover.prototype.getContent = function () { + var $e = this.$element + var o = this.options + + return $e.attr('data-content') + || (typeof o.content == 'function' ? + o.content.call($e[0]) : + o.content) + } + + Popover.prototype.arrow = function () { + return (this.$arrow = this.$arrow || this.tip().find('.arrow')) + } + + + // POPOVER PLUGIN DEFINITION + // ========================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.popover') + var options = typeof option == 'object' && option + + if (!data && /destroy|hide/.test(option)) return + if (!data) $this.data('bs.popover', (data = new Popover(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.popover + + $.fn.popover = Plugin + $.fn.popover.Constructor = Popover + + + // POPOVER NO CONFLICT + // =================== + + $.fn.popover.noConflict = function () { + $.fn.popover = old + return this + } + +}(jQuery); + +/* ======================================================================== + * Bootstrap: tab.js v3.3.6 + * http://getbootstrap.com/javascript/#tabs + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // TAB CLASS DEFINITION + // ==================== + + var Tab = function (element) { + // jscs:disable requireDollarBeforejQueryAssignment + this.element = $(element) + // jscs:enable requireDollarBeforejQueryAssignment + } + + Tab.VERSION = '3.3.6' + + Tab.TRANSITION_DURATION = 150 + + Tab.prototype.show = function () { + var $this = this.element + var $ul = $this.closest('ul:not(.dropdown-menu)') + var selector = $this.data('target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + if ($this.parent('li').hasClass('active')) return + + var $previous = $ul.find('.active:last a') + var hideEvent = $.Event('hide.bs.tab', { + relatedTarget: $this[0] + }) + var showEvent = $.Event('show.bs.tab', { + relatedTarget: $previous[0] + }) + + $previous.trigger(hideEvent) + $this.trigger(showEvent) + + if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return + + var $target = $(selector) + + this.activate($this.closest('li'), $ul) + this.activate($target, $target.parent(), function () { + $previous.trigger({ + type: 'hidden.bs.tab', + relatedTarget: $this[0] + }) + $this.trigger({ + type: 'shown.bs.tab', + relatedTarget: $previous[0] + }) + }) + } + + Tab.prototype.activate = function (element, container, callback) { + var $active = container.find('> .active') + var transition = callback + && $.support.transition + && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length) + + function next() { + $active + .removeClass('active') + .find('> .dropdown-menu > .active') + .removeClass('active') + .end() + .find('[data-toggle="tab"]') + .attr('aria-expanded', false) + + element + .addClass('active') + .find('[data-toggle="tab"]') + .attr('aria-expanded', true) + + if (transition) { + element[0].offsetWidth // reflow for transition + element.addClass('in') + } else { + element.removeClass('fade') + } + + if (element.parent('.dropdown-menu').length) { + element + .closest('li.dropdown') + .addClass('active') + .end() + .find('[data-toggle="tab"]') + .attr('aria-expanded', true) + } + + callback && callback() + } + + $active.length && transition ? + $active + .one('bsTransitionEnd', next) + .emulateTransitionEnd(Tab.TRANSITION_DURATION) : + next() + + $active.removeClass('in') + } + + + // TAB PLUGIN DEFINITION + // ===================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.tab') + + if (!data) $this.data('bs.tab', (data = new Tab(this))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.tab + + $.fn.tab = Plugin + $.fn.tab.Constructor = Tab + + + // TAB NO CONFLICT + // =============== + + $.fn.tab.noConflict = function () { + $.fn.tab = old + return this + } + + + // TAB DATA-API + // ============ + + var clickHandler = function (e) { + e.preventDefault() + Plugin.call($(this), 'show') + } + + $(document) + .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler) + .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: affix.js v3.3.6 + * http://getbootstrap.com/javascript/#affix + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // AFFIX CLASS DEFINITION + // ====================== + + var Affix = function (element, options) { + this.options = $.extend({}, Affix.DEFAULTS, options) + + this.$target = $(this.options.target) + .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this)) + .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this)) + + this.$element = $(element) + this.affixed = null + this.unpin = null + this.pinnedOffset = null + + this.checkPosition() + } + + Affix.VERSION = '3.3.6' + + Affix.RESET = 'affix affix-top affix-bottom' + + Affix.DEFAULTS = { + offset: 0, + target: window + } + + Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) { + var scrollTop = this.$target.scrollTop() + var position = this.$element.offset() + var targetHeight = this.$target.height() + + if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false + + if (this.affixed == 'bottom') { + if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom' + return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom' + } + + var initializing = this.affixed == null + var colliderTop = initializing ? scrollTop : position.top + var colliderHeight = initializing ? targetHeight : height + + if (offsetTop != null && scrollTop <= offsetTop) return 'top' + if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom' + + return false + } + + Affix.prototype.getPinnedOffset = function () { + if (this.pinnedOffset) return this.pinnedOffset + this.$element.removeClass(Affix.RESET).addClass('affix') + var scrollTop = this.$target.scrollTop() + var position = this.$element.offset() + return (this.pinnedOffset = position.top - scrollTop) + } + + Affix.prototype.checkPositionWithEventLoop = function () { + setTimeout($.proxy(this.checkPosition, this), 1) + } + + Affix.prototype.checkPosition = function () { + if (!this.$element.is(':visible')) return + + var height = this.$element.height() + var offset = this.options.offset + var offsetTop = offset.top + var offsetBottom = offset.bottom + var scrollHeight = Math.max($(document).height(), $(document.body).height()) + + if (typeof offset != 'object') offsetBottom = offsetTop = offset + if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element) + if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element) + + var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom) + + if (this.affixed != affix) { + if (this.unpin != null) this.$element.css('top', '') + + var affixType = 'affix' + (affix ? '-' + affix : '') + var e = $.Event(affixType + '.bs.affix') + + this.$element.trigger(e) + + if (e.isDefaultPrevented()) return + + this.affixed = affix + this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null + + this.$element + .removeClass(Affix.RESET) + .addClass(affixType) + .trigger(affixType.replace('affix', 'affixed') + '.bs.affix') + } + + if (affix == 'bottom') { + this.$element.offset({ + top: scrollHeight - height - offsetBottom + }) + } + } + + + // AFFIX PLUGIN DEFINITION + // ======================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.affix') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.affix', (data = new Affix(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.affix + + $.fn.affix = Plugin + $.fn.affix.Constructor = Affix + + + // AFFIX NO CONFLICT + // ================= + + $.fn.affix.noConflict = function () { + $.fn.affix = old + return this + } + + + // AFFIX DATA-API + // ============== + + $(window).on('load', function () { + $('[data-spy="affix"]').each(function () { + var $spy = $(this) + var data = $spy.data() + + data.offset = data.offset || {} + + if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom + if (data.offsetTop != null) data.offset.top = data.offsetTop + + Plugin.call($spy, data) + }) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: collapse.js v3.3.6 + * http://getbootstrap.com/javascript/#collapse + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // COLLAPSE PUBLIC CLASS DEFINITION + // ================================ + + var Collapse = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, Collapse.DEFAULTS, options) + this.$trigger = $('[data-toggle="collapse"][href="#' + element.id + '"],' + + '[data-toggle="collapse"][data-target="#' + element.id + '"]') + this.transitioning = null + + if (this.options.parent) { + this.$parent = this.getParent() + } else { + this.addAriaAndCollapsedClass(this.$element, this.$trigger) + } + + if (this.options.toggle) this.toggle() + } + + Collapse.VERSION = '3.3.6' + + Collapse.TRANSITION_DURATION = 350 + + Collapse.DEFAULTS = { + toggle: true + } + + Collapse.prototype.dimension = function () { + var hasWidth = this.$element.hasClass('width') + return hasWidth ? 'width' : 'height' + } + + Collapse.prototype.show = function () { + if (this.transitioning || this.$element.hasClass('in')) return + + var activesData + var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing') + + if (actives && actives.length) { + activesData = actives.data('bs.collapse') + if (activesData && activesData.transitioning) return + } + + var startEvent = $.Event('show.bs.collapse') + this.$element.trigger(startEvent) + if (startEvent.isDefaultPrevented()) return + + if (actives && actives.length) { + Plugin.call(actives, 'hide') + activesData || actives.data('bs.collapse', null) + } + + var dimension = this.dimension() + + this.$element + .removeClass('collapse') + .addClass('collapsing')[dimension](0) + .attr('aria-expanded', true) + + this.$trigger + .removeClass('collapsed') + .attr('aria-expanded', true) + + this.transitioning = 1 + + var complete = function () { + this.$element + .removeClass('collapsing') + .addClass('collapse in')[dimension]('') + this.transitioning = 0 + this.$element + .trigger('shown.bs.collapse') + } + + if (!$.support.transition) return complete.call(this) + + var scrollSize = $.camelCase(['scroll', dimension].join('-')) + + this.$element + .one('bsTransitionEnd', $.proxy(complete, this)) + .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize]) + } + + Collapse.prototype.hide = function () { + if (this.transitioning || !this.$element.hasClass('in')) return + + var startEvent = $.Event('hide.bs.collapse') + this.$element.trigger(startEvent) + if (startEvent.isDefaultPrevented()) return + + var dimension = this.dimension() + + this.$element[dimension](this.$element[dimension]())[0].offsetHeight + + this.$element + .addClass('collapsing') + .removeClass('collapse in') + .attr('aria-expanded', false) + + this.$trigger + .addClass('collapsed') + .attr('aria-expanded', false) + + this.transitioning = 1 + + var complete = function () { + this.transitioning = 0 + this.$element + .removeClass('collapsing') + .addClass('collapse') + .trigger('hidden.bs.collapse') + } + + if (!$.support.transition) return complete.call(this) + + this.$element + [dimension](0) + .one('bsTransitionEnd', $.proxy(complete, this)) + .emulateTransitionEnd(Collapse.TRANSITION_DURATION) + } + + Collapse.prototype.toggle = function () { + this[this.$element.hasClass('in') ? 'hide' : 'show']() + } + + Collapse.prototype.getParent = function () { + return $(this.options.parent) + .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]') + .each($.proxy(function (i, element) { + var $element = $(element) + this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element) + }, this)) + .end() + } + + Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) { + var isOpen = $element.hasClass('in') + + $element.attr('aria-expanded', isOpen) + $trigger + .toggleClass('collapsed', !isOpen) + .attr('aria-expanded', isOpen) + } + + function getTargetFromTrigger($trigger) { + var href + var target = $trigger.attr('data-target') + || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7 + + return $(target) + } + + + // COLLAPSE PLUGIN DEFINITION + // ========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.collapse') + var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) + + if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false + if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.collapse + + $.fn.collapse = Plugin + $.fn.collapse.Constructor = Collapse + + + // COLLAPSE NO CONFLICT + // ==================== + + $.fn.collapse.noConflict = function () { + $.fn.collapse = old + return this + } + + + // COLLAPSE DATA-API + // ================= + + $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) { + var $this = $(this) + + if (!$this.attr('data-target')) e.preventDefault() + + var $target = getTargetFromTrigger($this) + var data = $target.data('bs.collapse') + var option = data ? 'toggle' : $this.data() + + Plugin.call($target, option) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: scrollspy.js v3.3.6 + * http://getbootstrap.com/javascript/#scrollspy + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // SCROLLSPY CLASS DEFINITION + // ========================== + + function ScrollSpy(element, options) { + this.$body = $(document.body) + this.$scrollElement = $(element).is(document.body) ? $(window) : $(element) + this.options = $.extend({}, ScrollSpy.DEFAULTS, options) + this.selector = (this.options.target || '') + ' .nav li > a' + this.offsets = [] + this.targets = [] + this.activeTarget = null + this.scrollHeight = 0 + + this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this)) + this.refresh() + this.process() + } + + ScrollSpy.VERSION = '3.3.6' + + ScrollSpy.DEFAULTS = { + offset: 10 + } + + ScrollSpy.prototype.getScrollHeight = function () { + return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight) + } + + ScrollSpy.prototype.refresh = function () { + var that = this + var offsetMethod = 'offset' + var offsetBase = 0 + + this.offsets = [] + this.targets = [] + this.scrollHeight = this.getScrollHeight() + + if (!$.isWindow(this.$scrollElement[0])) { + offsetMethod = 'position' + offsetBase = this.$scrollElement.scrollTop() + } + + this.$body + .find(this.selector) + .map(function () { + var $el = $(this) + var href = $el.data('target') || $el.attr('href') + var $href = /^#./.test(href) && $(href) + + return ($href + && $href.length + && $href.is(':visible') + && [[$href[offsetMethod]().top + offsetBase, href]]) || null + }) + .sort(function (a, b) { return a[0] - b[0] }) + .each(function () { + that.offsets.push(this[0]) + that.targets.push(this[1]) + }) + } + + ScrollSpy.prototype.process = function () { + var scrollTop = this.$scrollElement.scrollTop() + this.options.offset + var scrollHeight = this.getScrollHeight() + var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height() + var offsets = this.offsets + var targets = this.targets + var activeTarget = this.activeTarget + var i + + if (this.scrollHeight != scrollHeight) { + this.refresh() + } + + if (scrollTop >= maxScroll) { + return activeTarget != (i = targets[targets.length - 1]) && this.activate(i) + } + + if (activeTarget && scrollTop < offsets[0]) { + this.activeTarget = null + return this.clear() + } + + for (i = offsets.length; i--;) { + activeTarget != targets[i] + && scrollTop >= offsets[i] + && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1]) + && this.activate(targets[i]) + } + } + + ScrollSpy.prototype.activate = function (target) { + this.activeTarget = target + + this.clear() + + var selector = this.selector + + '[data-target="' + target + '"],' + + this.selector + '[href="' + target + '"]' + + var active = $(selector) + .parents('li') + .addClass('active') + + if (active.parent('.dropdown-menu').length) { + active = active + .closest('li.dropdown') + .addClass('active') + } + + active.trigger('activate.bs.scrollspy') + } + + ScrollSpy.prototype.clear = function () { + $(this.selector) + .parentsUntil(this.options.target, '.active') + .removeClass('active') + } + + + // SCROLLSPY PLUGIN DEFINITION + // =========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.scrollspy') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.scrollspy + + $.fn.scrollspy = Plugin + $.fn.scrollspy.Constructor = ScrollSpy + + + // SCROLLSPY NO CONFLICT + // ===================== + + $.fn.scrollspy.noConflict = function () { + $.fn.scrollspy = old + return this + } + + + // SCROLLSPY DATA-API + // ================== + + $(window).on('load.bs.scrollspy.data-api', function () { + $('[data-spy="scroll"]').each(function () { + var $spy = $(this) + Plugin.call($spy, $spy.data()) + }) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: transition.js v3.3.6 + * http://getbootstrap.com/javascript/#transitions + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) + // ============================================================ + + function transitionEnd() { + var el = document.createElement('bootstrap') + + var transEndEventNames = { + WebkitTransition : 'webkitTransitionEnd', + MozTransition : 'transitionend', + OTransition : 'oTransitionEnd otransitionend', + transition : 'transitionend' + } + + for (var name in transEndEventNames) { + if (el.style[name] !== undefined) { + return { end: transEndEventNames[name] } + } + } + + return false // explicit for ie8 ( ._.) + } + + // http://blog.alexmaccaw.com/css-transitions + $.fn.emulateTransitionEnd = function (duration) { + var called = false + var $el = this + $(this).one('bsTransitionEnd', function () { called = true }) + var callback = function () { if (!called) $($el).trigger($.support.transition.end) } + setTimeout(callback, duration) + return this + } + + $(function () { + $.support.transition = transitionEnd() + + if (!$.support.transition) return + + $.event.special.bsTransitionEnd = { + bindType: $.support.transition.end, + delegateType: $.support.transition.end, + handle: function (e) { + if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments) + } + } + }) + +}(jQuery); diff --git a/app_v3satdemo/chrome/content/web/js/bootstrap.min.js b/app_v3satdemo/chrome/content/web/js/bootstrap.min.js new file mode 100644 index 0000000..7dc5274 --- /dev/null +++ b/app_v3satdemo/chrome/content/web/js/bootstrap.min.js @@ -0,0 +1,12 @@ +/*! + * Bootstrap v3.3.5 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +/*! + * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=740c67a06e3b1a9f71ea) + * Config saved to config.json and https://gist.github.com/740c67a06e3b1a9f71ea + */ +if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(t){"use strict";var e=t.fn.jquery.split(" ")[0].split(".");if(e[0]<2&&e[1]<9||1==e[0]&&9==e[1]&&e[2]<1||e[0]>2)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 3")}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var i=t(this),n=i.data("bs.alert");n||i.data("bs.alert",n=new o(this)),"string"==typeof e&&n[e].call(i)})}var i='[data-dismiss="alert"]',o=function(e){t(e).on("click",i,this.close)};o.VERSION="3.3.6",o.TRANSITION_DURATION=150,o.prototype.close=function(e){function i(){a.detach().trigger("closed.bs.alert").remove()}var n=t(this),s=n.attr("data-target");s||(s=n.attr("href"),s=s&&s.replace(/.*(?=#[^\s]*$)/,""));var a=t(s);e&&e.preventDefault(),a.length||(a=n.closest(".alert")),a.trigger(e=t.Event("close.bs.alert")),e.isDefaultPrevented()||(a.removeClass("in"),t.support.transition&&a.hasClass("fade")?a.one("bsTransitionEnd",i).emulateTransitionEnd(o.TRANSITION_DURATION):i())};var n=t.fn.alert;t.fn.alert=e,t.fn.alert.Constructor=o,t.fn.alert.noConflict=function(){return t.fn.alert=n,this},t(document).on("click.bs.alert.data-api",i,o.prototype.close)}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var o=t(this),n=o.data("bs.button"),s="object"==typeof e&&e;n||o.data("bs.button",n=new i(this,s)),"toggle"==e?n.toggle():e&&n.setState(e)})}var i=function(e,o){this.$element=t(e),this.options=t.extend({},i.DEFAULTS,o),this.isLoading=!1};i.VERSION="3.3.6",i.DEFAULTS={loadingText:"loading..."},i.prototype.setState=function(e){var i="disabled",o=this.$element,n=o.is("input")?"val":"html",s=o.data();e+="Text",null==s.resetText&&o.data("resetText",o[n]()),setTimeout(t.proxy(function(){o[n](null==s[e]?this.options[e]:s[e]),"loadingText"==e?(this.isLoading=!0,o.addClass(i).attr(i,i)):this.isLoading&&(this.isLoading=!1,o.removeClass(i).removeAttr(i))},this),0)},i.prototype.toggle=function(){var t=!0,e=this.$element.closest('[data-toggle="buttons"]');if(e.length){var i=this.$element.find("input");"radio"==i.prop("type")?(i.prop("checked")&&(t=!1),e.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==i.prop("type")&&(i.prop("checked")!==this.$element.hasClass("active")&&(t=!1),this.$element.toggleClass("active")),i.prop("checked",this.$element.hasClass("active")),t&&i.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var o=t.fn.button;t.fn.button=e,t.fn.button.Constructor=i,t.fn.button.noConflict=function(){return t.fn.button=o,this},t(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(i){var o=t(i.target);o.hasClass("btn")||(o=o.closest(".btn")),e.call(o,"toggle"),t(i.target).is('input[type="radio"]')||t(i.target).is('input[type="checkbox"]')||i.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(e){t(e.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(e.type))})}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var o=t(this),n=o.data("bs.carousel"),s=t.extend({},i.DEFAULTS,o.data(),"object"==typeof e&&e),a="string"==typeof e?e:s.slide;n||o.data("bs.carousel",n=new i(this,s)),"number"==typeof e?n.to(e):a?n[a]():s.interval&&n.pause().cycle()})}var i=function(e,i){this.$element=t(e),this.$indicators=this.$element.find(".carousel-indicators"),this.options=i,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",t.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",t.proxy(this.pause,this)).on("mouseleave.bs.carousel",t.proxy(this.cycle,this))};i.VERSION="3.3.6",i.TRANSITION_DURATION=600,i.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},i.prototype.keydown=function(t){if(!/input|textarea/i.test(t.target.tagName)){switch(t.which){case 37:this.prev();break;case 39:this.next();break;default:return}t.preventDefault()}},i.prototype.cycle=function(e){return e||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(t.proxy(this.next,this),this.options.interval)),this},i.prototype.getItemIndex=function(t){return this.$items=t.parent().children(".item"),this.$items.index(t||this.$active)},i.prototype.getItemForDirection=function(t,e){var i=this.getItemIndex(e),o="prev"==t&&0===i||"next"==t&&i==this.$items.length-1;if(o&&!this.options.wrap)return e;var n="prev"==t?-1:1,s=(i+n)%this.$items.length;return this.$items.eq(s)},i.prototype.to=function(t){var e=this,i=this.getItemIndex(this.$active=this.$element.find(".item.active"));return t>this.$items.length-1||0>t?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){e.to(t)}):i==t?this.pause().cycle():this.slide(t>i?"next":"prev",this.$items.eq(t))},i.prototype.pause=function(e){return e||(this.paused=!0),this.$element.find(".next, .prev").length&&t.support.transition&&(this.$element.trigger(t.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},i.prototype.next=function(){return this.sliding?void 0:this.slide("next")},i.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},i.prototype.slide=function(e,o){var n=this.$element.find(".item.active"),s=o||this.getItemForDirection(e,n),a=this.interval,r="next"==e?"left":"right",l=this;if(s.hasClass("active"))return this.sliding=!1;var h=s[0],d=t.Event("slide.bs.carousel",{relatedTarget:h,direction:r});if(this.$element.trigger(d),!d.isDefaultPrevented()){if(this.sliding=!0,a&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var p=t(this.$indicators.children()[this.getItemIndex(s)]);p&&p.addClass("active")}var c=t.Event("slid.bs.carousel",{relatedTarget:h,direction:r});return t.support.transition&&this.$element.hasClass("slide")?(s.addClass(e),s[0].offsetWidth,n.addClass(r),s.addClass(r),n.one("bsTransitionEnd",function(){s.removeClass([e,r].join(" ")).addClass("active"),n.removeClass(["active",r].join(" ")),l.sliding=!1,setTimeout(function(){l.$element.trigger(c)},0)}).emulateTransitionEnd(i.TRANSITION_DURATION)):(n.removeClass("active"),s.addClass("active"),this.sliding=!1,this.$element.trigger(c)),a&&this.cycle(),this}};var o=t.fn.carousel;t.fn.carousel=e,t.fn.carousel.Constructor=i,t.fn.carousel.noConflict=function(){return t.fn.carousel=o,this};var n=function(i){var o,n=t(this),s=t(n.attr("data-target")||(o=n.attr("href"))&&o.replace(/.*(?=#[^\s]+$)/,""));if(s.hasClass("carousel")){var a=t.extend({},s.data(),n.data()),r=n.attr("data-slide-to");r&&(a.interval=!1),e.call(s,a),r&&s.data("bs.carousel").to(r),i.preventDefault()}};t(document).on("click.bs.carousel.data-api","[data-slide]",n).on("click.bs.carousel.data-api","[data-slide-to]",n),t(window).on("load",function(){t('[data-ride="carousel"]').each(function(){var i=t(this);e.call(i,i.data())})})}(jQuery),+function(t){"use strict";function e(e){var i=e.attr("data-target");i||(i=e.attr("href"),i=i&&/#[A-Za-z]/.test(i)&&i.replace(/.*(?=#[^\s]*$)/,""));var o=i&&t(i);return o&&o.length?o:e.parent()}function i(i){i&&3===i.which||(t(n).remove(),t(s).each(function(){var o=t(this),n=e(o),s={relatedTarget:this};n.hasClass("open")&&(i&&"click"==i.type&&/input|textarea/i.test(i.target.tagName)&&t.contains(n[0],i.target)||(n.trigger(i=t.Event("hide.bs.dropdown",s)),i.isDefaultPrevented()||(o.attr("aria-expanded","false"),n.removeClass("open").trigger(t.Event("hidden.bs.dropdown",s)))))}))}function o(e){return this.each(function(){var i=t(this),o=i.data("bs.dropdown");o||i.data("bs.dropdown",o=new a(this)),"string"==typeof e&&o[e].call(i)})}var n=".dropdown-backdrop",s='[data-toggle="dropdown"]',a=function(e){t(e).on("click.bs.dropdown",this.toggle)};a.VERSION="3.3.6",a.prototype.toggle=function(o){var n=t(this);if(!n.is(".disabled, :disabled")){var s=e(n),a=s.hasClass("open");if(i(),!a){"ontouchstart"in document.documentElement&&!s.closest(".navbar-nav").length&&t(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(t(this)).on("click",i);var r={relatedTarget:this};if(s.trigger(o=t.Event("show.bs.dropdown",r)),o.isDefaultPrevented())return;n.trigger("focus").attr("aria-expanded","true"),s.toggleClass("open").trigger(t.Event("shown.bs.dropdown",r))}return!1}},a.prototype.keydown=function(i){if(/(38|40|27|32)/.test(i.which)&&!/input|textarea/i.test(i.target.tagName)){var o=t(this);if(i.preventDefault(),i.stopPropagation(),!o.is(".disabled, :disabled")){var n=e(o),a=n.hasClass("open");if(!a&&27!=i.which||a&&27==i.which)return 27==i.which&&n.find(s).trigger("focus"),o.trigger("click");var r=" li:not(.disabled):visible a",l=n.find(".dropdown-menu"+r);if(l.length){var h=l.index(i.target);38==i.which&&h>0&&h--,40==i.which&&hdocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&t?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!t?this.scrollbarWidth:""})},i.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},i.prototype.checkScrollbar=function(){var t=window.innerWidth;if(!t){var e=document.documentElement.getBoundingClientRect();t=e.right-Math.abs(e.left)}this.bodyIsOverflowing=document.body.clientWidth
      ',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},i.prototype.init=function(e,i,o){if(this.enabled=!0,this.type=e,this.$element=t(i),this.options=this.getOptions(o),this.$viewport=this.options.viewport&&t(t.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var n=this.options.trigger.split(" "),s=n.length;s--;){var a=n[s];if("click"==a)this.$element.on("click."+this.type,this.options.selector,t.proxy(this.toggle,this));else if("manual"!=a){var r="hover"==a?"mouseenter":"focusin",l="hover"==a?"mouseleave":"focusout";this.$element.on(r+"."+this.type,this.options.selector,t.proxy(this.enter,this)),this.$element.on(l+"."+this.type,this.options.selector,t.proxy(this.leave,this))}}this.options.selector?this._options=t.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},i.prototype.getDefaults=function(){return i.DEFAULTS},i.prototype.getOptions=function(e){return e=t.extend({},this.getDefaults(),this.$element.data(),e),e.delay&&"number"==typeof e.delay&&(e.delay={show:e.delay,hide:e.delay}),e},i.prototype.getDelegateOptions=function(){var e={},i=this.getDefaults();return this._options&&t.each(this._options,function(t,o){i[t]!=o&&(e[t]=o)}),e},i.prototype.enter=function(e){var i=e instanceof this.constructor?e:t(e.currentTarget).data("bs."+this.type);return i||(i=new this.constructor(e.currentTarget,this.getDelegateOptions()),t(e.currentTarget).data("bs."+this.type,i)),e instanceof t.Event&&(i.inState["focusin"==e.type?"focus":"hover"]=!0),i.tip().hasClass("in")||"in"==i.hoverState?void(i.hoverState="in"):(clearTimeout(i.timeout),i.hoverState="in",i.options.delay&&i.options.delay.show?void(i.timeout=setTimeout(function(){"in"==i.hoverState&&i.show()},i.options.delay.show)):i.show())},i.prototype.isInStateTrue=function(){for(var t in this.inState)if(this.inState[t])return!0;return!1},i.prototype.leave=function(e){var i=e instanceof this.constructor?e:t(e.currentTarget).data("bs."+this.type);return i||(i=new this.constructor(e.currentTarget,this.getDelegateOptions()),t(e.currentTarget).data("bs."+this.type,i)),e instanceof t.Event&&(i.inState["focusout"==e.type?"focus":"hover"]=!1),i.isInStateTrue()?void 0:(clearTimeout(i.timeout),i.hoverState="out",i.options.delay&&i.options.delay.hide?void(i.timeout=setTimeout(function(){"out"==i.hoverState&&i.hide()},i.options.delay.hide)):i.hide())},i.prototype.show=function(){var e=t.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(e);var o=t.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(e.isDefaultPrevented()||!o)return;var n=this,s=this.tip(),a=this.getUID(this.type);this.setContent(),s.attr("id",a),this.$element.attr("aria-describedby",a),this.options.animation&&s.addClass("fade");var r="function"==typeof this.options.placement?this.options.placement.call(this,s[0],this.$element[0]):this.options.placement,l=/\s?auto?\s?/i,h=l.test(r);h&&(r=r.replace(l,"")||"top"),s.detach().css({top:0,left:0,display:"block"}).addClass(r).data("bs."+this.type,this),this.options.container?s.appendTo(this.options.container):s.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var d=this.getPosition(),p=s[0].offsetWidth,c=s[0].offsetHeight;if(h){var f=r,u=this.getPosition(this.$viewport);r="bottom"==r&&d.bottom+c>u.bottom?"top":"top"==r&&d.top-cu.width?"left":"left"==r&&d.left-pa.top+a.height&&(n.top=a.top+a.height-l)}else{var h=e.left-s,d=e.left+s+i;ha.right&&(n.left=a.left+a.width-d)}return n},i.prototype.getTitle=function(){var t,e=this.$element,i=this.options;return t=e.attr("data-original-title")||("function"==typeof i.title?i.title.call(e[0]):i.title)},i.prototype.getUID=function(t){do t+=~~(1e6*Math.random());while(document.getElementById(t));return t},i.prototype.tip=function(){if(!this.$tip&&(this.$tip=t(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},i.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},i.prototype.enable=function(){this.enabled=!0},i.prototype.disable=function(){this.enabled=!1},i.prototype.toggleEnabled=function(){this.enabled=!this.enabled},i.prototype.toggle=function(e){var i=this;e&&(i=t(e.currentTarget).data("bs."+this.type),i||(i=new this.constructor(e.currentTarget,this.getDelegateOptions()),t(e.currentTarget).data("bs."+this.type,i))),e?(i.inState.click=!i.inState.click,i.isInStateTrue()?i.enter(i):i.leave(i)):i.tip().hasClass("in")?i.leave(i):i.enter(i)},i.prototype.destroy=function(){var t=this;clearTimeout(this.timeout),this.hide(function(){t.$element.off("."+t.type).removeData("bs."+t.type),t.$tip&&t.$tip.detach(),t.$tip=null,t.$arrow=null,t.$viewport=null})};var o=t.fn.tooltip;t.fn.tooltip=e,t.fn.tooltip.Constructor=i,t.fn.tooltip.noConflict=function(){return t.fn.tooltip=o,this}}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var o=t(this),n=o.data("bs.popover"),s="object"==typeof e&&e;(n||!/destroy|hide/.test(e))&&(n||o.data("bs.popover",n=new i(this,s)),"string"==typeof e&&n[e]())})}var i=function(t,e){this.init("popover",t,e)};if(!t.fn.tooltip)throw new Error("Popover requires tooltip.js");i.VERSION="3.3.6",i.DEFAULTS=t.extend({},t.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),i.prototype=t.extend({},t.fn.tooltip.Constructor.prototype),i.prototype.constructor=i,i.prototype.getDefaults=function(){return i.DEFAULTS},i.prototype.setContent=function(){var t=this.tip(),e=this.getTitle(),i=this.getContent();t.find(".popover-title")[this.options.html?"html":"text"](e),t.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof i?"html":"append":"text"](i),t.removeClass("fade top bottom left right in"),t.find(".popover-title").html()||t.find(".popover-title").hide()},i.prototype.hasContent=function(){return this.getTitle()||this.getContent()},i.prototype.getContent=function(){var t=this.$element,e=this.options;return t.attr("data-content")||("function"==typeof e.content?e.content.call(t[0]):e.content)},i.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var o=t.fn.popover;t.fn.popover=e,t.fn.popover.Constructor=i,t.fn.popover.noConflict=function(){return t.fn.popover=o,this}}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var o=t(this),n=o.data("bs.tab");n||o.data("bs.tab",n=new i(this)),"string"==typeof e&&n[e]()})}var i=function(e){this.element=t(e)};i.VERSION="3.3.6",i.TRANSITION_DURATION=150,i.prototype.show=function(){var e=this.element,i=e.closest("ul:not(.dropdown-menu)"),o=e.data("target");if(o||(o=e.attr("href"),o=o&&o.replace(/.*(?=#[^\s]*$)/,"")),!e.parent("li").hasClass("active")){var n=i.find(".active:last a"),s=t.Event("hide.bs.tab",{relatedTarget:e[0]}),a=t.Event("show.bs.tab",{relatedTarget:n[0]});if(n.trigger(s),e.trigger(a),!a.isDefaultPrevented()&&!s.isDefaultPrevented()){var r=t(o);this.activate(e.closest("li"),i),this.activate(r,r.parent(),function(){n.trigger({type:"hidden.bs.tab",relatedTarget:e[0]}),e.trigger({type:"shown.bs.tab",relatedTarget:n[0]})})}}},i.prototype.activate=function(e,o,n){function s(){a.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),e.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),r?(e[0].offsetWidth,e.addClass("in")):e.removeClass("fade"),e.parent(".dropdown-menu").length&&e.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),n&&n()}var a=o.find("> .active"),r=n&&t.support.transition&&(a.length&&a.hasClass("fade")||!!o.find("> .fade").length);a.length&&r?a.one("bsTransitionEnd",s).emulateTransitionEnd(i.TRANSITION_DURATION):s(),a.removeClass("in")};var o=t.fn.tab;t.fn.tab=e,t.fn.tab.Constructor=i,t.fn.tab.noConflict=function(){return t.fn.tab=o,this};var n=function(i){i.preventDefault(),e.call(t(this),"show")};t(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',n).on("click.bs.tab.data-api",'[data-toggle="pill"]',n)}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var o=t(this),n=o.data("bs.affix"),s="object"==typeof e&&e;n||o.data("bs.affix",n=new i(this,s)),"string"==typeof e&&n[e]()})}var i=function(e,o){this.options=t.extend({},i.DEFAULTS,o),this.$target=t(this.options.target).on("scroll.bs.affix.data-api",t.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",t.proxy(this.checkPositionWithEventLoop,this)),this.$element=t(e),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};i.VERSION="3.3.6",i.RESET="affix affix-top affix-bottom",i.DEFAULTS={offset:0,target:window},i.prototype.getState=function(t,e,i,o){var n=this.$target.scrollTop(),s=this.$element.offset(),a=this.$target.height();if(null!=i&&"top"==this.affixed)return i>n?"top":!1;if("bottom"==this.affixed)return null!=i?n+this.unpin<=s.top?!1:"bottom":t-o>=n+a?!1:"bottom";var r=null==this.affixed,l=r?n:s.top,h=r?a:e;return null!=i&&i>=n?"top":null!=o&&l+h>=t-o?"bottom":!1},i.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(i.RESET).addClass("affix");var t=this.$target.scrollTop(),e=this.$element.offset();return this.pinnedOffset=e.top-t},i.prototype.checkPositionWithEventLoop=function(){setTimeout(t.proxy(this.checkPosition,this),1)},i.prototype.checkPosition=function(){if(this.$element.is(":visible")){var e=this.$element.height(),o=this.options.offset,n=o.top,s=o.bottom,a=Math.max(t(document).height(),t(document.body).height());"object"!=typeof o&&(s=n=o),"function"==typeof n&&(n=o.top(this.$element)),"function"==typeof s&&(s=o.bottom(this.$element));var r=this.getState(a,e,n,s);if(this.affixed!=r){null!=this.unpin&&this.$element.css("top","");var l="affix"+(r?"-"+r:""),h=t.Event(l+".bs.affix");if(this.$element.trigger(h),h.isDefaultPrevented())return;this.affixed=r,this.unpin="bottom"==r?this.getPinnedOffset():null,this.$element.removeClass(i.RESET).addClass(l).trigger(l.replace("affix","affixed")+".bs.affix")}"bottom"==r&&this.$element.offset({top:a-e-s})}};var o=t.fn.affix;t.fn.affix=e,t.fn.affix.Constructor=i,t.fn.affix.noConflict=function(){return t.fn.affix=o,this},t(window).on("load",function(){t('[data-spy="affix"]').each(function(){var i=t(this),o=i.data();o.offset=o.offset||{},null!=o.offsetBottom&&(o.offset.bottom=o.offsetBottom),null!=o.offsetTop&&(o.offset.top=o.offsetTop),e.call(i,o)})})}(jQuery),+function(t){"use strict";function e(e){var i,o=e.attr("data-target")||(i=e.attr("href"))&&i.replace(/.*(?=#[^\s]+$)/,"");return t(o)}function i(e){return this.each(function(){var i=t(this),n=i.data("bs.collapse"),s=t.extend({},o.DEFAULTS,i.data(),"object"==typeof e&&e);!n&&s.toggle&&/show|hide/.test(e)&&(s.toggle=!1),n||i.data("bs.collapse",n=new o(this,s)),"string"==typeof e&&n[e]()})}var o=function(e,i){this.$element=t(e),this.options=t.extend({},o.DEFAULTS,i),this.$trigger=t('[data-toggle="collapse"][href="#'+e.id+'"],[data-toggle="collapse"][data-target="#'+e.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};o.VERSION="3.3.6",o.TRANSITION_DURATION=350,o.DEFAULTS={toggle:!0},o.prototype.dimension=function(){var t=this.$element.hasClass("width");return t?"width":"height"},o.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var e,n=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(n&&n.length&&(e=n.data("bs.collapse"),e&&e.transitioning))){var s=t.Event("show.bs.collapse");if(this.$element.trigger(s),!s.isDefaultPrevented()){n&&n.length&&(i.call(n,"hide"),e||n.data("bs.collapse",null));var a=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[a](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var r=function(){this.$element.removeClass("collapsing").addClass("collapse in")[a](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!t.support.transition)return r.call(this);var l=t.camelCase(["scroll",a].join("-"));this.$element.one("bsTransitionEnd",t.proxy(r,this)).emulateTransitionEnd(o.TRANSITION_DURATION)[a](this.$element[0][l]); +}}}},o.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var e=t.Event("hide.bs.collapse");if(this.$element.trigger(e),!e.isDefaultPrevented()){var i=this.dimension();this.$element[i](this.$element[i]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var n=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return t.support.transition?void this.$element[i](0).one("bsTransitionEnd",t.proxy(n,this)).emulateTransitionEnd(o.TRANSITION_DURATION):n.call(this)}}},o.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},o.prototype.getParent=function(){return t(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(t.proxy(function(i,o){var n=t(o);this.addAriaAndCollapsedClass(e(n),n)},this)).end()},o.prototype.addAriaAndCollapsedClass=function(t,e){var i=t.hasClass("in");t.attr("aria-expanded",i),e.toggleClass("collapsed",!i).attr("aria-expanded",i)};var n=t.fn.collapse;t.fn.collapse=i,t.fn.collapse.Constructor=o,t.fn.collapse.noConflict=function(){return t.fn.collapse=n,this},t(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(o){var n=t(this);n.attr("data-target")||o.preventDefault();var s=e(n),a=s.data("bs.collapse"),r=a?"toggle":n.data();i.call(s,r)})}(jQuery),+function(t){"use strict";function e(i,o){this.$body=t(document.body),this.$scrollElement=t(t(i).is(document.body)?window:i),this.options=t.extend({},e.DEFAULTS,o),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",t.proxy(this.process,this)),this.refresh(),this.process()}function i(i){return this.each(function(){var o=t(this),n=o.data("bs.scrollspy"),s="object"==typeof i&&i;n||o.data("bs.scrollspy",n=new e(this,s)),"string"==typeof i&&n[i]()})}e.VERSION="3.3.6",e.DEFAULTS={offset:10},e.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},e.prototype.refresh=function(){var e=this,i="offset",o=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),t.isWindow(this.$scrollElement[0])||(i="position",o=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var e=t(this),n=e.data("target")||e.attr("href"),s=/^#./.test(n)&&t(n);return s&&s.length&&s.is(":visible")&&[[s[i]().top+o,n]]||null}).sort(function(t,e){return t[0]-e[0]}).each(function(){e.offsets.push(this[0]),e.targets.push(this[1])})},e.prototype.process=function(){var t,e=this.$scrollElement.scrollTop()+this.options.offset,i=this.getScrollHeight(),o=this.options.offset+i-this.$scrollElement.height(),n=this.offsets,s=this.targets,a=this.activeTarget;if(this.scrollHeight!=i&&this.refresh(),e>=o)return a!=(t=s[s.length-1])&&this.activate(t);if(a&&e=n[t]&&(void 0===n[t+1]||e today) { + $('#childs_entrydate').val(dtminentrydate.toLocaleFormat("%d.%m.%Y")); + }else { + $('#childs_entrydate').val(today.toLocaleFormat("%d.%m.%Y")); + } + + } + var dtmaxleavedate = new Date(dtbday.getFullYear(),dtbday.getMonth() + parseInt(minamonths.sqldata[0].maxage), dtbday.getDate()); + if (cleavedate > dtmaxleavedate.toLocaleFormat("%Y-%m-%d") || (centrydate==cleavedate)) { + + $('#childs_leavedate').val(dtmaxleavedate.toLocaleFormat("%d.%m.%Y")); + } + centrydate = encodeparam($('#childs_entrydate').val(),'date').replace(/'/g,''); + cleavedate = encodeparam($('#childs_leavedate').val(),'date').replace(/'/g,''); + appdb.dbexec("update childs set birthday=date('"+bday+"'),entrydate=date('"+centrydate+"'),leavedate=date('"+cleavedate+"') where uuid='"+pconfig.uuid+"';"); + //appdb.dbexec("update childs set birthday=date('"+$('#childs_birthday').val()+"'),entrydate=date('"+$('#childs_entrydate').val()+"'),leavedate=date('"+$('#childs_leavedate').val()+"') where childuuid='"+pconfig.uuid+"';"); + //dlg_planning({'uuid':''},'insproposal'); +} + +$('a[data-toggle="tab"]').on('shown.bs.tab', function (e) { + var tn = e.target.toString(); + //dump(tn + "\n"); + pconfig.activetab = tn.substring(tn.lastIndexOf("#")+1); + //dump(pconfig.activetab + "\n"); + apppref.setpreference("pageconfig.child",pconfig); + + if (pconfig.activetab == 'planning') { + load_table_presence(); + } + if (pconfig.activetab == 'parents') { + load_table_refperson(); + } + if (pconfig.activetab == 'myfiles') { + load_table_files(); + } + if (pconfig.activetab == 'caution') { + load_table_caution(); + } + }); + +function load_table_presence() { + var plandatasql = "SELECT ' ' AS action, grp.grpname, strftime('%d.%m.%Y',plan.datebegin) || ' - ' || strftime('%d.%m.%Y',plan.dateend) AS planningdaterange,"; + var wda = ['mon','tue','wed','thu','fri']; + var awda = []; + for (var w in wda){ + awda.push("CASE WHEN plan."+wda[w]+"timebegin != plan."+wda[w]+"timeend THEN plan."+wda[w]+"timebegin || ' - ' || plan."+wda[w]+"timeend ELSE '' END || CASE WHEN plan."+wda[w]+"lunch='1' THEN ' ()' ELSE '' END || case when plan."+wda[w]+"timebegin2 is not null and plan."+wda[w]+"timeend2 is not null then '
      ' || plan."+wda[w]+"timebegin2 || ' - ' || plan."+wda[w]+"timeend2 else '' end AS "+wda[w]+"planningtime"); + } + plandatasql += awda.join(',') + " FROM planning plan LEFT JOIN groups grp ON ( plan.groupuuid=grp.uuid) WHERE plan.childuuid='" + pconfig.uuid + "' ORDER BY plan.datebegin, plan.dateend;"; + var plandata = appdb.dbqueryarray(plandatasql); + + var headerdata = getlabels(plandata.sqlhead.join(",")); + $("#tbl_planning").html(""); + var tblplan = $("#tbl_planning").dataTable({ + "language": { + "url": "js/locale/datatable_fr.json" + }, + "data": plandata.sqldata, + "columns": headerdata, + "paging": false, + "ordering": true, + "scrollY": wh + "px", + "scrollCollapse": true, + "info": false, + "filter": false, + "destroy": true + }); + +} + +function load_table_refperson() { + var labelx = getlabelswithkey('mother,father,tuteur,famillymember,famillyfriend'); + var areftypes = new Array(); + for (var l in labelx){ + areftypes.push("select '"+ labelx[l].title +"' as refname, '"+labelx[l].keyname+"' as reftype"); + } + var lblsql = areftypes.join(" UNION "); + var refperssql = "SELECT ' ' as action, rp.priority,rx.refname as reftype, coalesce(rp.surname,'') || ' ' || coalesce(rp.prename,'') as nameprename, case when rp.phone is not null then ': ' || rp.phone || '
      ' else '' end || case when rp.mobile is not null then': ' || rp.mobile || '
      ' else '' end || case when rp.workphone is not null then ': ' || rp.workphone || '
      ' else '' end || case when rp.email is not null then ': ' || email else '' end as phonemail, coalesce(rp.address,'') || '
      ' || coalesce(rp.zip,'') || ' ' || coalesce(rp.city,'') || '
      ' || coalesce(rp.country,'') as address, case when rp.authsubscriber then 'signataire:
      ' else '' end || coalesce(rp.job || '
      ','') || coalesce(rp.remark || '
      ','') as divers FROM refpersons rp join ("+ lblsql+") rx on (rp.reftype=rx.reftype) where rp.childuuid='" + pconfig.uuid + "';"; + var refpersondata = appdb.dbqueryarray(refperssql); + + var headerdata = getlabels(refpersondata.sqlhead.join(",")); + $("#tbl_refperson").html(""); + $("#tbl_refperson").dataTable({ + "language": { + "url": "js/locale/datatable_fr.json" + }, + "data": refpersondata.sqldata, + "columns": headerdata, + "paging": false, + "scrollY": wh + "px", + "scrollCollapse": true, + "ordering": true, + "info": false, + "filter": false, + "destroy": true + }); +} + +function load_table_caution(){ + $("#tbl_cautionstatus").html(""); + var cautionsql = "select ' ' as action, '' || statusdate || '' || strftime('%d.%m.%Y',statusdate) as daydate, amount || ' €' as amount,statementnumber from cautionstatus where childuuid='"+ pconfig.uuid+"' order by statusdate DESC;"; + var caudata = appdb.dbqueryarray(cautionsql); + var headerdata = getlabels("action,daydate,amount,statementnumber"); + $("#tbl_cautionstatus").dataTable({ + "language": { + "url": "js/locale/datatable_fr.json" + }, + "data": caudata.sqldata, + "columns": headerdata, + "paging": false, + "scrollY": wh + "px", + "scrollCollapse": true, + "ordering": true, + "info": false, + "filter": false, + "destroy": true + }); +} + +function load_table_files(){ + $("#tbl_files").html(""); + var headerdata = getlabels("action,filename,description,daydate,filetype"); + $("#tbl_files").dataTable({ + "language": { + "url": "js/locale/datatable_fr.json" + }, + //"data": refpersondata.sqldata, + "columns": headerdata, + "paging": false, + "scrollY": wh + "px", + "scrollCollapse": true, + "ordering": true, + "info": false, + "filter": false, + "destroy": true + }); +} + +function dlg_cautionstatus(objuuid,type){ + //TODO: dlg_addcautionstatus + //dump("Caution: " + type +" " + objuuid.uuid + +"\n"); + if (type == 'upd' || type == 'ins') { + var caustatdata = appdb.dbquery("select '0' as uuid,strftime('%d.%m.%Y',date('now')) as statusdate,0 as amount,null as statementnumber"); + if (type == 'upd') { + caustatdata = appdb.dbquery("SELECT uuid, strftime('%d.%m.%Y',statusdate) as statusdate, amount, statementnumber FROM cautionstatus where uuid='" + objuuid.uuid + "';"); + } + $("#frmeditcautionstatus #uuid").val(objuuid.uuid); + caustatdata = caustatdata.sqldata[0]; + //setrefpersontypes(); + + for (var r in caustatdata) { + if (document.getElementById(r)) { + + document.getElementById(r).value = caustatdata[r]; + + } + } + $("#edit_cautionstatus").modal('show'); + } else if (type == 'del') { + delcautionstatus= objuuid.uuid; + confirm_delete_cautionstatus(); + } +} + +function dlg_refperson(uuid, type) { + if (type == 'upd' || type == 'ins') { + var refpdata = appdb.dbquery("SELECT null as reftype, null as surname, null as prename, address, null as phone, null as mobile, null as job, null as email, null as workphone, zip, country, city, '0' as authsubscriber, null as uuid,lastmodified FROM childs where uuid='" + pconfig.uuid +"' union SELECT null as reftype, surname, null as prename, address, null as phone, null as mobile, null as job, null as email, null as workphone, zip, country, city, '0' as authsubscriber, null as uuid,lastmodified FROM refpersons where childuuid='"+pconfig.uuid +"' order by lastmodified DESC "); + if (type == 'upd') { + refpdata = appdb.dbquery("SELECT reftype, surname, prename, address, phone, mobile, job, email, workphone, zip, country, city, authsubscriber, uuid FROM refpersons where uuid='" + uuid.uuid + "';"); + } + $("#frmeditrefperson #uuid").val(uuid.uuid); + refpdata = refpdata.sqldata[0]; + setrefpersontypes(); + + for (var r in refpdata) { + if (document.getElementById(r)) { + if ($("#" + r).is(':checkbox')) { + if (refpdata[r] == '1') { + $("#" + r).prop("checked", true); + } else { + $("#" + r).prop("checked", false); + } + } else { + document.getElementById(r).value = refpdata[r]; + } + } + } + $("#edit_refperson").modal('show'); + } else if (type == 'del') { + delrefperson = uuid.uuid; + confirm_delete_refperson(); + } +} + +function setplanning_groups() { + var plangrps = appdb.dbquery("select uuid,grpname from groups order by minage,maxage;"); + plangrps = plangrps.sqldata; + $("#groupuuid").html(''); + $("#groupuuid").append(''); + for (var g in plangrps) { + $("#groupuuid").append(''); + } +} + +function setrefpersontypes() { +var labelx = getlabelswithkey('mother,father,tuteur,famillymember,famillyfriend'); + var areftypes = new Array(); + $("#reftype").html(''); + for (var l in labelx){ + $("#reftype").append(''); + } +} + +function dlg_planning(uuid, type, planuuid) { + //"dlg_planning" + uuid + " " + type + " " + planuuid + "\n"); + if (type == 'upd') { + check_birthdate_valid(); + setplanning_groups(); + var plandata = appdb.dbquery("SELECT strftime('%d.%m.%Y',datebegin) as datebegin, strftime('%d.%m.%Y',dateend) as dateend, montimebegin, montimeend, monlunch, tuetimebegin, tuetimeend, tuelunch, wedtimebegin, wedtimeend, wedlunch, thutimebegin, thutimeend, thulunch, fritimebegin, fritimeend, frilunch, sattimebegin, sattimeend, satlunch, suntimebegin, suntimeend, sunlunch, childuuid, uuid, groupuuid, montimebegin2, montimeend2, tuetimebegin2, tuetimeend2, wedtimebegin2, wedtimeend2, thutimebegin2, thutimeend2, fritimebegin2, fritimeend2, sattimebegin2, sattimeend2, suntimebegin2, suntimeend2 FROM planning where uuid='" + uuid.uuid + "';"); + plandata = plandata.sqldata[0]; + + for (var p in plandata) { + if (document.getElementById(p)) { + if ($("#" + p).is(':checkbox')) { + if (plandata[p] == '1') { + $("#" + p).prop("checked", true); + } else { + $("#" + p).prop("checked", false); + } + } else { + if ((p.substr(p.length-1) == "2") && (p.indexOf("time") != -1) && (plandata[p] != "")){ + $('#' + p.substr(0,3) + "time" + p.substr(p.length-1)).show(); + } + if ((p.indexOf("time") != -1) && (plandata[p] == "")) { + document.getElementById(p).value = "00:00"; + } else { + document.getElementById(p).value = plandata[p]; + } + } + } + } + $("#edit_planning").modal('show'); + } + else if (type == 'del') { + delplan = uuid.uuid; + //"Launch confirm delete\n"); + confirm_delete_planning(); + + } + else if (type == 'delall') { + //delplan = pconfig.uuid; + //"Launch confirm all delete\n"); + confirm_delete_allplanning(); + + } + else if (type == 'ins') { + $("#frmeditplanning #uuid").val("0"); + check_birthdate_valid(); + setplanning_groups(); + var timesql = "SELECT strftime('%d.%m.%Y',date('now')) as datebegin,strftime('%d.%m.%Y',date('now','+6 month')) as dateend ,montimeopen as montimebegin, montimeclose as montimeend, tuetimeopen as tuetimebegin, tuetimeclose as tuetimeend, wedtimeopen as wedtimebegin, wedtimeclose as wedtimeend, thutimeopen as thutimebegin, thutimeclose as thutimeend, fritimeopen as fritimebegin, fritimeclose as fritimeend FROM workinghours where datestart <= date('now') order by datestart DESC LIMIT 1;"; + if (planuuid){ + timesql = "SELECT strftime('%d.%m.%Y',date('now')) as datebegin,strftime('%d.%m.%Y',date('now','+6 month')) as dateend ,montimebegin, montimeend, tuetimebegin, tuetimeend, wedtimebegin, wedtimeend, thutimebegin, thutimeend, fritimebegin, fritimeend, montimebegin2,montimeend2,tuetimebegin2, tuetimeend2, wedtimebegin2, wedtimeend2, thutimebegin2, thutimeend2, fritimebegin2, fritimeend2 FROM planningtemplate where uuid='"+planuuid+"';"; + } + + var timeplan = appdb.dbquery(timesql); + + timeplan = timeplan.sqldata[0]; + $("#frmeditplanning #datebegin").val(timeplan.datebegin); + $("#frmeditplanning #dateend").val(timeplan.dateend); + for (var t in timeplan) { + if ((t.indexOf("time") != -1)) { + var tx = timeplan[t]; + if (tx == "") { + tx = "00:00"; + } + + $("#" + t).val(tx); + } + } + $("#frmeditplanning :input").each(function() { + var input = $(this); + if (input.attr("type") == "checkbox") { + input.prop('checked', true); + } + + }); + + $("#edit_planning").modal('show'); + } + else if (type == 'insproposal') { + check_birthdate_valid(); + setplanning_groups(); + var curplan = appdb.dbquery("select count(*) as cnt,date(max(dateend),'+1 day') as maxdateto,(select birthday from childs where childs.uuid='" + pconfig.uuid + "') as birthday,(select entrydate from childs where childs.uuid='" + pconfig.uuid+"') as entrydate,(select leavedate from childs where childs.uuid='" + pconfig.uuid+"') as leavedate,date('now') as today from planning pl join childs ch on (ch.uuid=pl.childuuid) where pl.childuuid='" + pconfig.uuid + "'"); + curplan = curplan.sqldata[0]; + //dump("INSPROPOSAL:" + JSON.stringify(curplan) + "\n"); + var plansql = ""; + + if ((curplan.cnt == 0) || ( planuuid)){ + //dump(curplan.today +"<-->" + curplan.birthday + "<-->" + curplan.entrydate + "\n") ; + + if (curplan.cnt > 0){ + curplan.entrydate=curplan.maxdateto; + } + //if (curplan.today < curplan.entrydate) { + + // plansql = "select date('"+ curplan.entrydate+"') as datebegin,date(birthday,'+' || maxage || ' months','-1 day') as dateend, pl.uuid as groupuuid, montimeopen as montimebegin,montimeclose as montimeend,tuetimeopen as tuetimebegin,tuetimeclose as tuetimeend,wedtimeopen as wedtimebegin,wedtimeclose as wedtimeend,thutimeopen as thutimebegin,thutimeclose as thutimeend,fritimeopen as fritimebegin,fritimeclose as fritimeend,null as montimebegin2, null as montimeend2, null as tuetimebegin2, null as tuetimeend2, null as wedtimebegin2, null as wedtimeend2, null as thutimebegin2, null as thutimeend2, null as fritimebegin2, null as fritimeend2 from ( select uuid,minage,maxage,grpname,(select birthday from childs where childs.uuid='" + pconfig.uuid + "') as birthday from groups) pl join workinghours wk on (wk.datestart <= datebegin) group by groupuuid order by wk.datestart DESC,minage,maxage;"; + // if (planuuid){ + //dump("today < entrydate PLANUUID: " + planuuid +"\n"); + // } + //} else { + //dump("INSPROPOSAL 2:" + JSON.stringify(curplan) + "\n"); + plansql = "select * from ( select CASE WHEN DATE(birthday,'+' || minage || ' months') < entrydate THEN entrydate ELSE DATE(birthday,'+' || minage || ' months') END AS datebegin, case when date(birthday,'+' || maxage || ' months') > leavedate then leavedate else date(birthday,'+' || maxage || ' months','-1 day') end as dateend, pl.uuid as groupuuid, montimeopen as montimebegin,montimeclose as montimeend,tuetimeopen as tuetimebegin,tuetimeclose as tuetimeend,wedtimeopen as wedtimebegin,wedtimeclose as wedtimeend,thutimeopen as thutimebegin,thutimeclose as thutimeend,fritimeopen as fritimebegin,fritimeclose as fritimeend,null as montimebegin2, null as montimeend2, null as tuetimebegin2, null as tuetimeend2, null as wedtimebegin2, null as wedtimeend2, null as thutimebegin2, null as thutimeend2, null as fritimebegin2, null as fritimeend2,1 as monlunch,1 as tuelunch, 1 as wedlunch, 1 as thulunch, 1 as frilunch from ( select uuid,minage,maxage,grpname,(select birthday from childs where childs.uuid='" + pconfig.uuid + "') as birthday,date('" + curplan.entrydate +"') AS entrydate,date('" + curplan.leavedate +"') AS leavedate from groups) pl join workinghours wk on (wk.datestart <= datebegin) group by groupuuid order by wk.datestart DESC,minage,maxage ) where datebegin!=dateend and dateend >= datebegin and order by datebegin,dateend;"; + if (planuuid){ + plansql = "select * from ( select CASE WHEN DATE(birthday,'+' || minage || ' months') < entrydate THEN entrydate ELSE DATE(birthday,'+' || minage || ' months') END AS datebegin, case when date(birthday,'+' || maxage || ' months') > leavedate then leavedate else date(birthday,'+' || maxage || ' months','-1 day') end as dateend, pl.uuid as groupuuid, plt.* from ( select uuid,minage,maxage,grpname,'"+pconfig.uuid+"' as chuuid,(select birthday from childs where childs.uuid='" + pconfig.uuid + "') as birthday, date('"+ curplan.entrydate+"') AS entrydate,date('" + curplan.leavedate +"') AS leavedate from groups) pl join workinghours wk on (wk.datestart <= datebegin) join (select '" + pconfig.uuid + "' as chuuid,* from planningtemplate where planningtemplate.uuid='"+planuuid+"') plt on (plt.chuuid=pl.chuuid) group by groupuuid order by wk.datestart DESC,minage,maxage ) where datebegin!=dateend and dateend >= datebegin order by datebegin,dateend;"; + //dump("plan PLANUUID: " + planuuid +"\n"); + } + //if (curplan.cnt > 0){ + // plansql = plansql.replace(/%%WHERE%%/,"date('" + curplan.maxdateto+"') between datebegin and dateend or datebegin > date('" + curplan.maxdateto+"') "); + //}else { + // plansql = plansql.replace(/%%WHERE%%/,""); + //} + + //} + //dump("PLANSQL: " +plansql + "\n"); + var plandata = appdb.dbquery(plansql); + + for (var pl in plandata.sqldata) { + + var inssql = "INSERT INTO planning (uuid,childuuid, groupuuid,datebegin, dateend, montimebegin, montimeend, tuetimebegin, tuetimeend, wedtimebegin, wedtimeend, thutimebegin,thutimeend, fritimebegin, fritimeend,montimebegin2, montimeend2, tuetimebegin2, tuetimeend2, wedtimebegin2, wedtimeend2, thutimebegin2,thutimeend2, fritimebegin2, fritimeend2, monlunch, tuelunch,wedlunch,thulunch,frilunch ) VALUES ("; + inssql += "'" + appdb.generate_uuid() + "',"; + inssql += "'" + pconfig.uuid + "',"; + inssql += "'" + plandata.sqldata[pl].groupuuid + "',"; + inssql += "'" + plandata.sqldata[pl].datebegin + "',"; + inssql += "'" + plandata.sqldata[pl].dateend + "',"; + inssql += "'" + plandata.sqldata[pl].montimebegin + "',"; + inssql += "'" + plandata.sqldata[pl].montimeend + "',"; + inssql += "'" + plandata.sqldata[pl].tuetimebegin + "',"; + inssql += "'" + plandata.sqldata[pl].tuetimeend + "',"; + inssql += "'" + plandata.sqldata[pl].wedtimebegin + "',"; + inssql += "'" + plandata.sqldata[pl].wedtimeend + "',"; + inssql += "'" + plandata.sqldata[pl].thutimebegin + "',"; + inssql += "'" + plandata.sqldata[pl].thutimeend + "',"; + inssql += "'" + plandata.sqldata[pl].fritimebegin + "',"; + inssql += "'" + plandata.sqldata[pl].fritimeend + "',"; + inssql += ((plandata.sqldata[pl].montimebegin2 !== "")?"'" + plandata.sqldata[pl].montimebegin2 + "'":'null') +","; + inssql += ((plandata.sqldata[pl].montimeend2 !== "")?"'" + plandata.sqldata[pl].montimeend2 + "'":'null') +","; + inssql += ((plandata.sqldata[pl].tuetimebegin2 !== "")?"'" + plandata.sqldata[pl].tuetimebegin2 + "'":'null') +","; + inssql += ((plandata.sqldata[pl].tuetimeend2 !== "")?"'" + plandata.sqldata[pl].tuetimeend2 + "'":'null') +","; + inssql += ((plandata.sqldata[pl].wedtimebegin2 !== "")?"'" + plandata.sqldata[pl].wedtimebegin2 + "'":'null') +","; + inssql += ((plandata.sqldata[pl].wedtimeend2 !== "")?"'" + plandata.sqldata[pl].wedtimeend2 + "'":'null') +","; + inssql += ((plandata.sqldata[pl].thutimebegin2 !== "")?"'" + plandata.sqldata[pl].thutimebegin2 + "'":'null') +","; + inssql += ((plandata.sqldata[pl].thutimeend2 !== "")?"'" + plandata.sqldata[pl].thutimeend2 + "'":'null') +","; + inssql += ((plandata.sqldata[pl].fritimebegin2 !== "")?"'" + plandata.sqldata[pl].fritimebegin2 + "'":'null') +","; + inssql += ((plandata.sqldata[pl].fritimeend2 !== "")?"'" + plandata.sqldata[pl].fritimeend2 + "'":'null') +","; + inssql += ((plandata.sqldata[pl].monlunch != 1)?"'" + plandata.sqldata[pl].monlunch + "'":'null') +","; + inssql += ((plandata.sqldata[pl].tuelunch != 1)?"'" + plandata.sqldata[pl].tuelunch + "'":'null') +","; + inssql += ((plandata.sqldata[pl].wedlunch != 1)?"'" + plandata.sqldata[pl].wedlunch + "'":'null') +","; + inssql += ((plandata.sqldata[pl].thulunch != 1)?"'" + plandata.sqldata[pl].thulunch + "'":'null') +","; + inssql += ((plandata.sqldata[pl].frilunch != 1)?"'" + plandata.sqldata[pl].frilunch + "'":'null') +""; + inssql += ");"; + + appdb.dbexec(inssql); + } + } + if ((curplan.cnt >= 1) && (!planuuid)){ + + var plansql = "select * from ( select case when date(entrydate) < date(nextdate) then nextdate else entrydate end as datebegin, case when entrydate < date(nextdate) then date(nextdate) else date(birthday,'+' || maxage || ' months','-1 day') end as dateend, pl.uuid as groupuuid,birthday,nextdate,grpname from ( select uuid,minage,maxage,grpname, (select entrydate from childs where childs.uuid='" + pconfig.uuid + "') as entrydate ,(select birthday from childs where childs.uuid='" + pconfig.uuid + "') as birthday, (select date(max(dateend),'+1 day') from planning where planning.childuuid='" + pconfig.uuid + "') as nextdate from groups) pl group by groupuuid order by minage,maxage ) where datebegin encodeparam($("#frmeditplanning #dateend").val(),'date')){ + errormsg("Erreur en dates!","La date de début ne peut pas être supérieur à la date de fin!\n"); + return false; + } + + if (($("#frmeditplanning #montimebegin").val() > $("#frmeditplanning #montimeend").val()) || + ($("#frmeditplanning #tuetimebegin").val() > $("#frmeditplanning #tuetimeend").val()) || + ($("#frmeditplanning #wedtimebegin").val() > $("#frmeditplanning #wedtimeend").val()) || + ($("#frmeditplanning #thutimebegin").val() > $("#frmeditplanning #thutimeend").val()) || + ($("#frmeditplanning #fritimebegin").val() > $("#frmeditplanning #fritimeend").val()) || + ($("#frmeditplanning #montimebegin2").val() > $("#frmeditplanning #montimeend2").val() && $("#montime2").is(':visible')) || + ($("#frmeditplanning #tuetimebegin2").val() > $("#frmeditplanning #tuetimeend2").val() && $("#tuetime2").is(':visible')) || + ($("#frmeditplanning #wedtimebegin2").val() > $("#frmeditplanning #wedtimeend2").val() && $("#wedtime2").is(':visible')) || + ($("#frmeditplanning #thutimebegin2").val() > $("#frmeditplanning #thutimeend2").val() && $("#thutime2").is(':visible')) || + ($("#frmeditplanning #fritimebegin2").val() > $("#frmeditplanning #fritimeend2").val() && $("#fritime2").is(':visible')) || + ($("#frmeditplanning #montimeend").val() > $("#frmeditplanning #montimebegin2").val() && $("#montime2").is(':visible')) || + ($("#frmeditplanning #tuetimeend").val() > $("#frmeditplanning #tuetimebegin2").val() && $("#tuetime2").is(':visible')) || + ($("#frmeditplanning #wedtimeend").val() > $("#frmeditplanning #wedtimebegin2").val() && $("#wedtime2").is(':visible')) || + ($("#frmeditplanning #thutimeend").val() > $("#frmeditplanning #thutimebegin2").val() && $("#thutime2").is(':visible')) || + ($("#frmeditplanning #fritimeend").val() > $("#frmeditplanning #fritimebegin2").val() && $("#fritime2").is(':visible'))) + { + errormsg("Erreur dans les heures d'entrée sortie!","l'heure d'entée ne peut pas être suppérieur à l'heure de sortie
      et
      une deuxième heure d'entrée d'un jour ne peut pas être inférieur à l'heure de la première sortie du jour!"); + return false; + } + return true; +} + +function save_planning() { + + var sql1 = new Array(); + var sql2 = new Array(); + + if (!check_planning()){ + return; + }; + var pluuid = null; + sql1.push("childuuid"); + + sql2.push("'" + pconfig.uuid + "'"); + $("#frmeditplanning :input").each(function() { + var input = $(this); + if (input.attr("id")) { + sql1.push(input.attr("id")); + if (input.attr("id") == 'uuid') { + if (input.val() == "" || input.val() == "0") { + sql2.push("'" + appdb.generate_uuid() + "'"); + } else { + sql2.push("'" + input.val() + "'"); + pluuid = input.val(); + } + } else if (input.attr("type") == "checkbox") { + sql2.push(((input.is(':checked')) ? "'1'" : "'0'")); + } else { + var ival = encodeparam(input.val(),input.attr('type')); + if ((input.attr("id").substring(input.attr("id").length-1) == "2") && + $("#" + input.attr("id").substring(0,3) +"time" + input.attr("id").substring(input.attr("id").length-1)).is(":hidden")) { + ival = 'null'; + } + if (ival == "''") { + ival='null'; + } + sql2.push(ival); + + } + } + + }); + + var sdatebegin = encodeparam($("#frmeditplanning #datebegin").val(),'date'); + var sdateend = encodeparam($("#frmeditplanning #dateend").val(),'date'); + var checkdatereplace = appdb.dbquery("select uuid from planning where datebegin >= "+sdatebegin+" and dateend <= "+sdateend+" and childuuid='"+pconfig.uuid+"';"); + checkdatereplace = checkdatereplace.sqldata; + if (checkdatereplace.length > 0) { + + var ruuid = new Array(); + for (var i in checkdatereplace){ + ruuid.push("'"+ checkdatereplace[i].uuid +"'"); + } + appdb.dbexec("DELETE FROM planning where uuid in (" + ruuid.join(",") + ");"); + } + var checkdatesplit = appdb.dbquery("select uuid,dateend from planning where datebegin <= "+sdatebegin+" and dateend >= "+sdateend+" and childuuid='"+pconfig.uuid+"';"); + checkdatesplit = checkdatesplit.sqldata; + if (checkdatesplit.length == 1) { + + var newuuid = appdb.generate_uuid(); + appdb.dbexec("INSERT INTO planning (datebegin, dateend, montimebegin, montimeend, monlunch, tuetimebegin, tuetimeend, tuelunch, wedtimebegin, wedtimeend, wedlunch, thutimebegin, thutimeend, thulunch, fritimebegin, fritimeend, frilunch, sattimebegin, sattimeend, satlunch, suntimebegin, suntimeend, sunlunch, childuuid, uuid, groupuuid, montimebegin2, montimeend2, tuetimebegin2, tuetimeend2, wedtimebegin2, wedtimeend2, thutimebegin2, thutimeend2, fritimebegin2, fritimeend2, sattimebegin2, sattimeend2, suntimebegin2, suntimeend2) SELECT date("+sdateend+",'+1 day'), dateend, montimebegin, montimeend, monlunch, tuetimebegin, tuetimeend, tuelunch, wedtimebegin, wedtimeend, wedlunch, thutimebegin, thutimeend, thulunch, fritimebegin, fritimeend, frilunch, sattimebegin, sattimeend, satlunch, suntimebegin, suntimeend, sunlunch, childuuid, '"+newuuid+"', groupuuid, montimebegin2, montimeend2, tuetimebegin2, tuetimeend2, wedtimebegin2, wedtimeend2, thutimebegin2, thutimeend2, fritimebegin2, fritimeend2, sattimebegin2, sattimeend2, suntimebegin2, suntimeend2 FROM planning where uuid='"+ checkdatesplit[0].uuid +"';"); + appdb.dbexec("UPDATE planning SET dateend=date("+sdatebegin+",'-1 day') where uuid='"+checkdatesplit[0].uuid+"'"); + } + + var checkdatefrom = appdb.dbquery("select uuid from planning where datebegin between "+sdatebegin+" and "+sdateend+" and childuuid='"+pconfig.uuid+"';"); + var checkdateto = appdb.dbquery("select uuid from planning where dateend between "+sdatebegin+" and "+sdateend+" and childuuid='"+pconfig.uuid+"';"); + if (checkdatefrom.sqldata.length == 1) { + + appdb.dbexec("update planning set datebegin=date("+encodeparam($("#frmeditplanning #dateend").val(),'date')+",'+1 day') where uuid='"+checkdatefrom.sqldata[0].uuid+"'"); + } + if (checkdateto.sqldata.length == 1) { + + appdb.dbexec("update planning set dateend=date("+encodeparam($("#frmeditplanning #datebegin").val(),'date')+",'-1 day') where uuid='"+checkdateto.sqldata[0].uuid+"'"); + } + if (pluuid) { + + appdb.dbexec("DELETE FROM planning where uuid='" + pluuid + "'"); + } + var inssql = "INSERT INTO planning (" + sql1.join(',') + ") VALUES (" + sql2.join(',') + ");"; + appdb.dbexec(inssql); + load_table_presence(); + $("#edit_planning").modal('hide'); +} + +function save_refperson() { + + var sql1 = new Array(); + var sql2 = new Array(); + + sql1.push("childuuid"); + sql2.push("'" + pconfig.uuid + "'"); + var refuuid= null; + $("#frmeditrefperson :input").each(function() { + var input = $(this); + + if (input.attr("id")) { + sql1.push(input.attr("id")); + if (input.attr("id") == 'uuid') { + if (input.val() == "" || input.val() == "0") { + sql2.push("'" + appdb.generate_uuid() + "'"); + } else { + sql2.push("'" + input.val() + "'"); + } + if (input.val() != "0") { + refuuid=input.val(); + } + } else if (input.attr("type") == "checkbox") { + + sql2.push(((input.is(':checked')) ? "'1'" : "'0'")); + + } else { + var ival = input.val(); + if (ival == "''") { + ival = 'null'; + } + sql2.push(encodeparam(ival,'text')); + + } + } + }); + + if (refuuid) { + appdb.dbexec("DELETE FROM refpersons where uuid='" + refuuid + "'"); + } + var inssql = "INSERT INTO refpersons (" + sql1.join(',') + ") VALUES (" + sql2.join(',') + ");"; + appdb.dbexec(inssql); + + load_table_refperson(); + + $("#edit_refperson").modal('hide'); + + return false; +} + +function save_cautionstatus(){ + var sql1 = new Array(); + var sql2 = new Array(); + + sql1.push("childuuid"); + sql2.push("'" + pconfig.uuid + "'"); + var cauuuid= null; + $("#frmeditcautionstatus :input").each(function() { + var input = $(this); + + if (input.attr("id")) { + sql1.push(input.attr("id")); + if (input.attr("id") == 'uuid') { + //dump("caution uuid=" + input.val() +"\n"); + if (input.val() === "" || input.val() === "0") { + sql2.push("'" + appdb.generate_uuid() + "'"); + } else { + sql2.push("'" + input.val() + "'"); + } + if (input.val() != "0") { + cauuuid=input.val(); + } + } else { + var ival = encodeparam(input.val(),input.attr('type')); + if (ival == "''") { + ival = 'null'; + } + sql2.push(ival); + + } + } + }); + + if (cauuuid) { + appdb.dbexec("DELETE FROM cautionstatus where uuid='" + cauuuid + "'"); + } + var inssql = "INSERT INTO cautionstatus (" + sql1.join(',') + ") VALUES (" + sql2.join(',') + ");"; + //dump(inssql + "\n"); + appdb.dbexec(inssql); + + load_table_caution(); + + $("#edit_cautionstatus").modal('hide'); + + return false; +} + +function confirm_delete_cautionstatus() { + $("#confirm_delete_cautionstatus").modal('show'); + return false; +} + + +function confirm_delete_planning() { + $("#confirm_delete_planning").modal('show'); + return false; +} + +function confirm_delete_allplanning() { + $("#confirm_delete_allplanning").modal('show'); + return false; +} + +function confirm_delete_refperson() { + $("#confirm_delete_refperson").modal('show'); + return false; +} + +function delete_planning() { + + appdb.dbexec("DELETE FROM planning where uuid='" + delplan + "'"); + delplan = null; + load_table_presence(); + + $("#confirm_delete_planning").modal('hide'); + + return false; +} + +function delete_allplanning() { + + appdb.dbexec("DELETE FROM planning where childuuid='" + pconfig.uuid + "'"); + delplan = null; + load_table_presence(); + + $("#confirm_delete_allplanning").modal('hide'); + + return false; +} + +function delete_refperson() { + + appdb.dbexec("DELETE FROM refpersons where uuid='" + delrefperson + "'"); + delrefperson = null; + load_table_refperson(); + + $("#confirm_delete_refperson").modal('hide'); + + return false; +} + +function delete_cautionstatus() { + + appdb.dbexec("DELETE FROM cautionstatus where uuid='" + delcautionstatus + "'"); + delcautionstatus = null; + load_table_caution(); + + $("#confirm_delete_cautionstatus").modal('hide'); + + return false; +} + +function display_tblrow(trid) { + $('#' + trid + "time2").show(); + +} + +function hide_tblrow(trid) { + $('#' + trid).hide(); +} + +function load_table_files(){ + + myfiles = system.getChildFiles(cruuid,pconfig.uuid); + + var atbody = []; + for (var i=0;i '); + row.push(fname); + atbody.push(row); + } + + } + + $("#tbl_files").html(""); + var headerdata = getlabels("action,description"); + $("#tbl_files").html(""); + $("#tbl_files").dataTable({ + "language": { + "url": "js/locale/datatable_fr.json" + }, + "data": atbody, + "columns": headerdata, + "paging": false, + "scrollY": wh + "px", + "scrollCollapse": true, + "ordering": true, + "info": false, + "filter": false, + "destroy": true + }); +} + +function preview_file(fi){ + //dump("open file: " + fi + "\n"); + var ff = system.openFile(fi); + return false; +} + +function delete_report(fi) { + //dump("delete" + fi + " ->"+ myfiles[delfile].path+"\n"); + + //delfile = fi; + //dump(fi + "\n"); + if (confirm("êtes vous sûre de supprimer ce fichier?")){ + OS.File.remove(fi); + setTimeout(function(){load_table_files();},3000); + } + + return false; + +} + + + + +function dlg_file(){ + $("#edit_file").modal('show'); + return false; +} + + +function save_file(){ + var file = $("#frmeditfile #file").val(); + var path = FileUtils.File(curcfg.path.local + system.sep() +"childs" + system.sep() +cruuid + system.sep() + pconfig.uuid); + var newlocation= path.path + system.sep() + system.getFileName(file); + OS.File.copy(file, newlocation); + setTimeout(function(){load_table_files();$("#edit_file").modal('hide');},3000); +} + +function loadplantemplates(){ + var xdata = appdb.dbquery("select uuid,templatename from planningtemplate order by templatename;"); + xdata = xdata.sqldata; + if (xdata.length > 0){ + $("#plantemplates").html(""); + $("#plantemplates").append('
    • multiple
    • '); + for (var i in xdata){ + $("#plantemplates").append('
    • '+ xdata[i].templatename+'
    • '); + } + $("#plantemplates").append(''); + $("#plantemplates").append('
    • simple
    • '); + for (var i in xdata){ + $("#plantemplates").append('
    • '+ xdata[i].templatename+'
    • '); + } + $("#plantemplates").append('
    • Plan Vide
    • '); + } +} \ No newline at end of file diff --git a/app_v3satdemo/chrome/content/web/js/childs.js b/app_v3satdemo/chrome/content/web/js/childs.js new file mode 100644 index 0000000..b0266ad --- /dev/null +++ b/app_v3satdemo/chrome/content/web/js/childs.js @@ -0,0 +1,156 @@ +//Source-code licensed under EUPL v1.1 ( Copyright 2016 By DKS s.à r.l. - Kilian Saffran - Luxembourg ) + +var idfilter = null; +var filter = null; +var delchild = null; +//var printchild = null; +//var pagename = "childs"; +var pconfig = {}; +var childtbl = null; +//var printchilddef = {}; +var wh= window.innerHeight -125; +//var a = {}; +//var btnprintchild = ""; + +function initdata(){ + var configdata = apppref.getpreference("pageconfig.childs"); + if (configdata !== '') { + pconfig = JSON.parse(configdata); + } + if (!pconfig.printlayout) { + pconfig.printlayout = 'list'; + apppref.setpreference("pageconfig.childs",pconfig); + } + + var filters = getallfilters(); + var strfilters = ""; + for (var f in filters) { + if (pconfig.filterid === "") { + idfilter = 0; + filter = filters[0]; + set_infoheader(filter.description); + + pconfig.idfilter = 0; + apppref.setpreference("pageconfig.childs",pconfig); + } + if (pconfig.filterid == f) { + idfilter = f; + filter = filters[f]; + set_infoheader(filter.description); + + } + strfilters += '
    • ' + filters[f].description + '
    • '; + } + + + $("#cmb_childsfilter").html(strfilters); + + loadtable(); +} + + +function loadtable() { + var actionbtnsql = ""; + var sql = filter.sql; + sql = sql.replace('%%ACTION%%',actionbtnsql); + var actionbtnsql2 = ""; + sql = sql.replace('%%ACTION2%%',actionbtnsql2); + var data = appdb.dbqueryarray(sql); + //dump("SQL:" + sql + "\n"); + //dump(JSON.stringify(data) + "\n"); + //dump(JSON.stringify(data.sqlhead) + "\n"); + + var headerdata = null; + + headerdata = getlabels(data.sqlhead.join(",")); + + $("#tbl_childs").html(""); + var nhd = []; + for (var i in headerdata){ + nhd.push({"title":headerdata[i]["title"],"class":headerdata[i]["class"]}); + } + + $("#tbl_childs").append(); + childtbl = $("#tbl_childs").dataTable({ + "language": { + "url": "js/locale/datatable_fr.json" + }, + "data": data.sqldata, + "columns": nhd, + "scrollY": wh + "px", + "scrollCollapse": true, + "paging": false, + "ordering": true, + "info": true, + "filter": true, + "destroy": true + }); + + if (pconfig.filter) { + childtbl.fnFilter(pconfig.filter); + } + if (pconfig.order) { + childtbl.fnSort(pconfig.order); + } + +} + +$('#tbl_childs').on( 'search.dt', function () { + pconfig.filter = childtbl.api().search(); + apppref.setpreference("pageconfig.childs",pconfig); + } ); + + $('#tbl_childs').on( 'order.dt', function () { + pconfig.order= childtbl.fnSettings().aaSorting; + apppref.setpreference("pageconfig.childs",pconfig); + } ); + + + + + + +function setfilter(fid) { + idfilter = fid; + filter = getfilter(fid); + //cond = fnew.filtersql; + pconfig.filterid = fid; + apppref.setpreference("pageconfig.childs",pconfig); + globelreq.send_request({ + page: 'childs', + data: null, + header: 'Enfants' + }); + //set_infoheader(filter.description); + //loadtable(); +} + +function addchild() { + var newuuid = appdb.generate_uuid(); + appdb.dbexec("insert into childs (uuid,birthday,entrydate,leavedate) VALUES ('" + newuuid + "',date('now','-2 months'),date('now'),date('now'));"); + globelreq.send_request({ + page: 'child', + data: { + "uuid": newuuid + }, + header: 'Enfant' + }); +} + +function confirm_delete_child(myuuid) { + delchild = myuuid; + $("#confirm_delete_child").modal('show'); +} + +function delete_child() { + appdb.dbexec("DELETE from childslog where childuuid='"+delchild+"'"); + appdb.dbexec("DELETE FROM presence where childuuid='" + delchild + "';"); + appdb.dbexec("DELETE FROM refpersons where childuuid='" + delchild + "';"); + appdb.dbexec("DELETE FROM planning where childuuid='" + delchild + "';"); + appdb.dbexec("DELETE FROM childs where uuid='" + delchild + "';"); + delchild = null; + loadtable(); + $("#confirm_delete_child").modal('hide'); +} + + diff --git a/app_v3satdemo/chrome/content/web/js/childs_basic.js b/app_v3satdemo/chrome/content/web/js/childs_basic.js new file mode 100644 index 0000000..0a6c1e7 --- /dev/null +++ b/app_v3satdemo/chrome/content/web/js/childs_basic.js @@ -0,0 +1,140 @@ +//Source-code licensed under EUPL v1.1 ( Copyright 2016 By DKS s.à r.l. - Kilian Saffran - Luxembourg ) + +var idfilter = null; +var filter = null; +var delchild = null; +//var printchild = null; +//var pagename = "childs"; +var pconfig = {}; +var childtbl = null; +//var printchilddef = {}; +var wh= window.innerHeight -125; +//var a = {}; +//var btnprintchild = ""; + +function initdata(){ + var configdata = apppref.getpreference("pageconfig.childs"); + if (configdata !== '') { + pconfig = JSON.parse(configdata); + } + if (!pconfig.printlayout) { + pconfig.printlayout = 'list'; + apppref.setpreference("pageconfig.childs",pconfig); + } + + var filters = getallfilters(); + var strfilters = ""; + for (var f in filters) { + if (pconfig.filterid === "") { + idfilter = 0; + filter = filters[0]; + set_infoheader(filter.description); + + pconfig.idfilter = 0; + apppref.setpreference("pageconfig.childs",pconfig); + } + if (pconfig.filterid == f) { + idfilter = f; + filter = filters[f]; + set_infoheader(filter.description); + + } + strfilters += '
    • ' + filters[f].description + '
    • '; + } + + + $("#cmb_childsfilter").html(strfilters); + + loadtable(); +} + + +function loadtable() { + var actionbtnsql = ""; + var sql = filter.sql; + sql = sql.replace('%%ACTION%%',actionbtnsql); + var actionbtnsql2 = ""; + sql = sql.replace('%%ACTION2%%',actionbtnsql2); + var data = appdb.dbqueryarray(sql); + + + var headerdata = null; + + headerdata = getlabels(data.sqlhead.join(",")); + + $("#tbl_childs").html(""); + var nhd = []; + for (var i in headerdata){ + nhd.push({"title":headerdata[i]["title"],"class":headerdata[i]["class"]}); + } + + $("#tbl_childs").append(); + childtbl = $("#tbl_childs").dataTable({ + "language": { + "url": "js/locale/datatable_fr.json" + }, + "data": data.sqldata, + "columns": nhd, + "scrollY": wh + "px", + "scrollCollapse": true, + "paging": false, + "ordering": true, + "info": true, + "filter": true, + "destroy": true + }); + + if (pconfig.filter) { + childtbl.fnFilter(pconfig.filter); + } + if (pconfig.order) { + childtbl.fnSort(pconfig.order); + } + +} + +$('#tbl_childs').on( 'search.dt', function () { + pconfig.filter = childtbl.api().search(); + apppref.setpreference("pageconfig.childs",pconfig); + } ); + + $('#tbl_childs').on( 'order.dt', function () { + pconfig.order= childtbl.fnSettings().aaSorting; + apppref.setpreference("pageconfig.childs",pconfig); + } ); + + + + + + +function setfilter(fid) { + idfilter = fid; + filter = getfilter(fid); + //cond = fnew.filtersql; + pconfig.filterid = fid; + apppref.setpreference("pageconfig.childs",pconfig); + globelreq.send_request({ + page: 'childs_basic', + data: null, + header: 'Enfants' + }); + //set_infoheader(filter.description); + //loadtable(); +} + +function addchild() { + var newuuid = appdb.generate_uuid(); + appdb.dbexec("insert into childs (uuid,birthday,entrydate,leavedate) VALUES ('" + newuuid + "',date('now','-2 months'),date('now'),date('now'));"); + globelreq.send_request({ + page: 'child', + data: { + "uuid": newuuid + }, + header: 'Enfant' + }); +} + + + + diff --git a/app_v3satdemo/chrome/content/web/js/creche.js b/app_v3satdemo/chrome/content/web/js/creche.js new file mode 100644 index 0000000..43e3ba6 --- /dev/null +++ b/app_v3satdemo/chrome/content/web/js/creche.js @@ -0,0 +1,511 @@ +//Source-code licensed under EUPL v1.1 ( Copyright 2016 By DKS s.à r.l. - Kilian Saffran - Luxembourg ) + +var crident = null; +var pconfig = {}; +var delwkhours = null; +var delplanning = null; +var delgroups = null; +var winh = window.innerHeight - 360; +var weekdays = ['mon','tue','wed','thu','fri']; + +function initdata() { + load_helpers(); + var sql = "SELECT uuid,crechename, adress, city, country, zip,maxchilds,minage,maxage,stafflist,idcheckservice FROM creche LIMIT 1;"; + var crdata = appdb.dbquery(sql); + set_infoheader(""); + //dump(JSON.stringify(crdata) + "\n"); + if (crdata.sqldata.length == 0){ + check_defaultdata(); + crdata = appdb.dbquery(sql); + } + crident = crdata.sqldata[0].uuid; + cdata = crdata.sqldata[0]; + for (var ci in cdata) { + + if (document.getElementById("creche_" + ci)) { + if (ci == "stafflist"){ + $("#creche_stafflist").prop('checked', true); + } else { + document.getElementById("creche_" + ci).setAttribute('value', cdata[ci]); + } + + } + } + var configdata = apppref.getpreference("pageconfig.creche"); + + if (configdata != '') { + pconfig = JSON.parse(configdata); + } + + $('#tabgrouphead a[data-toggle="tab"]').on('shown.bs.tab', function(e) { + var tn = e.target.toString(); + pconfig.activetab = tn.substring(tn.lastIndexOf("#") + 1); + apppref.setpreference("pageconfig.creche", pconfig); + + if (pconfig.activetab == 'openinghours') { + load_table_workinghours(); + } + if (pconfig.activetab == 'groups') { + load_table_groups(); + } + if (pconfig.activetab == 'planningtemplate') { + load_table_planningtemplate(); + } + + }); + $('#frmeditgroups #color').minicolors({theme:'bootstrap',position: 'bottom right'}); + if (pconfig && pconfig.activetab) { + $('#tabgrouphead a[href="#' + pconfig.activetab + '"]').tab('show'); + } else { + $('#tabgrouphead a[href="#openinghours"]').tab('show'); + } +} + +$('#creche_stafflist').on('change', function() { + // From the other examples + if (this.checked) { + appdb.dbexec("update creche set stafflist='1';"); + } else { + appdb.dbexec("update creche set stafflist=null;"); + } +}); + +function load_table_workinghours() { + + var whsql1 = "select count(*) as cnt from workinghours;"; + var wdata1 = appdb.dbquery(whsql1); + var delbtn = ""; + if (wdata1.sqldata[0].cnt == 1) { + delbtn = ''; + } + var whsql = "SELECT ' " + delbtn + "' as action, strftime('%d.%m.%Y',datestart) as startdate, case when montimeopen is null then 'fermé' else montimeopen || ' - ' || montimeclose end as monday, case when tuetimeopen is null then 'fermé' else tuetimeopen || ' - ' || tuetimeclose end as tuesday, case when wedtimeopen is null then 'fermé' else wedtimeopen || ' - ' || wedtimeclose end as wednesday, case when thutimeopen is null then 'fermé' else thutimeopen || ' - ' || thutimeclose end as thursday, case when fritimeopen is null then 'fermé' else fritimeopen || ' - ' || fritimeclose end as friday FROM workinghours order by datestart ASC;"; + + var whdata = appdb.dbqueryarray(whsql); + + var headerdata = getlabels(whdata.sqlhead.join(",")); + $("#tbl_workinghours").html(""); + $("#tbl_workinghours").dataTable({ + "language": { + "url": "js/locale/datatable_fr.json" + }, + "data": whdata.sqldata, + "columns": headerdata, + "paging": false, + "scrollY": winh + "px", + "scrollCollapse": true, + "ordering": true, + "info": false, + "filter": false, + "destroy": true + }); + +} + +function load_table_groups() { + var grpsql1 = "select count(*) as cnt from groups;"; + var grpcnt = appdb.dbquery(grpsql1); + var grpdel = "|| case when groupchildcount = 0 then ' ' else '' end"; + if (grpcnt.sqldata[0].cnt <= 1) { + grpdel = ''; + } + var grsql = "select '' " + grpdel + " as action, grpname,case when color is not null then '

      ' else null end as color, maxchilds, minage, maxage,coalesce(minstaff,1) as minstaff from ( select grp.uuid,grp.grpname,grp.color,grp.maxchilds,grp.minage,grp.maxage,grp.minstaff, count(plan.uuid) as groupchildcount from groups grp left join planning plan on (grp.uuid=plan.groupuuid) group by grp.uuid,grp.grpname,grp.maxchilds,grp.minage,grp.maxage order by grp.minage,grp.maxage) order by minage,maxage;"; + + var grdata = appdb.dbqueryarray(grsql); + + var headerdata = getlabels(grdata.sqlhead.join(",")); + $("#tbl_groups").html(""); + var dtbl_groups = $("#tbl_groups").dataTable({ + "language": { + "url": "js/locale/datatable_fr.json" + }, + "data": grdata.sqldata, + "columns": headerdata, + "paging": false, + "scrollY": winh + "px", + "scrollCollapse": true, + "ordering": true, + "info": false, + "filter": false, + "destroy": true + }); +} + +function load_table_planningtemplate() { + + var plansql = "SELECT '" + + "' as action," + 'templatename as name,'; + var xplan = []; + for (var i in weekdays){ + + + xplan.push("case when "+ weekdays[i] +"timebegin is null or "+ weekdays[i] +"timeend is null or "+ weekdays[i] +"timebegin = "+ weekdays[i] +"timeend then '' else "+ weekdays[i] +"timebegin || ' - ' || "+ weekdays[i] +"timeend end || (case when "+ weekdays[i] +"lunch then ' ()' else '' end) || case when "+ weekdays[i] +"timebegin2 = "+ weekdays[i] +"timeend2 or "+ weekdays[i] +"timebegin2 is null or "+ weekdays[i] +"timeend2 is null then '' else '
      ' || "+ weekdays[i] +"timebegin2 || ' - ' || "+ weekdays[i] +"timeend2 end as "+ weekdays[i] +""); + } + plansql += xplan.join(',') + ' from planningtemplate order by templatename;'; + //dump("PLANSQL:" + plansql + "\n"); + var tmpldata = appdb.dbqueryarray(plansql); + + var headerdata = getlabels("action,name,mon,tue,wed,thu,fri"); + $("#tbl_planningtemplate").html(""); + $("#tbl_planningtemplate").dataTable({ + "language": { + "url": "js/locale/datatable_fr.json" + }, + "data": tmpldata.sqldata, + "columns": headerdata, + "paging": false, + "scrollY": winh + "px", + "scrollCollapse": true, + "ordering": true, + "info": false, + "filter": false, + "destroy": true + }); +} + +function dlg_workinghours(uuid, type) { + if ((type == 'upd') || (type == 'ins')) { + var cwhsql = "SELECT '0' as uuid,strftime('%d.%m.%Y',date('now')) as datestart, montimeopen, montimeclose, tuetimeopen, tuetimeclose, wedtimeopen, wedtimeclose, thutimeopen, thutimeclose, fritimeopen, fritimeclose FROM workinghours order by datestart DESC LIMIT 1;"; + if (type == 'upd') { + cwhsql = "SELECT uuid,strftime('%d.%m.%Y',datestart) as datestart, montimeopen, montimeclose, tuetimeopen, tuetimeclose, wedtimeopen, wedtimeclose, thutimeopen, thutimeclose, fritimeopen, fritimeclose, sattimeopen FROM workinghours where uuid='" + uuid.uuid + "';"; + } + var cwhdata = appdb.dbquery(cwhsql); + cwhdata = cwhdata.sqldata[0]; + for (var w in cwhdata) { + if ($("#frmeditworkinghours #" + w)) { + + $("#frmeditworkinghours #" + w).val(cwhdata[w]); + } + } + $("#edit_workinghours").modal('show'); + } else if (type == 'del') { + delwkhours = uuid.uuid; + confirm_delete_workinghours(); + } +} + +function dlg_planningtemplate(uuid, type) { + for (var i in weekdays){ + $("#frmeditplanning #" + weekdays[i] + "time2").hide(); + } + if ((type == 'upd') || (type == 'ins')) { + //var grpsql = "SELECT strftime('%d.%m.%Y',date('now')) as startdate, '0,00' as costsperhour,'0,00' as costperhourfallback, '0' as weeklyhourslimit, '0' as dailylunchcosts, '0' as uuid;"; + var hdata = {templatename:"nouveau modèle",uuid:"0", + montimebegin:"00:00",montimeend:"00:00",monlunch:"0",montimebegin2: "00:00",montimeend2: "00:00", + tuetimebegin:"00:00",tuetimeend:"00:00",tuelunch:"0",tuetimebegin2: "00:00",tuetimeend2: "00:00", + wedtimebegin:"00:00",wedtimeend:"00:00",wedlunch:"0",wedtimebegin2: "00:00",wedtimeend2: "00:00", + thutimebegin:"00:00",thutimeend:"00:00",thulunch:"0",thutimebegin2: "00:00",thutimeend2: "00:00", + fritimebegin:"00:00",fritimeend:"00:00",frilunch:"0",fritimebegin2: "00:00",fritimeend2: "00:00" + }; + if (type == 'upd') { + var plxsql = "SELECT uuid, montimebegin, montimeend, monlunch, tuetimebegin, tuetimeend, tuelunch, wedtimebegin, wedtimeend, wedlunch, thutimebegin, thutimeend, thulunch, fritimebegin, fritimeend, frilunch, montimebegin2, montimeend2, tuetimebegin2, tuetimeend2, wedtimebegin2, wedtimeend2, thutimebegin2, thutimeend2, fritimebegin2, fritimeend2, templatename FROM planningtemplate where uuid='" + uuid.uuid + "';"; + var hdbdata = appdb.dbquery(plxsql); + hdata = hdbdata.sqldata[0]; + } + //JSON.stringify(hdata) + "\n"); + $("#frmeditplanning #uuid").val(hdata.uuid); + for (var p in hdata) { + + if ($("#frmeditplanning #"+p)) { + //dump("found:" + p + "\n"); + if ($("#" + p).is(':checkbox')) { + if (hdata[p] == '1') { + $("#" + p).prop("checked", true); + } else { + $("#" + p).prop("checked", false); + } + } else { + if ((p.substr(p.length-1) == "2") && (p.indexOf("time") !== -1) && (hdata[p.substr(0,3) + "timebegin2"] !== hdata[p.substr(0,3) + "timeend2"])){ + //dump("p:" + p +'#' + p.substr(0,3) + "time" + p.substr(p.length-1) + " show\n"); + $('#' + p.substr(0,3) + "time" + p.substr(p.length-1)).show(); + } + if ((p.indexOf("time") !== -1) && (hdata[p] === "")) { + document.getElementById(p).value = "00:00"; + } else { + document.getElementById(p).value = hdata[p]; + } + } + } + } + //"curuuid" + $("#frmeditplanning #uuid").val()+"\n"); + + $("#edit_planning").modal('show'); + } else if (type == 'del') { + delplanning = uuid.uuid; + confirm_delete_planningtemplate(); + } +} + +function dlg_groups(uuid, type) { + if ((type == 'upd') || (type == 'ins')) { + var grpsql = "SELECT '0' as uuid,'nouvelle groupe' as grpname, case when maxchilds > 15 then 15 else maxchilds end as maxchilds, minage, maxage, 1 as minstaff FROM creche LIMIT 1;"; + if (type == 'upd') { + grpsql = "SELECT grpname, maxchilds, minage, maxage,minstaff, uuid,color FROM groups where uuid='" + uuid.uuid + "';" + } + var grpdata = appdb.dbquery(grpsql); + grpdata = grpdata.sqldata[0]; + for (var g in grpdata) { + + if ($("#frmeditgroups #" + g)) { + $("#frmeditgroups #" + g).val(grpdata[g]); + if (g == 'color'){ + $('#frmeditgroups #color').minicolors('value',{color: grpdata[g]}); + } + } + } + $("#edit_groups").modal('show'); + } else if (type == 'del') { + delgroups = uuid.uuid; + confirm_delete_groups(); + } +} + +function save_workinghours() { + var sql1 = new Array(); + var sql2 = new Array(); + var type = 'ins'; + var cuuid = ""; + if ($("#frmeditworkinghours #uuid").val() != 0) { + type = 'upd'; + cuuid = $("#frmeditworkinghours #uuid").val(); + } + $("#frmeditworkinghours :input").each(function() { + var input = $(this); + if (input.attr("id")) { + if (type == 'ins') { + sql1.push('"' + input.attr("id") + '"'); + if (input.attr("id") == 'uuid') { + if (input.val() == "" || input.val() == "0") { + sql2.push("'" + appdb.generate_uuid() + "'"); + } else { + sql2.push("'" + input.val() + "'"); + } + } else { + var ival = encodeparam(input.val(), input.attr('type')); + sql2.push(ival); + } + } else { + if (input.attr("id") != 'uuid') { + var ival = encodeparam(input.val(), input.attr('type')); + sql2.push('"' + input.attr("id") + '"=' + ival); + } + } + + + } + + }); + var xsql = ""; + if (type == 'upd') { + xsql = "UPDATE workinghours SET " + sql2.join(',') + " where \"uuid\"='" + cuuid + "';"; + } else { + xsql = "INSERT INTO workinghours (" + sql1.join(',') + ") VALUES (" + sql2.join(',') + ");"; + } + + appdb.dbexec(xsql); + load_table_workinghours(); + $("#frmeditworkinghours #uuid").val("0"); + $("#edit_workinghours").modal('hide'); +} + +function save_planningtemplate() { + var sql1 = []; + var sql2 = []; + var cuuid = ""; + //"save planning!\n"); + if ($("#frmeditplanning #uuid").val() !== "0") { + cuuid = $("#frmeditplanning #uuid").val(); + } + //$("#frmeditplanning :input").each(function() { + //var input = $(this); + sql1.push('"templatename"'); + sql2.push(encodeparam($('#frmeditplanning #templatename').val(), "text")); + for (var i in weekdays){ + if ($('#frmeditplanning #' + weekdays[i] + "timebegin").val() !== $('#frmeditplanning #' + weekdays[i] + "timeend").val()){ + sql1.push('"' + weekdays[i] + "timebegin" + '"'); + sql1.push('"' + weekdays[i] + "timeend" + '"'); + sql2.push(encodeparam($('#frmeditplanning #' + weekdays[i] + "timebegin").val(), "text")); + sql2.push(encodeparam($('#frmeditplanning #' + weekdays[i] + "timeend").val(), "text")); + if ($('#frmeditplanning #' + weekdays[i] + "lunch").is(':checked')){ + sql1.push('"' + weekdays[i] + "lunch" + '"'); + sql2.push("'1'"); + } + } + if ($('#frmeditplanning #' + weekdays[i] + "timebegin2").val() !== $('#frmeditplanning #' + weekdays[i] + "timeend2").val()){ + sql1.push('"' + weekdays[i] + "timebegin2" + '"'); + sql1.push('"' + weekdays[i] + "timeend2" + '"'); + sql2.push(encodeparam($('#frmeditplanning #' + weekdays[i] + "timebegin2").val(), "text")); + sql2.push(encodeparam($('#frmeditplanning #' + weekdays[i] + "timeend2").val(), "text")); + } + } + if (cuuid !== '') { + appdb.dbexec("DELETE FROM planningtemplate where \"uuid\"='" + cuuid + "';"); + sql1.push('"uuid"'); + sql2.push("'"+cuuid+"'"); + }else { + sql1.push('"uuid"'); + sql2.push("'"+appdb.generate_uuid()+"'"); + } + var xsql = "INSERT INTO planningtemplate (" + sql1.join(',') + ") VALUES (" + sql2.join(',') + ");"; + //"EXEC planning SQL:"+ xsql + "\n"); + appdb.dbexec(xsql); + load_table_planningtemplate(); + $("#frmeditplanning #uuid").val("0"); + $("#edit_planning").modal('hide'); +} + +function save_group() { + var sql1 = new Array(); + var sql2 = new Array(); + var type = 'ins'; + var cuuid = ""; + + if ($("#frmeditgroups #uuid").val() != 0) { + type = 'upd'; + cuuid = $("#frmeditgroups #uuid").val(); + } + $("#frmeditgroups :input").each(function() { + var input = $(this); + if (input.attr("id")) { + if (type == 'ins') { + sql1.push('"' + input.attr("id") + '"'); + if (input.attr("id") == 'uuid') { + if (input.val() == "" || input.val() == "0") { + sql2.push("'" + appdb.generate_uuid() + "'"); + } else { + sql2.push("'" + input.val() + "'"); + } + } else { + var ival = encodeparam(input.val(), input.attr('type')); + sql2.push(ival); + } + } else { + if (input.attr("id") != 'uuid') { + var ival = encodeparam(input.val(), input.attr('type')); + sql2.push('"' + input.attr("id") + '"=' + ival); + } + } + + + } + + }); + var xsql = ""; + if (type == 'upd') { + xsql = "UPDATE groups SET " + sql2.join(',') + " where \"uuid\"='" + cuuid + "';"; + } else { + xsql = "INSERT INTO groups (" + sql1.join(',') + ") VALUES (" + sql2.join(',') + ");"; + } + + appdb.dbexec(xsql); + load_table_groups(); + $("#frmeditgroups #uuid").val("0"); + $("#edit_groups").modal('hide'); +} + +function confirm_delete_workinghours() { + $("#confirm_delete_workinghours").modal('show'); + return false; +} + +function confirm_delete_planningtemplate() { + $("#confirm_delete_planningtemplate").modal('show'); + return false; +} + +function confirm_delete_groups() { + $("#confirm_delete_groups").modal('show'); + return false; +} + + + +function delete_groups() { + + appdb.dbexec("DELETE FROM groups where uuid='" + delgroups + "';"); + delgroups = null; + load_table_groups(); + + $("#confirm_delete_groups").modal('hide'); + + return false; +} + +function delete_workinghours() { + var delsql = "DELETE FROM workinghours where uuid='" + delwkhours + "';"; + appdb.dbexec(delsql); + delwhours = null; + load_table_workinghours(); + + $("#confirm_delete_workinghours").modal('hide'); + + return false; +} + +function delete_planningtemplate() { + + appdb.dbexec("DELETE FROM planningtemplate where uuid='" + delplanning + "'"); + delplanning = null; + load_table_planningtemplate(); + + $("#confirm_delete_planningtemplate").modal('hide'); + + return false; +} + +function display_tblrow(trid) { + $('#frmeditplanning #' + trid + "time2").show(); + +} + +function hide_tblrow(trid) { + //trid.substring(0,3)+ "\n "); + $('#frmeditplanning #' + trid.substr(0,3)+"timebegin2").val("00:00"); + $('#frmeditplanning #' + trid.substr(0,3)+"timeend2").val("00:00"); + $('#frmeditplanning #' + trid).hide(); +} + +//function check_defaultdata: function(){ +// +//curcfg.loadconfig(apppref.getpreference("support.database.currentdb.num")); +//var tables = ['creche','groups','workinghours','vacancy','planningtemplate']; +//for (var t in tables) { +//var sql = "select count(*) as cnt from "+ tables[t]+";"; +// +//var res = appdb.dbquery(sql); +// +//if ((res) && (res.sqldata[0].cnt == '0')) { +// +//var inssql = []; +//if (tables[t] == 'creche') { +// inssql.push("INSERT INTO creche (crechename, adress, city, country, zip, maxchilds, uuid, minage, maxage) VALUES ('Crèche', '', '', 'Luxembourg', '', 28, '"+ curcfg.uuid +"', 2, 84);"); +//} else if (tables[t] == 'groups') { +// var sinssql = "INSERT INTO groups (grpname, maxchilds, minage, maxage, uuid) VALUES "; +// sinssql += "('Groupe Bébé', 6, 2, 12, '"+ appdb.generate_uuid() +"'),"; +// sinssql += "('Groupe plus 1 an ', 6, 12, 24, '"+ appdb.generate_uuid() +"'),"; +// sinssql += "('Groupe de 2 ans à 3 ans', 8, 24, 36, '"+ appdb.generate_uuid() +"'),"; +// sinssql += "('Groupe de 3 à 4 ans ', 8, 36, 48, '"+ appdb.generate_uuid() +"'),"; +// sinssql += "('Groupe plus 4 ans ( Scolaires)', 11, 48, 84, '"+ appdb.generate_uuid() +"');" +// inssql.push(sinssql); +//} else if (tables[t] == 'workinghours') { +// inssql.push("INSERT INTO workinghours (uuid, datestart, montimeopen, montimeclose, tuetimeopen, tuetimeclose, wedtimeopen, wedtimeclose, thutimeopen, thutimeclose, fritimeopen, fritimeclose, sattimeopen, sattimeclose, suntimeopen, suntimeclose, crecheuuid) VALUES ('"+appdb.generate_uuid()+"', strftime(\"%Y\",date('now','-1 year')) || '-01-01', '07:00', '19:00', '07:00', '19:00', '07:00', '19:00', '07:00', '19:00', '07:00', '19:00', null, null, null, null, '"+ curcfg.uuid+"');"); +// +//} +// +//else if (tables[t] == 'planningtemplate') { +// +// var sinssql = "INSERT INTO planningtemplate (uuid, montimebegin, montimeend, monlunch, tuetimebegin, tuetimeend, tuelunch, wedtimebegin, wedtimeend, wedlunch, thutimebegin, thutimeend, thulunch, fritimebegin, fritimeend, frilunch, templatename) VALUES "; +// sinssql += "('"+ appdb.generate_uuid()+"', '08:00', '18:00', 1, '08:00', '18:00', 1, '08:00', '18:00', 1, '08:00', '18:00', 1, '08:00', '18:00',1, 'plain temps (60h)'),"; +// sinssql += "('"+ appdb.generate_uuid()+"', '08:00', '13:00', 1, '08:00', '13:00', 1, '08:00', '13:00', 1, '08:00', '13:00', 1, '08:00', '13:00',1,'matin (30h)'),"; +// sinssql += "('"+ appdb.generate_uuid()+"', '13:00', '18:00', 1, '13:00', '18:00', 1, '13:00', '18:00', 1, '13:00', '18:00', 1, '13:00', '18:00',1, 'après-midi (30h)');"; +// inssql.push(sinssql); +// +//} +//for (var i in inssql){ +// +// appdb.dbexec_silent(inssql[i]); +//} +// +// +//} +//} +//} diff --git a/app_v3satdemo/chrome/content/web/js/creorga.js b/app_v3satdemo/chrome/content/web/js/creorga.js new file mode 100644 index 0000000..a927599 --- /dev/null +++ b/app_v3satdemo/chrome/content/web/js/creorga.js @@ -0,0 +1,422 @@ +//Source-code licensed under EUPL v1.1 ( Copyright 2016 By DKS s.à r.l. - Kilian Saffran - Luxembourg ) + +function check_birthdate_valid(){ + var dx = new Array; + if ($("#childs_birthday").val() == "") { + dx.push("la date de naissance"); + } + if ($("#childs_entrydate").val() == "") { + dx.push("la date d'entrée"); + } + if ($("#childs_leavedate").val() == ""){ + dx.push("la date de sortie"); + } + if (dx.length > 0) { + alert("Vous n'avez pas encore ajouté " + dx.join(", ")+" du enfant.\n"+ ((dx.length > 1)?"Ces dates sont requis":"cette date est requis")+ " pour la planification!"); + return false; + } + + return true; +} + +function daysBetween(first, second) { + + // Copy date parts of the timestamps, discarding the time parts. + var one = new Date(first.getFullYear(), first.getMonth(), first.getDate()); + var two = new Date(second.getFullYear(), second.getMonth(), second.getDate()); + + // Do the math. + var millisecondsPerDay = 1000 * 60 * 60 * 24; + var millisBetween = two.getTime() - one.getTime(); + var days = millisBetween / millisecondsPerDay; + + // Round down. + return Math.floor(days); +} + +function saveonfocusout(objname){ + if (($('#' + objname).attr('type') == "date") && ($('#' + objname).val() != '')){ + if (checkdateformat(objname) == false){ + return false; + } + + if (objname == "childs_entrydate") { + var ed = encodeparam($('#childs_entrydate').val(),'date').replace(/'/g,''); + var bd = encodeparam($('#childs_birthday').val(),'date').replace(/'/g,''); + if (ed < bd) { + errormsg("ERREUR","La date d'entrée ne peut pas être inferieur à la date de naissance!"); + return false; + } + } + if (objname == "childs_leavedate") { + var ed = encodeparam($('#childs_entrydate').val(),'date').replace(/'/g,''); + var ld = encodeparam($('#childs_leavedate').val(),'date').replace(/'/g,''); + if (ld < ed) { + errormsg("ERREUR","La date de sortie ne peut pas être inferieur à la date d'entrée!"); + return false; + } + } + + //if (objname == "childs_birthday") { + // //$("#dt_childs_entrydate").datetimepicker('setStartDate',$('#' + objname).val()); + // //$("#dt_childs_leavedate").datepicker('setStartDate',$('#' + objname).val()); + //} + //if (objname == "childs_entrydate") { + // //$("#dt_childs_leavedate").datepicker('setStartDate',$('#' + objname).val()); + //} + } + if (objname == "staff_password"){ + var pwd = $('#' + objname).val(); + if (pwd.length < 4){ + alert("Le mot de passe est trop court!"); + return false; + } + if(!confirm("Êtes vous sûre de changer le mot de passe?")){ + $('#' + objname).val(""); + return false; + } + } + if (objname == "creche_crechename") { + var num = apppref.getpreference("support.database.currentdb.num"); + var scfg = apppref.getpreference("support.database." + num); + var sitecfg = JSON.parse(scfg); + sitecfg.name=$('#' + objname).val(); + apppref.setpreference("support.database." + num,sitecfg); + globelreq.send_request({page:'updatesiteslist',data:{curname:sitecfg.name}}); + } + + if ((objname) && $('#' + objname).hasClass("dailypresence")){ + return false; + } + if ((objname) && ($('#' + objname).attr('id').indexOf("_") != -1) && $('#' + objname).attr('id').indexOf("chart_") == -1) { + var data = $('#' + objname).attr('id').split("_"); + //dump("OBJNAME: " + objname + "\n"); +// if (objname == "staff_password" ){ +// var dval=MD5($('#' + objname).val()); +// var ty = $('#' + objname).attr('type'); +// var sql = "UPDATE "+data[0]+" SET "+data[1]+"="+encodeparam(dval,ty)+" where '"+$data[4]+"'='"+ data[2] +"';"; +// //dump("SQL PWD:" + sql + "\n"); +// appdb.dbexec(sql); +// } else + if (data.length==2) { + var tagtype = $('#' + objname).attr('type'); + //dump("TAGTYPE: " + tagtype + "\n"); + if ($('#' + objname).prop("tagName") === "TEXTAREA"){ + tagtype = 'richtextarea'; + } + var sql = "UPDATE "+data[0]+" SET "+data[1]+"="+encodeparam($('#' + objname).val(),tagtype)+" where uuid='"+ document.getElementById(data[0] + '_uuid').value +"';"; + //dump("updatesql: " + sql + "\n"); + appdb.dbexec(sql); + }else if (data.length==4) { + var dval=$('#' + objname).val(); + var ty = $('#' + objname).attr('type'); + var sql = "UPDATE "+data[0]+" SET "+data[1]+"="+encodeparam(dval,ty)+" where '"+$data[4]+"'='"+ data[2] +"';"; + appdb.dbexec(sql); + }else { + return false; + } + } + return false; +} + +function encodeparam(string,type){ + if (type == "text") { + if (string == "") { + string = 'null'; + }else { + string = string.replace(//g,'>'); + string = string.replace(/&/g,'&'); + string = string.replace(/"/g,'"'); + string = string.replace(/'/g,"''"); + string = "'"+ string+"'"; + } + } + else if(type == "richtextarea"){ + string = string.replace(/'/g,"''"); + string = "'"+ string+"'"; + } + else if(type == "password"){ + if (string == "") { + string = 'null'; + }else { + //string.replace(',','.'); + string = "'"+ MD5(string)+"'"; + } + + } + else if(type == "date"){ + var re = /^(\d{1,2})\.(\d{1,2})\.(\d{4})$/i; + if (!string.match(re)) { + string = 'null'; + }else{ + var dspl=string.split('.'); + string = "'"+dspl[2]+'-'+dspl[1]+'-'+dspl[0]+"'"; + } + } + else if(type == "number"){ + if (string == "") { + string = 'null'; + }else { + string.replace(',','.'); + string = parseFloat(string); + } + }else if(type == "boolean"){ + if (string == "") { + string = 'null'; + } + string= string.replace('true',"'1'"); + string= string.replace('false',"'0'"); + }else if(type == "month"){ + var re = /^(\d{1,2})\.(\d{4})$/i; + if (!string.match(re)) { + string = 'null'; + }else{ + var dspl=string.split('.'); + string = "'"+dspl[1]+'-'+dspl[0]+"-01'" + } + }else if(type == "file"){ + string = system.getFileName(string); + string = string.replace("'","''",'g'); + string = string = "'"+ string+"'"; + } + else { + if (typeof(string) == "object") { + string = JSON.stringify(string); + } + string = string.replace(//g,'>'); + string = string.replace(/&/g,'&'); + string = string.replace(/'/g,"''"); + string = "'"+ string+"'"; + } + + return string; +} + +function checkdateformat(fieldname){ + var re = null; + var plh = $('#' + fieldname).attr("placeholder"); + var val = $('#' + fieldname).val(); + if (plh == 'dd.mm.yyyy') { + re = /^\d{1,2}\.\d{1,2}\.\d{4}$/; + }else if (plh == 'mm.yyyy') { + re = /^\d{1,2}\.\d{4}$/; + }else { + return true; + } + if (!val.match(re)) { + errormsg("ERREUR format date!","Le format de la date n'est pas correcte!
      il doit être " + plh); + return false; + } + return true; +} + + +function errormsg(title,msg){ + $("#errtitle").html(title); + $("#errmsg").html(msg); + $("#dlgerror").modal('show'); +} + +//function sqlerrormsg(sqlquery){ +// //dump("Load Resend:" + sqlquery + "\n"); +// $("#sqlquery").val(sqlquery); +// $("#dlgsqlerror").modal('show'); +//} +// +//function resendsql(){ +// $("#dlgsqlerror").modal('hide'); +// +// //dump("Resend: "+$("#sqlquery").val()+"\n"); +// var r = appdb.dbexec($("#sqlquery").val()); +// if (!r){ +// sqlerrormsg($("#sqlquery").val()); +// }else { +// $("#sqlquery").val(""); +// $("#dlgsqlerror").modal('hide'); +// } +//} + +function loadtextareas(eheight=200){ + + $('.summernote').summernote({ + lang: 'fr-FR', + toolbar: [ + ['style', ['bold', 'italic', 'underline']], + ['font', ['strikethrough', 'superscript', 'subscript']], + ['fontsize', ['fontsize'],['color']], + ['color', ['color']], + ['para', ['ul', 'ol', 'paragraph']], + ['reset',['clear']] + ], + height: eheight, + minHeight: eheight, + maxHeight: eheight, + shortcuts: false, + disableResizeEditor: true, + disableDragAndDrop: true, + callbacks: { + onBlur: function() { + saveonfocusout($(this).attr('id')); + } + } + }); +} + + +function load_helpers(){ + $('input').focusout(function(){ + + if ($(this).attr('type') == 'number') { + //alert('number'); + if ($(this).attr('nullable') && $(this).attr('nullable') === 'false' && $(this).val() === "") { + $(this).val($(this).attr('min')); + } + } + saveonfocusout($(this).attr('id')); + }); + $("input[type='number']").on('keypress', function(ev){ + + var keycode = window.event ? ev.keyCode : ev.which; + if (keycode < 48 || keycode > 57){ + if (keycode !== 0 && keycode !== 8 && keycode !== 13 && !ev.ctrlKey && keycode !== 46 && keycode !== 44) { + ev.preventDefault(); + } + } + }); + + + $(".input-group.date input[type='date']").each(function(){ + //dump("init dtp " + this.id + "\n"); + var dateobjid = this.id; + if ($('#' + dateobjid).attr('limits') == '1'){ + $('#' + dateobjid).datetimepicker({ + locale: 'fr', + format: "DD.MM.YYYY", + daysOfWeekDisabled: [0,6] + }); + } else if ($('#' + dateobjid).attr('widgetpos')){ + $('#' + dateobjid).datetimepicker({ + locale: 'fr', + format: "DD.MM.YYYY", + widgetPositioning:{ + horizontal: 'auto', + vertical: $('#' + dateobjid).attr('widgetpos') + } + }); + + }else { + $('#' + dateobjid).datetimepicker({ + locale: 'fr', + format: "DD.MM.YYYY", + }); + } + + }); + //dump("load month helper\n"); + $(".input-group.month input[type='date']").datetimepicker({ + locale: 'fr', + format: 'MM.YYYY', + viewMode:'months' + }); + //dump("load week helper\n"); + $(".input-group.week input[type='date']").datetimepicker({ + locale: 'fr', + format: "DD.MM.YYYY", + calendarWeeks: true, + daysOfWeekDisabled: [0,2,3,4,5,6], + }); + + $('.timepicker').timepicker({ + showSeconds: false, + showMeridian: false, + defaultTime: '00:00', + }); + $('.timepicker').attr("style","width: 70px;"); + + $.fn.dataTableExt.sErrMode='throw'; +} + +function set_infoheader(strinfoheader) { + globelreq.send_request({page:'infoheader',header:strinfoheader}); +} + +var globelreq = { + send_request: function(data, callback) { // analogue of chrome.extension.sendRequest + var request = document.createTextNode(JSON.stringify(data)); + + request.addEventListener("creorga-response", function(event) { + request.parentNode.removeChild(request); + + if (callback) { + var response = JSON.parse(request.nodeValue); + callback(response); + } + }, false); + + document.head.appendChild(request); + + var event = document.createEvent("HTMLEvents"); + event.initEvent("creorga-query", true, false); + request.dispatchEvent(event); + }, + + callback: function(response) { + return alert("response: " + (response ? response.toSource() : response)); + } + } + +$(document).ready(function() { + + initdata(); + $('body').append(''); +// $('body').append(''); +}); + + +function htmlUnescape(str){ + var nstr = str + .replace(/&/g, '&') + .replace(/"/g, '"') + .replace(/"/g, '"') + .replace(/'/g, "'") + .replace(/</g, '<') + .replace(/>/g, '>'); + return nstr; +} + +jQuery.fn.exists = function(){ return this.length > 0; } + + diff --git a/app_v3satdemo/chrome/content/web/js/datatables.min.js b/app_v3satdemo/chrome/content/web/js/datatables.min.js new file mode 100644 index 0000000..5a5ee6d --- /dev/null +++ b/app_v3satdemo/chrome/content/web/js/datatables.min.js @@ -0,0 +1,372 @@ +/* + * This combined file was created by the DataTables downloader builder: + * https://datatables.net/download + * + * To rebuild or modify this file with the latest versions of the included + * software please visit: + * https://datatables.net/download/#dt/dt-1.10.9,af-2.0.0,b-1.0.3,b-colvis-1.0.3,cr-1.2.0,fc-3.1.0,fh-3.0.0,sc-1.3.0,se-1.0.1 + * + * Included libraries: + * DataTables 1.10.9, AutoFill 2.0.0, Buttons 1.0.3, Column visibility 1.0.3, ColReorder 1.2.0, FixedColumns 3.1.0, FixedHeader 3.0.0, Scroller 1.3.0, Select 1.0.1 + */ + +/*! + DataTables 1.10.9 + ©2008-2015 SpryMedia Ltd - datatables.net/license +*/ +(function(Fa,T,k){var S=function(h){function X(a){var b,c,d={};h.each(a,function(e){if((b=e.match(/^([^A-Z]+?)([A-Z])/))&&-1!=="a aa ai ao as b fn i m o s ".indexOf(b[1]+" "))c=e.replace(b[0],b[2].toLowerCase()),d[c]=e,"o"===b[1]&&X(a[e])});a._hungarianMap=d}function I(a,b,c){a._hungarianMap||X(a);var d;h.each(b,function(e){d=a._hungarianMap[e];if(d!==k&&(c||b[d]===k))"o"===d.charAt(0)?(b[d]||(b[d]={}),h.extend(!0,b[d],b[e]),I(a[d],b[d],c)):b[d]=b[e]})}function S(a){var b=m.defaults.oLanguage,c=a.sZeroRecords; +!a.sEmptyTable&&(c&&"No data available in table"===b.sEmptyTable)&&F(a,a,"sZeroRecords","sEmptyTable");!a.sLoadingRecords&&(c&&"Loading..."===b.sLoadingRecords)&&F(a,a,"sZeroRecords","sLoadingRecords");a.sInfoThousands&&(a.sThousands=a.sInfoThousands);(a=a.sDecimal)&&cb(a)}function db(a){A(a,"ordering","bSort");A(a,"orderMulti","bSortMulti");A(a,"orderClasses","bSortClasses");A(a,"orderCellsTop","bSortCellsTop");A(a,"order","aaSorting");A(a,"orderFixed","aaSortingFixed");A(a,"paging","bPaginate"); +A(a,"pagingType","sPaginationType");A(a,"pageLength","iDisplayLength");A(a,"searching","bFilter");"boolean"===typeof a.sScrollX&&(a.sScrollX=a.sScrollX?"100%":"");if(a=a.aoSearchCols)for(var b=0,c=a.length;b").css({position:"fixed",top:0,left:0,height:1,width:1,overflow:"hidden"}).append(h("
      ").css({position:"absolute",top:1,left:1,width:100,overflow:"scroll"}).append(h("
      ").css({width:"100%",height:10}))).appendTo("body"),d=c.children(),e=d.children();b.barWidth=d[0].offsetWidth-d[0].clientWidth;b.bScrollOversize=100===e[0].offsetWidth&&100!==d[0].clientWidth;b.bScrollbarLeft=1!==Math.round(e.offset().left);b.bBounding=c[0].getBoundingClientRect().width?!0:!1;c.remove()}h.extend(a.oBrowser, +m.__browser);a.oScroll.iBarWidth=m.__browser.barWidth}function gb(a,b,c,d,e,f){var g,i=!1;c!==k&&(g=c,i=!0);for(;d!==e;)a.hasOwnProperty(d)&&(g=i?b(g,a[d],d,a):a[d],i=!0,d+=f);return g}function Ga(a,b){var c=m.defaults.column,d=a.aoColumns.length,c=h.extend({},m.models.oColumn,c,{nTh:b?b:T.createElement("th"),sTitle:c.sTitle?c.sTitle:b?b.innerHTML:"",aDataSort:c.aDataSort?c.aDataSort:[d],mData:c.mData?c.mData:d,idx:d});a.aoColumns.push(c);c=a.aoPreSearchCols;c[d]=h.extend({},m.models.oSearch,c[d]); +la(a,d,h(b).data())}function la(a,b,c){var b=a.aoColumns[b],d=a.oClasses,e=h(b.nTh);if(!b.sWidthOrig){b.sWidthOrig=e.attr("width")||null;var f=(e.attr("style")||"").match(/width:\s*(\d+[pxem%]+)/);f&&(b.sWidthOrig=f[1])}c!==k&&null!==c&&(eb(c),I(m.defaults.column,c),c.mDataProp!==k&&!c.mData&&(c.mData=c.mDataProp),c.sType&&(b._sManualType=c.sType),c.className&&!c.sClass&&(c.sClass=c.className),h.extend(b,c),F(b,c,"sWidth","sWidthOrig"),c.iDataSort!==k&&(b.aDataSort=[c.iDataSort]),F(b,c,"aDataSort")); +var g=b.mData,i=P(g),j=b.mRender?P(b.mRender):null,c=function(a){return"string"===typeof a&&-1!==a.indexOf("@")};b._bAttrSrc=h.isPlainObject(g)&&(c(g.sort)||c(g.type)||c(g.filter));b.fnGetData=function(a,b,c){var d=i(a,b,k,c);return j&&b?j(d,b,a,c):d};b.fnSetData=function(a,b,c){return Q(g)(a,b,c)};"number"!==typeof g&&(a._rowReadObject=!0);a.oFeatures.bSort||(b.bSortable=!1,e.addClass(d.sSortableNone));a=-1!==h.inArray("asc",b.asSorting);c=-1!==h.inArray("desc",b.asSorting);!b.bSortable||!a&&!c? +(b.sSortingClass=d.sSortableNone,b.sSortingClassJUI=""):a&&!c?(b.sSortingClass=d.sSortableAsc,b.sSortingClassJUI=d.sSortJUIAscAllowed):!a&&c?(b.sSortingClass=d.sSortableDesc,b.sSortingClassJUI=d.sSortJUIDescAllowed):(b.sSortingClass=d.sSortable,b.sSortingClassJUI=d.sSortJUI)}function Y(a){if(!1!==a.oFeatures.bAutoWidth){var b=a.aoColumns;Ha(a);for(var c=0,d=b.length;cr[f])d(l.length+r[f],n);else if("string"===typeof r[f]){i=0; +for(j=l.length;ib&&a[e]--; -1!=d&&c===k&&a.splice(d,1)}function ea(a,b,c,d){var e=a.aoData[b],f,g=function(c,d){for(;c.childNodes.length;)c.removeChild(c.firstChild); +c.innerHTML=B(a,b,d,"display")};if("dom"===c||(!c||"auto"===c)&&"dom"===e.src)e._aData=Ka(a,e,d,d===k?k:e._aData).data;else{var i=e.anCells;if(i)if(d!==k)g(i[d],d);else{c=0;for(f=i.length;c").appendTo(g)); +b=0;for(c=l.length;btr").attr("role","row");h(g).find(">tr>th, >tr>td").addClass(n.sHeaderTH);h(i).find(">tr>th, >tr>td").addClass(n.sFooterTH);if(null!==i){a=a.aoFooter[0];b=0;for(c=a.length;b< +c;b++)f=l[b],f.nTf=a[b].cell,f.sClass&&h(f.nTf).addClass(f.sClass)}}function ga(a,b,c){var d,e,f,g=[],i=[],j=a.aoColumns.length,n;if(b){c===k&&(c=!1);d=0;for(e=b.length;d=a.fnRecordsDisplay()?0:g,a.iInitDisplayStart=-1);var g=a._iDisplayStart,n=a.fnDisplayEnd(); +if(a.bDeferLoading)a.bDeferLoading=!1,a.iDraw++,C(a,!1);else if(i){if(!a.bDestroying&&!lb(a))return}else a.iDraw++;if(0!==j.length){f=i?a.aoData.length:n;for(i=i?0:g;i",{"class":e?d[0]:""}).append(h("
      ",{valign:"top",colSpan:ca(a),"class":a.oClasses.sRowEmpty}).html(c))[0];w(a,"aoHeaderCallback","header",[h(a.nTHead).children("tr")[0],Ma(a),g,n,j]);w(a,"aoFooterCallback","footer",[h(a.nTFoot).children("tr")[0],Ma(a),g,n,j]);d=h(a.nTBody);d.children().detach();d.append(h(b));w(a,"aoDrawCallback","draw",[a]);a.bSorted=!1;a.bFiltered=!1;a.bDrawing=!1}}function R(a,b){var c=a.oFeatures,d=c.bFilter;c.bSort&&mb(a);d?ha(a,a.oPreviousSearch):a.aiDisplay= +a.aiDisplayMaster.slice();!0!==b&&(a._iDisplayStart=0);a._drawHold=b;M(a);a._drawHold=!1}function nb(a){var b=a.oClasses,c=h(a.nTable),c=h("
      ").insertBefore(c),d=a.oFeatures,e=h("
      ",{id:a.sTableId+"_wrapper","class":b.sWrapper+(a.nTFoot?"":" "+b.sNoFooter)});a.nHolding=c[0];a.nTableWrapper=e[0];a.nTableReinsertBefore=a.nTable.nextSibling;for(var f=a.sDom.split(""),g,i,j,n,l,r,q=0;q")[0];n=f[q+1];if("'"==n||'"'==n){l="";for(r=2;f[q+r]!=n;)l+= +f[q+r],r++;"H"==l?l=b.sJUIHeader:"F"==l&&(l=b.sJUIFooter);-1!=l.indexOf(".")?(n=l.split("."),j.id=n[0].substr(1,n[0].length-1),j.className=n[1]):"#"==l.charAt(0)?j.id=l.substr(1,l.length-1):j.className=l;q+=r}e.append(j);e=h(j)}else if(">"==i)e=e.parent();else if("l"==i&&d.bPaginate&&d.bLengthChange)g=ob(a);else if("f"==i&&d.bFilter)g=pb(a);else if("r"==i&&d.bProcessing)g=qb(a);else if("t"==i)g=rb(a);else if("i"==i&&d.bInfo)g=sb(a);else if("p"==i&&d.bPaginate)g=tb(a);else if(0!==m.ext.feature.length){j= +m.ext.feature;r=0;for(n=j.length;r',i=d.sSearch,i=i.match(/_INPUT_/)?i.replace("_INPUT_",g):i+g,b=h("
      ",{id:!f.f?c+"_filter":null,"class":b.sFilter}).append(h("
      ").addClass(b.sLength); +a.aanFeatures.l||(j[0].id=c+"_length");j.children().append(a.oLanguage.sLengthMenu.replace("_MENU_",e[0].outerHTML));h("select",j).val(a._iDisplayLength).bind("change.DT",function(){Ra(a,h(this).val());M(a)});h(a.nTable).bind("length.dt.DT",function(b,c,d){a===c&&h("select",j).val(d)});return j[0]}function tb(a){var b=a.sPaginationType,c=m.ext.pager[b],d="function"===typeof c,e=function(a){M(a)},b=h("
      ").addClass(a.oClasses.sPaging+b)[0],f=a.aanFeatures;d||c.fnInit(a,b,e);f.p||(b.id=a.sTableId+ +"_paginate",a.aoDrawCallback.push({fn:function(a){if(d){var b=a._iDisplayStart,j=a._iDisplayLength,h=a.fnRecordsDisplay(),l=-1===j,b=l?0:Math.ceil(b/j),j=l?1:Math.ceil(h/j),h=c(b,j),k,l=0;for(k=f.p.length;lf&&(d=0)):"first"==b?d=0:"previous"==b?(d=0<=e?d-e:0,0>d&&(d=0)):"next"== +b?d+e",{id:!a.aanFeatures.r?a.sTableId+"_processing":null,"class":a.oClasses.sProcessing}).html(a.oLanguage.sProcessing).insertBefore(a.nTable)[0]}function C(a,b){a.oFeatures.bProcessing&&h(a.aanFeatures.r).css("display",b?"block":"none");w(a,null,"processing",[a,b])}function rb(a){var b=h(a.nTable);b.attr("role", +"grid");var c=a.oScroll;if(""===c.sX&&""===c.sY)return a.nTable;var d=c.sX,e=c.sY,f=a.oClasses,g=b.children("caption"),i=g.length?g[0]._captionSide:null,j=h(b[0].cloneNode(!1)),n=h(b[0].cloneNode(!1)),l=b.children("tfoot");c.sX&&"100%"===b.attr("width")&&b.removeAttr("width");l.length||(l=null);j=h("
      ",{"class":f.sScrollWrapper}).append(h("
      ",{"class":f.sScrollHead}).css({overflow:"hidden",position:"relative",border:0,width:d?!d?null:u(d):"100%"}).append(h("
      ",{"class":f.sScrollHeadInner}).css({"box-sizing":"content-box", +width:c.sXInner||"100%"}).append(j.removeAttr("id").css("margin-left",0).append("top"===i?g:null).append(b.children("thead"))))).append(h("
      ",{"class":f.sScrollBody}).css({position:"relative",overflow:"auto",width:!d?null:u(d)}).append(b));l&&j.append(h("
      ",{"class":f.sScrollFoot}).css({overflow:"hidden",border:0,width:d?!d?null:u(d):"100%"}).append(h("
      ",{"class":f.sScrollFootInner}).append(n.removeAttr("id").css("margin-left",0).append("bottom"===i?g:null).append(b.children("tfoot"))))); +var b=j.children(),k=b[0],f=b[1],q=l?b[2]:null;if(d)h(f).on("scroll.DT",function(){var a=this.scrollLeft;k.scrollLeft=a;l&&(q.scrollLeft=a)});h(f).css(e&&c.bCollapse?"max-height":"height",e);a.nScrollHead=k;a.nScrollBody=f;a.nScrollFoot=q;a.aoDrawCallback.push({fn:Z,sName:"scrolling"});return j[0]}function Z(a){var b=a.oScroll,c=b.sX,d=b.sXInner,e=b.sY,b=b.iBarWidth,f=h(a.nScrollHead),g=f[0].style,i=f.children("div"),j=i[0].style,n=i.children("table"),i=a.nScrollBody,l=h(i),k=i.style,q=h(a.nScrollFoot).children("div"), +m=q.children("table"),o=h(a.nTHead),E=h(a.nTable),p=E[0],t=p.style,N=a.nTFoot?h(a.nTFoot):null,Eb=a.oBrowser,w=Eb.bScrollOversize,s,v,O,x,y=[],z=[],A=[],B,C=function(a){a=a.style;a.paddingTop="0";a.paddingBottom="0";a.borderTopWidth="0";a.borderBottomWidth="0";a.height=0};E.children("thead, tfoot").remove();x=o.clone().prependTo(E);o=o.find("tr");v=x.find("tr");x.find("th, td").removeAttr("tabindex");N&&(O=N.clone().prependTo(E),s=N.find("tr"),O=O.find("tr"));c||(k.width="100%",f[0].style.width="100%"); +h.each(qa(a,x),function(b,c){B=$(a,b);c.style.width=a.aoColumns[B].sWidth});N&&H(function(a){a.style.width=""},O);f=E.outerWidth();if(""===c){t.width="100%";if(w&&(E.find("tbody").height()>i.offsetHeight||"scroll"==l.css("overflow-y")))t.width=u(E.outerWidth()-b);f=E.outerWidth()}else""!==d&&(t.width=u(d),f=E.outerWidth());H(C,v);H(function(a){A.push(a.innerHTML);y.push(u(h(a).css("width")))},v);H(function(a,b){a.style.width=y[b]},o);h(v).height(0);N&&(H(C,O),H(function(a){z.push(u(h(a).css("width")))}, +O),H(function(a,b){a.style.width=z[b]},s),h(O).height(0));H(function(a,b){a.innerHTML='
      '+A[b]+"
      ";a.style.width=y[b]},v);N&&H(function(a,b){a.innerHTML="";a.style.width=z[b]},O);if(E.outerWidth()i.offsetHeight||"scroll"==l.css("overflow-y")?f+b:f;if(w&&(i.scrollHeight>i.offsetHeight||"scroll"==l.css("overflow-y")))t.width=u(s-b);(""===c||""!==d)&&J(a,1,"Possible column misalignment",6)}else s="100%";k.width= +u(s);g.width=u(s);N&&(a.nScrollFoot.style.width=u(s));!e&&w&&(k.height=u(p.offsetHeight+b));c=E.outerWidth();n[0].style.width=u(c);j.width=u(c);d=E.height()>i.clientHeight||"scroll"==l.css("overflow-y");e="padding"+(Eb.bScrollbarLeft?"Left":"Right");j[e]=d?b+"px":"0px";N&&(m[0].style.width=u(c),q[0].style.width=u(c),q[0].style[e]=d?b+"px":"0px");l.scroll();if((a.bSorted||a.bFiltered)&&!a._drawHold)i.scrollTop=0}function H(a,b,c){for(var d=0,e=0,f=b.length,g,i;e").appendTo(i.find("tbody"));i.find("thead, tfoot").remove();i.append(h(a.nTHead).clone()).append(h(a.nTFoot).clone());i.find("tfoot th, tfoot td").css("width","");n=qa(a,i.find("thead")[0]);for(m=0;m").css(f||e?{position:"absolute",top:0,left:0,height:1,right:0,overflow:"hidden"}:{}).append(i).appendTo(k);f&&g?i.width(g):f?(i.css("width","auto"),i.width()").css("width", +u(a)).appendTo(b||T.body),d=c[0].offsetWidth;c.remove();return d}function Gb(a,b){var c=Hb(a,b);if(0>c)return null;var d=a.aoData[c];return!d.nTr?h("
      ").html(B(a,c,b,"display"))[0]:d.anCells[b]}function Hb(a,b){for(var c,d=-1,e=-1,f=0,g=a.aoData.length;fd&&(d=c.length,e=f);return e}function u(a){return null===a?"0px":"number"==typeof a?0>a?"0px":a+"px":a.match(/\d$/)?a+"px":a}function V(a){var b,c,d=[],e=a.aoColumns,f,g,i,j;b=a.aaSortingFixed; +c=h.isPlainObject(b);var n=[];f=function(a){a.length&&!h.isArray(a[0])?n.push(a):h.merge(n,a)};h.isArray(b)&&f(b);c&&b.pre&&f(b.pre);f(a.aaSorting);c&&b.post&&f(b.post);for(a=0;ae?1:0,0!==c)return"asc"===i.dir?c:-c;c=d[a];e=d[b];return ce?1:0}):j.sort(function(a,b){var c,g,i,j,k=h.length,m=f[a]._aSortData,p=f[b]._aSortData;for(i=0;ig?1:0})}a.bSorted=!0}function Jb(a){for(var b,c,d=a.aoColumns,e=V(a),a=a.oLanguage.oAria,f=0,g=d.length;f/g,"");var j=c.nTh;j.removeAttribute("aria-sort");c.bSortable&&(0e?e+1:3));e=0; +for(f=d.length;ee?e+1:3))}a.aLastSort=d}function Ib(a,b){var c=a.aoColumns[b],d=m.ext.order[c.sSortDataType],e;d&&(e=d.call(a.oInstance,a,b,ba(a,b)));for(var f,g=m.ext.type.order[c.sType+"-pre"],i=0,h=a.aoData.length;i=d.length?[0,c[1]]:c)}));e.search!==k&&h.extend(a.oPreviousSearch,Bb(e.search));b=0;for(c=e.columns.length;b=c&&(b=c-d);b-=b%d;if(-1===d||0>b)b=0;a._iDisplayStart=b}function Pa(a,b){var c=a.renderer,d=m.ext.renderer[b];return h.isPlainObject(c)&&c[b]?d[c[b]]||d._:"string"=== +typeof c?d[c]||d._:d._}function y(a){return a.oFeatures.bServerSide?"ssp":a.ajax||a.sAjaxSource?"ajax":"dom"}function Aa(a,b){var c=[],c=Mb.numbers_length,d=Math.floor(c/2);b<=c?c=W(0,b):a<=d?(c=W(0,c-2),c.push("ellipsis"),c.push(b-1)):(a>=b-1-d?c=W(b-(c-2),b):(c=W(a-d+2,a+d-1),c.push("ellipsis"),c.push(b-1)),c.splice(0,0,"ellipsis"),c.splice(0,0,0));c.DT_el="span";return c}function cb(a){h.each({num:function(b){return Ba(b,a)},"num-fmt":function(b){return Ba(b,a,Wa)},"html-num":function(b){return Ba(b, +a,Ca)},"html-num-fmt":function(b){return Ba(b,a,Ca,Wa)}},function(b,c){v.type.order[b+a+"-pre"]=c;b.match(/^html\-/)&&(v.type.search[b+a]=v.type.search.html)})}function Nb(a){return function(){var b=[za(this[m.ext.iApiIndex])].concat(Array.prototype.slice.call(arguments));return m.ext.internal[a].apply(this,b)}}var m,v,t,p,s,Xa={},Ob=/[\r\n]/g,Ca=/<.*?>/g,ac=/^[\w\+\-]/,bc=/[\w\+\-]$/,Yb=RegExp("(\\/|\\.|\\*|\\+|\\?|\\||\\(|\\)|\\[|\\]|\\{|\\}|\\\\|\\$|\\^|\\-)","g"),Wa=/[',$£€¥%\u2009\u202F\u20BD\u20a9\u20BArfk]/gi, +K=function(a){return!a||!0===a||"-"===a?!0:!1},Pb=function(a){var b=parseInt(a,10);return!isNaN(b)&&isFinite(a)?b:null},Qb=function(a,b){Xa[b]||(Xa[b]=RegExp(va(b),"g"));return"string"===typeof a&&"."!==b?a.replace(/\./g,"").replace(Xa[b],"."):a},Ya=function(a,b,c){var d="string"===typeof a;if(K(a))return!0;b&&d&&(a=Qb(a,b));c&&d&&(a=a.replace(Wa,""));return!isNaN(parseFloat(a))&&isFinite(a)},Rb=function(a,b,c){return K(a)?!0:!(K(a)||"string"===typeof a)?null:Ya(a.replace(Ca,""),b,c)?!0:null},D=function(a, +b,c){var d=[],e=0,f=a.length;if(c!==k)for(;e")[0],Zb=wa.textContent!==k,$b=/<.*?>/g;m=function(a){this.$=function(a,b){return this.api(!0).$(a,b)};this._=function(a,b){return this.api(!0).rows(a,b).data()};this.api=function(a){return a?new t(za(this[v.iApiIndex])):new t(this)};this.fnAddData=function(a,b){var c=this.api(!0),d=h.isArray(a)&&(h.isArray(a[0])||h.isPlainObject(a[0]))? +c.rows.add(a):c.row.add(a);(b===k||b)&&c.draw();return d.flatten().toArray()};this.fnAdjustColumnSizing=function(a){var b=this.api(!0).columns.adjust(),c=b.settings()[0],d=c.oScroll;a===k||a?b.draw(!1):(""!==d.sX||""!==d.sY)&&Z(c)};this.fnClearTable=function(a){var b=this.api(!0).clear();(a===k||a)&&b.draw()};this.fnClose=function(a){this.api(!0).row(a).child.hide()};this.fnDeleteRow=function(a,b,c){var d=this.api(!0),a=d.rows(a),e=a.settings()[0],h=e.aoData[a[0][0]];a.remove();b&&b.call(this,e,h); +(c===k||c)&&d.draw();return h};this.fnDestroy=function(a){this.api(!0).destroy(a)};this.fnDraw=function(a){this.api(!0).draw(a)};this.fnFilter=function(a,b,c,d,e,h){e=this.api(!0);null===b||b===k?e.search(a,c,d,h):e.column(b).search(a,c,d,h);e.draw()};this.fnGetData=function(a,b){var c=this.api(!0);if(a!==k){var d=a.nodeName?a.nodeName.toLowerCase():"";return b!==k||"td"==d||"th"==d?c.cell(a,b).data():c.row(a).data()||null}return c.data().toArray()};this.fnGetNodes=function(a){var b=this.api(!0); +return a!==k?b.row(a).node():b.rows().nodes().flatten().toArray()};this.fnGetPosition=function(a){var b=this.api(!0),c=a.nodeName.toUpperCase();return"TR"==c?b.row(a).index():"TD"==c||"TH"==c?(a=b.cell(a).index(),[a.row,a.columnVisible,a.column]):null};this.fnIsOpen=function(a){return this.api(!0).row(a).child.isShown()};this.fnOpen=function(a,b,c){return this.api(!0).row(a).child(b,c).show().child()[0]};this.fnPageChange=function(a,b){var c=this.api(!0).page(a);(b===k||b)&&c.draw(!1)};this.fnSetColumnVis= +function(a,b,c){a=this.api(!0).column(a).visible(b);(c===k||c)&&a.columns.adjust().draw()};this.fnSettings=function(){return za(this[v.iApiIndex])};this.fnSort=function(a){this.api(!0).order(a).draw()};this.fnSortListener=function(a,b,c){this.api(!0).order.listener(a,b,c)};this.fnUpdate=function(a,b,c,d,e){var h=this.api(!0);c===k||null===c?h.row(b).data(a):h.cell(b,c).data(a);(e===k||e)&&h.columns.adjust();(d===k||d)&&h.draw();return 0};this.fnVersionCheck=v.fnVersionCheck;var b=this,c=a===k,d=this.length; +c&&(a={});this.oApi=this.internal=v.internal;for(var e in m.ext.internal)e&&(this[e]=Nb(e));this.each(function(){var e={},e=1t<"F"ip>'),o.renderer)?h.isPlainObject(o.renderer)&&!o.renderer.header&&(o.renderer.header="jqueryui"):o.renderer="jqueryui":h.extend(j,m.ext.classes,e.oClasses);r.addClass(j.sTable);o.iInitDisplayStart===k&&(o.iInitDisplayStart=e.iDisplayStart,o._iDisplayStart=e.iDisplayStart);null!==e.iDeferLoading&&(o.bDeferLoading=!0,g=h.isArray(e.iDeferLoading),o._iRecordsDisplay=g?e.iDeferLoading[0]:e.iDeferLoading, +o._iRecordsTotal=g?e.iDeferLoading[1]:e.iDeferLoading);var t=o.oLanguage;h.extend(!0,t,e.oLanguage);""!==t.sUrl&&(h.ajax({dataType:"json",url:t.sUrl,success:function(a){S(a);I(l.oLanguage,a);h.extend(true,t,a);ia(o)},error:function(){ia(o)}}),n=!0);null===e.asStripeClasses&&(o.asStripeClasses=[j.sStripeOdd,j.sStripeEven]);var g=o.asStripeClasses,s=r.children("tbody").find("tr").eq(0);-1!==h.inArray(!0,h.map(g,function(a){return s.hasClass(a)}))&&(h("tbody tr",this).removeClass(g.join(" ")),o.asDestroyStripes= +g.slice());q=[];g=this.getElementsByTagName("thead");0!==g.length&&(fa(o.aoHeader,g[0]),q=qa(o));if(null===e.aoColumns){p=[];g=0;for(i=q.length;g").appendTo(this));o.nTHead=i[0];i=r.children("tbody");0===i.length&&(i=h("
       
      a",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function ab(){return!0}function bb(){return!1}function cb(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h]","i"),hb=/^\s+/,ib=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,jb=/<([\w:]+)/,kb=/
      ","
      "],tr:[2,"","
      "],col:[2,"","
      "],td:[3,"","
      "],_default:k.htmlSerialize?[0,"",""]:[1,"X
      ","
      "]},sb=db(y),tb=sb.appendChild(y.createElement("div"));rb.optgroup=rb.option,rb.tbody=rb.tfoot=rb.colgroup=rb.caption=rb.thead,rb.th=rb.td;function ub(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ub(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function vb(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wb(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xb(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function yb(a){var b=pb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function zb(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Ab(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Bb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xb(b).text=a.text,yb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!gb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(tb.innerHTML=a.outerHTML,tb.removeChild(f=tb.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ub(f),h=ub(a),g=0;null!=(e=h[g]);++g)d[g]&&Bb(e,d[g]);if(b)if(c)for(h=h||ub(a),d=d||ub(f),g=0;null!=(e=h[g]);g++)Ab(e,d[g]);else Ab(a,f);return d=ub(f,"script"),d.length>0&&zb(d,!i&&ub(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=db(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(lb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(jb.exec(f)||["",""])[1].toLowerCase(),l=rb[i]||rb._default,h.innerHTML=l[1]+f.replace(ib,"<$1>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&hb.test(f)&&p.push(b.createTextNode(hb.exec(f)[0])),!k.tbody){f="table"!==i||kb.test(f)?""!==l[1]||kb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ub(p,"input"),vb),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ub(o.appendChild(f),"script"),g&&zb(h),c)){e=0;while(f=h[e++])ob.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ub(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&zb(ub(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ub(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fb,""):void 0;if(!("string"!=typeof a||mb.test(a)||!k.htmlSerialize&&gb.test(a)||!k.leadingWhitespace&&hb.test(a)||rb[(jb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ib,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ub(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ub(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&nb.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ub(i,"script"),xb),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ub(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,yb),j=0;f>j;j++)d=g[j],ob.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qb,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Cb,Db={};function Eb(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fb(a){var b=y,c=Db[a];return c||(c=Eb(a,b),"none"!==c&&c||(Cb=(Cb||m("