commit fe00b0e401d108ebd9eda44bbc4f9201e5b1a0f1 Author: snipe Date: Fri Mar 25 01:18:05 2016 -0700 Version 3 - hold onto your butts diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000000..23ec116755 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,5 @@ +.git +.dockerignore +app/storage/logs/* +app/storage/views/* +vendor/* diff --git a/.env.example b/.env.example new file mode 100644 index 0000000000..893657f01f --- /dev/null +++ b/.env.example @@ -0,0 +1,75 @@ +# -------------------------------------------- +# REQUIRED: BASIC APP SETTINGS +# -------------------------------------------- +APP_ENV=production +APP_DEBUG=false +APP_KEY=ChangeMe +APP_URL=null +APP_TIMEZONE='US/Pacific' +APP_LOCALE=en + + +# -------------------------------------------- +# REQUIRED: DATABASE SETTINGS +# -------------------------------------------- +DB_CONNECTION=mysql +DB_HOST=localhost +DB_DATABASE=null +DB_USERNAME=null +DB_PASSWORD=null + + +# -------------------------------------------- +# REQUIRED: OUTGOING MAIL SERVER SETTINGS +# -------------------------------------------- +MAIL_DRIVER=smtp +MAIL_HOST=email-smtp.us-west-2.amazonaws.com +MAIL_PORT=587 +MAIL_USERNAME=YOURUSERNAME +MAIL_PASSWORD=YOURPASSWORD +MAIL_ENCRYPTION=null +MAIL_FROM_ADDR=you@example.com +MAIL_FROM_NAME=Snipe-IT + + +# -------------------------------------------- +# REQUIRED: IMAGE LIBRARY +# This should be gd or imagick +# -------------------------------------------- +IMAGE_LIB=gd + + +# -------------------------------------------- +# OPTIONAL: SESSION SETTINGS +# -------------------------------------------- +SESSION_LIFETIME=12000 +EXPIRE_ON_CLOSE=false +ENCRYPT=false +COOKIE_NAME=snipeit_session +COOKIE_DOMAIN=null +SECURE_COOKIES=false + + +# -------------------------------------------- +# OPTIONAL: CACHE SETTINGS +# -------------------------------------------- +CACHE_DRIVER=file +SESSION_DRIVER=file +QUEUE_DRIVER=sync + + +# -------------------------------------------- +# OPTIONAL: AWS S3 SETTINGS +# -------------------------------------------- +AWS_SECRET=null +AWS_KEY=null +AWS_REGION=null +AWS_BUCKET=null + + +# -------------------------------------------- +# OPTIONAL: MISC +# -------------------------------------------- +APP_LOG=single +APP_LOCKED=false +FILESYSTEM_DISK=local diff --git a/.env.testing b/.env.testing new file mode 100644 index 0000000000..0bcc9aeed3 --- /dev/null +++ b/.env.testing @@ -0,0 +1,71 @@ +# -------------------------------------------- +# REQUIRED: BASIC APP SETTINGS +# -------------------------------------------- +APP_ENV=testing-ci +APP_DEBUG=true +APP_KEY=ChangeMe +APP_URL=null +APP_TIMEZONE='US/Pacific' +APP_LOCALE=en +FILESYSTEM_DISK=local + +# -------------------------------------------- +# REQUIRED: DATABASE SETTINGS +# -------------------------------------------- +DB_CONNECTION=sqlite +DB_HOST=localhost +DB_DATABASE=sqlite_testing.sqlite +DB_USERNAME=null +DB_PASSWORD=null + +# -------------------------------------------- +# REQUIRED: OUTGOING MAIL SERVER SETTINGS +# -------------------------------------------- +MAIL_DRIVER=smtp +MAIL_HOST=email-smtp.us-west-2.amazonaws.com +MAIL_PORT=587 +MAIL_USERNAME=YOURUSERNAME +MAIL_PASSWORD=YOURPASSWORD +MAIL_ENCRYPTION=null +MAIL_FROM_ADDR=you@example.com +MAIL_FROM_NAME=Snipe-IT + +# -------------------------------------------- +# REQUIRED: IMAGE LIBRARY +# This should be gd or imagick +# -------------------------------------------- +IMAGE_LIB=gd + + +# -------------------------------------------- +# OPTIONAL: AWS S3 SETTINGS +# -------------------------------------------- +AWS_SECRET=null +AWS_KEY=null +AWS_REGION=null +AWS_BUCKET=null + + +# -------------------------------------------- +# OPTIONAL: CACHE SETTINGS +# -------------------------------------------- +CACHE_DRIVER=file +SESSION_DRIVER=file +QUEUE_DRIVER=sync + + +# -------------------------------------------- +# OPTIONAL: SESSION SETTINGS +# -------------------------------------------- +SESSION_LIFETIME=12000 +EXPIRE_ON_CLOSE=false +ENCRYPT=false +COOKIE_NAME=snipeit_session +COOKIE_DOMAIN=null +SECURE_COOKIES=false + + +# -------------------------------------------- +# OPTIONAL: APP LOG FORMAT +# -------------------------------------------- +APP_LOG=single diff --git a/.gitattributes b/.gitattributes new file mode 100755 index 0000000000..2125666142 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +* text=auto \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000000..9423b4f77e --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,31 @@ +#### Expected Behavior (or desired behavior if a feature request) + +(what you expect to happen goes here) + +----- + +#### Actual Behavior + +(what actually happens goes here) + +----- + +#### Please confirm you have done the following before posting your bug report: + +- [ ] I have enabled debug mode +- [ ] I have read [checked the Common Issues page](http://docs.snipeitapp.com/common-issues.html) + +----- +#### Please provide answers to these questions before posting your bug report: + +- Version of Snipe-IT you're running +- What OS and web server you're running Snipe-IT on +- What method you used to install Snipe-IT (install.sh, manual installation, docker, etc) +- If you're getting an error in your browser, include that error +- What specific Snipe-IT page you're on, and what specific element you're interacting with to trigger the error +- If a stacktrace is provided in the error, include that too. +- Any errors that appear in your browser's error console. +- Confirm whether the error is [reproduceable on the demo](https://snipeitapp.com/demo). +- Include any additional information you can find in `app/storage/logs` and your webserver's logs. +- Include what you've done so far in the installation, and if you got any error messages along the way. +- Indicate whether or not you've manually edited any data directly in the database diff --git a/.gitignore b/.gitignore new file mode 100755 index 0000000000..4c005f3a91 --- /dev/null +++ b/.gitignore @@ -0,0 +1,49 @@ +/vendor +/node_modules +Homestead.yaml +Homestead.json +.env + +tests/_output/* +.DS_Store +public/uploads/models/* +public/uploads/avatars/* +public/uploads/suppliers/* +public/uploads/assets/* +public/uploads/*.gif +public/uploads/*.jpg +public/uploads/*.png +public/uploads/*.tif +public/uploads/*.svg +storage/app/private_uploads/users/* +phpDocumentor.phar +output +tests/_support/_generated/* + + +/bootstrap/compiled.php +composer.phar +/app/config/database.php +/app/config/mail.php +/app/database/*.sqlite +/app/storage/meta/services.json +/app/config/*/mail.php +/app/config/*/session.php +/app/config/*/database.php +/app/config/*/app.php +/app/config/*/ldap.php +public/packages/* +/app/storage/views/* +/app/storage/logs/* +/app/storage/debugbar/ +/bin/ +.idea +crowdin.yaml +public/uploads/logo.gif +public/uploads/logo.png +.siteflow +public/assets/.siteflow +app/config/local/session.php +.couscous +app/storage/dumps/* +tests/_data/scenarios diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000000..22d7df4670 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,64 @@ +addons: + hosts: + - localhost +sudo: false + +# see http://about.travis-ci.org/docs/user/languages/php/ for more hints +language: php + +# list any PHP version you want to test against +php: + - 5.5 + - 5.6 + - 7.0 + +# optionally specify a list of environments, for example to test different RDBMS +env: + - DB=sqlite + +# execute any number of scripts before the test run, custom env's are available as variables +before_script: +# - php -S localhost:8000 & + - phantomjs --webdriver=4444 & + - sleep 10 + - touch database/testing.sqlite + - composer self-update + - composer install -n --prefer-source + - cp .env.testing .env + - chmod -R 777 storage + - php artisan migrate --database=sqlite_testing --force + - ./vendor/bin/codecept build + - php artisan key:generate + - php artisan db:seed --database=sqlite_testing --force + - php artisan admin:create --first_name=Alison --last_name=Foobar --email=me@example.com --username=snipe --password=password + - php artisan serve --port=8000 --host=localhost & + - sleep 5 + - pip install --user codecov + - sleep 5 + + + +# omitting "script:" will default to phpunit +# use the $DB env variable to determine the phpunit.xml to use +# script: ./vendor/bin/codecept run --env testing-ci <-- this doesn't work +# script: ./vendor/bin/codecept run unit +script: ./vendor/bin/codecept run + +after_success: + - codecov + +after_failure: + - cat tests/_output/AccessoriesCept.fail.html +# - curl http://localhost:4444 + - curl http://localhost:8000 +# configure notifications (email, IRC, campfire etc) +notifications: + email: false + slack: + secure: vv9we1RxB9RsrMbomSdq6D7vz/okobw87pEkgIZjB+hj1QpQ2by90gsPsOa+NgsJEFaEP7e4KlT6SH8kK+zhbmuKaUd3d1//XdcancE22LZXi6tkiB5yuR/Jhhb1LLDqyGJTB4D92hMnnCPiUjpxNA3r437ttNeYRdYIEEP3drA= + webhooks: + urls: + - https://webhooks.gitter.im/e/5e136eb0c1965f3918d0 + on_success: change # options: [always|never|change] default: always + on_failure: change # options: [always|never|change] default: always + on_start: false # default: false diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000000..935d45ebf7 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,78 @@ +FROM ubuntu +MAINTAINER Brady Wetherington + +RUN apt-get update && apt-get install -y \ +apache2-bin \ +libapache2-mod-php5 \ +php5-curl \ +php5-ldap \ +php5-mysql \ +php5-mcrypt \ +php5-gd \ +patch \ +curl \ +vim \ +git + +RUN php5enmod mcrypt +RUN php5enmod gd + +RUN sed -i 's/variables_order = .*/variables_order = "EGPCS"/' /etc/php5/apache2/php.ini +RUN sed -i 's/variables_order = .*/variables_order = "EGPCS"/' /etc/php5/cli/php.ini + +RUN useradd --uid 1000 --gid 50 docker + +RUN echo export APACHE_RUN_USER=docker >> /etc/apache2/envvars +RUN echo export APACHE_RUN_GROUP=staff >> /etc/apache2/envvars + +COPY docker/000-default.conf /etc/apache2/sites-enabled/000-default.conf + +#SSL +COPY docker/001-default-ssl.conf /etc/apache2/sites-enabled/001-default-ssl.conf +#COPY docker/001-default-ssl.conf /etc/apache2/sites-available/001-default-ssl.conf + +RUN a2enmod ssl +#RUN a2ensite 001-default-ssl.conf + +COPY . /var/www/html + +RUN a2enmod rewrite + +############ INITIAL APPLICATION SETUP ##################### + +WORKDIR /var/www/html + +#Append to bootstrap file (less brittle than 'patch') +RUN sed -i 's/return $app;/$env="production";\nreturn $app;/' bootstrap/start.php + +#copy all configuration files +COPY docker/*.php /var/www/html/app/config/production/ + +RUN chown -R docker /var/www/html + +############## DEPENDENCIES via COMPOSER ################### + +#global install of composer +RUN cd /tmp;curl -sS https://getcomposer.org/installer | php;mv /tmp/composer.phar /usr/local/bin/composer + +# Get dependencies +RUN cd /var/www/html;composer install + +############### APPLICATION INSTALL/INIT ################# + +#RUN php artisan app:install +# too interactive! Try something else + +#COPY docker/app_install.exp /tmp/app_install.exp +#RUN chmod +x /tmp/app_install.exp +#RUN /tmp/app_install.exp + +##### START SERVER + +COPY docker/entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh + +ENTRYPOINT ["/entrypoint.sh"] + +EXPOSE 80 +EXPOSE 443 diff --git a/LICENSE b/LICENSE new file mode 100755 index 0000000000..2def0e8831 --- /dev/null +++ b/LICENSE @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. \ No newline at end of file diff --git a/app/Console/Commands/AssetImportCommand.php b/app/Console/Commands/AssetImportCommand.php new file mode 100644 index 0000000000..2a3ee34af3 --- /dev/null +++ b/app/Console/Commands/AssetImportCommand.php @@ -0,0 +1,468 @@ +argument('filename'); + + + if (!$this->option('testrun')=='true') { + $this->comment('======= Importing Assets from '.$filename.' ========='); + } else { + $this->comment('====== TEST ONLY Asset Import for '.$filename.' ===='); + $this->comment('============== NO DATA WILL BE WRITTEN =============='); + } + + if (! ini_get("auto_detect_line_endings")) { + ini_set("auto_detect_line_endings", '1'); + } + + $csv = Reader::createFromPath($this->argument('filename')); + $csv->setNewline("\r\n"); + $csv->setOffset(1); + $duplicates = ''; + + // Loop through the records + $nbInsert = $csv->each(function ($row) use ($duplicates) { + $status_id = 1; + + // Let's just map some of these entries to more user friendly words + + // User's name + if (array_key_exists('0',$row)) { + $user_name = trim($row[0]); + } else { + $user_name = ''; + } + + // User's email + if (array_key_exists('1',$row)) { + $user_email = trim($row[1]); + } else { + $user_email = ''; + } + + // User's email + if (array_key_exists('2',$row)) { + $user_username = trim($row[2]); + } else { + $user_username = ''; + } + + // Asset Name + if (array_key_exists('3',$row)) { + $user_asset_asset_name = trim($row[3]); + } else { + $user_asset_asset_name = ''; + } + + // Asset Category + if (array_key_exists('4',$row)) { + $user_asset_category = trim($row[4]); + } else { + $user_asset_category = ''; + } + + // Asset Name + if (array_key_exists('5',$row)) { + $user_asset_name = trim($row[5]); + } else { + $user_asset_name = ''; + } + + // Asset Manufacturer + if (array_key_exists('6',$row)) { + $user_asset_mfgr = trim($row[6]); + } else { + $user_asset_mfgr = ''; + } + + // Asset model number + if (array_key_exists('7',$row)) { + $user_asset_modelno = trim($row[7]); + } else { + $user_asset_modelno = ''; + } + + // Asset serial number + if (array_key_exists('8',$row)) { + $user_asset_serial = trim($row[8]); + } else { + $user_asset_serial = ''; + } + + // Asset tag + if (array_key_exists('9',$row)) { + $user_asset_tag = trim($row[9]); + } else { + $user_asset_tag = ''; + } + + // Asset location + if (array_key_exists('10',$row)) { + $user_asset_location = trim($row[10]); + } else { + $user_asset_location = ''; + } + + // Asset notes + if (array_key_exists('11',$row)) { + $user_asset_notes = trim($row[11]); + } else { + $user_asset_notes = ''; + } + + // Asset purchase date + if (array_key_exists('12',$row)) { + if ($row[12]!='') { + $user_asset_purchase_date = date("Y-m-d 00:00:01", strtotime($row[12])); + } else { + $user_asset_purchase_date = ''; + } + } else { + $user_asset_purchase_date = ''; + } + + // Asset purchase cost + if (array_key_exists('13',$row)) { + if ($row[13]!='') { + $user_asset_purchase_cost = trim($row[13]); + } else { + $user_asset_purchase_cost = ''; + } + } else { + $user_asset_purchase_cost = ''; + } + + // Asset Company Name + if (array_key_exists('14',$row)) { + if ($row[14]!='') { + $user_asset_company_name = trim($row[14]); + } else { + $user_asset_company_name= ''; + } + } else { + $user_asset_company_name = ''; + } + + + // A number was given instead of a name + if (is_numeric($user_name)) { + $this->comment('User '.$user_name.' is not a name - assume this user already exists'); + $user_username = ''; + $first_name = ''; + $last_name = ''; + + // No name was given + } elseif ($user_name=='') { + $this->comment('No user data provided - skipping user creation, just adding asset'); + $first_name = ''; + $last_name = ''; + //$user_username = ''; + + } else { + $user_email_array = User::generateFormattedNameFromFullName($this->option('email_format'), $user_name); + $first_name = $user_email_array['first_name']; + $last_name = $user_email_array['last_name']; + + if ($user_email=='') { + $user_email = $user_email_array['username'].'@'.config('app.domain'); + } + + if ($user_username=='') { + if ($this->option('username_format')=='email') { + $user_username = $user_email; + } else { + $user_name_array = User::generateFormattedNameFromFullName($this->option('username_format'), $user_name); + $user_username = $user_name_array['username']; + } + + } + + } + + $this->comment('Full Name: '.$user_name); + $this->comment('First Name: '.$first_name); + $this->comment('Last Name: '.$last_name); + $this->comment('Username: '.$user_username); + $this->comment('Email: '.$user_email); + $this->comment('Category Name: '.$user_asset_category); + $this->comment('Item: '.$user_asset_name); + $this->comment('Manufacturer ID: '.$user_asset_mfgr); + $this->comment('Model No: '.$user_asset_modelno); + $this->comment('Serial No: '.$user_asset_serial); + $this->comment('Asset Tag: '.$user_asset_tag); + $this->comment('Location: '.$user_asset_location); + $this->comment('Purchase Date: '.$user_asset_purchase_date); + $this->comment('Purchase Cost: '.$user_asset_purchase_cost); + $this->comment('Notes: '.$user_asset_notes); + $this->comment('Company Name: '.$user_asset_company_name); + + $this->comment('------------- Action Summary ----------------'); + + if ($user_username!='') { + if ($user = User::MatchEmailOrUsername($user_username, $user_email) + ->whereNotNull('username')->first()) { + $this->comment('User '.$user_username.' already exists'); + } else { + $user = new \App\Models\User; + $password = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 20); + + $user->first_name = $first_name; + $user->last_name = $last_name; + $user->username = $user_username; + $user->email = $user_email; + $user->permissions = '{user":1}'; + $user->password = bcrypt($password); + $user->activated = 1; + if ($user->save()) { + $this->comment('User '.$first_name.' created'); + } else { + $this->comment('ERROR CREATING User '.$first_name.' '.$last_name); + $this->comment($user->getErrors()); + } + + } + } else { + $user = new User; + } + + // Check for the location match and create it if it doesn't exist + if ($location = Location::where('name', e($user_asset_location))->first()) { + $this->comment('Location '.$user_asset_location.' already exists'); + } else { + + $location = new Location(); + + if ($user_asset_location!='') + { + $location->name = e($user_asset_location); + $location->address = ''; + $location->city = ''; + $location->state = ''; + $location->country = ''; + $location->user_id = 1; + + if (!$this->option('testrun')=='true') { + + if ($location->save()) { + $this->comment('Location '.$user_asset_location.' was created'); + } else { + $this->comment('Something went wrong! Location '.$user_asset_location.' was NOT created'); + $this->comment($location->getErrors()); + } + + } + else + { + $this->comment('Location '.$user_asset_location.' was (not) created - test run only'); + } + } + else + { + $this->comment('No location given, so none created.'); + } + + } + + if (e($user_asset_category)=='') { + $category_name = 'Unnamed Category'; + } else { + $category_name = e($user_asset_category); + } + + // Check for the category match and create it if it doesn't exist + if ($category = Category::where('name', e($category_name))->where('category_type', 'asset')->first()) { + $this->comment('Category '.$category_name.' already exists'); + + } else { + $category = new Category(); + $category->name = e($category_name); + $category->category_type = 'asset'; + $category->user_id = 1; + + if ($category->save()) { + $this->comment('Category '.$user_asset_category.' was created'); + } else { + $this->comment('Something went wrong! Category '.$user_asset_category.' was NOT created'); + $this->comment($category->getErrors()); + } + + } + + // Check for the manufacturer match and create it if it doesn't exist + if ($manufacturer = Manufacturer::where('name', e($user_asset_mfgr))->first()) { + $this->comment('Manufacturer '.$user_asset_mfgr.' already exists'); + } else { + $manufacturer = new Manufacturer(); + $manufacturer->name = e($user_asset_mfgr); + $manufacturer->user_id = 1; + + if ($manufacturer->save()) { + $this->comment('Manufacturer '.$user_asset_mfgr.' was created'); + } else { + $this->comment('Something went wrong! Manufacturer '.$user_asset_mfgr.' was NOT created: '. $manufacturer->getErrors()->first()); + } + + } + + // Check for the asset model match and create it if it doesn't exist + if ($asset_model = AssetModel::where('name', e($user_asset_name))->where('modelno', e($user_asset_modelno))->where('category_id', $category->id)->where('manufacturer_id', $manufacturer->id)->first()) { + $this->comment('The Asset Model '.$user_asset_name.' with model number '.$user_asset_modelno.' already exists'); + } else { + $asset_model = new AssetModel(); + $asset_model->name = e($user_asset_name); + $asset_model->manufacturer_id = $manufacturer->id; + $asset_model->modelno = e($user_asset_modelno); + $asset_model->category_id = $category->id; + $asset_model->user_id = 1; + + if ($asset_model->save()) { + $this->comment('Asset Model '.$user_asset_name.' with model number '.$user_asset_modelno.' was created'); + } else { + $this->comment('Something went wrong! Asset Model '.$user_asset_name.' was NOT created: '.$asset_model->getErrors()->first()); + } + + } + + // Check for the asset company match and create it if it doesn't exist + if ($user_asset_company_name!='') { + if ($company = Company::where('name', e($user_asset_company_name))->first()) { + $this->comment('Company '.$user_asset_company_name.' already exists'); + } else { + $company = new Company(); + $company->name = e($user_asset_company_name); + + if ($company->save()) { + $this->comment('Company '.$user_asset_company_name.' was created'); + } else { + $this->comment('Something went wrong! Company '.$user_asset_company_name.' was NOT created: '.$company->getErrors()->first()); + } + } + + } else { + $company = new Company(); + } + + // Check for the asset match and create it if it doesn't exist + if ($asset = Asset::where('asset_tag', e($user_asset_tag))->first()) { + $this->comment('The Asset with asset tag '.$user_asset_tag.' already exists'); + } else { + $asset = new Asset(); + $asset->name = e($user_asset_asset_name); + if ($user_asset_purchase_date!='') { + $asset->purchase_date = $user_asset_purchase_date; + } else { + $asset->purchase_date = NULL; + } + if ($user_asset_purchase_cost!='') { + $asset->purchase_cost = ParseFloat(e($user_asset_purchase_cost)); + } else { + $asset->purchase_cost = 0.00; + } + $asset->serial = e($user_asset_serial); + $asset->asset_tag = e($user_asset_tag); + $asset->model_id = $asset_model->id; + $asset->assigned_to = $user->id; + $asset->rtd_location_id = $location->id; + $asset->user_id = 1; + $asset->status_id = $status_id; + $asset->company_id = $company->id; + if ($user_asset_purchase_date!='') { + $asset->purchase_date = $user_asset_purchase_date; + } else { + $asset->purchase_date = NULL; + } + $asset->notes = e($user_asset_notes); + + if ($asset->save()) { + $this->comment('Asset '.$user_asset_name.' with serial number '.$user_asset_serial.' was created'); + } else { + $this->comment('Something went wrong! Asset '.$user_asset_name.' was NOT created: '.$asset->getErrors()->first()); + } + + } + + + + $this->comment('====================================='); + + return true; + + }); + + + } + + /** + * Get the console command arguments. + * + * @return array + */ + protected function getArguments() + { + return array( + array('filename', InputArgument::REQUIRED, 'File for the CSV import.'), + ); + } + + + /** + * Get the console command options. + * + * @return array + */ + protected function getOptions() + { + return array( + array('email_format', null, InputOption::VALUE_REQUIRED, 'The format of the email addresses that should be generated. Options are firstname.lastname, firstname, filastname', null), + array('username_format', null, InputOption::VALUE_REQUIRED, 'The format of the username that should be generated. Options are firstname.lastname, firstname, filastname, email', null), + array('testrun', null, InputOption::VALUE_REQUIRED, 'Test the output without writing to the database or not.', null), + ); + } + + +} diff --git a/app/Console/Commands/CreateAdmin.php b/app/Console/Commands/CreateAdmin.php new file mode 100644 index 0000000000..d920d0bf07 --- /dev/null +++ b/app/Console/Commands/CreateAdmin.php @@ -0,0 +1,80 @@ +option('first_name'); + $last_name = $this->option('last_name'); + $username = $this->option('username'); + $email = $this->option('email'); + $password = $this->option('password'); + + if (($first_name=='') || ($last_name=='') || ($username=='') || ($email=='') || ($password=='')) { + $this->info('ERROR: All fields are required.'); + } else { + $user = new \App\Models\User; + $user->first_name = $first_name; + $user->last_name = $last_name; + $user->username = $username; + $user->email = $email; + $user->permissions = '{"admin":1,"user":1,"superuser":1,"reports":1}'; + $user->password = bcrypt($password); + $user->activated = 1; + if ($user->save()) { + $this->info('New user created'); + $user->groups()->attach(1); + } else { + $this->info('Admin user was not created'); + $errors = $user->getErrors(); + + foreach ($errors->all() as $error) { + $this->info('ERROR:'. $error); + } + + } + } + + } + + // protected function getArguments() + // { + // return array( + // array('username', InputArgument::REQUIRED, 'Username'), + // ); + // } +} diff --git a/app/Console/Commands/LicenseImportCommand.php b/app/Console/Commands/LicenseImportCommand.php new file mode 100644 index 0000000000..2ea15e4929 --- /dev/null +++ b/app/Console/Commands/LicenseImportCommand.php @@ -0,0 +1,382 @@ +argument('filename'); + + + if (!$this->option('testrun')=='true') { + $this->comment('======= Importing Licenses from '.$filename.' ========='); + } else { + $this->comment('====== TEST ONLY License Import for '.$filename.' ===='); + $this->comment('============== NO DATA WILL BE WRITTEN =============='); + } + + if (! ini_get("auto_detect_line_endings")) { + ini_set("auto_detect_line_endings", '1'); + } + + $csv = Reader::createFromPath($this->argument('filename')); + $csv->setNewline("\r\n"); + $csv->setOffset(1); + $duplicates = ''; + + // Loop through the records + $nbInsert = $csv->each(function ($row) use ($duplicates) { + $status_id = 1; + + // Let's just map some of these entries to more user friendly words + + if (array_key_exists('0',$row)) { + $user_name = trim($row[0]); + } else { + $user_name = ''; + } + + if (array_key_exists('1',$row)) { + $user_email = trim($row[1]); + } else { + $user_email = ''; + } + + if (array_key_exists('2',$row)) { + $user_username = trim($row[2]); + } else { + $user_username = ''; + } + + if (array_key_exists('3',$row)) { + $user_license_name = trim($row[3]); + } else { + $user_license_name = ''; + } + + if (array_key_exists('4',$row)) { + $user_license_serial = trim($row[4]); + } else { + $user_license_serial = ''; + } + + if (array_key_exists('5',$row)) { + $user_licensed_to_name = trim($row[5]); + } else { + $user_licensed_to_name = ''; + } + + if (array_key_exists('6',$row)) { + $user_licensed_to_email = trim($row[6]); + } else { + $user_licensed_to_email = ''; + } + + if (array_key_exists('7',$row)) { + $user_license_seats = trim($row[7]); + } else { + $user_license_seats = ''; + } + + if (array_key_exists('8',$row)) { + $user_license_reassignable = trim($row[8]); + if ($user_license_reassignable!='') { + if ((strtolower($user_license_reassignable)=='yes') || (strtolower($user_license_reassignable)=='true') || ($user_license_reassignable=='1')) { + $user_license_reassignable = 1; + } + } else { + $user_license_reassignable = 0; + } + } else { + $user_license_reassignable = 0; + } + + if (array_key_exists('9',$row)) { + $user_license_supplier = trim($row[9]); + } else { + $user_license_supplier = ''; + } + + if (array_key_exists('10',$row)) { + $user_license_maintained = trim($row[10]); + + if ($user_license_maintained!='') { + if ((strtolower($user_license_maintained)=='yes') || (strtolower($user_license_maintained)=='true') || ($user_license_maintained=='1')) { + $user_license_maintained = 1; + } + } else { + $user_license_maintained = 0; + } + + + } else { + $user_license_maintained = ''; + } + + if (array_key_exists('11',$row)) { + $user_license_notes = trim($row[11]); + } else { + $user_license_notes = ''; + } + + if (array_key_exists('12',$row)) { + if ($row[12]!='') { + $user_license_purchase_date = date("Y-m-d 00:00:01", strtotime($row[12])); + } else { + $user_license_purchase_date = ''; + } + } else { + $user_license_purchase_date = 0; + } + + // A number was given instead of a name + if (is_numeric($user_name)) { + $this->comment('User '.$user_name.' is not a name - assume this user already exists'); + $user_username = ''; + // No name was given + + } elseif ($user_name=='') { + $this->comment('No user data provided - skipping user creation, just adding license'); + $first_name = ''; + $last_name = ''; + $user_username = ''; + + } else { + + $name = explode(" ", $user_name); + $first_name = $name[0]; + $email_last_name = ''; + $email_prefix = $first_name; + + if (!array_key_exists(1, $name)) { + $last_name=''; + $email_last_name = $last_name; + $email_prefix = $first_name; + } else { + $last_name = str_replace($first_name,'',$user_name); + + if ($this->option('email_format')=='filastname') { + $email_last_name.=str_replace(' ','',$last_name); + $email_prefix = $first_name[0].$email_last_name; + + } elseif ($this->option('email_format')=='firstname.lastname') { + $email_last_name.=str_replace(' ','',$last_name); + $email_prefix = $first_name.'.'.$email_last_name; + + } elseif ($this->option('email_format')=='firstname') { + $email_last_name.=str_replace(' ','',$last_name); + $email_prefix = $first_name; + } + + + } + + + $user_username = $email_prefix; + + // Generate an email based on their name if no email address is given + if ($user_email=='') { + if ($first_name=='Unknown') { + $status_id = 7; + } + $email = strtolower($email_prefix).'@'.$this->option('domain'); + $user_email = str_replace("'",'',$email); + } + } + + $this->comment('Full Name: '.$user_name); + $this->comment('First Name: '.$first_name); + $this->comment('Last Name: '.$last_name); + $this->comment('Username: '.$user_username); + $this->comment('Email: '.$user_email); + $this->comment('License Name: '.$user_license_name); + $this->comment('Serial No: '.$user_license_serial); + $this->comment('Licensed To Name: '.$user_licensed_to_name); + $this->comment('Licensed To Email: '.$user_licensed_to_email); + $this->comment('Seats: '.$user_license_seats); + $this->comment('Reassignable: '.$user_license_reassignable); + $this->comment('Supplier: '.$user_license_supplier); + $this->comment('Maintained: '.$user_license_maintained); + $this->comment('Notes: '.$user_license_notes); + $this->comment('Purchase Date: '.$user_license_purchase_date); + + $this->comment('------------- Action Summary ----------------'); + + if ($user_username!='') { + if ($user = User::where('username', $user_username)->whereNotNull('username')->first()) { + $this->comment('User '.$user_username.' already exists'); + } else { + // Create the user + $user = Sentry::createUser(array( + 'first_name' => $first_name, + 'last_name' => $last_name, + 'email' => $user_email, + 'username' => $user_username, + 'password' => substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 10), + 'activated' => true, + 'permissions' => array( + 'admin' => 0, + 'user' => 1, + ), + 'notes' => 'User importerd through license importer' + )); + + // Find the group using the group id + $userGroup = Sentry::findGroupById(3); + + // Assign the group to the user + $user->addGroup($userGroup); + $this->comment('User '.$first_name.' created'); + } + } else { + $user = new User; + $user->user_id = NULL; + } + + + // Check for the supplier match and create it if it doesn't exist + if ($supplier = Supplier::where('name', $user_license_supplier)->first()) { + $this->comment('Supplier '.$user_license_supplier.' already exists'); + } else { + $supplier = new Supplier(); + $supplier->name = e($user_license_supplier); + $supplier->user_id = 1; + + if ($supplier->save()) { + $this->comment('Supplier '.$user_license_supplier.' was created'); + } else { + $this->comment('Something went wrong! Supplier '.$user_license_supplier.' was NOT created'); + } + + } + + + // Add the license + $license = new License(); + $license->name = e($user_license_name); + if ($user_license_purchase_date!='') { + $license->purchase_date = $user_license_purchase_date; + } else { + $license->purchase_date = NULL; + } + $license->serial = e($user_license_serial); + $license->seats = e($user_license_seats); + $license->supplier_id = $supplier->id; + $license->user_id = 1; + if ($user_license_purchase_date!='') { + $license->purchase_date = $user_license_purchase_date; + } else { + $license->purchase_date = NULL; + } + $license->license_name = $user_licensed_to_name; + $license->license_email = $user_licensed_to_email; + $license->notes = e($user_license_notes); + + if ($license->save()) { + $this->comment('License '.$user_license_name.' with serial number '.$user_license_serial.' was created'); + + + $license_seat_created = 0; + + for ($x = 0; $x < $user_license_seats; $x++) { + // Create the license seat entries + $license_seat = new LicenseSeat(); + $license_seat->license_id = $license->id; + + // Only assign the first seat to the user + if ($x==0) { + $license_seat->assigned_to = $user->id; + } else { + $license_seat->assigned_to = NULL; + } + + if ($license_seat->save()) { + $license_seat_created++; + } + } + + if ($license_seat_created > 0) { + $this->comment($license_seat_created.' seats were created'); + } else { + $this->comment('Something went wrong! NO seats for '.$user_license_name.' were created'); + } + + + + } else { + $this->comment('Something went wrong! License '.$user_license_name.' was NOT created'); + } + + + $this->comment('====================================='); + + return true; + + }); + + + } + + /** + * Get the console command arguments. + * + * @return array + */ + protected function getArguments() + { + return array( + array('filename', InputArgument::REQUIRED, 'File for the CSV import.'), + ); + } + + + /** + * Get the console command options. + * + * @return array + */ + protected function getOptions() + { + return array( + array('domain', null, InputOption::VALUE_REQUIRED, 'Email domain for generated email addresses.', null), + array('email_format', null, InputOption::VALUE_REQUIRED, 'The format of the email addresses that should be generated. Options are firstname.lastname, firstname, filastname', null), + array('testrun', null, InputOption::VALUE_REQUIRED, 'Test the output without writing to the database or not.', null), + ); + } + + +} diff --git a/app/Console/Commands/PaveIt.php b/app/Console/Commands/PaveIt.php new file mode 100644 index 0000000000..3a6a145556 --- /dev/null +++ b/app/Console/Commands/PaveIt.php @@ -0,0 +1,80 @@ +confirm("\n****************************************************\nTHIS WILL DROP ALL OF THE TABLES IN YOUR DATABASE. \nThere is NO undo. This WILL destroy ALL of your data. \n****************************************************\n\nDo you wish to continue? No backsies! [y|N]")) { + + \DB::statement('drop table IF EXISTS accessories_users'); + \DB::statement('drop table IF EXISTS accessories'); + \DB::statement('drop table IF EXISTS asset_logs'); + \DB::statement('drop table IF EXISTS asset_maintenances'); + \DB::statement('drop table IF EXISTS asset_uploads'); + \DB::statement('drop table IF EXISTS assets'); + \DB::statement('drop table IF EXISTS categories'); + \DB::statement('drop table IF EXISTS companies'); + \DB::statement('drop table IF EXISTS consumables_users'); + \DB::statement('drop table IF EXISTS consumables'); + \DB::statement('drop table IF EXISTS custom_field_custom_fieldset'); + \DB::statement('drop table IF EXISTS custom_fields'); + \DB::statement('drop table IF EXISTS custom_fieldsets'); + \DB::statement('drop table IF EXISTS depreciations'); + \DB::statement('drop table IF EXISTS groups'); + //\DB::statement('drop table IF EXISTS history'); + \DB::statement('drop table IF EXISTS license_seats'); + \DB::statement('drop table IF EXISTS licenses'); + \DB::statement('drop table IF EXISTS locations'); + \DB::statement('drop table IF EXISTS manufacturers'); + \DB::statement('drop table IF EXISTS models'); + \DB::statement('drop table IF EXISTS migrations'); + \DB::statement('drop table IF EXISTS password_resets'); + \DB::statement('drop table IF EXISTS requested_assets'); + \DB::statement('drop table IF EXISTS requests'); + \DB::statement('drop table IF EXISTS settings'); + \DB::statement('drop table IF EXISTS status_labels'); + \DB::statement('drop table IF EXISTS suppliers'); + \DB::statement('drop table IF EXISTS throttle'); + \DB::statement('drop table IF EXISTS users_groups'); + \DB::statement('drop table IF EXISTS users'); + + + } + + } +} diff --git a/app/Console/Commands/SendExpirationAlerts.php b/app/Console/Commands/SendExpirationAlerts.php new file mode 100644 index 0000000000..7608c0ccc8 --- /dev/null +++ b/app/Console/Commands/SendExpirationAlerts.php @@ -0,0 +1,134 @@ +info(count($expiring_assets).' expiring assets'); + + $asset_data['count'] = count($expiring_assets); + $asset_data['email_content'] =''; + $now = date("Y-m-d"); + + + foreach ($expiring_assets as $asset) { + + $expires = $asset->warrantee_expires(); + $difference = round(abs(strtotime($expires) - strtotime($now))/86400); + + if ($difference > 30) { + $asset_data['email_content'] .= ''; + } else { + $asset_data['email_content'] .= ''; + } + $asset_data['email_content'] .= ''; + $asset_data['email_content'] .= $asset->showAssetName().''.$asset->asset_tag.''; + $asset_data['email_content'] .= ''.$asset->warrantee_expires().''; + $asset_data['email_content'] .= ''.$difference.' days'; + $asset_data['email_content'] .= ''; + } + + // Expiring licenses + $expiring_licenses = License::getExpiringLicenses(60); + $this->info(count($expiring_licenses).' expiring licenses'); + + + $license_data['count'] = count($expiring_licenses); + $license_data['email_content'] = ''; + + foreach ($expiring_licenses as $license) { + $expires = $license->expiration_date; + $difference = round(abs(strtotime($expires) - strtotime($now))/86400); + + if ($difference > 30) { + $license_data['email_content'] .= ''; + } else { + $license_data['email_content'] .= ''; + } + $license_data['email_content'] .= ''; + $license_data['email_content'] .= $license->name.''; + $license_data['email_content'] .= ''.$license->expiration_date.''; + $license_data['email_content'] .= ''.$difference.' days'; + $license_data['email_content'] .= ''; + } + + if ((Setting::getSettings()->alert_email!='') && (Setting::getSettings()->alerts_enabled==1)) { + + + if (count($expiring_assets) > 0) { + Mail::send('emails.expiring-assets-report', $asset_data, function ($m) { + $m->to(explode(',',Setting::getSettings()->alert_email), Setting::getSettings()->site_name); + $m->subject('Expiring Assets Report'); + }); + + } + + if (count($expiring_licenses) > 0) { + Mail::send('emails.expiring-licenses-report', $license_data, function ($m) { + $m->to(explode(',',Setting::getSettings()->alert_email), Setting::getSettings()->site_name); + $m->subject('Expiring Licenses Report'); + }); + + } + + + } else { + + if (Setting::getSettings()->alert_email=='') { + echo "Could not send email. No alert email configured in settings. \n"; + } elseif (Setting::getSettings()->alerts_enabled!=1) { + echo "Alerts are disabled in the settings. No mail will be sent. \n"; + } + + } + + + + + } + + + + + +} diff --git a/app/Console/Commands/SendInventoryAlerts.php b/app/Console/Commands/SendInventoryAlerts.php new file mode 100644 index 0000000000..248dfcfa7a --- /dev/null +++ b/app/Console/Commands/SendInventoryAlerts.php @@ -0,0 +1,69 @@ +alert_email!='') && (Setting::getSettings()->alerts_enabled==1)) { + + $data['data'] = Helper::checkLowInventory(); + $data['count'] = count($data['data']); + + if (count($data['data']) > 0) { + Mail::send('emails.low-inventory', $data, function ($m) { + $m->to(explode(',',Setting::getSettings()->alert_email), Setting::getSettings()->site_name); + $m->subject('Low Inventory Report'); + }); + + } + + } else { + if (Setting::getSettings()->alert_email=='') { + echo "Could not send email. No alert email configured in settings. \n"; + } elseif (Setting::getSettings()->alerts_enabled!=1) { + echo "Alerts are disabled in the settings. No mail will be sent. \n"; + } + } + + + } + +} diff --git a/app/Console/Commands/SystemBackup.php b/app/Console/Commands/SystemBackup.php new file mode 100644 index 0000000000..23550f1415 --- /dev/null +++ b/app/Console/Commands/SystemBackup.php @@ -0,0 +1,65 @@ +call('db:backup', array('filename' => $db_dump)); + + Zipper::make($zip_file) + ->folder('avatars')->add($files['avatars']) + ->folder('models')->add($files['models']) + ->folder('suppliers')->add($files['suppliers']) + ->folder('private_uploads')->add($files['private_uploads']) + ->folder('database')->add($db_dump)->close(); + + $this->info('Backup file created at '.$zip_file); + $this->info('Removing SQL dump at '.$db_dump); + unlink($db_dump); + + } + + + +} diff --git a/app/Console/Commands/Versioning.php b/app/Console/Commands/Versioning.php new file mode 100644 index 0000000000..dbae46fc6f --- /dev/null +++ b/app/Console/Commands/Versioning.php @@ -0,0 +1,91 @@ +argument('app_version'); + + // discard the commit hash + $version = explode('-', $hash_version); + $realVersion = $version[0] . '-' . $version[1]; + + // save the version array to a variable + $array = var_export(array('app_version' => $realVersion,'hash_version' => $hash_version), true); + + + // Construct our file content + $content = <<line('Setting version: '. \config('version.latest')); + } + + /** + * Get the console command arguments. + * + * @return array + */ + protected function getArguments() + { + return array( + array('app_version', InputArgument::REQUIRED, 'version number is required.'), + ); + } + + /** + * Get the console command options. + * + * @return array + */ + protected function getOptions() + { + return array( + ); + } +} diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php new file mode 100644 index 0000000000..bc508454f0 --- /dev/null +++ b/app/Console/Kernel.php @@ -0,0 +1,39 @@ +command('alerts:inventory')->daily(); + $schedule->command('alerts:expiring')->daily(); + $schedule->command('snipeit:backup')->weekly(); + } +} diff --git a/app/Events/Event.php b/app/Events/Event.php new file mode 100644 index 0000000000..ba2f88838c --- /dev/null +++ b/app/Events/Event.php @@ -0,0 +1,8 @@ +back()->with('error', trans('general.token_expired')); + } + + if ($this->isHttpException($e)) { + + $statusCode = $e->getStatusCode(); + + switch ($statusCode) { + + case '404': + return response()->view('layouts/basic', [ + 'content' => view('errors/404') + ]); + } + } + + return parent::render($request, $e); + } +} diff --git a/app/Helpers/Helper.php b/app/Helpers/Helper.php new file mode 100644 index 0000000000..3cb003b010 --- /dev/null +++ b/app/Helpers/Helper.php @@ -0,0 +1,263 @@ + trans('general.select_model')) + DB::table('models') + ->select(DB::raw('IF (modelno="" OR modelno IS NULL,name,concat(name, " / ",modelno)) as name, id')) + ->orderBy('name', 'asc') + ->whereNull('deleted_at') + ->pluck('name', 'id'); + return $model_list; + } + + public static function companyList() + { + $company_list = array('0' => trans('general.select_company')) + DB::table('companies') + ->orderBy('name', 'asc') + ->pluck('name', 'id'); + return $company_list; + } + + + public static function categoryList() + { + $category_list = array('' => '') + Category::orderBy('name', 'asc') + ->whereNull('deleted_at') + ->orderBy('name', 'asc') + ->pluck('name', 'id')->toArray(); + return $category_list; + } + + public static function suppliersList() + { + $supplier_list = array('' => trans('general.select_supplier')) + Supplier::orderBy('name', 'asc') + ->orderBy('name', 'asc') + ->pluck('name', 'id')->toArray(); + return $supplier_list; + } + + public static function statusLabelList() + { + $statuslabel_list = array('' => trans('general.select_statuslabel')) + Statuslabel::orderBy('name', 'asc') + ->pluck('name', 'id')->toArray(); + return $statuslabel_list; + } + + public static function locationsList() + { + $location_list = array('' => trans('general.select_location')) + Location::orderBy('name', 'asc') + ->pluck('name', 'id')->toArray(); + return $location_list; + } + + public static function manufacturerList() + { + $manufacturer_list = array('' => 'Select One') + + Manufacturer::orderBy('name', 'asc') + ->pluck('name', 'id')->toArray(); + return $manufacturer_list; + } + + public static function statusTypeList() + { + $statuslabel_types = array('' => trans('admin/hardware/form.select_statustype')) + array('undeployable' => trans('admin/hardware/general.undeployable')) + array('pending' => trans('admin/hardware/general.pending')) + array('archived' => trans('admin/hardware/general.archived')) + array('deployable' => trans('admin/hardware/general.deployable')); + return $statuslabel_types; + } + + public static function managerList() + { + $manager_list = array('' => '') + User::select(DB::raw('concat(last_name,", ",first_name," (",username,")") as full_name, id')) + ->whereNull('deleted_at', 'and') + ->orderBy('last_name', 'asc') + ->orderBy('first_name', 'asc') + ->pluck('full_name', 'id')->toArray(); + return $manager_list; + } + + public static function depreciationList() + { + $depreciation_list = ['' => 'Do Not Depreciate'] + Depreciation::orderBy('name', 'asc') + ->pluck('name', 'id')->toArray(); + return $depreciation_list; + } + + public static function categoryTypeList() + { + $category_types = array('' => '','accessory' => 'Accessory', 'asset' => 'Asset', 'consumable' => 'Consumable','component' => 'Component'); + return $category_types; + } + + public static function usersList() + { + $users_list = array('' => trans('general.select_user')) + DB::table('users') + ->select(DB::raw('concat(last_name,", ",first_name," (",username,")") as full_name, id')) + ->whereNull('deleted_at') + ->orderBy('last_name', 'asc') + ->orderBy('first_name', 'asc') + ->pluck('full_name', 'id'); + return $users_list; + } + + public static function assetsList() + { + $assets_list = array('' => trans('general.select_asset')) + Asset::orderBy('name', 'asc') + ->whereNull('deleted_at') + ->pluck('name', 'id')->toArray(); + return $assets_list; + } + + + public static function customFieldsetList() + { + $customfields = array('' => trans('admin/models/general.no_custom_field')) + CustomFieldset::pluck('name', 'id')->toArray(); + return $customfields; + } + + public static function predefined_formats() + { + $keys=array_keys(CustomField::$PredefinedFormats); + $stuff=array_combine($keys, $keys); + return $stuff+["" => "Custom Format..."]; + } + + public static function barcodeDimensions($barcode_type = 'QRCODE') + { + if ($barcode_type == 'C128') { + $size['height'] = '-1'; + $size['width'] = '-10'; + } elseif ($barcode_type == 'PDF417') { + $size['height'] = '-3'; + $size['width'] = '-10'; + } else { + $size['height'] = '-3'; + $size['width'] = '-3'; + } + return $size; + } + + public static function generateRandomString($length = 10) + { + $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; + $charactersLength = strlen($characters); + $randomString = ''; + for ($i = 0; $i < $length; $i++) { + $randomString .= $characters[rand(0, $charactersLength - 1)]; + } + return $randomString; + } + + /** + * This nasty little method gets the low inventory info for the + * alert dropdown + **/ + public static function checkLowInventory() + { + $consumables = Consumable::with('users')->whereNotNull('min_amt')->get(); + $accessories = Accessory::with('users')->whereNotNull('min_amt')->get(); + $components = Component::with('assets')->whereNotNull('min_amt')->get(); + + $avail_consumables = 0; + $items_array = array(); + $all_count = 0; + + foreach ($consumables as $consumable) { + $avail = $consumable->numRemaining(); + if ($avail < ($consumable->min_amt) + 3) { + $percent = number_format((($consumable->numRemaining() / $consumable->qty) * 100), 0); + $items_array[$all_count]['id'] = $consumable->id; + $items_array[$all_count]['name'] = $consumable->name; + $items_array[$all_count]['type'] = 'consumables'; + $items_array[$all_count]['percent'] = $percent; + $items_array[$all_count]['remaining']=$consumable->numRemaining(); + $items_array[$all_count]['min_amt']=$consumable->min_amt; + $all_count++; + } + + + } + + foreach ($accessories as $accessory) { + $avail = $accessory->numRemaining(); + if ($avail < ($accessory->min_amt) + 3) { + $percent = number_format((($accessory->numRemaining() / $accessory->qty) * 100), 0); + $items_array[$all_count]['id'] = $accessory->id; + $items_array[$all_count]['name'] = $accessory->name; + $items_array[$all_count]['type'] = 'accessories'; + $items_array[$all_count]['percent'] = $percent; + $items_array[$all_count]['remaining']=$accessory->numRemaining(); + $items_array[$all_count]['min_amt']=$accessory->min_amt; + $all_count++; + } + + } + + foreach ($components as $component) { + $avail = $component->numRemaining(); + if ($avail < ($component->min_amt) + 3) { + $percent = number_format((($component->numRemaining() / $component->total_qty) * 100), 0); + $items_array[$all_count]['id'] = $component->id; + $items_array[$all_count]['name'] = $component->name; + $items_array[$all_count]['type'] = 'components'; + $items_array[$all_count]['percent'] = $percent; + $items_array[$all_count]['remaining']=$component->numRemaining(); + $items_array[$all_count]['min_amt']=$component->min_amt; + $all_count++; + } + + } + + + + return $items_array; + + + } +} diff --git a/app/Http/Controllers/AccessoriesController.php b/app/Http/Controllers/AccessoriesController.php new file mode 100755 index 0000000000..d4e89571e6 --- /dev/null +++ b/app/Http/Controllers/AccessoriesController.php @@ -0,0 +1,672 @@ +] + * @see AccessoriesController::getDatatable() method that generates the JSON response + * @since [v1.0] + * @return View + */ + public function getIndex() + { + return View::make('accessories/index'); + } + + + /** + * Returns a view with a form to create a new Accessory. + * + * @author [A. Gianotto] [] + * @return View + */ + public function getCreate() + { + // Show the page + $category_list = array('' => '') + DB::table('categories')->where('category_type', '=', 'accessory')->whereNull('deleted_at')->orderBy('name', 'ASC')->lists('name', 'id'); + $company_list = Helper::companyList(); + $location_list = Helper::locationsList(); + return View::make('accessories/edit') + ->with('accessory', new Accessory) + ->with('category_list', $category_list) + ->with('company_list', $company_list) + ->with('location_list', $location_list); + } + + + /** + * Validate and save new Accessory from form post + * + * @author [A. Gianotto] [] + * @return Redirect + */ + public function postCreate() + { + + // create a new model instance + $accessory = new Accessory(); + + // Update the accessory data + $accessory->name = e(Input::get('name')); + $accessory->category_id = e(Input::get('category_id')); + $accessory->location_id = e(Input::get('location_id')); + $accessory->min_amt = e(Input::get('min_amt')); + $accessory->company_id = Company::getIdForCurrentUser(Input::get('company_id')); + $accessory->order_number = e(Input::get('order_number')); + + if (e(Input::get('purchase_date')) == '') { + $accessory->purchase_date = null; + } else { + $accessory->purchase_date = e(Input::get('purchase_date')); + } + + if (e(Input::get('purchase_cost')) == '0.00') { + $accessory->purchase_cost = null; + } else { + $accessory->purchase_cost = e(Input::get('purchase_cost')); + } + + $accessory->qty = e(Input::get('qty')); + $accessory->user_id = Auth::user()->id; + + // Was the accessory created? + if ($accessory->save()) { + // Redirect to the new accessory page + return Redirect::to("admin/accessories")->with('success', Lang::get('admin/accessories/message.create.success')); + } + + + return Redirect::back()->withInput()->withErrors($accessory->getErrors()); + } + + /** + * Return view for the Accessory update form, prepopulated with existing data + * + * @author [A. Gianotto] [] + * @param int $accessoryId + * @return View + */ + public function getEdit($accessoryId = null) + { + // Check if the accessory exists + if (is_null($accessory = Accessory::find($accessoryId))) { + // Redirect to the blogs management page + return Redirect::to('admin/accessories')->with('error', Lang::get('admin/accessories/message.does_not_exist')); + } elseif (!Company::isCurrentUserHasAccess($accessory)) { + return Redirect::to('admin/accessories')->with('error', Lang::get('general.insufficient_permissions')); + } + + $category_list = array('' => '') + DB::table('categories')->where('category_type', '=', 'accessory')->whereNull('deleted_at')->orderBy('name', 'ASC')->lists('name', 'id'); + $company_list = Helper::companyList(); + $location_list = Helper::locationsList(); + + return View::make('accessories/edit', compact('accessory')) + ->with('category_list', $category_list) + ->with('company_list', $company_list) + ->with('location_list', $location_list); + } + + + /** + * Save edited Accessory from form post + * + * @author [A. Gianotto] [] + * @param int $accessoryId + * @return Redirect + */ + public function postEdit($accessoryId = null) + { + // Check if the blog post exists + if (is_null($accessory = Accessory::find($accessoryId))) { + // Redirect to the blogs management page + return Redirect::to('admin/accessories')->with('error', Lang::get('admin/accessories/message.does_not_exist')); + } elseif (!Company::isCurrentUserHasAccess($accessory)) { + return Redirect::to('admin/accessories')->with('error', Lang::get('general.insufficient_permissions')); + } + + // Update the accessory data + $accessory->name = e(Input::get('name')); + + if (e(Input::get('location_id')) == '') { + $accessory->location_id = null; + } else { + $accessory->location_id = e(Input::get('location_id')); + } + $accessory->min_amt = e(Input::get('min_amt')); + $accessory->category_id = e(Input::get('category_id')); + $accessory->company_id = Company::getIdForCurrentUser(Input::get('company_id')); + $accessory->order_number = e(Input::get('order_number')); + + if (e(Input::get('purchase_date')) == '') { + $accessory->purchase_date = null; + } else { + $accessory->purchase_date = e(Input::get('purchase_date')); + } + + if (e(Input::get('purchase_cost')) == '0.00') { + $accessory->purchase_cost = null; + } else { + $accessory->purchase_cost = e(Input::get('purchase_cost')); + } + + $accessory->qty = e(Input::get('qty')); + + // Was the accessory created? + if ($accessory->save()) { + // Redirect to the new accessory page + return Redirect::to("admin/accessories")->with('success', Lang::get('admin/accessories/message.update.success')); + } + + + return Redirect::back()->withInput()->withErrors($accessory->getErrors()); + + } + + /** + * Delete the given accessory. + * + * @author [A. Gianotto] [] + * @param int $accessoryId + * @return Redirect + */ + public function getDelete($accessoryId) + { + // Check if the blog post exists + if (is_null($accessory = Accessory::find($accessoryId))) { + // Redirect to the blogs management page + return Redirect::to('admin/accessories')->with('error', Lang::get('admin/accessories/message.not_found')); + } elseif (!Company::isCurrentUserHasAccess($accessory)) { + return Redirect::to('admin/accessories')->with('error', Lang::get('general.insufficient_permissions')); + } + + + if ($accessory->hasUsers() > 0) { + return Redirect::to('admin/accessories')->with('error', Lang::get('admin/accessories/message.assoc_users', array('count'=> $accessory->hasUsers()))); + } else { + $accessory->delete(); + + // Redirect to the locations management page + return Redirect::to('admin/accessories')->with('success', Lang::get('admin/accessories/message.delete.success')); + + } + } + + + + /** + * Returns a view that invokes the ajax table which contains + * the content for the accessory detail view, which is generated in getDataView. + * + * @author [A. Gianotto] [] + * @param int $accessoryId + * @see AccessoriesController::getDataView() method that generates the JSON response + * @since [v1.0] + * @return View + */ + public function getView($accessoryID = null) + { + $accessory = Accessory::find($accessoryID); + + if (isset($accessory->id)) { + + if (!Company::isCurrentUserHasAccess($accessory)) { + return Redirect::to('admin/accessories')->with('error', Lang::get('general.insufficient_permissions')); + } else { + return View::make('accessories/view', compact('accessory')); + } + } else { + // Prepare the error message + $error = Lang::get('admin/accessories/message.does_not_exist', compact('id')); + + // Redirect to the user management page + return Redirect::route('accessories')->with('error', $error); + } + + + } + + /** + * Return the form to checkout an Accessory to a user. + * + * @author [A. Gianotto] [] + * @param int $accessoryId + * @return View + */ + public function getCheckout($accessoryId) + { + // Check if the accessory exists + if (is_null($accessory = Accessory::find($accessoryId))) { + // Redirect to the accessory management page with error + return Redirect::to('accessories')->with('error', Lang::get('admin/accessories/message.not_found')); + } elseif (!Company::isCurrentUserHasAccess($accessory)) { + return Redirect::to('admin/accessories')->with('error', Lang::get('general.insufficient_permissions')); + } + + // Get the dropdown of users and then pass it to the checkout view + $users_list = array('' => 'Select a User') + DB::table('users')->select(DB::raw('concat(last_name,", ",first_name," (",username,")") as full_name, id'))->whereNull('deleted_at')->orderBy('last_name', 'asc')->orderBy('first_name', 'asc')->lists('full_name', 'id'); + + return View::make('accessories/checkout', compact('accessory'))->with('users_list', $users_list); + + } + + /** + * Save the Accessory checkout information. + * + * If Slack is enabled and/or asset acceptance is enabled, it will also + * trigger a Slack message and send an email. + * + * @author [A. Gianotto] [] + * @param int $accessoryId + * @return Redirect + */ + public function postCheckout($accessoryId) + { + // Check if the accessory exists + if (is_null($accessory = Accessory::find($accessoryId))) { + // Redirect to the accessory management page with error + return Redirect::to('accessories')->with('error', Lang::get('admin/accessories/message.user_not_found')); + } elseif (!Company::isCurrentUserHasAccess($accessory)) { + return Redirect::to('admin/accessories')->with('error', Lang::get('general.insufficient_permissions')); + } + + if (!$user = User::find(Input::get('assigned_to'))) { + return Redirect::to('admin/accessories')->with('error', Lang::get('admin/accessories/message.not_found')); + } + + // Update the accessory data + $accessory->assigned_to = e(Input::get('assigned_to')); + + $accessory->users()->attach($accessory->id, array( + 'accessory_id' => $accessory->id, + 'assigned_to' => e(Input::get('assigned_to')))); + + $admin_user = Auth::user(); + + $logaction = new Actionlog(); + $logaction->accessory_id = $accessory->id; + $logaction->checkedout_to = $accessory->assigned_to; + $logaction->asset_type = 'accessory'; + $logaction->location_id = Auth::user()->location_id; + $logaction->user_id = $admin_user->id; + $logaction->note = e(Input::get('note')); + + + + $settings = Setting::getSettings(); + + if ($settings->slack_endpoint) { + + + $slack_settings = [ + 'username' => $settings->botname, + 'channel' => $settings->slack_channel, + 'link_names' => true + ]; + + $client = new \Maknz\Slack\Client($settings->slack_endpoint, $slack_settings); + + try { + $client->attach([ + 'color' => 'good', + 'fields' => [ + [ + 'title' => 'Checked Out:', + 'value' => strtoupper($logaction->asset_type).' <'.config('app.url').'/admin/accessories/'.$accessory->id.'/view'.'|'.$accessory->name.'> checked out to <'.config('app.url').'/admin/users/'.$user->id.'/view|'.$user->fullName().'> by <'.config('app.url').'/admin/users/'.$admin_user->id.'/view'.'|'.$admin_user->fullName().'>.' + ], + [ + 'title' => 'Note:', + 'value' => e($logaction->note) + ], + ] + ])->send('Accessory Checked Out'); + } catch (Exception $e) { + + } + + } + + + + $log = $logaction->logaction('checkout'); + + $accessory_user = DB::table('accessories_users')->where('assigned_to', '=', $accessory->assigned_to)->where('accessory_id', '=', $accessory->id)->first(); + + $data['log_id'] = $logaction->id; + $data['eula'] = $accessory->getEula(); + $data['first_name'] = $user->first_name; + $data['item_name'] = $accessory->name; + $data['checkout_date'] = $logaction->created_at; + $data['item_tag'] = ''; + $data['expected_checkin'] = ''; + $data['note'] = $logaction->note; + $data['require_acceptance'] = $accessory->requireAcceptance(); + + + if (($accessory->requireAcceptance()=='1') || ($accessory->getEula())) { + + Mail::send('emails.accept-accessory', $data, function ($m) use ($user) { + $m->to($user->email, $user->first_name . ' ' . $user->last_name); + $m->subject('Confirm accessory delivery'); + }); + } + + // Redirect to the new accessory page + return Redirect::to("admin/accessories")->with('success', Lang::get('admin/accessories/message.checkout.success')); + + + + } + + + /** + * Check the accessory back into inventory + * + * @author [A. Gianotto] [] + * @param int $accessoryId + * @return View + **/ + public function getCheckin($accessoryUserId = null, $backto = null) + { + // Check if the accessory exists + if (is_null($accessory_user = DB::table('accessories_users')->find($accessoryUserId))) { + // Redirect to the accessory management page with error + return Redirect::to('admin/accessories')->with('error', Lang::get('admin/accessories/message.not_found')); + } + + $accessory = Accessory::find($accessory_user->accessory_id); + + if (!Company::isCurrentUserHasAccess($accessory)) { + return Redirect::to('admin/accessories')->with('error', Lang::get('general.insufficient_permissions')); + } else { + return View::make('accessories/checkin', compact('accessory'))->with('backto', $backto); + } + } + + + /** + * Check in the item so that it can be checked out again to someone else + * + * @uses Accessory::checkin_email() to determine if an email can and should be sent + * @author [A. Gianotto] [] + * @param int $accessoryId + * @return Redirect + **/ + public function postCheckin($accessoryUserId = null, $backto = null) + { + // Check if the accessory exists + if (is_null($accessory_user = DB::table('accessories_users')->find($accessoryUserId))) { + // Redirect to the accessory management page with error + return Redirect::to('admin/accessories')->with('error', Lang::get('admin/accessories/message.not_found')); + } + + + $accessory = Accessory::find($accessory_user->accessory_id); + + if (!Company::isCurrentUserHasAccess($accessory)) { + return Redirect::to('admin/accessories')->with('error', Lang::get('general.insufficient_permissions')); + } + + $logaction = new Actionlog(); + $logaction->checkedout_to = $accessory_user->assigned_to; + $return_to = $accessory_user->assigned_to; + $admin_user = Auth::user(); + + + // Was the accessory updated? + if (DB::table('accessories_users')->where('id', '=', $accessory_user->id)->delete()) { + + $logaction->accessory_id = $accessory->id; + $logaction->location_id = null; + $logaction->asset_type = 'accessory'; + $logaction->user_id = $admin_user->id; + $logaction->note = e(Input::get('note')); + + $settings = Setting::getSettings(); + + if ($settings->slack_endpoint) { + + + $slack_settings = [ + 'username' => $settings->botname, + 'channel' => $settings->slack_channel, + 'link_names' => true + ]; + + $client = new \Maknz\Slack\Client($settings->slack_endpoint, $slack_settings); + + try { + $client->attach([ + 'color' => 'good', + 'fields' => [ + [ + 'title' => 'Checked In:', + 'value' => strtoupper($logaction->asset_type).' <'.config('app.url').'/admin/accessories/'.$accessory->id.'/view'.'|'.$accessory->name.'> checked in by <'.config('app.url').'/admin/users/'.$admin_user->id.'/view'.'|'.$admin_user->fullName().'>.' + ], + [ + 'title' => 'Note:', + 'value' => e($logaction->note) + ], + + ] + ])->send('Accessory Checked In'); + + } catch (Exception $e) { + + } + + } + + + $log = $logaction->logaction('checkin from'); + + if (!is_null($accessory_user->assigned_to)) { + $user = User::find($accessory_user->assigned_to); + } + + $data['log_id'] = $logaction->id; + $data['first_name'] = $user->first_name; + $data['item_name'] = $accessory->name; + $data['checkin_date'] = $logaction->created_at; + $data['item_tag'] = ''; + $data['note'] = $logaction->note; + + if (($accessory->checkin_email()=='1')) { + + Mail::send('emails.checkin-asset', $data, function ($m) use ($user) { + $m->to($user->email, $user->first_name . ' ' . $user->last_name); + $m->subject('Confirm Accessory Checkin'); + }); + } + + if ($backto=='user') { + return Redirect::to("admin/users/".$return_to.'/view')->with('success', Lang::get('admin/accessories/message.checkin.success')); + } else { + return Redirect::to("admin/accessories/".$accessory->id."/view")->with('success', Lang::get('admin/accessories/message.checkin.success')); + } + } + + // Redirect to the accessory management page with error + return Redirect::to("admin/accessories")->with('error', Lang::get('admin/accessories/message.checkin.error')); + } + + /** + * Generates the JSON response for accessories listing view. + * + * Example: + * { + * "actions": "(links to available actions)", + * "category": "(link to category)", + * "companyName": "My Company", + * "location": "My Location", + * "min_amt": 2, + * "name": "(link to accessory), + * "numRemaining": 6, + * "order_number": null, + * "purchase_cost": "0.00", + * "purchase_date": null, + * "qty": 7 + * }, + * + * The names of the fields in the returns JSON correspond directly to the the + * names of the fields in the bootstrap-tables in the view. + * + * For debugging, see at /api/accessories/list + * + * @author [A. Gianotto] [] + * @param int $accessoryId + * @return string JSON containing accessories and their associated atrributes. + **/ + public function getDatatable() + { + $accessories = Accessory::select('accessories.*')->with('category', 'company') + ->whereNull('accessories.deleted_at'); + + if (Input::has('search')) { + $accessories = $accessories->TextSearch(Input::get('search')); + } + + if (Input::has('offset')) { + $offset = e(Input::get('offset')); + } else { + $offset = 0; + } + + if (Input::has('limit')) { + $limit = e(Input::get('limit')); + } else { + $limit = 50; + } + + + $allowed_columns = ['name','min_amt','order_number','purchase_date','purchase_cost','companyName','category']; + $order = Input::get('order') === 'asc' ? 'asc' : 'desc'; + $sort = in_array(Input::get('sort'), $allowed_columns) ? Input::get('sort') : 'created_at'; + + switch ($sort) { + case 'category': + $accessories = $accessories->OrderCategory($order); + break; + case 'companyName': + $accessories = $accessories->OrderCompany($order); + break; + default: + $accessories = $accessories->orderBy($sort, $order); + break; + } + + $accessCount = $accessories->count(); + $accessories = $accessories->skip($offset)->take($limit)->get(); + + $rows = array(); + + foreach ($accessories as $accessory) { + $actions = 'numRemaining() > 0 ) ? '' : ' disabled').'>'.Lang::get('general.checkout').''; + $company = $accessory->company; + + $rows[] = array( + 'name' => ''. $accessory->name.'', + 'category' => ($accessory->category) ? (string)link_to('admin/settings/categories/'.$accessory->category->id.'/view', $accessory->category->name) : '', + 'qty' => $accessory->qty, + 'order_number' => $accessory->order_number, + 'min_amt' => $accessory->min_amt, + 'location' => ($accessory->location) ? $accessory->location->name: '', + 'purchase_date' => $accessory->purchase_date, + 'purchase_cost' => number_format($accessory->purchase_cost, 2), + 'numRemaining' => $accessory->numRemaining(), + 'actions' => $actions, + 'companyName' => is_null($company) ? '' : e($company->name) + ); + } + + $data = array('total'=>$accessCount, 'rows'=>$rows); + + return $data; + } + + + /** + * Generates the JSON response for accessory detail view. + * + * Example: + * + * { + * "rows": [ + * { + * "actions": "(link to available actions)", + * "name": "(link to user)" + * } + * ], + * "total": 1 + * } + * + * + * The names of the fields in the returns JSON correspond directly to the the + * names of the fields in the bootstrap-tables in the view. + * + * For debugging, see at /api/accessories/$accessoryID/view + * + * @author [A. Gianotto] [] + * @param int $accessoryId + * @return string JSON containing accessories and their associated atrributes. + **/ + public function getDataView($accessoryID) + { + $accessory = Accessory::find($accessoryID); + + if (!Company::isCurrentUserHasAccess($accessory)) { + return ['total' => 0, 'rows' => []]; + } + + $accessory_users = $accessory->users; + $count = $accessory_users->count(); + + $rows = array(); + + foreach ($accessory_users as $user) { + $actions = 'Checkin'; + + $rows[] = array( + 'name' =>(string) link_to('/admin/users/'.$user->id.'/view', $user->fullName()), + 'actions' => $actions + ); + } + + $data = array('total'=>$count, 'rows'=>$rows); + + return $data; + } +} diff --git a/app/Http/Controllers/AssetMaintenancesController.php b/app/Http/Controllers/AssetMaintenancesController.php new file mode 100644 index 0000000000..ee85801267 --- /dev/null +++ b/app/Http/Controllers/AssetMaintenancesController.php @@ -0,0 +1,485 @@ +route('asset_maintenances') + ->with('error', Lang::get('general.insufficient_permissions')); + } + + /** + * getIndex + * + * @return mixed + * @author Vincent Sposato + * @version v1.0 + */ + public function getIndex() + { + + return View::make('asset_maintenances/index'); + } + + /** + * getDatatable + * Gets the datatable for the index page + * + * @return mixed + * @author Vincent Sposato + * @version v1.0 + */ + + public function getDatatable() + { + $maintenances = AssetMaintenance::with('asset', 'supplier', 'asset.company') + ->whereNull('deleted_at'); + + if (Input::has('search')) { + $maintenances = $maintenances->TextSearch(e(Input::get('search'))); + } + + if (Input::has('offset')) { + $offset = e(Input::get('offset')); + } else { + $offset = 0; + } + + if (Input::has('limit')) { + $limit = e(Input::get('limit')); + } else { + $limit = 50; + } + + $allowed_columns = ['id','title','asset_maintenance_time','asset_maintenance_type','cost','start_date','completion_date','notes']; + $order = Input::get('order') === 'asc' ? 'asc' : 'desc'; + $sort = in_array(Input::get('sort'), $allowed_columns) ? Input::get('sort') : 'created_at'; + + $maintenances->orderBy($sort, $order); + + $maintenancesCount = $maintenances->count(); + $maintenances = $maintenances->skip($offset)->take($limit)->get(); + + $rows = array(); + $settings = Setting::getSettings(); + + foreach ($maintenances as $maintenance) { + + $actions = ''; + + if (($maintenance->cost) && ($maintenance->asset->assetloc) && ($maintenance->asset->assetloc->currency!='')) { + $maintenance_cost = $maintenance->asset->assetloc->currency.$maintenance->cost; + } else { + $maintenance_cost = $settings->default_currency.$maintenance->cost; + } + + $company = $maintenance->asset->company; + + $rows[] = array( + 'id' => $maintenance->id, + 'asset_name' => (string)link_to('/hardware/'.$maintenance->asset->id.'/view', $maintenance->asset->showAssetName()) , + 'title' => $maintenance->title, + 'notes' => $maintenance->notes, + 'supplier' => $maintenance->supplier->name, + 'cost' => $maintenance_cost, + 'asset_maintenance_type' => e($maintenance->asset_maintenance_type), + 'start_date' => $maintenance->start_date, + 'asset_maintenance_time' => $maintenance->asset_maintenance_time, + 'completion_date' => $maintenance->completion_date, + 'actions' => $actions, + 'companyName' => is_null($company) ? '' : $company->name + ); + } + + $data = array('total' => $maintenancesCount, 'rows' => $rows); + return $data; + + } + + /** + * getCreate + * + * @param null $assetId + * + * @return mixed + * @author Vincent Sposato + * @version v1.0 + */ + public function getCreate($assetId = null) + { + // Prepare Asset Maintenance Type List + $assetMaintenanceType = [ + '' => 'Select an asset maintenance type', + ] + AssetMaintenance::getImprovementOptions(); + // Mark the selected asset, if it came in + $selectedAsset = $assetId; + // Get the possible assets using a left join to get a list of assets and some other helpful info + $asset = Company::scopeCompanyables(DB::table('assets'), 'assets.company_id') + ->leftJoin('users', 'users.id', '=', 'assets.assigned_to') + ->leftJoin('models', 'assets.model_id', '=', 'models.id') + ->select( + 'assets.id', + 'assets.name', + 'first_name', + 'last_name', + 'asset_tag', + DB::raw('concat(first_name," ",last_name) as full_name, assets.id as id, models.name as modelname') + ) + ->whereNull('assets.deleted_at') + ->get(); + $asset_array = json_decode(json_encode($asset), true); + $asset_element[ '' ] = 'Please select an asset'; + // Build a list out of the data results + for ($x = 0; $x < count($asset_array); $x++) { + + if ($asset_array[ $x ][ 'full_name' ] != '') { + $full_name = ' (' . $asset_array[ $x ][ 'full_name' ] . ') ' . $asset_array[ $x ][ 'modelname' ]; + } else { + $full_name = ' (Unassigned) ' . $asset_array[ $x ][ 'modelname' ]; + } + $asset_element[ $asset_array[ $x ][ 'id' ] ] = + $asset_array[ $x ][ 'asset_tag' ] . ' - ' . $asset_array[ $x ][ 'name' ] . $full_name; + } + // Get Supplier List + $supplier_list = Helper::suppliersList(); + + // Render the view + return View::make('asset_maintenances/edit') + ->with('asset_list', $asset_element) + ->with('selectedAsset', $selectedAsset) + ->with('supplier_list', $supplier_list) + ->with('assetMaintenanceType', $assetMaintenanceType) + ->with('assetMaintenance', new AssetMaintenance); + } + + /** + * postCreate + * + * @return mixed + * @author Vincent Sposato + * @version v1.0 + */ + public function postCreate() + { + + // get the POST data + $new = Input::all(); + + // create a new model instance + $assetMaintenance = new AssetMaintenance(); + + + if (e(Input::get('supplier_id')) == '') { + $assetMaintenance->supplier_id = null; + } else { + $assetMaintenance->supplier_id = e(Input::get('supplier_id')); + } + + if (e(Input::get('is_warranty')) == '') { + $assetMaintenance->is_warranty = 0; + } else { + $assetMaintenance->is_warranty = e(Input::get('is_warranty')); + } + + if (e(Input::get('cost')) == '') { + $assetMaintenance->cost = ''; + } else { + $assetMaintenance->cost = e(Input::get('cost')); + } + + if (e(Input::get('notes')) == '') { + $assetMaintenance->notes = null; + } else { + $assetMaintenance->notes = e(Input::get('notes')); + } + + $asset = Asset::find(e(Input::get('asset_id'))); + + if (!Company::isCurrentUserHasAccess($asset)) { + return static::getInsufficientPermissionsRedirect(); + } + + // Save the asset maintenance data + $assetMaintenance->asset_id = e(Input::get('asset_id')); + $assetMaintenance->asset_maintenance_type = e(Input::get('asset_maintenance_type')); + $assetMaintenance->title = e(Input::get('title')); + $assetMaintenance->start_date = e(Input::get('start_date')); + $assetMaintenance->completion_date = e(Input::get('completion_date')); + + if (( $assetMaintenance->completion_date == "" ) + || ( $assetMaintenance->completion_date == "0000-00-00" ) + ) { + $assetMaintenance->completion_date = null; + } + + if (( $assetMaintenance->completion_date !== "" ) + && ( $assetMaintenance->completion_date !== "0000-00-00" ) + && ( $assetMaintenance->start_date !== "" ) + && ( $assetMaintenance->start_date !== "0000-00-00" ) + ) { + $startDate = Carbon::parse($assetMaintenance->start_date); + $completionDate = Carbon::parse($assetMaintenance->completion_date); + $assetMaintenance->asset_maintenance_time = $completionDate->diffInDays($startDate); + } + + // Was the asset maintenance created? + if ($assetMaintenance->save()) { + + // Redirect to the new asset maintenance page + return Redirect::to("admin/asset_maintenances") + ->with('success', Lang::get('admin/asset_maintenances/message.create.success')); + } + + return redirect()->back()->withInput()->withErrors($assetMaintenance->getErrors()); + + + + + } + + /** + * getEdit + * + * @param null $assetMaintenanceId + * + * @return mixed + * @author Vincent Sposato + * @version v1.0 + */ + public function getEdit($assetMaintenanceId = null) + { + // Check if the asset maintenance exists + if (is_null($assetMaintenance = AssetMaintenance::find($assetMaintenanceId))) { + // Redirect to the improvement management page + return Redirect::to('admin/asset_maintenances') + ->with('error', Lang::get('admin/asset_maintenances/message.not_found')); + } elseif (!Company::isCurrentUserHasAccess($assetMaintenance->asset)) { + return static::getInsufficientPermissionsRedirect(); + } + + if ($assetMaintenance->completion_date == '0000-00-00') { + $assetMaintenance->completion_date = null; + } + + if ($assetMaintenance->start_date == '0000-00-00') { + $assetMaintenance->start_date = null; + } + + if ($assetMaintenance->cost == '0.00') { + $assetMaintenance->cost = null; + } + + // Prepare Improvement Type List + $assetMaintenanceType = [ + '' => 'Select an improvement type', + ] + AssetMaintenance::getImprovementOptions(); + + // Get the possible assets using a left join to get a list of assets and some other helpful info + $asset = Company::scopeCompanyables(DB::table('assets'), 'assets.company_id') + ->leftJoin('users', 'users.id', '=', 'assets.assigned_to') + ->leftJoin('models', 'assets.model_id', '=', 'models.id') + ->select( + 'assets.id', + 'assets.name', + 'first_name', + 'last_name', + 'asset_tag', + DB::raw('concat(first_name," ",last_name) as full_name, assets.id as id, models.name as modelname') + ) + ->whereNull('assets.deleted_at') + ->get(); + $asset_array = json_decode(json_encode($asset), true); + $asset_element[ '' ] = 'Please select an asset'; + // Build a list out of the data results + for ($x = 0; $x < count($asset_array); $x++) { + + if ($asset_array[ $x ][ 'full_name' ] != '') { + $full_name = ' (' . $asset_array[ $x ][ 'full_name' ] . ') ' . $asset_array[ $x ][ 'modelname' ]; + } else { + $full_name = ' (Unassigned) ' . $asset_array[ $x ][ 'modelname' ]; + } + $asset_element[ $asset_array[ $x ][ 'id' ] ] = + $asset_array[ $x ][ 'asset_tag' ] . ' - ' . $asset_array[ $x ][ 'name' ] . $full_name; + } + // Get Supplier List + $supplier_list = Helper::suppliersList(); + + // Render the view + return View::make('asset_maintenances/edit') + ->with('asset_list', $asset_element) + ->with('selectedAsset', null) + ->with('supplier_list', $supplier_list) + ->with('assetMaintenanceType', $assetMaintenanceType) + ->with('assetMaintenance', $assetMaintenance); + + } + + /** + * postEdit + * + * @param null $assetMaintenanceId + * + * @return mixed + * @author Vincent Sposato + * @version v1.0 + */ + public function postEdit($assetMaintenanceId = null) + { + + // get the POST data + $new = Input::all(); + + // Check if the asset maintenance exists + if (is_null($assetMaintenance = AssetMaintenance::find($assetMaintenanceId))) { + // Redirect to the asset maintenance management page + return Redirect::to('admin/asset_maintenances') + ->with('error', Lang::get('admin/asset_maintenances/message.not_found')); + } elseif (!Company::isCurrentUserHasAccess($assetMaintenance->asset)) { + return static::getInsufficientPermissionsRedirect(); + } + + + + if (e(Input::get('supplier_id')) == '') { + $assetMaintenance->supplier_id = null; + } else { + $assetMaintenance->supplier_id = e(Input::get('supplier_id')); + } + + if (e(Input::get('is_warranty')) == '') { + $assetMaintenance->is_warranty = 0; + } else { + $assetMaintenance->is_warranty = e(Input::get('is_warranty')); + } + + if (e(Input::get('cost')) == '') { + $assetMaintenance->cost = ''; + } else { + $assetMaintenance->cost = e(Input::get('cost')); + } + + if (e(Input::get('notes')) == '') { + $assetMaintenance->notes = null; + } else { + $assetMaintenance->notes = e(Input::get('notes')); + } + + $asset = Asset::find(e(Input::get('asset_id'))); + + if (!Company::isCurrentUserHasAccess($asset)) { + return static::getInsufficientPermissionsRedirect(); + } + + // Save the asset maintenance data + $assetMaintenance->asset_id = e(Input::get('asset_id')); + $assetMaintenance->asset_maintenance_type = e(Input::get('asset_maintenance_type')); + $assetMaintenance->title = e(Input::get('title')); + $assetMaintenance->start_date = e(Input::get('start_date')); + $assetMaintenance->completion_date = e(Input::get('completion_date')); + + if (( $assetMaintenance->completion_date == "" ) + || ( $assetMaintenance->completion_date == "0000-00-00" ) + ) { + $assetMaintenance->completion_date = null; + if (( $assetMaintenance->asset_maintenance_time !== 0 ) + || ( !is_null($assetMaintenance->asset_maintenance_time) ) + ) { + $assetMaintenance->asset_maintenance_time = null; + } + } + + if (( $assetMaintenance->completion_date !== "" ) + && ( $assetMaintenance->completion_date !== "0000-00-00" ) + && ( $assetMaintenance->start_date !== "" ) + && ( $assetMaintenance->start_date !== "0000-00-00" ) + ) { + $startDate = Carbon::parse($assetMaintenance->start_date); + $completionDate = Carbon::parse($assetMaintenance->completion_date); + $assetMaintenance->asset_maintenance_time = $completionDate->diffInDays($startDate); + } + + // Was the asset maintenance created? + if ($assetMaintenance->save()) { + + // Redirect to the new asset maintenance page + return Redirect::to("admin/asset_maintenances") + ->with('success', Lang::get('admin/asset_maintenances/message.create.success')); + } + return Redirect::back() ->withInput()->withErrors($assetMaintenance->getErrors()); + + + } + + /** + * getDelete + * + * @param $assetMaintenanceId + * + * @return mixed + * @author Vincent Sposato + * @version v1.0 + */ + public function getDelete($assetMaintenanceId) + { + // Check if the asset maintenance exists + if (is_null($assetMaintenance = AssetMaintenance::find($assetMaintenanceId))) { + // Redirect to the asset maintenance management page + return Redirect::to('admin/asset_maintenances') + ->with('error', Lang::get('admin/asset_maintenances/message.not_found')); + } elseif (!Company::isCurrentUserHasAccess($assetMaintenance->asset)) { + return static::getInsufficientPermissionsRedirect(); + } + + // Delete the asset maintenance + $assetMaintenance->delete(); + + // Redirect to the asset_maintenance management page + return Redirect::to('admin/asset_maintenances') + ->with('success', Lang::get('admin/asset_maintenances/message.delete.success')); + } + + /** + * getView + * + * @param $assetMaintenanceId + * + * @return mixed + * @author Vincent Sposato + * @version v1.0 + */ + public function getView($assetMaintenanceId) + { + // Check if the asset maintenance exists + if (is_null($assetMaintenance = AssetMaintenance::find($assetMaintenanceId))) { + // Redirect to the asset maintenance management page + return Redirect::to('admin/asset_maintenances') + ->with('error', Lang::get('admin/asset_maintenances/message.not_found')); + } elseif (!Company::isCurrentUserHasAccess($assetMaintenance->asset)) { + return static::getInsufficientPermissionsRedirect(); + } + + return View::make('asset_maintenances/view')->with('assetMaintenance', $assetMaintenance); + } +} diff --git a/app/Http/Controllers/AssetModelsController.php b/app/Http/Controllers/AssetModelsController.php new file mode 100755 index 0000000000..dfc9bb1ffa --- /dev/null +++ b/app/Http/Controllers/AssetModelsController.php @@ -0,0 +1,550 @@ +] + * @see AssetModelsController::getDatatable() method that generates the JSON response + * @since [v1.0] + * @return View + */ + public function getIndex() + { + // Show the page + return View::make('models/index'); + } + + /** + * Returns a view containing the asset model creation form. + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @return View + */ + public function getCreate() + { + // Show the page + $depreciation_list = \App\Helpers\Helper::depreciationList(); + $manufacturer_list = \App\Helpers\Helper::manufacturerList(); + $category_list = \App\Helpers\Helper::categoryList(); + return View::make('models/edit') + ->with('category_list', $category_list) + ->with('depreciation_list', $depreciation_list) + ->with('manufacturer_list', $manufacturer_list) + ->with('model', new AssetModel); + } + + + /** + * Validate and process the new Asset Model data. + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @return Redirect + */ + public function postCreate() + { + + // Create a new asset model + $model = new AssetModel; + + + if (e(Input::get('depreciation_id')) == '') { + $model->depreciation_id = 0; + } else { + $model->depreciation_id = e(Input::get('depreciation_id')); + } + + if (e(Input::get('eol')) == '') { + $model->eol = 0; + } else { + $model->eol = e(Input::get('eol')); + } + + // Save the model data + $model->name = e(Input::get('name')); + $model->modelno = e(Input::get('modelno')); + $model->manufacturer_id = e(Input::get('manufacturer_id')); + $model->category_id = e(Input::get('category_id')); + $model->note = e(Input::get('note')); + $model->user_id = Auth::user()->id; + if (Input::get('custom_fieldset')!='') { + $model->fieldset_id = e(Input::get('custom_fieldset')); + } + + //$model->show_mac_address = e(Input::get('show_mac_address', '0')); + + + if (Input::file('image')) { + $image = Input::file('image'); + $file_name = str_random(25).".".$image->getClientOriginalExtension(); + $path = public_path('uploads/models/'.$file_name); + // Image::make($image->getRealPath())->resize(300, null, function ($constraint) { + // $constraint->aspectRatio(); + // $constraint->upsize(); + // })->save($path); + $model->image = $file_name; + } + + // Was it created? + if ($model->save()) { + // Redirect to the new model page + return Redirect::to("hardware/models")->with('success', Lang::get('admin/models/message.create.success')); + } + + return Redirect::back()->withInput()->withErrors($model->getErrors()); + + } + + /** + * Validates and stores new Asset Model data created from the + * modal form on the Asset Creation view. + * + * @author [A. Gianotto] [] + * @since [v2.0] + * @return String JSON + */ + public function store() + { + //COPYPASTA!!!! FIXME + $model = new \App\Models\AssetModel; + + $settings=Input::all(); + $settings['eol']=0; + // + + + $model->name=e(Input::get('name')); + $model->manufacturer_id = e(Input::get('manufacturer_id')); + $model->category_id = e(Input::get('category_id')); + $model->modelno = e(Input::get('modelno')); + $model->user_id = Auth::user()->id; + $model->note = e(Input::get('note')); + $model->eol=0; + + if ($model->save()) { + return JsonResponse::create($model); + } else { + return JsonResponse::create(["error" => "Failed validation: ".print_r($model->getErrors()->all('
  • :message
  • '), true)], 500); + } + } + + + /** + * Returns a view containing the asset model edit form. + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @param int $modelId + * @return View + */ + public function getEdit($modelId = null) + { + // Check if the model exists + if (is_null($model = AssetModel::find($modelId))) { + // Redirect to the model management page + return Redirect::to('assets/models')->with('error', Lang::get('admin/models/message.does_not_exist')); + } + + $depreciation_list = \App\Helpers\Helper::depreciationList(); + $manufacturer_list = \App\Helpers\Helper::manufacturerList(); + $category_list = \App\Helpers\Helper::categoryList(); + $view = View::make('models/edit', compact('model')); + $view->with('category_list', $category_list); + $view->with('depreciation_list', $depreciation_list); + $view->with('manufacturer_list', $manufacturer_list); + return $view; + } + + + /** + * Validates and processes form data from the edit + * Asset Model form based on the model ID passed. + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @param int $modelId + * @return Redirect + */ + public function postEdit($modelId = null) + { + // Check if the model exists + if (is_null($model = AssetModel::find($modelId))) { + // Redirect to the models management page + return Redirect::to('admin/models')->with('error', Lang::get('admin/models/message.does_not_exist')); + } + + + if (e(Input::get('depreciation_id')) == '') { + $model->depreciation_id = 0; + } else { + $model->depreciation_id = e(Input::get('depreciation_id')); + } + + if (e(Input::get('eol')) == '') { + $model->eol = 0; + } else { + $model->eol = e(Input::get('eol')); + } + + // Update the model data + $model->name = e(Input::get('name')); + $model->modelno = e(Input::get('modelno')); + $model->manufacturer_id = e(Input::get('manufacturer_id')); + $model->category_id = e(Input::get('category_id')); + $model->note = e(Input::get('note')); + if (Input::get('custom_fieldset')=='') { + $model->fieldset_id = null; + } else { + $model->fieldset_id = e(Input::get('custom_fieldset')); + } + + if (Input::file('image')) { + $image = Input::file('image'); + $file_name = str_random(25).".".$image->getClientOriginalExtension(); + $path = public_path('uploads/models/'.$file_name); + Image::make($image->getRealPath())->resize(300, null, function ($constraint) { + $constraint->aspectRatio(); + $constraint->upsize(); + })->save($path); + $model->image = $file_name; + } + + if (Input::get('image_delete') == 1 && Input::file('image') == "") { + $model->image = null; + } + + // Was it created? + if ($model->save()) { + // Redirect to the new model page + return Redirect::to("hardware/models")->with('success', Lang::get('admin/models/message.update.success')); + } else { + return redirect()->back()->withInput()->withErrors($model->getErrors()); + } + + + // Redirect to the model create page + return Redirect::to("hardware/models/$modelId/edit")->with('error', Lang::get('admin/models/message.update.error')); + + } + + /** + * Validate and delete the given Asset Model. An Asset Model + * cannot be deleted if there are associated assets. + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @param int $modelId + * @return Redirect + */ + public function getDelete($modelId) + { + // Check if the model exists + if (is_null($model = AssetModel::find($modelId))) { + // Redirect to the blogs management page + return Redirect::to('hardware/models')->with('error', Lang::get('admin/models/message.not_found')); + } + + if ($model->assets->count() > 0) { + // Throw an error that this model is associated with assets + return Redirect::to('hardware/models')->with('error', Lang::get('admin/models/message.assoc_users')); + + } else { + // Delete the model + $model->delete(); + + // Redirect to the models management page + return Redirect::to('hardware/models')->with('success', Lang::get('admin/models/message.delete.success')); + } + } + + + /** + * Restore a given Asset Model (mark as un-deleted) + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @param int $modelId + * @return Redirect + */ + public function getRestore($modelId = null) + { + + // Get user information + $model = AssetModel::withTrashed()->find($modelId); + + if (isset($model->id)) { + + // Restore the model + $model->restore(); + + // Prepare the success message + $success = Lang::get('admin/models/message.restore.success'); + + // Redirect back + return Redirect::back()->with('success', $success); + + } else { + return Redirect::back()->with('error', Lang::get('admin/models/message.not_found')); + } + + } + + + /** + * Get the model information to present to the model view page + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @param int $modelId + * @return View + */ + public function getView($modelId = null) + { + $model = AssetModel::withTrashed()->find($modelId); + + if (isset($model->id)) { + return View::make('models/view', compact('model')); + } else { + // Prepare the error message + $error = Lang::get('admin/models/message.does_not_exist', compact('id')); + + // Redirect to the user management page + return Redirect::route('models')->with('error', $error); + } + + + } + + /** + * Get the clone page to clone a model + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @param int $modelId + * @return View + */ + public function getClone($modelId = null) + { + // Check if the model exists + if (is_null($model_to_clone = AssetModel::find($modelId))) { + // Redirect to the model management page + return Redirect::to('assets/models')->with('error', Lang::get('admin/models/message.does_not_exist')); + } + + $model = clone $model_to_clone; + $model->id = null; + + // Show the page + $depreciation_list = array('' => 'Do Not Depreciate') + Depreciation::lists('name', 'id'); + $manufacturer_list = array('' => 'Select One') + Manufacturer::lists('name', 'id'); + $category_list = array('' => '') + DB::table('categories')->whereNull('deleted_at')->lists('name', 'id'); + $view = View::make('models/edit'); + $view->with('category_list', $category_list); + $view->with('depreciation_list', $depreciation_list); + $view->with('manufacturer_list', $manufacturer_list); + $view->with('model', $model); + $view->with('clone_model', $model_to_clone); + return $view; + + } + + + /** + * Get the custom fields form + * + * @author [B. Wetherington] [] + * @since [v2.0] + * @param int $modelId + * @return View + */ + public function getCustomFields($modelId) + { + $model=AssetModel::find($modelId); + return View::make("models.custom_fields_form")->with("model", $model); + } + + + + /** + * Get the JSON response to populate the data tables on the + * Asset Model listing page. + * + * @author [A. Gianotto] [] + * @since [v2.0] + * @param string $status + * @return String JSON + */ + + public function getDatatable($status = null) + { + $models = AssetModel::with('category', 'assets', 'depreciation'); + + switch ($status) { + case 'Deleted': + $models->withTrashed()->Deleted(); + break; + } + + + if (Input::has('search')) { + $models = $models->TextSearch(Input::get('search')); + } + + if (Input::has('offset')) { + $offset = e(Input::get('offset')); + } else { + $offset = 0; + } + + if (Input::has('limit')) { + $limit = e(Input::get('limit')); + } else { + $limit = 50; + } + + + $allowed_columns = ['id','name','modelno']; + $order = Input::get('order') === 'asc' ? 'asc' : 'desc'; + $sort = in_array(Input::get('sort'), $allowed_columns) ? Input::get('sort') : 'created_at'; + + $models = $models->orderBy($sort, $order); + + $modelCount = $models->count(); + $models = $models->skip($offset)->take($limit)->get(); + + $rows = array(); + + foreach ($models as $model) { + if ($model->deleted_at == '') { + $actions = '
    '; + } else { + $actions = ''; + } + + $rows[] = array( + 'id' => $model->id, + 'manufacturer' => (string)link_to('/admin/settings/manufacturers/'.$model->manufacturer->id.'/view', $model->manufacturer->name), + 'name' => (string)link_to('/hardware/models/'.$model->id.'/view', $model->name), + 'image' => ($model->image!='') ? '' : '', + 'modelnumber' => $model->modelno, + 'numassets' => $model->assets->count(), + 'depreciation' => (($model->depreciation)&&($model->depreciation->id > 0)) ? $model->depreciation->name.' ('.$model->depreciation->months.')' : Lang::get('general.no_depreciation'), + 'category' => ($model->category) ? $model->category->name : '', + 'eol' => ($model->eol) ? $model->eol.' '.Lang::get('general.months') : '', + 'note' => $model->getNote(), + 'actions' => $actions + ); + } + + $data = array('total' => $modelCount, 'rows' => $rows); + + return $data; + } + + + /** + * Get the asset information to present to the model view detail page + * + * @author [A. Gianotto] [] + * @since [v2.0] + * @param int $modelId + * @return String JSON + */ + public function getDataView($modelID) + { + $assets = Asset::where('model_id', '=', $modelID)->withTrashed()->with('company'); + + if (Input::has('search')) { + $assets = $assets->TextSearch(Input::get('search')); + } + + if (Input::has('offset')) { + $offset = e(Input::get('offset')); + } else { + $offset = 0; + } + + if (Input::has('limit')) { + $limit = e(Input::get('limit')); + } else { + $limit = 50; + } + + + $allowed_columns = ['name', 'serial','asset_tag']; + $order = Input::get('order') === 'asc' ? 'asc' : 'desc'; + $sort = in_array(Input::get('sort'), $allowed_columns) ? Input::get('sort') : 'created_at'; + + $assets = $assets->orderBy($sort, $order); + + $assetsCount = $assets->count(); + $assets = $assets->skip($offset)->take($limit)->get(); + + $rows = array(); + + + foreach ($assets as $asset) { + $actions = ''; + + if ($asset->assetstatus) { + if ($asset->assetstatus->deployable != 0) { + if (($asset->assigned_to !='') && ($asset->assigned_to > 0)) { + $actions = ''.Lang::get('general.checkin').''; + } else { + $actions = ''.Lang::get('general.checkout').''; + } + } + } + + $rows[] = array( + 'id' => $asset->id, + 'name' => (string)link_to('/hardware/'.$asset->id.'/view', $asset->showAssetName()), + 'asset_tag' => (string)link_to('hardware/'.$asset->id.'/view', $asset->asset_tag), + 'serial' => $asset->serial, + 'assigned_to' => ($asset->assigned_to) ? (string)link_to('/admin/users/'.$asset->assigned_to.'/view', $asset->assigneduser->fullName()) : '', + 'actions' => $actions, + 'companyName' => Company::getName($asset) + ); + } + + $data = array('total' => $assetsCount, 'rows' => $rows); + + return $data; + } +} diff --git a/app/Http/Controllers/AssetsController.php b/app/Http/Controllers/AssetsController.php new file mode 100755 index 0000000000..ec928c29ab --- /dev/null +++ b/app/Http/Controllers/AssetsController.php @@ -0,0 +1,1492 @@ + 3.5, 'width' => 3.5); + protected $barCodeDimensions = array( 'height' => 2, 'width' => 22); + + + public function __construct() + { + $this->middleware('auth'); + parent::__construct(); + } + + + /** + * Returns a view that invokes the ajax tables which actually contains + * the content for the assets listing, which is generated in getDatatable. + * + * @author [A. Gianotto] [] + * @see AssetController::getDatatable() method that generates the JSON response + * @since [v1.0] + * @return View + */ + public function getIndex() + { + return View::make('hardware/index'); + } + + /** + * Returns a view that presents a form to create a new asset. + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @return View + */ + public function getCreate($model_id = null) + { + // Grab the dropdown lists + $model_list = Helper::modelList(); + $statuslabel_list = Helper::statusLabelList(); + $location_list = Helper::locationsList(); + $manufacturer_list = Helper::manufacturerList(); + $category_list = Helper::categoryList(); + $supplier_list = Helper::suppliersList(); + $company_list = Helper::companyList(); + $assigned_to = Helper::usersList(); + $statuslabel_types = Helper::statusTypeList(); + + $view = View::make('hardware/edit'); + $view->with('supplier_list', $supplier_list); + $view->with('company_list', $company_list); + $view->with('model_list', $model_list); + $view->with('statuslabel_list', $statuslabel_list); + $view->with('assigned_to', $assigned_to); + $view->with('location_list', $location_list); + $view->with('asset', new Asset); + $view->with('manufacturer', $manufacturer_list); + $view->with('category', $category_list); + $view->with('statuslabel_types', $statuslabel_types); + + if (!is_null($model_id)) { + $selected_model = AssetAssetModel::find($model_id); + $view->with('selected_model', $selected_model); + } + + return $view; + } + + /** + * Validate and process new asset form data. + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @return Redirect + */ + public function postCreate(AssetRequest $request) + { + // create a new model instance + $asset = new Asset(); + $asset->model()->associate(AssetModel::find(e(Input::get('model_id')))); + + $checkModel = config('app.url').'/api/models/'.e(Input::get('model_id')).'/check'; + + $asset->name = e(Input::get('name')); + $asset->serial = e(Input::get('serial')); + $asset->company_id = \App\Models\Company::getIdForCurrentUser(Input::get('company_id')); + $asset->model_id = e(Input::get('model_id')); + $asset->order_number = e(Input::get('order_number')); + $asset->notes = e(Input::get('notes')); + $asset->asset_tag = e(Input::get('asset_tag')); + $asset->user_id = Auth::user()->id; + $asset->archived = '0'; + $asset->physical = '1'; + $asset->depreciate = '0'; + if (e(Input::get('status_id')) == '') { + $asset->status_id = null; + } else { + $asset->status_id = e(Input::get('status_id')); + } + + if (e(Input::get('warranty_months')) == '') { + $asset->warranty_months = null; + } else { + $asset->warranty_months = e(Input::get('warranty_months')); + } + + if (e(Input::get('purchase_cost')) == '') { + $asset->purchase_cost = null; + } else { + $asset->purchase_cost = \App\Helpers\Helper::ParseFloat(e(Input::get('purchase_cost'))); + } + + if (e(Input::get('purchase_date')) == '') { + $asset->purchase_date = null; + } else { + $asset->purchase_date = e(Input::get('purchase_date')); + } + + if (e(Input::get('assigned_to')) == '') { + $asset->assigned_to = null; + } else { + $asset->assigned_to = e(Input::get('assigned_to')); + } + + if (e(Input::get('supplier_id')) == '') { + $asset->supplier_id = 0; + } else { + $asset->supplier_id = e(Input::get('supplier_id')); + } + + if (e(Input::get('requestable')) == '') { + $asset->requestable = 0; + } else { + $asset->requestable = e(Input::get('requestable')); + } + + if (e(Input::get('rtd_location_id')) == '') { + $asset->rtd_location_id = null; + } else { + $asset->rtd_location_id = e(Input::get('rtd_location_id')); + } + + // Create the image (if one was chosen.) + if (Input::file('image')) { + $image = Input::file('image'); + $file_name = str_random(25).".".$image->getClientOriginalExtension(); + $path = public_path('uploads/assets/'.$file_name); + Image::make($image->getRealPath())->resize(300, null, function ($constraint) { + $constraint->aspectRatio(); + $constraint->upsize(); + })->save($path); + $asset->image = $file_name; + + } + + // Was the asset created? + if ($asset->save()) { + + if (Input::get('assigned_to')!='') { + $logaction = new Actionlog(); + $logaction->asset_id = $asset->id; + $logaction->checkedout_to = $asset->assigned_to; + $logaction->asset_type = 'hardware'; + $logaction->user_id = Auth::user()->id; + $logaction->note = e(Input::get('note')); + $log = $logaction->logaction('checkout'); + } + // Redirect to the asset listing page + return Redirect::to("hardware")->with('success', Lang::get('admin/hardware/message.create.success')); + } + + return Redirect::back()->withInput()->withErrors($asset->getErrors()); + + } + + /** + * Returns a view that presents a form to edit an existing asset. + * + * @author [A. Gianotto] [] + * @param int $assetId + * @since [v1.0] + * @return View + */ + public function getEdit($assetId = null) + { + // Check if the asset exists + if (is_null($asset = Asset::find($assetId))) { + // Redirect to the asset management page + return Redirect::to('hardware')->with('error', Lang::get('admin/hardware/message.does_not_exist')); + } elseif (!Company::isCurrentUserHasAccess($asset)) { + return Redirect::to('hardware')->with('error', Lang::get('general.insufficient_permissions')); + } + + // Grab the dropdown lists + $model_list = Helper::modelList(); + $statuslabel_list = Helper::statusLabelList(); + $location_list = Helper::locationsList(); + $manufacturer_list = Helper::manufacturerList(); + $category_list = Helper::categoryList(); + $supplier_list = Helper::suppliersList(); + $company_list = Helper::companyList(); + $assigned_to = Helper::usersList(); + $statuslabel_types =Helper:: statusTypeList(); + + return View::make('hardware/edit', compact('asset')) + ->with('model_list', $model_list) + ->with('supplier_list', $supplier_list) + ->with('company_list', $company_list) + ->with('location_list', $location_list) + ->with('statuslabel_list', $statuslabel_list) + ->with('assigned_to', $assigned_to) + ->with('manufacturer', $manufacturer_list) + ->with('statuslabel_types', $statuslabel_types) + ->with('category', $category_list); + } + + + /** + * Validate and process asset edit form. + * + * @author [A. Gianotto] [] + * @param int $assetId + * @since [v1.0] + * @return Redirect + */ + public function postEdit($assetId = null) + { + // Check if the asset exists + if (is_null($asset = Asset::find($assetId))) { + // Redirect to the asset management page with error + return Redirect::to('hardware')->with('error', Lang::get('admin/hardware/message.does_not_exist')); + } elseif (!Company::isCurrentUserHasAccess($asset)) { + return Redirect::to('hardware')->with('error', Lang::get('general.insufficient_permissions')); + } + + // $input=Input::all(); + // // return "INPUT IS:
    ".print_r($input,true)."
    "; + // $rules=$asset->validationRules($assetId); + // $model=AssetModel::find(e(Input::get('model_id'))); //validate by the NEW model's custom fields, not the current one + // if($model->fieldset) + // { + // foreach($model->fieldset->fields AS $field) { + // $input[$field->db_column_name()]=$input['fields'][$field->db_column_name()]; + // $asset->{$field->db_column_name()}=$input[$field->db_column_name()]; + // } + // $rules+=$model->fieldset->validation_rules(); + // unset($input['fields']); + // } + + //return "Rules:
    ".print_r($rules,true)."
    "; + + //attempt to validate + // $validator = Validator::make($input, $rules ); + // + // $custom_errors=[]; + + + if (e(Input::get('status_id')) == '') { + $asset->status_id = null; + } else { + $asset->status_id = e(Input::get('status_id')); + } + + if (e(Input::get('warranty_months')) == '') { + $asset->warranty_months = null; + } else { + $asset->warranty_months = e(Input::get('warranty_months')); + } + + if (e(Input::get('purchase_cost')) == '') { + $asset->purchase_cost = null; + } else { + $asset->purchase_cost = \App\Helpers\Helper::ParseFloat(e(Input::get('purchase_cost'))); + } + + if (e(Input::get('purchase_date')) == '') { + $asset->purchase_date = null; + } else { + $asset->purchase_date = e(Input::get('purchase_date')); + } + + if (e(Input::get('supplier_id')) == '') { + $asset->supplier_id = null; + } else { + $asset->supplier_id = e(Input::get('supplier_id')); + } + + if (e(Input::get('requestable')) == '') { + $asset->requestable = 0; + } else { + $asset->requestable = e(Input::get('requestable')); + } + + if (e(Input::get('rtd_location_id')) == '') { + $asset->rtd_location_id = 0; + } else { + $asset->rtd_location_id = e(Input::get('rtd_location_id')); + } + + if (Input::has('image_delete')) { + unlink(public_path().'/uploads/assets/'.$asset->image); + $asset->image = ''; + } + + + + $checkModel = config('app.url').'/api/models/'.e(Input::get('model_id')).'/check'; + //$asset->mac_address = ($checkModel == true) ? e(Input::get('mac_address')) : NULL; + + // Update the asset data + $asset->name = e(Input::get('name')); + $asset->serial = e(Input::get('serial')); + $asset->company_id = Company::getIdForCurrentUser(Input::get('company_id')); + $asset->model_id = e(Input::get('model_id')); + $asset->order_number = e(Input::get('order_number')); + $asset->asset_tag = e(Input::get('asset_tag')); + $asset->notes = e(Input::get('notes')); + $asset->physical = '1'; + + // Update the image + if (Input::file('image')) { + $image = Input::file('image'); + $file_name = str_random(25).".".$image->getClientOriginalExtension(); + $path = public_path('uploads/assets/'.$file_name); + Image::make($image->getRealPath())->resize(300, null, function ($constraint) { + $constraint->aspectRatio(); + $constraint->upsize(); + })->save($path); + $asset->image = $file_name; + } + + + + // Was the asset updated? + if ($asset->save()) { + // Redirect to the new asset page + return Redirect::to("hardware/$assetId/view")->with('success', Lang::get('admin/hardware/message.update.success')); + } + + return Redirect::back()->withInput()->withErrors($asset->getErrors()); + + } + + /** + * Delete a given asset (mark as deleted). + * + * @author [A. Gianotto] [] + * @param int $assetId + * @since [v1.0] + * @return Redirect + */ + public function getDelete($assetId) + { + // Check if the asset exists + if (is_null($asset = Asset::find($assetId))) { + // Redirect to the asset management page with error + return Redirect::to('hardware')->with('error', Lang::get('admin/hardware/message.does_not_exist')); + } elseif (!Company::isCurrentUserHasAccess($asset)) { + return Redirect::to('hardware')->with('error', Lang::get('general.insufficient_permissions')); + } + + DB::table('assets') + ->where('id', $asset->id) + ->update(array('assigned_to' => null)); + + + $asset->delete(); + + // Redirect to the asset management page + return Redirect::to('hardware')->with('success', Lang::get('admin/hardware/message.delete.success')); + + + + + } + + /** + * Returns a view that presents a form to check an asset out to a + * user. + * + * @author [A. Gianotto] [] + * @param int $assetId + * @since [v1.0] + * @return View + */ + public function getCheckout($assetId) + { + // Check if the asset exists + if (is_null($asset = Asset::find($assetId))) { + // Redirect to the asset management page with error + return Redirect::to('hardware')->with('error', Lang::get('admin/hardware/message.does_not_exist')); + } elseif (!Company::isCurrentUserHasAccess($asset)) { + return Redirect::to('hardware')->with('error', Lang::get('general.insufficient_permissions')); + } + + // Get the dropdown of users and then pass it to the checkout view + $users_list = Helper::usersList(); + + return View::make('hardware/checkout', compact('asset'))->with('users_list', $users_list); + + } + + /** + * Validate and process the form data to check out an asset to a user. + * + * @author [A. Gianotto] [] + * @param int $assetId + * @since [v1.0] + * @return Redirect + */ + public function postCheckout(AssetCheckoutRequest $request, $assetId) + { + + // Check if the asset exists + if (!$asset = Asset::find($assetId)) { + return Redirect::to('hardware')->with('error', Lang::get('admin/hardware/message.does_not_exist')); + } elseif (!Company::isCurrentUserHasAccess($asset)) { + return Redirect::to('hardware')->with('error', Lang::get('general.insufficient_permissions')); + } + + $user = User::find(e(Input::get('assigned_to'))); + $admin = Auth::user(); + + + + if (Input::get('checkout_at')!= date("Y-m-d")) { + $checkout_at = e(Input::get('checkout_at')).' 00:00:00'; + } else { + $checkout_at = date("Y-m-d H:i:s"); + } + + if (Input::has('expected_checkin')) { + $expected_checkin = e(Input::get('expected_checkin')); + } else { + $expected_checkin = ''; + } + + + if ($asset->checkOutToUser($user, $admin, $checkout_at, $expected_checkin, e(Input::get('note')), e(Input::get('name')))) { + // Redirect to the new asset page + return Redirect::to("hardware")->with('success', Lang::get('admin/hardware/message.checkout.success')); + } + + // Redirect to the asset management page with error + return Redirect::to("hardware/$assetId/checkout")->with('error', Lang::get('admin/hardware/message.checkout.error'))->withErrors($asset->getErrors()); + } + + + /** + * Returns a view that presents a form to check an asset back into inventory. + * + * @author [A. Gianotto] [] + * @param int $assetId + * @param string $backto + * @since [v1.0] + * @return View + */ + public function getCheckin($assetId, $backto = null) + { + // Check if the asset exists + if (is_null($asset = Asset::find($assetId))) { + // Redirect to the asset management page with error + return Redirect::to('hardware')->with('error', Lang::get('admin/hardware/message.does_not_exist')); + } elseif (!Company::isCurrentUserHasAccess($asset)) { + return Redirect::to('hardware')->with('error', Lang::get('general.insufficient_permissions')); + } + $statusLabel_list = Helper::statusLabelList(); + return View::make('hardware/checkin', compact('asset'))->with('statusLabel_list', $statusLabel_list)->with('backto', $backto); + } + + + /** + * Validate and process the form data to check an asset back into inventory. + * + * @author [A. Gianotto] [] + * @param int $assetId + * @since [v1.0] + * @return Redirect + */ + public function postCheckin(AssetCheckinRequest $request, $assetId = null, $backto = null) + { + // Check if the asset exists + if (is_null($asset = Asset::find($assetId))) { + // Redirect to the asset management page with error + return Redirect::to('hardware')->with('error', Lang::get('admin/hardware/message.does_not_exist')); + } elseif (!Company::isCurrentUserHasAccess($asset)) { + return Redirect::to('hardware')->with('error', Lang::get('general.insufficient_permissions')); + } + + // Check for a valid user to checkout fa-random + // This will need to be tweaked for checkout to location + if (!is_null($asset->assigned_to)) { + $user = User::find($asset->assigned_to); + } else { + return Redirect::to('hardware')->with('error', Lang::get('admin/hardware/message.checkin.already_checked_in')); + } + + // This is just used for the redirect + $return_to = $asset->assigned_to; + + $logaction = new Actionlog(); + $logaction->checkedout_to = $asset->assigned_to; + + // Update the asset data to null, since it's being checked in + $asset->assigned_to = null; + $asset->accepted = null; + + $asset->expected_checkin = null; + $asset->last_checkout = null; + + if (Input::has('status_id')) { + $asset->status_id = e(Input::get('status_id')); + } + // Was the asset updated? + if ($asset->save()) { + + if (Input::has('checkin_at')) { + + if (!strtotime(Input::get('checkin_at'))) { + $logaction->created_at = date("Y-m-d H:i:s"); + } elseif (Input::get('checkin_at')!= date("Y-m-d")) { + $logaction->created_at = e(Input::get('checkin_at')).' 00:00:00'; + } + } + + $logaction->asset_id = $asset->id; + $logaction->location_id = null; + $logaction->asset_type = 'hardware'; + $logaction->note = e(Input::get('note')); + $logaction->user_id = Auth::user()->id; + $log = $logaction->logaction('checkin from'); + + $settings = Setting::getSettings(); + + if ($settings->slack_endpoint) { + + $slack_settings = [ + 'username' => $settings->botname, + 'channel' => $settings->slack_channel, + 'link_names' => true + ]; + + $client = new \Maknz\Slack\Client($settings->slack_endpoint, $slack_settings); + + try { + $client->attach([ + 'color' => 'good', + 'fields' => [ + [ + 'title' => 'Checked In:', + 'value' => strtoupper($logaction->asset_type).' asset <'.config('app.url').'/hardware/'.$asset->id.'/view'.'|'.$asset->showAssetName().'> checked in by <'.config('app.url').'/hardware/'.$asset->id.'/view'.'|'.Auth::user()->fullName().'>.' + ], + [ + 'title' => 'Note:', + 'value' => e($logaction->note) + ], + + ] + ])->send('Asset Checked In'); + + } catch (Exception $e) { + + } + + } + + $data['log_id'] = $logaction->id; + $data['first_name'] = $user->first_name; + $data['item_name'] = $asset->showAssetName(); + $data['checkin_date'] = $logaction->created_at; + $data['item_tag'] = $asset->asset_tag; + $data['item_serial'] = $asset->serial; + $data['note'] = $logaction->note; + + if ((($asset->checkin_email()=='1')) && ($user) && (!config('app.lock_passwords'))) { + Mail::send('emails.checkin-asset', $data, function ($m) use ($user) { + $m->to($user->email, $user->first_name . ' ' . $user->last_name); + $m->subject('Confirm Asset Checkin'); + }); + } + + if ($backto=='user') { + return Redirect::to("admin/users/".$return_to.'/view')->with('success', Lang::get('admin/hardware/message.checkin.success')); + } else { + return Redirect::to("hardware")->with('success', Lang::get('admin/hardware/message.checkin.success')); + } + + } + + // Redirect to the asset management page with error + return Redirect::to("hardware")->with('error', Lang::get('admin/hardware/message.checkin.error')); + } + + + /** + * Returns a view that presents information about an asset for detail view. + * + * @author [A. Gianotto] [] + * @param int $assetId + * @since [v1.0] + * @return View + */ + public function getView($assetId = null) + { + $asset = Asset::withTrashed()->find($assetId); + $settings = Setting::getSettings(); + + if (!Company::isCurrentUserHasAccess($asset)) { + return Redirect::to('hardware')->with('error', Lang::get('general.insufficient_permissions')); + } elseif ($asset->userloc) { + $use_currency = $asset->userloc->currency; + } elseif ($asset->assetloc) { + $use_currency = $asset->assetloc->currency; + } else { + $default_currency = Setting::first()->default_currency; + + if ($settings->default_currency!='') { + $use_currency = $settings->default_currency; + } else { + $use_currency = Lang::get('general.currency'); + } + + } + + if (isset($asset->id)) { + + + + $qr_code = (object) array( + 'display' => $settings->qr_code == '1', + 'url' => route('qr_code/hardware', $asset->id) + ); + + return View::make('hardware/view', compact('asset', 'qr_code', 'settings'))->with('use_currency', $use_currency); + } else { + // Prepare the error message + $error = Lang::get('admin/hardware/message.does_not_exist', compact('id')); + + // Redirect to the user management page + return Redirect::route('hardware')->with('error', $error); + } + + } + + /** + * Return a QR code for the asset + * + * @author [A. Gianotto] [] + * @param int $assetId + * @since [v1.0] + * @return Response + */ + public function getQrCode($assetId = null) + { + $settings = Setting::getSettings(); + + if ($settings->qr_code == '1') { + $asset = Asset::find($assetId); + $size = Helper::barcodeDimensions($settings->barcode_type); + + if (!Company::isCurrentUserHasAccess($asset)) { + return Redirect::to('hardware')->with('error', Lang::get('general.insufficient_permissions')); + } + + if (isset($asset->id,$asset->asset_tag)) { + $barcode = new \Com\Tecnick\Barcode\Barcode(); + $barcode_obj = $barcode->getBarcodeObj($settings->barcode_type, route('view/hardware', $asset->id), $size['height'], $size['width'], 'black', array(-2, -2, -2, -2)); + + return response($barcode_obj->getPngData())->header('Content-type', 'image/png'); + } + } + + } + + + /** + * Get the Asset import upload page. + * + * @author [A. Gianotto] [] + * @since [v2.0] + * @return View + */ + public function getImportUpload() + { + + $path = storage_path().'/app/private_uploads/imports/assets'; + $files = array(); + + if (!Company::isCurrentUserAuthorized()) { + return Redirect::to('hardware')->with('error', Lang::get('general.insufficient_permissions')); + } + + if ($handle = opendir($path)) { + + /* This is the correct way to loop over the directory. */ + while (false !== ($entry = readdir($handle))) { + clearstatcache(); + if (substr(strrchr($entry, '.'), 1)=='csv') { + $files[] = array( + 'filename' => $entry, + 'filesize' => Setting::fileSizeConvert(filesize($path.'/'.$entry)), + 'modified' => filemtime($path.'/'.$entry) + ); + } + + } + closedir($handle); + $files = array_reverse($files); + } + + return View::make('hardware/import')->with('files', $files); + } + + + + /** + * Upload the import file via AJAX + * + * @author [A. Gianotto] [] + * @since [v2.0] + * @return View + */ + public function postAPIImportUpload(AssetFileRequest $request) + { + + if (!Company::isCurrentUserAuthorized()) { + return Redirect::to('hardware')->with('error', Lang::get('general.insufficient_permissions')); + + } elseif (!config('app.lock_passwords')) { + + $files = Input::file('files'); + $path = storage_path().'/app/private_uploads/imports/assets'; + $results = array(); + + foreach ($files as $file) { + + if (!in_array($file->getMimeType(), array( + 'application/vnd.ms-excel', + 'text/csv', + 'text/plain', + 'text/comma-separated-values', + 'text/tsv'))) { + $results['error']='File type must be CSV'; + return $results; + } + + $date = date('Y-m-d-his'); + $fixed_filename = str_replace(' ', '-', $file->getClientOriginalName()); + $file->move($path, $date.'-'.$fixed_filename); + $name = date('Y-m-d-his').'-'.$fixed_filename; + $filesize = \App\Models\Setting::fileSizeConvert(filesize($path.'/'.$name)); + $results[] = compact('name', 'filesize'); + } + + return array( + 'files' => $results + ); + + + + + } else { + + $results['error']=Lang::get('general.feature_disabled'); + return $results; + } + + + + } + + + /** + * Process the uploaded file + * + * @author [A. Gianotto] [] + * @param string $filename + * @since [v2.0] + * @return Redirect + */ + public function getProcessImportFile($filename) + { + // php artisan asset-import:csv path/to/your/file.csv --domain=yourdomain.com --email_format=firstname.lastname + + if (!Company::isCurrentUserAuthorized()) { + return Redirect::to('hardware')->with('error', Lang::get('general.insufficient_permissions')); + } + + $output = new BufferedOutput; + Artisan::call('asset-import:csv', ['filename'=> storage_path().'/app/private_uploads/imports/assets/'.$filename, '--email_format'=>'firstname.lastname', '--username_format'=>'firstname.lastname'], $output); + $display_output = $output->fetch(); + $file = storage_path().'/app/private_uploads/imports/assets/'.str_replace('.csv', '', $filename).'-output-'.date("Y-m-d-his").'.txt'; + file_put_contents($file, $display_output); + + + return Redirect::to('hardware')->with('success', 'Your file has been imported'); + + } + + /** + * Returns a view that presents a form to clone an asset. + * + * @author [A. Gianotto] [] + * @param int $assetId + * @since [v1.0] + * @return View + */ + public function getClone($assetId = null) + { + // Check if the asset exists + if (is_null($asset_to_clone = Asset::find($assetId))) { + // Redirect to the asset management page + return Redirect::to('hardware')->with('error', Lang::get('admin/hardware/message.does_not_exist')); + } elseif (!Company::isCurrentUserHasAccess($asset_to_clone)) { + return Redirect::to('hardware')->with('error', Lang::get('general.insufficient_permissions')); + } + + // Grab the dropdown lists + $model_list = Helper::modelList(); + $statuslabel_list = Helper::statusLabelList(); + $location_list = Helper::locationsList(); + $manufacturer_list = Helper::manufacturerList(); + $category_list = Helper::categoryList(); + $supplier_list = Helper::suppliersList(); + $assigned_to =Helper::usersList(); + $statuslabel_types = Helper::statusTypeList(); + $company_list = Helper::companyList(); + + $asset = clone $asset_to_clone; + $asset->id = null; + $asset->asset_tag = ''; + $asset->serial = ''; + $asset->assigned_to = ''; + + return View::make('hardware/edit') + ->with('supplier_list', $supplier_list) + ->with('model_list', $model_list) + ->with('statuslabel_list', $statuslabel_list) + ->with('statuslabel_types', $statuslabel_types) + ->with('assigned_to', $assigned_to) + ->with('asset', $asset) + ->with('location_list', $location_list) + ->with('manufacturer', $manufacturer_list) + ->with('category', $category_list) + ->with('company_list', $company_list); + + } + + + /** + * Retore a deleted asset. + * + * @author [A. Gianotto] [] + * @param int $assetId + * @since [v1.0] + * @return View + */ + public function getRestore($assetId = null) + { + + // Get user information + $asset = Asset::withTrashed()->find($assetId); + + if (!Company::isCurrentUserHasAccess($asset)) { + return Redirect::to('hardware')->with('error', Lang::get('general.insufficient_permissions')); + } elseif (isset($asset->id)) { + + // Restore the user + $asset->restore(); + + // Prepare the success message + $success = Lang::get('admin/hardware/message.restore.success'); + + // Redirect to the user management page + return Redirect::route('hardware')->with('success', $success); + + } else { + return Redirect::to('hardware')->with('error', Lang::get('admin/hardware/message.does_not_exist')); + } + + } + + + /** + * Upload a file to the server. + * + * @author [A. Gianotto] [] + * @param int $assetId + * @since [v1.0] + * @return Redirect + */ + public function postUpload(AssetFileRequest $request, $assetId = null) + { + + if (!$asset = Asset::find($assetId)) { + return Redirect::route('hardware')->with('error', trans('admin/hardware/message.does_not_exist')); + } + + // the asset is valid + $destinationPath = storage_path().'/private_uploads/app/imports/assets'; + + + + if (!Company::isCurrentUserHasAccess($asset)) { + return Redirect::to('hardware')->with('error', Lang::get('general.insufficient_permissions')); + } + + if (Input::hasFile('assetfile')) { + + foreach (Input::file('assetfile') as $file) { + $extension = $file->getClientOriginalExtension(); + $filename = 'hardware-'.$asset->id.'-'.str_random(8); + $filename .= '-'.Str::slug($file->getClientOriginalName()).'.'.$extension; + $upload_success = $file->move($destinationPath, $filename); + + //Log the deletion of seats to the log + $logaction = new Actionlog(); + $logaction->asset_id = $asset->id; + $logaction->asset_type = 'hardware'; + $logaction->user_id = Auth::user()->id; + $logaction->note = e(Input::get('notes')); + $logaction->checkedout_to = null; + $logaction->created_at = date("Y-m-d H:i:s"); + $logaction->filename = $filename; + $log = $logaction->logaction('uploaded'); + } + } else { + return Redirect::back()->with('error', Lang::get('admin/hardware/message.upload.nofiles')); + } + + if ($upload_success) { + return Redirect::back()->with('success', Lang::get('admin/hardware/message.upload.success')); + } else { + return Redirect::back()->with('error', Lang::get('admin/hardware/message.upload.error')); + } + + + + } + + /** + * Delete the associated file + * + * @author [A. Gianotto] [] + * @param int $assetId + * @param int $fileId + * @since [v1.0] + * @return View + */ + public function getDeleteFile($assetId = null, $fileId = null) + { + $asset = Asset::find($assetId); + $destinationPath = storage_path().'private_uploads/app/imports/assets'; + + // the asset is valid + if (isset($asset->id)) { + + + if (!Company::isCurrentUserHasAccess($asset)) { + return Redirect::to('hardware')->with('error', Lang::get('general.insufficient_permissions')); + } + + $log = Actionlog::find($fileId); + $full_filename = $destinationPath.'/'.$log->filename; + if (file_exists($full_filename)) { + unlink($destinationPath.'/'.$log->filename); + } + $log->delete(); + return Redirect::back()->with('success', Lang::get('admin/hardware/message.deletefile.success')); + + } else { + // Prepare the error message + $error = Lang::get('admin/hardware/message.does_not_exist', compact('id')); + + // Redirect to the hardware management page + return Redirect::route('hardware')->with('error', $error); + } + } + + + + /** + * Check for permissions and display the file. + * + * @author [A. Gianotto] [] + * @param int $assetId + * @param int $fileId + * @since [v1.0] + * @return View + */ + public function displayFile($assetId = null, $fileId = null) + { + + $asset = Asset::find($assetId); + + // the asset is valid + if (isset($asset->id)) { + + + if (!Company::isCurrentUserHasAccess($asset)) { + return Redirect::to('hardware')->with('error', Lang::get('general.insufficient_permissions')); + } + + $log = Actionlog::find($fileId); + $file = $log->get_src(); + + $filetype = Asset::checkUploadIsImage($file); + + if ($filetype) { + + $contents = file_get_contents($file); + $response = Response::make($contents); + $response->header('Content-Type', $filetype); + return $response; + + } else { + return Response::download($file); + } + + } else { + // Prepare the error message + $error = Lang::get('admin/hardware/message.does_not_exist', compact('id')); + + // Redirect to the hardware management page + return Redirect::route('hardware')->with('error', $error); + } + } + + + + + /** + * Display the bulk edit page. + * + * @author [A. Gianotto] [] + * @param int $assetId + * @since [v2.0] + * @return View + */ + public function postBulkEdit($assets = null) + { + + if (!Company::isCurrentUserAuthorized()) { + return Redirect::to('hardware')->with('error', Lang::get('general.insufficient_permissions')); + + } elseif (!Input::has('edit_asset')) { + return Redirect::back()->with('error', 'No assets selected'); + + } else { + $asset_raw_array = Input::get('edit_asset'); + foreach ($asset_raw_array as $asset_id => $value) { + $asset_ids[] = $asset_id; + + } + + } + + if (Input::has('bulk_actions')) { + + + // Create labels + if (Input::get('bulk_actions')=='labels') { + + + $settings = Setting::getSettings(); + if ($settings->qr_code=='1') { + + $assets = \App\Models\Asset::find($asset_ids); + $assetcount = count($assets); + $count = 0; + + return View::make('hardware/labels')->with('assets', $assets)->with('settings', $settings)->with('count', $count)->with('settings', $settings); + + } else { + // QR codes are not enabled + return Redirect::to("hardware")->with('error', 'Barcodes are not enabled in Admin > Settings'); + } + + } elseif (Input::get('bulk_actions')=='delete') { + + + $assets = Asset::with('assigneduser', 'assetloc')->find($asset_ids); + return View::make('hardware/bulk-delete')->with('assets', $assets); + + // Bulk edit + } elseif (Input::get('bulk_actions')=='edit') { + + $assets = Input::get('edit_asset'); + $supplier_list = Helper::suppliersList(); + $statuslabel_list = Helper::statusLabelList(); + $location_list = Helper::locationsList(); + $models_list = Helper::modelList(); + $companies_list = array('' => '') + array('clear' => Lang::get('general.remove_company')) + Helper::companyList(); + + return View::make('hardware/bulk') + ->with('assets', $assets) + ->with('supplier_list', $supplier_list) + ->with('statuslabel_list', $statuslabel_list) + ->with('location_list', $location_list) + ->with('models_list', $models_list) + ->with('companies_list', $companies_list); + + + } + + } else { + return Redirect::back()->with('error', 'No action selected'); + } + + + + } + + + + /** + * Save bulk edits + * + * @author [A. Gianotto] [] + * @param array $assets + * @since [v2.0] + * @return Redirect + */ + public function postBulkSave($assets = null) + { + + if (!Company::isCurrentUserAuthorized()) { + return Redirect::to('hardware')->with('error', Lang::get('general.insufficient_permissions')); + + } elseif (Input::has('bulk_edit')) { + + $assets = Input::get('bulk_edit'); + + if ((Input::has('purchase_date')) || (Input::has('purchase_cost')) || (Input::has('supplier_id')) || (Input::has('order_number')) || (Input::has('warranty_months')) || (Input::has('rtd_location_id')) || (Input::has('requestable')) || (Input::has('company_id')) || (Input::has('status_id')) || (Input::has('model_id'))) { + + foreach ($assets as $key => $value) { + + $update_array = array(); + + if (Input::has('purchase_date')) { + $update_array['purchase_date'] = e(Input::get('purchase_date')); + } + + if (Input::has('purchase_cost')) { + $update_array['purchase_cost'] = e(Input::get('purchase_cost')); + } + + if (Input::has('supplier_id')) { + $update_array['supplier_id'] = e(Input::get('supplier_id')); + } + + if (Input::has('model_id')) { + $update_array['model_id'] = e(Input::get('model_id')); + } + + if (Input::has('company_id')) { + if (Input::get('company_id')=="clear") { + $update_array['company_id'] = null; + } else { + $update_array['company_id'] = e(Input::get('company_id')); + } + + } + + if (Input::has('order_number')) { + $update_array['order_number'] = e(Input::get('order_number')); + } + + if (Input::has('warranty_months')) { + $update_array['warranty_months'] = e(Input::get('warranty_months')); + } + + if (Input::has('rtd_location_id')) { + $update_array['rtd_location_id'] = e(Input::get('rtd_location_id')); + } + + if (Input::has('status_id')) { + $update_array['status_id'] = e(Input::get('status_id')); + } + + if (Input::has('requestable')) { + $update_array['requestable'] = e(Input::get('requestable')); + } + + + if (DB::table('assets') + ->where('id', $key) + ->update($update_array)) { + + $logaction = new Actionlog(); + $logaction->asset_id = $key; + $logaction->asset_type = 'hardware'; + $logaction->created_at = date("Y-m-d H:i:s"); + + if (Input::has('rtd_location_id')) { + $logaction->location_id = e(Input::get('rtd_location_id')); + } + $logaction->user_id = Auth::user()->id; + $log = $logaction->logaction('update'); + + } + + } // endforeach + + return Redirect::to("hardware")->with('success', Lang::get('admin/hardware/message.update.success')); + + // no values given, nothing to update + } else { + return Redirect::to("hardware")->with('info', Lang::get('admin/hardware/message.update.nothing_updated')); + + } + + + } // endif + + return Redirect::to("hardware"); + + } + + /** + * Save bulk deleted. + * + * @author [A. Gianotto] [] + * @param array $assets + * @since [v2.0] + * @return View + */ + public function postBulkDelete($assets = null) + { + + if (!Company::isCurrentUserAuthorized()) { + return Redirect::to('hardware')->with('error', Lang::get('general.insufficient_permissions')); + } elseif (Input::has('bulk_edit')) { + //$assets = Input::get('bulk_edit'); + $assets = Asset::find(Input::get('bulk_edit')); + //print_r($assets); + + + foreach ($assets as $asset) { + //echo '
  • '.$asset; + $update_array['deleted_at'] = date('Y-m-d h:i:s'); + $update_array['assigned_to'] = null; + + if (DB::table('assets') + ->where('id', $asset->id) + ->update($update_array)) { + + $logaction = new Actionlog(); + $logaction->asset_id = $asset->id; + $logaction->asset_type = 'hardware'; + $logaction->created_at = date("Y-m-d H:i:s"); + $logaction->user_id = Auth::user()->id; + $log = $logaction->logaction('deleted'); + + } + + } // endforeach + return Redirect::to("hardware")->with('success', Lang::get('admin/hardware/message.delete.success')); + + // no values given, nothing to update + } else { + return Redirect::to("hardware")->with('info', Lang::get('admin/hardware/message.delete.nothing_updated')); + + } + + // Something weird happened here - default to hardware + return Redirect::to("hardware"); + + } + + + + /** + * Generates the JSON used to display the asset listing. + * + * @author [A. Gianotto] [] + * @param string $status + * @since [v2.0] + * @return String JSON + */ + public function getDatatable($status = null) + { + + + $assets = Asset::select('assets.*')->with('model', 'assigneduser', 'assigneduser.userloc', 'assetstatus', 'defaultLoc', 'assetlog', 'model', 'model.category', 'model.fieldset', 'assetstatus', 'assetloc', 'company') + ->Hardware(); + + if (Input::has('search')) { + $assets = $assets->TextSearch(Input::get('search')); + } + + if (Input::has('offset')) { + $offset = e(Input::get('offset')); + } else { + $offset = 0; + } + + if (Input::has('limit')) { + $limit = e(Input::get('limit')); + } else { + $limit = 50; + } + + if (Input::has('order_number')) { + $assets->where('order_number', '=', e(Input::get('order_number'))); + } + + switch ($status) { + case 'Deleted': + $assets->withTrashed()->Deleted(); + break; + case 'Pending': + $assets->Pending(); + break; + case 'RTD': + $assets->RTD(); + break; + case 'Undeployable': + $assets->Undeployable(); + break; + case 'Archived': + $assets->Archived(); + break; + case 'Requestable': + $assets->RequestableAssets(); + break; + case 'Deployed': + $assets->Deployed(); + break; + + } + + $allowed_columns = [ + 'id', + 'name', + 'asset_tag', + 'serial', + 'model', + 'last_checkout', + 'category', + 'notes', + 'expected_checkin', + 'order_number', + 'companyName', + 'location', + 'image', + 'status_label', + 'assigned_to' + ]; + + $all_custom_fields=CustomField::all(); //used as a 'cache' of custom fields throughout this page load + + foreach ($all_custom_fields as $field) { + $allowed_columns[]=$field->db_column_name(); + } + + $order = Input::get('order') === 'asc' ? 'asc' : 'desc'; + $sort = in_array(Input::get('sort'), $allowed_columns) ? Input::get('sort') : 'asset_tag'; + + switch ($sort) { + case 'model': + $assets = $assets->OrderModels($order); + break; + case 'category': + $assets = $assets->OrderCategory($order); + break; + case 'companyName': + $assets = $assets->OrderCompany($order); + break; + case 'location': + $assets = $assets->OrderLocation($order); + break; + case 'status_label': + $assets = $assets->OrderStatus($order); + break; + case 'assigned_to': + $assets = $assets->OrderAssigned($order); + break; + default: + $assets = $assets->orderBy($sort, $order); + break; + } + + $assetCount = $assets->count(); + $assets = $assets->skip($offset)->take($limit)->get(); + + + $rows = array(); + foreach ($assets as $asset) { + $inout = ''; + $actions = ''; + if ($asset->deleted_at=='') { + $actions = '
    '; + } elseif ($asset->model->deleted_at=='') { + $actions = ''; + } + + if ($asset->assetstatus) { + if ($asset->assetstatus->deployable != 0) { + if (($asset->assigned_to !='') && ($asset->assigned_to > 0)) { + $inout = ''.Lang::get('general.checkin').''; + } else { + $inout = ''.Lang::get('general.checkout').''; + } + } + } + + $row = array( + 'checkbox' =>'
    ', + 'id' => $asset->id, + 'image' => (($asset->image) && ($asset->image!='')) ? '' : ((($asset->model) && ($asset->model->image!='')) ? '' : ''), + 'name' => ''.$asset->name.'', + 'asset_tag' => ''.$asset->asset_tag.'', + 'serial' => $asset->serial, + 'model' => ($asset->model) ? (string)link_to('/hardware/models/'.$asset->model->id.'/view', $asset->model->name) : 'No model', + 'status_label' => ($asset->assigneduser) ? 'Deployed' : (($asset->assetstatus) ? $asset->assetstatus->name : ''), + 'assigned_to' => ($asset->assigneduser) ? (string)link_to('../admin/users/'.$asset->assigned_to.'/view', $asset->assigneduser->fullName()) : '', + 'location' => (($asset->assigneduser) && ($asset->assigneduser->userloc!='')) ? (string)link_to('admin/settings/locations/'.$asset->assigneduser->userloc->id.'/edit', $asset->assigneduser->userloc->name) : (($asset->defaultLoc!='') ? (string)link_to('admin/settings/locations/'.$asset->defaultLoc->id.'/edit', $asset->defaultLoc->name) : ''), + 'category' => (($asset->model) && ($asset->model->category)) ? $asset->model->category->name : '', + 'eol' => ($asset->eol_date()) ? $asset->eol_date() : '', + 'notes' => $asset->notes, + 'order_number' => ($asset->order_number!='') ? ''.$asset->order_number.'' : '', + 'last_checkout' => ($asset->last_checkout!='') ? $asset->last_checkout : '', + 'expected_checkin' => ($asset->expected_checkin!='') ? $asset->expected_checkin : '', + 'change' => ($inout) ? $inout : '', + 'actions' => ($actions) ? $actions : '', + 'companyName' => is_null($asset->company) ? '' : e($asset->company->name) + ); + foreach ($all_custom_fields as $field) { + $row[$field->db_column_name()]=$asset->{$field->db_column_name()}; + } + $rows[]=$row; + } + + $data = array('total'=>$assetCount, 'rows'=>$rows); + + return $data; + } +} diff --git a/app/Http/Controllers/Auth/AuthController.php b/app/Http/Controllers/Auth/AuthController.php new file mode 100644 index 0000000000..a3f904f9ac --- /dev/null +++ b/app/Http/Controllers/Auth/AuthController.php @@ -0,0 +1,279 @@ +middleware('guest', ['except' => 'logout']); + } + + + function showLoginForm() + { + // Is the user logged in? + if (Auth::check()) { + return redirect()->intended('dashboard'); + } + + // Show the page + return View::make('auth.login'); + } + + + /** + * Authenticates a user to LDAP + * + * @param $username + * @param $password + * @param bool|false $returnUser + * @return bool true if the username and/or password provided are valid + * false if the username and/or password provided are invalid + * array of ldap_attributes if $returnUser is true + */ + function ldap($username, $password, $returnUser = false) + { + + $ldaphost = \App\Models\Setting::getSettings()->ldap_server; + $ldaprdn = \App\Models\Setting::getSettings()->ldap_uname; + $ldappass = \Crypt::decrypt(\App\Models\Setting::getSettings()->ldap_pword); + $baseDn = \App\Models\Setting::getSettings()->ldap_basedn; + $filterQuery = \App\Models\Setting::getSettings()->ldap_auth_filter_query . $username; + $ldapversion = \App\Models\Setting::getSettings()->ldap_version; + $ldap_server_cert_ignore = \App\Models\Setting::getSettings()->ldap_server_cert_ignore; + + // If we are ignoring the SSL cert we need to setup the environment variable + // before we create the connection + if ($ldap_server_cert_ignore) { + putenv('LDAPTLS_REQCERT=never'); + } + + // Connecting to LDAP + $connection = ldap_connect($ldaphost) or die("Could not connect to {$ldaphost}"); + // Needed for AD + ldap_set_option($connection, LDAP_OPT_REFERRALS, 0); + ldap_set_option($connection, LDAP_OPT_PROTOCOL_VERSION, $ldapversion); + + try { + if ($connection) { + // binding to ldap server + $ldapbind = ldap_bind($connection, $ldaprdn, $ldappass); + if (($results = @ldap_search($connection, $baseDn, $filterQuery)) != false) { + $entry = ldap_first_entry($connection, $results); + if (($userDn = @ldap_get_dn($connection, $entry)) != false) { + if (($isBound = ldap_bind($connection, $userDn, $password)) == "true") { + return $returnUser ? + array_change_key_case(ldap_get_attributes($connection, $entry), CASE_LOWER) + : true; + } + } + } + } + } catch (Exception $e) { + LOG::error($e->getMessage()); + } + ldap_close($connection); + return false; + } + + /** + * Create user from LDAP attributes + * + * @param $ldapatttibutes + * @return array|bool + */ + function createUserFromLdap($ldapatttibutes) + { + //Get LDAP attribute config + $ldap_result_username = \App\Models\Setting::getSettings()->ldap_username_field; + $ldap_result_emp_num = \App\Models\Setting::getSettings()->ldap_emp_num; + $ldap_result_last_name = \App\Models\Setting::getSettings()->ldap_lname_field; + $ldap_result_first_name = \App\Models\Setting::getSettings()->ldap_fname_field; + $ldap_result_email = \App\Models\Setting::getSettings()->ldap_email; + + //Get LDAP user data + $item = array(); + $item["username"] = isset($ldapatttibutes[$ldap_result_username][0]) ? $ldapatttibutes[$ldap_result_username][0] : ""; + $item["employee_number"] = isset($ldapatttibutes[$ldap_result_emp_num][0]) ? $ldapatttibutes[$ldap_result_emp_num][0] : ""; + $item["lastname"] = isset($ldapatttibutes[$ldap_result_last_name][0]) ? $ldapatttibutes[$ldap_result_last_name][0] : ""; + $item["firstname"] = isset($ldapatttibutes[$ldap_result_first_name][0]) ? $ldapatttibutes[$ldap_result_first_name][0] : ""; + $item["email"] = isset($ldapatttibutes[$ldap_result_email][0]) ? $ldapatttibutes[$ldap_result_email][0] : "" ; + + //create user + if (!empty($item["username"])) { + //$pass = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 10); + + $newuser = array( + 'first_name' => $item["firstname"], + 'last_name' => $item["lastname"], + 'username' => $item["username"], + 'email' => $item["email"], + 'employee_num' => $item["employee_number"], + 'password' => bcrypt(Input::get("password")), //$pass, + 'activated' => 1, + 'permissions' => ["user" => 1], //'{"user":1}', + 'notes' => 'Imported from LDAP' + ); + \App\Models\User::save($newuser); + + } else { + throw new Cartalyst\Sentry\Users\UserNotFoundException(); + } + + //$item["note"] = "created"; + $credentials = array( + 'username' => $item["username"], + 'password' => Input::get("password")//$pass, + ); + return $credentials; + } + + + /** + * Account sign in form processing. + * + * @return Redirect + */ + public function login() + { + $validator = $this->validator(Input::all()); + + if ($validator->fails()) { + return Redirect::back()->withInput()->withErrors($validator); + } + + // Should we even check for LDAP users? + if (\App\Models\Setting::getSettings()->ldap_enabled=='1') { + + LOG::debug("LDAP is enabled."); + // Check if the user exists in the database + $user = \App\Models\User::where('username', '=', Input::get('username'))->whereNull('deleted_at')->first(); + LOG::debug("Auth lookup complete"); + + + // The user does not exist in the database. Try to get them from LDAP. + // If user does not exist and authenticates sucessfully with LDAP we + // will create it on the fly and sign in with default permissions + if (!$user) { + LOG::debug("Local user ".Input::get('username')." does not exist"); + if ($userattr = $this->ldap(Input::get('username'), Input::get('password'), true)) { + LOG::debug("Creating local user from authenticated LDAP user."); + $credentials = $this->createUserFromLdap($userattr); + } else { + LOG::debug("User did not authenticate correctly against LDAP. No local user was created."); + } + + // If the user exists and they were imported from LDAP already + } else { + + LOG::debug("Local user ".Input::get('username')." exists in database. Authenticating existing user against LDAP."); + + if ($this->ldap(Input::get('username'), Input::get('password'))) { + LOG::debug("Valid LDAP login. Updating the local data."); + $user = \App\Models\User::find($user->id); //need the Sentry object, not the Eloquent object, to access critical password hashing functions + $user->password = bcrypt(Input::get('password')); + $user->ldap_import = 1; + $user->save(); + + } else { + LOG::debug("User did not authenticate correctly against LDAP. Local user was not updated."); + }// End LDAP auth + + } // End if(!user) + + // NO LDAP enabled - just try to login the user normally + } + + LOG::debug("Authenticating user against database."); + // Try to log the user in + if (!Auth::attempt(Input::only('username', 'password'), Input::get('remember-me', 0))) { + LOG::debug("Local authentication failed."); + // throw new Cartalyst\Sentry\Users\UserNotFoundException(); + return Redirect::back()->withInput()->with('error', trans('auth/message.account_not_found')); + } + + // Get the page we were before + $redirect = \Session::get('loginRedirect', 'home'); + + // Unset the page we were before from the session + \Session::forget('loginRedirect'); + + // Redirect to the users page + return Redirect::to($redirect)->with('success', trans('auth/message.signin.success')); + + // Ooops.. something went wrong + return Redirect::back()->withInput()->withErrors($this->messageBag); + } + + /** + * Logout page. + * + * @return Redirect + */ + public function logout() + { + // Log the user out + Auth::logout(); + + // Redirect to the users page + return Redirect::route('home')->with('success', 'You have successfully logged out!'); + } + + + /** + * Get a validator for an incoming registration request. + * + * @param array $data + * @return \Illuminate\Contracts\Validation\Validator + */ + protected function validator(array $data) + { + return Validator::make($data, [ + 'username' => 'required', + 'password' => 'required', + ]); + } +} diff --git a/app/Http/Controllers/Auth/PasswordController.php b/app/Http/Controllers/Auth/PasswordController.php new file mode 100644 index 0000000000..1ceed97bba --- /dev/null +++ b/app/Http/Controllers/Auth/PasswordController.php @@ -0,0 +1,32 @@ +middleware('guest'); + } +} diff --git a/app/Http/Controllers/CategoriesController.php b/app/Http/Controllers/CategoriesController.php new file mode 100755 index 0000000000..76bfe1fe0d --- /dev/null +++ b/app/Http/Controllers/CategoriesController.php @@ -0,0 +1,326 @@ +with('category', new Category) + ->with('category_types', $category_types); + } + + + /** + * Category create form processing. + * + * @return Redirect + */ + public function postCreate() + { + + // create a new model instance + $category = new Category(); + + // Update the category data + $category->name = e(Input::get('name')); + $category->category_type = e(Input::get('category_type')); + $category->eula_text = e(Input::get('eula_text')); + $category->use_default_eula = e(Input::get('use_default_eula', '0')); + $category->require_acceptance = e(Input::get('require_acceptance', '0')); + $category->checkin_email = e(Input::get('checkin_email', '0')); + $category->user_id = Auth::user()->id; + + if ($category->save()) { + // Redirect to the new category page + return Redirect::to("admin/settings/categories")->with('success', Lang::get('admin/categories/message.create.success')); + } else { + + // The given data did not pass validation + return Redirect::back()->withInput()->withErrors($category->getErrors()); + + } + + // Redirect to the category create page + return Redirect::to('admin/settings/categories/create')->with('error', Lang::get('admin/categories/message.create.error')); + + + } + + /** + * Category update. + * + * @param int $categoryId + * @return View + */ + public function getEdit($categoryId = null) + { + // Check if the category exists + if (is_null($category = Category::find($categoryId))) { + // Redirect to the blogs management page + return Redirect::to('admin/settings/categories')->with('error', Lang::get('admin/categories/message.does_not_exist')); + } + + // Show the page + //$category_options = array('' => 'Top Level') + Category::lists('name', 'id'); + + $category_options = array('' => 'Top Level') + DB::table('categories')->where('id', '!=', $categoryId)->lists('name', 'id'); + $category_types= Helper::categoryTypeList(); + + return View::make('categories/edit', compact('category')) + ->with('category_options', $category_options) + ->with('category_types', $category_types); + } + + + /** + * Category update form processing page. + * + * @param int $categoryId + * @return Redirect + */ + public function postEdit($categoryId = null) + { + // Check if the blog post exists + if (is_null($category = Category::find($categoryId))) { + // Redirect to the blogs management page + return Redirect::to('admin/categories')->with('error', Lang::get('admin/categories/message.does_not_exist')); + } + + // Update the category data + $category->name = e(Input::get('name')); + $category->category_type = e(Input::get('category_type')); + $category->eula_text = e(Input::get('eula_text')); + $category->use_default_eula = e(Input::get('use_default_eula', '0')); + $category->require_acceptance = e(Input::get('require_acceptance', '0')); + $category->checkin_email = e(Input::get('checkin_email', '0')); + + if ($category->save()) { + // Redirect to the new category page + return Redirect::to("admin/settings/categories")->with('success', Lang::get('admin/categories/message.update.success')); + } // attempt validation + else { + // The given data did not pass validation + return Redirect::back()->withInput()->withErrors($category->getErrors()); + } + + // Redirect to the category management page + return Redirect::back()->with('error', Lang::get('admin/categories/message.update.error')); + + } + + /** + * Delete the given category. + * + * @param int $categoryId + * @return Redirect + */ + public function getDelete($categoryId) + { + // Check if the category exists + if (is_null($category = Category::find($categoryId))) { + // Redirect to the blogs management page + return Redirect::to('admin/settings/categories')->with('error', Lang::get('admin/categories/message.not_found')); + } + + + if ($category->has_models() > 0) { + + // Redirect to the asset management page + return Redirect::to('admin/settings/categories')->with('error', Lang::get('admin/categories/message.assoc_users')); + } else { + + $category->delete(); + + // Redirect to the locations management page + return Redirect::to('admin/settings/categories')->with('success', Lang::get('admin/categories/message.delete.success')); + } + + + } + + + + /** + * Get the asset information to present to the category view page + * + * @param int $assetId + * @return View + **/ + public function getView($categoryID = null) + { + $category = Category::find($categoryID); + + if (isset($category->id)) { + return View::make('categories/view', compact('category')); + } else { + // Prepare the error message + $error = Lang::get('admin/categories/message.does_not_exist', compact('id')); + + // Redirect to the user management page + return Redirect::route('categories')->with('error', $error); + } + + + } + + public function getDatatable() + { + // Grab all the categories + $categories = Category::with('assets', 'accessories', 'consumables'); + + if (Input::has('search')) { + $categories = $categories->TextSearch(e(Input::get('search'))); + } + + if (Input::has('offset')) { + $offset = e(Input::get('offset')); + } else { + $offset = 0; + } + + if (Input::has('limit')) { + $limit = e(Input::get('limit')); + } else { + $limit = 50; + } + + + $allowed_columns = ['id','name','category_type']; + $order = Input::get('order') === 'asc' ? 'asc' : 'desc'; + $sort = in_array(Input::get('sort'), $allowed_columns) ? Input::get('sort') : 'created_at'; + + $categories = $categories->orderBy($sort, $order); + + $catCount = $categories->count(); + $categories = $categories->skip($offset)->take($limit)->get(); + + $rows = array(); + + foreach ($categories as $category) { + $actions = ''; + $rows[] = array( + 'id' => $category->id, + 'name' => (string)link_to('/admin/settings/categories/'.$category->id.'/view', $category->name) , + 'category_type' => ucwords($category->category_type), + 'count' => $category->assets->count(), + 'acceptance' => ($category->require_acceptance=='1') ? '' : '', + //EULA is still not working correctly + 'eula' => ($category->getEula()) ? '' : '', + 'actions' => $actions + ); + } + + $data = array('total' => $catCount, 'rows' => $rows); + + return $data; + } + + public function getDataView($categoryID) + { + + $category = Category::find($categoryID); + + if ($category->category_type =='asset') { + $category_assets = $category->assets; + } elseif ($category->category_type =='accessory') { + $category_assets = $category->accessories; + } elseif ($category->category_type =='consumable') { + $category_assets = $category->consumables; + } elseif ($category->category_type =='component') { + $category_assets = $category->components; + } + + + if (Input::has('search')) { + $category_assets = $category_assets->TextSearch(e(Input::get('search'))); + } + + if (Input::has('offset')) { + $offset = e(Input::get('offset')); + } else { + $offset = 0; + } + + if (Input::has('limit')) { + $limit = e(Input::get('limit')); + } else { + $limit = 50; + } + + $order = Input::get('order') === 'asc' ? 'asc' : 'desc'; + + $allowed_columns = ['id','name','serial','asset_tag']; + $sort = in_array(Input::get('sort'), $allowed_columns) ? Input::get('sort') : 'created_at'; + $count = $category_assets->count(); + + $rows = array(); + + foreach ($category_assets as $asset) { + + $actions = ''; + $inout=''; + + if ($asset->deleted_at=='') { + $actions = '
    '; + } elseif ($asset->deleted_at!='') { + $actions = ''; + } + + if ($asset->assetstatus) { + if ($asset->assetstatus->deployable != 0) { + if (($asset->assigned_to !='') && ($asset->assigned_to > 0)) { + $inout = ''.Lang::get('general.checkin').''; + } else { + $inout = ''.Lang::get('general.checkout').''; + } + } + } + + $rows[] = array( + 'id' => $asset->id, + 'name' => (string)link_to('/hardware/'.$asset->id.'/view', $asset->name), + //'model' => $asset->model->name, + 'asset_tag' => $asset->asset_tag, + 'serial' => $asset->serial, + 'assigned_to' => ($asset->assigneduser) ? (string)link_to(config('app.url').'/admin/users/'.$asset->assigneduser->id.'/view', $asset->assigneduser->fullName()): '', + 'change' => $inout, + 'actions' => $actions, + 'companyName' => Company::getName($asset), + ); + } + + $data = array('total' => $count, 'rows' => $rows); + return $data; + } +} diff --git a/app/Http/Controllers/ChangeEmailController.php b/app/Http/Controllers/ChangeEmailController.php new file mode 100755 index 0000000000..1837801842 --- /dev/null +++ b/app/Http/Controllers/ChangeEmailController.php @@ -0,0 +1,76 @@ +with('error', Lang::get('admin/users/table.lock_passwords')); + } else { + + // Declare the rules for the form validation + $rules = array( + 'current_password' => 'required|between:3,32', + 'email' => 'required|email|unique:users,email,'.Auth::user()->email.',email', + 'email_confirm' => 'required|same:email', + ); + + // Create a new validator instance from our validation rules + $validator = Validator::make(Input::all(), $rules); + + // If validation fails, we'll exit the operation now. + if ($validator->fails()) { + // Ooops.. something went wrong + return Redirect::back()->withInput()->withErrors($validator); + } + + // Grab the user + $user = Auth::user(); + + // Check the user current password + if (! $user->checkPassword(Input::get('current_password'))) { + // Set the error message + $this->messageBag->add('current_password', 'Your current password is incorrect'); + + // Redirect to the change email page + return Redirect::route('change-email')->withErrors($this->messageBag); + } + + // Update the user email + $user->email = Input::get('email'); + $user->save(); + + // Redirect to the settings page + return Redirect::route('change-email')->with('success', 'Email successfully updated'); + } + } +} diff --git a/app/Http/Controllers/ChangePasswordController.php b/app/Http/Controllers/ChangePasswordController.php new file mode 100755 index 0000000000..4bf7b8532d --- /dev/null +++ b/app/Http/Controllers/ChangePasswordController.php @@ -0,0 +1,76 @@ +with('error', Lang::get('admin/users/table.lock_passwords')); + } else { + + // Declare the rules for the form validation + $rules = array( + 'old_password' => 'required|min:6', + 'password' => 'required|min:6', + 'password_confirm' => 'required|same:password', + ); + + // Create a new validator instance from our validation rules + $validator = Validator::make(Input::all(), $rules); + + // If validation fails, we'll exit the operation now. + if ($validator->fails()) { + // Ooops.. something went wrong + return Redirect::back()->withInput()->withErrors($validator); + } + + // Grab the user + $user = Auth::user(); + + // Check the user current password + if (! $user->checkPassword(Input::get('old_password'))) { + // Set the error message + $this->messageBag->add('old_password', 'Your current password is incorrect.'); + + // Redirect to the change password page + return Redirect::route('change-password')->withErrors($this->messageBag); + } + + // Update the user password + $user->password = Input::get('password'); + $user->save(); + } + + // Redirect to the change-password page + return Redirect::route('change-password')->with('success', 'Password successfully updated'); + } +} diff --git a/app/Http/Controllers/CompaniesController.php b/app/Http/Controllers/CompaniesController.php new file mode 100644 index 0000000000..8df33d381c --- /dev/null +++ b/app/Http/Controllers/CompaniesController.php @@ -0,0 +1,90 @@ +with('companies', Company::all()); + } + + public function getCreate() + { + return View::make('companies/edit')->with('company', new Company); + } + + public function postCreate() + { + $company = new Company; + + $company->name = e(Input::get('name')); + + if ($company->save()) { + return Redirect::to('admin/settings/companies') + ->with('success', Lang::get('admin/companies/message.create.success')); + } else { + return Redirect::back()->withInput()->withErrors($company->getErrors()); + } + + } + + public function getEdit($companyId) + { + if (is_null($company = Company::find($companyId))) { + return Redirect::to('admin/settings/companies') + ->with('error', Lang::get('admin/companies/message.does_not_exist')); + } else { + return View::make('companies/edit')->with('company', $company); + } + } + + public function postEdit($companyId) + { + if (is_null($company = Company::find($companyId))) { + return Redirect::to('admin/settings/companies')->with('error', Lang::get('admin/companies/message.does_not_exist')); + } else { + + + $company->name = e(Input::get('name')); + + if ($company->save()) { + return Redirect::to('admin/settings/companies') + ->with('success', Lang::get('admin/companies/message.update.success')); + } else { + return Redirect::to("admin/settings/companies/$companyId/edit") + ->with('error', Lang::get('admin/companies/message.update.error')); + } + + } + } + + public function postDelete($companyId) + { + if (is_null($company = Company::find($companyId))) { + return Redirect::to('admin/settings/companies') + ->with('error', Lang::get('admin/companies/message.not_found')); + } else { + try { + $company->delete(); + return Redirect::to('admin/settings/companies') + ->with('success', Lang::get('admin/companies/message.delete.success')); + } catch (\Illuminate\Database\QueryException $exception) { + /* + * NOTE: This happens when there's a foreign key constraint violation + * For example when rows in other tables are referencing this company + */ + if ($exception->getCode() == 23000) { + return Redirect::to('admin/settings/companies') + ->with('error', Lang::get('admin/companies/message.assoc_users')); + } else { + throw $exception; + } + } + } + } +} diff --git a/app/Http/Controllers/ComponentsController.php b/app/Http/Controllers/ComponentsController.php new file mode 100644 index 0000000000..3a48622cee --- /dev/null +++ b/app/Http/Controllers/ComponentsController.php @@ -0,0 +1,445 @@ + '') + DB::table('categories')->where('category_type', '=', 'component')->whereNull('deleted_at')->orderBy('name', 'ASC')->lists('name', 'id'); + $company_list = Helper::companyList(); + $location_list = Helper::locationsList(); + + return View::make('components/edit') + ->with('component', new Component) + ->with('category_list', $category_list) + ->with('company_list', $company_list) + ->with('location_list', $location_list); + } + + + /** + * Component create form processing. + * + * @return Redirect + */ + public function postCreate() + { + + // create a new model instance + $component = new Component(); + + // Update the component data + $component->name = e(Input::get('name')); + $component->category_id = e(Input::get('category_id')); + $component->location_id = e(Input::get('location_id')); + $component->company_id = Company::getIdForCurrentUser(Input::get('company_id')); + $component->order_number = e(Input::get('order_number')); + $component->min_amt = e(Input::get('min_amt')); + + if (e(Input::get('purchase_date')) == '') { + $component->purchase_date = null; + } else { + $component->purchase_date = e(Input::get('purchase_date')); + } + + if (e(Input::get('purchase_cost')) == '0.00') { + $component->purchase_cost = null; + } else { + $component->purchase_cost = e(Input::get('purchase_cost')); + } + + $component->total_qty = e(Input::get('total_qty')); + $component->user_id = Auth::user()->id; + + // Was the component created? + if ($component->save()) { + // Redirect to the new component page + return Redirect::to("admin/components")->with('success', Lang::get('admin/components/message.create.success')); + } + + return Redirect::back()->withInput()->withErrors($component->getErrors()); + + + } + + /** + * Component update. + * + * @param int $componentId + * @return View + */ + public function getEdit($componentId = null) + { + // Check if the component exists + if (is_null($component = Component::find($componentId))) { + // Redirect to the blogs management page + return Redirect::to('admin/components')->with('error', Lang::get('admin/components/message.does_not_exist')); + } elseif (!Company::isCurrentUserHasAccess($component)) { + return Redirect::to('admin/components')->with('error', Lang::get('general.insufficient_permissions')); + } + + $category_list = Helper::categoryList(); + $company_list = Helper::companyList(); + $location_list = Helper::locationsList(); + + return View::make('components/edit', compact('component')) + ->with('category_list', $category_list) + ->with('company_list', $company_list) + ->with('location_list', $location_list); + } + + + /** + * Component update form processing page. + * + * @param int $componentId + * @return Redirect + */ + public function postEdit($componentId = null) + { + // Check if the blog post exists + if (is_null($component = Component::find($componentId))) { + // Redirect to the blogs management page + return Redirect::to('admin/components')->with('error', Lang::get('admin/components/message.does_not_exist')); + } elseif (!Company::isCurrentUserHasAccess($component)) { + return Redirect::to('admin/components')->with('error', Lang::get('general.insufficient_permissions')); + } + + + // Update the component data + $component->name = e(Input::get('name')); + $component->category_id = e(Input::get('category_id')); + $component->location_id = e(Input::get('location_id')); + $component->company_id = Company::getIdForCurrentUser(Input::get('company_id')); + $component->order_number = e(Input::get('order_number')); + $component->min_amt = e(Input::get('min_amt')); + + if (e(Input::get('purchase_date')) == '') { + $component->purchase_date = null; + } else { + $component->purchase_date = e(Input::get('purchase_date')); + } + + if (e(Input::get('purchase_cost')) == '0.00') { + $component->purchase_cost = null; + } else { + $component->purchase_cost = e(Input::get('purchase_cost')); + } + + $component->total_qty = e(Input::get('total_qty')); + + // Was the component created? + if ($component->save()) { + // Redirect to the new component page + return Redirect::to("admin/components")->with('success', Lang::get('admin/components/message.update.success')); + } + + return Redirect::back()->withInput()->withErrors($component->getErrors()); + + + + + } + + /** + * Delete the given component. + * + * @param int $componentId + * @return Redirect + */ + public function getDelete($componentId) + { + // Check if the blog post exists + if (is_null($component = Component::find($componentId))) { + // Redirect to the blogs management page + return Redirect::to('admin/components')->with('error', Lang::get('admin/components/message.not_found')); + } elseif (!Company::isCurrentUserHasAccess($component)) { + return Redirect::to('admin/components')->with('error', Lang::get('general.insufficient_permissions')); + } + + $component->delete(); + + // Redirect to the locations management page + return Redirect::to('admin/components')->with('success', Lang::get('admin/components/message.delete.success')); + + } + + public function postBulk($componentId = null) + { + echo 'Stubbed - not yet complete'; + } + + public function postBulkSave($componentId = null) + { + echo 'Stubbed - not yet complete'; + } + + + + + /** + * Get the component information to present to the component view page + * + * @param int $componentId + * @return View + **/ + public function getView($componentID = null) + { + $component = Component::find($componentID); + + if (isset($component->id)) { + + + if (!Company::isCurrentUserHasAccess($component)) { + return Redirect::to('admin/components')->with('error', Lang::get('general.insufficient_permissions')); + } else { + return View::make('components/view', compact('component')); + } + } else { + // Prepare the error message + $error = Lang::get('admin/components/message.does_not_exist', compact('id')); + + // Redirect to the user management page + return Redirect::route('components')->with('error', $error); + } + + + } + + /** + * Check out the component to a person + **/ + public function getCheckout($componentId) + { + // Check if the component exists + if (is_null($component = Component::find($componentId))) { + // Redirect to the component management page with error + return Redirect::to('components')->with('error', Lang::get('admin/components/message.not_found')); + } elseif (!Company::isCurrentUserHasAccess($component)) { + return Redirect::to('admin/components')->with('error', Lang::get('general.insufficient_permissions')); + } + + // Get the dropdown of assets and then pass it to the checkout view + $assets_list = Helper::assetsList(); + + return View::make('components/checkout', compact('component'))->with('assets_list', $assets_list); + + } + + /** + * Check out the component to a person + **/ + public function postCheckout(ComponentCheckoutRequest $request, $componentId) + { + // Check if the component exists + if (is_null($component = Component::find($componentId))) { + // Redirect to the component management page with error + return Redirect::to('components')->with('error', Lang::get('admin/components/message.not_found')); + } elseif (!Company::isCurrentUserHasAccess($component)) { + return Redirect::to('admin/components')->with('error', Lang::get('general.insufficient_permissions')); + } + + $admin_user = Auth::user(); + $asset_id = e(Input::get('asset_id')); + + // Check if the user exists + if (is_null($asset = Asset::find($asset_id))) { + // Redirect to the component management page with error + return Redirect::to('admin/components')->with('error', Lang::get('admin/components/message.asset_does_not_exist')); + } + + // Update the component data + $component->asset_id = $asset_id; + + $component->assets()->attach($component->id, array( + 'component_id' => $component->id, + 'user_id' => $admin_user->id, + 'created_at' => date('Y-m-d h:i:s'), + 'assigned_qty' => e(Input::get('assigned_qty')), + 'asset_id' => $asset_id)); + + $logaction = new Actionlog(); + $logaction->component_id = $component->id; + $logaction->asset_id = $asset_id; + $logaction->asset_type = 'component'; + $logaction->location_id = $asset->location_id; + $logaction->user_id = Auth::user()->id; + $logaction->note = e(Input::get('note')); + + $settings = Setting::getSettings(); + + if ($settings->slack_endpoint) { + + $slack_settings = [ + 'username' => $settings->botname, + 'channel' => $settings->slack_channel, + 'link_names' => true + ]; + + $client = new \Maknz\Slack\Client($settings->slack_endpoint, $slack_settings); + + try { + $client->attach([ + 'color' => 'good', + 'fields' => [ + [ + 'title' => 'Checked Out:', + 'value' => strtoupper($logaction->asset_type).' <'.config('app.url').'/admin/components/'.$component->id.'/view'.'|'.$component->name.'> checked out to <'.config('app.url').'/hardware/'.$asset->id.'/view|'.$asset->name.'> by <'.config('app.url').'/admin/users/'.$admin_user->id.'/view'.'|'.$admin_user->fullName().'>.' + ], + [ + 'title' => 'Note:', + 'value' => e($logaction->note) + ], + ] + ])->send('Component Checked Out'); + + } catch (Exception $e) { + + } + } + + + $log = $logaction->logaction('checkout'); + + // Redirect to the new component page + return Redirect::to("admin/components")->with('success', Lang::get('admin/components/message.checkout.success')); + + + + } + + + public function getDatatable() + { + $components = Component::select('components.*')->whereNull('components.deleted_at') + ->with('company', 'location', 'category'); + + if (Input::has('search')) { + $components = $components->TextSearch(Input::get('search')); + } + + if (Input::has('offset')) { + $offset = e(Input::get('offset')); + } else { + $offset = 0; + } + + if (Input::has('limit')) { + $limit = e(Input::get('limit')); + } else { + $limit = 50; + } + + $allowed_columns = ['id','name','min_amt','order_number','purchase_date','purchase_cost','companyName','category','total_qty']; + $order = Input::get('order') === 'asc' ? 'asc' : 'desc'; + $sort = in_array(Input::get('sort'), $allowed_columns) ? Input::get('sort') : 'created_at'; + + switch ($sort) { + case 'category': + $components = $components->OrderCategory($order); + break; + case 'location': + $components = $components->OrderLocation($order); + break; + case 'companyName': + $components = $components->OrderCompany($order); + break; + default: + $components = $components->orderBy($sort, $order); + break; + } + + $consumCount = $components->count(); + $components = $components->skip($offset)->take($limit)->get(); + + $rows = array(); + + foreach ($components as $component) { + $actions = 'numRemaining() > 0 ) ? '' : ' disabled').'>'.Lang::get('general.checkout').''; + $company = $component->company; + + $rows[] = array( + 'checkbox' =>'
    ', + 'id' => $component->id, + 'name' => (string)link_to('admin/components/'.$component->id.'/view', $component->name), + 'location' => ($component->location) ? e($component->location->name) : '', + 'total_qty' => $component->total_qty, + 'min_amt' => $component->min_amt, + 'category' => ($component->category) ? $component->category->name : 'Missing category', + 'order_number' => $component->order_number, + 'purchase_date' => $component->purchase_date, + 'purchase_cost' => ($component->purchase_cost!='') ? number_format($component->purchase_cost, 2): '' , + 'numRemaining' => $component->numRemaining(), + 'actions' => $actions, + 'companyName' => is_null($company) ? '' : e($company->name), + ); + } + + $data = array('total' => $consumCount, 'rows' => $rows); + + return $data; + + } + + public function getDataView($componentID) + { + //$component = Component::find($componentID); + $component = Component::with('assets')->find($componentID); + + // $component->load('componentAssigments.admin','componentAssigments.user'); + + if (!Company::isCurrentUserHasAccess($component)) { + return ['total' => 0, 'rows' => []]; + } + + $rows = array(); + + foreach ($component->assets as $component_assignment) { + $rows[] = array( + 'name' => (string)link_to('/hardware/'.$component_assignment->id.'/view', $component_assignment->name), + 'qty' => $component_assignment->pivot->assigned_qty, + 'created_at' => ($component_assignment->created_at->format('Y-m-d H:i:s')=='-0001-11-30 00:00:00') ? '' : $component_assignment->created_at->format('Y-m-d H:i:s'), + ); + } + + $componentCount = $component->assets->count(); + $data = array('total' => $componentCount, 'rows' => $rows); + return $data; + } +} diff --git a/app/Http/Controllers/ConsumablesController.php b/app/Http/Controllers/ConsumablesController.php new file mode 100644 index 0000000000..1a3d552681 --- /dev/null +++ b/app/Http/Controllers/ConsumablesController.php @@ -0,0 +1,458 @@ + '') + DB::table('categories')->where('category_type', '=', 'consumable')->whereNull('deleted_at')->orderBy('name', 'ASC')->lists('name', 'id'); + $company_list = Helper::companyList(); + $location_list = Helper::locationsList(); + + return View::make('consumables/edit') + ->with('consumable', new Consumable) + ->with('category_list', $category_list) + ->with('company_list', $company_list) + ->with('location_list', $location_list); + } + + + /** + * Consumable create form processing. + * + * @return Redirect + */ + public function postCreate() + { + + // create a new model instance + $consumable = new Consumable(); + + // Update the consumable data + $consumable->name = e(Input::get('name')); + $consumable->category_id = e(Input::get('category_id')); + $consumable->location_id = e(Input::get('location_id')); + $consumable->company_id = Company::getIdForCurrentUser(Input::get('company_id')); + $consumable->order_number = e(Input::get('order_number')); + $consumable->min_amt = e(Input::get('min_amt')); + + if (e(Input::get('purchase_date')) == '') { + $consumable->purchase_date = null; + } else { + $consumable->purchase_date = e(Input::get('purchase_date')); + } + + if (e(Input::get('purchase_cost')) == '0.00') { + $consumable->purchase_cost = null; + } else { + $consumable->purchase_cost = ParseFloat(e(Input::get('purchase_cost'))); + } + + $consumable->qty = e(Input::get('qty')); + $consumable->user_id = Auth::user()->id; + + // Was the consumable created? + if ($consumable->save()) { + // Redirect to the new consumable page + return Redirect::to("admin/consumables")->with('success', Lang::get('admin/consumables/message.create.success')); + } + + return Redirect::back()->withInput()->withErrors($consumable->getErrors()); + + + } + + /** + * Consumable update. + * + * @param int $consumableId + * @return View + */ + public function getEdit($consumableId = null) + { + // Check if the consumable exists + if (is_null($consumable = Consumable::find($consumableId))) { + // Redirect to the blogs management page + return Redirect::to('admin/consumables')->with('error', Lang::get('admin/consumables/message.does_not_exist')); + } elseif (!Company::isCurrentUserHasAccess($consumable)) { + return Redirect::to('admin/consumables')->with('error', Lang::get('general.insufficient_permissions')); + } + + $category_list = Helper::categoryList(); + $company_list = Helper::companyList(); + $location_list = Helper::locationsList(); + + return View::make('consumables/edit', compact('consumable')) + ->with('category_list', $category_list) + ->with('company_list', $company_list) + ->with('location_list', $location_list); + } + + + /** + * Consumable update form processing page. + * + * @param int $consumableId + * @return Redirect + */ + public function postEdit($consumableId = null) + { + // Check if the blog post exists + if (is_null($consumable = Consumable::find($consumableId))) { + // Redirect to the blogs management page + return Redirect::to('admin/consumables')->with('error', Lang::get('admin/consumables/message.does_not_exist')); + } elseif (!Company::isCurrentUserHasAccess($consumable)) { + return Redirect::to('admin/consumables')->with('error', Lang::get('general.insufficient_permissions')); + } + + + // Update the consumable data + $consumable->name = e(Input::get('name')); + $consumable->category_id = e(Input::get('category_id')); + $consumable->location_id = e(Input::get('location_id')); + $consumable->company_id = Company::getIdForCurrentUser(Input::get('company_id')); + $consumable->order_number = e(Input::get('order_number')); + $consumable->min_amt = e(Input::get('min_amt')); + + if (e(Input::get('purchase_date')) == '') { + $consumable->purchase_date = null; + } else { + $consumable->purchase_date = e(Input::get('purchase_date')); + } + + if (e(Input::get('purchase_cost')) == '0.00') { + $consumable->purchase_cost = null; + } else { + $consumable->purchase_cost = ParseFloat(e(Input::get('purchase_cost'))); + } + + $consumable->qty = e(Input::get('qty')); + + // Was the consumable created? + if ($consumable->save()) { + // Redirect to the new consumable page + return Redirect::to("admin/consumables")->with('success', Lang::get('admin/consumables/message.update.success')); + } + + return Redirect::back()->withInput()->withErrors($consumable->getErrors()); + + + + + } + + /** + * Delete the given consumable. + * + * @param int $consumableId + * @return Redirect + */ + public function getDelete($consumableId) + { + // Check if the blog post exists + if (is_null($consumable = Consumable::find($consumableId))) { + // Redirect to the blogs management page + return Redirect::to('admin/consumables')->with('error', Lang::get('admin/consumables/message.not_found')); + } elseif (!Company::isCurrentUserHasAccess($consumable)) { + return Redirect::to('admin/consumables')->with('error', Lang::get('general.insufficient_permissions')); + } + + $consumable->delete(); + + // Redirect to the locations management page + return Redirect::to('admin/consumables')->with('success', Lang::get('admin/consumables/message.delete.success')); + + } + + + + /** + * Get the consumable information to present to the consumable view page + * + * @param int $consumableId + * @return View + **/ + public function getView($consumableID = null) + { + $consumable = Consumable::find($consumableID); + + if (isset($consumable->id)) { + + + if (!Company::isCurrentUserHasAccess($consumable)) { + return Redirect::to('admin/consumables')->with('error', Lang::get('general.insufficient_permissions')); + } else { + return View::make('consumables/view', compact('consumable')); + } + } else { + // Prepare the error message + $error = Lang::get('admin/consumables/message.does_not_exist', compact('id')); + + // Redirect to the user management page + return Redirect::route('consumables')->with('error', $error); + } + + + } + + /** + * Check out the consumable to a person + **/ + public function getCheckout($consumableId) + { + // Check if the consumable exists + if (is_null($consumable = Consumable::find($consumableId))) { + // Redirect to the consumable management page with error + return Redirect::to('consumables')->with('error', Lang::get('admin/consumables/message.not_found')); + } elseif (!Company::isCurrentUserHasAccess($consumable)) { + return Redirect::to('admin/consumables')->with('error', Lang::get('general.insufficient_permissions')); + } + + // Get the dropdown of users and then pass it to the checkout view + $users_list = Helper::usersList(); + + return View::make('consumables/checkout', compact('consumable'))->with('users_list', $users_list); + + } + + /** + * Check out the consumable to a person + **/ + public function postCheckout($consumableId) + { + // Check if the consumable exists + if (is_null($consumable = Consumable::find($consumableId))) { + // Redirect to the consumable management page with error + return Redirect::to('consumables')->with('error', Lang::get('admin/consumables/message.not_found')); + } elseif (!Company::isCurrentUserHasAccess($consumable)) { + return Redirect::to('admin/consumables')->with('error', Lang::get('general.insufficient_permissions')); + } + + $admin_user = Auth::user(); + $assigned_to = e(Input::get('assigned_to')); + + // Check if the user exists + if (is_null($user = User::find($assigned_to))) { + // Redirect to the consumable management page with error + return Redirect::to('admin/consumables')->with('error', Lang::get('admin/consumables/message.user_does_not_exist')); + } + + // Update the consumable data + $consumable->assigned_to = e(Input::get('assigned_to')); + + $consumable->users()->attach($consumable->id, array( + 'consumable_id' => $consumable->id, + 'user_id' => $admin_user->id, + 'assigned_to' => e(Input::get('assigned_to')))); + + $logaction = new Actionlog(); + $logaction->consumable_id = $consumable->id; + $logaction->checkedout_to = $consumable->assigned_to; + $logaction->asset_type = 'consumable'; + $logaction->location_id = $user->location_id; + $logaction->user_id = Auth::user()->id; + $logaction->note = e(Input::get('note')); + + $settings = Setting::getSettings(); + + if ($settings->slack_endpoint) { + + $slack_settings = [ + 'username' => $settings->botname, + 'channel' => $settings->slack_channel, + 'link_names' => true + ]; + + $client = new \Maknz\Slack\Client($settings->slack_endpoint, $slack_settings); + + try { + $client->attach([ + 'color' => 'good', + 'fields' => [ + [ + 'title' => 'Checked Out:', + 'value' => strtoupper($logaction->asset_type).' <'.config('app.url').'/admin/consumables/'.$consumable->id.'/view'.'|'.$consumable->name.'> checked out to <'.config('app.url').'/admin/users/'.$user->id.'/view|'.$user->fullName().'> by <'.config('app.url').'/admin/users/'.$admin_user->id.'/view'.'|'.$admin_user->fullName().'>.' + ], + [ + 'title' => 'Note:', + 'value' => e($logaction->note) + ], + ] + ])->send('Consumable Checked Out'); + + } catch (Exception $e) { + + } + } + + + $log = $logaction->logaction('checkout'); + + $consumable_user = DB::table('consumables_users')->where('assigned_to', '=', $consumable->assigned_to)->where('consumable_id', '=', $consumable->id)->first(); + + $data['log_id'] = $logaction->id; + $data['eula'] = $consumable->getEula(); + $data['first_name'] = $user->first_name; + $data['item_name'] = $consumable->name; + $data['checkout_date'] = $logaction->created_at; + $data['item_tag'] = ''; + $data['expected_checkin'] = ''; + $data['note'] = $logaction->note; + $data['require_acceptance'] = $consumable->requireAcceptance(); + + + if (($consumable->requireAcceptance()=='1') || ($consumable->getEula())) { + + Mail::send('emails.accept-asset', $data, function ($m) use ($user) { + $m->to($user->email, $user->first_name . ' ' . $user->last_name); + $m->subject('Confirm consumable delivery'); + }); + } + + // Redirect to the new consumable page + return Redirect::to("admin/consumables")->with('success', Lang::get('admin/consumables/message.checkout.success')); + + + + } + + + public function getDatatable() + { + $consumables = Consumable::select('consumables.*')->whereNull('consumables.deleted_at') + ->with('company', 'location', 'category', 'users'); + + if (Input::has('search')) { + $consumables = $consumables->TextSearch(Input::get('search')); + } + + if (Input::has('offset')) { + $offset = e(Input::get('offset')); + } else { + $offset = 0; + } + + if (Input::has('limit')) { + $limit = e(Input::get('limit')); + } else { + $limit = 50; + } + + $allowed_columns = ['id','name','order_number','min_amt','purchase_date','purchase_cost','companyName','category']; + $order = Input::get('order') === 'asc' ? 'asc' : 'desc'; + $sort = in_array(Input::get('sort'), $allowed_columns) ? Input::get('sort') : 'created_at'; + + switch ($sort) { + case 'category': + $consumables = $consumables->OrderCategory($order); + break; + case 'location': + $consumables = $consumables->OrderLocation($order); + break; + case 'companyName': + $consumables = $consumables->OrderCompany($order); + break; + default: + $consumables = $consumables->orderBy($sort, $order); + break; + } + + $consumCount = $consumables->count(); + $consumables = $consumables->skip($offset)->take($limit)->get(); + + $rows = array(); + + foreach ($consumables as $consumable) { + $actions = 'numRemaining() > 0 ) ? '' : ' disabled').'>'.Lang::get('general.checkout').''; + $company = $consumable->company; + + $rows[] = array( + 'id' => $consumable->id, + 'name' => (string)link_to('admin/consumables/'.$consumable->id.'/view', $consumable->name), + 'location' => ($consumable->location) ? e($consumable->location->name) : '', + 'min_amt' => $consumable->min_amt, + 'qty' => $consumable->qty, + 'category' => ($consumable->category) ? $consumable->category->name : 'Missing category', + 'order_number' => $consumable->order_number, + 'purchase_date' => $consumable->purchase_date, + 'purchase_cost' => ($consumable->purchase_cost!='') ? number_format($consumable->purchase_cost, 2): '' , + 'numRemaining' => $consumable->numRemaining(), + 'actions' => $actions, + 'companyName' => is_null($company) ? '' : e($company->name), + ); + } + + $data = array('total' => $consumCount, 'rows' => $rows); + + return $data; + + } + + public function getDataView($consumableID) + { + //$consumable = Consumable::find($consumableID); + $consumable = Consumable::with(array('consumableAssigments'=> + function ($query) { + $query->orderBy('created_at', 'DESC'); + }, + 'consumableAssigments.admin'=> function ($query) { + }, + 'consumableAssigments.user'=> function ($query) { + }, + ))->find($consumableID); + + // $consumable->load('consumableAssigments.admin','consumableAssigments.user'); + + if (!Company::isCurrentUserHasAccess($consumable)) { + return ['total' => 0, 'rows' => []]; + } + + $rows = array(); + + foreach ($consumable->consumableAssigments as $consumable_assignment) { + $rows[] = array( + 'name' => (string)link_to('/admin/users/'.$consumable_assignment->user->id.'/view', $consumable_assignment->user->fullName()), + 'created_at' => ($consumable_assignment->created_at->format('Y-m-d H:i:s')=='-0001-11-30 00:00:00') ? '' : $consumable_assignment->created_at->format('Y-m-d H:i:s'), + 'admin' => ($consumable_assignment->admin) ? $consumable_assignment->admin->fullName() : '', + ); + } + + $consumableCount = $consumable->users->count(); + $data = array('total' => $consumableCount, 'rows' => $rows); + return $data; + } +} diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php new file mode 100644 index 0000000000..a77e425121 --- /dev/null +++ b/app/Http/Controllers/Controller.php @@ -0,0 +1,20 @@ +share('signedIn', Auth::check()); + view()->share('user', Auth::user()); + } +} diff --git a/app/Http/Controllers/CustomFieldsController.php b/app/Http/Controllers/CustomFieldsController.php new file mode 100644 index 0000000000..8ca3e614df --- /dev/null +++ b/app/Http/Controllers/CustomFieldsController.php @@ -0,0 +1,195 @@ +get(); + //$fieldsets=CustomFieldset::all(); + $fields=CustomField::with("fieldset")->get(); + //$fields=CustomField::all(); + return View::make("custom_fields.index")->with("custom_fieldsets", $fieldsets)->with("custom_fields", $fields); + } + + + /** + * Show the form for creating a new resource. + * + * @return Response + */ + public function create() + { + // + return View::make("custom_fields.create"); + } + + + /** + * Store a newly created resource in storage. + * + * @return Response + */ + public function store() + { + // + $cfset=new CustomFieldset(["name" => Input::get("name"),"user_id" => Auth::user()->id]); + $validator=Validator::make(Input::all(), $cfset->rules); + if ($validator->passes()) { + $cfset->save(); + return Redirect::route("admin.custom_fields.show", [$cfset->id])->with('success', Lang::get('admin/custom_fields/message.fieldset.create.success')); + } else { + return Redirect::back()->withInput()->withErrors($validator); + } + } + + public function associate($id) + { + + $set = CustomFieldset::find($id); + + foreach ($set->fields as $field) { + if ($field->id == Input::get('field_id')) { + return Redirect::route("admin.custom_fields.show", [$id])->withInput()->withErrors(['field_id' => Lang::get('admin/custom_fields/message.field.already_added')]); + } + } + + $results=$set->fields()->attach(Input::get('field_id'), ["required" => (Input::get('required') == "on"),"order" => Input::get('order')]); + + return Redirect::route("admin.custom_fields.show", [$id])->with("success", Lang::get('admin/custom_fields/message.field.create.assoc_success')); + } + + public function createField() + { + return View::make("custom_fields.create_field"); + } + + public function storeField() + { + $field=new CustomField(["name" => Input::get("name"),"element" => Input::get("element"),"user_id" => Auth::user()->id]); + + + if (!in_array(Input::get('format'), array_keys(CustomField::$PredefinedFormats))) { + $field->format=Input::get("custom_format"); + } else { + $field->format=Input::get('format'); + } + + $validator=Validator::make(Input::all(), $field->rules); + if ($validator->passes()) { + $results=$field->save(); + //return "postCreateField: $results"; + if ($results) { + return Redirect::route("admin.custom_fields.index")->with("success", Lang::get('admin/custom_fields/message.field.create.success')); + } else { + return Redirect::back()->withInput()->with('error', Lang::get('admin/custom_fields/message.field.create.error')); + } + } else { + return Redirect::back()->withInput()->withErrors($validator); + } + } + + public function deleteField($field_id) + { + $field=CustomField::find($field_id); + + if ($field->fieldset->count()>0) { + return Redirect::back()->withErrors(['message' => "Field is in-use"]); + } else { + $field->delete(); + return Redirect::route("admin.custom_fields.index")->with("success", Lang::get('admin/custom_fields/message.field.delete.success')); + } + } + + /** + * Display the specified resource. + * + * @param int $id + * @return Response + */ + public function show($id) + { + //$id=$parameters[0]; + $cfset=CustomFieldset::find($id); + + //print_r($parameters); + // + $custom_fields_list=["" => "Add New Field to Fieldset"] + CustomField::lists("name", "id")->toArray(); + // print_r($custom_fields_list); + $maxid=0; + foreach ($cfset->fields as $field) { + // print "Looking for: ".$field->id; + if ($field->pivot->order > $maxid) { + $maxid=$field->pivot->order; + } + if (isset($custom_fields_list[$field->id])) { + // print "Found ".$field->id.", so removing it.
    "; + unset($custom_fields_list[$field->id]); + } + } + + return View::make("custom_fields.show")->with("custom_fieldset", $cfset)->with("maxid", $maxid+1)->with("custom_fields_list", $custom_fields_list); + } + + + /** + * Show the form for editing the specified resource. + * + * @param int $id + * @return Response + */ + public function edit($id) + { + // + } + + + /** + * Update the specified resource in storage. + * + * @param int $id + * @return Response + */ + public function update($id) + { + // + } + + + /** + * Remove the specified resource from storage. + * + * @param int $id + * @return Response + */ + public function destroy($id) + { + // + $fieldset=CustomFieldset::find($id); + + $models=\App\Models\AssetModel::where("fieldset_id", "=", $id); + if ($models->count()==0) { + $fieldset->delete(); + return Redirect::route("admin.custom_fields.index")->with("success", Lang::get('admin/custom_fields/message.fieldset.delete.success')); + } else { + return Redirect::route("admin.custom_fields.index")->with("error", Lang::get('admin/custom_fields/message.fieldset.delete.in_use')); //->with("models",$models); + } + } +} diff --git a/app/Http/Controllers/DashboardController.php b/app/Http/Controllers/DashboardController.php new file mode 100755 index 0000000000..e0c9393c91 --- /dev/null +++ b/app/Http/Controllers/DashboardController.php @@ -0,0 +1,82 @@ +hasAccess('admin')) { + + $recent_activity = Actionlog::orderBy('created_at', 'DESC') + ->with('accessorylog', 'consumablelog', 'licenselog', 'assetlog', 'adminlog', 'userlog') + ->take(7) + ->get(); + + + $asset_stats['total'] = Asset::Hardware()->count(); + + $asset_stats['rtd']['total'] = Asset::Hardware()->RTD()->count(); + + if ($asset_stats['rtd']['total'] > 0) { + $asset_stats['rtd']['percent'] = round(($asset_stats['rtd']['total']/$asset_stats['total']) * 100); + } else { + $asset_stats['rtd']['percent'] = 0; + } + + + $asset_stats['pending']['total'] = Asset::Hardware()->Pending()->count(); + + if ($asset_stats['pending']['total'] > 0) { + $asset_stats['pending']['percent'] = round(($asset_stats['pending']['total']/$asset_stats['total']) * 100); + } else { + $asset_stats['pending']['percent'] = 0; + } + + + $asset_stats['deployed']['total'] = Asset::Hardware()->Deployed()->count(); + + if ($asset_stats['deployed']['total'] > 0) { + $asset_stats['deployed']['percent'] = round(($asset_stats['deployed']['total']/$asset_stats['total']) * 100); + } else { + $asset_stats['deployed']['percent'] = 0; + } + + + $asset_stats['undeployable']['total'] = Asset::Hardware()->Undeployable()->count(); + + if ($asset_stats['undeployable']['total'] > 0) { + $asset_stats['undeployable']['percent'] = round(($asset_stats['undeployable']['total']/$asset_stats['total']) * 100); + } else { + $asset_stats['undeployable']['percent'] = 0; + } + + $asset_stats['archived']['total'] = Asset::Hardware()->Archived()->count(); + + if ($asset_stats['archived']['total'] > 0) { + $asset_stats['archived']['percent'] = round(($asset_stats['archived']['total']/$asset_stats['total']) * 100); + } else { + $asset_stats['archived']['percent'] = 0; + } + + + return View::make('dashboard')->with('asset_stats', $asset_stats)->with('recent_activity', $recent_activity); + } else { + // Redirect to the profile page + return Redirect::route('view-assets'); + } + } +} diff --git a/app/Http/Controllers/DepreciationsController.php b/app/Http/Controllers/DepreciationsController.php new file mode 100755 index 0000000000..ba59687c35 --- /dev/null +++ b/app/Http/Controllers/DepreciationsController.php @@ -0,0 +1,198 @@ +with('depreciation_options', $depreciation_options)->with('depreciation', new Depreciation); + } + + + /** + * Depreciation create form processing. + * + * @return Redirect + */ + public function postCreate() + { + + // get the POST data + $new = Input::all(); + + // create a new instance + $depreciation = new Depreciation(); + + // Depreciation data + $depreciation->name = e(Input::get('name')); + $depreciation->months = e(Input::get('months')); + $depreciation->user_id = Auth::user()->id; + + // Was the asset created? + if ($depreciation->save()) { + // Redirect to the new depreciation page + return Redirect::to("admin/settings/depreciations")->with('success', Lang::get('admin/depreciations/message.create.success')); + } + + return Redirect::back()->withInput()->withErrors($depreciation->getErrors()); + + } + + /** + * Depreciation update. + * + * @param int $depreciationId + * @return View + */ + public function getEdit($depreciationId = null) + { + // Check if the depreciation exists + if (is_null($depreciation = Depreciation::find($depreciationId))) { + // Redirect to the blogs management page + return Redirect::to('admin/settings/depreciations')->with('error', Lang::get('admin/depreciations/message.does_not_exist')); + } + + // Show the page + //$depreciation_options = array('' => 'Top Level') + Depreciation::lists('name', 'id'); + + $depreciation_options = array('' => 'Top Level') + DB::table('depreciations')->where('id', '!=', $depreciationId)->lists('name', 'id'); + return View::make('depreciations/edit', compact('depreciation'))->with('depreciation_options', $depreciation_options); + } + + + /** + * Depreciation update form processing page. + * + * @param int $depreciationId + * @return Redirect + */ + public function postEdit($depreciationId = null) + { + // Check if the depreciation exists + if (is_null($depreciation = Depreciation::find($depreciationId))) { + // Redirect to the blogs management page + return Redirect::to('admin/settings/depreciations')->with('error', Lang::get('admin/depreciations/message.does_not_exist')); + } + + // Depreciation data + $depreciation->name = e(Input::get('name')); + $depreciation->months = e(Input::get('months')); + + // Was the asset created? + if ($depreciation->save()) { + // Redirect to the depreciation page + return Redirect::to("admin/settings/depreciations/")->with('success', Lang::get('admin/depreciations/message.update.success')); + } + + return Redirect::back()->withInput()->withErrors($depreciation->getErrors()); + + + } + + /** + * Delete the given depreciation. + * + * @param int $depreciationId + * @return Redirect + */ + public function getDelete($depreciationId) + { + // Check if the depreciation exists + if (is_null($depreciation = Depreciation::find($depreciationId))) { + // Redirect to the blogs management page + return Redirect::to('admin/settings/depreciations')->with('error', Lang::get('admin/depreciations/message.not_found')); + } + + if ($depreciation->has_models() > 0) { + + // Redirect to the asset management page + return Redirect::to('admin/settings/depreciations')->with('error', Lang::get('admin/depreciations/message.assoc_users')); + } else { + + $depreciation->delete(); + + // Redirect to the depreciations management page + return Redirect::to('admin/settings/depreciations')->with('success', Lang::get('admin/depreciations/message.delete.success')); + } + + } + + + public function getDatatable() + { + $depreciations = Depreciation::select(array('id','name','months')); + + if (Input::has('search')) { + $depreciations = $depreciations->TextSearch(e(Input::get('search'))); + } + + if (Input::has('offset')) { + $offset = e(Input::get('offset')); + } else { + $offset = 0; + } + + if (Input::has('limit')) { + $limit = e(Input::get('limit')); + } else { + $limit = 50; + } + + $allowed_columns = ['id','name','months']; + $order = Input::get('order') === 'asc' ? 'asc' : 'desc'; + $sort = in_array(Input::get('sort'), $allowed_columns) ? Input::get('sort') : 'created_at'; + + $depreciations->orderBy($sort, $order); + + $depreciationsCount = $depreciations->count(); + $depreciations = $depreciations->skip($offset)->take($limit)->get(); + + $rows = array(); + + foreach ($depreciations as $depreciation) { + $actions = ''; + + $rows[] = array( + 'id' => $depreciation->id, + 'name' => $depreciation->name, + 'months' => $depreciation->months, + 'actions' => $actions + ); + } + + $data = array('total' => $depreciationsCount, 'rows' => $rows); + + return $data; + + } +} diff --git a/app/Http/Controllers/GroupsController.php b/app/Http/Controllers/GroupsController.php new file mode 100755 index 0000000000..839ea572d0 --- /dev/null +++ b/app/Http/Controllers/GroupsController.php @@ -0,0 +1,212 @@ +with('group', $group); + } + + /** + * Group create form processing. + * + * @return Redirect + */ + public function postCreate() + { + // create a new group instance + $group = new \App\Models\Group(); + // Update the consumable data + $group->name = e(Input::get('name')); + + // Was the consumable created? + if ($group->save()) { + // Redirect to the new consumable page + return Redirect::to("admin/groups")->with('success', Lang::get('admin/groups/message.create.success')); + } + + return Redirect::back()->withInput()->withErrors($group->getErrors()); + + + } + + /** + * Group update. + * + * @param int $id + * @return View + */ + public function getEdit($id = null) + { + $group = \App\Models\Group::find($id); + $group->name = e(Input::get('name')); + $group->permissions = json_decode($group->permissions, true); + $permissions = config('permissions'); + + // Show the page + return View::make('groups/edit', compact('group', 'permissions','allpermissions')); + } + + /** + * Group update form processing page. + * + * @param int $id + * @return Redirect + */ + public function postEdit($id = null) + { + + if (!$group = \App\Models\Group::find($id)) { + return Redirect::route('groups')->with('error', Lang::get('admin/groups/message.group_not_found', compact('id'))); + + } + $group->name = e(Input::get('name')); + + if (!config('app.lock_passwords')) { + + // Was the consumable created? + if ($group->save()) { + // Redirect to the new consumable page + return Redirect::to("admin/groups")->with('success', Lang::get('admin/groups/message.create.success')); + } + return Redirect::back()->withInput()->withErrors($group->getErrors()); + + } else { + return Redirect::route('update/group', $id)->withInput()->with('error', 'Denied! Editing groups is not allowed in the demo.'); + } + + } + + /** + * Delete the given group. + * + * @param int $id + * @return Redirect + */ + public function getDelete($id = null) + { + if (!config('app.lock_passwords')) { + try { + // Get group information + $group = Sentry::getGroupProvider()->findById($id); + + // Delete the group + $group->delete(); + + // Redirect to the group management page + return Redirect::route('groups')->with('success', Lang::get('admin/groups/message.success.delete')); + } catch (GroupNotFoundException $e) { + // Redirect to the group management page + return Redirect::route('groups')->with('error', Lang::get('admin/groups/message.group_not_found', compact('id'))); + } + } else { + return Redirect::route('groups')->with('error', Lang::get('general.feature_disabled')); + } + } + + + + public function getDatatable($status = null) + { + + if (Input::has('offset')) { + $offset = e(Input::get('offset')); + } else { + $offset = 0; + } + + if (Input::has('limit')) { + $limit = e(Input::get('limit')); + } else { + $limit = 50; + } + + if (Input::get('sort')=='name') { + $sort = 'first_name'; + } else { + $sort = e(Input::get('sort')); + } + + // Grab all the groups + $groups = \App\Models\Group::with('users')->orderBy('name', 'ASC'); + //$users = Company::scopeCompanyables($users); + + if (Input::has('search')) { + $groups = $users->TextSearch(Input::get('search')); + } + + $order = Input::get('order') === 'asc' ? 'asc' : 'desc'; + + $allowed_columns = + [ + 'name','created_at' + ]; + + $sort = in_array($sort, $allowed_columns) ? $sort : 'name'; + $groups = $groups->orderBy($sort, $order); + + $groupsCount = $groups->count(); + $groups = $groups->skip($offset)->take($limit)->get(); + $rows = array(); + + foreach ($groups as $group) { + $group_names = ''; + $inout = ''; + $actions = ''; + + $actions .= ' '; + + if (!config('app.lock_passwords')) { + $actions .= ' '; + } else { + $actions .= ' '; + } + + $actions .= ''; + + $rows[] = array( + 'id' => $group->id, + 'name' => $group->name, + 'users' => $group->users->count(), + 'created_at' => $group->created_at->format('Y-m-d'), + 'actions' => ($actions) ? $actions : '', + ); + } + + $data = array('total'=>$groupsCount, 'rows'=>$rows); + return $data; + } +} diff --git a/app/Http/Controllers/LicensesController.php b/app/Http/Controllers/LicensesController.php new file mode 100755 index 0000000000..121fcf27fb --- /dev/null +++ b/app/Http/Controllers/LicensesController.php @@ -0,0 +1,985 @@ + 'Top Level') + License::lists('name', 'id'); + // Show the page + $depreciation_list = Helper::depreciationList(); + $supplier_list = Helper::suppliersList(); + $maintained_list = array('' => 'Maintained', '1' => 'Yes', '0' => 'No'); + $company_list = Helper::companyList(); + + return View::make('licenses/edit') + //->with('license_options',$license_options) + ->with('depreciation_list', $depreciation_list) + ->with('supplier_list', $supplier_list) + ->with('maintained_list', $maintained_list) + ->with('company_list', $company_list) + ->with('license', new License); + } + + + /** + * License create form processing. + * + * @return Redirect + */ + public function postCreate() + { + + + // get the POST data + $new = Input::all(); + + // create a new model instance + $license = new License(); + + if (e(Input::get('purchase_cost')) == '') { + $license->purchase_cost = null; + } else { + $license->purchase_cost = e(Input::get('purchase_cost')); + } + + if (e(Input::get('supplier_id')) == '') { + $license->supplier_id = null; + } else { + $license->supplier_id = e(Input::get('supplier_id')); + } + + if (e(Input::get('maintained')) == '') { + $license->maintained = 0; + } else { + $license->maintained = e(Input::get('maintained')); + } + + if (e(Input::get('reassignable')) == '') { + $license->reassignable = 0; + } else { + $license->reassignable = e(Input::get('reassignable')); + } + + if (e(Input::get('purchase_order')) == '') { + $license->purchase_order = ''; + } else { + $license->purchase_order = e(Input::get('purchase_order')); + } + + // Save the license data + $license->name = e(Input::get('name')); + $license->serial = e(Input::get('serial')); + $license->license_email = e(Input::get('license_email')); + $license->license_name = e(Input::get('license_name')); + $license->notes = e(Input::get('notes')); + $license->order_number = e(Input::get('order_number')); + $license->seats = e(Input::get('seats')); + $license->purchase_date = e(Input::get('purchase_date')); + $license->purchase_order = e(Input::get('purchase_order')); + $license->depreciation_id = e(Input::get('depreciation_id')); + $license->company_id = Company::getIdForCurrentUser(Input::get('company_id')); + $license->expiration_date = e(Input::get('expiration_date')); + $license->user_id = Auth::user()->id; + + if (($license->purchase_date == "") || ($license->purchase_date == "0000-00-00")) { + $license->purchase_date = null; + } + + if (($license->expiration_date == "") || ($license->expiration_date == "0000-00-00")) { + $license->expiration_date = null; + } + + if (($license->purchase_cost == "") || ($license->purchase_cost == "0.00")) { + $license->purchase_cost = null; + } + + // Was the license created? + if ($license->save()) { + + $insertedId = $license->id; + // Save the license seat data + for ($x=0; $x<$license->seats; $x++) { + $license_seat = new \App\Models\LicenseSeat(); + $license_seat->license_id = $insertedId; + $license_seat->user_id = Auth::user()->id; + $license_seat->assigned_to = null; + $license_seat->notes = null; + $license_seat->save(); + } + + + // Redirect to the new license page + return Redirect::to("admin/licenses")->with('success', Lang::get('admin/licenses/message.create.success')); + } + + return Redirect::back()->withInput()->withErrors($license->getErrors()); + + } + + /** + * License update. + * + * @param int $licenseId + * @return View + */ + public function getEdit($licenseId = null) + { + // Check if the license exists + if (is_null($license = License::find($licenseId))) { + // Redirect to the blogs management page + return Redirect::to('admin/licenses')->with('error', Lang::get('admin/licenses/message.does_not_exist')); + } elseif (!Company::isCurrentUserHasAccess($license)) { + return Redirect::to('admin/licenses')->with('error', Lang::get('general.insufficient_permissions')); + } + + if ($license->purchase_date == "0000-00-00") { + $license->purchase_date = null; + } + + if ($license->purchase_cost == "0.00") { + $license->purchase_cost = null; + } + + // Show the page + $license_options = array('' => 'Top Level') + DB::table('assets')->where('id', '!=', $licenseId)->pluck('name', 'id'); + $depreciation_list = array('0' => Lang::get('admin/licenses/form.no_depreciation')) + Depreciation::pluck('name', 'id')->toArray(); + $supplier_list = array('' => 'Select Supplier') + Supplier::orderBy('name', 'asc')->pluck('name', 'id')->toArray(); + $maintained_list = array('' => 'Maintained', '1' => 'Yes', '0' => 'No'); + $company_list = Helper::companyList(); + + return View::make('licenses/edit', compact('license')) + ->with('license_options', $license_options) + ->with('depreciation_list', $depreciation_list) + ->with('supplier_list', $supplier_list) + ->with('company_list', $company_list) + ->with('maintained_list', $maintained_list); + } + + + /** + * License update form processing page. + * + * @param int $licenseId + * @return Redirect + */ + public function postEdit($licenseId = null) + { + // Check if the license exists + if (is_null($license = License::find($licenseId))) { + // Redirect to the blogs management page + return Redirect::to('admin/licenses')->with('error', Lang::get('admin/licenses/message.does_not_exist')); + } elseif (!Company::isCurrentUserHasAccess($license)) { + return Redirect::to('admin/licenses')->with('error', Lang::get('general.insufficient_permissions')); + } + + // Update the license data + $license->name = e(Input::get('name')); + $license->serial = e(Input::get('serial')); + $license->license_email = e(Input::get('license_email')); + $license->license_name = e(Input::get('license_name')); + $license->notes = e(Input::get('notes')); + $license->order_number = e(Input::get('order_number')); + $license->depreciation_id = e(Input::get('depreciation_id')); + $license->company_id = Company::getIdForCurrentUser(Input::get('company_id')); + $license->purchase_order = e(Input::get('purchase_order')); + $license->maintained = e(Input::get('maintained')); + $license->reassignable = e(Input::get('reassignable')); + + if (e(Input::get('supplier_id')) == '') { + $license->supplier_id = null; + } else { + $license->supplier_id = e(Input::get('supplier_id')); + } + + // Update the asset data + if (e(Input::get('purchase_date')) == '') { + $license->purchase_date = null; + } else { + $license->purchase_date = e(Input::get('purchase_date')); + } + + if (e(Input::get('expiration_date')) == '') { + $license->expiration_date = null; + } else { + $license->expiration_date = e(Input::get('expiration_date')); + } + + if (e(Input::get('termination_date')) == '') { + $license->termination_date = null; + } else { + $license->termination_date = e(Input::get('termination_date')); + } + + if (e(Input::get('purchase_cost')) == '') { + $license->purchase_cost = null; + } else { + $license->purchase_cost = e(Input::get('purchase_cost')); + //$license->purchase_cost = e(Input::get('purchase_cost')); + } + + if (e(Input::get('maintained')) == '') { + $license->maintained = 0; + } else { + $license->maintained = e(Input::get('maintained')); + } + + if (e(Input::get('reassignable')) == '') { + $license->reassignable = 0; + } else { + $license->reassignable = e(Input::get('reassignable')); + } + + if (e(Input::get('purchase_order')) == '') { + $license->purchase_order = ''; + } else { + $license->purchase_order = e(Input::get('purchase_order')); + } + + //Are we changing the total number of seats? + if ($license->seats != e(Input::get('seats'))) { + //Determine how many seats we are dealing with + $difference = e(Input::get('seats')) - $license->licenseseats()->count(); + + if ($difference < 0) { + //Filter out any license which have a user attached; + $seats = $license->licenseseats->filter(function ($seat) { + return is_null($seat->user); + }); + + + //If the remaining collection is as large or larger than the number of seats we want to delete + if ($seats->count() >= abs($difference)) { + for ($i=1; $i <= abs($difference); $i++) { + //Delete the appropriate number of seats + $seats->pop()->delete(); + } + + //Log the deletion of seats to the log + $logaction = new Actionlog(); + $logaction->asset_id = $license->id; + $logaction->asset_type = 'software'; + $logaction->user_id = Auth::user()->id; + $logaction->note = abs($difference)." seats"; + $logaction->checkedout_to = null; + $log = $logaction->logaction('delete seats'); + + } else { + // Redirect to the license edit page + return Redirect::to("admin/licenses/$licenseId/edit")->with('error', Lang::get('admin/licenses/message.assoc_users')); + } + } else { + + for ($i=1; $i <= $difference; $i++) { + //Create a seat for this license + $license_seat = new LicenseSeat(); + $license_seat->license_id = $license->id; + $license_seat->user_id = Auth::user()->id; + $license_seat->assigned_to = null; + $license_seat->notes = null; + $license_seat->save(); + } + + //Log the addition of license to the log. + $logaction = new Actionlog(); + $logaction->asset_id = $license->id; + $logaction->asset_type = 'software'; + $logaction->user_id = Auth::user()->id; + $logaction->note = abs($difference)." seats"; + $log = $logaction->logaction('add seats'); + } + $license->seats = e(Input::get('seats')); + } + + // Was the asset created? + if ($license->save()) { + // Redirect to the new license page + return Redirect::to("admin/licenses/$licenseId/view")->with('success', Lang::get('admin/licenses/message.update.success')); + } + + + // Redirect to the license edit page + return Redirect::to("admin/licenses/$licenseId/edit")->with('error', Lang::get('admin/licenses/message.update.error')); + + } + + /** + * Delete the given license. + * + * @param int $licenseId + * @return Redirect + */ + public function getDelete($licenseId) + { + // Check if the license exists + if (is_null($license = License::find($licenseId))) { + // Redirect to the license management page + return Redirect::to('admin/licenses')->with('error', Lang::get('admin/licenses/message.not_found')); + } elseif (!Company::isCurrentUserHasAccess($license)) { + return Redirect::to('admin/licenses')->with('error', Lang::get('general.insufficient_permissions')); + } + + if (($license->assignedcount()) && ($license->assignedcount() > 0)) { + + // Redirect to the license management page + return Redirect::to('admin/licenses')->with('error', Lang::get('admin/licenses/message.assoc_users')); + + } else { + + // Delete the license and the associated license seats + DB::table('license_seats') + ->where('id', $license->id) + ->update(array('assigned_to' => null,'asset_id' => null)); + + $licenseseats = $license->licenseseats(); + $licenseseats->delete(); + $license->delete(); + + + + + // Redirect to the licenses management page + return Redirect::to('admin/licenses')->with('success', Lang::get('admin/licenses/message.delete.success')); + } + + + } + + + /** + * Check out the asset to a person + **/ + public function getCheckout($seatId) + { + // Check if the asset exists + if (is_null($licenseseat = LicenseSeat::find($seatId))) { + // Redirect to the asset management page with error + return Redirect::to('admin/licenses')->with('error', Lang::get('admin/licenses/message.not_found')); + } elseif (!Company::isCurrentUserHasAccess($licenseseat->license)) { + return Redirect::to('admin/licenses')->with('error', Lang::get('general.insufficient_permissions')); + } + + // Get the dropdown of users and then pass it to the checkout view + $users_list = array('' => 'Select a User') + DB::table('users')->select(DB::raw('concat(last_name,", ",first_name," (",username,")") as full_name, id'))->whereNull('deleted_at')->orderBy('last_name', 'asc')->orderBy('first_name', 'asc')->lists('full_name', 'id'); + + + // Left join to get a list of assets and some other helpful info + $asset = DB::table('assets') + ->leftJoin('users', 'users.id', '=', 'assets.assigned_to') + ->leftJoin('models', 'assets.model_id', '=', 'models.id') + ->select( + 'assets.id', + 'assets.name', + 'first_name', + 'last_name', + 'asset_tag', + DB::raw('concat(first_name," ",last_name) as full_name, assets.id as id, models.name as modelname') + ) + ->whereNull('assets.deleted_at') + ->get(); + + $asset_array = json_decode(json_encode($asset), true); + $asset_element[''] = 'Please select an asset'; + + // Build a list out of the data results + for ($x=0; $xwith('users_list', $users_list)->with('asset_list', $asset_element); + + } + + + + /** + * Check out the asset to a person + **/ + public function postCheckout($seatId) + { + + $licenseseat = LicenseSeat::find($seatId); + $assigned_to = e(Input::get('assigned_to')); + $asset_id = e(Input::get('asset_id')); + $user = Auth::user(); + + if (!Company::isCurrentUserHasAccess($licenseseat->license)) { + return Redirect::to('admin/licenses')->with('error', Lang::get('general.insufficient_permissions')); + } + + // Declare the rules for the form validation + $rules = array( + + 'note' => 'string', + 'asset_id' => 'required_without:assigned_to', + ); + + // Create a new validator instance from our validation rules + $validator = Validator::make(Input::all(), $rules); + + // If validation fails, we'll exit the operation now. + if ($validator->fails()) { + // Ooops.. something went wrong + return Redirect::back()->withInput()->withErrors($validator); + } + + if ($assigned_to!='') { + // Check if the user exists + if (is_null($is_assigned_to = User::find($assigned_to))) { + // Redirect to the asset management page with error + return Redirect::to('admin/licenses')->with('error', Lang::get('admin/licenses/message.user_does_not_exist')); + } + } + + if ($asset_id!='') { + + if (is_null($is_asset_id = Asset::find($asset_id))) { + // Redirect to the asset management page with error + return Redirect::to('admin/licenses')->with('error', Lang::get('admin/licenses/message.asset_does_not_exist')); + } + + if (($is_asset_id->assigned_to!=$assigned_to) && ($assigned_to!='')) { + //echo 'asset assigned to: '.$is_asset_id->assigned_to.'
    license assigned to: '.$assigned_to; + return Redirect::to('admin/licenses')->with('error', Lang::get('admin/licenses/message.owner_doesnt_match_asset')); + } + + } + + + + // Check if the asset exists + if (is_null($licenseseat)) { + // Redirect to the asset management page with error + return Redirect::to('admin/licenses')->with('error', Lang::get('admin/licenses/message.not_found')); + } + + if (Input::get('asset_id') == '') { + $licenseseat->asset_id = null; + } else { + $licenseseat->asset_id = e(Input::get('asset_id')); + } + + // Update the asset data + if (e(Input::get('assigned_to')) == '') { + $licenseseat->assigned_to = null; + + } else { + $licenseseat->assigned_to = e(Input::get('assigned_to')); + } + + // Was the asset updated? + if ($licenseseat->save()) { + + $logaction = new Actionlog(); + + //$logaction->location_id = $assigned_to->location_id; + $logaction->asset_type = 'software'; + $logaction->user_id = Auth::user()->id; + $logaction->note = e(Input::get('note')); + $logaction->asset_id = $licenseseat->license_id; + + + $license = License::find($licenseseat->license_id); + $settings = Setting::getSettings(); + + + // Update the asset data + if (e(Input::get('assigned_to')) == '') { + $logaction->checkedout_to = null; + $slack_msg = strtoupper($logaction->asset_type).' license <'.config('app.url').'/admin/licenses/'.$license->id.'/view'.'|'.$license->name.'> checked out to <'.config('app.url').'/hardware/'.$is_asset_id->id.'/view|'.$is_asset_id->showAssetName().'> by <'.config('app.url').'/admin/users/'.$user->id.'/view'.'|'.$user->fullName().'>.'; + } else { + $logaction->checkedout_to = e(Input::get('assigned_to')); + $slack_msg = strtoupper($logaction->asset_type).' license <'.config('app.url').'/admin/licenses/'.$license->id.'/view'.'|'.$license->name.'> checked out to <'.config('app.url').'/admin/users/'.$is_assigned_to->id.'/view|'.$is_assigned_to->fullName().'> by <'.config('app.url').'/admin/users/'.$user->id.'/view'.'|'.$user->fullName().'>.'; + } + + + + if ($settings->slack_endpoint) { + + + $slack_settings = [ + 'username' => $settings->botname, + 'channel' => $settings->slack_channel, + 'link_names' => true + ]; + + $client = new \Maknz\Slack\Client($settings->slack_endpoint, $slack_settings); + + try { + $client->attach([ + 'color' => 'good', + 'fields' => [ + [ + 'title' => 'Checked Out:', + 'value' => $slack_msg + ], + [ + 'title' => 'Note:', + 'value' => e($logaction->note) + ], + + + + ] + ])->send('License Checked Out'); + + } catch (Exception $e) { + + } + + } + + $log = $logaction->logaction('checkout'); + + + // Redirect to the new asset page + return Redirect::to("admin/licenses")->with('success', Lang::get('admin/licenses/message.checkout.success')); + } + + // Redirect to the asset management page with error + return Redirect::to('admin/licenses/$assetId/checkout')->with('error', Lang::get('admin/licenses/message.create.error'))->with('license', new License); + } + + + /** + * Check the license back into inventory + **/ + public function getCheckin($seatId = null, $backto = null) + { + // Check if the asset exists + if (is_null($licenseseat = LicenseSeat::find($seatId))) { + // Redirect to the asset management page with error + return Redirect::to('admin/licenses')->with('error', Lang::get('admin/licenses/message.not_found')); + } elseif (!Company::isCurrentUserHasAccess($licenseseat->license)) { + return Redirect::to('admin/licenses')->with('error', Lang::get('general.insufficient_permissions')); + } + return View::make('licenses/checkin', compact('licenseseat'))->with('backto', $backto); + + } + + + + /** + * Check in the item so that it can be checked out again to someone else + **/ + public function postCheckin($seatId = null, $backto = null) + { + // Check if the asset exists + if (is_null($licenseseat = LicenseSeat::find($seatId))) { + // Redirect to the asset management page with error + return Redirect::to('admin/licenses')->with('error', Lang::get('admin/licenses/message.not_found')); + } + + $license = License::find($licenseseat->license_id); + + if (!Company::isCurrentUserHasAccess($license)) { + return Redirect::to('admin/licenses')->with('error', Lang::get('general.insufficient_permissions')); + } + + if (!$license->reassignable) { + // Not allowed to checkin + Session::flash('error', 'License not reassignable.'); + return Redirect::back()->withInput(); + } + + // Declare the rules for the form validation + $rules = array( + 'note' => 'string', + 'notes' => 'string', + ); + + // Create a new validator instance from our validation rules + $validator = Validator::make(Input::all(), $rules); + + // If validation fails, we'll exit the operation now. + if ($validator->fails()) { + // Ooops.. something went wrong + return Redirect::back()->withInput()->withErrors($validator); + } + $return_to = $licenseseat->assigned_to; + $logaction = new Actionlog(); + $logaction->checkedout_to = $licenseseat->assigned_to; + + // Update the asset data + $licenseseat->assigned_to = null; + $licenseseat->asset_id = null; + + $user = Auth::user(); + + // Was the asset updated? + if ($licenseseat->save()) { + $logaction->asset_id = $licenseseat->license_id; + $logaction->location_id = null; + $logaction->asset_type = 'software'; + $logaction->note = e(Input::get('note')); + $logaction->user_id = $user->id; + + $settings = Setting::getSettings(); + + if ($settings->slack_endpoint) { + + + $slack_settings = [ + 'username' => $settings->botname, + 'channel' => $settings->slack_channel, + 'link_names' => true + ]; + + $client = new \Maknz\Slack\Client($settings->slack_endpoint, $slack_settings); + + try { + $client->attach([ + 'color' => 'good', + 'fields' => [ + [ + 'title' => 'Checked In:', + 'value' => strtoupper($logaction->asset_type).' <'.config('app.url').'/admin/licenses/'.$license->id.'/view'.'|'.$license->name.'> checked in by <'.config('app.url').'/admin/users/'.$user->id.'/view'.'|'.$user->fullName().'>.' + ], + [ + 'title' => 'Note:', + 'value' => e($logaction->note) + ], + + ] + ])->send('License Checked In'); + + } catch (Exception $e) { + + } + + } + + + $log = $logaction->logaction('checkin from'); + + + + if ($backto=='user') { + return Redirect::to("admin/users/".$return_to.'/view')->with('success', Lang::get('admin/licenses/message.checkin.success')); + } else { + return Redirect::to("admin/licenses/".$licenseseat->license_id."/view")->with('success', Lang::get('admin/licenses/message.checkin.success')); + } + + } + + // Redirect to the license page with error + return Redirect::to("admin/licenses")->with('error', Lang::get('admin/licenses/message.checkin.error')); + } + + /** + * Get the asset information to present to the asset view page + * + * @param int $licenseId + * @return View + **/ + public function getView($licenseId = null) + { + + $license = License::find($licenseId); + + if (isset($license->id)) { + + if (!\App\Models\Company::isCurrentUserHasAccess($license)) { + return Redirect::to('admin/licenses')->with('error', Lang::get('general.insufficient_permissions')); + } + return View::make('licenses/view', compact('license')); + + } else { + // Prepare the error message + $error = Lang::get('admin/licenses/message.does_not_exist', compact('id')); + + // Redirect to the user management page + return Redirect::route('licenses')->with('error', $error); + } + } + + public function getClone($licenseId = null) + { + // Check if the license exists + if (is_null($license_to_clone = License::find($licenseId))) { + // Redirect to the blogs management page + return Redirect::to('admin/licenses')->with('error', Lang::get('admin/licenses/message.does_not_exist')); + } elseif (!Company::isCurrentUserHasAccess($license_to_clone)) { + return Redirect::to('admin/licenses')->with('error', Lang::get('general.insufficient_permissions')); + } + + // Show the page + $license_options = array('0' => 'Top Level') + License::pluck('name', 'id')->toArray(); + $maintained_list = array('' => 'Maintained', '1' => 'Yes', '0' => 'No'); + $company_list = Helper::companyList(); + //clone the orig + $license = clone $license_to_clone; + $license->id = null; + $license->serial = null; + + // Show the page + $depreciation_list = Helper::depreciationList(); + $supplier_list = Helper::suppliersList(); + return View::make('licenses/edit') + ->with('license_options', $license_options) + ->with('depreciation_list', $depreciation_list) + ->with('supplier_list', $supplier_list) + ->with('license', $license) + ->with('maintained_list', $maintained_list) + ->with('company_list', $company_list); + + } + + + /** + * Upload the file to the server + * + * @param int $licenseId + * @return View + **/ + public function postUpload($licenseId = null) + { + $license = License::find($licenseId); + + // the license is valid + $destinationPath = storage_path().'/app/private_uploads'; + + if (isset($license->id)) { + + + if (!Company::isCurrentUserHasAccess($license)) { + return Redirect::to('admin/licenses')->with('error', Lang::get('general.insufficient_permissions')); + } + + if (Input::hasFile('licensefile')) { + + foreach (Input::file('licensefile') as $file) { + + $rules = array( + 'licensefile' => 'required|mimes:png,gif,jpg,jpeg,doc,docx,pdf,txt,zip,rar|max:2000' + ); + $validator = Validator::make(array('licensefile'=> $file), $rules); + + if ($validator->passes()) { + + $extension = $file->getClientOriginalExtension(); + $filename = 'license-'.$license->id.'-'.str_random(8); + $filename .= '-'.str_slug($file->getClientOriginalName()).'.'.$extension; + $upload_success = $file->move($destinationPath, $filename); + + //Log the deletion of seats to the log + $logaction = new Actionlog(); + $logaction->asset_id = $license->id; + $logaction->asset_type = 'software'; + $logaction->user_id = Auth::user()->id; + $logaction->note = e(Input::get('notes')); + $logaction->checkedout_to = null; + $logaction->created_at = date("Y-m-d h:i:s"); + $logaction->filename = $filename; + $log = $logaction->logaction('uploaded'); + } else { + return Redirect::back()->with('error', Lang::get('admin/licenses/message.upload.invalidfiles')); + } + + + } + + if ($upload_success) { + return Redirect::back()->with('success', Lang::get('admin/licenses/message.upload.success')); + } else { + return Redirect::back()->with('success', Lang::get('admin/licenses/message.upload.error')); + } + + } else { + return Redirect::back()->with('error', Lang::get('admin/licenses/message.upload.nofiles')); + } + + + + + + } else { + // Prepare the error message + $error = Lang::get('admin/licenses/message.does_not_exist', compact('id')); + + // Redirect to the licence management page + return Redirect::route('licenses')->with('error', $error); + } + } + + + /** + * Delete the associated file + * + * @param int $licenseId + * @param int $fileId + * @return View + **/ + public function getDeleteFile($licenseId = null, $fileId = null) + { + $license = License::find($licenseId); + $destinationPath = storage_path().'/app/private_uploads'; + + // the license is valid + if (isset($license->id)) { + + + if (!Company::isCurrentUserHasAccess($license)) { + return Redirect::to('admin/licenses')->with('error', Lang::get('general.insufficient_permissions')); + } + + $log = Actionlog::find($fileId); + $full_filename = $destinationPath.'/'.$log->filename; + if (file_exists($full_filename)) { + unlink($destinationPath.'/'.$log->filename); + } + $log->delete(); + return Redirect::back()->with('success', Lang::get('admin/licenses/message.deletefile.success')); + + } else { + // Prepare the error message + $error = Lang::get('admin/licenses/message.does_not_exist', compact('id')); + + // Redirect to the licence management page + return Redirect::route('licenses')->with('error', $error); + } + } + + + + /** + * Display/download the uploaded file + * + * @param int $licenseId + * @param int $fileId + * @return View + **/ + public function displayFile($licenseId = null, $fileId = null) + { + + $license = License::find($licenseId); + + // the license is valid + if (isset($license->id)) { + + if (!Company::isCurrentUserHasAccess($license)) { + return Redirect::to('admin/licenses')->with('error', Lang::get('general.insufficient_permissions')); + } + + $log = Actionlog::find($fileId); + $file = $log->get_src(); + return Response::download($file); + } else { + // Prepare the error message + $error = Lang::get('admin/licenses/message.does_not_exist', compact('id')); + + // Redirect to the licence management page + return Redirect::route('licenses')->with('error', $error); + } + } + + public function getDatatable() + { + $licenses = License::with('company'); + + if (Input::has('search')) { + $licenses = $licenses->TextSearch(Input::get('search')); + } + + $allowed_columns = ['id','name','purchase_cost','expiration_date','purchase_order','order_number','notes','purchase_date','serial']; + $order = Input::get('order') === 'asc' ? 'asc' : 'desc'; + $sort = in_array(Input::get('sort'), $allowed_columns) ? Input::get('sort') : 'created_at'; + + $licenses = $licenses->orderBy($sort, $order); + + $licenseCount = $licenses->count(); + $licenses = $licenses->skip(Input::get('offset'))->take(Input::get('limit'))->get(); + + $rows = array(); + + foreach ($licenses as $license) { + $actions = 'remaincount() > 0) ? '' : 'disabled').'>'.Lang::get('general.checkout').' '; + + $rows[] = array( + 'id' => $license->id, + 'name' => (string) link_to('/admin/licenses/'.$license->id.'/view', $license->name), + 'serial' => (string) link_to('/admin/licenses/'.$license->id.'/view', mb_strimwidth($license->serial, 0, 50, "...")), + 'totalSeats' => $license->totalSeatsByLicenseID(), + 'remaining' => $license->remaincount(), + 'license_name' => $license->license_name, + 'license_email' => $license->license_email, + 'purchase_date' => ($license->purchase_date) ? $license->purchase_date : '', + 'expiration_date' => ($license->expiration_date) ? $license->expiration_date : '', + 'purchase_cost' => ($license->purchase_cost) ? $license->purchase_cost : '', + 'purchase_order' => ($license->purchase_order) ? $license->purchase_order : '', + 'order_number' => ($license->order_number) ? $license->order_number : '', + 'notes' => ($license->notes) ? $license->notes : '', + 'actions' => $actions, + 'companyName' => is_null($license->company) ? '' : e($license->company->name) + ); + } + + $data = array('total' => $licenseCount, 'rows' => $rows); + + return $data; + } + + public function getFreeLicense($licenseId) + { + // Check if the asset exists + if (is_null($license = License::find($licenseId))) { + // Redirect to the asset management page with error + return Redirect::to('admin/licenses')->with('error', Lang::get('admin/licenses/message.not_found')); + } + $seatId = $license->freeSeat($licenseId); + return Redirect::to('admin/licenses/'.$seatId.'/checkout'); + } +} diff --git a/app/Http/Controllers/LocationsController.php b/app/Http/Controllers/LocationsController.php new file mode 100755 index 0000000000..60e8cf1490 --- /dev/null +++ b/app/Http/Controllers/LocationsController.php @@ -0,0 +1,379 @@ +with('parent', 'assets', 'assignedassets')->get(); + + // Show the page + return View::make('locations/index', compact('locations')); + } + + + /** + * Location create. + * + * @return View + */ + public function getCreate() + { + $locations = \App\Models\Location::orderBy('name', 'ASC')->get(); + + $location_options_array = \App\Models\Location::getLocationHierarchy($locations); + $location_options = \App\Models\Location::flattenLocationsArray($location_options_array); + $location_options = array('' => 'Top Level') + $location_options; + + return View::make('locations/edit') + ->with('location_options', $location_options) + ->with('location', new Location); + } + + + /** + * Location create form processing. + * + * @return Redirect + */ + public function postCreate() + { + + // create a new location instance + $location = new \App\Models\Location(); + + + // Save the location data + $location->name = e(Input::get('name')); + if (Input::get('parent_id')=='') { + $location->parent_id = null; + } else { + $location->parent_id = e(Input::get('parent_id')); + } + $location->currency = Input::get('currency', '$'); + $location->address = e(Input::get('address')); + $location->address2 = e(Input::get('address2')); + $location->city = e(Input::get('city')); + $location->state = e(Input::get('state')); + $location->country = e(Input::get('country')); + $location->zip = e(Input::get('zip')); + $location->user_id = Auth::user()->id; + + // Was the asset created? + if ($location->save()) { + // Redirect to the new location page + return Redirect::to("admin/settings/locations")->with('success', Lang::get('admin/locations/message.create.success')); + } + + return Redirect::back()->withInput()->withErrors($location->getErrors()); + + } + + public function store() + { + + $new['currency']=Setting::first()->default_currency; + + // create a new location instance + $location = new Location(); + + // Save the location data + $location->name = e(Input::get('name')); + // if (Input::get('parent_id')=='') { + // $location->parent_id = null; + // } else { + // $location->parent_id = e(Input::get('parent_id')); + // } + $location->currency = Setting::first()->default_currency; //e(Input::get('currency')); + $location->address = ''; //e(Input::get('address')); + // $location->address2 = e(Input::get('address2')); + $location->city = e(Input::get('city')); + $location->state = '';//e(Input::get('state')); + $location->country = e(Input::get('country')); + // $location->zip = e(Input::get('zip')); + $location->user_id = Auth::user()->id; + + // Was the location created? + if ($location->save()) { + return JsonResponse::create($location); + + } + + // failure + $errors = $location->errors(); + return JsonResponse::create(["error" => "Failed validation: ".print_r($location->getErrors(), true)], 500); + + } + + + /** + * Location update. + * + * @param int $locationId + * @return View + */ + public function getEdit($locationId = null) + { + // Check if the location exists + if (is_null($location = \App\Models\Location::find($locationId))) { + return Redirect::to('admin/settings/locations')->with('error', Lang::get('admin/locations/message.does_not_exist')); + } + + // Show the page + $locations = \App\Models\Location::orderBy('name', 'ASC')->get(); + $location_options_array = \App\Models\Location::getLocationHierarchy($locations); + $location_options = \App\Models\Location::flattenLocationsArray($location_options_array); + $location_options = array('' => 'Top Level') + $location_options; + + return View::make('locations/edit', compact('location'))->with('location_options', $location_options); + } + + + /** + * Location update form processing page. + * + * @param int $locationId + * @return Redirect + */ + public function postEdit($locationId = null) + { + // Check if the location exists + if (is_null($location = \App\Models\Location::find($locationId))) { + // Redirect to the blogs management page + return Redirect::to('admin/settings/locations')->with('error', Lang::get('admin/locations/message.does_not_exist')); + } + + + // Update the location data + $location->name = e(Input::get('name')); + if (Input::get('parent_id')=='') { + $location->parent_id = null; + } else { + $location->parent_id = e(Input::get('parent_id', '')); + } + $location->currency = Input::get('currency', '$'); + $location->address = e(Input::get('address')); + $location->address2 = e(Input::get('address2')); + $location->city = e(Input::get('city')); + $location->state = e(Input::get('state')); + $location->country = e(Input::get('country')); + $location->zip = e(Input::get('zip')); + + // Was the asset created? + if ($location->save()) { + // Redirect to the saved location page + return Redirect::to("admin/settings/locations/")->with('success', Lang::get('admin/locations/message.update.success')); + } + + // Redirect to the location management page + return Redirect::back()->withInput()->withInput()->withErrors($location->getErrors()); + + } + + /** + * Delete the given location. + * + * @param int $locationId + * @return Redirect + */ + public function getDelete($locationId) + { + // Check if the location exists + if (is_null($location = \App\Models\Location::find($locationId))) { + // Redirect to the blogs management page + return Redirect::to('admin/settings/locations')->with('error', Lang::get('admin/locations/message.not_found')); + } + + + if ($location->users->count() > 0) { + return Redirect::to('admin/settings/locations')->with('error', Lang::get('admin/locations/message.assoc_users')); + } elseif ($location->childLocations->count() > 0) { + return Redirect::to('admin/settings/locations')->with('error', Lang::get('admin/locations/message.assoc_child_loc')); + } elseif ($location->assets->count() > 0) { + return Redirect::to('admin/settings/locations')->with('error', Lang::get('admin/locations/message.assoc_assets')); + } elseif ($location->assignedassets->count() > 0) { + return Redirect::to('admin/settings/locations')->with('error', Lang::get('admin/locations/message.assoc_assets')); + } else { + $location->delete(); + return Redirect::to('admin/settings/locations')->with('success', Lang::get('admin/locations/message.delete.success')); + } + + + + } + + + /** + * Get the location page detail page + * + * @param int $locationID + * @return View + **/ + public function getView($locationId = null) + { + $location = \App\Models\Location::find($locationId); + + if (isset($location->id)) { + return View::make('locations/view', compact('location')); + } else { + // Prepare the error message + $error = Lang::get('admin/locations/message.does_not_exist', compact('id')); + + // Redirect to the user management page + return Redirect::route('locations')->with('error', $error); + } + + + } + + + /** + * Get the locations API information to present to the location view page + * + * @param int $locationID + * @return JSON + **/ + public function getDatatable() + { + $locations = \App\Models\Location::select(array('locations.id','locations.name','locations.address','locations.address2','locations.city','locations.state','locations.zip','locations.country','locations.parent_id','locations.currency'))->with('assets'); + + + if (Input::has('search')) { + $locations = $locations->TextSearch(e(Input::get('search'))); + } + + if (Input::has('offset')) { + $offset = e(Input::get('offset')); + } else { + $offset = 0; + } + + if (Input::has('limit')) { + $limit = e(Input::get('limit')); + } else { + $limit = 50; + } + + $order = Input::get('order') === 'asc' ? 'asc' : 'desc'; + + + + switch (Input::get('sort')) { + case 'parent': + $locations = $locations->OrderParent($order); + break; + default: + $allowed_columns = ['id','name','address','city','state','country','currency']; + + $sort = in_array(Input::get('sort'), $allowed_columns) ? Input::get('sort') : 'created_at'; + $locations = $locations->orderBy($sort, $order); + break; + } + + + $locationsCount = $locations->count(); + $locations = $locations->skip($offset)->take($limit)->get(); + + $rows = array(); + + foreach ($locations as $location) { + $actions = ''; + + $rows[] = array( + 'id' => $location->id, + 'name' => (string)link_to('admin/settings/locations/'.$location->id.'/view', $location->name), + 'parent' => ($location->parent) ? $location->parent->name : '', + // 'assets' => ($location->assets->count() + $location->assignedassets->count()), + 'assets_default' => $location->assignedassets->count(), + 'assets_checkedout' => $location->assets->count(), + 'address' => ($location->address) ? $location->address: '', + 'city' => $location->city, + 'state' => $location->state, + 'country' => $location->country, + 'currency' => $location->currency, + 'actions' => $actions + ); + } + + $data = array('total' => $locationsCount, 'rows' => $rows); + + return $data; + + } + + + /** + * Get the location user listing information to present to the location details page + * + * @param int $locationID + * @return JSON + **/ + public function getDataViewUsers($locationID) + { + $location = \App\Models\Location::find($locationID); + $location_users = $location->users; + $count = $location_users->count(); + + $rows = array(); + + foreach ($location_users as $user) { + $rows[] = array( + 'name' => (string)link_to('/admin/users/'.$user->id.'/view', $user->fullName()) + ); + } + + $data = array('total' => $count, 'rows' => $rows); + + return $data; + } + + + /** + * Get the location asset information to present to the location details page + * + * @param int $locationID + * @return JSON + **/ + public function getDataViewAssets($locationID) + { + $location = \App\Models\Location::find($locationID); + $count = $location->assets->count(); + + $rows = array(); + + foreach ($location->assets as $asset) { + $rows[] = array( + 'name' => (string)link_to('/hardware/'.$asset->id.'/view', $asset->showAssetName()), + 'asset_tag' => $asset->asset_tag, + 'serial' => $asset->serial, + 'model' => $asset->model->name, + + ); + } + + $data = array('total' => $count, 'rows' => $rows); + return $data; + + } +} diff --git a/app/Http/Controllers/ManufacturersController.php b/app/Http/Controllers/ManufacturersController.php new file mode 100755 index 0000000000..a4fcf50908 --- /dev/null +++ b/app/Http/Controllers/ManufacturersController.php @@ -0,0 +1,288 @@ +with('manufacturer', new Manufacturer); + } + + + /** + * Manufacturer create form processing. + * + * @return Redirect + */ + public function postCreate() + { + + // Create a new manufacturer + $manufacturer = new Manufacturer; + $manufacturer->name = e(Input::get('name')); + $manufacturer->user_id = Auth::user()->id; + + // Was it created? + if ($manufacturer->save()) { + return Redirect::to("admin/settings/manufacturers")->with('success', Lang::get('admin/manufacturers/message.create.success')); + } + + return Redirect::back()->withInput()->withErrors($manufacturer->getErrors()); + + } + + /** + * Manufacturer update. + * + * @param int $manufacturerId + * @return View + */ + public function getEdit($manufacturerId = null) + { + // Check if the manufacturer exists + if (is_null($manufacturer = Manufacturer::find($manufacturerId))) { + // Redirect to the manufacturer page + return Redirect::to('admin/settings/manufacturers')->with('error', Lang::get('admin/manufacturers/message.does_not_exist')); + } + + // Show the page + return View::make('manufacturers/edit', compact('manufacturer')); + } + + + /** + * Manufacturer update form processing page. + * + * @param int $manufacturerId + * @return Redirect + */ + public function postEdit($manufacturerId = null) + { + // Check if the manufacturer exists + if (is_null($manufacturer = Manufacturer::find($manufacturerId))) { + // Redirect to the manufacturer page + return Redirect::to('admin/settings/manufacturers')->with('error', Lang::get('admin/manufacturers/message.does_not_exist')); + } + + // Save the data + $manufacturer->name = e(Input::get('name')); + + // Was it created? + if ($manufacturer->save()) { + // Redirect to the new manufacturer page + return Redirect::to("admin/settings/manufacturers")->with('success', Lang::get('admin/manufacturers/message.update.success')); + } + + return Redirect::back()->withInput()->withErrors($manufacturer->getErrors()); + + + } + + /** + * Delete the given manufacturer. + * + * @param int $manufacturerId + * @return Redirect + */ + public function getDelete($manufacturerId) + { + // Check if the manufacturer exists + if (is_null($manufacturer = Manufacturer::find($manufacturerId))) { + // Redirect to the manufacturers page + return Redirect::to('admin/settings/manufacturers')->with('error', Lang::get('admin/manufacturers/message.not_found')); + } + + if ($manufacturer->has_models() > 0) { + + // Redirect to the asset management page + return Redirect::to('admin/settings/manufacturers')->with('error', Lang::get('admin/manufacturers/message.assoc_users')); + } else { + + // Delete the manufacturer + $manufacturer->delete(); + + // Redirect to the manufacturers management page + return Redirect::to('admin/settings/manufacturers')->with('success', Lang::get('admin/manufacturers/message.delete.success')); + } + + + + + + + } + + + + /** + * Get the asset information to present to the category view page + * + * @param int $assetId + * @return View + **/ + public function getView($manufacturerID = null) + { + $manufacturer = Manufacturer::find($manufacturerID); + + if (isset($manufacturer->id)) { + return View::make('manufacturers/view', compact('manufacturer')); + } else { + // Prepare the error message + $error = Lang::get('admin/manufacturers/message.does_not_exist', compact('id')); + + // Redirect to the user management page + return Redirect::route('manufacturers')->with('error', $error); + } + + + } + + public function getDatatable() + { + $manufacturers = Manufacturer::select(array('id','name'))->with('assets') + ->whereNull('deleted_at'); + + if (Input::has('search')) { + $manufacturers = $manufacturers->TextSearch(e(Input::get('search'))); + } + + if (Input::has('offset')) { + $offset = e(Input::get('offset')); + } else { + $offset = 0; + } + + if (Input::has('limit')) { + $limit = e(Input::get('limit')); + } else { + $limit = 50; + } + + $allowed_columns = ['id','name']; + $order = Input::get('order') === 'asc' ? 'asc' : 'desc'; + $sort = in_array(Input::get('sort'), $allowed_columns) ? Input::get('sort') : 'created_at'; + + $manufacturers->orderBy($sort, $order); + + $manufacturersCount = $manufacturers->count(); + $manufacturers = $manufacturers->skip($offset)->take($limit)->get(); + + $rows = array(); + + foreach ($manufacturers as $manufacturer) { + $actions = ''; + + $rows[] = array( + 'id' => $manufacturer->id, + 'name' => (string)link_to('admin/settings/manufacturers/'.$manufacturer->id.'/view', $manufacturer->name), + 'assets' => $manufacturer->assets->count(), + 'actions' => $actions + ); + } + + $data = array('total' => $manufacturersCount, 'rows' => $rows); + + return $data; + + } + + + + public function getDataView($manufacturerID) + { + + $manufacturer = Manufacturer::with('assets.company')->find($manufacturerID); + $manufacturer_assets = $manufacturer->assets; + + if (Input::has('search')) { + $manufacturer_assets = $manufacturer_assets->TextSearch(e(Input::get('search'))); + } + + if (Input::has('offset')) { + $offset = e(Input::get('offset')); + } else { + $offset = 0; + } + + if (Input::has('limit')) { + $limit = e(Input::get('limit')); + } else { + $limit = 50; + } + + $order = Input::get('order') === 'asc' ? 'asc' : 'desc'; + + $allowed_columns = ['id','name','serial','asset_tag']; + $sort = in_array(Input::get('sort'), $allowed_columns) ? Input::get('sort') : 'created_at'; + $count = $manufacturer_assets->count(); + + $rows = array(); + + foreach ($manufacturer_assets as $asset) { + + $actions = ''; + if ($asset->deleted_at=='') { + $actions = '
    '; + } elseif ($asset->deleted_at!='') { + $actions = ''; + } + + if ($asset->assetstatus) { + if ($asset->assetstatus->deployable != 0) { + if (($asset->assigned_to !='') && ($asset->assigned_to > 0)) { + $inout = ''.Lang::get('general.checkin').''; + } else { + $inout = ''.Lang::get('general.checkout').''; + } + } + } + + $row = array( + 'id' => $asset->id, + 'name' => (string)link_to('/hardware/'.$asset->id.'/view', $asset->showAssetName()), + 'model' => $asset->model->name, + 'asset_tag' => $asset->asset_tag, + 'serial' => $asset->serial, + 'assigned_to' => ($asset->assigneduser) ? (string)link_to('/admin/users/'.$asset->assigneduser->id.'/view', $asset->assigneduser->fullName()): '', + 'actions' => $actions, + 'companyName' => Company::getName($asset), + ); + + if (isset($inout)) { + $row['change'] = $inout; + } + + $rows[] = $row; + } + + $data = array('total' => $count, 'rows' => $rows); + return $data; + } +} diff --git a/app/Http/Controllers/ProfileController.php b/app/Http/Controllers/ProfileController.php new file mode 100755 index 0000000000..0c842b330f --- /dev/null +++ b/app/Http/Controllers/ProfileController.php @@ -0,0 +1,63 @@ +with('location_list', $location_list); + } + + /** + * User profile form processing page. + * + * @return Redirect + */ + public function postIndex() + { + + // Grab the user + $user = Auth::user(); + + // Update the user information + $user->first_name = Input::get('first_name'); + $user->last_name = Input::get('last_name'); + $user->website = Input::get('website'); + $user->location_id = Input::get('location_id'); + $user->gravatar = Input::get('gravatar'); + $user->locale = Input::get('locale'); + + if (Input::file('avatar')) { + $image = Input::file('avatar'); + $file_name = $user->first_name."-".$user->last_name.".".$image->getClientOriginalExtension(); + $path = public_path('uploads/avatars/'.$file_name); + Image::make($image->getRealPath())->resize(84, 84)->save($path); + $user->avatar = $file_name; + } + + if (Input::get('avatar_delete') == 1 && Input::file('avatar') == "") { + $user->avatar = null; + } + + if ($user->save()) { + return Redirect::route('profile')->with('success', 'Account successfully updated'); + } + return Redirect::back()->withInput()->withErrors($user->getErrors()); + } +} diff --git a/app/Http/Controllers/ReportsController.php b/app/Http/Controllers/ReportsController.php new file mode 100644 index 0000000000..d83875c855 --- /dev/null +++ b/app/Http/Controllers/ReportsController.php @@ -0,0 +1,780 @@ +with('company')->get(); + + return View::make('reports/accessories', compact('accessories')); + } + + /** + * Export Accessories Report as CSV + * + * @return file download + */ + public function exportAccessoryReport() + { + $accessories = Accessory::orderBy('created_at', 'DESC')->get(); + + $rows = array(); + $header = array( + Lang::get('admin/accessories/table.title'), + Lang::get('admin/accessories/general.accessory_category'), + Lang::get('admin/accessories/general.total'), + Lang::get('admin/accessories/general.remaining') + ); + $header = array_map('trim', $header); + $rows[] = implode($header, ', '); + + // Row per accessory + foreach ($accessories as $accessory) { + $row = array(); + $row[] = $accessory->accessory_name; + $row[] = $accessory->accessory_category; + $row[] = $accessory->total; + $row[] = $accessory->remaining; + + $rows[] = implode($row, ','); + } + + $csv = implode($rows, "\n"); + $response = Response::make($csv, 200); + $response->header('Content-Type', 'text/csv'); + $response->header('Content-disposition', 'attachment;filename=report.csv'); + + return $response; + } + + /** + * Show Asset Report + * + * @return View + */ + public function getAssetsReport() + { + // Grab all the assets + $assets = Asset::with( + 'model', + 'assigneduser.userLoc', + 'assetstatus', + 'defaultLoc', + 'assetlog', + 'supplier', + 'model.manufacturer', + 'company' + ) + ->orderBy('created_at', 'DESC') + ->get(); + + return View::make('reports/asset', compact('assets')); + } + + /** + * Export Asset Report as CSV + * + * @return file download + */ + public function exportAssetReport() + { + // Grab all the assets + $assets = Asset::orderBy('created_at', 'DESC')->get(); + + $rows = [ ]; + + // Create the header row + $header = [ + Lang::get('admin/hardware/table.asset_tag'), + Lang::get('admin/hardware/form.manufacturer'), + Lang::get('admin/hardware/form.model'), + Lang::get('general.model_no'), + Lang::get('general.name'), + Lang::get('admin/hardware/table.serial'), + Lang::get('general.status'), + Lang::get('admin/hardware/table.purchase_date'), + Lang::get('admin/hardware/table.purchase_cost'), + Lang::get('admin/hardware/form.order'), + Lang::get('admin/hardware/form.supplier'), + Lang::get('admin/hardware/table.checkoutto'), + Lang::get('admin/hardware/table.location'), + Lang::get('general.notes'), + ]; + $header = array_map('trim', $header); + $rows[] = implode($header, ','); + + // Create a row per asset + foreach ($assets as $asset) { + $row = [ ]; + $row[] = $asset->asset_tag; + if ($asset->model->manufacturer) { + $row[] = $asset->model->manufacturer->name; + } else { + $row[] = ''; + } + $row[] = '"' . $asset->model->name . '"'; + $row[] = '"' . $asset->model->modelno . '"'; + $row[] = $asset->name; + $row[] = $asset->serial; + if ($asset->assetstatus) { + $row[] = $asset->assetstatus->name; + } else { + $row[] = ''; + } + $row[] = $asset->purchase_date; + $row[] = '"' . number_format($asset->purchase_cost) . '"'; + if ($asset->order_number) { + $row[] = $asset->order_number; + } else { + $row[] = ''; + } + if ($asset->supplier_id) { + $row[] = $asset->supplier->name; + } else { + $row[] = ''; + } + + if ($asset->assigned_to > 0) { + $user = User::find($asset->assigned_to); + $row[] = $user->fullName(); + } else { + $row[] = ''; // Empty string if unassigned + } + + if (( $asset->assigned_to > 0 ) && ( $asset->assigneduser->location_id > 0 )) { + $location = Location::find($asset->assigneduser->location_id); + if ($location) { + $row[] = $location->name; + } else { + $row[] = ''; + } + } elseif ($asset->rtd_location_id) { + $location = Location::find($asset->rtd_location_id); + if ($location->name) { + $row[] = $location->name; + } else { + $row[] = ''; + } + } else { + $row[] = ''; // Empty string if location is not set + } + + if ($asset->notes) { + $row[] = '"' . $asset->notes . '"'; + } else { + $row[] = ''; + } + + $rows[] = implode($row, ','); + } + + // spit out a csv + $csv = implode($rows, "\n"); + $response = Response::make($csv, 200); + $response->header('Content-Type', 'text/csv'); + $response->header('Content-disposition', 'attachment;filename=report.csv'); + + return $response; + } + + /** + * Show Depreciation Report for Assets + * + * @return View + */ + public function getDeprecationReport() + { + + // Grab all the assets + $assets = Asset::with('model', 'assigneduser', 'assetstatus', 'defaultLoc', 'assetlog', 'company') + ->orderBy('created_at', 'DESC')->get(); + + return View::make('reports/depreciation', compact('assets')); + } + + /** + * Export Depreciation Report as CSV + * + * @return file download + */ + public function exportDeprecationReport() + { + + // Grab all the assets + $assets = Asset::with('model', 'assigneduser', 'assetstatus', 'defaultLoc', 'assetlog') + ->orderBy('created_at', 'DESC')->get(); + + $csv = \League\Csv\Writer::createFromFileObject(new \SplTempFileObject()); + $csv->setOutputBOM(Reader::BOM_UTF16_BE); + + $rows = [ ]; + + // Create the header row + $header = [ + Lang::get('admin/hardware/table.asset_tag'), + Lang::get('admin/hardware/table.title'), + Lang::get('admin/hardware/table.serial'), + Lang::get('admin/hardware/table.checkoutto'), + Lang::get('admin/hardware/table.location'), + Lang::get('admin/hardware/table.purchase_date'), + Lang::get('admin/hardware/table.purchase_cost'), + Lang::get('admin/hardware/table.book_value'), + Lang::get('admin/hardware/table.diff') + ]; + + //we insert the CSV header + $csv->insertOne($header); + + // Create a row per asset + foreach ($assets as $asset) { + $row = [ ]; + $row[] = $asset->asset_tag; + $row[] = $asset->name; + $row[] = $asset->serial; + + if ($asset->assigned_to > 0) { + $user = User::find($asset->assigned_to); + $row[] = $user->fullName(); + } else { + $row[] = ''; // Empty string if unassigned + } + + if (( $asset->assigned_to > 0 ) && ( $asset->assigneduser->location_id > 0 )) { + $location = Location::find($asset->assigneduser->location_id); + if ($location->city) { + $row[] = $location->city . ', ' . $location->state; + } elseif ($location->name) { + $row[] = $location->name; + } else { + $row[] = ''; + } + } else { + $row[] = ''; // Empty string if location is not set + } + + if ($asset->assetloc) { + $currency = $asset->assetloc->currency; + } else { + $currency = Setting::first()->default_currency; + } + + $row[] = $asset->purchase_date; + $row[] = $currency . number_format($asset->purchase_cost); + $row[] = $currency . number_format($asset->getDepreciatedValue()); + $row[] = $currency . number_format(( $asset->purchase_cost - $asset->getDepreciatedValue() )); + $csv->insertOne($row); + } + + $csv->output('depreciation-report-' . date('Y-m-d') . '.csv'); + die; + + } + + /** + * Show Report for Activity + * + * @return View + */ + public function getActivityReport() + { + $log_actions = Actionlog::orderBy('created_at', 'DESC') + ->with('adminlog') + ->with('accessorylog') + ->with('assetlog') + ->with('licenselog') + ->with('userlog') + ->orderBy('created_at', 'DESC') + ->get(); + + return View::make('reports/activity', compact('log_actions')); + } + + /** + * Show Report for Licenses + * + * @return View + */ + public function getLicenseReport() + { + + $licenses = License::orderBy('created_at', 'DESC') + ->with('company') + ->get(); + + return View::make('reports/licenses', compact('licenses')); + } + + /** + * Export License Report as CSV + * + * @return file download + */ + public function exportLicenseReport() + { + $licenses = License::orderBy('created_at', 'DESC')->get(); + + $rows = [ ]; + $header = [ + Lang::get('admin/licenses/table.title'), + Lang::get('admin/licenses/table.serial'), + Lang::get('admin/licenses/form.seats'), + Lang::get('admin/licenses/form.remaining_seats'), + Lang::get('admin/licenses/form.expiration'), + Lang::get('admin/licenses/form.date'), + Lang::get('admin/licenses/form.cost') + ]; + + $header = array_map('trim', $header); + $rows[] = implode($header, ', '); + + // Row per license + foreach ($licenses as $license) { + $row = [ ]; + $row[] = $license->name; + $row[] = $license->serial; + $row[] = $license->seats; + $row[] = $license->remaincount(); + $row[] = $license->expiration_date; + $row[] = $license->purchase_date; + $row[] = '"' . number_format($license->purchase_cost) . '"'; + + $rows[] = implode($row, ','); + } + + $csv = implode($rows, "\n"); + $response = Response::make($csv, 200); + $response->header('Content-Type', 'text/csv'); + $response->header('Content-disposition', 'attachment;filename=report.csv'); + + return $response; + } + + public function getCustomReport() + { + + return View::make('reports/custom'); + } + + public function postCustom() + { + $assets = Asset::orderBy('created_at', 'DESC')->get(); + + $rows = [ ]; + $header = [ ]; + + if (e(Input::get('asset_name')) == '1') { + $header[] = 'Asset Name'; + } + if (e(Input::get('asset_tag')) == '1') { + $header[] = 'Asset Tag'; + } + if (e(Input::get('manufacturer')) == '1') { + $header[] = 'Manufacturer'; + } + if (e(Input::get('model')) == '1') { + $header[] = 'Model'; + $header[] = 'Model Number'; + } + if (e(Input::get('category')) == '1') { + $header[] = 'Category'; + } + if (e(Input::get('serial')) == '1') { + $header[] = 'Serial'; + } + if (e(Input::get('purchase_date')) == '1') { + $header[] = 'Purchase Date'; + } + if (( e(Input::get('purchase_cost')) == '1' ) && ( e(Input::get('depreciation')) != '1' )) { + $header[] = 'Purchase Cost'; + } + if (e(Input::get('order')) == '1') { + $header[] = 'Order Number'; + } + if (e(Input::get('supplier')) == '1') { + $header[] = 'Supplier'; + } + if (e(Input::get('location')) == '1') { + $header[] = 'Location'; + } + if (e(Input::get('assigned_to')) == '1') { + $header[] = 'Assigned To'; + } + if (e(Input::get('status')) == '1') { + $header[] = 'Status'; + } + if (e(Input::get('warranty')) == '1') { + $header[] = 'Warranty'; + $header[] = 'Warranty Expires'; + } + if (e(Input::get('depreciation')) == '1') { + $header[] = 'Purchase Cost'; + $header[] = 'Value'; + $header[] = 'Diff'; + } + + $header = array_map('trim', $header); + $rows[] = implode($header, ','); + + foreach ($assets as $asset) { + $row = [ ]; + if (e(Input::get('asset_name')) == '1') { + $row[] = '"' .$asset->name . '"'; + } + if (e(Input::get('asset_tag')) == '1') { + $row[] = $asset->asset_tag; + } + if (e(Input::get('manufacturer')) == '1') { + if ($asset->model->manufacturer) { + $row[] = '"' .$asset->model->manufacturer->name . '"'; + } else { + $row[] = ''; + } + } + if (e(Input::get('model')) == '1') { + $row[] = '"' . $asset->model->name . '"'; + $row[] = '"' . $asset->model->modelno . '"'; + } + if (e(Input::get('category')) == '1') { + $row[] = '"' .$asset->model->category->name . '"'; + } + + if (e(Input::get('serial')) == '1') { + $row[] = $asset->serial; + } + if (e(Input::get('purchase_date')) == '1') { + $row[] = $asset->purchase_date; + } + if (e(Input::get('purchase_cost')) == '1' && ( e(Input::get('depreciation')) != '1' )) { + $row[] = '"' . number_format($asset->purchase_cost) . '"'; + } + if (e(Input::get('order')) == '1') { + if ($asset->order_number) { + $row[] = $asset->order_number; + } else { + $row[] = ''; + } + } + if (e(Input::get('supplier')) == '1') { + if ($asset->supplier_id) { + $row[] = '"' .$asset->supplier->name . '"'; + } else { + $row[] = ''; + } + } + if (e(Input::get('location')) == '1') { + $show_loc = ''; + if (( $asset->assigned_to > 0 ) && ( $asset->assigneduser->location_id !='' )) { + $location = Location::find($asset->assigneduser->location_id); + if ($location) { + $show_loc .= '"' .$location->name. '"'; + } else { + $show_loc .= 'User location '.$asset->assigneduser->location_id.' is invalid'; + } + } elseif ($asset->rtd_location_id!='') { + $location = Location::find($asset->rtd_location_id); + if ($location) { + $show_loc .= '"' .$location->name. '"'; + } else { + $show_loc .= 'Default location '.$asset->rtd_location_id.' is invalid'; + } + } + + $row[] = $show_loc; + + } + if (e(Input::get('assigned_to')) == '1') { + if ($asset->assigned_to > 0) { + $user = User::find($asset->assigned_to); + $row[] = '"' .$user->fullName(). '"'; + } else { + $row[] = ''; // Empty string if unassigned + } + } + if (e(Input::get('status')) == '1') { + if (( $asset->status_id == '0' ) && ( $asset->assigned_to == '0' )) { + $row[] = Lang::get('general.ready_to_deploy'); + } elseif (( $asset->status_id == '' ) && ( $asset->assigned_to == '0' )) { + $row[] = Lang::get('general.pending'); + } elseif ($asset->assetstatus) { + $row[] = '"' .$asset->assetstatus->name. '"'; + } else { + $row[] = ''; + } + } + if (e(Input::get('warranty')) == '1') { + if ($asset->warranty_months) { + $row[] = $asset->warranty_months; + $row[] = $asset->warrantee_expires(); + } else { + $row[] = ''; + $row[] = ''; + } + } + if (e(Input::get('depreciation')) == '1') { + $depreciation = $asset->getDepreciatedValue(); + $row[] = '"' . number_format($asset->purchase_cost) . '"'; + $row[] = '"' . number_format($depreciation) . '"'; + $row[] = '"' . number_format($asset->purchase_cost - $depreciation) . '"'; + } + $rows[] = implode($row, ','); + } + + // spit out a csv + if (array_filter($rows)) { + $csv = implode($rows, "\n"); + $response = Response::make($csv, 200); + $response->header('Content-Type', 'text/csv'); + $response->header('Content-disposition', 'attachment;filename=report.csv'); + + return $response; + } else { + return Redirect::to("reports/custom") + ->with('error', Lang::get('admin/reports/message.error')); + } + } + + /** + * getImprovementsReport + * + * @return mixed + * @author Vincent Sposato + * @version v1.0 + */ + public function getAssetMaintenancesReport() + { + // Grab all the improvements + $assetMaintenances = \App\Models\AssetMaintenance::with('asset', 'supplier', 'asset.company') + ->orderBy('created_at', 'DESC') + ->get(); + + return View::make('reports/asset_maintenances', compact('assetMaintenances')); + + } + + /** + * exportImprovementsReport + * + * @return \Illuminate\Http\Response + * @author Vincent Sposato + * @version v1.0 + */ + public function exportAssetMaintenancesReport() + { + // Grab all the improvements + $assetMaintenances = AssetMaintenance::with('asset', 'supplier') + ->orderBy('created_at', 'DESC') + ->get(); + + $rows = [ ]; + + $header = [ + Lang::get('admin/asset_maintenances/table.asset_name'), + Lang::get('admin/asset_maintenances/table.supplier_name'), + Lang::get('admin/asset_maintenances/form.asset_maintenance_type'), + Lang::get('admin/asset_maintenances/form.title'), + Lang::get('admin/asset_maintenances/form.start_date'), + Lang::get('admin/asset_maintenances/form.completion_date'), + Lang::get('admin/asset_maintenances/form.asset_maintenance_time'), + Lang::get('admin/asset_maintenances/form.cost') + ]; + + $header = array_map('trim', $header); + $rows[] = implode($header, ','); + + foreach ($assetMaintenances as $assetMaintenance) { + $row = [ ]; + $row[] = str_replace(',', '', $assetMaintenance->asset->name); + $row[] = str_replace(',', '', $assetMaintenance->supplier->name); + $row[] = $assetMaintenance->improvement_type; + $row[] = $assetMaintenance->title; + $row[] = $assetMaintenance->start_date; + $row[] = $assetMaintenance->completion_date; + if (is_null($assetMaintenance->asset_maintenance_time)) { + $improvementTime = intval(Carbon::now() + ->diffInDays(Carbon::parse($assetMaintenance->start_date))); + } else { + $improvementTime = intval($assetMaintenance->asset_maintenance_time); + } + $row[] = $improvementTime; + $row[] = Lang::get('general.currency') . number_format($assetMaintenance->cost, 2); + $rows[] = implode($row, ','); + } + + // spit out a csv + $csv = implode($rows, "\n"); + $response = Response::make($csv, 200); + $response->header('Content-Type', 'text/csv'); + $response->header('Content-disposition', 'attachment;filename=report.csv'); + + return $response; + } + + /** + * getAssetAcceptanceReport + * + * @return mixed + * @author Vincent Sposato + * @version v1.0 + */ + public function getAssetAcceptanceReport() + { + $assetsForReport = Asset::notYetAccepted()->with('company')->get(); + + return View::make('reports/unaccepted_assets', compact('assetsForReport')); + } + + /** + * exportAssetAcceptanceReport + * + * @return \Illuminate\Http\Response + * @author Vincent Sposato + * @version v1.0 + */ + public function exportAssetAcceptanceReport() + { + + // Grab all the improvements + $assetsForReport = Actionlog::whereIn('id', $this->getAssetsNotAcceptedYet()) + ->get(); + + $rows = [ ]; + + $header = [ + Lang::get('general.category'), + Lang::get('admin/hardware/form.model'), + Lang::get('admin/hardware/form.name'), + Lang::get('admin/hardware/table.asset_tag'), + Lang::get('admin/hardware/table.checkoutto'), + ]; + + $header = array_map('trim', $header); + $rows[] = implode($header, ','); + + foreach ($assetsForReport as $assetItem) { + $row = [ ]; + $row[] = str_replace(',', '', $assetItem->assetlog->model->category->name); + $row[] = str_replace(',', '', $assetItem->assetlog->model->name); + $row[] = str_replace(',', '', $assetItem->assetlog->showAssetName()); + $row[] = str_replace(',', '', $assetItem->assetlog->asset_tag); + $row[] = str_replace(',', '', $assetItem->assetlog->assigneduser->fullName()); + $rows[] = implode($row, ','); + } + + // spit out a csv + $csv = implode($rows, "\n"); + $response = Response::make($csv, 200); + $response->header('Content-Type', 'text/csv'); + $response->header('Content-disposition', 'attachment;filename=report.csv'); + + return $response; + + } + + /** + * getCheckedOutAssetsRequiringAcceptance + * + * @param $modelsInCategoriesThatRequireAcceptance + * + * @return array + * @author Vincent Sposato + * @version v1.0 + */ + protected function getCheckedOutAssetsRequiringAcceptance($modelsInCategoriesThatRequireAcceptance) + { + $assets = Asset::deployed() + ->inModelList($modelsInCategoriesThatRequireAcceptance) + ->select('id') + ->get() + ->toArray(); + + return array_pluck($assets, 'id'); + } + + /** + * getModelsInCategoriesThatRequireAcceptance + * + * @param $assetCategoriesRequiringAcceptance + * + * @return array + * @author Vincent Sposato + * @version v1.0 + */ + protected function getModelsInCategoriesThatRequireAcceptance($assetCategoriesRequiringAcceptance) + { + + return array_pluck(Model::inCategory($assetCategoriesRequiringAcceptance) + ->select('id') + ->get() + ->toArray(), 'id'); + } + + /** + * getCategoriesThatRequireAcceptance + * + * @return array + * @author Vincent Sposato + * @version v1.0 + */ + protected function getCategoriesThatRequireAcceptance() + { + + return array_pluck(Category::requiresAcceptance() + ->select('id') + ->get() + ->toArray(), 'id'); + } + + /** + * getAssetsCheckedOutRequiringAcceptance + * + * @return array + * @author Vincent Sposato + * @version v1.0 + */ + protected function getAssetsCheckedOutRequiringAcceptance() + { + + return $this->getCheckedOutAssetsRequiringAcceptance( + $this->getModelsInCategoriesThatRequireAcceptance($this->getCategoriesThatRequireAcceptance()) + ); + } + + /** + * getAssetsNotAcceptedYet + * + * @return array + * @author Vincent Sposato + * @version v1.0 + */ + protected function getAssetsNotAcceptedYet() + { + return Asset::unaccepted(); + } +} diff --git a/app/Http/Controllers/SettingsController.php b/app/Http/Controllers/SettingsController.php new file mode 100755 index 0000000000..a0f468fee9 --- /dev/null +++ b/app/Http/Controllers/SettingsController.php @@ -0,0 +1,523 @@ +] + * @since [v3.0] + * @return View + */ + public function getSetupIndex() + { + + + try { + $conn = DB::select('select 2 + 2'); + $start_settings['db_conn'] = true; + $start_settings['db_name'] = DB::connection()->getDatabaseName(); + $start_settings['db_error'] = null; + } catch (\PDOException $e) { + $start_settings['db_conn'] = false; + $start_settings['db_name'] = config('database.connections.mysql.database'); + $start_settings['db_error'] = $e->getMessage(); + } + + $protocol = stripos($_SERVER['SERVER_PROTOCOL'], 'https') === true ? 'https://' : 'http://'; + + $pageURL = $protocol; + if ($_SERVER["SERVER_PORT"] != "80") { + $main_page = $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"]; + $pageURL .= $main_page.$_SERVER["REQUEST_URI"]; + } else { + $main_page = $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"]; + $pageURL .= $main_page; + } + + $start_settings['env_location'] = $pageURL.'../.env'; + + + if (config('app.url').'/setup'!=$pageURL) { + $start_settings['url_valid']= false; + } else { + $start_settings['url_valid']= true; + } + + $start_settings['url_config']= config('app.url'); + $start_settings['real_url']= $pageURL; + + $exposed_env = @file_get_contents($main_page.'/.env'); + + if ($exposed_env) { + $start_settings['env_exposed'] = true; + } else { + $start_settings['env_exposed'] = false; + } + + if (\App::Environment('production') && (config('app.debug')==true)) { + $start_settings['debug_exposed'] = true; + } else { + $start_settings['debug_exposed'] = false; + } + + $environment = app()->environment(); + if ($environment!='production') { + $start_settings['env'] = $environment; + $start_settings['prod'] = false; + } else { + $start_settings['env'] = $environment; + $start_settings['prod'] = true; + + } + + $owner = posix_getpwuid(fileowner($_SERVER["SCRIPT_FILENAME"])); + $start_settings['owner'] = $owner['name']; + + if (($start_settings['owner']=='root') || ($start_settings['owner']=='0') || ($start_settings['owner']=='root')) { + $start_settings['owner_is_admin'] = true; + } else { + $start_settings['owner_is_admin'] = false; + } + + if ((is_writable(storage_path())) + && (is_writable(storage_path().'/framework')) + && (is_writable(storage_path().'/framework/cache')) + && (is_writable(storage_path().'/framework/sessions')) + && (is_writable(storage_path().'/framework/views')) + && (is_writable(storage_path().'/logs')) + ) { + $start_settings['writable'] = true; + } else { + $start_settings['writable'] = false; + } + + + $start_settings['gd'] = extension_loaded('gd'); + return View::make('setup/index') + ->with('step', 1) + ->with('start_settings', $start_settings) + ->with('section', 'Pre-Flight Check'); + } + + /** + * Test the email configuration + * + * @author [A. Gianotto] [] + * @since [v3.0] + * @return Redirect + */ + public function ajaxTestEmail() + { + + try { + Mail::send('emails.test', [], function ($m) { + $m->to(config('mail.from.address'), config('mail.from.name')); + $m->subject('Test Email from Snipe-IT'); + }); + return 'success'; + } catch (Exception $e) { + return 'error'; + } + + } + + /** + * Save the first admin user from Setup. + * + * @author [A. Gianotto] [] + * @since [v3.0] + * @return Redirect + */ + public function postSaveFirstAdmin(SetupUserRequest $request) + { + + + $user = new \App\Models\User; + $user->first_name = $data['first_name']= e(Input::get('first_name')); + $user->last_name = e(Input::get('last_name')); + $user->email = $data['email'] = e(Input::get('email')); + $user->activated = 1; + $user->username = $data['username'] = e(Input::get('username')); + $user->password = bcrypt(Input::get('password')); + $data['password'] = Input::get('password'); + + $settings = new \App\Models\Setting; + $settings->site_name = e(Input::get('site_name')); + $settings->alert_email = e(Input::get('email')); + $settings->alerts_enabled = 1; + $settings->brand = 1; + $settings->default_currency = 'USD'; + $settings->user_id = 1; + + if ((!$user->isValid('initial')) && (!$settings->isValid('initial'))) { + return Redirect::back()->withInput()->withErrors($user->getErrors())->withErrors($settings->getErrors()); + } else { + $user->save(); + $settings->save(); + + if (Input::get('email_creds')=='1') { + Mail::send(['text' => 'emails.firstadmin'], $data, function ($m) use ($data) { + $m->to($data['email'], $data['first_name']); + $m->subject('Your Snipe-IT credentials'); + }); + } + + return redirect()->route('setup.done'); + } + + + } + + /** + * Return the admin user creation form in Setup. + * + * @author [A. Gianotto] [] + * @since [v3.0] + * @return View + */ + public function getSetupUser() + { + return View::make('setup/user') + ->with('step', 3) + ->with('section', 'Create a User'); + } + + /** + * Return the view that tells the user that the Setup is done. + * + * @author [A. Gianotto] [] + * @since [v3.0] + * @return View + */ + public function getSetupDone() + { + return View::make('setup/done') + ->with('step', 4) + ->with('section', 'Done!'); + } + + /** + * Migrate the database tables, and return the output + * to a view for Setup + * + * @author [A. Gianotto] [] + * @since [v3.0] + * @return View + */ + public function getSetupMigrate() + { + + Artisan::call('migrate', ['--force' => true]); + + $output = Artisan::output(); + return View::make('setup/migrate') + ->with('output', $output) + ->with('step', 2) + ->with('section', 'Create Database Tables'); + + } + + + /** + * Return a view that shows some of the key settings. + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @return View + */ + public function getIndex() + { + // Grab all the settings + $settings = Setting::all(); + + // Show the page + return View::make('settings/index', compact('settings')); + } + + + /** + * Return a form to allow a super admin to update settings. + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @return View + */ + public function getEdit() + { + $setting = Setting::first(); + $is_gd_installed = extension_loaded('gd'); + + return View::make('settings/edit', compact('setting'))->with('is_gd_installed', $is_gd_installed); + } + + + /** + * Validate and process settings edit form. + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @return Redirect + */ + public function postEdit(SettingRequest $request) + { + + // Check if the asset exists + if (is_null($setting = Setting::find(1))) { + // Redirect to the asset management page with error + return Redirect::to('admin')->with('error', Lang::get('admin/settings/message.update.error')); + } + + if (Input::get('clear_logo')=='1') { + $setting->logo = null; + } elseif (Input::file('logo_img')) { + if (!config('app.lock_passwords')) { + $image = Input::file('logo_img'); + $file_name = "logo.".$image->getClientOriginalExtension(); + $path = public_path('uploads/'.$file_name); + Image::make($image->getRealPath())->resize(null, 40, function ($constraint) { + $constraint->aspectRatio(); + $constraint->upsize(); + })->save($path); + $setting->logo = $file_name; + } + } + + $setting->id = '1'; + + if (config('app.lock_passwords')==false) { + $setting->site_name = e(Input::get('site_name')); + $setting->brand = e(Input::get('brand')); + $setting->custom_css = e(Input::get('custom_css')); + } + + if (Input::get('per_page')!='') { + $setting->per_page = e(Input::get('per_page')); + } else { + $setting->per_page = 200; + } + + $setting->locale = e(Input::get('locale', 'en')); + $setting->qr_code = e(Input::get('qr_code', '0')); + $setting->barcode_type = e(Input::get('barcode_type')); + $setting->load_remote = e(Input::get('load_remote', '0')); + $setting->default_currency = e(Input::get('default_currency', '$')); + $setting->qr_text = e(Input::get('qr_text')); + $setting->auto_increment_prefix = e(Input::get('auto_increment_prefix')); + $setting->auto_increment_assets = e(Input::get('auto_increment_assets', '0')); + + $setting->labels_per_page = e(Input::get('labels_per_page')); + $setting->labels_width = e(Input::get('labels_width')); + $setting->labels_height = e(Input::get('labels_height')); + $setting->labels_pmargin_left = e(Input::get('labels_pmargin_left')); + $setting->labels_pmargin_right = e(Input::get('labels_pmargin_right')); + $setting->labels_pmargin_top = e(Input::get('labels_pmargin_top')); + $setting->labels_pmargin_bottom = e(Input::get('labels_pmargin_bottom')); + $setting->labels_display_bgutter = e(Input::get('labels_display_bgutter')); + $setting->labels_display_sgutter = e(Input::get('labels_display_sgutter')); + $setting->labels_fontsize = e(Input::get('labels_fontsize')); + $setting->labels_pagewidth = e(Input::get('labels_pagewidth')); + $setting->labels_pageheight = e(Input::get('labels_pageheight')); + + if (Input::has('labels_display_name')) { + $setting->labels_display_name = 1; + } else { + $setting->labels_display_name = 0; + } + + if (Input::has('labels_display_serial')) { + $setting->labels_display_serial = 1; + } else { + $setting->labels_display_serial = 0; + } + + if (Input::has('labels_display_tag')) { + $setting->labels_display_tag = 1; + } else { + $setting->labels_display_tag = 0; + } + + $alert_email = rtrim(Input::get('alert_email'), ','); + $alert_email = trim(Input::get('alert_email')); + + $setting->alert_email = e($alert_email); + $setting->alerts_enabled = e(Input::get('alerts_enabled', '0')); + $setting->header_color = e(Input::get('header_color')); + $setting->default_eula_text = e(Input::get('default_eula_text')); + $setting->slack_endpoint = e(Input::get('slack_endpoint')); + $setting->slack_channel = e(Input::get('slack_channel')); + $setting->slack_botname = e(Input::get('slack_botname')); + $setting->ldap_enabled = Input::get('ldap_enabled', '0'); + $setting->ldap_server = Input::get('ldap_server'); + $setting->ldap_server_cert_ignore = e(Input::get('ldap_server_cert_ignore', false)); + $setting->ldap_uname = Input::get('ldap_uname'); + if (Input::has('ldap_pword')) { + $setting->ldap_pword = Crypt::encrypt(Input::get('ldap_pword')); + } + $setting->ldap_basedn = e(Input::get('ldap_basedn')); + $setting->ldap_filter = Input::get('ldap_filter'); + $setting->ldap_username_field = Input::get('ldap_username_field'); + $setting->ldap_lname_field = Input::get('ldap_lname_field'); + $setting->ldap_fname_field = Input::get('ldap_fname_field'); + $setting->ldap_auth_filter_query = Input::get('ldap_auth_filter_query'); + $setting->ldap_version = Input::get('ldap_version'); + $setting->ldap_active_flag = Input::get('ldap_active_flag'); + $setting->ldap_emp_num = Input::get('ldap_emp_num'); + $setting->ldap_email = Input::get('ldap_email'); + + // If validation fails, we'll exit the operation now. + if ($setting->save()) { + return Redirect::to("admin/settings/app")->with('success', Lang::get('admin/settings/message.update.success')); + + } else { + return Redirect::back()->withInput()->withErrors($setting->getErrors()); + } + + + // Redirect to the setting management page + return Redirect::to("admin/settings/app/edit")->with('error', Lang::get('admin/settings/message.update.error')); + + } + + + /** + * Show the listing of backups + * + * @author [A. Gianotto] [] + * @since [v1.8] + * @return View + */ + public function getBackups() + { + $path = storage_path().'/app/'.config('laravel-backup.destination.path'); + $files = array(); + + if ($handle = opendir($path)) { + + /* This is the correct way to loop over the directory. */ + while (false !== ($entry = readdir($handle))) { + clearstatcache(); + if (substr(strrchr($entry, '.'), 1)=='zip') { + $files[] = array( + 'filename' => $entry, + 'filesize' => Setting::fileSizeConvert(filesize($path.'/'.$entry)), + 'modified' => filemtime($path.'/'.$entry) + ); + } + + } + closedir($handle); + $files = array_reverse($files); + } + + + return View::make('settings/backups', compact('path', 'files')); + } + + + /** + * Process the backup. + * + * @author [A. Gianotto] [] + * @since [v1.8] + * @return Redirect + */ + + public function postBackups() + { + if (!config('app.lock_passwords')) { + Artisan::call('backup:run'); + return Redirect::to("admin/settings/backups")->with('success', Lang::get('admin/settings/message.backup.generated')); + } else { + + return Redirect::to("admin/settings/backups")->with('error', Lang::get('general.feature_disabled')); + } + + + } + + + /** + * Download the backup file + * + * @author [A. Gianotto] [] + * @since [v1.8] + * @return Redirect + */ + public function downloadFile($filename = null) + { + if (!config('app.lock_passwords')) { + $path = storage_path().'/app/'.config('laravel-backup.destination.path'); + $file = $path.'/'.$filename; + if (file_exists($file)) { + return Response::download($file); + } else { + + // Redirect to the backup page + return Redirect::route('settings/backups')->with('error', Lang::get('admin/settings/message.backup.file_not_found')); + } + } else { + // Redirect to the backup page + return Redirect::route('settings/backups')->with('error', Lang::get('general.feature_disabled')); + } + + + } + + /** + * Delete the backup file + * + * @author [A. Gianotto] [] + * @since [v1.8] + * @return View + */ + public function deleteFile($filename = null) + { + + if (!config('app.lock_passwords')) { + + $file = config('backup::path').'/'.$filename; + if (file_exists($file)) { + unlink($file); + return Redirect::route('settings/backups')->with('success', Lang::get('admin/settings/message.backup.file_deleted')); + } else { + return Redirect::route('settings/backups')->with('error', Lang::get('admin/settings/message.backup.file_not_found')); + } + } else { + return Redirect::route('settings/backups')->with('error', Lang::get('general.feature_disabled')); + } + + } +} diff --git a/app/Http/Controllers/StatuslabelsController.php b/app/Http/Controllers/StatuslabelsController.php new file mode 100755 index 0000000000..953775bfb2 --- /dev/null +++ b/app/Http/Controllers/StatuslabelsController.php @@ -0,0 +1,263 @@ +getStatuslabelType(); + $statuslabel_types = Helper::statusTypeList(); + + return View::make('statuslabels/edit', compact('statuslabel_types', 'statuslabel'))->with('use_statuslabel_type', $use_statuslabel_type); + } + + + /** + * Statuslabel create form processing. + * + * @return Redirect + */ + public function postCreate() + { + + // create a new model instance + $statuslabel = new Statuslabel(); + $statustype = Statuslabel::getStatuslabelTypesForDB(Input::get('statuslabel_types')); + + // Save the Statuslabel data + $statuslabel->name = e(Input::get('name')); + $statuslabel->user_id = Auth::user()->id; + $statuslabel->notes = e(Input::get('notes')); + $statuslabel->deployable = $statustype['deployable']; + $statuslabel->pending = $statustype['pending']; + $statuslabel->archived = $statustype['archived']; + + + // Was the asset created? + if ($statuslabel->save()) { + // Redirect to the new Statuslabel page + return Redirect::to("admin/settings/statuslabels")->with('success', Lang::get('admin/statuslabels/message.create.success')); + } + + return Redirect::back()->withInput()->withErrors($statuslabel->getErrors()); + + } + + public function store() + { + + // create a new model instance + $statuslabel = new Statuslabel(); + $statustype = Statuslabel::getStatuslabelTypesForDB(Input::get('modal-statuslabel_types')); + + // attempt validation + if ($statuslabel->validate($new)) { + + // Save the Statuslabel data + $statuslabel->name = e(Input::get('name')); + $statuslabel->user_id = Auth::user()->id; + $statuslabel->notes = ''; + $statuslabel->deployable = $statustype['deployable']; + $statuslabel->pending = $statustype['pending']; + $statuslabel->archived = $statustype['archived']; + + // Was the asset created? + if ($statuslabel->save()) { + // Redirect to the new Statuslabel page + return JsonResponse::create($statuslabel); + } else { + return JsonResponse::create(["error" => "Couldn't save Statuslabel"], 500); + } + } else { + // failure + $errors = $statuslabel->getErrors(); + return JsonResponse::create(["error" => "Failed validation: ".print_r($errors->all('
  • :message
  • '), true)], 500); + } + } + + + /** + * Statuslabel update. + * + * @param int $statuslabelId + * @return View + */ + public function getEdit($statuslabelId = null) + { + // Check if the Statuslabel exists + if (is_null($statuslabel = Statuslabel::find($statuslabelId))) { + // Redirect to the blogs management page + return Redirect::to('admin/settings/statuslabels')->with('error', Lang::get('admin/statuslabels/message.does_not_exist')); + } + + $use_statuslabel_type = $statuslabel->getStatuslabelType(); + + $statuslabel_types = array('' => Lang::get('admin/hardware/form.select_statustype')) + array('undeployable' => Lang::get('admin/hardware/general.undeployable')) + array('pending' => Lang::get('admin/hardware/general.pending')) + array('archived' => Lang::get('admin/hardware/general.archived')) + array('deployable' => Lang::get('admin/hardware/general.deployable')); + + return View::make('statuslabels/edit', compact('statuslabel', 'statuslabel_types'))->with('use_statuslabel_type', $use_statuslabel_type); + } + + + /** + * Statuslabel update form processing page. + * + * @param int $statuslabelId + * @return Redirect + */ + public function postEdit($statuslabelId = null) + { + // Check if the Statuslabel exists + if (is_null($statuslabel = Statuslabel::find($statuslabelId))) { + // Redirect to the blogs management page + return Redirect::to('admin/settings/statuslabels')->with('error', Lang::get('admin/statuslabels/message.does_not_exist')); + } + + + // Update the Statuslabel data + $statustype = Statuslabel::getStatuslabelTypesForDB(Input::get('statuslabel_types')); + $statuslabel->name = e(Input::get('name')); + $statuslabel->notes = e(Input::get('notes')); + $statuslabel->deployable = $statustype['deployable']; + $statuslabel->pending = $statustype['pending']; + $statuslabel->archived = $statustype['archived']; + + + // Was the asset created? + if ($statuslabel->save()) { + // Redirect to the saved Statuslabel page + return Redirect::to("admin/settings/statuslabels/")->with('success', Lang::get('admin/statuslabels/message.update.success')); + } else { + return Redirect::back()->withInput()->withErrors($statuslabel->getErrors()); + } + + + // Redirect to the Statuslabel management page + return Redirect::to("admin/settings/statuslabels/$statuslabelId/edit")->with('error', Lang::get('admin/statuslabels/message.update.error')); + + } + + /** + * Delete the given Statuslabel. + * + * @param int $statuslabelId + * @return Redirect + */ + public function getDelete($statuslabelId) + { + // Check if the Statuslabel exists + if (is_null($statuslabel = Statuslabel::find($statuslabelId))) { + // Redirect to the blogs management page + return Redirect::to('admin/settings/statuslabels')->with('error', Lang::get('admin/statuslabels/message.not_found')); + } + + + if ($statuslabel->has_assets() > 0) { + + // Redirect to the asset management page + return Redirect::to('admin/settings/statuslabels')->with('error', Lang::get('admin/statuslabels/message.assoc_users')); + } else { + + $statuslabel->delete(); + + // Redirect to the statuslabels management page + return Redirect::to('admin/settings/statuslabels')->with('success', Lang::get('admin/statuslabels/message.delete.success')); + } + + + + } + + + public function getDatatable() + { + $statuslabels = Statuslabel::select(array('id','name','deployable','pending','archived')) + ->whereNull('deleted_at'); + + if (Input::has('search')) { + $statuslabels = $statuslabels->TextSearch(e(Input::get('search'))); + } + + if (Input::has('offset')) { + $offset = e(Input::get('offset')); + } else { + $offset = 0; + } + + if (Input::has('limit')) { + $limit = e(Input::get('limit')); + } else { + $limit = 50; + } + + $allowed_columns = ['id','name']; + $order = Input::get('order') === 'asc' ? 'asc' : 'desc'; + $sort = in_array(Input::get('sort'), $allowed_columns) ? Input::get('sort') : 'created_at'; + + $statuslabels->orderBy($sort, $order); + + $statuslabelsCount = $statuslabels->count(); + $statuslabels = $statuslabels->skip($offset)->take($limit)->get(); + + $rows = array(); + + foreach ($statuslabels as $statuslabel) { + + if ($statuslabel->deployable == 1) { + $label_type = Lang::get('admin/statuslabels/table.deployable'); + } elseif ($statuslabel->pending == 1) { + $label_type = Lang::get('admin/statuslabels/table.pending'); + } elseif ($statuslabel->archived == 1) { + $label_type = Lang::get('admin/statuslabels/table.archived'); + } else { + $label_type = Lang::get('admin/statuslabels/table.undeployable'); + } + + $actions = ''; + + $rows[] = array( + 'id' => $statuslabel->id, + 'type' => $label_type, + 'name' => e($statuslabel->name), + 'actions' => $actions + ); + } + + $data = array('total' => $statuslabelsCount, 'rows' => $rows); + + return $data; + + } +} diff --git a/app/Http/Controllers/SuppliersController.php b/app/Http/Controllers/SuppliersController.php new file mode 100755 index 0000000000..c286913ac2 --- /dev/null +++ b/app/Http/Controllers/SuppliersController.php @@ -0,0 +1,290 @@ +get(); + + // Show the page + return View::make('suppliers/index', compact('suppliers')); + } + + + /** + * Supplier create. + * + * @return View + */ + public function getCreate() + { + return View::make('suppliers/edit')->with('supplier', new Supplier); + } + + + /** + * Supplier create form processing. + * + * @return Redirect + */ + public function postCreate() + { + + // get the POST data + $new = Input::all(); + + // Create a new supplier + $supplier = new Supplier; + // Save the location data + $supplier->name = e(Input::get('name')); + $supplier->address = e(Input::get('address')); + $supplier->address2 = e(Input::get('address2')); + $supplier->city = e(Input::get('city')); + $supplier->state = e(Input::get('state')); + $supplier->country = e(Input::get('country')); + $supplier->zip = e(Input::get('zip')); + $supplier->contact = e(Input::get('contact')); + $supplier->phone = e(Input::get('phone')); + $supplier->fax = e(Input::get('fax')); + $supplier->email = e(Input::get('email')); + $supplier->notes = e(Input::get('notes')); + $supplier->url = $supplier->addhttp(e(Input::get('url'))); + $supplier->user_id = Auth::user()->id; + + + + + if (Input::file('image')) { + $image = Input::file('image'); + $file_name = str_random(25).".".$image->getClientOriginalExtension(); + $path = public_path('uploads/suppliers/'.$file_name); + Image::make($image->getRealPath())->resize(300, null, function ($constraint) { + $constraint->aspectRatio(); + $constraint->upsize(); + })->save($path); + $supplier->image = $file_name; + } + + // Was it created? + if ($supplier->save()) { + // Redirect to the new supplier page + return Redirect::to("admin/settings/suppliers")->with('success', Lang::get('admin/suppliers/message.create.success')); + } + + + return Redirect::back()->withInput()->withErrors($supplier->getErrors()); + + } + + public function store() + { + $supplier=new Supplier; + $supplier->name=$new['name']; + $supplier->user_id = Auth::user()->id; + + if ($supplier->save()) { + return JsonResponse::create($supplier); + } + return JsonResponse::create(["error" => "Failed validation: ".print_r($supplier->getErrors(), true)], 500); + return JsonResponse::create(["error" => "Couldn't save Supplier"]); + } + + /** + * Supplier update. + * + * @param int $supplierId + * @return View + */ + public function getEdit($supplierId = null) + { + // Check if the supplier exists + if (is_null($supplier = Supplier::find($supplierId))) { + // Redirect to the supplier page + return Redirect::to('admin/settings/suppliers')->with('error', Lang::get('admin/suppliers/message.does_not_exist')); + } + + // Show the page + return View::make('suppliers/edit', compact('supplier')); + } + + + /** + * Supplier update form processing page. + * + * @param int $supplierId + * @return Redirect + */ + public function postEdit($supplierId = null) + { + // Check if the supplier exists + if (is_null($supplier = Supplier::find($supplierId))) { + // Redirect to the supplier page + return Redirect::to('admin/settings/suppliers')->with('error', Lang::get('admin/suppliers/message.does_not_exist')); + } + + // Save the data + $supplier->name = e(Input::get('name')); + $supplier->address = e(Input::get('address')); + $supplier->address2 = e(Input::get('address2')); + $supplier->city = e(Input::get('city')); + $supplier->state = e(Input::get('state')); + $supplier->country = e(Input::get('country')); + $supplier->zip = e(Input::get('zip')); + $supplier->contact = e(Input::get('contact')); + $supplier->phone = e(Input::get('phone')); + $supplier->fax = e(Input::get('fax')); + $supplier->email = e(Input::get('email')); + $supplier->url = $supplier->addhttp(e(Input::get('url'))); + $supplier->notes = e(Input::get('notes')); + + if (Input::file('image')) { + $image = Input::file('image'); + $file_name = str_random(25).".".$image->getClientOriginalExtension(); + $path = public_path('uploads/suppliers/'.$file_name); + Image::make($image->getRealPath())->resize(300, null, function ($constraint) { + $constraint->aspectRatio(); + $constraint->upsize(); + })->save($path); + $supplier->image = $file_name; + } + + if (Input::get('image_delete') == 1 && Input::file('image') == "") { + $supplier->image = null; + } + + if ($supplier->save()) { + return Redirect::to("admin/settings/suppliers")->with('success', Lang::get('admin/suppliers/message.update.success')); + } + + return Redirect::back()->withInput()->withErrors($supplier->getErrors()); + + } + + /** + * Delete the given supplier. + * + * @param int $supplierId + * @return Redirect + */ + public function getDelete($supplierId) + { + // Check if the supplier exists + if (is_null($supplier = Supplier::find($supplierId))) { + // Redirect to the suppliers page + return Redirect::to('admin/settings/suppliers')->with('error', Lang::get('admin/suppliers/message.not_found')); + } + + if ($supplier->num_assets() > 0) { + + // Redirect to the asset management page + return Redirect::to('admin/settings/suppliers')->with('error', Lang::get('admin/suppliers/message.assoc_users')); + } else { + + // Delete the supplier + $supplier->delete(); + + // Redirect to the suppliers management page + return Redirect::to('admin/settings/suppliers')->with('success', Lang::get('admin/suppliers/message.delete.success')); + } + + } + + + /** + * Get the asset information to present to the supplier view page + * + * @param int $assetId + * @return View + **/ + public function getView($supplierId = null) + { + $supplier = Supplier::find($supplierId); + + if (isset($supplier->id)) { + return View::make('suppliers/view', compact('supplier')); + } else { + // Prepare the error message + $error = Lang::get('admin/suppliers/message.does_not_exist', compact('id')); + + // Redirect to the user management page + return Redirect::route('suppliers')->with('error', $error); + } + + + } + + public function getDatatable() + { + $suppliers = Supplier::select(array('id','name','address','address2','city','state','country','fax', 'phone','email','contact')) + ->whereNull('deleted_at'); + + if (Input::has('search')) { + $suppliers = $suppliers->TextSearch(e(Input::get('search'))); + } + + if (Input::has('offset')) { + $offset = e(Input::get('offset')); + } else { + $offset = 0; + } + + if (Input::has('limit')) { + $limit = e(Input::get('limit')); + } else { + $limit = 50; + } + + $allowed_columns = ['id','name','address','phone','contact','fax','email']; + $order = Input::get('order') === 'asc' ? 'asc' : 'desc'; + $sort = in_array(Input::get('sort'), $allowed_columns) ? Input::get('sort') : 'created_at'; + + $suppliers->orderBy($sort, $order); + + $suppliersCount = $suppliers->count(); + $suppliers = $suppliers->skip($offset)->take($limit)->get(); + + $rows = array(); + + foreach ($suppliers as $supplier) { + $actions = ''; + + $rows[] = array( + 'id' => $supplier->id, + 'name' => (string)link_to('admin/settings/suppliers/'.$supplier->id.'/view', $supplier->name), + 'contact' => $supplier->contact, + 'address' => $supplier->address.' '.$supplier->address2.' '.$supplier->city.' '.$supplier->state.' '.$supplier->country, + 'phone' => $supplier->phone, + 'fax' => $supplier->fax, + 'email' => ($supplier->email!='') ? ''.$supplier->email.'' : '', + 'assets' => $supplier->num_assets(), + 'licenses' => $supplier->num_licenses(), + 'actions' => $actions + ); + } + + $data = array('total' => $suppliersCount, 'rows' => $rows); + + return $data; + + } +} diff --git a/app/Http/Controllers/UsersController.php b/app/Http/Controllers/UsersController.php new file mode 100755 index 0000000000..76df15485e --- /dev/null +++ b/app/Http/Controllers/UsersController.php @@ -0,0 +1,1238 @@ +] + * @see UsersController::getDatatable() method that generates the JSON response + * @since [v1.0] + * @return View + */ + public function getIndex() + { + return View::make('users/index'); + } + + /** + * Returns a view that displays the user creation form. + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @return View + */ + public function getCreate() + { + + // Selected groups + $userGroups = Input::old('groups', array()); + + // Get all the available permissions + $permissions = config('permissions'); + + // Selected permissions + $userPermissions = Input::old('permissions', array('superuser' => -1)); + $location_list = Helper::locationsList(); + $manager_list = Helper::managerList(); + $company_list = Helper::companyList(); + + /* echo '
    ';
    +          print_r($userPermissions);
    +          echo '
    '; + exit; + */ + + // Show the page + return View::make('users/edit', compact('groups', 'userGroups', 'permissions', 'userPermissions')) + ->with('location_list', $location_list) + ->with('manager_list', $manager_list) + ->with('company_list', $company_list) + ->with('user', new User); + } + + /** + * Validate and store the new user data, or return an error. + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @return Redirect + */ + public function postCreate(SetupUserRequest $request) + { + + $user = new \App\Models\User; + $user->first_name = $data['first_name']= e(Input::get('first_name')); + $user->last_name = e(Input::get('last_name')); + $user->email = $data['email'] = e(Input::get('email')); + $user->activated = 1; + $user->locale = Input::get('locale'); + $user->username = $data['username'] = e(Input::get('username')); + $user->password = bcrypt(Input::get('password')); + $data['password'] = Input::get('password'); + + if ($user->save()) { + if ((Input::get('email_user') == 1) && (Input::has('email'))) { + // Send the credentials through email + $data = array(); + $data['email'] = e(Input::get('email')); + $data['username'] = e(Input::get('username')); + $data['first_name'] = e(Input::get('first_name')); + $data['password'] = e(Input::get('password')); + + Mail::send('emails.send-login', $data, function ($m) use ($user) { + $m->to($user->email, $user->first_name . ' ' . $user->last_name); + $m->subject('Welcome ' . $user->first_name); + }); + } + return redirect::route('users')->with('success', trans('admin/users/message.success.create')); + } else { + Redirect::back()->withInput()->withInput()->withErrors($user->getErrors())->withErrors($settings->getErrors()); + } + + return Redirect::route('create/user')->withInput()->with('error', $error); + } + + /** + * JSON handler for creating a user through a modal + * + * @author [A. Gianotto] [] + * @since [v1.8] + * @return string JSON + */ + public function store() + { + $user = new User; + + $inputs = Input::except('csrf_token', 'password_confirm', 'groups', 'email_user'); + $inputs['activated'] = true; + + // Was the user created? + if ($user->save()) { + + if (Input::get('email_user') == 1) { + // Send the credentials through email + $data = array(); + $data['email'] = e(Input::get('email')); + $data['first_name'] = e(Input::get('first_name')); + $data['password'] = e(Input::get('password')); + + Mail::send('emails.send-login', $data, function ($m) use ($user) { + $m->to($user->email, $user->first_name . ' ' . $user->last_name); + $m->subject('Welcome ' . $user->first_name); + }); + } + + return JsonResponse::create($user); + + } else { + return JsonResponse::create(["error" => "Failed validation: " . print_r($user->getErrors(), true)], 500); + } + return JsonResponse::create(["error" => "Couldn't save User"], 500); + + + + } + + /** + * Returns a view that displays the edit user form + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @param int $id + * @return View + */ + public function getEdit($id = null) + { + try { + // Get the user information + $user = User::find($id); + + if (!Company::isCurrentUserHasAccess($user)) { + return Redirect::route('users')->with('error', Lang::get('general.insufficient_permissions')); + } + + // Get this user groups + //$userGroups = $user->groups()->lists('group_id', 'name'); + $userGroups = null; + + // Get this user permissions + $userPermissions = null; + //$this->encodePermissions($userPermissions); + + // Get a list of all the available groups + //$groups = Sentry::getGroupProvider()->findAll(); + + // Get all the available permissions + $permissions = config('permissions'); + //$this->encodeAllPermissions($permissions); + + $location_list = Helper::locationsList(); + $company_list = Helper::companyList(); + $manager_list = array('' => 'Select a User') + DB::table('users') + ->select(DB::raw('concat(last_name,", ",first_name," (",email,")") as full_name, id')) + ->whereNull('deleted_at') + ->where('id', '!=', $id) + ->orderBy('last_name', 'asc') + ->orderBy('first_name', 'asc') + ->lists('full_name', 'id'); + } catch (UserNotFoundException $e) { + // Prepare the error message + $error = Lang::get('admin/users/message.user_not_found', compact('id')); + + // Redirect to the user management page + return Redirect::route('users')->with('error', $error); + } + + // Show the page + return View::make('users/edit', compact('user', 'groups', 'userGroups', 'permissions', 'userPermissions')) + ->with('location_list', $location_list) + ->with('company_list', $company_list) + ->with('manager_list', $manager_list); + } + + /** + * Validate and save edited user data from edit form. + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @param int $id + * @return Redirect + */ + public function postEdit($id = null) + { + // We need to reverse the UI specific logic for our + // permissions here before we update the user. + $permissions = Input::get('permissions', array()); + //$this->decodePermissions($permissions); + app('request')->request->set('permissions', $permissions); + + // Only update the email address if locking is set to false + if (config('app.lock_passwords')) { + return Redirect::route('users')->with('error', 'Denied! You cannot update user information on the demo.'); + } + + try { + // Get the user information + $user = User::find($id); + + if (!Company::isCurrentUserHasAccess($user)) { + return Redirect::route('users')->with('error', Lang::get('general.insufficient_permissions')); + } + } catch (UserNotFoundException $e) { + // Prepare the error message + $error = Lang::get('admin/users/message.user_not_found', compact('id')); + + // Redirect to the user management page + return Redirect::route('users')->with('error', $error); + } + + + // Update the user + $user->first_name = Input::get('first_name'); + $user->last_name = Input::get('last_name'); + $user->locale = Input::get('locale'); + $user->username = Input::get('username'); + $user->email = Input::get('email'); + $user->employee_num = Input::get('employee_num'); + $user->activated = Input::get('activated', $user->activated); + $user->jobtitle = Input::get('jobtitle'); + $user->phone = Input::get('phone'); + $user->location_id = Input::get('location_id'); + $user->company_id = Company::getIdForUser(Input::get('company_id')); + $user->manager_id = Input::get('manager_id'); + $user->notes = Input::get('notes'); + + if ($user->manager_id == "") { + $user->manager_id = null; + } + + if ($user->location_id == "") { + $user->location_id = null; + } + + + // Do we want to update the user password? + if ((Input::has('password')) && (!config('app.lock_passwords'))) { + $user->password = $password; + } + + // Do we want to update the user email? + if (!config('app.lock_passwords')) { + $user->email = Input::get('email'); + } + + + if (!config('app.lock_passwords')) { + + } + + // Was the user updated? + if ($user->save()) { + // Prepare the success message + $success = Lang::get('admin/users/message.success.update'); + + // Redirect to the user page + return Redirect::route('users')->with('success', $success); + } + + return Redirect::back()->withInput()->withErrors($user->getErrors()); + + } + + /** + * Delete a user + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @param int $id + * @return Redirect + */ + public function getDelete($id = null) + { + try { + // Get user information + $user = User::find($id); + + // Check if we are not trying to delete ourselves + if ($user->id === Auth::user()->id) { + // Prepare the error message + $error = Lang::get('admin/users/message.error.delete'); + + // Redirect to the user management page + return Redirect::route('users')->with('error', $error); + } + + + // Do we have permission to delete this user? + if ((!Auth::user()->isSuperUser()) || (config('app.lock_passwords'))) { + // Redirect to the user management page + return Redirect::route('users')->with('error', 'Insufficient permissions!'); + } + + if (count($user->assets) > 0) { + + // Redirect to the user management page + return Redirect::route('users')->with('error', 'This user still has ' . count($user->assets) . ' assets associated with them.'); + } + + if (count($user->licenses) > 0) { + + // Redirect to the user management page + return Redirect::route('users')->with('error', 'This user still has ' . count($user->licenses) . ' licenses associated with them.'); + } + + // Delete the user + $user->delete(); + + // Prepare the success message + $success = Lang::get('admin/users/message.success.delete'); + + // Redirect to the user management page + return Redirect::route('users')->with('success', $success); + } catch (UserNotFoundException $e) { + // Prepare the error message + $error = Lang::get('admin/users/message.user_not_found', compact('id')); + + // Redirect to the user management page + return Redirect::route('users')->with('error', $error); + } + } + + /** + * Returns a view that confirms the user's a bulk delete will be applied to. + * + * @author [A. Gianotto] [] + * @since [v1.7] + * @return View + */ + public function postBulkEdit() + { + + if ((!Input::has('edit_user')) || (count(Input::has('edit_user')) == 0)) { + return Redirect::back()->with('error', 'No users selected'); + } else { + $statuslabel_list = Helper::statusLabelList(); + $user_raw_array = array_keys(Input::get('edit_user')); + + $users = User::whereIn('id', $user_raw_array)->with('groups'); + $users = Company::scopeCompanyables($users)->get(); + + return View::make('users/confirm-bulk-delete', compact('users', 'statuslabel_list')); + } + } + + /** + * Soft-delete bulk users + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @return Redirect + */ + public function postBulkSave() + { + + if ((!Input::has('edit_user')) || (count(Input::has('edit_user')) == 0)) { + return Redirect::back()->with('error', 'No users selected'); + } elseif ((!Input::has('status_id')) || (count(Input::has('status_id')) == 0)) { + return Redirect::route('users')->with('error', 'No status selected'); + } else { + + $user_raw_array = Input::get('edit_user'); + $asset_array = array(); + + if (($key = array_search(Auth::user()->id, $user_raw_array)) !== false) { + unset($user_raw_array[$key]); + } + + if (!Auth::user()->isSuperUser()) { + return Redirect::route('users')->with('error', Lang::get('admin/users/message.insufficient_permissions')); + } + + if (!config('app.lock_passwords')) { + + $assets = Asset::whereIn('assigned_to', $user_raw_array)->get(); + $accessories = DB::table('accessories_users')->whereIn('assigned_to', $user_raw_array)->get(); + + $users = User::whereIn('id', $user_raw_array); + $users = Company::scopeCompanyables($users)->delete(); + + foreach ($assets as $asset) { + + $asset_array[] = $asset->id; + + // Update the asset log + $logaction = new Actionlog(); + $logaction->asset_id = $asset->id; + $logaction->checkedout_to = $asset->assigned_to; + $logaction->asset_type = 'hardware'; + $logaction->user_id = Auth::user()->id; + $logaction->note = 'Bulk checkin'; + $log = $logaction->logaction('checkin from'); + + $update_assets = Asset::whereIn('id', $asset_array)->update( + array( + 'status_id' => e(Input::get('status_id')), + 'assigned_to' => null, + ) + ); + } + + foreach ($accessories as $accessory) { + $accessory_array[] = $accessory->id; + // Update the asset log + $logaction = new Actionlog(); + $logaction->accessory_id = $accessory->id; + $logaction->checkedout_to = $accessory->assigned_to; + $logaction->asset_type = 'accessory'; + $logaction->user_id = Auth::user()->id; + $logaction->note = 'Bulk checkin'; + $log = $logaction->logaction('checkin from'); + + $update_accessories = DB::table('accessories_users')->whereIn('id', $accessory_array)->update( + array( + 'assigned_to' => null, + ) + ); + } + + + return Redirect::route('users')->with('success', 'Your selected users have been deleted and their assets have been updated.'); + } else { + return Redirect::route('users')->with('error', 'Bulk delete is not enabled in this installation'); + } + + /** @noinspection PhpUnreachableStatementInspection Known to be unreachable but kept following discussion: https://github.com/snipe/snipe-it/pull/1423 */ + return Redirect::route('users')->with('error', 'An error has occurred'); + } + } + + /** + * Restore a deleted user + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @param int $id + * @return Redirect + */ + public function getRestore($id = null) + { + try { + // Get user information + //$user = Sentry::getUserProvider()->createModel()->withTrashed()->find($id); + + if (!Company::isCurrentUserHasAccess($user)) { + return Redirect::route('users')->with('error', Lang::get('general.insufficient_permissions')); + } else { + // Restore the user + $user->restore(); + + // Prepare the success message + $success = Lang::get('admin/users/message.success.restored'); + + // Redirect to the user management page + return Redirect::route('users')->with('success', $success); + } + } catch (UserNotFoundException $e) { + // Prepare the error message + $error = Lang::get('admin/users/message.user_not_found', compact('id')); + + // Redirect to the user management page + return Redirect::route('users')->with('error', $error); + } + } + + + /** + * Return a view with user detail + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @param int $userId + * @return View + */ + public function getView($userId = null) + { + + $user = User::with('assets', 'assets.model', 'consumables', 'accessories', 'licenses', 'userloc')->withTrashed()->find($userId); + + $userlog = $user->userlog->load('assetlog', 'consumablelog', 'assetlog.model', 'licenselog', 'accessorylog', 'userlog', 'adminlog'); + + if (isset($user->id)) { + + if (!Company::isCurrentUserHasAccess($user)) { + return Redirect::route('users')->with('error', Lang::get('general.insufficient_permissions')); + } else { + return View::make('users/view', compact('user', 'userlog')); + } + } else { + // Prepare the error message + $error = Lang::get('admin/users/message.user_not_found', compact('id')); + + // Redirect to the user management page + return Redirect::route('users')->with('error', $error); + } + } + + /** + * Unsuspend a user. + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @param int $id + * @return Redirect + */ + public function getUnsuspend($id = null) + { + try { + // Get user information + //$user = User::find($id); + + // Check if we are not trying to unsuspend ourselves + if ($user->id === Auth::user()->id) { + // Prepare the error message + $error = Lang::get('admin/users/message.error.unsuspend'); + + // Redirect to the user management page + return Redirect::route('users')->with('error', $error); + } + + // Do we have permission to unsuspend this user? + if ($user->isSuperUser() and ! Auth::user()->isSuperUser()) { + // Redirect to the user management page + return Redirect::route('users')->with('error', 'Insufficient permissions!'); + } + + // Prepare the success message + $success = Lang::get('admin/users/message.success.unsuspend'); + + // Redirect to the user management page + return Redirect::route('users')->with('success', $success); + } catch (UserNotFoundException $e) { + // Prepare the error message + $error = Lang::get('admin/users/message.user_not_found', compact('id')); + + // Redirect to the user management page + return Redirect::route('users')->with('error', $error); + } + } + + + /** + * Return a view containing a pre-populated new user form, + * populated with some fields from an existing user. + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @param int $id + * @return Redirect + */ + public function getClone($id = null) + { + // We need to reverse the UI specific logic for our + // permissions here before we update the user. + $permissions = Input::get('permissions', array()); + //$this->decodePermissions($permissions); + app('request')->request->set('permissions', $permissions); + + + try { + // Get the user information + $user_to_clone = User::find($id); + $user = clone $user_to_clone; + $user->first_name = ''; + $user->last_name = ''; + $user->email = substr($user->email, ($pos = strpos($user->email, '@')) !== false ? $pos : 0); + ; + $user->id = null; + + // Get this user groups + $userGroups = $user_to_clone->groups()->lists('group_id', 'name'); + + // Get this user permissions + $userPermissions = null; + //$this->encodePermissions($userPermissions); + + // Get a list of all the available groups + //$groups = Sentry::getGroupProvider()->findAll(); + + // Get all the available permissions + $permissions = config('permissions'); + //$this->encodeAllPermissions($permissions); + + $location_list = Helper::locationsList(); + $company_list = Helper::companyList(); + $manager_list = array('' => 'Select a User') + DB::table('users') + ->select(DB::raw('concat(last_name,", ",first_name," (",email,")") as full_name, id')) + ->whereNull('deleted_at') + ->where('id', '!=', $id) + ->orderBy('last_name', 'asc') + ->orderBy('first_name', 'asc') + ->lists('full_name', 'id'); + + // Show the page + return View::make('users/edit', compact('groups', 'userGroups', 'permissions', 'userPermissions')) + ->with('location_list', $location_list) + ->with('company_list', $company_list) + ->with('manager_list', $manager_list) + ->with('user', $user) + ->with('clone_user', $user_to_clone); + } catch (UserNotFoundException $e) { + // Prepare the error message + $error = Lang::get('admin/users/message.user_not_found', compact('id')); + + // Redirect to the user management page + return Redirect::route('users')->with('error', $error); + } + } + + /** + * Return user import view + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @return View + */ + public function getImport() + { + // Get all the available groups + //$groups = Sentry::getGroupProvider()->findAll(); + // Selected groups + $selectedGroups = Input::old('groups', array()); + // Get all the available permissions + $permissions = config('permissions'); + //$this->encodeAllPermissions($permissions); + // Selected permissions + $selectedPermissions = Input::old('permissions', array('superuser' => -1)); + //$this->encodePermissions($selectedPermissions); + // Show the page + return View::make('users/import', compact('groups', 'selectedGroups', 'permissions', 'selectedPermissions')); + } + + /** + * Handle user import file + * + * @author [A. Gianotto] [] + * @since [v1.0] + * @return Redirect + */ + public function postImport() + { + + if (!ini_get("auto_detect_line_endings")) { + ini_set("auto_detect_line_endings", '1'); + } + + $csv = Reader::createFromPath(Input::file('user_import_csv')); + $csv->setNewline("\r\n"); + + if (Input::get('has_headers') == 1) { + $csv->setOffset(1); + } + + $duplicates = ''; + + $nbInsert = $csv->each(function ($row) use ($duplicates) { + + if (array_key_exists(2, $row)) { + + if (Input::get('activate') == 1) { + $activated = '1'; + } else { + $activated = '0'; + } + + $pass = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 15); + + // Location + if (array_key_exists('4', $row)) { + $user_location_id = trim($row[4]); + if ($user_location_id=='') { + $user_location_id = null; + } + } + + + + try { + // Check if this email already exists in the system + $user = DB::table('users')->where('username', $row[2])->first(); + if ($user) { + $duplicates .= $row[2] . ', '; + } else { + + $newuser = array( + 'first_name' => trim(e($row[0])), + 'last_name' => trim(e($row[1])), + 'username' => trim(e($row[2])), + 'email' => trim(e($row[3])), + 'password' => $pass, + 'activated' => $activated, + 'location_id' => trim(e($user_location_id)), + 'phone' => trim(e($row[5])), + 'jobtitle' => trim(e($row[6])), + 'employee_num' => trim(e($row[7])), + //'company_id' => Company::getIdForUser($row[8]), + 'permissions' => '{"user":1}', + 'notes' => 'Imported user' + ); + + DB::table('users')->insert($newuser); + + $updateuser = User::find($row[2]); + + // Update the user details + $updateuser->password = $pass; + + // Update the user + $updateuser->save(); + + + if (((Input::get('email_user') == 1) && !config('app.lock_passwords'))) { + // Send the credentials through email + if ($row[3] != '') { + $data = array(); + $data['username'] = trim(e($row[2])); + $data['first_name'] = trim(e($row[0])); + $data['password'] = $pass; + + if ($newuser['email']) { + Mail::send('emails.send-login', $data, function ($m) use ($newuser) { + $m->to($newuser['email'], $newuser['first_name'] . ' ' . $newuser['last_name']); + $m->subject('Welcome ' . $newuser['first_name']); + }); + } + } + } + } + } catch (Exception $e) { + echo 'Caught exception: ', $e->getMessage(), "\n"; + } + return true; + } + }); + + + return Redirect::route('users')->with('duplicates', $duplicates)->with('success', 'Success'); + } + + /** + * Return JSON response with a list of user details for the getIndex() view. + * + * @author [A. Gianotto] [] + * @since [v1.6] + * @see UsersController::getIndex() method that consumed this JSON response + * @return string JSON + */ + public function getDatatable($status = null) + { + + if (Input::has('offset')) { + $offset = e(Input::get('offset')); + } else { + $offset = 0; + } + + if (Input::has('limit')) { + $limit = e(Input::get('limit')); + } else { + $limit = 50; + } + + if (Input::get('sort')=='name') { + $sort = 'first_name'; + } else { + $sort = e(Input::get('sort')); + } + + $users = User::select(array('users.id','users.employee_num','users.email','users.username','users.location_id','users.manager_id','users.first_name','users.last_name','users.created_at','users.notes','users.company_id', 'users.deleted_at','users.activated')) + ->with('assets', 'accessories', 'consumables', 'licenses', 'manager', 'groups', 'userloc', 'company'); + $users = Company::scopeCompanyables($users); + + switch ($status) { + case 'deleted': + $users = $users->withTrashed()->Deleted(); + break; + } + + if (Input::has('search')) { + $users = $users->TextSearch(Input::get('search')); + } + + $order = Input::get('order') === 'asc' ? 'asc' : 'desc'; + + switch (Input::get('sort')) { + case 'manager': + $users = $users->OrderManager($order); + break; + case 'location': + $users = $users->OrderLocation($order); + break; + default: + $allowed_columns = + [ + 'last_name','first_name','email','username','employee_num', + 'assets','accessories', 'consumables','licenses','groups','activated' + ]; + + $sort = in_array($sort, $allowed_columns) ? $sort : 'first_name'; + $users = $users->orderBy($sort, $order); + break; + } + + $userCount = $users->count(); + $users = $users->skip($offset)->take($limit)->get(); + $rows = array(); + + foreach ($users as $user) { + $group_names = ''; + $inout = ''; + $actions = ''; + + foreach ($user->groups as $group) { + $group_names .= '' . $group->name . ' '; + } + + + if (!is_null($user->deleted_at)) { + + $actions .= ' '; + } else { + + if ($user->accountStatus() == 'suspended') { + $actions .= ' '; + } + + $actions .= ' '; + + if ((Auth::user()->id !== $user->id) && (!config('app.lock_passwords'))) { + $actions .= ' '; + } else { + $actions .= ' '; + } + } + $actions .= ''; + + $rows[] = array( + 'id' => $user->id, + 'checkbox' =>'', + 'name' => ''.$user->fullName().'', + 'email' => ($user->email!='') ? + '' + .'' + .'' : '', + 'username' => $user->username, + 'location' => ($user->userloc) ? $user->userloc->name : '', + 'manager' => ($user->manager) ? '' . $user->manager->fullName() . '' : '', + 'assets' => $user->assets->count(), + 'employee_num' => $user->employee_num, + 'licenses' => $user->licenses->count(), + 'accessories' => $user->accessories->count(), + 'consumables' => $user->consumables->count(), + 'groups' => $group_names, + 'notes' => $user->notes, + 'activated' => ($user->activated=='1') ? '' : '', + 'actions' => ($actions) ? $actions : '', + 'companyName' => is_null($user->company) ? '' : e($user->company->name) + ); + } + + $data = array('total'=>$userCount, 'rows'=>$rows); + return $data; + } + + /** + * Return JSON response with a list of user details for the getIndex() view. + * + * @author [A. Gianotto] [] + * @since [v1.6] + * @param int $userId + * @return string JSON + */ + public function postUpload(AssetFileRequest $request, $userId = null) + { + + + $user = User::find($userId); + $destinationPath = storage_path() . '/app/private_uploads/users'; + + if (isset($user->id)) { + + if (!Company::isCurrentUserHasAccess($user)) { + return Redirect::route('users')->with('error', Lang::get('general.insufficient_permissions')); + } + + foreach (Input::file('file') as $file) { + + $extension = $file->getClientOriginalExtension(); + $filename = 'user-' . $user->id . '-' . str_random(8); + $filename .= '-' . str_slug($file->getClientOriginalName()) . '.' . $extension; + $upload_success = $file->move($destinationPath, $filename); + + //Log the deletion of seats to the log + $logaction = new Actionlog(); + $logaction->asset_id = $user->id; + $logaction->asset_type = 'user'; + $logaction->user_id = Auth::user()->id; + $logaction->note = e(Input::get('notes')); + $logaction->checkedout_to = null; + $logaction->created_at = date("Y-m-d h:i:s"); + $logaction->filename = $filename; + $logaction->action_type = 'uploaded'; + $logaction->save(); + + } + return JsonResponse::create($logaction); + + } else { + return JsonResponse::create(["error" => "Failed validation: ".print_r($logaction->getErrors(), true)], 500); + } + } + + + /** + * Delete file + * + * @author [A. Gianotto] [] + * @since [v1.6] + * @param int $userId + * @param int $fileId + * @return Redirect + */ + public function getDeleteFile($userId = null, $fileId = null) + { + $user = User::find($userId); + $destinationPath = app_path() . '/private_uploads'; + + // the license is valid + if (isset($user->id)) { + + if (!Company::isCurrentUserHasAccess($user)) { + return Redirect::route('users')->with('error', Lang::get('general.insufficient_permissions')); + } else { + $log = Actionlog::find($fileId); + $full_filename = $destinationPath . '/' . $log->filename; + if (file_exists($full_filename)) { + unlink($destinationPath . '/' . $log->filename); + } + $log->delete(); + return Redirect::back()->with('success', Lang::get('admin/users/message.deletefile.success')); + } + } else { + // Prepare the error message + $error = Lang::get('admin/users/message.does_not_exist', compact('id')); + + // Redirect to the licence management page + return Redirect::route('users')->with('error', $error); + } + } + + /** + * Display/download the uploaded file + * + * @author [A. Gianotto] [] + * @since [v1.6] + * @param int $userId + * @param int $fileId + * @return mixed + */ + public function displayFile($userId = null, $fileId = null) + { + + $user = User::find($userId); + + // the license is valid + if (isset($user->id)) { + if (!Company::isCurrentUserHasAccess($user)) { + return Redirect::route('users')->with('error', Lang::get('general.insufficient_permissions')); + } else { + $log = Actionlog::find($fileId); + $file = $log->get_src(); + return Response::download($file); + } + } else { + // Prepare the error message + $error = Lang::get('admin/users/message.does_not_exist', compact('id')); + + // Redirect to the licence management page + return Redirect::route('users')->with('error', $error); + } + } + + /** + * Return view for LDAP import + * + * @author Aladin Alaily + * @since [v1.8] + * @return View + */ + public function getLDAP() + { + // Get all the available groups + //s$groups = Sentry::getGroupProvider()->findAll(); + // Selected groups + $selectedGroups = Input::old('groups', array()); + // Get all the available permissions + $permissions = config('permissions'); + //$this->encodeAllPermissions($permissions); + // Selected permissions + $selectedPermissions = Input::old('permissions', array('superuser' => -1)); + //$this->encodePermissions($selectedPermissions); + + $location_list = Helper::locationsList(); + + // Show the page + return View::make('users/ldap', compact('groups', 'selectedGroups', 'permissions', 'selectedPermissions')) + ->with('location_list', $location_list); + + } + + + /** + * Declare the rules for the ldap fields validation. + * + * @author Aladin Alaily + * @since [v1.8] + * @var array + * @deprecated 3.0 + * @todo remove this method in favor of other validation + * @var array + */ + + protected $ldapValidationRules = array( + 'firstname' => 'required|string|min:2', + 'lastname' => 'required|string|min:2', + 'employee_number' => 'string', + 'username' => 'required|min:2|unique:users,username', + 'email' => 'email|unique:users,email', + ); + + /** + * LDAP form processing. + * + * @author Aladin Alaily + * @since [v1.8] + * @return Redirect + */ + public function postLDAP() + { + + $location_id = Input::get('location_id'); + + $ldap_version = Setting::getSettings()->ldap_version; + $url = Setting::getSettings()->ldap_server; + $username = Setting::getSettings()->ldap_uname; + $password = Crypt::decrypt(Setting::getSettings()->ldap_pword); + $base_dn = Setting::getSettings()->ldap_basedn; + $filter = Setting::getSettings()->ldap_filter; + + $ldap_result_username = Setting::getSettings()->ldap_username_field; + $ldap_result_last_name = Setting::getSettings()->ldap_lname_field; + $ldap_result_first_name = Setting::getSettings()->ldap_fname_field; + + $ldap_result_active_flag = Setting::getSettings()->ldap_active_flag_field; + $ldap_result_emp_num = Setting::getSettings()->ldap_emp_num; + $ldap_result_email = Setting::getSettings()->ldap_email; + $ldap_server_cert_ignore = Setting::getSettings()->ldap_server_cert_ignore; + + // If we are ignoring the SSL cert we need to setup the environment variable + // before we create the connection + if ($ldap_server_cert_ignore) { + putenv('LDAPTLS_REQCERT=never'); + } + + // Connect to LDAP server + $ldapconn = @ldap_connect($url); + + // Needed for AD + ldap_set_option($ldapconn, LDAP_OPT_REFERRALS, 0); + + if (!$ldapconn) { + return Redirect::route('users')->with('error', Lang::get('admin/users/message.error.ldap_could_not_connect')); + } + + // Set options + $ldapopt = @ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, $ldap_version); + if (!$ldapopt) { + return Redirect::route('users')->with('error', Lang::get('admin/users/message.error.ldap_could_not_connect')); + } + + // Binding to ldap server + $ldapbind = @ldap_bind($ldapconn, $username, $password); + + Log::error(ldap_errno($ldapconn)); + if (!$ldapbind) { + return Redirect::route('users')->with('error', Lang::get('admin/users/message.error.ldap_could_not_bind').ldap_error($ldapconn)); + } + + // Perform the search + $search_results = @ldap_search($ldapconn, $base_dn, '('.$filter.')'); + if (!$search_results) { + return Redirect::route('users')->with('error', Lang::get('admin/users/message.error.ldap_could_not_search').ldap_error($ldapconn)); + } + + // Get results + $results = @ldap_get_entries($ldapconn, $search_results); + if (!$results) { + return Redirect::route('users')->with('error', Lang::get('admin/users/message.error.ldap_could_not_get_entries').ldap_error($ldapconn)); + } + + $summary = array(); + + for ($i = 0; $i < $results["count"]; $i++) { + if (empty($ldap_result_active_flag) || $results[$i][$ldap_result_active_flag][0] == "TRUE") { + + $item = array(); + $item["username"] = isset($results[$i][$ldap_result_username][0]) ? $results[$i][$ldap_result_username][0] : ""; + $item["employee_number"] = isset($results[$i][$ldap_result_emp_num][0]) ? $results[$i][$ldap_result_emp_num][0] : ""; + $item["lastname"] = isset($results[$i][$ldap_result_last_name][0]) ? $results[$i][$ldap_result_last_name][0] : ""; + $item["firstname"] = isset($results[$i][$ldap_result_first_name][0]) ? $results[$i][$ldap_result_first_name][0] : ""; + $item["email"] = isset($results[$i][$ldap_result_email][0]) ? $results[$i][$ldap_result_email][0] : "" ; + + // User exists + $item["createorupdate"] = 'updated'; + if (!$user = \App\Models\User::where('username', $item["username"])->first()) { + $user = new \App\Models\User; + $item["createorupdate"] = 'created'; + } + + + // Create the user if they don't exist. + $pass = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 20); + + $user->first_name = e($item["firstname"]); + $user->last_name = e($item["lastname"]); + $user->username = e($item["username"]); + $user->email = e($item["email"]); + $user->employee_num = e($item["employee_number"]); + $user->password = bcrypt($pass); + $user->activated = 1; + $user->location_id = e($location_id); + $user->permissions = '{"user":1}'; + $user->notes = 'Imported from LDAP'; + $user->ldap_import = 1; + + $errors = ''; + + if ($user->save()) { + $item["note"] = $item["createorupdate"]; + $item["status"]='success'; + } else { + //$errors_array = array($user->getErrors()); + foreach ($user->getErrors()->getMessages() as $key => $err) { + //echo $user->getErrors(); + $errors .='
  • '.$err[0]; + } + $item["note"] = $errors; + $item["status"]='error'; + } + + array_push($summary, $item); + } + + } + + + + return Redirect::route('ldap/user')->with('success', "OK")->with('summary', $summary); + } + + /** + * Return JSON containing a list of assets assigned to a user. + * + * @author [A. Gianotto] [] + * @since [v3.0] + * @return string JSON + */ + public function getAssetList($userId) + { + $assets = Asset::where('assigned_to', '=', $userId)->get(); + return response()->json($assets); + //$foo = Asset::where('assigned_to','=',$userId)->get(); + //print_r($foo); + } +} diff --git a/app/Http/Controllers/ViewAssetsController.php b/app/Http/Controllers/ViewAssetsController.php new file mode 100755 index 0000000000..68776609ab --- /dev/null +++ b/app/Http/Controllers/ViewAssetsController.php @@ -0,0 +1,264 @@ +withTrashed()->find(Auth::user()->id); + + $userlog = $user->userlog->load('assetlog', 'consumablelog', 'assetlog.model', 'licenselog', 'accessorylog', 'userlog', 'adminlog'); + + + + if (isset($user->id)) { + return View::make('account/view-assets', compact('user', 'userlog')); + } else { + // Prepare the error message + $error = Lang::get('admin/users/message.user_not_found', compact('id')); + + // Redirect to the user management page + return Redirect::route('users')->with('error', $error); + } + + } + + + public function getRequestableIndex() + { + + $assets = Asset::with('model', 'defaultLoc')->Hardware()->RequestableAssets()->get(); + + return View::make('account/requestable-assets', compact('user', 'assets')); + } + + + public function getRequestAsset($assetId = null) + { + + $user = Auth::user(); + + // Check if the asset exists and is requestable + if (is_null($asset = Asset::RequestableAssets()->find($assetId))) { + // Redirect to the asset management page + return Redirect::route('requestable-assets')->with('error', Lang::get('admin/hardware/message.does_not_exist_or_not_requestable')); + } elseif (!Company::isCurrentUserHasAccess($asset)) { + return Redirect::route('requestable-assets')->with('error', Lang::get('general.insufficient_permissions')); + } else { + + $logaction = new Actionlog(); + $logaction->asset_id = $data['asset_id'] = $asset->id; + $logaction->asset_type = $data['asset_type'] = 'hardware'; + $logaction->created_at = $data['requested_date'] = date("Y-m-d h:i:s"); + + if ($user->location_id) { + $logaction->location_id = $user->location_id; + } + $logaction->user_id = $data['user_id'] = Auth::user()->id; + $log = $logaction->logaction('requested'); + + $data['requested_by'] = $user->fullName(); + $data['asset_name'] = $asset->showAssetName(); + + $settings = Setting::getSettings(); + + if (($settings->alert_email!='') && ($settings->alerts_enabled=='1') && (!config('app.lock_passwords'))) { + Mail::send('emails.asset-requested', $data, function ($m) use ($user, $settings) { + $m->to(explode(',', $settings->alert_email), $settings->site_name); + $m->subject('Asset Requested'); + }); + } + + + if ($settings->slack_endpoint) { + + + $slack_settings = [ + 'username' => $settings->botname, + 'channel' => $settings->slack_channel, + 'link_names' => true + ]; + + $client = new \Maknz\Slack\Client($settings->slack_endpoint, $slack_settings); + + try { + $client->attach([ + 'color' => 'good', + 'fields' => [ + [ + 'title' => 'REQUESTED:', + 'value' => strtoupper($logaction->asset_type).' asset <'.config('app.url').'/hardware/'.$asset->id.'/view'.'|'.$asset->showAssetName().'> requested by <'.config('app.url').'/hardware/'.$asset->id.'/view'.'|'.Auth::user()->fullName().'>.' + ] + + ] + ])->send('Asset Requested'); + + } catch (Exception $e) { + + } + + } + + return Redirect::route('requestable-assets')->with('success')->with('success', Lang::get('admin/hardware/message.requests.success')); + } + + + } + + + + // Get the acceptance screen + public function getAcceptAsset($logID = null) + { + + if (is_null($findlog = Actionlog::find($logID))) { + // Redirect to the asset management page + return Redirect::to('account')->with('error', Lang::get('admin/hardware/message.does_not_exist')); + } + + $user = Auth::user(); + + if ($user->id != $findlog->checkedout_to) { + return Redirect::to('account/view-assets')->with('error', Lang::get('admin/users/message.error.incorrect_user_accepted')); + } + + // Asset + if (($findlog->asset_id!='') && ($findlog->asset_type=='hardware')) { + $item = Asset::find($findlog->asset_id); + + // software + } elseif (($findlog->asset_id!='') && ($findlog->asset_type=='software')) { + $item = License::find($findlog->asset_id); + // accessories + } elseif ($findlog->accessory_id!='') { + $item = Accessory::find($findlog->accessory_id); + } + + // Check if the asset exists + if (is_null($item)) { + // Redirect to the asset management page + return Redirect::to('account')->with('error', Lang::get('admin/hardware/message.does_not_exist')); + } elseif (!Company::isCurrentUserHasAccess($item)) { + return Redirect::route('requestable-assets')->with('error', Lang::get('general.insufficient_permissions')); + } else { + return View::make('account/accept-asset', compact('item'))->with('findlog', $findlog); + } + } + + // Save the acceptance + public function postAcceptAsset($logID = null) + { + + // Check if the asset exists + if (is_null($findlog = Actionlog::find($logID))) { + // Redirect to the asset management page + return Redirect::to('account/view-assets')->with('error', Lang::get('admin/hardware/message.does_not_exist')); + } + + // NOTE: make sure the global scope is applied + $is_unauthorized = is_null(Actionlog::where('id', '=', $logID)->first()); + if ($is_unauthorized) { + return Redirect::route('requestable-assets')->with('error', Lang::get('general.insufficient_permissions')); + } + + if ($findlog->accepted_id!='') { + // Redirect to the asset management page + return Redirect::to('account/view-assets')->with('error', Lang::get('admin/users/message.error.asset_already_accepted')); + } + + if (!Input::has('asset_acceptance')) { + return Redirect::to('account/view-assets')->with('error', Lang::get('admin/users/message.error.accept_or_decline')); + } + + $user = Auth::user(); + + if ($user->id != $findlog->checkedout_to) { + return Redirect::to('account/view-assets')->with('error', Lang::get('admin/users/message.error.incorrect_user_accepted')); + } + + $logaction = new Actionlog(); + + if (Input::get('asset_acceptance')=='accepted') { + $logaction_msg = 'accepted'; + $accepted="accepted"; + $return_msg = Lang::get('admin/users/message.accepted'); + } else { + $logaction_msg = 'declined'; + $accepted="rejected"; + $return_msg = Lang::get('admin/users/message.declined'); + } + + // Asset + if (($findlog->asset_id!='') && ($findlog->asset_type=='hardware')) { + $logaction->asset_id = $findlog->asset_id; + $logaction->accessory_id = null; + $logaction->asset_type = 'hardware'; + + if (Input::get('asset_acceptance')!='accepted') { + DB::table('assets') + ->where('id', $findlog->asset_id) + ->update(array('assigned_to' => null)); + } + + + // software + } elseif (($findlog->asset_id!='') && ($findlog->asset_type=='software')) { + $logaction->asset_id = $findlog->asset_id; + $logaction->accessory_id = null; + $logaction->asset_type = 'software'; + + // accessories + } elseif ($findlog->accessory_id!='') { + $logaction->asset_id = null; + $logaction->accessory_id = $findlog->accessory_id; + $logaction->asset_type = 'accessory'; + } + + $logaction->checkedout_to = $findlog->checkedout_to; + + $logaction->note = e(Input::get('note')); + $logaction->user_id = $user->id; + $logaction->accepted_at = date("Y-m-d h:i:s"); + $log = $logaction->logaction($logaction_msg); + + $update_checkout = DB::table('asset_logs') + ->where('id', $findlog->id) + ->update(array('accepted_id' => $logaction->id)); + + $affected_asset=$logaction->assetlog; + $affected_asset->accepted=$accepted; + $affected_asset->save(); + + if ($update_checkout) { + return Redirect::to('account/view-assets')->with('success', $return_msg); + + } else { + return Redirect::to('account/view-assets')->with('error', 'Something went wrong '); + } + } +} diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php new file mode 100644 index 0000000000..9d2a1229d7 --- /dev/null +++ b/app/Http/Kernel.php @@ -0,0 +1,59 @@ + [ + \App\Http\Middleware\EncryptCookies::class, + \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, + \App\Http\Middleware\VerifyCsrfToken::class, + \App\Http\Middleware\CheckLocale::class, + \App\Http\Middleware\CheckForSetup::class, + ], + + 'api' => [ + 'throttle:60,1', + ], + ]; + + /** + * The application's route middleware. + * + * These middleware may be assigned to groups or used individually. + * + * @var array + */ + protected $routeMiddleware = [ + 'auth' => \App\Http\Middleware\Authenticate::class, + 'authorize' => \App\Http\Middleware\CheckPermissions::class, + 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, + 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, + 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, + ]; +} diff --git a/app/Http/Middleware/Authenticate.php b/app/Http/Middleware/Authenticate.php new file mode 100644 index 0000000000..2ac322ff29 --- /dev/null +++ b/app/Http/Middleware/Authenticate.php @@ -0,0 +1,47 @@ +auth = $auth; + } + + /** + * Handle an incoming request. + * + * @param \Illuminate\Http\Request $request + * @param \Closure $next + * @return mixed + */ + public function handle($request, Closure $next) + { + if ($this->auth->guest()) { + if ($request->ajax()) { + return response('Unauthorized.', 401); + } else { + return redirect()->guest('login'); + } + } + + return $next($request); + } +} diff --git a/app/Http/Middleware/CheckForSetup.php b/app/Http/Middleware/CheckForSetup.php new file mode 100644 index 0000000000..fa93e41100 --- /dev/null +++ b/app/Http/Middleware/CheckForSetup.php @@ -0,0 +1,30 @@ +count(); + if (($usercount > 0) && (Route::is('setup*'))) { + return redirect(config('app.url')); + } else { + return $next($request); + } + } catch (\Exception $e) { + return $next($request); + } + + + + + + } +} diff --git a/app/Http/Middleware/CheckLocale.php b/app/Http/Middleware/CheckLocale.php new file mode 100644 index 0000000000..d3cf866fd5 --- /dev/null +++ b/app/Http/Middleware/CheckLocale.php @@ -0,0 +1,37 @@ +user()) && ($request->user()->locale)) { + \App::setLocale($request->user()->locale); + + // App setting preference + } elseif (\App\Models\Setting::getSettings()->locale!='') { + \App::setLocale(\App\Models\Setting::getSettings()->locale); + + // Default app setting + } else { + \App::setLocale(config('app.locale')); + } + return $next($request); + } +} diff --git a/app/Http/Middleware/CheckPermissions.php b/app/Http/Middleware/CheckPermissions.php new file mode 100644 index 0000000000..6993ca144f --- /dev/null +++ b/app/Http/Middleware/CheckPermissions.php @@ -0,0 +1,31 @@ +user()->hasAccess($section)) || ($request->user()->isSuperUser())) { + return $next($request); + } + + return response()->view('layouts/basic', [ + 'content' => view('errors/403') + ]); + + } +} diff --git a/app/Http/Middleware/EncryptCookies.php b/app/Http/Middleware/EncryptCookies.php new file mode 100644 index 0000000000..3aa15f8dd9 --- /dev/null +++ b/app/Http/Middleware/EncryptCookies.php @@ -0,0 +1,17 @@ +headers->set('X-Frame-Options', 'SAMEORIGIN', false); + return $response; + } +} diff --git a/app/Http/Middleware/NosniffGuard.php b/app/Http/Middleware/NosniffGuard.php new file mode 100644 index 0000000000..295f5e75af --- /dev/null +++ b/app/Http/Middleware/NosniffGuard.php @@ -0,0 +1,21 @@ +headers->set('X-Content-Type-Options', 'nosniff', false); + return $response; + } +} diff --git a/app/Http/Middleware/RedirectIfAuthenticated.php b/app/Http/Middleware/RedirectIfAuthenticated.php new file mode 100644 index 0000000000..8fded3c489 --- /dev/null +++ b/app/Http/Middleware/RedirectIfAuthenticated.php @@ -0,0 +1,26 @@ +check()) { + return redirect('/'); + } + + return $next($request); + } +} diff --git a/app/Http/Middleware/VerifyCsrfToken.php b/app/Http/Middleware/VerifyCsrfToken.php new file mode 100644 index 0000000000..0faba9ee9b --- /dev/null +++ b/app/Http/Middleware/VerifyCsrfToken.php @@ -0,0 +1,16 @@ +headers->set('X-XSS-Protection', '1'); + return $response; + } +} diff --git a/app/Http/Requests/AssetCheckinRequest.php b/app/Http/Requests/AssetCheckinRequest.php new file mode 100644 index 0000000000..b9b87f1309 --- /dev/null +++ b/app/Http/Requests/AssetCheckinRequest.php @@ -0,0 +1,35 @@ +redirector->back()->withInput()->withErrors($errors, $this->errorBag); + } +} diff --git a/app/Http/Requests/AssetCheckoutRequest.php b/app/Http/Requests/AssetCheckoutRequest.php new file mode 100644 index 0000000000..9b3e98c2d6 --- /dev/null +++ b/app/Http/Requests/AssetCheckoutRequest.php @@ -0,0 +1,30 @@ + 'required', + ]; + } +} diff --git a/app/Http/Requests/AssetFileRequest.php b/app/Http/Requests/AssetFileRequest.php new file mode 100644 index 0000000000..2c28b03147 --- /dev/null +++ b/app/Http/Requests/AssetFileRequest.php @@ -0,0 +1,35 @@ + 'required|mimes:png,gif,jpg,jpeg,doc,docx,pdf,txt,zip,rar|max:2000' + ]; + } + + public function response(array $errors) + { + return $this->redirector->back()->withInput()->withErrors($errors, $this->errorBag); + } +} diff --git a/app/Http/Requests/AssetRequest.php b/app/Http/Requests/AssetRequest.php new file mode 100644 index 0000000000..91187f178a --- /dev/null +++ b/app/Http/Requests/AssetRequest.php @@ -0,0 +1,57 @@ + 'min:2|max:255', + 'model_id' => 'required|integer', + 'status_id' => 'required|integer', + 'company_id' => 'integer', + 'warranty_months' => 'integer|min:0|max:240', + 'physical' => 'integer', + 'checkout_date' => 'date|max:10|min:10', + 'checkin_date' => 'date|max:10|min:10', + 'supplier_id' => 'integer', + 'asset_tag' => 'required|min:2|max:255|unique:assets,asset_tag,NULL,deleted_at', + 'status' => 'integer', + ]; + + $model = \App\Models\AssetModel::find($this->request->get('model_id')); + + if ($model->fieldset) + { + $rules += $model->fieldset->validation_rules(); + } + + + + return $rules; + + } + + public function response(array $errors) + { + return $this->redirector->back()->withInput()->withErrors($errors, $this->errorBag); + } +} diff --git a/app/Http/Requests/ComponentCheckoutRequest.php b/app/Http/Requests/ComponentCheckoutRequest.php new file mode 100644 index 0000000000..66860b0632 --- /dev/null +++ b/app/Http/Requests/ComponentCheckoutRequest.php @@ -0,0 +1,31 @@ + 'required', + "assigned_qty" => 'required|numeric|min:1', + ]; + } +} diff --git a/app/Http/Requests/Request.php b/app/Http/Requests/Request.php new file mode 100644 index 0000000000..709ed4b341 --- /dev/null +++ b/app/Http/Requests/Request.php @@ -0,0 +1,21 @@ +rules; + } + + public function response(array $errors) + { + $this->session->flash('errorMessages', $errors); + return $this->redirector->back()->withErrors($errors)->withInput(); + } +} diff --git a/app/Http/Requests/SettingRequest.php b/app/Http/Requests/SettingRequest.php new file mode 100644 index 0000000000..ee20ae267e --- /dev/null +++ b/app/Http/Requests/SettingRequest.php @@ -0,0 +1,64 @@ + 'required|min:1|numeric', + "qr_text" => 'min:1|max:31', + "logo_img" => 'mimes:jpeg,bmp,png,gif', + "custom_css" => 'string', + "alert_email" => 'email_array', + "slack_endpoint" => 'url', + "default_currency" => 'required', + "locale" => 'required', + "slack_channel" => 'regex:/(? 'string', + 'labels_per_page' => 'numeric', + 'labels_width' => 'numeric', + 'labels_height' => 'numeric', + 'labels_pmargin_left' => 'numeric', + 'labels_pmargin_right' => 'numeric', + 'labels_pmargin_top' => 'numeric', + 'labels_pmargin_bottom' => 'numeric', + 'labels_display_bgutter' => 'numeric', + 'labels_display_sgutter' => 'numeric', + 'labels_fontsize' => 'numeric|min:5', + 'labels_pagewidth' => 'numeric', + 'labels_pageheight' => 'numeric', + "ldap_server" => 'sometimes|required_if:ldap_enabled,1|url', + "ldap_uname" => 'sometimes|required_if:ldap_enabled,1', + "ldap_basedn" => 'sometimes|required_if:ldap_enabled,1', + "ldap_filter" => 'sometimes|required_if:ldap_enabled,1', + "ldap_username_field" => 'sometimes|required_if:ldap_enabled,1', + "ldap_lname_field" => 'sometimes|required_if:ldap_enabled,1', + "ldap_auth_filter_query" => 'sometimes|required_if:ldap_enabled,1', + "ldap_version" => 'sometimes|required_if:ldap_enabled,1', + ]; + } + + public function response(array $errors) + { + return $this->redirector->back()->withInput()->withErrors($errors, $this->errorBag); + } +} diff --git a/app/Http/Requests/SetupUserRequest.php b/app/Http/Requests/SetupUserRequest.php new file mode 100644 index 0000000000..336cd04568 --- /dev/null +++ b/app/Http/Requests/SetupUserRequest.php @@ -0,0 +1,42 @@ + 'required|string|min:1', + 'last_name' => 'required|string|min:1', + 'location_id' => 'numeric', + 'username' => 'required|string|min:2|unique:users,username,NULL,deleted_at', + 'email' => 'email|unique:users,email', + 'password' => 'required|min:6', + 'password_confirm' => 'required|min:6|same:password', + 'company_id' => 'integer', + ]; + } + + public function response(array $errors) + { + return $this->redirector->back()->withInput()->withErrors($errors, $this->errorBag); + } +} diff --git a/app/Http/routes.php b/app/Http/routes.php new file mode 100755 index 0000000000..b9d4ea234d --- /dev/null +++ b/app/Http/routes.php @@ -0,0 +1,849 @@ + 'api', 'middleware' => 'auth' ], function () { + + /*---Hardware API---*/ + Route::group([ 'prefix' => 'hardware','middleware' => ['web','auth','authorize:hardware']], function () { + + Route::get('list/{status?}', [ 'as' => 'api.hardware.list', 'uses' => 'AssetsController@getDatatable' ]); + + Route::post('import', 'AssetsController@postAPIImportUpload'); + }); + + /*---Status Label API---*/ + Route::group([ 'prefix' => 'statuslabels' ,'middleware' => ['web','auth','authorize:admin']], function () { + + Route::resource('/', 'StatuslabelsController'); + Route::get('{statuslabelId}/deployable', function ($statuslabelId) { + + $statuslabel = \App\Models\Statuslabel::find($statuslabelId); + if (( $statuslabel->deployable == '1' ) && ( $statuslabel->pending != '1' ) + && ( $statuslabel->archived != '1' ) + ) { + return '1'; + } else { + return '0'; + } + + }); + + Route::get('list', [ 'as' => 'api.statuslabels.list', 'uses' => 'StatuslabelsController@getDatatable' ]); + + }); + + /*---Accessories API---*/ + Route::group([ 'prefix' => 'accessories' ], function () { + + Route::get('list', [ 'as' => 'api.accessories.list', 'uses' => 'AccessoriesController@getDatatable' ]); + Route::get( + '{accessoryID}/view', + [ 'as' => 'api.accessories.view', 'uses' => 'AccessoriesController@getDataView' ] + ); + }); + + /*---Consumables API---*/ + Route::group(array('prefix'=>'consumables'), function () { + Route::get('list', array('as'=>'api.consumables.list', 'uses'=>'ConsumablesController@getDatatable')); + Route::get('{consumableID}/view', array('as'=>'api.consumables.view', 'uses'=>'ConsumablesController@getDataView')); + }); + + /*---Components API---*/ + Route::group(array('prefix'=>'components'), function () { + Route::get('list', array('as'=>'api.components.list', 'uses'=>'ComponentsController@getDatatable')); + Route::get('{componentID}/view', array('as'=>'api.components.view', 'uses'=>'ComponentsController@getDataView')); + }); + + /*---Locations API---*/ + Route::group(array('prefix'=>'locations'), function () { + Route::get('list', array('as'=>'api.locations.list', 'uses'=>'LocationsController@getDatatable')); + Route::get('{locationID}/view', array('as'=>'api.locations.view', 'uses'=>'LocationsController@getDataView')); + Route::get('{locationID}/users', array('as'=>'api.locations.viewusers', 'uses'=>'LocationsController@getDataViewUsers')); + Route::get('{locationID}/assets', array('as'=>'api.locations.viewassets', 'uses'=>'LocationsController@getDataViewAssets')); + }); + + /*---Depreciations API---*/ + Route::group(array('prefix'=>'depreciations'), function () { + Route::get('list', array('as'=>'api.depreciations.list', 'uses'=>'DepreciationsController@getDatatable')); + Route::get('{$depreciationID}/view', array('as'=>'api.depreciations.view', 'uses'=>'DepreciationsController@getDataView')); + }); + + /*---Manufacturers API---*/ + Route::group(array('prefix'=>'manufacturers'), function () { + Route::get('list', array('as'=>'api.manufacturers.list', 'uses'=>'ManufacturersController@getDatatable')); + Route::get('{manufacturerID}/view', array('as'=>'api.manufacturers.view', 'uses'=>'ManufacturersController@getDataView')); + }); + + /*---Suppliers API---*/ + Route::group(array('prefix'=>'suppliers'), function () { + Route::get('list', array('as'=>'api.suppliers.list', 'uses'=>'SuppliersController@getDatatable')); + }); + + /*---Users API---*/ + Route::group([ 'prefix' => 'users' ], function () { + Route::post('/', [ 'as' => 'api.users.store', 'uses' => 'UsersController@store' ]); + Route::get('list/{status?}', [ 'as' => 'api.users.list', 'uses' => 'UsersController@getDatatable' ]); + Route::get('{userId}/assets', [ 'as' => 'api.users.assetlist', 'uses' => 'UsersController@getAssetList' ]); + Route::post('{userId}/upload', [ 'as' => 'upload/user', 'uses' => 'UsersController@postUpload' ]); + }); + + /*---Groups API---*/ + Route::group([ 'prefix' => 'groups' ], function () { + Route::get('list', [ 'as' => 'api.groups.list', 'uses' => 'GroupsController@getDatatable' ]); + }); + + /*---Licenses API---*/ + Route::group([ 'prefix' => 'licenses' ], function () { + + Route::get('list', [ 'as' => 'api.licenses.list', 'uses' => 'LicensesController@getDatatable' ]); + }); + + /*---Locations API---*/ + Route::group([ 'prefix' => 'locations' ], function () { + + Route::resource('/', 'LocationsController'); + Route::get('{locationID}/check', function ($locationID) { + + $location = \App\Models\Location::find($locationID); + + return $location; + }); + }); + + /*---Improvements API---*/ + Route::group([ 'prefix' => 'asset_maintenances' ], function () { + + Route::get( + 'list', + [ 'as' => 'api.asset_maintenances.list', 'uses' => 'AssetMaintenancesController@getDatatable' ] + ); + }); + + /*---Models API---*/ + Route::group([ 'prefix' => 'models' ], function () { + + Route::resource('/', 'AssetModelsController'); + Route::get('list/{status?}', [ 'as' => 'api.models.list', 'uses' => 'AssetModelsController@getDatatable' ]); + Route::get('{modelID}/view', [ 'as' => 'api.models.view', 'uses' => 'AssetModelsController@getDataView' ]); + }); + + /*--- Categories API---*/ + Route::group([ 'prefix' => 'categories' ], function () { + + Route::get('list', [ 'as' => 'api.categories.list', 'uses' => 'CategoriesController@getDatatable' ]); + Route::get( + '{categoryID}/view', + [ 'as' => 'api.categories.view', 'uses' => 'CategoriesController@getDataView' ] + ); + }); + + /*-- Suppliers API (mostly for creating new ones in-line while creating an asset) --*/ + Route::group([ 'prefix' => 'suppliers' ], function () { + + Route::resource('/', 'SuppliersController'); + }); +}); + +/* +|-------------------------------------------------------------------------- +| Asset Routes +|-------------------------------------------------------------------------- +| +| Register all the asset routes. +| +*/ + +Route::group( + [ 'prefix' => 'hardware', + 'middleware' => ['web', + 'auth', + 'authorize:hardware']], + function () { + + Route::get('create/{model?}', [ + 'as' => 'create/hardware', + 'uses' => 'AssetsController@getCreate' + ]); + + Route::post('create', [ + 'as' => 'savenew/hardware', + 'uses' => 'AssetsController@postCreate' + ]); + + Route::get('{assetId}/edit', [ + 'as' => 'update/hardware', + 'uses' => 'AssetsController@getEdit' + ]); + + Route::get('{assetId}/clone', [ 'as' => 'clone/hardware', 'uses' => 'AssetsController@getClone' ]); + Route::post('{assetId}/clone', 'AssetsController@postCreate'); + Route::get('{assetId}/delete', [ 'as' => 'delete/hardware', 'uses' => 'AssetsController@getDelete' ]); + Route::get( + '{assetId}/checkout', + [ 'as' => 'checkout/hardware', 'uses' => 'AssetsController@getCheckout' ] + ); + Route::post('{assetId}/checkout', 'AssetsController@postCheckout'); + Route::get( + '{assetId}/checkin/{backto?}', + [ 'as' => 'checkin/hardware', 'uses' => 'AssetsController@getCheckin' ] + ); + Route::post('{assetId}/checkin/{backto?}', 'AssetsController@postCheckin'); + Route::get('{assetId}/view', [ 'as' => 'view/hardware', 'uses' => 'AssetsController@getView' ]); + Route::get('{assetId}/qr-view', [ 'as' => 'qr-view/hardware', 'uses' => 'AssetsController@getView' ]); + Route::get('{assetId}/qr_code', [ 'as' => 'qr_code/hardware', 'uses' => 'AssetsController@getQrCode' ]); + Route::get('{assetId}/restore', [ 'as' => 'restore/hardware', 'uses' => 'AssetsController@getRestore' ]); + Route::post('{assetId}/upload', [ 'as' => 'upload/asset', 'uses' => 'AssetsController@postUpload' ]); + Route::get( + '{assetId}/deletefile/{fileId}', + [ 'as' => 'delete/assetfile', 'uses' => 'AssetsController@getDeleteFile' ] + ); + Route::get( + '{assetId}/showfile/{fileId}', + [ 'as' => 'show/assetfile', 'uses' => 'AssetsController@displayFile' ] + ); + + Route::get( + 'import/delete-import/{filename}', + [ 'as' => 'assets/import/delete-file', 'uses' => 'AssetsController@getDeleteImportFile' ] + ); + + Route::get( + 'import/process/{filename}', + [ 'as' => 'assets/import/process-file', 'uses' => 'AssetsController@getProcessImportFile' ] + ); + + Route::get( + 'import', + [ 'as' => 'assets/import', 'uses' => 'AssetsController@getImportUpload' ] + ); + + + Route::post('{assetId}/edit', 'AssetsController@postEdit'); + + Route::post( + 'bulkedit', + [ + 'as' => 'hardware/bulkedit', + 'uses' => 'AssetsController@postBulkEdit' + ] + ); + Route::post( + 'bulkdelete', + [ + 'as' => 'hardware/bulkdelete', + 'uses' => 'AssetsController@postBulkDelete' + ] + ); + Route::post( + 'bulksave', + [ + 'as' => 'hardware/bulksave', + 'uses' => 'AssetsController@postBulkSave' + ] + ); + + # Asset Model Management + Route::group([ 'prefix' => 'models', 'middleware' => 'auth' ], function () { + + Route::get('/', [ 'as' => 'models', 'uses' => 'AssetModelsController@getIndex' ]); + Route::get('create', [ 'as' => 'create/model', 'uses' => 'AssetModelsController@getCreate' ]); + Route::post('create', 'AssetModelsController@postCreate'); + Route::get('{modelId}/edit', [ 'as' => 'update/model', 'uses' => 'AssetModelsController@getEdit' ]); + Route::post('{modelId}/edit', 'AssetModelsController@postEdit'); + Route::get('{modelId}/clone', [ 'as' => 'clone/model', 'uses' => 'AssetModelsController@getClone' ]); + Route::post('{modelId}/clone', 'AssetModelsController@postCreate'); + Route::get('{modelId}/delete', [ 'as' => 'delete/model', 'uses' => 'AssetModelsController@getDelete' ]); + Route::get('{modelId}/view', [ 'as' => 'view/model', 'uses' => 'AssetModelsController@getView' ]); + Route::get('{modelID}/restore', [ 'as' => 'restore/model', 'uses' => 'AssetModelsController@getRestore' ]); + Route::get('{modelId}/custom_fields', ['as' => 'custom_fields/model','uses' => 'AssetModelsController@getCustomFields']); + }); + + Route::get('/', [ + 'as' => 'hardware', + 'uses' => 'AssetsController@getIndex' + ]); + + } +); + +/* +|-------------------------------------------------------------------------- +| Admin Routes +|-------------------------------------------------------------------------- +| +| Register all the admin routes. +| +*/ + +Route::group([ 'prefix' => 'admin','middleware' => ['web','auth','authorize:admin']], function () { + + # Licenses + Route::group([ 'prefix' => 'licenses' ], function () { + + Route::get('create', [ 'as' => 'create/licenses', 'uses' => 'LicensesController@getCreate' ]); + Route::post('create', 'LicensesController@postCreate'); + Route::get('{licenseId}/edit', [ 'as' => 'update/license', 'uses' => 'LicensesController@getEdit' ]); + Route::post('{licenseId}/edit', 'LicensesController@postEdit'); + Route::get('{licenseId}/clone', [ 'as' => 'clone/license', 'uses' => 'LicensesController@getClone' ]); + Route::post('{licenseId}/clone', 'LicensesController@postCreate'); + Route::get('{licenseId}/delete', [ 'as' => 'delete/license', 'uses' => 'LicensesController@getDelete' ]); + Route::get( + '{licenseId}/freecheckout', + [ 'as' => 'freecheckout/license', 'uses' => 'LicensesController@getFreeLicense' ] + ); + Route::get( + '{licenseId}/checkout', + [ 'as' => 'checkout/license', 'uses' => 'LicensesController@getCheckout' ] + ); + Route::post('{licenseId}/checkout', 'LicensesController@postCheckout'); + Route::get( + '{licenseId}/checkin/{backto?}', + [ 'as' => 'checkin/license', 'uses' => 'LicensesController@getCheckin' ] + ); + Route::post('{licenseId}/checkin/{backto?}', 'LicensesController@postCheckin'); + Route::get('{licenseId}/view', [ 'as' => 'view/license', 'uses' => 'LicensesController@getView' ]); + Route::post( + '{licenseId}/upload', + [ 'as' => 'upload/license', 'uses' => 'LicensesController@postUpload' ] + ); + Route::get( + '{licenseId}/deletefile/{fileId}', + [ 'as' => 'delete/licensefile', 'uses' => 'LicensesController@getDeleteFile' ] + ); + Route::get( + '{licenseId}/showfile/{fileId}', + [ 'as' => 'show/licensefile', 'uses' => 'LicensesController@displayFile' ] + ); + Route::get('/', [ 'as' => 'licenses', 'uses' => 'LicensesController@getIndex' ]); + }); + + # Asset Maintenances + Route::group([ 'prefix' => 'asset_maintenances' ], function () { + + Route::get( + 'create/{assetId?}', + [ 'as' => 'create/asset_maintenances', 'uses' => 'AssetMaintenancesController@getCreate' ] + ); + Route::post('create/{assetId?}', 'AssetMaintenancesController@postCreate'); + Route::get('/', [ 'as' => 'asset_maintenances', 'uses' => 'AssetMaintenancesController@getIndex' ]); + Route::get( + '{assetMaintenanceId}/edit', + [ 'as' => 'update/asset_maintenance', 'uses' => 'AssetMaintenancesController@getEdit' ] + ); + Route::post('{assetMaintenanceId}/edit', 'AssetMaintenancesController@postEdit'); + Route::get( + '{assetMaintenanceId}/delete', + [ 'as' => 'delete/asset_maintenance', 'uses' => 'AssetMaintenancesController@getDelete' ] + ); + Route::get( + '{assetMaintenanceId}/view', + [ 'as' => 'view/asset_maintenance', 'uses' => 'AssetMaintenancesController@getView' ] + ); + }); + + # Accessories + Route::group([ 'prefix' => 'accessories' ], function () { + + Route::get('create', [ 'as' => 'create/accessory', 'uses' => 'AccessoriesController@getCreate' ]); + Route::post('create', 'AccessoriesController@postCreate'); + Route::get( + '{accessoryID}/edit', + [ 'as' => 'update/accessory', 'uses' => 'AccessoriesController@getEdit' ] + ); + Route::post('{accessoryID}/edit', 'AccessoriesController@postEdit'); + Route::get( + '{accessoryID}/delete', + [ 'as' => 'delete/accessory', 'uses' => 'AccessoriesController@getDelete' ] + ); + Route::get('{accessoryID}/view', [ 'as' => 'view/accessory', 'uses' => 'AccessoriesController@getView' ]); + Route::get( + '{accessoryID}/checkout', + [ 'as' => 'checkout/accessory', 'uses' => 'AccessoriesController@getCheckout' ] + ); + Route::post('{accessoryID}/checkout', 'AccessoriesController@postCheckout'); + Route::get( + '{accessoryID}/checkin/{backto?}', + [ 'as' => 'checkin/accessory', 'uses' => 'AccessoriesController@getCheckin' ] + ); + Route::post('{accessoryID}/checkin/{backto?}', 'AccessoriesController@postCheckin'); + + Route::get('/', [ 'as' => 'accessories', 'uses' => 'AccessoriesController@getIndex' ]); + }); + + # Consumables + Route::group([ 'prefix' => 'consumables' ], function () { + + Route::get('create', [ 'as' => 'create/consumable', 'uses' => 'ConsumablesController@getCreate' ]); + Route::post('create', 'ConsumablesController@postCreate'); + Route::get( + '{consumableID}/edit', + [ 'as' => 'update/consumable', 'uses' => 'ConsumablesController@getEdit' ] + ); + Route::post('{consumableID}/edit', 'ConsumablesController@postEdit'); + Route::get( + '{consumableID}/delete', + [ 'as' => 'delete/consumable', 'uses' => 'ConsumablesController@getDelete' ] + ); + Route::get( + '{consumableID}/view', + [ 'as' => 'view/consumable', 'uses' => 'ConsumablesController@getView' ] + ); + Route::get( + '{consumableID}/checkout', + [ 'as' => 'checkout/consumable', 'uses' => 'ConsumablesController@getCheckout' ] + ); + Route::post('{consumableID}/checkout', 'ConsumablesController@postCheckout'); + Route::get('/', [ 'as' => 'consumables', 'uses' => 'ConsumablesController@getIndex' ]); + }); + + # Components + Route::group([ 'prefix' => 'components' ], function () { + + Route::get('create', [ 'as' => 'create/component', 'uses' => 'ComponentsController@getCreate' ]); + Route::post('create', 'ComponentsController@postCreate'); + Route::get( + '{componentID}/edit', + [ 'as' => 'update/component', 'uses' => 'ComponentsController@getEdit' ] + ); + Route::post('{componentID}/edit', 'ComponentsController@postEdit'); + Route::get( + '{componentID}/delete', + [ 'as' => 'delete/component', 'uses' => 'ComponentsController@getDelete' ] + ); + Route::get( + '{componentID}/view', + [ 'as' => 'view/component', 'uses' => 'ComponentsController@getView' ] + ); + Route::get( + '{componentID}/checkout', + [ 'as' => 'checkout/component', 'uses' => 'ComponentsController@getCheckout' ] + ); + Route::post('{componentID}/checkout', 'ComponentsController@postCheckout'); + Route::post('bulk', [ 'as' => 'component/bulk-form', 'uses' => 'ComponentsController@postBulk' ]); + Route::post('bulksave', [ 'as' => 'component/bulk-save', 'uses' => 'ComponentsController@postBulkSave' ]); + Route::get('/', [ 'as' => 'components', 'uses' => 'ComponentsController@getIndex' ]); + }); + + # Admin Settings Routes (for categories, maufactureres, etc) + Route::group([ 'prefix' => 'settings'], function () { + + # Settings + Route::group([ 'prefix' => 'app' ], function () { + + Route::get('/', [ 'as' => 'app', 'uses' => 'SettingsController@getIndex' ]); + Route::get('edit', [ 'as' => 'edit/settings', 'uses' => 'SettingsController@getEdit' ]); + Route::post('edit', 'SettingsController@postEdit'); + }); + + # Settings + Route::group([ 'prefix' => 'backups', 'middleware' => 'auth' ], function () { + + + Route::get('download/{filename}', [ + 'as' => 'settings/download-file', + 'uses' => 'SettingsController@downloadFile' ]); + + Route::get('delete/{filename}', [ + 'as' => 'settings/delete-file', + 'uses' => 'SettingsController@deleteFile' ]); + + Route::post('/', [ + 'as' => 'settings/backups', + 'uses' => 'SettingsController@postBackups' + ]); + Route::get('/', [ 'as' => 'settings/backups', 'uses' => 'SettingsController@getBackups' ]); + }); + + # Companies + Route::group([ 'prefix' => 'companies' ], function () { + + Route::get('{companyId}/edit', ['as' => 'update/company', 'uses' => 'CompaniesController@getEdit']); + Route::get('create', ['as' => 'create/company', 'uses' => 'CompaniesController@getCreate']); + Route::get('/', ['as' => 'companies', 'uses' => 'CompaniesController@getIndex']); + + Route::post('{companyId}/delete', ['as' => 'delete/company', 'uses' => 'CompaniesController@postDelete']); + Route::post('{companyId}/edit', 'CompaniesController@postEdit'); + Route::post('create', 'CompaniesController@postCreate'); + }); + + # Manufacturers + Route::group([ 'prefix' => 'manufacturers' ], function () { + + Route::get('/', [ 'as' => 'manufacturers', 'uses' => 'ManufacturersController@getIndex' ]); + Route::get( + 'create', + [ 'as' => 'create/manufacturer', 'uses' => 'ManufacturersController@getCreate' ] + ); + Route::post('create', 'ManufacturersController@postCreate'); + Route::get( + '{manufacturerId}/edit', + [ 'as' => 'update/manufacturer', 'uses' => 'ManufacturersController@getEdit' ] + ); + Route::post('{manufacturerId}/edit', 'ManufacturersController@postEdit'); + Route::get( + '{manufacturerId}/delete', + [ 'as' => 'delete/manufacturer', 'uses' => 'ManufacturersController@getDelete' ] + ); + Route::get( + '{manufacturerId}/view', + [ 'as' => 'view/manufacturer', 'uses' => 'ManufacturersController@getView' ] + ); + }); + + # Suppliers + Route::group([ 'prefix' => 'suppliers' ], function () { + + Route::get('/', [ 'as' => 'suppliers', 'uses' => 'SuppliersController@getIndex' ]); + Route::get('create', [ 'as' => 'create/supplier', 'uses' => 'SuppliersController@getCreate' ]); + Route::post('create', 'SuppliersController@postCreate'); + Route::get( + '{supplierId}/edit', + [ 'as' => 'update/supplier', 'uses' => 'SuppliersController@getEdit' ] + ); + Route::post('{supplierId}/edit', 'SuppliersController@postEdit'); + Route::get( + '{supplierId}/delete', + [ 'as' => 'delete/supplier', 'uses' => 'SuppliersController@getDelete' ] + ); + Route::get('{supplierId}/view', [ 'as' => 'view/supplier', 'uses' => 'SuppliersController@getView' ]); + }); + + # Categories + Route::group([ 'prefix' => 'categories' ], function () { + + Route::get('create', [ 'as' => 'create/category', 'uses' => 'CategoriesController@getCreate' ]); + Route::post('create', 'CategoriesController@postCreate'); + Route::get( + '{categoryId}/edit', + [ 'as' => 'update/category', 'uses' => 'CategoriesController@getEdit' ] + ); + Route::post('{categoryId}/edit', 'CategoriesController@postEdit'); + Route::get( + '{categoryId}/delete', + [ 'as' => 'delete/category', 'uses' => 'CategoriesController@getDelete' ] + ); + Route::get( + '{categoryId}/view', + [ 'as' => 'view/category', 'uses' => 'CategoriesController@getView' ] + ); + Route::get('/', [ 'as' => 'categories', 'uses' => 'CategoriesController@getIndex' ]); + }); + + # Depreciations + Route::group([ 'prefix' => 'depreciations' ], function () { + + Route::get('/', [ 'as' => 'depreciations', 'uses' => 'DepreciationsController@getIndex' ]); + Route::get( + 'create', + [ 'as' => 'create/depreciations', 'uses' => 'DepreciationsController@getCreate' ] + ); + Route::post('create', 'DepreciationsController@postCreate'); + Route::get( + '{depreciationId}/edit', + [ 'as' => 'update/depreciations', 'uses' => 'DepreciationsController@getEdit' ] + ); + Route::post('{depreciationId}/edit', 'DepreciationsController@postEdit'); + Route::get( + '{depreciationId}/delete', + [ 'as' => 'delete/depreciations', 'uses' => 'DepreciationsController@getDelete' ] + ); + }); + + # Locations + Route::group([ 'prefix' => 'locations' ], function () { + + Route::get('/', [ 'as' => 'locations', 'uses' => 'LocationsController@getIndex' ]); + Route::get('create', [ 'as' => 'create/location', 'uses' => 'LocationsController@getCreate' ]); + Route::post('create', 'LocationsController@postCreate'); + Route::get( + '{locationId}/edit', + [ 'as' => 'update/location', 'uses' => 'LocationsController@getEdit' ] + ); + Route::post('{locationId}/edit', 'LocationsController@postEdit'); + Route::get('{locationId}/view', 'LocationsController@getView'); + Route::get( + '{locationId}/delete', + [ 'as' => 'delete/location', 'uses' => 'LocationsController@getDelete' ] + ); + }); + + # Status Labels + Route::group([ 'prefix' => 'statuslabels' ], function () { + + Route::get('/', [ 'as' => 'statuslabels', 'uses' => 'StatuslabelsController@getIndex' ]); + Route::get('create', [ 'as' => 'create/statuslabel', 'uses' => 'StatuslabelsController@getCreate' ]); + Route::post('create', 'StatuslabelsController@postCreate'); + Route::get( + '{statuslabelId}/edit', + [ 'as' => 'update/statuslabel', 'uses' => 'StatuslabelsController@getEdit' ] + ); + Route::post('{statuslabelId}/edit', 'StatuslabelsController@postEdit'); + Route::get( + '{statuslabelId}/delete', + [ 'as' => 'delete/statuslabel', 'uses' => 'StatuslabelsController@getDelete' ] + ); + }); + + }); + + # Custom fields support + Route::get('custom_fields/create-field', ['uses' =>'CustomFieldsController@createField','as' => 'admin.custom_fields.create-field']); + Route::post('custom_fields/create-field', ['uses' => 'CustomFieldsController@storeField','as' => 'admin.custom_fields.store-field']); + Route::post('custom_fields/{id}/associate', ['uses' => 'CustomFieldsController@associate','as' => 'admin.custom_fields.associate']); + Route::match(['DELETE'], 'custom_fields/delete-field/{id}', ['uses' => 'CustomFieldsController@deleteField','as' => 'admin.custom_fields.delete-field']); + Route::resource('custom_fields', 'CustomFieldsController'); + + # User Management + Route::group([ 'prefix' => 'users' ], function () { + + Route::get('ldap', ['as' => 'ldap/user', 'uses' => 'UsersController@getLDAP' ]); + Route::post('ldap', 'UsersController@postLDAP'); + + Route::get('create', [ 'as' => 'create/user', 'uses' => 'UsersController@getCreate' ]); + Route::post('create', 'UsersController@postCreate'); + Route::get('import', [ 'as' => 'import/user', 'uses' => 'UsersController@getImport' ]); + Route::post('import', 'UsersController@postImport'); + Route::get('{userId}/edit', [ 'as' => 'update/user', 'uses' => 'UsersController@getEdit' ]); + Route::post('{userId}/edit', 'UsersController@postEdit'); + Route::get('{userId}/clone', [ 'as' => 'clone/user', 'uses' => 'UsersController@getClone' ]); + Route::post('{userId}/clone', 'UsersController@postCreate'); + Route::get('{userId}/delete', [ 'as' => 'delete/user', 'uses' => 'UsersController@getDelete' ]); + Route::get('{userId}/restore', [ 'as' => 'restore/user', 'uses' => 'UsersController@getRestore' ]); + Route::get('{userId}/view', [ 'as' => 'view/user', 'uses' => 'UsersController@getView' ]); + Route::get('{userId}/unsuspend', [ 'as' => 'unsuspend/user', 'uses' => 'UsersController@getUnsuspend' ]); + Route::get( + '{userId}/deletefile/{fileId}', + [ 'as' => 'delete/userfile', 'uses' => 'UsersController@getDeleteFile' ] + ); + Route::get( + '{userId}/showfile/{fileId}', + [ 'as' => 'show/userfile', 'uses' => 'UsersController@displayFile' ] + ); + + Route::post( + 'bulkedit', + [ + 'as' => 'users/bulkedit', + 'uses' => 'UsersController@postBulkEdit' + ] + ); + Route::post( + 'bulksave', + [ + 'as' => 'users/bulksave', + 'uses' => 'UsersController@postBulkSave' + ] + ); + + Route::get('/', [ 'as' => 'users', 'uses' => 'UsersController@getIndex' ]); + + }); + + # Group Management + Route::group([ 'prefix' => 'groups' ], function () { + + Route::get('/', [ 'as' => 'groups', 'uses' => 'GroupsController@getIndex' ]); + Route::get('create', [ 'as' => 'create/group', 'uses' => 'GroupsController@getCreate' ]); + Route::post('create', 'GroupsController@postCreate'); + Route::get('{groupId}/edit', [ 'as' => 'update/group', 'uses' => 'GroupsController@getEdit' ]); + Route::post('{groupId}/edit', 'GroupsController@postEdit'); + Route::get('{groupId}/delete', [ 'as' => 'delete/group', 'uses' => 'GroupsController@getDelete' ]); + Route::get('{groupId}/restore', [ 'as' => 'restore/group', 'uses' => 'GroupsController@getRestore' ]); + Route::get('{groupId}/view', [ 'as' => 'view/group', 'uses' => 'GroupsController@getView' ]); + }); + + # Dashboard + Route::get('/', [ 'as' => 'admin', 'uses' => 'DashboardController@getIndex' ]); + +}); + +/* +|-------------------------------------------------------------------------- +| Account Routes +|-------------------------------------------------------------------------- +| +| +| +*/ +Route::group([ 'prefix' => 'account', 'middleware' => 'auth' ], function () { + + # Profile + Route::get('profile', [ 'as' => 'profile', 'uses' => 'ProfileController@getIndex' ]); + Route::post('profile', 'ProfileController@postIndex'); + + # Change Password + Route::get('change-password', [ 'as' => 'change-password', 'uses' => 'ChangePasswordController@getIndex' ]); + Route::post('change-password', 'ChangePasswordController@postIndex'); + + # View Assets + Route::get('view-assets', [ 'as' => 'view-assets', 'uses' => 'ViewAssetsController@getIndex' ]); + + # Change Email + Route::get('change-email', [ 'as' => 'change-email', 'uses' => 'ChangeEmailController@getIndex' ]); + Route::post('change-email', 'ChangeEmailController@postIndex'); + + # Accept Asset + Route::get( + 'accept-asset/{logID}', + [ 'as' => 'account/accept-assets', 'uses' => 'ViewAssetsController@getAcceptAsset' ] + ); + Route::post( + 'accept-asset/{logID}', + [ 'as' => 'account/asset-accepted', 'uses' => 'ViewAssetsController@postAcceptAsset' ] + ); + + # Profile + Route::get( + 'requestable-assets', + [ 'as' => 'requestable-assets', 'uses' => 'ViewAssetsController@getRequestableIndex' ] + ); + Route::get( + 'request-asset/{assetId}', + [ 'as' => 'account/request-asset', 'uses' => 'ViewAssetsController@getRequestAsset' ] + ); + + # Account Dashboard + Route::get('/', [ 'as' => 'account', 'uses' => 'ProfileController@getDashboard' ]); + +}); + + +Route::group(['middleware' => ['web','auth','authorize:reports']], function () { + + Route::get( + 'reports/depreciation', + [ 'as' => 'reports/depreciation', 'uses' => 'ReportsController@getDeprecationReport' ] + ); + Route::get( + 'reports/export/depreciation', + [ 'as' => 'reports/export/depreciation', 'uses' => 'ReportsController@exportDeprecationReport' ] + ); + Route::get( + 'reports/asset_maintenances', + [ 'as' => 'reports/asset_maintenances', 'uses' => 'ReportsController@getAssetMaintenancesReport' ] + ); + Route::get( + 'reports/export/asset_maintenances', + [ + 'as' => 'reports/export/asset_maintenances', + 'uses' => 'ReportsController@exportAssetMaintenancesReport' + ] + ); + Route::get( + 'reports/licenses', + [ 'as' => 'reports/licenses', 'uses' => 'ReportsController@getLicenseReport' ] + ); + Route::get( + 'reports/export/licenses', + [ 'as' => 'reports/export/licenses', 'uses' => 'ReportsController@exportLicenseReport' ] + ); + Route::get('reports/assets', [ 'as' => 'reports/assets', 'uses' => 'ReportsController@getAssetsReport' ]); + Route::get( + 'reports/export/assets', + [ 'as' => 'reports/export/assets', 'uses' => 'ReportsController@exportAssetReport' ] + ); + Route::get('reports/accessories', [ 'as' => 'reports/accessories', 'uses' => 'ReportsController@getAccessoryReport' ]); + Route::get( + 'reports/export/accessories', + [ 'as' => 'reports/export/accessories', 'uses' => 'ReportsController@exportAccessoryReport' ] + ); + Route::get('reports/custom', [ 'as' => 'reports/custom', 'uses' => 'ReportsController@getCustomReport' ]); + Route::post('reports/custom', 'ReportsController@postCustom'); + + Route::get( + 'reports/activity', + [ 'as' => 'reports/activity', 'uses' => 'ReportsController@getActivityReport' ] + ); + Route::get( + 'reports/unaccepted_assets', + [ 'as' => 'reports/unaccepted_assets', 'uses' => 'ReportsController@getAssetAcceptanceReport' ] + ); + Route::get( + 'reports/export/unaccepted_assets', + [ 'as' => 'reports/export/unaccepted_assets', 'uses' => 'ReportsController@exportAssetAcceptanceReport' ] + ); +}); + + +/* +|-------------------------------------------------------------------------- +| Setup Routes +|-------------------------------------------------------------------------- +| +| +| +*/ +Route::group([ 'prefix' => 'setup' ], function () { + Route::get( + 'user', + [ + 'middleware' => 'web', + 'as' => 'setup.user', + 'uses' => 'SettingsController@getSetupUser' ] + ); + + Route::post( + 'user', + [ + 'middleware' => 'web', + 'as' => 'setup.user.save', + 'uses' => 'SettingsController@postSaveFirstAdmin' ] + ); + + + Route::get( + 'migrate', + [ + 'middleware' => 'web', + 'as' => 'setup.migrate', + 'uses' => 'SettingsController@getSetupMigrate' ] + ); + + Route::get( + 'done', + [ + 'middleware' => 'web', + 'as' => 'setup.done', + 'uses' => 'SettingsController@getSetupDone' ] + ); + + Route::get( + 'mailtest', + [ + 'middleware' => 'web', + 'as' => 'setup.mailtest', + 'uses' => 'SettingsController@ajaxTestEmail' ] + ); + + + Route::get( + '/', + [ + 'middleware' => 'web', + 'as' => 'setup', + 'uses' => 'SettingsController@getSetupIndex' ] + ); + +}); + + +Route::get( + '/', + [ + 'as' => 'home', + 'middleware' => 'auth', + 'uses' => 'DashboardController@getIndex' ] +); + +Route::group(['middleware' => 'web'], function () { + Route::auth(); +}); + +Route::get('home', function () { + return redirect('/'); +}); diff --git a/app/Jobs/Job.php b/app/Jobs/Job.php new file mode 100644 index 0000000000..55ece29acb --- /dev/null +++ b/app/Jobs/Job.php @@ -0,0 +1,21 @@ + 'required|min:3|max:255', + 'qty' => 'required|integer|min:1', + 'category_id' => 'required|integer', + 'company_id' => 'integer', + 'min_amt' => 'integer|min:1', + ); + + + /** + * Whether the model should inject it's identifier to the unique + * validation rules before attempting validation. If this property + * is not set in the model it will default to true. + * + * @var boolean + */ + protected $injectUniqueIdentifier = true; + use ValidatingTrait; + + /** + * The attributes that are mass assignable. + * + * @var array + */ + protected $fillable = ['name','qty','category_id']; + + public function company() + { + return $this->belongsTo('\App\Models\Company', 'company_id'); + } + + public function location() + { + return $this->belongsTo('\App\Models\Location', 'location_id'); + } + + public function category() + { + return $this->belongsTo('\App\Models\Category', 'category_id')->where('category_type', '=', 'accessory'); + } + + /** + * Get action logs for this accessory + */ + public function assetlog() + { + return $this->hasMany('\App\Models\Actionlog', 'accessory_id')->where('asset_type', '=', 'accessory')->orderBy('created_at', 'desc')->withTrashed(); + } + + + public function users() + { + return $this->belongsToMany('\App\Models\User', 'accessories_users', 'accessory_id', 'assigned_to')->withPivot('id')->withTrashed(); + } + + public function hasUsers() + { + return $this->belongsToMany('\App\Models\User', 'accessories_users', 'accessory_id', 'assigned_to')->count(); + } + + public function checkin_email() + { + return $this->category->checkin_email; + } + + public function requireAcceptance() + { + return $this->category->require_acceptance; + } + + public function getEula() + { + + $Parsedown = new \Parsedown(); + + if ($this->category->eula_text) { + return $Parsedown->text(e($this->category->eula_text)); + } elseif ((Setting::getSettings()->default_eula_text) && ($this->category->use_default_eula=='1')) { + return $Parsedown->text(e(Setting::getSettings()->default_eula_text)); + } else { + return null; + } + + } + + public function numRemaining() + { + $checkedout = $this->users->count(); + $total = $this->qty; + $remaining = $total - $checkedout; + return $remaining; + } + + /** + * Query builder scope to search on text + * + * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param text $search Search term + * + * @return Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeTextSearch($query, $search) + { + $search = explode('+', $search); + + return $query->where(function ($query) use ($search) { + + foreach ($search as $search) { + $query->whereHas('category', function ($query) use ($search) { + $query->where('categories.name', 'LIKE', '%'.$search.'%'); + })->orWhere(function ($query) use ($search) { + $query->whereHas('company', function ($query) use ($search) { + $query->where('companies.name', 'LIKE', '%'.$search.'%'); + }); + })->orWhere(function ($query) use ($search) { + $query->whereHas('assetlog', function ($query) use ($search) { + $query->where('action_type', '=', 'checkout') + ->where('created_at', 'LIKE', '%'.$search.'%'); + }); + })->orWhere(function ($query) use ($search) { + $query->whereHas('location', function ($query) use ($search) { + $query->where('locations.name', 'LIKE', '%'.$search.'%'); + }); + })->orWhere('accessories.name', 'LIKE', '%'.$search.'%') + ->orWhere('accessories.order_number', 'LIKE', '%'.$search.'%') + ->orWhere('accessories.purchase_cost', 'LIKE', '%'.$search.'%') + ->orWhere('accessories.purchase_date', 'LIKE', '%'.$search.'%'); + } + }); + } + + /** + * Query builder scope to order on company + * + * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param text $order Order + * + * @return Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeOrderCompany($query, $order) + { + return $query->leftJoin('companies', 'accessories.company_id', '=', 'companies.id')->orderBy('companies.name', $order); + } + + /** + * Query builder scope to order on company + * + * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param text $order Order + * + * @return Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeOrderCategory($query, $order) + { + return $query->leftJoin('categories', 'accessories.category_id', '=', 'categories.id')->orderBy('categories.name', $order); + } + + /** + * Query builder scope to order on company + * + * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param text $order Order + * + * @return Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeOrderLocation($query, $order) + { + return $query->leftJoin('locations', 'consumables.location_id', '=', 'locations.id')->orderBy('locations.name', $order); + } +} diff --git a/app/Models/Actionlog.php b/app/Models/Actionlog.php new file mode 100755 index 0000000000..9c3041675a --- /dev/null +++ b/app/Models/Actionlog.php @@ -0,0 +1,164 @@ +belongsTo('\App\Models\Asset', 'asset_id') + ->withTrashed(); + } + + public function uploads() + { + + return $this->belongsTo('\App\Models\Asset', 'asset_id') + ->where('action_type', '=', 'uploaded') + ->withTrashed(); + } + + public function licenselog() + { + + return $this->belongsTo('\App\Models\License', 'asset_id') + ->withTrashed(); + } + + public function accessorylog() + { + + return $this->belongsTo('\App\Models\Accessory', 'accessory_id') + ->withTrashed(); + } + + public function consumablelog() + { + + return $this->belongsTo('\App\Models\Consumable', 'consumable_id') + ->withTrashed(); + } + + public function adminlog() + { + + return $this->belongsTo('\App\Models\User', 'user_id') + ->withTrashed(); + } + + public function userlog() + { + + return $this->belongsTo('\App\Models\User', 'checkedout_to') + ->withTrashed(); + } + + public function childlogs() + { + + return $this->hasMany('\App\Models\ActionLog', 'thread_id'); + } + + public function parentlog() + { + + return $this->belongsTo('\App\Models\ActionLog', 'thread_id'); + } + + /** + * Check if the file exists, and if it does, force a download + **/ + public function get_src() + { + + $file = storage_path() . '/app/private_uploads/' . $this->filename; + + return $file; + + } + + /** + * Get the parent category name + */ + public function logaction($actiontype) + { + + $this->action_type = $actiontype; + + if ($this->save()) { + return true; + } else { + return false; + } + } + + /** + * getListingOfActionLogsChronologicalOrder + * + * @return mixed + * @author Vincent Sposato + * @version v1.0 + */ + public function getListingOfActionLogsChronologicalOrder() + { + + return DB::table('asset_logs') + ->select('*') + ->where('action_type', '!=', 'uploaded') + ->orderBy('asset_id', 'asc') + ->orderBy('created_at', 'asc') + ->get(); + } + + /** + * getLatestCheckoutActionForAssets + * + * @return mixed + * @author Vincent Sposato + * @version v1.0 + */ + public function getLatestCheckoutActionForAssets() + { + + return DB::table('asset_logs') + ->select(DB::raw('asset_id, MAX(created_at) as last_created')) + ->where('action_type', '=', 'checkout') + ->groupBy('asset_id') + ->get(); + } + + /** + * scopeCheckoutWithoutAcceptance + * + * @param $query + * + * @return mixed + * @author Vincent Sposato + * @version v1.0 + */ + public function scopeCheckoutWithoutAcceptance($query) + { + + return $query->where('action_type', '=', 'checkout') + ->where('accepted_id', '=', null); + } +} diff --git a/app/Models/Asset.php b/app/Models/Asset.php new file mode 100644 index 0000000000..bb5ef40fb6 --- /dev/null +++ b/app/Models/Asset.php @@ -0,0 +1,811 @@ + 'min:2|max:255', + 'model_id' => 'required|integer', + 'status_id' => 'required|integer', + 'company_id' => 'integer', + 'warranty_months' => 'integer|min:0|max:240', + 'physical' => 'integer', + 'checkout_date' => 'date|max:10|min:10', + 'checkin_date' => 'date|max:10|min:10', + 'supplier_id' => 'integer', + 'asset_tag' => 'required|min:2|max:255|unique:assets,asset_tag,NULL,deleted_at', + 'status' => 'integer', + ]; + + + /** + * The attributes that are mass assignable. + * + * @var array + */ + protected $fillable = ['name','model_id','status_id','asset_tag']; + + + public function company() + { + return $this->belongsTo('\App\Models\Company', 'company_id'); + } + + + /** + * Checkout asset + */ + public function checkOutToUser($user, $admin, $checkout_at = null, $expected_checkin = null, $note = null, $name = null) + { + + if ($expected_checkin) { + $this->expected_checkin = $expected_checkin ; + } + + $this->last_checkout = $checkout_at; + + $this->assigneduser()->associate($user); + $this->name = $name; + + $settings = Setting::getSettings(); + + if ($this->requireAcceptance()) { + $this->accepted="pending"; + } + + if (!$user) { + return false; + } + + if ($this->save()) { + + $log_id = $this->createCheckoutLog($checkout_at, $admin, $user, $expected_checkin, $note); + + if ((($this->requireAcceptance()=='1') || ($this->getEula())) && ($user->email!='')) { + $this->checkOutNotifyMail($log_id, $user, $checkout_at, $expected_checkin, $note); + } + + if ($settings->slack_endpoint) { + $this->checkOutNotifySlack($settings, $admin, $note); + } + return true; + + } + return false; + + } + + public function checkOutNotifyMail($log_id, $user, $checkout_at, $expected_checkin, $note) + { + + $data['log_id'] = $log_id; + $data['eula'] = $this->getEula(); + $data['first_name'] = $user->first_name; + $data['item_name'] = $this->showAssetName(); + $data['checkout_date'] = $checkout_at; + $data['expected_checkin'] = $expected_checkin; + $data['item_tag'] = $this->asset_tag; + $data['note'] = $note; + $data['item_serial'] = $this->serial; + $data['require_acceptance'] = $this->requireAcceptance(); + + if ((($this->requireAcceptance()=='1') || ($this->getEula())) && (!config('app.lock_passwords'))) { + + \Mail::send('emails.accept-asset', $data, function ($m) use ($user) { + $m->to($user->email, $user->first_name . ' ' . $user->last_name); + $m->subject('Confirm asset delivery'); + }); + } + + } + + public function checkOutNotifySlack($settings, $admin, $note = null) + { + + if ($settings->slack_endpoint) { + + $slack_settings = [ + 'username' => $settings->botname, + 'channel' => $settings->slack_channel, + 'link_names' => true + ]; + + $client = new \Maknz\Slack\Client($settings->slack_endpoint, $slack_settings); + + try { + $client->attach([ + 'color' => 'good', + 'fields' => [ + [ + 'title' => 'Checked Out:', + 'value' => 'HARDWARE asset <'.config('app.url').'/hardware/'.$this->id.'/view'.'|'.$this->showAssetName().'> checked out to <'.config('app.url').'/admin/users/'.$this->assigned_to.'/view|'.$this->assigneduser->fullName().'> by <'.config('app.url').'/hardware/'.$this->id.'/view'.'|'.$admin->fullName().'>.' + ], + [ + 'title' => 'Note:', + 'value' => e($note) + ], + ] + ])->send('Asset Checked Out'); + + } catch (Exception $e) { + print_r($e); + } + } + + } + + + public function validationRules($id = '0') + { + return $this->rules; + } + + public function createCheckoutLog($checkout_at = null, $admin, $user, $expected_checkin = null, $note = null) + { + + $logaction = new \App\Models\Actionlog(); + $logaction->asset_id = $this->id; + $logaction->checkedout_to = $this->assigned_to; + $logaction->asset_type = 'hardware'; + if ($user) { + $logaction->location_id = $user->location_id; + } + + $logaction->adminlog()->associate($admin); + $logaction->note = $note; + if ($checkout_at) { + $logaction->created_at = $checkout_at; + } + $log = $logaction->logaction('checkout'); + return $logaction->id; + } + + + /** + * Set depreciation relationship + */ + public function depreciation() + { + return $this->model->belongsTo('\App\Models\Depreciation', 'depreciation_id'); + } + + /** + * Get depreciation attribute from associated asset model + */ + public function get_depreciation() + { + return $this->model->depreciation; + } + + /** + * Get uploads for this asset + */ + public function uploads() + { + + return $this->hasMany('\App\Models\Actionlog', 'asset_id') + ->where('asset_type', '=', 'hardware') + ->where('action_type', '=', 'uploaded') + ->whereNotNull('filename') + ->orderBy('created_at', 'desc'); + } + + public static function checkUploadIsImage($file) + { + // Check if the file is an image, so we can show a preview + $finfo = @finfo_open(FILEINFO_MIME_TYPE); // return mime type ala mimetype extension + $filetype = @finfo_file($finfo, $file); + finfo_close($finfo); + + if (($filetype=="image/jpeg") || ($filetype=="image/jpg") || ($filetype=="image/gif")) { + return true; + } + + return false; + } + + public function assigneduser() + { + return $this->belongsTo('\App\Models\User', 'assigned_to') + ->withTrashed(); + } + + /** + * Get the asset's location based on the assigned user + **/ + public function assetloc() + { + if ($this->assigneduser) { + return $this->assigneduser->userloc(); + } else { + return $this->belongsTo('\App\Models\Location', 'rtd_location_id'); + } + } + + /** + * Get the asset's location based on default RTD location + **/ + public function defaultLoc() + { + return $this->belongsTo('\App\Models\Location', 'rtd_location_id'); + } + + /** + * Get action logs for this asset + */ + public function assetlog() + { + return $this->hasMany('\App\Models\Actionlog', 'asset_id') + ->where('asset_type', '=', 'hardware') + ->orderBy('created_at', 'desc') + ->withTrashed(); + } + + + /** + * assetmaintenances + * Get improvements for this asset + * + * @return mixed + * @author Vincent Sposato + * @version v1.0 + */ + public function assetmaintenances() + { + + return $this->hasMany('\App\Models\AssetMaintenance', 'asset_id') + ->orderBy('created_at', 'desc') + ->withTrashed(); + } + + /** + * Get action logs for this asset + */ + public function adminuser() + { + return $this->belongsTo('\App\Models\User', 'user_id'); + } + + /** + * Get total assets + */ + public static function assetcount() + { + + return Asset::where('physical', '=', '1') + ->whereNull('deleted_at', 'and') + ->count(); + } + + /** + * Get total assets not checked out + */ + public static function availassetcount() + { + + return Asset::RTD() + ->whereNull('deleted_at') + ->count(); + + } + + /** + * Get requestable assets + */ + public static function getRequestable() + { + + return Asset::Requestable() + ->whereNull('deleted_at') + ->count(); + + } + + /** + * Get total assets + */ + public function assetstatus() + { + return $this->belongsTo('\App\Models\Statuslabel', 'status_id'); + } + + /** + * Get name for EULA + **/ + public function showAssetName() + { + + if ($this->name == '') { + return $this->model->name; + } else { + return $this->name; + } + } + + public function warrantee_expires() + { + $date = date_create($this->purchase_date); + date_add($date, date_interval_create_from_date_string($this->warranty_months . ' months')); + return date_format($date, 'Y-m-d'); + } + + + public function model() + { + return $this->belongsTo('\App\Models\AssetModel', 'model_id')->withTrashed(); + } + + public static function getExpiringWarrantee($days = 30) + { + + return Asset::where('archived', '=', '0') + ->whereNotNull('warranty_months') + ->whereNotNull('purchase_date') + ->whereNull('deleted_at') + ->whereRaw(\DB::raw('DATE_ADD(`purchase_date`,INTERVAL `warranty_months` MONTH) <= DATE(NOW() + INTERVAL ' + . $days + . ' DAY) AND DATE_ADD(`purchase_date`,INTERVAL `warranty_months` MONTH) > NOW()')) + ->orderBy('purchase_date', 'ASC') + ->get(); + } + + /** + * Get the license seat information + **/ + public function licenses() + { + return $this->belongsToMany('\App\Models\License', 'license_seats', 'asset_id', 'license_id'); + } + + public function licenseseats() + { + return $this->hasMany('\App\Models\LicenseSeat', 'asset_id'); + } + + public function supplier() + { + return $this->belongsTo('\App\Models\Supplier', 'supplier_id'); + } + + public function months_until_eol() + { + + $today = date("Y-m-d"); + $d1 = new DateTime($today); + $d2 = new DateTime($this->eol_date()); + + if ($this->eol_date() > $today) { + $interval = $d2->diff($d1); + } else { + $interval = null; + } + + return $interval; + } + + public function eol_date() + { + + if (( $this->purchase_date ) && ( $this->model )) { + $date = date_create($this->purchase_date); + date_add($date, date_interval_create_from_date_string($this->model->eol . ' months')); + return date_format($date, 'Y-m-d'); + } + + } + + /** + * Get auto-increment + */ + public static function autoincrement_asset() + { + + $settings = \App\Models\Setting::getSettings(); + + if ($settings->auto_increment_assets == '1') { + $asset_tag = \DB::table('assets') + ->where('physical', '=', '1') + ->max('id'); + return $settings->auto_increment_prefix.($asset_tag + 1); + } else { + return false; + } + } + + public function checkin_email() + { + return $this->model->category->checkin_email; + } + + public function requireAcceptance() + { + return $this->model->category->require_acceptance; + } + + public function getEula() + { + + $Parsedown = new \Parsedown(); + + if ($this->model->category->eula_text) { + return $Parsedown->text(e($this->model->category->eula_text)); + } elseif ($this->model->category->use_default_eula == '1') { + return $Parsedown->text(e(Setting::getSettings()->default_eula_text)); + } else { + return null; + } + + } + + + /** + * ----------------------------------------------- + * BEGIN QUERY SCOPES + * ----------------------------------------------- + **/ + + /** + * Query builder scope for hardware + * + * @param Illuminate\Database\Query\Builder $query Query builder instance + * + * @return Illuminate\Database\Query\Builder Modified query builder + */ + + public function scopeHardware($query) + { + + return $query->where('physical', '=', '1'); + } + + /** + * Query builder scope for pending assets + * + * @param Illuminate\Database\Query\Builder $query Query builder instance + * + * @return Illuminate\Database\Query\Builder Modified query builder + */ + + public function scopePending($query) + { + + return $query->whereHas('assetstatus', function ($query) { + + $query->where('deployable', '=', 0) + ->where('pending', '=', 1) + ->where('archived', '=', 0); + }); + } + + /** + * Query builder scope for RTD assets + * + * @param Illuminate\Database\Query\Builder $query Query builder instance + * + * @return Illuminate\Database\Query\Builder Modified query builder + */ + + public function scopeRTD($query) + { + + return $query->whereNULL('assigned_to') + ->whereHas('assetstatus', function ($query) { + + $query->where('deployable', '=', 1) + ->where('pending', '=', 0) + ->where('archived', '=', 0); + }); + } + + /** + * Query builder scope for Undeployable assets + * + * @param Illuminate\Database\Query\Builder $query Query builder instance + * + * @return Illuminate\Database\Query\Builder Modified query builder + */ + + public function scopeUndeployable($query) + { + + return $query->whereHas('assetstatus', function ($query) { + + $query->where('deployable', '=', 0) + ->where('pending', '=', 0) + ->where('archived', '=', 0); + }); + } + + /** + * Query builder scope for Archived assets + * + * @param Illuminate\Database\Query\Builder $query Query builder instance + * + * @return Illuminate\Database\Query\Builder Modified query builder + */ + + public function scopeArchived($query) + { + + return $query->whereHas('assetstatus', function ($query) { + + $query->where('deployable', '=', 0) + ->where('pending', '=', 0) + ->where('archived', '=', 1); + }); + } + + /** + * Query builder scope for Deployed assets + * + * @param Illuminate\Database\Query\Builder $query Query builder instance + * + * @return Illuminate\Database\Query\Builder Modified query builder + */ + + public function scopeDeployed($query) + { + + return $query->where('assigned_to', '>', '0'); + } + + /** + * Query builder scope for Requestable assets + * + * @param Illuminate\Database\Query\Builder $query Query builder instance + * + * @return Illuminate\Database\Query\Builder Modified query builder + */ + + public function scopeRequestableAssets($query) + { + + return $query->where('requestable', '=', 1) + ->whereHas('assetstatus', function ($query) { + + $query->where('deployable', '=', 1) + ->where('pending', '=', 0) + ->where('archived', '=', 0); + }); + } + + + /** + * Query builder scope for Deleted assets + * + * @param Illuminate\Database\Query\Builder $query Query builder instance + * + * @return Illuminate\Database\Query\Builder Modified query builder + */ + + public function scopeDeleted($query) + { + return $query->whereNotNull('deleted_at'); + } + + /** + * scopeInModelList + * Get all assets in the provided listing of model ids + * + * @param $query + * @param array $modelIdListing + * + * @return mixed + * @author Vincent Sposato + * @version v1.0 + */ + public function scopeInModelList($query, array $modelIdListing) + { + return $query->whereIn('model_id', $modelIdListing); + } + + /** + * Query builder scope to get not-yet-accepted assets + * + * @param Illuminate\Database\Query\Builder $query Query builder instance + * + * @return Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeNotYetAccepted($query) + { + return $query->where("accepted", "=", "pending"); + } + + /** + * Query builder scope to get rejected assets + * + * @param Illuminate\Database\Query\Builder $query Query builder instance + * + * @return Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeRejected($query) + { + return $query->where("accepted", "=", "rejected"); + } + + + /** + * Query builder scope to get accepted assets + * + * @param Illuminate\Database\Query\Builder $query Query builder instance + * + * @return Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeAccepted($query) + { + return $uery->where("accepted", "=", "accepted"); + } + + + /** + * Query builder scope to search on text for complex Bootstrap Tables API + * + * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param text $search Search term + * + * @return Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeTextSearch($query, $search) + { + $search = explode(' OR ', $search); + + return $query->where(function ($query) use ($search) { + + foreach ($search as $search) { + $query->whereHas('model', function ($query) use ($search) { + $query->whereHas('category', function ($query) use ($search) { + $query->where(function ($query) use ($search) { + $query->where('categories.name', 'LIKE', '%'.$search.'%') + ->orWhere('models.name', 'LIKE', '%'.$search.'%'); + }); + }); + })->orWhere(function ($query) use ($search) { + $query->whereHas('assetstatus', function ($query) use ($search) { + $query->where('status_labels.name', 'LIKE', '%'.$search.'%'); + }); + })->orWhere(function ($query) use ($search) { + $query->whereHas('company', function ($query) use ($search) { + $query->where('companies.name', 'LIKE', '%'.$search.'%'); + }); + })->orWhere(function ($query) use ($search) { + $query->whereHas('defaultLoc', function ($query) use ($search) { + $query->where('locations.name', 'LIKE', '%'.$search.'%'); + }); + })->orWhere(function ($query) use ($search) { + $query->whereHas('assigneduser', function ($query) use ($search) { + $query->where(function ($query) use ($search) { + $query->where('users.first_name', 'LIKE', '%'.$search.'%') + ->orWhere('users.last_name', 'LIKE', '%'.$search.'%') + ->orWhere(function ($query) use ($search) { + $query->whereHas('userloc', function ($query) use ($search) { + $query->where('locations.name', 'LIKE', '%'.$search.'%'); + }); + }); + }); + }); + })->orWhere('assets.name', 'LIKE', '%'.$search.'%') + ->orWhere('assets.asset_tag', 'LIKE', '%'.$search.'%') + ->orWhere('assets.serial', 'LIKE', '%'.$search.'%') + ->orWhere('assets.order_number', 'LIKE', '%'.$search.'%') + ->orWhere('assets.notes', 'LIKE', '%'.$search.'%'); + } + foreach (CustomField::all() as $field) { + $query->orWhere($field->db_column_name(), 'LIKE', "%$search%"); + } + }); + } + + /** + * Query builder scope to order on model + * + * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param text $order Order + * + * @return Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeOrderModels($query, $order) + { + return $query->join('models', 'assets.model_id', '=', 'models.id')->orderBy('models.name', $order); + } + + + /** + * Query builder scope to order on assigned user + * + * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param text $order Order + * + * @return Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeOrderAssigned($query, $order) + { + return $query->join('users', 'assets.assigned_to', '=', 'users.id')->orderBy('users.first_name', $order)->orderBy('users.last_name', $order); + } + + /** + * Query builder scope to order on status + * + * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param text $order Order + * + * @return Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeOrderStatus($query, $order) + { + return $query->join('status_labels', 'assets.status_id', '=', 'status_labels.id')->orderBy('status_labels.name', $order); + } + + /** + * Query builder scope to order on company + * + * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param text $order Order + * + * @return Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeOrderCompany($query, $order) + { + return $query->leftJoin('companies', 'assets.company_id', '=', 'companies.id')->orderBy('companies.name', $order); + } + + /** + * Query builder scope to order on category + * + * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param text $order Order + * + * @return Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeOrderCategory($query, $order) + { + return $query->join('models', 'assets.model_id', '=', 'models.id') + ->join('categories', 'models.category_id', '=', 'categories.id') + ->orderBy('categories.name', $order); + } + + /** + * Query builder scope to order on model + * + * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param text $order Order + * + * @return Illuminate\Database\Query\Builder Modified query builder + * TODO: Extend this method out for checked out assets as well. Right now it + * only checks the location name related to rtd_location_id + */ + public function scopeOrderLocation($query, $order) + { + return $query->join('locations', 'locations.id', '=', 'assets.rtd_location_id')->orderBy('locations.name', $order); + } +} diff --git a/app/Models/AssetMaintenance.php b/app/Models/AssetMaintenance.php new file mode 100644 index 0000000000..065a7c265d --- /dev/null +++ b/app/Models/AssetMaintenance.php @@ -0,0 +1,116 @@ + 'required|integer', + 'supplier_id' => 'required|integer', + 'asset_maintenance_type' => 'required', + 'title' => 'required|max:100', + 'is_warranty' => 'boolean', + 'start_date' => 'required|date_format:Y-m-d', + 'completion_date' => 'date_format:Y-m-d', + 'notes' => 'string', + 'cost' => 'numeric' + ]; + + public function getCompanyableParents() + { + return [ 'asset' ]; + } + + /** + * getImprovementOptions + * + * @return array + * @author Vincent Sposato + * @version v1.0 + */ + public static function getImprovementOptions() + { + + return [ + Lang::get('admin/asset_maintenances/general.maintenance') => Lang::get('admin/asset_maintenances/general.maintenance'), + Lang::get('admin/asset_maintenances/general.repair') => Lang::get('admin/asset_maintenances/general.repair'), + Lang::get('admin/asset_maintenances/general.upgrade') => Lang::get('admin/asset_maintenances/general.upgrade') + ]; + } + + /** + * asset + * Get asset for this improvement + * + * @return mixed + * @author Vincent Sposato + * @version v1.0 + */ + public function asset() + { + + return $this->belongsTo('\App\Models\Asset', 'asset_id') + ->withTrashed(); + } + + public function supplier() + { + + return $this->belongsTo('\App\Models\Supplier', 'supplier_id') + ->withTrashed(); + } + + /** + * ----------------------------------------------- + * BEGIN QUERY SCOPES + * ----------------------------------------------- + **/ + + /** + * Query builder scope for Deleted assets + * + * @param Illuminate\Database\Query\Builder $query Query builder instance + * + * @return Illuminate\Database\Query\Builder Modified query builder + */ + + public function scopeDeleted($query) + { + + return $query->whereNotNull('deleted_at'); + } + + /** + * Query builder scope to search on text + * + * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param text $search Search term + * + * @return Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeTextSearch($query, $search) + { + + return $query->where(function ($query) use ($search) { + + $query->where('title', 'LIKE', '%'.$search.'%') + ->orWhere('notes', 'LIKE', '%'.$search.'%') + ->orWhere('asset_maintenance_type', 'LIKE', '%'.$search.'%') + ->orWhere('cost', 'LIKE', '%'.$search.'%') + ->orWhere('start_date', 'LIKE', '%'.$search.'%') + ->orWhere('completion_date', 'LIKE', '%'.$search.'%'); + }); + } +} diff --git a/app/Models/AssetModel.php b/app/Models/AssetModel.php new file mode 100755 index 0000000000..549326e143 --- /dev/null +++ b/app/Models/AssetModel.php @@ -0,0 +1,149 @@ + 'required|min:2|max:255', + 'modelno' => 'min:1|max:255', + 'category_id' => 'required|integer', + 'manufacturer_id' => 'required|integer', + 'eol' => 'integer:min:0|max:240', + 'user_id' => 'integer', + ); + + /** + * Whether the model should inject it's identifier to the unique + * validation rules before attempting validation. If this property + * is not set in the model it will default to true. + * + * @var boolean + */ + protected $injectUniqueIdentifier = true; + use ValidatingTrait; + + /** + * The attributes that are mass assignable. + * + * @var array + */ + protected $fillable = ['name','manufacturer_id','category_id','eol']; + + + + public function assets() + { + return $this->hasMany('\App\Models\Asset', 'model_id'); + } + + public function category() + { + return $this->belongsTo('\App\Models\Category', 'category_id'); + } + + public function depreciation() + { + return $this->belongsTo('\App\Models\Depreciation', 'depreciation_id'); + } + + public function adminuser() + { + return $this->belongsTo('\App\Models\User', 'user_id'); + } + + public function manufacturer() + { + return $this->belongsTo('\App\Models\Manufacturer', 'manufacturer_id'); + } + + public function fieldset() + { + return $this->belongsTo('\App\Models\CustomFieldset', 'fieldset_id'); + } + + public function getNote() + { + + $Parsedown = new \Parsedown(); + + if ($this->note) { + return $Parsedown->text(e($this->note)); + } + + } + + /** + * ----------------------------------------------- + * BEGIN QUERY SCOPES + * ----------------------------------------------- + **/ + + /** + * Query builder scope for Deleted assets + * + * @param Illuminate\Database\Query\Builder $query Query builder instance + * @return Illuminate\Database\Query\Builder Modified query builder + */ + + public function scopeDeleted($query) + { + return $query->whereNotNull('deleted_at'); + } + + /** + * scopeInCategory + * Get all models that are in the array of category ids + * + * @param $query + * @param array $categoryIdListing + * + * @return mixed + * @author Vincent Sposato + * @version v1.0 + */ + public function scopeInCategory($query, array $categoryIdListing) + { + + return $query->whereIn('category_id', $categoryIdListing); + } + + /** + * Query builder scope to search on text + * + * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param text $search Search term + * + * @return Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeTextSearch($query, $search) + { + + return $query->where('name', 'LIKE', "%$search%") + ->orWhere('modelno', 'LIKE', "%$search%") + ->orWhere(function ($query) use ($search) { + $query->whereHas('depreciation', function ($query) use ($search) { + $query->where('name', 'LIKE', '%'.$search.'%'); + }); + }) + ->orWhere(function ($query) use ($search) { + $query->whereHas('category', function ($query) use ($search) { + $query->where('name', 'LIKE', '%'.$search.'%'); + }); + }) + ->orWhere(function ($query) use ($search) { + $query->whereHas('manufacturer', function ($query) use ($search) { + $query->where('name', 'LIKE', '%'.$search.'%'); + }); + }); + + } +} diff --git a/app/Models/Category.php b/app/Models/Category.php new file mode 100755 index 0000000000..aac697635e --- /dev/null +++ b/app/Models/Category.php @@ -0,0 +1,135 @@ + 'numeric', + 'name' => 'required|min:3|max:255|unique:categories,name,NULL,deleted_at', + 'category_type' => 'required', + ); + + /** + * Whether the model should inject it's identifier to the unique + * validation rules before attempting validation. If this property + * is not set in the model it will default to true. + * + * @var boolean + */ + protected $injectUniqueIdentifier = true; + use ValidatingTrait; + + + /** + * The attributes that are mass assignable. + * + * @var array + */ + protected $fillable = ['name','category_type']; + + + public function has_models() + { + return $this->hasMany('\App\Models\AssetModel', 'category_id')->count(); + } + + public function accessories() + { + return $this->hasMany('\App\Models\Accessory'); + } + + public function consumables() + { + return $this->hasMany('\App\Models\Consumable'); + } + + public function components() + { + return $this->hasMany('\App\Models\Component'); + } + + public function itemCount() + { + switch ($this->category_type) { + case 'asset': + return $this->assets->count(); + case 'accessory': + return $this->accessories->count(); + case 'component': + return $this->components->count(); + case 'consumable': + return $this->consumables->count(); + } + return '0'; + } + + public function assets() + { + return $this->hasManyThrough('\App\Models\Asset', '\App\Models\AssetModel', 'category_id', 'model_id'); + } + + public function models() + { + return $this->hasMany('\App\Models\AssetModel', 'category_id'); + } + + public function getEula() + { + + $Parsedown = new \Parsedown(); + + if ($this->eula_text) { + return $Parsedown->text(e($this->eula_text)); + } elseif ((Setting::getSettings()->default_eula_text) && ($this->use_default_eula=='1')) { + return $Parsedown->text(e(Setting::getSettings()->default_eula_text)); + } else { + return null; + } + + } + + /** + * scopeRequiresAcceptance + * + * @param $query + * + * @return mixed + * @author Vincent Sposato + * @version v1.0 + */ + public function scopeRequiresAcceptance($query) + { + + return $query->where('require_acceptance', '=', true); + } + + /** + * Query builder scope to search on text + * + * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param text $search Search term + * + * @return Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeTextSearch($query, $search) + { + + return $query->where(function ($query) use ($search) { + + $query->where('name', 'LIKE', '%'.$search.'%') + ->orWhere('category_type', 'LIKE', '%'.$search.'%'); + }); + } +} diff --git a/app/Models/Company.php b/app/Models/Company.php new file mode 100644 index 0000000000..8c1e72da1b --- /dev/null +++ b/app/Models/Company.php @@ -0,0 +1,167 @@ + 'required|min:2|max:255|unique:companies,name']; + + /** + * Whether the model should inject it's identifier to the unique + * validation rules before attempting validation. If this property + * is not set in the model it will default to true. + * + * @var boolean + */ + protected $injectUniqueIdentifier = true; + use ValidatingTrait; + + + /** + * The attributes that are mass assignable. + * + * @var array + */ + protected $fillable = ['name']; + + private static function isFullMultipleCompanySupportEnabled() + { + $settings = Setting::getSettings(); + + // NOTE: this can happen when seeding the database + if (is_null($settings)) { + return false; + } else { + return $settings->full_multiple_companies_support == 1; + } + } + + private static function scopeCompanyablesDirectly($query, $column = 'company_id') + { + if (Auth::user()) { + $company_id = Auth::user()->company_id; + } else { + $company_id = null; + } + + if ($company_id == null) { + return $query; + } else { + return $query->where($column, '=', $company_id); + } + } + + public static function getSelectList() + { + $select_company = Lang::get('general.select_company'); + return ['0' => $select_company] + DB::table('companies')->orderBy('name', 'ASC')->lists('name', 'id'); + } + + public static function getIdFromInput($unescaped_input) + { + $escaped_input = e($unescaped_input); + + if ($escaped_input == '0') { + return null; + } else { + return $escaped_input; + } + } + + public static function getIdForCurrentUser($unescaped_input) + { + if (!static::isFullMultipleCompanySupportEnabled()) { + return static::getIdFromInput($unescaped_input); + } else { + $current_user = Auth::user(); + + if ($current_user->company_id != null) { + return $current_user->company_id; + } else { + return static::getIdFromInput($unescaped_input); + } + } + } + + public static function isCurrentUserHasAccess($companyable) + { + if (is_null($companyable)) { + return false; + } elseif (!static::isFullMultipleCompanySupportEnabled()) { + return true; + } else { + $current_user_company_id = Auth::user()->company_id; + $companyable_company_id = $companyable->company_id; + + return ($current_user_company_id == null || $current_user_company_id == $companyable_company_id); + } + } + + public static function isCurrentUserAuthorized() + { + return (!static::isFullMultipleCompanySupportEnabled() || Auth::user()->company_id == null); + } + + public static function canManageUsersCompanies() + { + return (!static::isFullMultipleCompanySupportEnabled() || Auth::user()->isSuperUser() || + Auth::user()->company_id == null); + } + + public static function getIdForUser($unescaped_input) + { + if (!static::isFullMultipleCompanySupportEnabled() || Auth::user()->isSuperUser()) { + return static::getIdFromInput($unescaped_input); + } else { + return static::getIdForCurrentUser($unescaped_input); + } + } + + public static function scopeCompanyables($query, $column = 'company_id') + { + if (!static::isFullMultipleCompanySupportEnabled()) { + return $query; + } else { + return static::scopeCompanyablesDirectly($query, $column); + } + } + + public static function scopeCompanyableChildren(array $companyable_names, $query) + { + if (count($companyable_names) == 0) { + throw new Exception('No Companyable Children to scope'); + } elseif (!static::isFullMultipleCompanySupportEnabled()) { + return $query; + } else { + $f = function ($q) { + + static::scopeCompanyablesDirectly($q); + }; + + $q = $query->where(function ($q) use ($companyable_names, $f) { + $q2 = $q->whereHas($companyable_names[0], $f); + + for ($i = 1; $i < count($companyable_names); $i++) { + $q2 = $q2->orWhereHas($companyable_names[$i], $f); + } + }); + return $q; + } + } + + public static function getName($companyable) + { + $company = $companyable->company; + + if (is_null($company)) { + return ''; + } else { + return e($company->name); + } + } +} diff --git a/app/Models/CompanyableChildScope.php b/app/Models/CompanyableChildScope.php new file mode 100644 index 0000000000..6817d2f521 --- /dev/null +++ b/app/Models/CompanyableChildScope.php @@ -0,0 +1,32 @@ +getModel(); + return Company::scopeCompanyableChildren($model->getCompanyableParents(), $builder); + } + + /** + * @todo IMPLEMENT + * Remove the scope from the given Eloquent query builder. + * + * @param \Illuminate\Database\Eloquent\Builder $builder + * @return void + */ + public function remove(Builder $builder) + { + } +} diff --git a/app/Models/CompanyableChildTrait.php b/app/Models/CompanyableChildTrait.php new file mode 100644 index 0000000000..02682d0bab --- /dev/null +++ b/app/Models/CompanyableChildTrait.php @@ -0,0 +1,15 @@ + 'required|min:3|max:255', + 'min_amt' => 'integer|min:1', + ); + + /** + * Whether the model should inject it's identifier to the unique + * validation rules before attempting validation. If this property + * is not set in the model it will default to true. + * + * @var boolean + */ + protected $injectUniqueIdentifier = true; + use ValidatingTrait; + + /** + * The attributes that are mass assignable. + * + * @var array + */ + protected $fillable = ['name','company_id','category_id']; + + public function location() + { + return $this->belongsTo('\App\Models\Location', 'location_id'); + } + + public function assets() + { + return $this->belongsToMany('\App\Models\Asset', 'components_assets')->withPivot('assigned_qty', 'created_at', 'user_id'); + } + + public function admin() + { + return $this->belongsTo('\App\Models\User', 'user_id'); + } + + public function company() + { + return $this->belongsTo('\App\Models\Company', 'company_id'); + } + + + public function category() + { + return $this->belongsTo('\App\Models\Category', 'category_id'); + } + + /** + * Get action logs for this consumable + */ + public function assetlog() + { + return $this->hasMany('\App\Models\Actionlog', 'component_id')->where('asset_type', '=', 'component')->orderBy('created_at', 'desc')->withTrashed(); + } + + + public function numRemaining() + { + $checkedout = 0; + + foreach ($this->assets as $checkout) { + $checkedout += $checkout->pivot->assigned_qty; + } + + + $total = $this->total_qty; + $remaining = $total - $checkedout; + return $remaining; + } + + + /** + * Query builder scope to search on text + * + * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param text $search Search term + * + * @return Illuminate\Database\Query\Builder Modified query builder + */ + /** + * Query builder scope to search on text + * + * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param text $search Search term + * + * @return Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeTextSearch($query, $search) + { + $search = explode(' ', $search); + + return $query->where(function ($query) use ($search) { + + foreach ($search as $search) { + $query->whereHas('category', function ($query) use ($search) { + $query->where('categories.name', 'LIKE', '%'.$search.'%'); + })->orWhere(function ($query) use ($search) { + $query->whereHas('company', function ($query) use ($search) { + $query->where('companies.name', 'LIKE', '%'.$search.'%'); + }); + })->orWhere(function ($query) use ($search) { + $query->whereHas('location', function ($query) use ($search) { + $query->where('locations.name', 'LIKE', '%'.$search.'%'); + }); + })->orWhere('components.name', 'LIKE', '%'.$search.'%') + ->orWhere('components.order_number', 'LIKE', '%'.$search.'%') + ->orWhere('components.purchase_cost', 'LIKE', '%'.$search.'%') + ->orWhere('components.purchase_date', 'LIKE', '%'.$search.'%'); + } + }); + } + + /** + * Query builder scope to order on company + * + * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param text $order Order + * + * @return Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeOrderCategory($query, $order) + { + return $query->join('categories', 'components.category_id', '=', 'categories.id')->orderBy('categories.name', $order); + } + + /** + * Query builder scope to order on company + * + * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param text $order Order + * + * @return Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeOrderLocation($query, $order) + { + return $query->leftJoin('locations', 'components.location_id', '=', 'locations.id')->orderBy('locations.name', $order); + } + + + /** + * Query builder scope to order on company + * + * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param text $order Order + * + * @return Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeOrderCompany($query, $order) + { + return $query->leftJoin('companies', 'components.company_id', '=', 'companies.id')->orderBy('companies.name', $order); + } +} diff --git a/app/Models/Consumable.php b/app/Models/Consumable.php new file mode 100644 index 0000000000..965e5ce5ef --- /dev/null +++ b/app/Models/Consumable.php @@ -0,0 +1,205 @@ + 'required|min:3|max:255', + 'qty' => 'required|integer|min:0', + 'category_id' => 'required|integer', + 'company_id' => 'integer', + 'min_amt' => 'integer|min:1', + ); + + /** + * Whether the model should inject it's identifier to the unique + * validation rules before attempting validation. If this property + * is not set in the model it will default to true. + * + * @var boolean + */ + protected $injectUniqueIdentifier = true; + use ValidatingTrait; + + /** + * The attributes that are mass assignable. + * + * @var array + */ + protected $fillable = ['name','qty','company_id','category_id']; + + + public function admin() + { + return $this->belongsTo('\App\Models\User', 'user_id'); + } + + public function consumableAssigments() + { + return $this->hasMany('\App\Models\ConsumableAssignment'); + } + + public function company() + { + return $this->belongsTo('\App\Models\Company', 'company_id'); + } + + public function location() + { + return $this->belongsTo('\App\Models\Location', 'location_id'); + } + + public function category() + { + return $this->belongsTo('\App\Models\Category', 'category_id'); + } + + /** + * Get action logs for this consumable + */ + public function assetlog() + { + return $this->hasMany('\App\Models\Actionlog', 'consumable_id')->where('asset_type', '=', 'consumable')->orderBy('created_at', 'desc')->withTrashed(); + } + + + public function users() + { + return $this->belongsToMany('\App\Models\User', 'consumables_users', 'consumable_id', 'assigned_to')->withPivot('user_id')->withTrashed()->withTimestamps(); + } + + public function hasUsers() + { + return $this->belongsToMany('\App\Models\User', 'consumables_users', 'consumable_id', 'assigned_to')->count(); + } + + + public function requireAcceptance() + { + return $this->category->require_acceptance; + } + + public function getEula() + { + + $Parsedown = new \Parsedown(); + + if ($this->category->eula_text) { + return $Parsedown->text(e($this->category->eula_text)); + } elseif ((Setting::getSettings()->default_eula_text) && ($this->category->use_default_eula=='1')) { + return $Parsedown->text(e(Setting::getSettings()->default_eula_text)); + } else { + return null; + } + + } + + public function numRemaining() + { + $checkedout = $this->users->count(); + $total = $this->qty; + $remaining = $total - $checkedout; + return $remaining; + } + + /** + * Query builder scope to search on text + * + * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param text $search Search term + * + * @return Illuminate\Database\Query\Builder Modified query builder + */ + /** + * Query builder scope to search on text + * + * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param text $search Search term + * + * @return Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeTextSearch($query, $search) + { + $search = explode(' ', $search); + + return $query->where(function ($query) use ($search) { + + foreach ($search as $search) { + $query->whereHas('category', function ($query) use ($search) { + $query->where('categories.name', 'LIKE', '%'.$search.'%'); + })->orWhere(function ($query) use ($search) { + $query->whereHas('company', function ($query) use ($search) { + $query->where('companies.name', 'LIKE', '%'.$search.'%'); + }); + })->orWhere(function ($query) use ($search) { + $query->whereHas('location', function ($query) use ($search) { + $query->where('locations.name', 'LIKE', '%'.$search.'%'); + }); + })->orWhere('consumables.name', 'LIKE', '%'.$search.'%') + ->orWhere('consumables.order_number', 'LIKE', '%'.$search.'%') + ->orWhere('consumables.purchase_cost', 'LIKE', '%'.$search.'%') + ->orWhere('consumables.purchase_date', 'LIKE', '%'.$search.'%'); + } + }); + } + + /** + * Query builder scope to order on company + * + * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param text $order Order + * + * @return Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeOrderCategory($query, $order) + { + return $query->join('categories', 'consumables.category_id', '=', 'categories.id')->orderBy('categories.name', $order); + } + + /** + * Query builder scope to order on company + * + * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param text $order Order + * + * @return Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeOrderLocation($query, $order) + { + return $query->leftJoin('locations', 'consumables.location_id', '=', 'locations.id')->orderBy('locations.name', $order); + } + + + /** + * Query builder scope to order on company + * + * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param text $order Order + * + * @return Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeOrderCompany($query, $order) + { + return $query->leftJoin('companies', 'consumables.company_id', '=', 'companies.id')->orderBy('companies.name', $order); + } +} diff --git a/app/Models/ConsumableAssignment.php b/app/Models/ConsumableAssignment.php new file mode 100644 index 0000000000..d8d684ca27 --- /dev/null +++ b/app/Models/ConsumableAssignment.php @@ -0,0 +1,27 @@ +belongsTo('\App\Models\Consumable'); + } + + public function user() + { + return $this->belongsTo('\App\Models\User', 'assigned_to'); + } + + public function admin() + { + return $this->belongsTo('\App\Models\User', 'user_id'); + } +} diff --git a/app/Models/CustomField.php b/app/Models/CustomField.php new file mode 100644 index 0000000000..f8c0b52b03 --- /dev/null +++ b/app/Models/CustomField.php @@ -0,0 +1,112 @@ + "", + "ALPHA" => "alpha", + "EMAIL" => "email", + "DATE" => "date", + "URL" => "url", + "NUMERIC" => "numeric", + "MAC" => "regex:/^[a-fA-F0-9]{2}:[a-fA-F0-9]{2}:[a-fA-F0-9]{2}:[a-fA-F0-9]{2}:[a-fA-F0-9]{2}:[a-fA-F0-9]{2}$/", + "IP" => "ip" + ]; + + public $rules=[ + "name" => "required|unique:custom_fields" + ]; + + public static $table_name="assets"; + + public static function name_to_db_name($name) + { + return "_snipeit_".preg_replace("/[^a-zA-Z0-9]/", "_", strtolower($name)); + } + + public static function boot() + { + self::creating(function ($custom_field) { + + if (in_array($custom_field->db_column_name(), \Schema::getColumnListing(\DB::getTablePrefix().CustomField::$table_name))) { + //field already exists when making a new custom field; fail. + return false; + } + + \Schema::table(\DB::getTablePrefix().\App\Models\CustomField::$table_name, function ($table) use ($custom_field) { + $table->text($custom_field->db_column_name())->nullable(); + }); + + }); + + self::updating(function ($custom_field) { + if ($custom_field->isDirty("name")) { + if (in_array($custom_field->db_column_name(), \Schema::getColumnListing(CustomField::$table_name))) { + //field already exists when renaming a custom field + return false; + } + return \DB::statement("UPDATE ".CustomField::$table_name." RENAME ".self::name_to_db_name($custom_field->get_original("name"))." TO ".$custom_field->db_column_name()); + } + return true; + }); + + self::deleting(function ($custom_field) { + return \DB::statement("ALTER TABLE ".CustomField::$table_name." DROP COLUMN ".$custom_field->db_column_name()); + }); + } + + public function fieldset() + { + return $this->belongsToMany('\App\Models\CustomFieldset'); //?!?!?!?!?!? + } + + public function user() + { + return $this->belongsTo('\App\Models\User'); + } + + //public function + + //need helper to go from regex->English + //need helper to go from English->regex + + //need helper for save() stuff - basically to alter table for the fields in question + + public function check_format($value) + { + return preg_match('/^'.$this->attributes['format'].'$/', $value)===1; + } + + public function db_column_name() + { + return self::name_to_db_name($this->name); + } + + //mutators for 'format' attribute + public function getFormatAttribute($value) + { + foreach (self::$PredefinedFormats as $name => $pattern) { + if ($pattern===$value) { + return $name; + } + } + return $value; + } + + public function setFormatAttribute($value) + { + if (isset(self::$PredefinedFormats[$value])) { + $this->attributes['format']=self::$PredefinedFormats[$value]; + } else { + $this->attributes['format']=$value; + } + } +} diff --git a/app/Models/CustomFieldset.php b/app/Models/CustomFieldset.php new file mode 100644 index 0000000000..fd8deca6a7 --- /dev/null +++ b/app/Models/CustomFieldset.php @@ -0,0 +1,45 @@ + "required|unique:custom_fieldsets" + ]; + + public function fields() + { + return $this->belongsToMany('\App\Models\CustomField')->withPivot(["required","order"])->orderBy("pivot_order"); + } + + public function models() + { + return $this->hasMany('\App\Models\AssetModel', "fieldset_id"); + } + + public function user() + { + return $this->belongsTo('\App\Models\User'); //WARNING - not all CustomFieldsets have a User!! + } + + public function validation_rules() + { + $rules=[]; + foreach ($this->fields as $field) { + $rule=[]; + if ($field->pivot->required) { + $rule[]="required"; + } + array_push($rule, $field->attributes['format']); + $rules[$field->db_column_name()]=$rule; + } + return $rules; + } + + //requiredness goes *here* + //sequence goes here? +} diff --git a/app/Models/Depreciable.php b/app/Models/Depreciable.php new file mode 100644 index 0000000000..d5e3670471 --- /dev/null +++ b/app/Models/Depreciable.php @@ -0,0 +1,83 @@ +belongsTo('\App\Models\Depreciation', 'depreciation_id'); + } + + public function get_depreciation() + { + return $this->depreciation; + } + + /** + * @return float|int + */ + + public function getDepreciatedValue() + { + if (!$this->get_depreciation()) { // will never happen + return $this->purchase_cost; + } + + if ($this->get_depreciation()->months <= 0) { + return $this->purchase_cost; + } + + // fraction of value left + $months_remaining = $this->time_until_depreciated()->m + 12*$this->time_until_depreciated()->y; //UGlY + $current_value = round(($months_remaining/ $this->get_depreciation()->months) * $this->purchase_cost, 2); + + if ($current_value < 0) { + $current_value = 0; + } + return $current_value; + } + + public function time_until_depreciated() + { + // @link http://www.php.net/manual/en/class.datetime.php + $d1 = new \DateTime(); + $d2 = $this->depreciated_date(); + + // @link http://www.php.net/manual/en/class.dateinterval.php + $interval = $d1->diff($d2); + if (!$interval->invert) { + return $interval; + } else { + return new \DateInterval("PT0S"); //null interval (zero seconds from now) + } + } + + public function depreciated_date() + { + $date = date_create($this->purchase_date); + date_add($date, date_interval_create_from_date_string($this->get_depreciation()->months . ' months')); + return $date; //date_format($date, 'Y-m-d'); //don't bake-in format, for internationalization + } +} diff --git a/app/Models/Depreciation.php b/app/Models/Depreciation.php new file mode 100755 index 0000000000..a1f6287e62 --- /dev/null +++ b/app/Models/Depreciation.php @@ -0,0 +1,61 @@ + 'required|min:3|max:255|unique:depreciations,name', + 'months' => 'required|min:1|max:240|integer', + ); + + /** + * Whether the model should inject it's identifier to the unique + * validation rules before attempting validation. If this property + * is not set in the model it will default to true. + * + * @var boolean + */ + protected $injectUniqueIdentifier = true; + use ValidatingTrait; + + /** + * The attributes that are mass assignable. + * + * @var array + */ + protected $fillable = ['name','months']; + + + + public function has_models() + { + return $this->hasMany('\App\Models\AssetModel', 'depreciation_id')->count(); + } + + public function has_licenses() + { + return $this->hasMany('\App\Models\License', 'depreciation_id')->count(); + } + + /** + * Query builder scope to search on text + * + * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param text $search Search term + * + * @return Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeTextSearch($query, $search) + { + + return $query->where(function ($query) use ($search) { + + $query->where('name', 'LIKE', '%'.$search.'%') + ->orWhere('months', 'LIKE', '%'.$search.'%'); + }); + } +} diff --git a/app/Models/Group.php b/app/Models/Group.php new file mode 100755 index 0000000000..edc29a8930 --- /dev/null +++ b/app/Models/Group.php @@ -0,0 +1,34 @@ + 'required|min:3|max:255', + ); + + /** + * Whether the model should inject it's identifier to the unique + * validation rules before attempting validation. If this property + * is not set in the model it will default to true. + * + * @var boolean + */ + protected $injectUniqueIdentifier = true; + use ValidatingTrait; + + + /** + * Get user groups + */ + public function users() + { + return $this->belongsToMany('\App\Models\User', 'users_groups'); + } +} diff --git a/app/Models/ICompanyableChild.php b/app/Models/ICompanyableChild.php new file mode 100644 index 0000000000..0f24598ec9 --- /dev/null +++ b/app/Models/ICompanyableChild.php @@ -0,0 +1,7 @@ + 'required|string|min:3|max:255', + 'serial' => 'required|min:5', + 'seats' => 'required|min:1|max:10000|integer', + 'license_email' => 'email|min:0|max:120', + 'license_name' => 'string|min:0|max:100', + 'note' => 'string', + 'notes' => 'string|min:0', + 'company_id' => 'integer', + ); + + public function company() + { + return $this->belongsTo('\App\Models\Company', 'company_id'); + } + + /** + * Get the assigned user + */ + public function assignedusers() + { + return $this->belongsToMany('\App\Models\User', 'license_seats', 'assigned_to', 'license_id'); + } + + /** + * Get asset logs for this asset + */ + public function assetlog() + { + return $this->hasMany('\App\Models\Actionlog', 'asset_id') + ->where('asset_type', '=', 'software') + ->orderBy('created_at', 'desc'); + } + + /** + * Get uploads for this asset + */ + public function uploads() + { + return $this->hasMany('\App\Models\Actionlog', 'asset_id') + ->where('asset_type', '=', 'software') + ->where('action_type', '=', 'uploaded') + ->whereNotNull('filename') + ->orderBy('created_at', 'desc'); + } + + + /** + * Get admin user for this asset + */ + public function adminuser() + { + return $this->belongsTo('\App\Models\User', 'user_id'); + } + + /** + * Get total licenses + */ + public static function assetcount() + { + return LicenseSeat::whereNull('deleted_at') + ->count(); + } + + + /** + * Get total licenses + */ + public function totalSeatsByLicenseID() + { + return LicenseSeat::where('license_id', '=', $this->id) + ->whereNull('deleted_at') + ->count(); + } + + + /** + * Get total licenses not checked out + */ + public static function availassetcount() + { + return LicenseSeat::whereNull('assigned_to') + ->whereNull('asset_id') + ->whereNull('deleted_at') + ->count(); + } + + /** + * Get the number of available seats + */ + public function availcount() + { + return LicenseSeat::whereNull('assigned_to') + ->whereNull('asset_id') + ->where('license_id', '=', $this->id) + ->whereNull('deleted_at') + ->count(); + } + + /** + * Get the number of assigned seats + * + */ + public function assignedcount() + { + + return \App\Models\LicenseSeat::where('license_id', '=', $this->id) + ->where(function ($query) { + + $query->whereNotNull('assigned_to') + ->orWhereNotNull('asset_id'); + }) + ->count(); + + + } + + public function remaincount() + { + $total = $this->totalSeatsByLicenseID(); + $taken = $this->assignedcount(); + $diff = ($total - $taken); + return $diff; + } + + /** + * Get the total number of seats + */ + public function totalcount() + { + $avail = $this->availcount(); + $taken = $this->assignedcount(); + $diff = ($avail + $taken); + return $diff; + } + + /** + * Get license seat data + */ + public function licenseseats() + { + return $this->hasMany('\App\Models\LicenseSeat'); + } + + public function supplier() + { + return $this->belongsTo('\App\Models\Supplier', 'supplier_id'); + } + + public function freeSeat() + { + $seat = LicenseSeat::where('license_id', '=', $this->id) + ->whereNull('deleted_at') + ->whereNull('assigned_to') + ->whereNull('asset_id') + ->first(); + return $seat->id; + } + + public static function getExpiringLicenses($days = 60) + { + + return License::whereNotNull('expiration_date') + ->whereNull('deleted_at') + ->whereRaw(DB::raw('DATE_SUB(`expiration_date`,INTERVAL '.$days.' DAY) <= DATE(NOW()) ')) + ->where('expiration_date', '>', date("Y-m-d")) + ->orderBy('expiration_date', 'ASC') + ->get(); + + } + + /** + * Query builder scope to search on text + * + * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param text $search Search term + * + * @return Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeTextSearch($query, $search) + { + + return $query->where(function ($query) use ($search) { + + $query->where('name', 'LIKE', '%'.$search.'%') + ->orWhere('serial', 'LIKE', '%'.$search.'%') + ->orWhere('notes', 'LIKE', '%'.$search.'%') + ->orWhere('order_number', 'LIKE', '%'.$search.'%') + ->orWhere('purchase_date', 'LIKE', '%'.$search.'%') + ->orWhere('purchase_cost', 'LIKE', '%'.$search.'%'); + }); + } +} diff --git a/app/Models/LicenseSeat.php b/app/Models/LicenseSeat.php new file mode 100755 index 0000000000..54c40a43cf --- /dev/null +++ b/app/Models/LicenseSeat.php @@ -0,0 +1,35 @@ +belongsTo('\App\Models\License', 'license_id'); + } + + public function user() + { + return $this->belongsTo('\App\Models\User', 'assigned_to')->withTrashed(); + } + + public function asset() + { + return $this->belongsTo('\App\Models\Asset', 'asset_id')->withTrashed(); + } +} diff --git a/app/Models/Location.php b/app/Models/Location.php new file mode 100755 index 0000000000..a6767eca5d --- /dev/null +++ b/app/Models/Location.php @@ -0,0 +1,168 @@ + 'required|min:3|max:255|unique:locations,name,NULL,deleted_at', + 'city' => 'min:3|max:255', + 'state' => 'min:2|max:32', + 'country' => 'min:2|max:2|max:2', + 'address' => 'min:5|max:80', + 'address2' => 'min:2|max:80', + 'zip' => 'min:3|max:10', + ); + + /** + * Whether the model should inject it's identifier to the unique + * validation rules before attempting validation. If this property + * is not set in the model it will default to true. + * + * @var boolean + */ + protected $injectUniqueIdentifier = true; + use ValidatingTrait; + + + /** + * The attributes that are mass assignable. + * + * @var array + */ + protected $fillable = ['name']; + + public function users() + { + return $this->hasMany('\App\Models\User', 'location_id'); + } + + public function assets() + { + return $this->hasManyThrough('\App\Models\Asset', '\App\Models\Actionlog', 'location_id', 'id'); + } + + public function assignedassets() + { + return $this->hasMany('\App\Models\Asset', 'rtd_location_id'); + } + + public function parent() + { + return $this->belongsTo('\App\Models\Location', 'parent_id'); + } + + public function childLocations() + { + return $this->hasMany('\App\Models\Location', 'parent_id'); + } + + public static function getLocationHierarchy($locations, $parent_id = null) + { + + + $op = array(); + + foreach ($locations as $location) { + + if ($location['parent_id'] == $parent_id) { + $op[$location['id']] = + array( + 'name' => $location['name'], + 'parent_id' => $location['parent_id'] + ); + + // Using recursion + $children = Location::getLocationHierarchy($locations, $location['id']); + if ($children) { + $op[$location['id']]['children'] = $children; + } + + } + + } + return $op; + } + + + public static function flattenLocationsArray($location_options_array = null) + { + $location_options = array(); + foreach ($location_options_array as $id => $value) { + + // get the top level key value + $location_options[$id] = $value['name']; + + // If there is a key named children, it has child locations and we have to walk it + if (array_key_exists('children', $value)) { + + foreach ($value['children'] as $child_id => $child_location_array) { + $child_location_options = Location::flattenLocationsArray($value['children']); + + foreach ($child_location_options as $child_id => $child_name) { + $location_options[$child_id] = '--'.$child_name; + } + } + + } + + } + + return $location_options; + } + + /** + * Query builder scope to search on text + * + * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param text $search Search term + * + * @return Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeTextsearch($query, $search) + { + + return $query->where('name', 'LIKE', "%$search%") + ->orWhere('address', 'LIKE', "%$search%") + ->orWhere('city', 'LIKE', "%$search%") + ->orWhere('state', 'LIKE', "%$search%") + ->orWhere('zip', 'LIKE', "%$search%") + + // This doesn't actually work - need to use a table alias maybe? + ->orWhere(function ($query) use ($search) { + $query->whereHas('parent', function ($query) use ($search) { + $query->where(function ($query) use ($search) { + $query->where('name', 'LIKE', '%'.$search.'%'); + }); + }) + // Ugly, ugly code because Laravel sucks at self-joins + ->orWhere(function ($query) use ($search) { + $query->whereRaw("parent_id IN (select id from locations where name LIKE '%".$search."%') "); + }); + }); + + } + + + /** + * Query builder scope to order on parent + * + * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param text $order Order + * + * @return Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeOrderParent($query, $order) + { + // Left join here, or it will only return results with parents + return $query->leftJoin('locations as parent_loc', 'locations.parent_id', '=', 'parent_loc.id')->orderBy('parent_loc.name', $order); + } +} diff --git a/app/Models/Manufacturer.php b/app/Models/Manufacturer.php new file mode 100755 index 0000000000..cc10833f88 --- /dev/null +++ b/app/Models/Manufacturer.php @@ -0,0 +1,65 @@ + 'required|min:2|max:255|unique:manufacturers,name,NULL,deleted_at', + 'user_id' => 'integer', + ); + + /** + * Whether the model should inject it's identifier to the unique + * validation rules before attempting validation. If this property + * is not set in the model it will default to true. + * + * @var boolean + */ + protected $injectUniqueIdentifier = true; + use ValidatingTrait; + + /** + * The attributes that are mass assignable. + * + * @var array + */ + protected $fillable = ['name']; + + + + public function has_models() + { + return $this->hasMany('\App\Models\AssetModel', 'manufacturer_id')->count(); + } + + public function assets() + { + return $this->hasManyThrough('\App\Models\Asset', '\App\Models\AssetModel', 'manufacturer_id', 'model_id'); + } + + /** + * Query builder scope to search on text + * + * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param text $search Search term + * + * @return Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeTextSearch($query, $search) + { + + return $query->where(function ($query) use ($search) { + + $query->where('name', 'LIKE', '%'.$search.'%'); + }); + } +} diff --git a/app/Models/Setting.php b/app/Models/Setting.php new file mode 100755 index 0000000000..6f5bd75c65 --- /dev/null +++ b/app/Models/Setting.php @@ -0,0 +1,113 @@ + 'required|min:1|numeric', + "qr_text" => 'min:1|max:31', + "custom_css" => 'string', + "slack_endpoint" => 'url', + "default_currency" => 'required', + "slack_channel" => 'regex:/(? 'string', + "ldap_server" => 'sometimes|required_if:ldap_enabled,1|url', + "ldap_uname" => 'sometimes|required_if:ldap_enabled,1', + "ldap_pword" => 'sometimes|required_if:ldap_enabled,1', + "ldap_basedn" => 'sometimes|required_if:ldap_enabled,1', + "ldap_filter" => 'sometimes|required_if:ldap_enabled,1', + "ldap_username_field" => 'sometimes|required_if:ldap_enabled,1', + "ldap_lname_field" => 'sometimes|required_if:ldap_enabled,1', + "ldap_auth_filter_query" => 'sometimes|required_if:ldap_enabled,1', + "ldap_version" => 'sometimes|required_if:ldap_enabled,1', + ]; + + protected $fillable = ['site_name']; + + public static function getSettings() + { + static $static_cache = null; + + if (!$static_cache) { + $static_cache = Setting::first(); + } + return $static_cache; + } + + public function lar_ver() + { + $app = \App::getFacadeApplication(); + return $app::VERSION; + } + + public static function getDefaultEula() + { + + $Parsedown = new \Parsedown(); + if (Setting::getSettings()->default_eula_text) { + return $Parsedown->text(e(Setting::getSettings()->default_eula_text)); + } else { + return null; + } + + } + + public function show_custom_css() + { + $custom_css = Setting::getSettings()->custom_css; + $custom_css = e($custom_css); + // Needed for modifying the bootstrap nav :( + $custom_css = str_ireplace('script', 'SCRIPTS-NOT-ALLOWED-HERE', $custom_css); + $custom_css = str_replace('>', '>', $custom_css); + return $custom_css; + } + + /** + * Converts bytes into human readable file size. + * + * @param string $bytes + * @return string human readable file size (2,87 Мб) + * @author Mogilev Arseny + */ + public static function fileSizeConvert($bytes) + { + $bytes = floatval($bytes); + $arBytes = array( + 0 => array( + "UNIT" => "TB", + "VALUE" => pow(1024, 4) + ), + 1 => array( + "UNIT" => "GB", + "VALUE" => pow(1024, 3) + ), + 2 => array( + "UNIT" => "MB", + "VALUE" => pow(1024, 2) + ), + 3 => array( + "UNIT" => "KB", + "VALUE" => 1024 + ), + 4 => array( + "UNIT" => "B", + "VALUE" => 1 + ), + ); + + foreach ($arBytes as $arItem) { + if ($bytes >= $arItem["VALUE"]) { + $result = $bytes / $arItem["VALUE"]; + $result = round($result, 2) .$arItem["UNIT"]; + break; + } + } + return $result; + } +} diff --git a/app/Models/Statuslabel.php b/app/Models/Statuslabel.php new file mode 100755 index 0000000000..b9e3010bb9 --- /dev/null +++ b/app/Models/Statuslabel.php @@ -0,0 +1,87 @@ + 'required|string|unique:status_labels,name,NULL,deleted_at', + //'statuslabel_types' => 'required|in:deployable,pending,archived,undeployable', + 'notes' => 'string', + ); + + protected $fillable = ['name']; + + public function has_assets() + { + return $this->hasMany('\App\Models\Asset', 'status_id')->count(); + } + + public function getStatuslabelType() + { + + if ($this->pending == 1) { + return 'pending'; + } elseif ($this->archived == 1) { + return 'archived'; + } elseif (($this->archived == 0) && ($this->deployable == 0) && ($this->deployable == 0)) { + return 'undeployable'; + } else { + return 'deployable'; + } + } + + public static function getStatuslabelTypesForDB($type) + { + if ($type == 'pending') { + $statustype['pending'] = 1; + $statustype['deployable'] = 0; + $statustype['archived'] = 0; + + } elseif ($type == 'deployable') { + $statustype['pending'] = 0; + $statustype['deployable'] = 1; + $statustype['archived'] = 0; + + } elseif ($type == 'archived') { + $statustype['pending'] = 0; + $statustype['deployable'] = 0; + $statustype['archived'] = 1; + + } elseif ($type == 'undeployable') { + $statustype['pending'] = 0; + $statustype['deployable'] = 0; + $statustype['archived'] = 0; + } + + return $statustype; + } + + /** + * Query builder scope to search on text + * + * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param text $search Search term + * + * @return Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeTextSearch($query, $search) + { + + return $query->where(function ($query) use ($search) { + + $query->where('name', 'LIKE', '%'.$search.'%'); + }); + } +} diff --git a/app/Models/Supplier.php b/app/Models/Supplier.php new file mode 100755 index 0000000000..bbaac8953d --- /dev/null +++ b/app/Models/Supplier.php @@ -0,0 +1,96 @@ + 'required|min:3|max:255|unique:suppliers,name,NULL,deleted_at', + 'address' => 'min:3|max:255', + 'address2' => 'min:2|max:255', + 'city' => 'min:3|max:255', + 'state' => 'min:0|max:32', + 'country' => 'min:0|max:2', + 'fax' => 'min:7|max:20', + 'phone' => 'min:7|max:20', + 'contact' => 'min:0|max:255', + 'notes' => 'min:0|max:255', + 'email' => 'email|min:5|max:150', + 'zip' => 'min:0|max:10', + 'url' => 'min:3|max:250', + ); + + /** + * Whether the model should inject it's identifier to the unique + * validation rules before attempting validation. If this property + * is not set in the model it will default to true. + * + * @var boolean + */ + protected $injectUniqueIdentifier = true; + use ValidatingTrait; + + /** + * The attributes that are mass assignable. + * + * @var array + */ + protected $fillable = ['name']; + + + public function assets() + { + return $this->hasMany('\App\Models\Asset', 'supplier_id'); + } + + public function asset_maintenances() + { + return $this->hasMany('\App\Models\AssetMaintenance', 'supplier_id'); + } + + public function num_assets() + { + return $this->hasMany('\App\Models\Asset', 'supplier_id')->count(); + } + + public function licenses() + { + return $this->hasMany('\App\Models\License', 'supplier_id'); + } + + public function num_licenses() + { + return $this->hasMany('\App\Models\License', 'supplier_id')->count(); + } + + public function addhttp($url) + { + if (!preg_match("~^(?:f|ht)tps?://~i", $url)) { + $url = "http://" . $url; + } + return $url; + } + + /** + * Query builder scope to search on text + * + * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param text $search Search term + * + * @return Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeTextSearch($query, $search) + { + + return $query->where(function ($query) use ($search) { + + $query->where('name', 'LIKE', '%'.$search.'%'); + }); + } +} diff --git a/app/Models/Throttle.php b/app/Models/Throttle.php new file mode 100644 index 0000000000..85e447378e --- /dev/null +++ b/app/Models/Throttle.php @@ -0,0 +1,14 @@ +belongsTo('User', 'user_id'); + } +} diff --git a/app/Models/User.php b/app/Models/User.php new file mode 100755 index 0000000000..e0abe41e60 --- /dev/null +++ b/app/Models/User.php @@ -0,0 +1,383 @@ + 'required|string|min:1', + 'last_name' => 'required|string|min:1', + 'username' => 'required|string|min:2|unique:users,username,NULL,deleted_at', + 'email' => 'email', + 'password' => 'required|min:6', + ]; + + + // This is very coarse and should be changed + public function hasAccess($section) + { + $user_permissions = json_decode($this->permissions, true); + $user_groups = $this->groups(); + + if (((array_key_exists($section, $user_permissions)) && ($user_permissions[$section]=='1')) || + ((array_key_exists('admin', $user_permissions)) && ($user_permissions['admin']=='1'))) { + return true; + } + + foreach ($user_groups as $user_group) { + $group_permissions = json_decode($user_group->permissions, true); + if (((array_key_exists($section, $group_permissions)) && ($group_permissions[$section]=='1')) || + ((array_key_exists('admin', $group_permissions)) && ($group_permissions['admin']=='1'))) { + return true; + } + } + + return false; + } + + public function isSuperUser() { + $user_permissions = json_decode($this->permissions, true); + $user_groups = $this->groups(); + + if ((array_key_exists('superuser', $user_permissions)) && ($user_permissions['superuser']=='1')) { + return true; + } else { + return false; + } + + + } + + + public function company() + { + return $this->belongsTo('\App\Models\Company', 'company_id'); + } + + public function isActivated() + { + if ($this->activated == 1) { + return true; + } else { + return false; + } + } + + + /** + * Returns the user full name, it simply concatenates + * the user first and last name. + * + * @return string + */ + public function fullName() + { + return "{$this->first_name} {$this->last_name}"; + } + + + /** + * Returns the user Gravatar image url. + * + * @return string + */ + public function gravatar() + { + + if ($this->avatar) { + return config('app.url').'/uploads/avatars/'.$this->avatar; + } + + if ($this->email) { + // Generate the Gravatar hash + $gravatar = md5(strtolower(trim($this->email))); + // Return the Gravatar url + return "//gravatar.com/avatar/".$gravatar; + } + + return false; + + } + + /** + * Get assets assigned to this user + */ + public function assets() + { + return $this->hasMany('\App\Models\Asset', 'assigned_to')->withTrashed(); + } + + /** + * Get accessories assigned to this user + */ + public function accessories() + { + return $this->belongsToMany('\App\Models\Accessory', 'accessories_users', 'assigned_to', 'accessory_id')->withPivot('id')->withTrashed(); + } + + /** + * Get consumables assigned to this user + */ + public function consumables() + { + return $this->belongsToMany('\App\Models\Consumable', 'consumables_users', 'assigned_to', 'consumable_id')->withPivot('id')->withTrashed(); + } + + /** + * Get licenses assigned to this user + */ + public function licenses() + { + return $this->belongsToMany('\App\Models\License', 'license_seats', 'assigned_to', 'license_id')->withPivot('id'); + } + + /** + * Get action logs for this user + */ + public function userlog() + { + return $this->hasMany('\App\Models\Actionlog', 'checkedout_to')->orderBy('created_at', 'DESC')->withTrashed(); + } + + /** + * Get the asset's location based on the assigned user + **/ + public function userloc() + { + return $this->belongsTo('\App\Models\Location', 'location_id')->withTrashed(); + } + + /** + * Get the user's manager based on the assigned user + **/ + public function manager() + { + return $this->belongsTo('\App\Models\User', 'manager_id')->withTrashed(); + } + + /** + * Get user groups + */ + public function groups() + { + return $this->belongsToMany('\App\Models\Group', 'users_groups'); + } + + + public function accountStatus() + { + if ($this->sentryThrottle) { + if ($this->sentryThrottle->suspended==1) { + return 'suspended'; + } elseif ($this->sentryThrottle->banned==1) { + return 'banned'; + } else { + return false; + } + } else { + return false; + } + } + + public function assetlog() + { + return $this->hasMany('\App\Models\Asset', 'id')->withTrashed(); + } + + /** + * Get uploads for this asset + */ + public function uploads() + { + return $this->hasMany('\App\Models\Actionlog', 'asset_id') + ->where('asset_type', '=', 'user') + ->where('action_type', '=', 'uploaded') + ->whereNotNull('filename') + ->orderBy('created_at', 'desc'); + } + + public function sentryThrottle() + { + return $this->hasOne('\App\Models\Throttle'); + } + + public function scopeGetDeleted($query) + { + return $query->withTrashed()->whereNotNull('deleted_at'); + } + + public function scopeGetNotDeleted($query) + { + return $query->whereNull('deleted_at'); + } + + /** + * Override the SentryUser getPersistCode method for + * multiple logins at one time + **/ + public function getPersistCode() + { + + if (!config('session.multi_login') || (!$this->persist_code)) { + $this->persist_code = $this->getRandomString(); + + // Our code got hashed + $persistCode = $this->persist_code; + $this->save(); + return $persistCode; + } + return $this->persist_code; + } + + public function scopeMatchEmailOrUsername($query, $user_username, $user_email) + { + return $query->where('email', '=', $user_email) + ->orWhere('username', '=', $user_username) + ->orWhere('username', '=', $user_email); + } + + + public static function generateFormattedNameFromFullName($format = 'filastname', $users_name) + { + $name = explode(" ", $users_name); + $name = str_replace("'", '', $name); + $first_name = $name[0]; + $email_last_name = ''; + $email_prefix = $first_name; + + // If there is no last name given + if (!array_key_exists(1, $name)) { + $last_name=''; + $email_last_name = $last_name; + $user_username = $first_name; + + // There is a last name given + } else { + + $last_name = str_replace($first_name, '', $users_name); + + if ($format=='filastname') { + $email_last_name.=str_replace(' ', '', $last_name); + $email_prefix = $first_name[0].$email_last_name; + + } elseif ($format=='firstname.lastname') { + $email_last_name.=str_replace(' ', '', $last_name); + $email_prefix = $first_name.'.'.$email_last_name; + + } elseif ($format=='firstname') { + $email_last_name.=str_replace(' ', '', $last_name); + $email_prefix = $first_name; + + } + } + + $user_username = $email_prefix; + $user['first_name'] = $first_name; + $user['last_name'] = $last_name; + $user['username'] = strtolower($user_username); + + return $user; + + + } + +/** +* Query builder scope to search on text +* +* @param Illuminate\Database\Query\Builder $query Query builder instance +* @param text $search Search term +* +* @return Illuminate\Database\Query\Builder Modified query builder +*/ + public function scopeTextsearch($query, $search) + { + + return $query->where(function ($query) use ($search) { + $query->where('users.first_name', 'LIKE', "%$search%") + ->orWhere('users.last_name', 'LIKE', "%$search%") + ->orWhere('users.email', 'LIKE', "%$search%") + ->orWhere('users.username', 'LIKE', "%$search%") + ->orWhere('users.notes', 'LIKE', "%$search%") + ->orWhere('users.employee_num', 'LIKE', "%$search%") + ->orWhere(function ($query) use ($search) { + $query->whereHas('userloc', function ($query) use ($search) { + $query->where('locations.name', 'LIKE', '%'.$search.'%'); + }); + }) + + // Ugly, ugly code because Laravel sucks at self-joins + ->orWhere(function ($query) use ($search) { + $query->whereRaw("users.manager_id IN (select id from users where first_name LIKE '%".$search."%' OR last_name LIKE '%".$search."%') "); + }); + }); + + } + + + /** + * Query builder scope for Deleted users + * + * @param Illuminate\Database\Query\Builder $query Query builder instance + * + * @return Illuminate\Database\Query\Builder Modified query builder + */ + + public function scopeDeleted($query) + { + return $query->whereNotNull('deleted_at'); + } + + + /** + * Query builder scope to order on manager + * + * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param text $order Order + * + * @return Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeOrderManager($query, $order) + { + // Left join here, or it will only return results with parents + return $query->leftJoin('users as manager', 'users.manager_id', '=', 'manager.id')->orderBy('manager.first_name', $order)->orderBy('manager.last_name', $order); + } + + /** + * Query builder scope to order on company + * + * @param Illuminate\Database\Query\Builder $query Query builder instance + * @param text $order Order + * + * @return Illuminate\Database\Query\Builder Modified query builder + */ + public function scopeOrderLocation($query, $order) + { + return $query->leftJoin('locations', 'users.location_id', '=', 'locations.id')->orderBy('locations.name', $order); + } +} diff --git a/app/Policies/.gitkeep b/app/Policies/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php new file mode 100644 index 0000000000..d7579fb0c2 --- /dev/null +++ b/app/Providers/AppServiceProvider.php @@ -0,0 +1,62 @@ +] + * @since [v3.0] + * @return void + */ + public function boot() + { + + // Email array validator + Validator::extend('email_array', function($attribute, $value, $parameters, $validator) { + $value = str_replace(' ','',$value); + $array = explode(',', $value); + + foreach($array as $email) //loop over values + { + $email_to_validate['alert_email'][]=$email; + } + + $rules = array('alert_email.*'=>'email'); + $messages = array( + 'alert_email.*'=>trans('validation.email_array') + ); + + $validator = Validator::make($email_to_validate,$rules,$messages); + + if ($validator->passes()) { + return true; + } else { + return false; + } + + }); + } + + /** + * Register any application services. + * + * @return void + */ + public function register() + { + // + } +} diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php new file mode 100644 index 0000000000..57d88ea3f9 --- /dev/null +++ b/app/Providers/AuthServiceProvider.php @@ -0,0 +1,31 @@ + 'App\Policies\ModelPolicy', + ]; + + /** + * Register any application authentication / authorization services. + * + * @param \Illuminate\Contracts\Auth\Access\Gate $gate + * @return void + */ + public function boot(GateContract $gate) + { + $this->registerPolicies($gate); + + // + } +} diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php new file mode 100644 index 0000000000..58ce962498 --- /dev/null +++ b/app/Providers/EventServiceProvider.php @@ -0,0 +1,33 @@ + [ + 'App\Listeners\EventListener', + ], + ]; + + /** + * Register any other events for your application. + * + * @param \Illuminate\Contracts\Events\Dispatcher $events + * @return void + */ + public function boot(DispatcherContract $events) + { + parent::boot($events); + + // + } +} diff --git a/app/Providers/MacroServiceProvider.php b/app/Providers/MacroServiceProvider.php new file mode 100644 index 0000000000..2b14800f0a --- /dev/null +++ b/app/Providers/MacroServiceProvider.php @@ -0,0 +1,31 @@ +group(['namespace' => $this->namespace], function ($router) { + require app_path('Http/routes.php'); + }); + } +} diff --git a/artisan b/artisan new file mode 100644 index 0000000000..df630d0d6d --- /dev/null +++ b/artisan @@ -0,0 +1,51 @@ +#!/usr/bin/env php +make(Illuminate\Contracts\Console\Kernel::class); + +$status = $kernel->handle( + $input = new Symfony\Component\Console\Input\ArgvInput, + new Symfony\Component\Console\Output\ConsoleOutput +); + +/* +|-------------------------------------------------------------------------- +| Shutdown The Application +|-------------------------------------------------------------------------- +| +| Once Artisan has finished running. We will fire off the shutdown events +| so that any final work may be done by the application before we shut +| down the process. This is the last thing to happen to the request. +| +*/ + +$kernel->terminate($input, $status); + +exit($status); diff --git a/bootstrap/app.php b/bootstrap/app.php new file mode 100644 index 0000000000..f2801adf6f --- /dev/null +++ b/bootstrap/app.php @@ -0,0 +1,55 @@ +singleton( + Illuminate\Contracts\Http\Kernel::class, + App\Http\Kernel::class +); + +$app->singleton( + Illuminate\Contracts\Console\Kernel::class, + App\Console\Kernel::class +); + +$app->singleton( + Illuminate\Contracts\Debug\ExceptionHandler::class, + App\Exceptions\Handler::class +); + +/* +|-------------------------------------------------------------------------- +| Return The Application +|-------------------------------------------------------------------------- +| +| This script returns the application instance. The instance is given to +| the calling script so we can separate the building of the instances +| from the actual running of the application and sending responses. +| +*/ + +return $app; diff --git a/bootstrap/autoload.php b/bootstrap/autoload.php new file mode 100644 index 0000000000..383013796f --- /dev/null +++ b/bootstrap/autoload.php @@ -0,0 +1,34 @@ + $value) { + $_SERVER["HTTP_X_CODECEPTION_".strtoupper($key)] = $value; + } + } +} + +if (!array_key_exists('HTTP_X_CODECEPTION_CODECOVERAGE', $_SERVER)) { + return; +} + +if (!function_exists('__c3_error')) { + function __c3_error($message) + { + $errorLogFile = defined('C3_CODECOVERAGE_ERROR_LOG_FILE') ? + C3_CODECOVERAGE_ERROR_LOG_FILE : + C3_CODECOVERAGE_MEDIATE_STORAGE . DIRECTORY_SEPARATOR . 'error.txt'; + if (is_writable($errorLogFile)) { + file_put_contents($errorLogFile, $message); + }else{ + $message = "Could not write error to log file ($errorLogFile), original message: $message"; + } + if (!headers_sent()) { + header('X-Codeception-CodeCoverage-Error: ' . str_replace("\n", ' ', $message), true, 500); + } + setcookie('CODECEPTION_CODECOVERAGE_ERROR', $message); + } +} + +// Autoload Codeception classes +if (!class_exists('\\Codeception\\Codecept')) { + if (file_exists(__DIR__ . '/codecept.phar')) { + require_once 'phar://'.__DIR__ . '/codecept.phar/autoload.php'; + } elseif (stream_resolve_include_path(__DIR__ . '/vendor/autoload.php')) { + require_once __DIR__ . '/vendor/autoload.php'; + // Required to load some methods only available at codeception/autoload.php + if (stream_resolve_include_path(__DIR__ . '/vendor/codeception/codeception/autoload.php')) { + require_once __DIR__ . '/vendor/codeception/codeception/autoload.php'; + } + } elseif (stream_resolve_include_path('Codeception/autoload.php')) { + require_once 'Codeception/autoload.php'; + } else { + __c3_error('Codeception is not loaded. Please check that either PHAR or Composer or PEAR package can be used'); + } +} + +// Load Codeception Config +$config_dist_file = realpath(__DIR__) . DIRECTORY_SEPARATOR . 'codeception.dist.yml'; +$config_file = realpath(__DIR__) . DIRECTORY_SEPARATOR . 'codeception.yml'; + +if (isset($_SERVER['HTTP_X_CODECEPTION_CODECOVERAGE_CONFIG'])) { + $config_file = realpath(__DIR__) . DIRECTORY_SEPARATOR . $_SERVER['HTTP_X_CODECEPTION_CODECOVERAGE_CONFIG']; +} +if (file_exists($config_file)) { + // Use codeception.yml for configuration. +} elseif (file_exists($config_dist_file)) { + // Use codeception.dist.yml for configuration. + $config_file = $config_dist_file; +} else { + __c3_error(sprintf("Codeception config file '%s' not found", $config_file)); +} +try { + \Codeception\Configuration::config($config_file); +} catch (\Exception $e) { + __c3_error($e->getMessage()); +} + +if (!defined('C3_CODECOVERAGE_MEDIATE_STORAGE')) { + + // workaround for 'zend_mm_heap corrupted' problem + gc_disable(); + + if ((integer)ini_get('memory_limit') < 384) { + ini_set('memory_limit', '384M'); + } + + define('C3_CODECOVERAGE_MEDIATE_STORAGE', Codeception\Configuration::logDir() . 'c3tmp'); + define('C3_CODECOVERAGE_PROJECT_ROOT', Codeception\Configuration::projectDir()); + define('C3_CODECOVERAGE_TESTNAME', $_SERVER['HTTP_X_CODECEPTION_CODECOVERAGE']); + + function __c3_build_html_report(PHP_CodeCoverage $codeCoverage, $path) + { + $writer = new PHP_CodeCoverage_Report_HTML(); + $writer->process($codeCoverage, $path . 'html'); + + if (file_exists($path . '.tar')) { + unlink($path . '.tar'); + } + + $phar = new PharData($path . '.tar'); + $phar->setSignatureAlgorithm(Phar::SHA1); + $files = $phar->buildFromDirectory($path . 'html'); + array_map('unlink', $files); + + if (in_array('GZ', Phar::getSupportedCompression())) { + if (file_exists($path . '.tar.gz')) { + unlink($path . '.tar.gz'); + } + + $phar->compress(\Phar::GZ); + + // close the file so that we can rename it + unset($phar); + + unlink($path . '.tar'); + rename($path . '.tar.gz', $path . '.tar'); + } + + return $path . '.tar'; + } + + function __c3_build_clover_report(PHP_CodeCoverage $codeCoverage, $path) + { + $writer = new PHP_CodeCoverage_Report_Clover(); + $writer->process($codeCoverage, $path . '.clover.xml'); + + return $path . '.clover.xml'; + } + + function __c3_send_file($filename) + { + if (!headers_sent()) { + readfile($filename); + } + + return __c3_exit(); + } + + /** + * @param $filename + * @return null|PHP_CodeCoverage + */ + function __c3_factory($filename) + { + $phpCoverage = is_readable($filename) + ? unserialize(file_get_contents($filename)) + : new PHP_CodeCoverage(); + + + if (isset($_SERVER['HTTP_X_CODECEPTION_CODECOVERAGE_SUITE'])) { + $suite = $_SERVER['HTTP_X_CODECEPTION_CODECOVERAGE_SUITE']; + try { + $settings = \Codeception\Configuration::suiteSettings($suite, \Codeception\Configuration::config()); + } catch (Exception $e) { + __c3_error($e->getMessage()); + } + } else { + $settings = \Codeception\Configuration::config(); + } + + try { + \Codeception\Coverage\Filter::setup($phpCoverage) + ->whiteList($settings) + ->blackList($settings); + } catch (Exception $e) { + __c3_error($e->getMessage()); + } + + return $phpCoverage; + } + + function __c3_exit() + { + if (!isset($_SERVER['HTTP_X_CODECEPTION_CODECOVERAGE_DEBUG'])) { + exit; + } + return null; + } + + function __c3_clear() + { + \Codeception\Util\FileSystem::doEmptyDir(C3_CODECOVERAGE_MEDIATE_STORAGE); + } +} + +if (!is_dir(C3_CODECOVERAGE_MEDIATE_STORAGE)) { + if (mkdir(C3_CODECOVERAGE_MEDIATE_STORAGE, 0777, true) === false) { + __c3_error('Failed to create directory "' . C3_CODECOVERAGE_MEDIATE_STORAGE . '"'); + } +} + +// evaluate base path for c3-related files +$path = realpath(C3_CODECOVERAGE_MEDIATE_STORAGE) . DIRECTORY_SEPARATOR . 'codecoverage'; + +$requested_c3_report = (strpos($_SERVER['REQUEST_URI'], 'c3/report') !== false); + +$complete_report = $current_report = $path . '.serialized'; +if ($requested_c3_report) { + set_time_limit(0); + + $route = ltrim(strrchr($_SERVER['REQUEST_URI'], '/'), '/'); + + if ($route == 'clear') { + __c3_clear(); + return __c3_exit(); + } + + $codeCoverage = __c3_factory($complete_report); + + switch ($route) { + case 'html': + try { + __c3_send_file(__c3_build_html_report($codeCoverage, $path)); + } catch (Exception $e) { + __c3_error($e->getMessage()); + } + return __c3_exit(); + case 'clover': + try { + __c3_send_file(__c3_build_clover_report($codeCoverage, $path)); + } catch (Exception $e) { + __c3_error($e->getMessage()); + } + return __c3_exit(); + case 'serialized': + try { + __c3_send_file($complete_report); + } catch (Exception $e) { + __c3_error($e->getMessage()); + } + return __c3_exit(); + } + +} else { + $codeCoverage = __c3_factory($current_report); + $codeCoverage->start(C3_CODECOVERAGE_TESTNAME); + if (!array_key_exists('HTTP_X_CODECEPTION_CODECOVERAGE_DEBUG', $_SERVER)) { + register_shutdown_function( + function () use ($codeCoverage, $current_report) { + + $codeCoverage->stop(); + if (!file_exists(dirname($current_report))) { // verify directory exists + if(!mkdir(dirname($current_report), 0777, true)){ + __c3_error("Can't write CodeCoverage report into $current_report"); + } + } + + file_put_contents($current_report, serialize($codeCoverage)); + } + ); + } +} + +// @codeCoverageIgnoreEnd diff --git a/circle.yml b/circle.yml new file mode 100644 index 0000000000..61f3c5e6b2 --- /dev/null +++ b/circle.yml @@ -0,0 +1,13 @@ +machine: + timezone: + US/Pacific + php: + version: 5.6.2 + hosts: + localhost: 127.0.0.1 + environment: + ENVIRONMENT: testing-ci + DB_DATABASE: testing.sqlite +test: + override: + - ./vendor/bin/codecept run --env testing-ci -vv diff --git a/codeception.yml b/codeception.yml new file mode 100644 index 0000000000..216cf7bcb3 --- /dev/null +++ b/codeception.yml @@ -0,0 +1,27 @@ +actor: Tester +paths: + tests: tests + log: tests/_output + data: tests/_data + support: tests/_support + envs: tests/_envs +settings: + bootstrap: _bootstrap.php + colors: true + memory_limit: 1024M +extensions: + enabled: + - Codeception\Extension\RunFailed +modules: + config: + Db: + dsn: '' + user: '' + password: '' + dump: tests/_data/dump.sql +coverage: + enabled: true + include: + - app/* + exclude: + - app/cache/* diff --git a/composer.json b/composer.json new file mode 100644 index 0000000000..0467ad4d14 --- /dev/null +++ b/composer.json @@ -0,0 +1,72 @@ +{ + "name": "Snipe-IT Laravel 5.2", + "description": "The Laravel Framework.", + "keywords": ["framework", "laravel"], + "license": "MIT", + "type": "project", + "require": { + "php": ">=5.5.9", + "laravel/framework": "5.2.*", + "intervention/image": "dev-master", + "league/csv": "~7.0", + "maknz/slack": "dev-master", + "erusev/parsedown": "dev-master", + "fideloper/proxy": "2.1.1", + "guzzlehttp/guzzle": "5.3.0", + "aws/aws-sdk-php-laravel": "~3.0", + "tecnickcom/tc-lib-barcode": "dev-master", + "laravelcollective/html" : "~5.0", + "watson/validating": "^2.0", + "doctrine/cache": "v1.5.4", + "doctrine/common": "v2.5.3", + "doctrine/dbal": "v2.4.2", + "barryvdh/laravel-debugbar": "^2.1", + "spatie/laravel-backup": "^2.9" + }, + "require-dev": { + "fzaninotto/faker": "~1.4", + "mockery/mockery": "0.9.*", + "phpunit/phpunit": "~4.0", + "phpspec/phpspec": "~2.1", + "codeception/codeception": "2.1.*", + "symfony/dom-crawler": "~3.0", + "symfony/css-selector": "~3.0", + "codeception/c3": "2.*" + }, + "autoload": { + "classmap": [ + "database", + "app/Helpers/Helper.php" + ], + "psr-4": { + "App\\": "app/" + } + }, + "autoload-dev": { + "classmap": [ + "tests/TestCase.php" + ] + }, + "scripts": { + "post-root-package-install": [ + "php -r \"copy('.env.example', '.env');\"" + ], + "post-create-project-cmd": [ + "php artisan key:generate" + ], + "post-install-cmd": [ + "php artisan clear-compiled", + "php artisan optimize" + ], + "pre-update-cmd": [ + "php artisan clear-compiled" + ], + "post-update-cmd": [ + "php artisan optimize" + ] + }, + "config": { + "preferred-install": "dist" + }, + "minimum-stability": "stable" +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000000..bf542be0eb --- /dev/null +++ b/composer.lock @@ -0,0 +1,5000 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "This file is @generated automatically" + ], + "hash": "1ff2f31a0e7428ecd70688f66ee46dd7", + "content-hash": "d311735b8c964c6c0c044fd6692b34ae", + "packages": [ + { + "name": "aws/aws-sdk-php", + "version": "3.15.9", + "source": { + "type": "git", + "url": "https://github.com/aws/aws-sdk-php.git", + "reference": "5f27941e2f1ac1700e667cfcf9d9da44c1d9b612" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/5f27941e2f1ac1700e667cfcf9d9da44c1d9b612", + "reference": "5f27941e2f1ac1700e667cfcf9d9da44c1d9b612", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "~5.3|~6.0.1|~6.1", + "guzzlehttp/promises": "~1.0", + "guzzlehttp/psr7": "~1.0", + "mtdowling/jmespath.php": "~2.2", + "php": ">=5.5" + }, + "require-dev": { + "andrewsville/php-token-reflection": "^1.4", + "aws/aws-php-sns-message-validator": "~1.0", + "behat/behat": "~3.0", + "doctrine/cache": "~1.4", + "ext-dom": "*", + "ext-json": "*", + "ext-openssl": "*", + "ext-pcre": "*", + "ext-simplexml": "*", + "ext-spl": "*", + "nette/neon": "^2.3", + "phpunit/phpunit": "~4.0|~5.0", + "psr/cache": "^1.0" + }, + "suggest": { + "aws/aws-php-sns-message-validator": "To validate incoming SNS notifications", + "doctrine/cache": "To use the DoctrineCacheAdapter", + "ext-curl": "To send requests using cURL", + "ext-openssl": "Allows working with CloudFront private distributions and verifying received SNS messages" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Aws\\": "src/" + }, + "files": [ + "src/functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Amazon Web Services", + "homepage": "http://aws.amazon.com" + } + ], + "description": "AWS SDK for PHP - Use Amazon Web Services in your PHP project", + "homepage": "http://aws.amazon.com/sdkforphp", + "keywords": [ + "amazon", + "aws", + "cloud", + "dynamodb", + "ec2", + "glacier", + "s3", + "sdk" + ], + "time": "2016-03-11 00:44:20" + }, + { + "name": "aws/aws-sdk-php-laravel", + "version": "3.1.0", + "source": { + "type": "git", + "url": "https://github.com/aws/aws-sdk-php-laravel.git", + "reference": "3b946892d493b91b4920ec4facc4a0ad7195fb86" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/aws/aws-sdk-php-laravel/zipball/3b946892d493b91b4920ec4facc4a0ad7195fb86", + "reference": "3b946892d493b91b4920ec4facc4a0ad7195fb86", + "shasum": "" + }, + "require": { + "aws/aws-sdk-php": "~3.0", + "illuminate/support": "~5.1", + "php": ">=5.5.9" + }, + "require-dev": { + "phpunit/phpunit": "~4.0|~5.0" + }, + "suggest": { + "laravel/framework": "To test the Laravel bindings", + "laravel/lumen-framework": "To test the Lumen bindings" + }, + "type": "library", + "autoload": { + "psr-4": { + "Aws\\Laravel\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Amazon Web Services", + "homepage": "http://aws.amazon.com" + } + ], + "description": "A simple Laravel 5 service provider for including the AWS SDK for PHP.", + "homepage": "http://aws.amazon.com/sdkforphp2", + "keywords": [ + "amazon", + "aws", + "dynamodb", + "ec2", + "laravel", + "laravel 5", + "s3", + "sdk" + ], + "time": "2016-01-18 06:57:07" + }, + { + "name": "barryvdh/laravel-debugbar", + "version": "v2.2.0", + "source": { + "type": "git", + "url": "https://github.com/barryvdh/laravel-debugbar.git", + "reference": "13b7058d2120c8d5af7f1ada21b7c44dd87b666a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/13b7058d2120c8d5af7f1ada21b7c44dd87b666a", + "reference": "13b7058d2120c8d5af7f1ada21b7c44dd87b666a", + "shasum": "" + }, + "require": { + "illuminate/support": "5.1.*|5.2.*", + "maximebf/debugbar": "~1.11.0", + "php": ">=5.5.9", + "symfony/finder": "~2.7|~3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + } + }, + "autoload": { + "psr-4": { + "Barryvdh\\Debugbar\\": "src/" + }, + "files": [ + "src/helpers.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Barry vd. Heuvel", + "email": "barryvdh@gmail.com" + } + ], + "description": "PHP Debugbar integration for Laravel", + "keywords": [ + "debug", + "debugbar", + "laravel", + "profiler", + "webprofiler" + ], + "time": "2016-02-17 08:32:21" + }, + { + "name": "classpreloader/classpreloader", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/ClassPreloader/ClassPreloader.git", + "reference": "9b10b913c2bdf90c3d2e0d726b454fb7f77c552a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ClassPreloader/ClassPreloader/zipball/9b10b913c2bdf90c3d2e0d726b454fb7f77c552a", + "reference": "9b10b913c2bdf90c3d2e0d726b454fb7f77c552a", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^1.0|^2.0", + "php": ">=5.5.9" + }, + "require-dev": { + "phpunit/phpunit": "^4.8|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "ClassPreloader\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com" + }, + { + "name": "Graham Campbell", + "email": "graham@alt-three.com" + } + ], + "description": "Helps class loading performance by generating a single PHP file containing all of the autoloaded files for a specific use case", + "keywords": [ + "autoload", + "class", + "preload" + ], + "time": "2015-11-09 22:51:51" + }, + { + "name": "dnoegel/php-xdg-base-dir", + "version": "0.1", + "source": { + "type": "git", + "url": "https://github.com/dnoegel/php-xdg-base-dir.git", + "reference": "265b8593498b997dc2d31e75b89f053b5cc9621a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/265b8593498b997dc2d31e75b89f053b5cc9621a", + "reference": "265b8593498b997dc2d31e75b89f053b5cc9621a", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "@stable" + }, + "type": "project", + "autoload": { + "psr-4": { + "XdgBaseDir\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "implementation of xdg base directory specification for php", + "time": "2014-10-24 07:27:01" + }, + { + "name": "doctrine/annotations", + "version": "v1.2.7", + "source": { + "type": "git", + "url": "https://github.com/doctrine/annotations.git", + "reference": "f25c8aab83e0c3e976fd7d19875f198ccf2f7535" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/f25c8aab83e0c3e976fd7d19875f198ccf2f7535", + "reference": "f25c8aab83e0c3e976fd7d19875f198ccf2f7535", + "shasum": "" + }, + "require": { + "doctrine/lexer": "1.*", + "php": ">=5.3.2" + }, + "require-dev": { + "doctrine/cache": "1.*", + "phpunit/phpunit": "4.*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3.x-dev" + } + }, + "autoload": { + "psr-0": { + "Doctrine\\Common\\Annotations\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Docblock Annotations Parser", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "annotations", + "docblock", + "parser" + ], + "time": "2015-08-31 12:32:49" + }, + { + "name": "doctrine/cache", + "version": "v1.5.4", + "source": { + "type": "git", + "url": "https://github.com/doctrine/cache.git", + "reference": "47cdc76ceb95cc591d9c79a36dc3794975b5d136" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/cache/zipball/47cdc76ceb95cc591d9c79a36dc3794975b5d136", + "reference": "47cdc76ceb95cc591d9c79a36dc3794975b5d136", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "conflict": { + "doctrine/common": ">2.2,<2.4" + }, + "require-dev": { + "phpunit/phpunit": ">=3.7", + "predis/predis": "~1.0", + "satooshi/php-coveralls": "~0.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Caching library offering an object-oriented API for many cache backends", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "cache", + "caching" + ], + "time": "2015-12-19 05:03:47" + }, + { + "name": "doctrine/collections", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/collections.git", + "reference": "6c1e4eef75f310ea1b3e30945e9f06e652128b8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/collections/zipball/6c1e4eef75f310ea1b3e30945e9f06e652128b8a", + "reference": "6c1e4eef75f310ea1b3e30945e9f06e652128b8a", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "psr-0": { + "Doctrine\\Common\\Collections\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Collections Abstraction library", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "array", + "collections", + "iterator" + ], + "time": "2015-04-14 22:21:58" + }, + { + "name": "doctrine/common", + "version": "v2.5.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/common.git", + "reference": "10f1f19651343f87573129ca970aef1a47a6f29e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/common/zipball/10f1f19651343f87573129ca970aef1a47a6f29e", + "reference": "10f1f19651343f87573129ca970aef1a47a6f29e", + "shasum": "" + }, + "require": { + "doctrine/annotations": "1.*", + "doctrine/cache": "1.*", + "doctrine/collections": "1.*", + "doctrine/inflector": "1.*", + "doctrine/lexer": "1.*", + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "~3.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.5.x-dev" + } + }, + "autoload": { + "psr-0": { + "Doctrine\\Common\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Common Library for Doctrine projects", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "annotations", + "collections", + "eventmanager", + "persistence", + "spl" + ], + "time": "2015-12-25 13:10:16" + }, + { + "name": "doctrine/dbal", + "version": "v2.4.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/dbal.git", + "reference": "fec965d330c958e175c39e61c3f6751955af32d0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/fec965d330c958e175c39e61c3f6751955af32d0", + "reference": "fec965d330c958e175c39e61c3f6751955af32d0", + "shasum": "" + }, + "require": { + "doctrine/common": "~2.4", + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "3.7.*", + "symfony/console": "~2.0" + }, + "suggest": { + "symfony/console": "Allows use of the command line interface" + }, + "type": "library", + "autoload": { + "psr-0": { + "Doctrine\\DBAL\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com", + "homepage": "http://www.jwage.com/", + "role": "Creator" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com", + "homepage": "http://www.instaclick.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + } + ], + "description": "Database Abstraction Layer", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "database", + "dbal", + "persistence", + "queryobject" + ], + "time": "2014-01-01 16:43:57" + }, + { + "name": "doctrine/inflector", + "version": "v1.1.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "90b2128806bfde671b6952ab8bea493942c1fdae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/90b2128806bfde671b6952ab8bea493942c1fdae", + "reference": "90b2128806bfde671b6952ab8bea493942c1fdae", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "4.*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-0": { + "Doctrine\\Common\\Inflector\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Common String Manipulations with regard to casing and singular/plural rules.", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "inflection", + "pluralize", + "singularize", + "string" + ], + "time": "2015-11-06 14:35:42" + }, + { + "name": "doctrine/lexer", + "version": "v1.0.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c", + "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "Doctrine\\Common\\Lexer\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "lexer", + "parser" + ], + "time": "2014-09-09 13:34:57" + }, + { + "name": "erusev/parsedown", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/erusev/parsedown.git", + "reference": "490a8f35a4163f59230f53c34f1fbb22a864c01e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/erusev/parsedown/zipball/490a8f35a4163f59230f53c34f1fbb22a864c01e", + "reference": "490a8f35a4163f59230f53c34f1fbb22a864c01e", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "Parsedown": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Emanuil Rusev", + "email": "hello@erusev.com", + "homepage": "http://erusev.com" + } + ], + "description": "Parser for Markdown.", + "homepage": "http://parsedown.org", + "keywords": [ + "markdown", + "parser" + ], + "time": "2016-03-09 17:02:39" + }, + { + "name": "fideloper/proxy", + "version": "2.1.1", + "source": { + "type": "git", + "url": "https://github.com/fideloper/TrustedProxy.git", + "reference": "a0ec0f35c82dceecc0d8975f29e6e8e85acbd419" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fideloper/TrustedProxy/zipball/a0ec0f35c82dceecc0d8975f29e6e8e85acbd419", + "reference": "a0ec0f35c82dceecc0d8975f29e6e8e85acbd419", + "shasum": "" + }, + "require": { + "illuminate/support": "~4.0|~5.0", + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "psr-0": { + "Fideloper\\Proxy": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Fidao", + "email": "fideloper@gmail.com" + } + ], + "description": "Set trusted proxies for Laravel", + "keywords": [ + "load balancing", + "proxy", + "trusted proxy" + ], + "time": "2014-11-20 02:20:43" + }, + { + "name": "guzzlehttp/guzzle", + "version": "5.3.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "f3c8c22471cb55475105c14769644a49c3262b93" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/f3c8c22471cb55475105c14769644a49c3262b93", + "reference": "f3c8c22471cb55475105c14769644a49c3262b93", + "shasum": "" + }, + "require": { + "guzzlehttp/ringphp": "^1.1", + "php": ">=5.4.0" + }, + "require-dev": { + "ext-curl": "*", + "phpunit/phpunit": "^4.0", + "psr/log": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle is a PHP HTTP client library and framework for building RESTful web service clients", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "rest", + "web service" + ], + "time": "2015-05-20 03:47:55" + }, + { + "name": "guzzlehttp/promises", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "bb9024c526b22f3fe6ae55a561fd70653d470aa8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/bb9024c526b22f3fe6ae55a561fd70653d470aa8", + "reference": "bb9024c526b22f3fe6ae55a561fd70653d470aa8", + "shasum": "" + }, + "require": { + "php": ">=5.5.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "time": "2016-03-08 01:15:46" + }, + { + "name": "guzzlehttp/psr7", + "version": "1.2.3", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "2e89629ff057ebb49492ba08e6995d3a6a80021b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/2e89629ff057ebb49492ba08e6995d3a6a80021b", + "reference": "2e89629ff057ebb49492ba08e6995d3a6a80021b", + "shasum": "" + }, + "require": { + "php": ">=5.4.0", + "psr/http-message": "~1.0" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "PSR-7 message implementation", + "keywords": [ + "http", + "message", + "stream", + "uri" + ], + "time": "2016-02-18 21:54:00" + }, + { + "name": "guzzlehttp/ringphp", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/RingPHP.git", + "reference": "dbbb91d7f6c191e5e405e900e3102ac7f261bc0b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/RingPHP/zipball/dbbb91d7f6c191e5e405e900e3102ac7f261bc0b", + "reference": "dbbb91d7f6c191e5e405e900e3102ac7f261bc0b", + "shasum": "" + }, + "require": { + "guzzlehttp/streams": "~3.0", + "php": ">=5.4.0", + "react/promise": "~2.0" + }, + "require-dev": { + "ext-curl": "*", + "phpunit/phpunit": "~4.0" + }, + "suggest": { + "ext-curl": "Guzzle will use specific adapters if cURL is present" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Ring\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Provides a simple API and specification that abstracts away the details of HTTP into a single PHP function.", + "time": "2015-05-20 03:37:09" + }, + { + "name": "guzzlehttp/streams", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/streams.git", + "reference": "47aaa48e27dae43d39fc1cea0ccf0d84ac1a2ba5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/streams/zipball/47aaa48e27dae43d39fc1cea0ccf0d84ac1a2ba5", + "reference": "47aaa48e27dae43d39fc1cea0ccf0d84ac1a2ba5", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Stream\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Provides a simple abstraction over streams of data", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "Guzzle", + "stream" + ], + "time": "2014-10-12 19:18:40" + }, + { + "name": "intervention/image", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/Intervention/image.git", + "reference": "e368d262887dbb2fdfaf710880571ede51e9c0e6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Intervention/image/zipball/e368d262887dbb2fdfaf710880571ede51e9c0e6", + "reference": "e368d262887dbb2fdfaf710880571ede51e9c0e6", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "guzzlehttp/psr7": "~1.1", + "php": ">=5.4.0" + }, + "require-dev": { + "mockery/mockery": "~0.9.2", + "phpunit/phpunit": "3.*" + }, + "suggest": { + "ext-gd": "to use GD library based image processing.", + "ext-imagick": "to use Imagick based image processing.", + "intervention/imagecache": "Caching extension for the Intervention Image library" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev" + } + }, + "autoload": { + "psr-4": { + "Intervention\\Image\\": "src/Intervention/Image" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Oliver Vogel", + "email": "oliver@olivervogel.net", + "homepage": "http://olivervogel.net/" + } + ], + "description": "Image handling and manipulation library with support for Laravel integration", + "homepage": "http://image.intervention.io/", + "keywords": [ + "gd", + "image", + "imagick", + "laravel", + "thumbnail", + "watermark" + ], + "time": "2016-02-26 18:18:19" + }, + { + "name": "jakub-onderka/php-console-color", + "version": "0.1", + "source": { + "type": "git", + "url": "https://github.com/JakubOnderka/PHP-Console-Color.git", + "reference": "e0b393dacf7703fc36a4efc3df1435485197e6c1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Color/zipball/e0b393dacf7703fc36a4efc3df1435485197e6c1", + "reference": "e0b393dacf7703fc36a4efc3df1435485197e6c1", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "jakub-onderka/php-code-style": "1.0", + "jakub-onderka/php-parallel-lint": "0.*", + "jakub-onderka/php-var-dump-check": "0.*", + "phpunit/phpunit": "3.7.*", + "squizlabs/php_codesniffer": "1.*" + }, + "type": "library", + "autoload": { + "psr-0": { + "JakubOnderka\\PhpConsoleColor": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Jakub Onderka", + "email": "jakub.onderka@gmail.com", + "homepage": "http://www.acci.cz" + } + ], + "time": "2014-04-08 15:00:19" + }, + { + "name": "jakub-onderka/php-console-highlighter", + "version": "v0.3.2", + "source": { + "type": "git", + "url": "https://github.com/JakubOnderka/PHP-Console-Highlighter.git", + "reference": "7daa75df45242c8d5b75a22c00a201e7954e4fb5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Highlighter/zipball/7daa75df45242c8d5b75a22c00a201e7954e4fb5", + "reference": "7daa75df45242c8d5b75a22c00a201e7954e4fb5", + "shasum": "" + }, + "require": { + "jakub-onderka/php-console-color": "~0.1", + "php": ">=5.3.0" + }, + "require-dev": { + "jakub-onderka/php-code-style": "~1.0", + "jakub-onderka/php-parallel-lint": "~0.5", + "jakub-onderka/php-var-dump-check": "~0.1", + "phpunit/phpunit": "~4.0", + "squizlabs/php_codesniffer": "~1.5" + }, + "type": "library", + "autoload": { + "psr-0": { + "JakubOnderka\\PhpConsoleHighlighter": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jakub Onderka", + "email": "acci@acci.cz", + "homepage": "http://www.acci.cz/" + } + ], + "time": "2015-04-20 18:58:01" + }, + { + "name": "jeremeamia/SuperClosure", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/jeremeamia/super_closure.git", + "reference": "29a88be2a4846d27c1613aed0c9071dfad7b5938" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jeremeamia/super_closure/zipball/29a88be2a4846d27c1613aed0c9071dfad7b5938", + "reference": "29a88be2a4846d27c1613aed0c9071dfad7b5938", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^1.2|^2.0", + "php": ">=5.4", + "symfony/polyfill-php56": "^1.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + } + }, + "autoload": { + "psr-4": { + "SuperClosure\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia", + "role": "Developer" + } + ], + "description": "Serialize Closure objects, including their context and binding", + "homepage": "https://github.com/jeremeamia/super_closure", + "keywords": [ + "closure", + "function", + "lambda", + "parser", + "serializable", + "serialize", + "tokenizer" + ], + "time": "2015-12-05 17:17:57" + }, + { + "name": "laravel/framework", + "version": "v5.2.23", + "source": { + "type": "git", + "url": "https://github.com/laravel/framework.git", + "reference": "87c090845f135ca94eba903f1c8462e60e3a6e36" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/framework/zipball/87c090845f135ca94eba903f1c8462e60e3a6e36", + "reference": "87c090845f135ca94eba903f1c8462e60e3a6e36", + "shasum": "" + }, + "require": { + "classpreloader/classpreloader": "~3.0", + "doctrine/inflector": "~1.0", + "ext-mbstring": "*", + "ext-openssl": "*", + "jeremeamia/superclosure": "~2.2", + "league/flysystem": "~1.0", + "monolog/monolog": "~1.11", + "mtdowling/cron-expression": "~1.0", + "nesbot/carbon": "~1.20", + "paragonie/random_compat": "~1.1", + "php": ">=5.5.9", + "psy/psysh": "0.7.*", + "swiftmailer/swiftmailer": "~5.1", + "symfony/console": "2.8.*|3.0.*", + "symfony/debug": "2.8.*|3.0.*", + "symfony/finder": "2.8.*|3.0.*", + "symfony/http-foundation": "2.8.*|3.0.*", + "symfony/http-kernel": "2.8.*|3.0.*", + "symfony/polyfill-php56": "~1.0", + "symfony/process": "2.8.*|3.0.*", + "symfony/routing": "2.8.*|3.0.*", + "symfony/translation": "2.8.*|3.0.*", + "symfony/var-dumper": "2.8.*|3.0.*", + "vlucas/phpdotenv": "~2.2" + }, + "replace": { + "illuminate/auth": "self.version", + "illuminate/broadcasting": "self.version", + "illuminate/bus": "self.version", + "illuminate/cache": "self.version", + "illuminate/config": "self.version", + "illuminate/console": "self.version", + "illuminate/container": "self.version", + "illuminate/contracts": "self.version", + "illuminate/cookie": "self.version", + "illuminate/database": "self.version", + "illuminate/encryption": "self.version", + "illuminate/events": "self.version", + "illuminate/exception": "self.version", + "illuminate/filesystem": "self.version", + "illuminate/hashing": "self.version", + "illuminate/http": "self.version", + "illuminate/log": "self.version", + "illuminate/mail": "self.version", + "illuminate/pagination": "self.version", + "illuminate/pipeline": "self.version", + "illuminate/queue": "self.version", + "illuminate/redis": "self.version", + "illuminate/routing": "self.version", + "illuminate/session": "self.version", + "illuminate/support": "self.version", + "illuminate/translation": "self.version", + "illuminate/validation": "self.version", + "illuminate/view": "self.version" + }, + "require-dev": { + "aws/aws-sdk-php": "~3.0", + "mockery/mockery": "~0.9.2", + "pda/pheanstalk": "~3.0", + "phpunit/phpunit": "~4.1", + "predis/predis": "~1.0", + "symfony/css-selector": "2.8.*|3.0.*", + "symfony/dom-crawler": "2.8.*|3.0.*" + }, + "suggest": { + "aws/aws-sdk-php": "Required to use the SQS queue driver and SES mail driver (~3.0).", + "doctrine/dbal": "Required to rename columns and drop SQLite columns (~2.4).", + "fzaninotto/faker": "Required to use the eloquent factory builder (~1.4).", + "guzzlehttp/guzzle": "Required to use the Mailgun and Mandrill mail drivers and the ping methods on schedules (~5.3|~6.0).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (~1.0).", + "league/flysystem-rackspace": "Required to use the Flysystem Rackspace driver (~1.0).", + "pda/pheanstalk": "Required to use the beanstalk queue driver (~3.0).", + "predis/predis": "Required to use the redis cache and queue drivers (~1.0).", + "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (~2.0).", + "symfony/css-selector": "Required to use some of the crawler integration testing tools (2.8.*|3.0.*).", + "symfony/dom-crawler": "Required to use most of the crawler integration testing tools (2.8.*|3.0.*)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/Illuminate/Queue/IlluminateQueueClosure.php" + ], + "files": [ + "src/Illuminate/Foundation/helpers.php", + "src/Illuminate/Support/helpers.php" + ], + "psr-4": { + "Illuminate\\": "src/Illuminate/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylorotwell@gmail.com" + } + ], + "description": "The Laravel Framework.", + "homepage": "http://laravel.com", + "keywords": [ + "framework", + "laravel" + ], + "time": "2016-03-14 14:22:33" + }, + { + "name": "laravelcollective/html", + "version": "v5.2.4", + "source": { + "type": "git", + "url": "https://github.com/LaravelCollective/html.git", + "reference": "3a312d39ffe37da0f57b602618b61fd07c1fcec5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/LaravelCollective/html/zipball/3a312d39ffe37da0f57b602618b61fd07c1fcec5", + "reference": "3a312d39ffe37da0f57b602618b61fd07c1fcec5", + "shasum": "" + }, + "require": { + "illuminate/http": "5.2.*", + "illuminate/routing": "5.2.*", + "illuminate/session": "5.2.*", + "illuminate/support": "5.2.*", + "illuminate/view": "5.2.*", + "php": ">=5.5.9" + }, + "require-dev": { + "illuminate/database": "5.2.*", + "mockery/mockery": "~0.9", + "phpunit/phpunit": "~4.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Collective\\Html\\": "src/" + }, + "files": [ + "src/helpers.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylorotwell@gmail.com" + }, + { + "name": "Adam Engebretson", + "email": "adam@laravelcollective.com" + } + ], + "description": "HTML and Form Builders for the Laravel Framework", + "homepage": "http://laravelcollective.com", + "time": "2016-01-27 22:29:54" + }, + { + "name": "league/csv", + "version": "7.2.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/csv.git", + "reference": "69bafa6ff924fbf9effe4275d6eb16be81a853ef" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/csv/zipball/69bafa6ff924fbf9effe4275d6eb16be81a853ef", + "reference": "69bafa6ff924fbf9effe4275d6eb16be81a853ef", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=5.4.0" + }, + "require-dev": { + "fabpot/php-cs-fixer": "^1.9", + "phpunit/phpunit": "^4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.2-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Csv\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://github.com/nyamsprod/", + "role": "Developer" + } + ], + "description": "Csv data manipulation made easy in PHP", + "homepage": "http://csv.thephpleague.com", + "keywords": [ + "csv", + "export", + "filter", + "import", + "read", + "write" + ], + "time": "2015-11-02 07:36:25" + }, + { + "name": "league/flysystem", + "version": "1.0.20", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "e87a786e3ae12a25cf78a71bb07b4b384bfaa83a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/e87a786e3ae12a25cf78a71bb07b4b384bfaa83a", + "reference": "e87a786e3ae12a25cf78a71bb07b4b384bfaa83a", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "conflict": { + "league/flysystem-sftp": "<1.0.6" + }, + "require-dev": { + "ext-fileinfo": "*", + "mockery/mockery": "~0.9", + "phpspec/phpspec": "^2.2", + "phpunit/phpunit": "~4.8 || ~5.0" + }, + "suggest": { + "ext-fileinfo": "Required for MimeType", + "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2", + "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3", + "league/flysystem-azure": "Allows you to use Windows Azure Blob storage", + "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching", + "league/flysystem-copy": "Allows you to use Copy.com storage", + "league/flysystem-dropbox": "Allows you to use Dropbox storage", + "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem", + "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files", + "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib", + "league/flysystem-webdav": "Allows you to use WebDAV storage", + "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Flysystem\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frenky.net" + } + ], + "description": "Filesystem abstraction: Many filesystems, one API.", + "keywords": [ + "Cloud Files", + "WebDAV", + "abstraction", + "aws", + "cloud", + "copy.com", + "dropbox", + "file systems", + "files", + "filesystem", + "filesystems", + "ftp", + "rackspace", + "remote", + "s3", + "sftp", + "storage" + ], + "time": "2016-03-14 21:54:11" + }, + { + "name": "maknz/slack", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/maknz/slack.git", + "reference": "76f8497bbdb001d5e96345e0f83be081153354cb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/maknz/slack/zipball/76f8497bbdb001d5e96345e0f83be081153354cb", + "reference": "76f8497bbdb001d5e96345e0f83be081153354cb", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "guzzlehttp/guzzle": "~6.0|~5.0|~4.0", + "php": ">=5.4.0" + }, + "require-dev": { + "mockery/mockery": "0.9.*", + "phpunit/phpunit": "4.2.*" + }, + "suggest": { + "illuminate/support": "Required for Laravel support", + "nexylan/slack-bundle": "Required for Symfony bundle support" + }, + "type": "library", + "autoload": { + "psr-4": { + "Maknz\\Slack\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "maknz", + "email": "github@mak.geek.nz" + } + ], + "description": "A simple PHP package for sending messages to Slack, with a focus on ease of use and elegant syntax. Includes Laravel support out of the box.", + "keywords": [ + "laravel", + "slack" + ], + "time": "2016-03-08 19:45:05" + }, + { + "name": "maximebf/debugbar", + "version": "v1.11.1", + "source": { + "type": "git", + "url": "https://github.com/maximebf/php-debugbar.git", + "reference": "d9302891c1f0a0ac5a4f66725163a00537c6359f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/d9302891c1f0a0ac5a4f66725163a00537c6359f", + "reference": "d9302891c1f0a0ac5a4f66725163a00537c6359f", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "psr/log": "^1.0", + "symfony/var-dumper": "^2.6|^3.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0|^5.0" + }, + "suggest": { + "kriswallsmith/assetic": "The best way to manage assets", + "monolog/monolog": "Log using Monolog", + "predis/predis": "Redis storage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.11-dev" + } + }, + "autoload": { + "psr-4": { + "DebugBar\\": "src/DebugBar/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Maxime Bouroumeau-Fuseau", + "email": "maxime.bouroumeau@gmail.com", + "homepage": "http://maximebf.com" + }, + { + "name": "Barry vd. Heuvel", + "email": "barryvdh@gmail.com" + } + ], + "description": "Debug bar in the browser for php application", + "homepage": "https://github.com/maximebf/php-debugbar", + "keywords": [ + "debug", + "debugbar" + ], + "time": "2016-01-22 12:22:23" + }, + { + "name": "monolog/monolog", + "version": "1.18.1", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "a5f2734e8c16f3aa21b3da09715d10e15b4d2d45" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/a5f2734e8c16f3aa21b3da09715d10e15b4d2d45", + "reference": "a5f2734e8c16f3aa21b3da09715d10e15b4d2d45", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "psr/log": "~1.0" + }, + "provide": { + "psr/log-implementation": "1.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^2.4.9", + "doctrine/couchdb": "~1.0@dev", + "graylog2/gelf-php": "~1.0", + "jakub-onderka/php-parallel-lint": "0.9", + "php-console/php-console": "^3.1.3", + "phpunit/phpunit": "~4.5", + "phpunit/phpunit-mock-objects": "2.3.0", + "raven/raven": "^0.13", + "ruflin/elastica": ">=0.90 <3.0", + "swiftmailer/swiftmailer": "~5.3", + "videlalvaro/php-amqplib": "~2.4" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-mongo": "Allow sending log messages to a MongoDB server", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server via PHP Driver", + "php-console/php-console": "Allow sending log messages to Google Chrome", + "raven/raven": "Allow sending log messages to a Sentry server", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server", + "videlalvaro/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "http://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "time": "2016-03-13 16:08:35" + }, + { + "name": "mtdowling/cron-expression", + "version": "v1.1.0", + "source": { + "type": "git", + "url": "https://github.com/mtdowling/cron-expression.git", + "reference": "c9ee7886f5a12902b225a1a12f36bb45f9ab89e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mtdowling/cron-expression/zipball/c9ee7886f5a12902b225a1a12f36bb45f9ab89e5", + "reference": "c9ee7886f5a12902b225a1a12f36bb45f9ab89e5", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.0|~5.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "Cron": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", + "keywords": [ + "cron", + "schedule" + ], + "time": "2016-01-26 21:23:30" + }, + { + "name": "mtdowling/jmespath.php", + "version": "2.3.0", + "source": { + "type": "git", + "url": "https://github.com/jmespath/jmespath.php.git", + "reference": "192f93e43c2c97acde7694993ab171b3de284093" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/192f93e43c2c97acde7694993ab171b3de284093", + "reference": "192f93e43c2c97acde7694993ab171b3de284093", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "bin": [ + "bin/jp.php" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "psr-4": { + "JmesPath\\": "src/" + }, + "files": [ + "src/JmesPath.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Declaratively specify how to extract elements from a JSON document", + "keywords": [ + "json", + "jsonpath" + ], + "time": "2016-01-05 18:25:05" + }, + { + "name": "nesbot/carbon", + "version": "1.21.0", + "source": { + "type": "git", + "url": "https://github.com/briannesbitt/Carbon.git", + "reference": "7b08ec6f75791e130012f206e3f7b0e76e18e3d7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/7b08ec6f75791e130012f206e3f7b0e76e18e3d7", + "reference": "7b08ec6f75791e130012f206e3f7b0e76e18e3d7", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "symfony/translation": "~2.6|~3.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.0|~5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "http://nesbot.com" + } + ], + "description": "A simple API extension for DateTime.", + "homepage": "http://carbon.nesbot.com", + "keywords": [ + "date", + "datetime", + "time" + ], + "time": "2015-11-04 20:07:17" + }, + { + "name": "nikic/php-parser", + "version": "v2.0.1", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "ce5be709d59b32dd8a88c80259028759991a4206" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/ce5be709d59b32dd8a88c80259028759991a4206", + "reference": "ce5be709d59b32dd8a88c80259028759991a4206", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=5.4" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "time": "2016-02-28 19:48:28" + }, + { + "name": "paragonie/random_compat", + "version": "v1.2.2", + "source": { + "type": "git", + "url": "https://github.com/paragonie/random_compat.git", + "reference": "b3313b618f4edd76523572531d5d7e22fe747430" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/b3313b618f4edd76523572531d5d7e22fe747430", + "reference": "b3313b618f4edd76523572531d5d7e22fe747430", + "shasum": "" + }, + "require": { + "php": ">=5.2.0" + }, + "require-dev": { + "phpunit/phpunit": "4.*|5.*" + }, + "suggest": { + "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." + }, + "type": "library", + "autoload": { + "files": [ + "lib/random.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", + "keywords": [ + "csprng", + "pseudorandom", + "random" + ], + "time": "2016-03-11 19:54:08" + }, + { + "name": "psr/http-message", + "version": "1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "85d63699f0dbedb190bbd4b0d2b9dc707ea4c298" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/85d63699f0dbedb190bbd4b0d2b9dc707ea4c298", + "reference": "85d63699f0dbedb190bbd4b0d2b9dc707ea4c298", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "time": "2015-05-04 20:22:00" + }, + { + "name": "psr/log", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/fe0936ee26643249e916849d48e3a51d5f5e278b", + "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b", + "shasum": "" + }, + "type": "library", + "autoload": { + "psr-0": { + "Psr\\Log\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "time": "2012-12-21 11:40:51" + }, + { + "name": "psy/psysh", + "version": "v0.7.2", + "source": { + "type": "git", + "url": "https://github.com/bobthecow/psysh.git", + "reference": "e64e10b20f8d229cac76399e1f3edddb57a0f280" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/e64e10b20f8d229cac76399e1f3edddb57a0f280", + "reference": "e64e10b20f8d229cac76399e1f3edddb57a0f280", + "shasum": "" + }, + "require": { + "dnoegel/php-xdg-base-dir": "0.1", + "jakub-onderka/php-console-highlighter": "0.3.*", + "nikic/php-parser": "^1.2.1|~2.0", + "php": ">=5.3.9", + "symfony/console": "~2.3.10|^2.4.2|~3.0", + "symfony/var-dumper": "~2.7|~3.0" + }, + "require-dev": { + "fabpot/php-cs-fixer": "~1.5", + "phpunit/phpunit": "~3.7|~4.0|~5.0", + "squizlabs/php_codesniffer": "~2.0", + "symfony/finder": "~2.1|~3.0" + }, + "suggest": { + "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", + "ext-pdo-sqlite": "The doc command requires SQLite to work.", + "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well.", + "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history." + }, + "bin": [ + "bin/psysh" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-develop": "0.8.x-dev" + } + }, + "autoload": { + "files": [ + "src/Psy/functions.php" + ], + "psr-4": { + "Psy\\": "src/Psy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Hileman", + "email": "justin@justinhileman.info", + "homepage": "http://justinhileman.com" + } + ], + "description": "An interactive shell for modern PHP.", + "homepage": "http://psysh.org", + "keywords": [ + "REPL", + "console", + "interactive", + "shell" + ], + "time": "2016-03-09 05:03:14" + }, + { + "name": "react/promise", + "version": "v2.2.2", + "source": { + "type": "git", + "url": "https://github.com/reactphp/promise.git", + "reference": "3aacad8bf10c7d83e6fa2089d413529888c2bedf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/promise/zipball/3aacad8bf10c7d83e6fa2089d413529888c2bedf", + "reference": "3aacad8bf10c7d83e6fa2089d413529888c2bedf", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "psr-4": { + "React\\Promise\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com" + } + ], + "description": "A lightweight implementation of CommonJS Promises/A for PHP", + "time": "2016-02-26 19:09:02" + }, + { + "name": "spatie/laravel-backup", + "version": "2.10.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-backup.git", + "reference": "f62f211dca9e506069e43586cc362da9cba446b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-backup/zipball/f62f211dca9e506069e43586cc362da9cba446b6", + "reference": "f62f211dca9e506069e43586cc362da9cba446b6", + "shasum": "" + }, + "require": { + "illuminate/console": "5.*", + "illuminate/support": "5.*", + "php": "^5.4.0|^7.0", + "symfony/finder": "^2.6|^3.0" + }, + "require-dev": { + "laravel/framework": "5.*", + "mockery/mockery": "0.9.*", + "orchestra/testbench": "~3.0", + "phpunit/phpunit": "4.*", + "scrutinizer/ocular": "~1.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Backup\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://murze.be", + "role": "Developer" + } + ], + "description": "Backup command for Laravel 5 applications", + "homepage": "https://github.com/spatie/laravel-backup", + "keywords": [ + "backup", + "database", + "laravel 5", + "laravel-backup", + "mysql", + "spatie" + ], + "time": "2016-02-25 20:33:38" + }, + { + "name": "swiftmailer/swiftmailer", + "version": "v5.4.1", + "source": { + "type": "git", + "url": "https://github.com/swiftmailer/swiftmailer.git", + "reference": "0697e6aa65c83edf97bb0f23d8763f94e3f11421" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/0697e6aa65c83edf97bb0f23d8763f94e3f11421", + "reference": "0697e6aa65c83edf97bb0f23d8763f94e3f11421", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "mockery/mockery": "~0.9.1,<0.9.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.4-dev" + } + }, + "autoload": { + "files": [ + "lib/swift_required.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Corbyn" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Swiftmailer, free feature-rich PHP mailer", + "homepage": "http://swiftmailer.org", + "keywords": [ + "email", + "mail", + "mailer" + ], + "time": "2015-06-06 14:19:39" + }, + { + "name": "symfony/console", + "version": "v3.0.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "2ed5e2706ce92313d120b8fe50d1063bcfd12e04" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/2ed5e2706ce92313d120b8fe50d1063bcfd12e04", + "reference": "2ed5e2706ce92313d120b8fe50d1063bcfd12e04", + "shasum": "" + }, + "require": { + "php": ">=5.5.9", + "symfony/polyfill-mbstring": "~1.0" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/event-dispatcher": "~2.8|~3.0", + "symfony/process": "~2.8|~3.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/process": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Console Component", + "homepage": "https://symfony.com", + "time": "2016-02-28 16:24:34" + }, + { + "name": "symfony/debug", + "version": "v3.0.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/debug.git", + "reference": "29606049ced1ec715475f88d1bbe587252a3476e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/debug/zipball/29606049ced1ec715475f88d1bbe587252a3476e", + "reference": "29606049ced1ec715475f88d1bbe587252a3476e", + "shasum": "" + }, + "require": { + "php": ">=5.5.9", + "psr/log": "~1.0" + }, + "conflict": { + "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2" + }, + "require-dev": { + "symfony/class-loader": "~2.8|~3.0", + "symfony/http-kernel": "~2.8|~3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Debug\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Debug Component", + "homepage": "https://symfony.com", + "time": "2016-01-27 05:14:46" + }, + { + "name": "symfony/event-dispatcher", + "version": "v3.0.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "4dd5df31a28c0f82b41cb1e1599b74b5dcdbdafa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/4dd5df31a28c0f82b41cb1e1599b74b5dcdbdafa", + "reference": "4dd5df31a28c0f82b41cb1e1599b74b5dcdbdafa", + "shasum": "" + }, + "require": { + "php": ">=5.5.9" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~2.8|~3.0", + "symfony/dependency-injection": "~2.8|~3.0", + "symfony/expression-language": "~2.8|~3.0", + "symfony/stopwatch": "~2.8|~3.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony EventDispatcher Component", + "homepage": "https://symfony.com", + "time": "2016-01-27 05:14:46" + }, + { + "name": "symfony/finder", + "version": "v3.0.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "623bda0abd9aa29e529c8e9c08b3b84171914723" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/623bda0abd9aa29e529c8e9c08b3b84171914723", + "reference": "623bda0abd9aa29e529c8e9c08b3b84171914723", + "shasum": "" + }, + "require": { + "php": ">=5.5.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Finder Component", + "homepage": "https://symfony.com", + "time": "2016-01-27 05:14:46" + }, + { + "name": "symfony/http-foundation", + "version": "v3.0.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "52065702c71743c05d415a8facfcad6d4257e8d7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/52065702c71743c05d415a8facfcad6d4257e8d7", + "reference": "52065702c71743c05d415a8facfcad6d4257e8d7", + "shasum": "" + }, + "require": { + "php": ">=5.5.9" + }, + "require-dev": { + "symfony/expression-language": "~2.8|~3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony HttpFoundation Component", + "homepage": "https://symfony.com", + "time": "2016-02-28 16:24:34" + }, + { + "name": "symfony/http-kernel", + "version": "v3.0.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "59c0a1972e9aad87b7a56bbe1ccee26b7535a0db" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/59c0a1972e9aad87b7a56bbe1ccee26b7535a0db", + "reference": "59c0a1972e9aad87b7a56bbe1ccee26b7535a0db", + "shasum": "" + }, + "require": { + "php": ">=5.5.9", + "psr/log": "~1.0", + "symfony/debug": "~2.8|~3.0", + "symfony/event-dispatcher": "~2.8|~3.0", + "symfony/http-foundation": "~2.8|~3.0" + }, + "conflict": { + "symfony/config": "<2.8" + }, + "require-dev": { + "symfony/browser-kit": "~2.8|~3.0", + "symfony/class-loader": "~2.8|~3.0", + "symfony/config": "~2.8|~3.0", + "symfony/console": "~2.8|~3.0", + "symfony/css-selector": "~2.8|~3.0", + "symfony/dependency-injection": "~2.8|~3.0", + "symfony/dom-crawler": "~2.8|~3.0", + "symfony/expression-language": "~2.8|~3.0", + "symfony/finder": "~2.8|~3.0", + "symfony/process": "~2.8|~3.0", + "symfony/routing": "~2.8|~3.0", + "symfony/stopwatch": "~2.8|~3.0", + "symfony/templating": "~2.8|~3.0", + "symfony/translation": "~2.8|~3.0", + "symfony/var-dumper": "~2.8|~3.0" + }, + "suggest": { + "symfony/browser-kit": "", + "symfony/class-loader": "", + "symfony/config": "", + "symfony/console": "", + "symfony/dependency-injection": "", + "symfony/finder": "", + "symfony/var-dumper": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony HttpKernel Component", + "homepage": "https://symfony.com", + "time": "2016-02-28 21:33:13" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "1289d16209491b584839022f29257ad859b8532d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/1289d16209491b584839022f29257ad859b8532d", + "reference": "1289d16209491b584839022f29257ad859b8532d", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "time": "2016-01-20 09:13:37" + }, + { + "name": "symfony/polyfill-php56", + "version": "v1.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php56.git", + "reference": "4d891fff050101a53a4caabb03277284942d1ad9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/4d891fff050101a53a4caabb03277284942d1ad9", + "reference": "4d891fff050101a53a4caabb03277284942d1ad9", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "symfony/polyfill-util": "~1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php56\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 5.6+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "time": "2016-01-20 09:13:37" + }, + { + "name": "symfony/polyfill-util", + "version": "v1.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-util.git", + "reference": "8de62801aa12bc4dfcf85eef5d21981ae7bb3cc4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-util/zipball/8de62801aa12bc4dfcf85eef5d21981ae7bb3cc4", + "reference": "8de62801aa12bc4dfcf85eef5d21981ae7bb3cc4", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Util\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony utilities for portability of PHP codes", + "homepage": "https://symfony.com", + "keywords": [ + "compat", + "compatibility", + "polyfill", + "shim" + ], + "time": "2016-01-20 09:13:37" + }, + { + "name": "symfony/process", + "version": "v3.0.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "dfecef47506179db2501430e732adbf3793099c8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/dfecef47506179db2501430e732adbf3793099c8", + "reference": "dfecef47506179db2501430e732adbf3793099c8", + "shasum": "" + }, + "require": { + "php": ">=5.5.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Process Component", + "homepage": "https://symfony.com", + "time": "2016-02-02 13:44:19" + }, + { + "name": "symfony/routing", + "version": "v3.0.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "fa1e9a8173cf0077dd995205da453eacd758fdf6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/fa1e9a8173cf0077dd995205da453eacd758fdf6", + "reference": "fa1e9a8173cf0077dd995205da453eacd758fdf6", + "shasum": "" + }, + "require": { + "php": ">=5.5.9" + }, + "conflict": { + "symfony/config": "<2.8" + }, + "require-dev": { + "doctrine/annotations": "~1.0", + "doctrine/common": "~2.2", + "psr/log": "~1.0", + "symfony/config": "~2.8|~3.0", + "symfony/expression-language": "~2.8|~3.0", + "symfony/http-foundation": "~2.8|~3.0", + "symfony/yaml": "~2.8|~3.0" + }, + "suggest": { + "doctrine/annotations": "For using the annotation loader", + "symfony/config": "For using the all-in-one router or any loader", + "symfony/dependency-injection": "For loading routes from a service", + "symfony/expression-language": "For using expression matching", + "symfony/http-foundation": "For using a Symfony Request object", + "symfony/yaml": "For using the YAML loader" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Routing Component", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "time": "2016-02-04 13:53:13" + }, + { + "name": "symfony/translation", + "version": "v3.0.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "2de0b6f7ebe43cffd8a06996ebec6aab79ea9e91" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/2de0b6f7ebe43cffd8a06996ebec6aab79ea9e91", + "reference": "2de0b6f7ebe43cffd8a06996ebec6aab79ea9e91", + "shasum": "" + }, + "require": { + "php": ">=5.5.9", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/config": "<2.8" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~2.8|~3.0", + "symfony/intl": "~2.8|~3.0", + "symfony/yaml": "~2.8|~3.0" + }, + "suggest": { + "psr/log": "To use logging capability in translator", + "symfony/config": "", + "symfony/yaml": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Translation Component", + "homepage": "https://symfony.com", + "time": "2016-02-02 13:44:19" + }, + { + "name": "symfony/var-dumper", + "version": "v3.0.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "9a6a883c48acb215d4825ce9de61dccf93d62074" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/9a6a883c48acb215d4825ce9de61dccf93d62074", + "reference": "9a6a883c48acb215d4825ce9de61dccf93d62074", + "shasum": "" + }, + "require": { + "php": ">=5.5.9", + "symfony/polyfill-mbstring": "~1.0" + }, + "require-dev": { + "twig/twig": "~1.20|~2.0" + }, + "suggest": { + "ext-symfony_debug": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony mechanism for exploring and dumping PHP variables", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "time": "2016-02-13 09:23:44" + }, + { + "name": "tecnickcom/tc-lib-barcode", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/tecnickcom/tc-lib-barcode.git", + "reference": "33b248762ecf67af522139850b4d8b8ddabfa688" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tecnickcom/tc-lib-barcode/zipball/33b248762ecf67af522139850b4d8b8ddabfa688", + "reference": "33b248762ecf67af522139850b4d8b8ddabfa688", + "shasum": "" + }, + "require": { + "php": ">=5.4", + "tecnickcom/tc-lib-color": "^1.10.0" + }, + "require-dev": { + "apigen/apigen": "^4.1.2", + "bartlett/php-compatinfo": "^5.0.0", + "pdepend/pdepend": "^2.2.2", + "phploc/phploc": "^2.1.5|^3.0.0", + "phpmd/phpmd": "^2.3.2", + "phpunit/phpunit": "4.8.19|^5.0.0", + "sebastian/phpcpd": "^2.0.2", + "squizlabs/php_codesniffer": "^2.5.0|^3.0.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Com\\Tecnick\\Barcode\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GNU-LGPL v3" + ], + "authors": [ + { + "name": "Nicola Asuni", + "email": "info@tecnick.com", + "role": "lead" + } + ], + "description": "PHP library to generate linear and bidimensional barcodes", + "homepage": "http://www.tecnick.com", + "keywords": [ + "3 of 9", + "ANSI MH10.8M-1983", + "CBC", + "CODABAR", + "CODE 11", + "CODE 128 A B C", + "CODE 39", + "CODE 93", + "EAN 13", + "EAN 8", + "ECC200", + "Intelligent Mail Barcode", + "Interleaved 2 of 5", + "KIX", + "Klant", + "MSI", + "Onecode", + "PHARMACODE", + "PHARMACODE TWO-TRACKS", + "POSTNET", + "RMS4CC", + "Standard 2 of 5", + "UPC-A", + "UPC-E", + "USD-3", + "USPS-B-3200", + "USS-93", + "barcode", + "datamatrix", + "pdf417", + "planet", + "qr-code", + "royal mail", + "tc-lib-barcode", + "upc" + ], + "time": "2016-03-09 21:42:35" + }, + { + "name": "tecnickcom/tc-lib-color", + "version": "1.10.3", + "source": { + "type": "git", + "url": "https://github.com/tecnickcom/tc-lib-color.git", + "reference": "298772ea3d78c11d842415e345d31a0b7b068dc1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tecnickcom/tc-lib-color/zipball/298772ea3d78c11d842415e345d31a0b7b068dc1", + "reference": "298772ea3d78c11d842415e345d31a0b7b068dc1", + "shasum": "" + }, + "require": { + "php": ">=5.4" + }, + "require-dev": { + "apigen/apigen": "^4.1.2", + "bartlett/php-compatinfo": "^5.0.0", + "pdepend/pdepend": "^2.2.2", + "phploc/phploc": "^2.1.5|^3.0.0", + "phpmd/phpmd": "^2.3.2", + "phpunit/phpunit": "4.8.19|^5.0.0", + "sebastian/phpcpd": "^2.0.2", + "squizlabs/php_codesniffer": "^2.5.0|^3.0.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Com\\Tecnick\\Color\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GNU-LGPL v3" + ], + "authors": [ + { + "name": "Nicola Asuni", + "email": "info@tecnick.com", + "role": "lead" + } + ], + "description": "PHP library to manipulate various color representations", + "homepage": "http://www.tecnick.com", + "keywords": [ + "cmyk", + "color", + "colors", + "colour", + "colours", + "hsl", + "hsla", + "javascript", + "rgb", + "rgba", + "tc-lib-color", + "web" + ], + "time": "2016-03-04 10:40:56" + }, + { + "name": "vlucas/phpdotenv", + "version": "v2.2.0", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "9caf304153dc2288e4970caec6f1f3b3bc205412" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/9caf304153dc2288e4970caec6f1f3b3bc205412", + "reference": "9caf304153dc2288e4970caec6f1f3b3bc205412", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "require-dev": { + "phpunit/phpunit": "^4.8|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + } + }, + "autoload": { + "psr-4": { + "Dotenv\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD" + ], + "authors": [ + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "http://www.vancelucas.com" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "homepage": "http://github.com/vlucas/phpdotenv", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "time": "2015-12-29 15:10:30" + }, + { + "name": "watson/validating", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/dwightwatson/validating.git", + "reference": "6acfec57bd480701b467570c4c08dcbfd6a9ea36" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dwightwatson/validating/zipball/6acfec57bd480701b467570c4c08dcbfd6a9ea36", + "reference": "6acfec57bd480701b467570c4c08dcbfd6a9ea36", + "shasum": "" + }, + "require": { + "illuminate/contracts": "~5.0", + "illuminate/database": "~5.0 || >=5.1.27", + "illuminate/events": "~5.0", + "illuminate/support": "~5.0", + "illuminate/validation": "~5.0", + "php": ">=5.4.0" + }, + "require-dev": { + "mockery/mockery": "0.9.*", + "phpunit/phpunit": "~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "Watson\\Validating\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dwight Watson", + "email": "dwight@studiousapp.com" + } + ], + "description": "Eloquent model validating trait.", + "keywords": [ + "eloquent", + "laravel", + "validation" + ], + "time": "2016-03-02 00:37:06" + } + ], + "packages-dev": [ + { + "name": "codeception/c3", + "version": "2.0.6", + "source": { + "type": "git", + "url": "https://github.com/Codeception/c3.git", + "reference": "dc4d39b36d585c2eda58129407e78855ea67b1ca" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/c3/zipball/dc4d39b36d585c2eda58129407e78855ea67b1ca", + "reference": "dc4d39b36d585c2eda58129407e78855ea67b1ca", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0", + "php": ">=5.4.0" + }, + "type": "composer-plugin", + "extra": { + "class": "Codeception\\c3\\Installer" + }, + "autoload": { + "psr-4": { + "Codeception\\c3\\": "." + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Tiger Seo", + "email": "tiger.seo@gmail.com" + }, + { + "name": "Michael Bodnarchuk", + "email": "davert.php@codegyre.com", + "homepage": "http://codegyre.com" + } + ], + "description": "CodeCoverage collector for Codeception", + "homepage": "http://codeception.com/", + "keywords": [ + "code coverage", + "codecoverage" + ], + "time": "2016-02-09 23:31:08" + }, + { + "name": "codeception/codeception", + "version": "2.1.7", + "source": { + "type": "git", + "url": "https://github.com/Codeception/Codeception.git", + "reference": "65971b0dee4972710365b6102154cd412a9bf7b1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/Codeception/zipball/65971b0dee4972710365b6102154cd412a9bf7b1", + "reference": "65971b0dee4972710365b6102154cd412a9bf7b1", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "facebook/webdriver": ">=1.0.1 <2.0", + "guzzlehttp/guzzle": ">=4.1.4 <7.0", + "guzzlehttp/psr7": "~1.0", + "php": ">=5.4.0 <8.0", + "phpunit/php-code-coverage": ">=2.1.3", + "phpunit/phpunit": ">4.8.20 <6.0", + "symfony/browser-kit": ">=2.5 <3.1", + "symfony/console": ">=2.5 <3.1", + "symfony/css-selector": ">=2.5 <3.1", + "symfony/dom-crawler": ">=2.5 <3.1", + "symfony/event-dispatcher": ">=2.5 <3.1", + "symfony/finder": ">=2.5 <3.1", + "symfony/yaml": ">=2.5 <3.1" + }, + "require-dev": { + "codeception/specify": "~0.3", + "facebook/php-sdk-v4": "~5.0", + "flow/jsonpath": "~0.2", + "monolog/monolog": "~1.8", + "pda/pheanstalk": "~2.0", + "php-amqplib/php-amqplib": "~2.4" + }, + "suggest": { + "codeception/phpbuiltinserver": "Extension to start and stop PHP built-in web server for your tests", + "codeception/specify": "BDD-style code blocks", + "codeception/verify": "BDD-style assertions", + "monolog/monolog": "Log test steps", + "phpseclib/phpseclib": "Extension required to use the SFTP option in the FTP Module." + }, + "bin": [ + "codecept" + ], + "type": "library", + "extra": { + "branch-alias": [] + }, + "autoload": { + "psr-4": { + "Codeception\\": "src\\Codeception", + "Codeception\\Extension\\": "ext" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk", + "email": "davert@mail.ua", + "homepage": "http://codegyre.com" + } + ], + "description": "BDD-style testing framework", + "homepage": "http://codeception.com/", + "keywords": [ + "BDD", + "TDD", + "acceptance testing", + "functional testing", + "unit testing" + ], + "time": "2016-03-12 01:15:25" + }, + { + "name": "doctrine/instantiator", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d", + "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d", + "shasum": "" + }, + "require": { + "php": ">=5.3,<8.0-DEV" + }, + "require-dev": { + "athletic/athletic": "~0.1.8", + "ext-pdo": "*", + "ext-phar": "*", + "phpunit/phpunit": "~4.0", + "squizlabs/php_codesniffer": "~2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "http://ocramius.github.com/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://github.com/doctrine/instantiator", + "keywords": [ + "constructor", + "instantiate" + ], + "time": "2015-06-14 21:17:01" + }, + { + "name": "facebook/webdriver", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/facebook/php-webdriver.git", + "reference": "1c98108ba3eb435b681655764de11502a0653705" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/facebook/php-webdriver/zipball/1c98108ba3eb435b681655764de11502a0653705", + "reference": "1c98108ba3eb435b681655764de11502a0653705", + "shasum": "" + }, + "require": { + "php": ">=5.3.19" + }, + "require-dev": { + "phpunit/phpunit": "4.6.*" + }, + "suggest": { + "phpdocumentor/phpdocumentor": "2.*" + }, + "type": "library", + "autoload": { + "psr-4": { + "Facebook\\WebDriver\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "description": "A PHP client for WebDriver", + "homepage": "https://github.com/facebook/php-webdriver", + "keywords": [ + "facebook", + "php", + "selenium", + "webdriver" + ], + "time": "2015-12-31 15:58:49" + }, + { + "name": "fzaninotto/faker", + "version": "v1.5.0", + "source": { + "type": "git", + "url": "https://github.com/fzaninotto/Faker.git", + "reference": "d0190b156bcca848d401fb80f31f504f37141c8d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/d0190b156bcca848d401fb80f31f504f37141c8d", + "reference": "d0190b156bcca848d401fb80f31f504f37141c8d", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.0", + "squizlabs/php_codesniffer": "~1.5" + }, + "suggest": { + "ext-intl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Faker\\": "src/Faker/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "François Zaninotto" + } + ], + "description": "Faker is a PHP library that generates fake data for you.", + "keywords": [ + "data", + "faker", + "fixtures" + ], + "time": "2015-05-29 06:29:14" + }, + { + "name": "hamcrest/hamcrest-php", + "version": "v1.2.2", + "source": { + "type": "git", + "url": "https://github.com/hamcrest/hamcrest-php.git", + "reference": "b37020aa976fa52d3de9aa904aa2522dc518f79c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/b37020aa976fa52d3de9aa904aa2522dc518f79c", + "reference": "b37020aa976fa52d3de9aa904aa2522dc518f79c", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "replace": { + "cordoval/hamcrest-php": "*", + "davedevelopment/hamcrest-php": "*", + "kodova/hamcrest-php": "*" + }, + "require-dev": { + "phpunit/php-file-iterator": "1.3.3", + "satooshi/php-coveralls": "dev-master" + }, + "type": "library", + "autoload": { + "classmap": [ + "hamcrest" + ], + "files": [ + "hamcrest/Hamcrest.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD" + ], + "description": "This is the PHP port of Hamcrest Matchers", + "keywords": [ + "test" + ], + "time": "2015-05-11 14:41:42" + }, + { + "name": "mockery/mockery", + "version": "0.9.4", + "source": { + "type": "git", + "url": "https://github.com/padraic/mockery.git", + "reference": "70bba85e4aabc9449626651f48b9018ede04f86b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/padraic/mockery/zipball/70bba85e4aabc9449626651f48b9018ede04f86b", + "reference": "70bba85e4aabc9449626651f48b9018ede04f86b", + "shasum": "" + }, + "require": { + "hamcrest/hamcrest-php": "~1.1", + "lib-pcre": ">=7.0", + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.9.x-dev" + } + }, + "autoload": { + "psr-0": { + "Mockery": "library/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Pádraic Brady", + "email": "padraic.brady@gmail.com", + "homepage": "http://blog.astrumfutura.com" + }, + { + "name": "Dave Marshall", + "email": "dave.marshall@atstsolutions.co.uk", + "homepage": "http://davedevelopment.co.uk" + } + ], + "description": "Mockery is a simple yet flexible PHP mock object framework for use in unit testing with PHPUnit, PHPSpec or any other testing framework. Its core goal is to offer a test double framework with a succinct API capable of clearly defining all possible object operations and interactions using a human readable Domain Specific Language (DSL). Designed as a drop in alternative to PHPUnit's phpunit-mock-objects library, Mockery is easy to integrate with PHPUnit and can operate alongside phpunit-mock-objects without the World ending.", + "homepage": "http://github.com/padraic/mockery", + "keywords": [ + "BDD", + "TDD", + "library", + "mock", + "mock objects", + "mockery", + "stub", + "test", + "test double", + "testing" + ], + "time": "2015-04-02 19:54:00" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/d68dbdc53dc358a816f00b300704702b2eaff7b8", + "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "suggest": { + "dflydev/markdown": "~1.0", + "erusev/parsedown": "~1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "phpDocumentor": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "mike.vanriel@naenius.com" + } + ], + "time": "2015-02-03 12:10:50" + }, + { + "name": "phpspec/php-diff", + "version": "v1.0.2", + "source": { + "type": "git", + "url": "https://github.com/phpspec/php-diff.git", + "reference": "30e103d19519fe678ae64a60d77884ef3d71b28a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/php-diff/zipball/30e103d19519fe678ae64a60d77884ef3d71b28a", + "reference": "30e103d19519fe678ae64a60d77884ef3d71b28a", + "shasum": "" + }, + "type": "library", + "autoload": { + "psr-0": { + "Diff": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Chris Boulton", + "homepage": "http://github.com/chrisboulton", + "role": "Original developer" + } + ], + "description": "A comprehensive library for generating differences between two hashable objects (strings or arrays).", + "time": "2013-11-01 13:02:21" + }, + { + "name": "phpspec/phpspec", + "version": "2.4.1", + "source": { + "type": "git", + "url": "https://github.com/phpspec/phpspec.git", + "reference": "5528ce1e93a1efa090c9404aba3395c329b4e6ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/phpspec/zipball/5528ce1e93a1efa090c9404aba3395c329b4e6ed", + "reference": "5528ce1e93a1efa090c9404aba3395c329b4e6ed", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0.1", + "ext-tokenizer": "*", + "php": ">=5.3.3", + "phpspec/php-diff": "~1.0.0", + "phpspec/prophecy": "~1.4", + "sebastian/exporter": "~1.0", + "symfony/console": "~2.3|~3.0", + "symfony/event-dispatcher": "~2.1|~3.0", + "symfony/finder": "~2.1|~3.0", + "symfony/process": "^2.6|~3.0", + "symfony/yaml": "~2.1|~3.0" + }, + "require-dev": { + "behat/behat": "^3.0.11", + "bossa/phpspec2-expect": "~1.0", + "phpunit/phpunit": "~4.4", + "symfony/filesystem": "~2.1|~3.0" + }, + "suggest": { + "phpspec/nyan-formatters": "~1.0 – Adds Nyan formatters" + }, + "bin": [ + "bin/phpspec" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2.x-dev" + } + }, + "autoload": { + "psr-0": { + "PhpSpec": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com" + }, + { + "name": "Marcello Duarte", + "homepage": "http://marcelloduarte.net/" + } + ], + "description": "Specification-oriented BDD framework for PHP 5.3+", + "homepage": "http://phpspec.net/", + "keywords": [ + "BDD", + "SpecBDD", + "TDD", + "spec", + "specification", + "testing", + "tests" + ], + "time": "2016-01-01 10:17:54" + }, + { + "name": "phpspec/prophecy", + "version": "v1.6.0", + "source": { + "type": "git", + "url": "https://github.com/phpspec/prophecy.git", + "reference": "3c91bdf81797d725b14cb62906f9a4ce44235972" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/3c91bdf81797d725b14cb62906f9a4ce44235972", + "reference": "3c91bdf81797d725b14cb62906f9a4ce44235972", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0.2", + "php": "^5.3|^7.0", + "phpdocumentor/reflection-docblock": "~2.0", + "sebastian/comparator": "~1.1", + "sebastian/recursion-context": "~1.0" + }, + "require-dev": { + "phpspec/phpspec": "~2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.5.x-dev" + } + }, + "autoload": { + "psr-0": { + "Prophecy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com" + }, + { + "name": "Marcello Duarte", + "email": "marcello.duarte@gmail.com" + } + ], + "description": "Highly opinionated mocking framework for PHP 5.3+", + "homepage": "https://github.com/phpspec/prophecy", + "keywords": [ + "Double", + "Dummy", + "fake", + "mock", + "spy", + "stub" + ], + "time": "2016-02-15 07:46:21" + }, + { + "name": "phpunit/php-code-coverage", + "version": "2.2.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/eabf68b476ac7d0f73793aada060f1c1a9bf8979", + "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "phpunit/php-file-iterator": "~1.3", + "phpunit/php-text-template": "~1.2", + "phpunit/php-token-stream": "~1.3", + "sebastian/environment": "^1.3.2", + "sebastian/version": "~1.0" + }, + "require-dev": { + "ext-xdebug": ">=2.1.4", + "phpunit/phpunit": "~4" + }, + "suggest": { + "ext-dom": "*", + "ext-xdebug": ">=2.2.1", + "ext-xmlwriter": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "time": "2015-10-06 15:47:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "1.4.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/6150bf2c35d3fc379e50c7602b75caceaa39dbf0", + "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "time": "2015-06-21 13:08:43" + }, + { + "name": "phpunit/php-text-template", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "time": "2015-06-21 13:50:34" + }, + { + "name": "phpunit/php-timer", + "version": "1.0.7", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "3e82f4e9fc92665fafd9157568e4dcb01d014e5b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3e82f4e9fc92665fafd9157568e4dcb01d014e5b", + "reference": "3e82f4e9fc92665fafd9157568e4dcb01d014e5b", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "time": "2015-06-21 08:01:12" + }, + { + "name": "phpunit/php-token-stream", + "version": "1.4.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-token-stream.git", + "reference": "3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da", + "reference": "3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Wrapper around PHP's tokenizer extension.", + "homepage": "https://github.com/sebastianbergmann/php-token-stream/", + "keywords": [ + "tokenizer" + ], + "time": "2015-09-15 10:49:45" + }, + { + "name": "phpunit/phpunit", + "version": "4.8.24", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "a1066c562c52900a142a0e2bbf0582994671385e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a1066c562c52900a142a0e2bbf0582994671385e", + "reference": "a1066c562c52900a142a0e2bbf0582994671385e", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-pcre": "*", + "ext-reflection": "*", + "ext-spl": "*", + "php": ">=5.3.3", + "phpspec/prophecy": "^1.3.1", + "phpunit/php-code-coverage": "~2.1", + "phpunit/php-file-iterator": "~1.4", + "phpunit/php-text-template": "~1.2", + "phpunit/php-timer": ">=1.0.6", + "phpunit/phpunit-mock-objects": "~2.3", + "sebastian/comparator": "~1.1", + "sebastian/diff": "~1.2", + "sebastian/environment": "~1.3", + "sebastian/exporter": "~1.2", + "sebastian/global-state": "~1.0", + "sebastian/version": "~1.0", + "symfony/yaml": "~2.1|~3.0" + }, + "suggest": { + "phpunit/php-invoker": "~1.1" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.8.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "time": "2016-03-14 06:16:08" + }, + { + "name": "phpunit/phpunit-mock-objects", + "version": "2.3.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", + "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/ac8e7a3db35738d56ee9a76e78a4e03d97628983", + "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0.2", + "php": ">=5.3.3", + "phpunit/php-text-template": "~1.2", + "sebastian/exporter": "~1.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "suggest": { + "ext-soap": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Mock Object library for PHPUnit", + "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", + "keywords": [ + "mock", + "xunit" + ], + "time": "2015-10-02 06:51:40" + }, + { + "name": "sebastian/comparator", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "937efb279bd37a375bcadf584dec0726f84dbf22" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/937efb279bd37a375bcadf584dec0726f84dbf22", + "reference": "937efb279bd37a375bcadf584dec0726f84dbf22", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "sebastian/diff": "~1.2", + "sebastian/exporter": "~1.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "http://www.github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "time": "2015-07-26 15:48:44" + }, + { + "name": "sebastian/diff", + "version": "1.4.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/13edfd8706462032c2f52b4b862974dd46b71c9e", + "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff" + ], + "time": "2015-12-08 07:14:41" + }, + { + "name": "sebastian/environment", + "version": "1.3.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "dc7a29032cf72b54f36dac15a1ca5b3a1b6029bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/dc7a29032cf72b54f36dac15a1ca5b3a1b6029bf", + "reference": "dc7a29032cf72b54f36dac15a1ca5b3a1b6029bf", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "time": "2016-02-26 18:40:46" + }, + { + "name": "sebastian/exporter", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "7ae5513327cb536431847bcc0c10edba2701064e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/7ae5513327cb536431847bcc0c10edba2701064e", + "reference": "7ae5513327cb536431847bcc0c10edba2701064e", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "sebastian/recursion-context": "~1.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "http://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "time": "2015-06-21 07:55:53" + }, + { + "name": "sebastian/global-state", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4", + "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.2" + }, + "suggest": { + "ext-uopz": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "time": "2015-10-12 03:26:01" + }, + { + "name": "sebastian/recursion-context", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "913401df809e99e4f47b27cdd781f4a258d58791" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/913401df809e99e4f47b27cdd781f4a258d58791", + "reference": "913401df809e99e4f47b27cdd781f4a258d58791", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "time": "2015-11-11 19:50:13" + }, + { + "name": "sebastian/version", + "version": "1.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", + "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", + "shasum": "" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "time": "2015-06-21 13:59:46" + }, + { + "name": "symfony/browser-kit", + "version": "v3.0.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/browser-kit.git", + "reference": "dde849a0485b70a24b36f826ed3fb95b904d80c3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/dde849a0485b70a24b36f826ed3fb95b904d80c3", + "reference": "dde849a0485b70a24b36f826ed3fb95b904d80c3", + "shasum": "" + }, + "require": { + "php": ">=5.5.9", + "symfony/dom-crawler": "~2.8|~3.0" + }, + "require-dev": { + "symfony/css-selector": "~2.8|~3.0", + "symfony/process": "~2.8|~3.0" + }, + "suggest": { + "symfony/process": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\BrowserKit\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony BrowserKit Component", + "homepage": "https://symfony.com", + "time": "2016-01-27 11:34:55" + }, + { + "name": "symfony/css-selector", + "version": "v3.0.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "6605602690578496091ac20ec7a5cbd160d4dff4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/6605602690578496091ac20ec7a5cbd160d4dff4", + "reference": "6605602690578496091ac20ec7a5cbd160d4dff4", + "shasum": "" + }, + "require": { + "php": ">=5.5.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony CssSelector Component", + "homepage": "https://symfony.com", + "time": "2016-01-27 05:14:46" + }, + { + "name": "symfony/dom-crawler", + "version": "v3.0.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/dom-crawler.git", + "reference": "981c8edb4538f88ba976ed44bdcaa683fce3d6c6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/981c8edb4538f88ba976ed44bdcaa683fce3d6c6", + "reference": "981c8edb4538f88ba976ed44bdcaa683fce3d6c6", + "shasum": "" + }, + "require": { + "php": ">=5.5.9", + "symfony/polyfill-mbstring": "~1.0" + }, + "require-dev": { + "symfony/css-selector": "~2.8|~3.0" + }, + "suggest": { + "symfony/css-selector": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\DomCrawler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony DomCrawler Component", + "homepage": "https://symfony.com", + "time": "2016-02-28 16:24:34" + }, + { + "name": "symfony/yaml", + "version": "v3.0.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "b5ba64cd67ecd6887f63868fa781ca094bd1377c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/b5ba64cd67ecd6887f63868fa781ca094bd1377c", + "reference": "b5ba64cd67ecd6887f63868fa781ca094bd1377c", + "shasum": "" + }, + "require": { + "php": ">=5.5.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Yaml Component", + "homepage": "https://symfony.com", + "time": "2016-02-23 15:16:06" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": { + "intervention/image": 20, + "maknz/slack": 20, + "erusev/parsedown": 20, + "tecnickcom/tc-lib-barcode": 20 + }, + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=5.5.9" + }, + "platform-dev": [] +} diff --git a/config/app.php b/config/app.php new file mode 100644 index 0000000000..2cabe48913 --- /dev/null +++ b/config/app.php @@ -0,0 +1,242 @@ + env('APP_ENV', 'production'), + + /* + |-------------------------------------------------------------------------- + | Application Debug Mode + |-------------------------------------------------------------------------- + | + | When your application is in debug mode, detailed error messages with + | stack traces will be shown on every error that occurs within your + | application. If disabled, a simple generic error page is shown. + | + */ + + 'debug' => env('APP_DEBUG', false), + + /* + |-------------------------------------------------------------------------- + | Application URL + |-------------------------------------------------------------------------- + | + | This URL is used by the console to properly generate URLs when using + | the Artisan command line tool. You should set this to the root of + | your application so that it is used when running Artisan tasks. + | + */ + + 'url' => env('APP_URL', 'http://localhost'), + + /* + |-------------------------------------------------------------------------- + | Application Timezone + |-------------------------------------------------------------------------- + | + | Here you may specify the default timezone for your application, which + | will be used by the PHP date and date-time functions. We have gone + | ahead and set this to a sensible default for you out of the box. + | + */ + + 'timezone' => env('APP_TIMEZONE', 'UTC'), + + /* + |-------------------------------------------------------------------------- + | Application Locale Configuration + |-------------------------------------------------------------------------- + | + | The application locale determines the default locale that will be used + | by the translation service provider. You are free to set this value + | to any of the locales which will be supported by the application. + | + */ + + 'locale' => env('APP_LOCALE', 'en'), + + /* + |-------------------------------------------------------------------------- + | Application Fallback Locale + |-------------------------------------------------------------------------- + | + | The fallback locale determines the locale to use when the current one + | is not available. You may change the value to correspond to any of + | the language folders that are provided through your application. + | + */ + + 'fallback_locale' => 'en', + + /* + |-------------------------------------------------------------------------- + | Encryption Key + |-------------------------------------------------------------------------- + | + | This key is used by the Illuminate encrypter service and should be set + | to a random, 32 character string, otherwise these encrypted strings + | will not be safe. Please do this before deploying an application! + | + */ + + 'key' => env('APP_KEY'), + + 'cipher' => 'rijndael-256', + + /* + |-------------------------------------------------------------------------- + | Logging Configuration + |-------------------------------------------------------------------------- + | + | Here you may configure the log settings for your application. Out of + | the box, Laravel uses the Monolog PHP logging library. This gives + | you a variety of powerful log handlers / formatters to utilize. + | + | Available Settings: "single", "daily", "syslog", "errorlog" + | + */ + + 'log' => env('APP_LOG', 'single'), + + + /* + |-------------------------------------------------------------------------- + | Demo Mode Lockdown + |-------------------------------------------------------------------------- + | + | Normal users will never need to edit this. This option lets you run a + | version of Snipe-IT with limited functionality to prevent demo abuse. + | + */ + + 'lock_passwords' => env('APP_LOCKED', false), + + + + /* + |-------------------------------------------------------------------------- + | Autoloaded Service Providers + |-------------------------------------------------------------------------- + | + | The service providers listed here will be automatically loaded on the + | request to your application. Feel free to add your own services to + | this array to grant expanded functionality to your applications. + | + */ + + 'providers' => [ + + /* + * Laravel Framework Service Providers... + */ + Illuminate\Auth\AuthServiceProvider::class, + Illuminate\Broadcasting\BroadcastServiceProvider::class, + Illuminate\Bus\BusServiceProvider::class, + Illuminate\Cache\CacheServiceProvider::class, + Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class, + Illuminate\Cookie\CookieServiceProvider::class, + Illuminate\Database\DatabaseServiceProvider::class, + Illuminate\Encryption\EncryptionServiceProvider::class, + Illuminate\Filesystem\FilesystemServiceProvider::class, + Illuminate\Foundation\Providers\FoundationServiceProvider::class, + Illuminate\Hashing\HashServiceProvider::class, + Illuminate\Mail\MailServiceProvider::class, + Illuminate\Pagination\PaginationServiceProvider::class, + Illuminate\Pipeline\PipelineServiceProvider::class, + Illuminate\Queue\QueueServiceProvider::class, + Illuminate\Redis\RedisServiceProvider::class, + Illuminate\Auth\Passwords\PasswordResetServiceProvider::class, + Illuminate\Session\SessionServiceProvider::class, + Illuminate\Translation\TranslationServiceProvider::class, + Illuminate\Validation\ValidationServiceProvider::class, + Illuminate\View\ViewServiceProvider::class, + + /* + * Application Service Providers... + */ + App\Providers\AppServiceProvider::class, + App\Providers\AuthServiceProvider::class, + App\Providers\EventServiceProvider::class, + App\Providers\RouteServiceProvider::class, + + /* + * Vendor service providers + */ + + Barryvdh\Debugbar\ServiceProvider::class, + Aws\Laravel\AwsServiceProvider::class, + Intervention\Image\ImageServiceProvider::class, + Collective\Html\HtmlServiceProvider::class, + Spatie\Backup\BackupServiceProvider::class, + + /* + * Custom service provider + */ + App\Providers\MacroServiceProvider::class, + + + ], + + /* + |-------------------------------------------------------------------------- + | Class Aliases + |-------------------------------------------------------------------------- + | + | This array of class aliases will be registered when this application + | is started. However, feel free to register as many as you wish as + | the aliases are "lazy" loaded so they don't hinder performance. + | + */ + + 'aliases' => [ + + 'App' => Illuminate\Support\Facades\App::class, + 'Artisan' => Illuminate\Support\Facades\Artisan::class, + 'Auth' => Illuminate\Support\Facades\Auth::class, + 'Blade' => Illuminate\Support\Facades\Blade::class, + 'Cache' => Illuminate\Support\Facades\Cache::class, + 'Config' => Illuminate\Support\Facades\Config::class, + 'Cookie' => Illuminate\Support\Facades\Cookie::class, + 'Crypt' => Illuminate\Support\Facades\Crypt::class, + 'DB' => Illuminate\Support\Facades\DB::class, + 'Debugbar' => Barryvdh\Debugbar\Facade::class, + 'Eloquent' => Illuminate\Database\Eloquent\Model::class, + 'Event' => Illuminate\Support\Facades\Event::class, + 'File' => Illuminate\Support\Facades\File::class, + 'Gate' => Illuminate\Support\Facades\Gate::class, + 'Hash' => Illuminate\Support\Facades\Hash::class, + 'Image' => Intervention\Image\Facades\Image::class, + 'Input' => Illuminate\Support\Facades\Input::class, + 'Lang' => Illuminate\Support\Facades\Lang::class, + 'Log' => Illuminate\Support\Facades\Log::class, + 'Mail' => Illuminate\Support\Facades\Mail::class, + 'Password' => Illuminate\Support\Facades\Password::class, + 'Queue' => Illuminate\Support\Facades\Queue::class, + 'Redirect' => Illuminate\Support\Facades\Redirect::class, + 'Redis' => Illuminate\Support\Facades\Redis::class, + 'Request' => Illuminate\Support\Facades\Request::class, + 'Response' => Illuminate\Support\Facades\Response::class, + 'Route' => Illuminate\Support\Facades\Route::class, + 'Schema' => Illuminate\Support\Facades\Schema::class, + 'Session' => Illuminate\Support\Facades\Session::class, + 'Storage' => Illuminate\Support\Facades\Storage::class, + 'URL' => Illuminate\Support\Facades\URL::class, + 'Validator' => Illuminate\Support\Facades\Validator::class, + 'View' => Illuminate\Support\Facades\View::class, + 'Form' => 'Collective\Html\FormFacade', + 'Html' => 'Collective\Html\HtmlFacade', + ], + +]; diff --git a/config/auth.php b/config/auth.php new file mode 100644 index 0000000000..ad4a6265e0 --- /dev/null +++ b/config/auth.php @@ -0,0 +1,107 @@ + [ + 'guard' => 'web', + 'passwords' => 'users', + ], + + /* + |-------------------------------------------------------------------------- + | Authentication Guards + |-------------------------------------------------------------------------- + | + | Next, you may define every authentication guard for your application. + | Of course, a great default configuration has been defined for you + | here which uses session storage and the Eloquent user provider. + | + | All authentication drivers have a user provider. This defines how the + | users are actually retrieved out of your database or other storage + | mechanisms used by this application to persist your user's data. + | + | Supported: "session", "token" + | + */ + + 'guards' => [ + 'web' => [ + 'driver' => 'session', + 'provider' => 'users', + ], + + 'api' => [ + 'driver' => 'token', + 'provider' => 'users', + ], + ], + + /* + |-------------------------------------------------------------------------- + | User Providers + |-------------------------------------------------------------------------- + | + | All authentication drivers have a user provider. This defines how the + | users are actually retrieved out of your database or other storage + | mechanisms used by this application to persist your user's data. + | + | If you have multiple user tables or models you may configure multiple + | sources which represent each model / table. These sources may then + | be assigned to any extra authentication guards you have defined. + | + | Supported: "database", "eloquent" + | + */ + + 'providers' => [ + 'users' => [ + 'driver' => 'eloquent', + 'model' => App\Models\User::class, + ], + + // 'users' => [ + // 'driver' => 'database', + // 'table' => 'users', + // ], + ], + + /* + |-------------------------------------------------------------------------- + | Resetting Passwords + |-------------------------------------------------------------------------- + | + | Here you may set the options for resetting passwords including the view + | that is your password reset e-mail. You may also set the name of the + | table that maintains all of the reset tokens for your application. + | + | You may specify multiple password reset configurations if you have more + | than one user table or model in the application and you want to have + | separate password reset settings based on the specific user types. + | + | The expire time is the number of minutes that the reset token should be + | considered valid. This security feature keeps tokens short-lived so + | they have less time to be guessed. You may change this as needed. + | + */ + + 'passwords' => [ + 'users' => [ + 'provider' => 'users', + 'email' => 'auth.emails.password', + 'table' => 'password_resets', + 'expire' => 60, + ], + ], + +]; diff --git a/config/aws.php b/config/aws.php new file mode 100644 index 0000000000..8f86c6681e --- /dev/null +++ b/config/aws.php @@ -0,0 +1,25 @@ + env('AWS_REGION', 'us-east-1'), + 'version' => 'latest', + 'ua_append' => [ + 'L5MOD/' . AwsServiceProvider::VERSION, + ], +]; diff --git a/config/broadcasting.php b/config/broadcasting.php new file mode 100644 index 0000000000..abaaac32a7 --- /dev/null +++ b/config/broadcasting.php @@ -0,0 +1,52 @@ + env('BROADCAST_DRIVER', 'pusher'), + + /* + |-------------------------------------------------------------------------- + | Broadcast Connections + |-------------------------------------------------------------------------- + | + | Here you may define all of the broadcast connections that will be used + | to broadcast events to other systems or over websockets. Samples of + | each available type of connection are provided inside this array. + | + */ + + 'connections' => [ + + 'pusher' => [ + 'driver' => 'pusher', + 'key' => env('PUSHER_KEY'), + 'secret' => env('PUSHER_SECRET'), + 'app_id' => env('PUSHER_APP_ID'), + 'options' => [ + // + ], + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => 'default', + ], + + 'log' => [ + 'driver' => 'log', + ], + + ], + +]; diff --git a/config/cache.php b/config/cache.php new file mode 100644 index 0000000000..373f99daa2 --- /dev/null +++ b/config/cache.php @@ -0,0 +1,81 @@ + env('CACHE_DRIVER', 'file'), + + /* + |-------------------------------------------------------------------------- + | Cache Stores + |-------------------------------------------------------------------------- + | + | Here you may define all of the cache "stores" for your application as + | well as their drivers. You may even define multiple stores for the + | same cache driver to group types of items stored in your caches. + | + */ + + 'stores' => [ + + 'apc' => [ + 'driver' => 'apc', + ], + + 'array' => [ + 'driver' => 'array', + ], + + 'database' => [ + 'driver' => 'database', + 'table' => 'cache', + 'connection' => null, + ], + + 'file' => [ + 'driver' => 'file', + 'path' => storage_path('framework/cache'), + ], + + 'memcached' => [ + 'driver' => 'memcached', + 'servers' => [ + [ + 'host' => env('MEMCACHED_HOST', '127.0.0.1'), + 'port' => env('MEMCACHED_PORT', 11211), + 'weight' => 100, + ], + ], + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => 'default', + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Cache Key Prefix + |-------------------------------------------------------------------------- + | + | When utilizing a RAM based store such as APC or Memcached, there might + | be other applications utilizing the same cache. So, we'll specify a + | value to get prefixed to all our keys so we can avoid collisions. + | + */ + + 'prefix' => 'snipeit', + +]; diff --git a/config/compile.php b/config/compile.php new file mode 100644 index 0000000000..04807eac45 --- /dev/null +++ b/config/compile.php @@ -0,0 +1,35 @@ + [ + // + ], + + /* + |-------------------------------------------------------------------------- + | Compiled File Providers + |-------------------------------------------------------------------------- + | + | Here you may list service providers which define a "compiles" function + | that returns additional files that should be compiled, providing an + | easy way to get common files from any packages you are utilizing. + | + */ + + 'providers' => [ + // + ], + +]; diff --git a/config/database.php b/config/database.php new file mode 100644 index 0000000000..a1cd861469 --- /dev/null +++ b/config/database.php @@ -0,0 +1,134 @@ + PDO::FETCH_CLASS, + + /* + |-------------------------------------------------------------------------- + | Default Database Connection Name + |-------------------------------------------------------------------------- + | + | Here you may specify which of the database connections below you wish + | to use as your default connection for all database work. Of course + | you may use many connections at once using the Database library. + | + */ + + 'default' => env('DB_CONNECTION', 'mysql'), + + /* + |-------------------------------------------------------------------------- + | Database Connections + |-------------------------------------------------------------------------- + | + | Here are each of the database connections setup for your application. + | Of course, examples of configuring each database platform that is + | supported by Laravel is shown below to make development simple. + | + | + | All database work in Laravel is done through the PHP PDO facilities + | so make sure you have the driver for your particular database of + | choice installed on your machine before you begin development. + | + */ + + 'connections' => [ + + 'sqlite' => [ + 'driver' => 'sqlite', + 'database' => database_path('database.sqlite'), + 'prefix' => '', + ], + + 'sqlite_testing' => [ + 'driver' => 'sqlite', + 'database' => database_path('testing.sqlite'), + 'prefix' => '', + ], + + 'mysql' => [ + 'driver' => 'mysql', + 'host' => env('DB_HOST', 'localhost'), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => 'utf8', + 'collation' => 'utf8_unicode_ci', + 'prefix' => '', + 'strict' => false, + 'engine' => null, + ], + + 'pgsql' => [ + 'driver' => 'pgsql', + 'host' => env('DB_HOST', 'localhost'), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => 'utf8', + 'prefix' => '', + 'schema' => 'public', + ], + + 'sqlsrv' => [ + 'driver' => 'sqlsrv', + 'host' => env('DB_HOST', 'localhost'), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => 'utf8', + 'prefix' => '', + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Migration Repository Table + |-------------------------------------------------------------------------- + | + | This table keeps track of all the migrations that have already run for + | your application. Using this information, we can determine which of + | the migrations on disk haven't actually been run in the database. + | + */ + + 'migrations' => 'migrations', + + /* + |-------------------------------------------------------------------------- + | Redis Databases + |-------------------------------------------------------------------------- + | + | Redis is an open source, fast, and advanced key-value store that also + | provides a richer set of commands than a typical key-value systems + | such as APC or Memcached. Laravel makes it easy to dig right in. + | + */ + + 'redis' => [ + + 'cluster' => false, + + 'default' => [ + 'host' => env('REDIS_HOST', 'localhost'), + 'password' => env('REDIS_PASSWORD', null), + 'port' => env('REDIS_PORT', 6379), + 'database' => 0, + ], + + ], + +]; diff --git a/config/debugbar.php b/config/debugbar.php new file mode 100644 index 0000000000..bae876c70c --- /dev/null +++ b/config/debugbar.php @@ -0,0 +1,169 @@ + null, + + /* + |-------------------------------------------------------------------------- + | Storage settings + |-------------------------------------------------------------------------- + | + | DebugBar stores data for session/ajax requests. + | You can disable this, so the debugbar stores data in headers/session, + | but this can cause problems with large data collectors. + | By default, file storage (in the storage folder) is used. Redis and PDO + | can also be used. For PDO, run the package migrations first. + | + */ + 'storage' => array( + 'enabled' => true, + 'driver' => 'file', // redis, file, pdo + 'path' => storage_path() . '/debugbar', // For file driver + 'connection' => null, // Leave null for default connection (Redis/PDO) + ), + + /* + |-------------------------------------------------------------------------- + | Vendors + |-------------------------------------------------------------------------- + | + | Vendor files are included by default, but can be set to false. + | This can also be set to 'js' or 'css', to only include javascript or css vendor files. + | Vendor files are for css: font-awesome (including fonts) and highlight.js (css files) + | and for js: jquery and and highlight.js + | So if you want syntax highlighting, set it to true. + | jQuery is set to not conflict with existing jQuery scripts. + | + */ + + 'include_vendors' => true, + + /* + |-------------------------------------------------------------------------- + | Capture Ajax Requests + |-------------------------------------------------------------------------- + | + | The Debugbar can capture Ajax requests and display them. If you don't want this (ie. because of errors), + | you can use this option to disable sending the data through the headers. + | + */ + + 'capture_ajax' => true, + + /* + |-------------------------------------------------------------------------- + | Clockwork integration + |-------------------------------------------------------------------------- + | + | The Debugbar can emulate the Clockwork headers, so you can use the Chrome + | Extension, without the server-side code. It uses Debugbar collectors instead. + | + */ + 'clockwork' => false, + + /* + |-------------------------------------------------------------------------- + | DataCollectors + |-------------------------------------------------------------------------- + | + | Enable/disable DataCollectors + | + */ + + 'collectors' => array( + 'phpinfo' => true, // Php version + 'messages' => true, // Messages + 'time' => true, // Time Datalogger + 'memory' => true, // Memory usage + 'exceptions' => true, // Exception displayer + 'log' => true, // Logs from Monolog (merged in messages if enabled) + 'db' => true, // Show database (PDO) queries and bindings + 'views' => true, // Views with their data + 'route' => true, // Current route information + 'laravel' => false, // Laravel version and environment + 'events' => false, // All events fired + 'default_request' => false, // Regular or special Symfony request logger + 'symfony_request' => true, // Only one can be enabled.. + 'mail' => true, // Catch mail messages + 'logs' => false, // Add the latest log messages + 'files' => false, // Show the included files + 'config' => false, // Display config settings + 'auth' => false, // Display Laravel authentication status + 'gate' => false, // Display Laravel Gate checks + 'session' => true, // Display session data + ), + + /* + |-------------------------------------------------------------------------- + | Extra options + |-------------------------------------------------------------------------- + | + | Configure some DataCollectors + | + */ + + 'options' => array( + 'auth' => array( + 'show_name' => false, // Also show the users name/email in the debugbar + ), + 'db' => array( + 'with_params' => true, // Render SQL with the parameters substituted + 'timeline' => false, // Add the queries to the timeline + 'backtrace' => false, // EXPERIMENTAL: Use a backtrace to find the origin of the query in your files. + 'explain' => array( // EXPERIMENTAL: Show EXPLAIN output on queries + 'enabled' => false, + 'types' => array('SELECT'), // array('SELECT', 'INSERT', 'UPDATE', 'DELETE'); for MySQL 5.6.3+ + ), + 'hints' => true, // Show hints for common mistakes + ), + 'mail' => array( + 'full_log' => false + ), + 'views' => array( + 'data' => false, //Note: Can slow down the application, because the data can be quite large.. + ), + 'route' => array( + 'label' => true // show complete route on bar + ), + 'logs' => array( + 'file' => null + ), + ), + + /* + |-------------------------------------------------------------------------- + | Inject Debugbar in Response + |-------------------------------------------------------------------------- + | + | Usually, the debugbar is added just before , by listening to the + | Response after the App is done. If you disable this, you have to add them + | in your template yourself. See http://phpdebugbar.com/docs/rendering.html + | + */ + + 'inject' => true, + + /* + |-------------------------------------------------------------------------- + | DebugBar route prefix + |-------------------------------------------------------------------------- + | + | Sometimes you want to set route prefix to be used by DebugBar to load + | its resources from. Usually the need comes from misconfigured web server or + | from trying to overcome bugs like this: http://trac.nginx.org/nginx/ticket/97 + | + */ + 'route_prefix' => '_debugbar', + +); diff --git a/config/filesystems.php b/config/filesystems.php new file mode 100644 index 0000000000..345155bd42 --- /dev/null +++ b/config/filesystems.php @@ -0,0 +1,85 @@ + env('FILESYSTEM_DISK', 'local'), + + /* + |-------------------------------------------------------------------------- + | Default Cloud Filesystem Disk + |-------------------------------------------------------------------------- + | + | Many applications store files both locally and in the cloud. For this + | reason, you may specify a default "cloud" driver here. This driver + | will be bound as the Cloud disk implementation in the container. + | + */ + + 'cloud' => 's3', + + /* + |-------------------------------------------------------------------------- + | Filesystem Disks + |-------------------------------------------------------------------------- + | + | Here you may configure as many filesystem "disks" as you wish, and you + | may even configure multiple disks of the same driver. Defaults have + | been setup for each driver as an example of the required options. + | + */ + + 'disks' => [ + + 'local' => [ + 'driver' => 'local', + 'root' => storage_path('app'), + ], + + 'ftp' => [ + 'driver' => 'ftp', + 'host' => 'ftp.example.com', + 'username' => 'your-username', + 'password' => 'your-password', + + // Optional FTP Settings... + // 'port' => 21, + // 'root' => '', + // 'passive' => true, + // 'ssl' => true, + // 'timeout' => 30, + ], + + 's3' => [ + 'driver' => 's3', + 'key' => env('AWS_KEY', null), + 'secret' => env('AWS_SECRET', null), + 'region' => env('AWS_REGION', null), + 'bucket' => env('AWS_BUCKET', null), + ], + + 'rackspace' => [ + 'driver' => 'rackspace', + 'username' => 'your-username', + 'key' => 'your-key', + 'container' => 'your-container', + 'endpoint' => 'https://identity.api.rackspacecloud.com/v2.0/', + 'region' => 'IAD', + 'url_type' => 'publicURL', + ], + + ], + +]; diff --git a/config/image.php b/config/image.php new file mode 100644 index 0000000000..34676b9859 --- /dev/null +++ b/config/image.php @@ -0,0 +1,20 @@ + env('IMAGE_LIB', 'gd'), + +); diff --git a/config/laravel-backup.php b/config/laravel-backup.php new file mode 100644 index 0000000000..6e8ac6db0a --- /dev/null +++ b/config/laravel-backup.php @@ -0,0 +1,110 @@ + [ + + 'files' => [ + + /* + * The list of directories that should be part of the backup. You can + * specify individual files as well. + */ + 'include' => [ + 'public/uploads', + 'config', + 'app/storage/private_uploads', + ], + + /* + * These directories will be excluded from the backup. + * You can specify individual files as well. + */ + 'exclude' => [ + base_path('vendor'), + ], + ], + + /* + * Should the database be part of the back up. + */ + 'backup-db' => true, + ], + + 'destination' => [ + + /* + * The filesystem(s) you on which the backups will be stored. Choose one or more + * of the filesystems you configured in app/config/filesystems.php + */ + 'filesystem' => ['local'], + + /* + * The path where the backups will be saved. This path + * is relative to the root you configured on your chosen + * filesystem(s). + * + * If you're using the local filesystem a .gitignore file will + * be automatically placed in this directory so you don't + * accidentally end up committing these backups. + */ + 'path' => 'backups', + + /* + * By default the backups will be stored as a zipfile with a + * timestamp as the filename. With these options You can + * specify a prefix and a suffix for the filename. + */ + 'prefix' => 'backup-', + 'suffix' => '', + ], + + 'clean' => [ + /* + * The clean command will remove all backups on all configured filesystems + * that are older then this amount of days. + */ + 'maxAgeInDays' => 90, + ], + + 'mysql' => [ + /* + * The path to the mysqldump binary. You can leave this empty + * if the binary is installed in the default location. + */ + 'dump_command_path' => '', + + /* + * If your server supports it you can turn on extended insert. + * This will result in a smaller dump file and speeds up the backup process. + * + * See: https://dev.mysql.com/doc/refman/5.1/en/mysqldump.html#option_mysqldump_extended-insert + */ + 'useExtendedInsert' => false, + + /* + * If the dump of the db takes more seconds that the specified value, + * it will abort the backup. + */ + 'timeoutInSeconds' => 60, + ], + + 'pgsql' => [ + /* + * The path to the pg_dump binary. You can leave this empty + * if the binary is installed in the default location. + */ + 'dump_command_path' => '', + + /* + * Set to true to use pgsql 'COPY' statements instead of 'INSERT's. + */ + 'use_copy' => true, + + /* + * If the dump of the db takes more seconds that the specified value, + * it will abort the backup. + */ + 'timeoutInSeconds' => 60, + ], +]; diff --git a/config/mail.php b/config/mail.php new file mode 100644 index 0000000000..64bc82d768 --- /dev/null +++ b/config/mail.php @@ -0,0 +1,111 @@ + env('MAIL_DRIVER', 'smtp'), + + /* + |-------------------------------------------------------------------------- + | SMTP Host Address + |-------------------------------------------------------------------------- + | + | Here you may provide the host address of the SMTP server used by your + | applications. A default option is provided that is compatible with + | the Mailgun mail service which will provide reliable deliveries. + | + */ + + 'host' => env('MAIL_HOST', 'smtp.mailgun.org'), + + /* + |-------------------------------------------------------------------------- + | SMTP Host Port + |-------------------------------------------------------------------------- + | + | This is the SMTP port used by your application to deliver e-mails to + | users of the application. Like the host we have set this value to + | stay compatible with the Mailgun e-mail application by default. + | + */ + + 'port' => env('MAIL_PORT', 587), + + /* + |-------------------------------------------------------------------------- + | Global "From" Address + |-------------------------------------------------------------------------- + | + | You may wish for all e-mails sent by your application to be sent from + | the same address. Here, you may specify a name and address that is + | used globally for all e-mails that are sent by your application. + | + */ + + 'from' => ['address' => env('MAIL_FROM_ADDR', null), 'name' => env('MAIL_FROM_NAME', null)], + + /* + |-------------------------------------------------------------------------- + | E-Mail Encryption Protocol + |-------------------------------------------------------------------------- + | + | Here you may specify the encryption protocol that should be used when + | the application send e-mail messages. A sensible default using the + | transport layer security protocol should provide great security. + | + */ + + 'encryption' => env('MAIL_ENCRYPTION', 'tls'), + + /* + |-------------------------------------------------------------------------- + | SMTP Server Username + |-------------------------------------------------------------------------- + | + | If your SMTP server requires a username for authentication, you should + | set it here. This will get used to authenticate with your server on + | connection. You may also set the "password" value below this one. + | + */ + + 'username' => env('MAIL_USERNAME'), + + /* + |-------------------------------------------------------------------------- + | SMTP Server Password + |-------------------------------------------------------------------------- + | + | Here you may set the password required by your SMTP server to send out + | messages from your application. This will be given to the server on + | connection so that the application will be able to send messages. + | + */ + + 'password' => env('MAIL_PASSWORD'), + + /* + |-------------------------------------------------------------------------- + | Sendmail System Path + |-------------------------------------------------------------------------- + | + | When using the "sendmail" driver to send e-mails, we will need to know + | the path to where Sendmail lives on this server. A default path has + | been provided here, which will work well on most of your systems. + | + */ + + 'sendmail' => '/usr/sbin/sendmail -bs', + +]; diff --git a/config/permissions.php b/config/permissions.php new file mode 100644 index 0000000000..12d5045e71 --- /dev/null +++ b/config/permissions.php @@ -0,0 +1,38 @@ + array( + array( + 'permission' => 'superuser', + 'label' => 'Super User', + 'note' => 'Determines whether the user has full access to all aspects of the admin. ', + ), + ), + + 'Admin' => array( + array( + 'permission' => 'admin', + 'label' => 'Admin Rights', + 'note' => 'Determines whether the user has access to most aspects of the admin.', + ), + ), + + 'Reporting' => array( + array( + 'permission' => 'reports', + 'label' => 'View Reports', + 'note' => 'Determines whether the user has the abiity to view reports.', + ), + ), + + 'Licenses' => array( + array( + 'permission' => 'license_keys', + 'label' => 'View License Keys', + 'note' => 'Determines whether the user has the ability to view the license keys assigned to them in their own profile. (Usually granted for lower-level permissions that wouldn\'t normally have access.)', + ), + ), + + +); diff --git a/config/queue.php b/config/queue.php new file mode 100644 index 0000000000..6c2b7d2e17 --- /dev/null +++ b/config/queue.php @@ -0,0 +1,86 @@ + env('QUEUE_DRIVER', 'sync'), + + /* + |-------------------------------------------------------------------------- + | Queue Connections + |-------------------------------------------------------------------------- + | + | Here you may configure the connection information for each server that + | is used by your application. A default configuration has been added + | for each back-end shipped with Laravel. You are free to add more. + | + */ + + 'connections' => [ + + 'sync' => [ + 'driver' => 'sync', + ], + + 'database' => [ + 'driver' => 'database', + 'table' => 'jobs', + 'queue' => 'default', + 'expire' => 60, + ], + + 'beanstalkd' => [ + 'driver' => 'beanstalkd', + 'host' => 'localhost', + 'queue' => 'default', + 'ttr' => 60, + ], + + 'sqs' => [ + 'driver' => 'sqs', + 'key' => 'your-public-key', + 'secret' => 'your-secret-key', + 'prefix' => 'https://sqs.us-east-1.amazonaws.com/your-account-id', + 'queue' => 'your-queue-name', + 'region' => 'us-east-1', + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => 'default', + 'queue' => 'default', + 'expire' => 60, + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Failed Queue Jobs + |-------------------------------------------------------------------------- + | + | These options configure the behavior of failed queue job logging so you + | can control which database and table are used to store the jobs that + | have failed. You may change them to any database / table you wish. + | + */ + + 'failed' => [ + 'database' => env('DB_CONNECTION', 'mysql'), + 'table' => 'failed_jobs', + ], + +]; diff --git a/config/services.php b/config/services.php new file mode 100644 index 0000000000..93eec86365 --- /dev/null +++ b/config/services.php @@ -0,0 +1,38 @@ + [ + 'domain' => env('MAILGUN_DOMAIN'), + 'secret' => env('MAILGUN_SECRET'), + ], + + 'mandrill' => [ + 'secret' => env('MANDRILL_SECRET'), + ], + + 'ses' => [ + 'key' => env('SES_KEY'), + 'secret' => env('SES_SECRET'), + 'region' => 'us-east-1', + ], + + 'stripe' => [ + 'model' => App\User::class, + 'key' => env('STRIPE_KEY'), + 'secret' => env('STRIPE_SECRET'), + ], + +]; diff --git a/config/session.php b/config/session.php new file mode 100644 index 0000000000..d4dc3fedd8 --- /dev/null +++ b/config/session.php @@ -0,0 +1,153 @@ + env('SESSION_DRIVER', 'file'), + + /* + |-------------------------------------------------------------------------- + | Session Lifetime + |-------------------------------------------------------------------------- + | + | Here you may specify the number of minutes that you wish the session + | to be allowed to remain idle before it expires. If you want them + | to immediately expire on the browser closing, set that option. + | + */ + + 'lifetime' => env('SESSION_LIFETIME', 12000), + + 'expire_on_close' => env('EXPIRE_ON_CLOSE', false), + + /* + |-------------------------------------------------------------------------- + | Session Encryption + |-------------------------------------------------------------------------- + | + | This option allows you to easily specify that all of your session data + | should be encrypted before it is stored. All encryption will be run + | automatically by Laravel and you can use the Session like normal. + | + */ + + 'encrypt' => env('ENCRYPT', false), + + /* + |-------------------------------------------------------------------------- + | Session File Location + |-------------------------------------------------------------------------- + | + | When using the native session driver, we need a location where session + | files may be stored. A default has been set for you but a different + | location may be specified. This is only needed for file sessions. + | + */ + + 'files' => storage_path('framework/sessions'), + + /* + |-------------------------------------------------------------------------- + | Session Database Connection + |-------------------------------------------------------------------------- + | + | When using the "database" or "redis" session drivers, you may specify a + | connection that should be used to manage these sessions. This should + | correspond to a connection in your database configuration options. + | + */ + + 'connection' => null, + + /* + |-------------------------------------------------------------------------- + | Session Database Table + |-------------------------------------------------------------------------- + | + | When using the "database" session driver, you may specify the table we + | should use to manage the sessions. Of course, a sensible default is + | provided for you; however, you are free to change this as needed. + | + */ + + 'table' => 'sessions', + + /* + |-------------------------------------------------------------------------- + | Session Sweeping Lottery + |-------------------------------------------------------------------------- + | + | Some session drivers must manually sweep their storage location to get + | rid of old sessions from storage. Here are the chances that it will + | happen on a given request. By default, the odds are 2 out of 100. + | + */ + + 'lottery' => [2, 100], + + /* + |-------------------------------------------------------------------------- + | Session Cookie Name + |-------------------------------------------------------------------------- + | + | Here you may change the name of the cookie used to identify a session + | instance by ID. The name specified here will get used every time a + | new session cookie is created by the framework for every driver. + | + */ + + 'cookie' => env('COOKIE_NAME', 'sl53_session'), + + /* + |-------------------------------------------------------------------------- + | Session Cookie Path + |-------------------------------------------------------------------------- + | + | The session cookie path determines the path for which the cookie will + | be regarded as available. Typically, this will be the root path of + | your application but you are free to change this when necessary. + | + */ + + 'path' => '/', + + /* + |-------------------------------------------------------------------------- + | Session Cookie Domain + |-------------------------------------------------------------------------- + | + | Here you may change the domain of the cookie used to identify a session + | in your application. This will determine which domains the cookie is + | available to in your application. A sensible default has been set. + | + */ + + 'domain' => env('COOKIE_DOMAIN', null), + + /* + |-------------------------------------------------------------------------- + | HTTPS Only Cookies + |-------------------------------------------------------------------------- + | + | By setting this option to true, session cookies will only be sent back + | to the server if the browser has a HTTPS connection. This will keep + | the cookie from being sent to you if it can not be done securely. + | + */ + + 'secure' => env('SECURE_COOKIES', false) + +]; diff --git a/config/version.php b/config/version.php new file mode 100644 index 0000000000..c71a7857dd --- /dev/null +++ b/config/version.php @@ -0,0 +1,5 @@ + 'v3.0.0-dev', + 'hash_version' => 'v3.0.0-dev-g6d810a9', +); diff --git a/config/view.php b/config/view.php new file mode 100644 index 0000000000..e193ab61d9 --- /dev/null +++ b/config/view.php @@ -0,0 +1,33 @@ + [ + realpath(base_path('resources/views')), + ], + + /* + |-------------------------------------------------------------------------- + | Compiled View Path + |-------------------------------------------------------------------------- + | + | This option determines where all the compiled Blade templates will be + | stored for your application. Typically, this is within the storage + | directory. However, as usual, you are free to change this value. + | + */ + + 'compiled' => realpath(storage_path('framework/views')), + +]; diff --git a/database/.gitignore b/database/.gitignore new file mode 100644 index 0000000000..9b1dffd90f --- /dev/null +++ b/database/.gitignore @@ -0,0 +1 @@ +*.sqlite diff --git a/database/2016_02_13_071006_create_snipeit_laravel_database.php b/database/2016_02_13_071006_create_snipeit_laravel_database.php new file mode 100644 index 0000000000..4fdbce72fd --- /dev/null +++ b/database/2016_02_13_071006_create_snipeit_laravel_database.php @@ -0,0 +1,636 @@ +increments('id')->unsigned(); + $table->string('name', 255)->nullable(); + $table->integer('category_id')->nullable(); + $table->integer('user_id')->nullable(); + $table->integer('qty'); + $table->boolean('requestable'); + $table->timestamp('created_at')->default("0000-00-00 00:00:00"); + $table->timestamp('updated_at')->default("0000-00-00 00:00:00"); + $table->timestamp('deleted_at')->nullable(); + $table->integer('location_id')->nullable(); + $table->date('purchase_date')->nullable(); + $table->decimal('purchase_cost', 13,4)->nullable(); + $table->string('order_number', 255)->nullable(); + $table->integer('company_id')->nullable()->unsigned(); + }); + + +// +// NOTE -- accessories_users +// -------------------------------------------------- + +Schema::create('accessories_users', function($table) { + $table->increments('id')->unsigned(); + $table->integer('user_id')->nullable(); + $table->integer('accessory_id')->nullable(); + $table->integer('assigned_to')->nullable(); + $table->timestamp('created_at')->default("0000-00-00 00:00:00"); + $table->timestamp('updated_at')->default("0000-00-00 00:00:00"); + }); + + +// +// NOTE -- asset_logs +// -------------------------------------------------- + +Schema::create('asset_logs', function($table) { + $table->increments('id')->unsigned(); + $table->integer('user_id'); + $table->string('action_type', 255); + $table->integer('asset_id')->nullable(); + $table->integer('checkedout_to')->nullable(); + $table->integer('location_id')->nullable(); + $table->dateTime('created_at')->default("0000-00-00 00:00:00"); + $table->string('asset_type', 100)->nullable(); + $table->text('note')->nullable(); + $table->text('filename')->nullable(); + $table->timestamp('updated_at')->default("0000-00-00 00:00:00"); + $table->timestamp('deleted_at')->nullable(); + $table->dateTime('requested_at')->nullable(); + $table->dateTime('accepted_at')->nullable(); + $table->integer('accessory_id')->nullable(); + $table->integer('accepted_id')->nullable(); + $table->integer('consumable_id')->nullable(); + $table->date('expected_checkin')->nullable(); + $table->integer('thread_id')->nullable(); + }); + + +// +// NOTE -- asset_maintenances +// -------------------------------------------------- + +Schema::create('asset_maintenances', function($table) { + $table->increments('id')->unsigned(); + $table->integer('asset_id')->unsigned(); + $table->integer('supplier_id')->unsigned(); + $table->enum('asset_maintenance_type', array('Maintenance','Repair','Upgrade')); + $table->string('title', 100); + $table->boolean('is_warranty'); + $table->date('start_date'); + $table->date('completion_date')->nullable(); + $table->integer('asset_maintenance_time')->nullable(); + $table->string('notes')->nullable(); + $table->decimal('cost', 10,2)->nullable(); + $table->dateTime('deleted_at')->nullable(); + $table->timestamp('created_at')->default("0000-00-00 00:00:00"); + $table->timestamp('updated_at')->default("0000-00-00 00:00:00"); + }); + + +// +// NOTE -- asset_uploads +// -------------------------------------------------- + +Schema::create('asset_uploads', function($table) { + $table->increments('id')->unsigned(); + $table->integer('user_id'); + $table->string('filename', 255); + $table->integer('asset_id'); + $table->string('filenotes', 255); + $table->timestamp('created_at')->default("0000-00-00 00:00:00"); + $table->timestamp('updated_at')->default("0000-00-00 00:00:00"); + $table->timestamp('deleted_at')->nullable(); + }); + + +// +// NOTE -- assets +// -------------------------------------------------- + +Schema::create('assets', function($table) { + $table->increments('id')->unsigned(); + $table->string('name', 255)->nullable(); + $table->string('asset_tag', 255); + $table->integer('model_id'); + $table->string('serial', 255); + $table->date('purchase_date')->nullable(); + $table->decimal('purchase_cost', 13,4)->default("0.0000"); + $table->string('order_number', 255)->nullable(); + $table->integer('assigned_to')->nullable(); + $table->text('notes')->nullable(); + $table->text('image')->nullable(); + $table->integer('user_id'); + $table->timestamp('created_at')->default("0000-00-00 00:00:00"); + $table->timestamp('updated_at')->default("0000-00-00 00:00:00"); + $table->boolean('physical')->default("1"); + $table->timestamp('deleted_at')->nullable(); + $table->integer('status_id')->nullable(); + $table->boolean('archived'); + $table->integer('warranty_months')->nullable(); + $table->boolean('depreciate'); + $table->integer('supplier_id')->nullable(); + $table->boolean('requestable'); + $table->integer('rtd_location_id')->nullable(); + $table->string('_snipeit_mac_address', 255)->nullable(); + $table->enum('accepted', array('pending','accepted','rejected'))->nullable(); + $table->dateTime('last_checkout')->nullable(); + $table->date('expected_checkin')->nullable(); + $table->integer('company_id')->nullable()->unsigned(); + }); + + +// +// NOTE -- categories +// -------------------------------------------------- + +Schema::create('categories', function($table) { + $table->increments('id')->unsigned(); + $table->string('name', 255); + $table->timestamp('created_at')->default("0000-00-00 00:00:00"); + $table->timestamp('updated_at')->default("0000-00-00 00:00:00"); + $table->integer('user_id'); + $table->timestamp('deleted_at')->nullable(); + $table->text('eula_text')->nullable(); + $table->boolean('use_default_eula'); + $table->boolean('require_acceptance'); + $table->string('category_type', 255)->nullable()->default("asset"); + $table->boolean('checkin_email'); + }); + + +// +// NOTE -- companies +// -------------------------------------------------- + +Schema::create('companies', function($table) { + $table->increments('id')->unsigned(); + $table->string('name', 255)->unique(); + $table->timestamp('created_at')->default("0000-00-00 00:00:00"); + $table->timestamp('updated_at')->default("0000-00-00 00:00:00"); + }); + + +// +// NOTE -- consumables +// -------------------------------------------------- + +Schema::create('consumables', function($table) { + $table->increments('id')->unsigned(); + $table->string('name', 255)->nullable(); + $table->integer('category_id')->nullable(); + $table->integer('location_id')->nullable(); + $table->integer('user_id')->nullable(); + $table->integer('qty'); + $table->boolean('requestable'); + $table->timestamp('created_at')->default("0000-00-00 00:00:00"); + $table->timestamp('updated_at')->default("0000-00-00 00:00:00"); + $table->timestamp('deleted_at')->nullable(); + $table->date('purchase_date')->nullable(); + $table->decimal('purchase_cost', 13,4)->nullable(); + $table->string('order_number', 255)->nullable(); + $table->integer('company_id')->nullable()->unsigned(); + }); + + +// +// NOTE -- consumables_users +// -------------------------------------------------- + +Schema::create('consumables_users', function($table) { + $table->increments('id')->unsigned(); + $table->integer('user_id')->nullable(); + $table->integer('consumable_id')->nullable(); + $table->integer('assigned_to')->nullable(); + $table->timestamp('created_at')->default("0000-00-00 00:00:00"); + $table->timestamp('updated_at')->default("0000-00-00 00:00:00"); + }); + + +// +// NOTE -- custom_field_custom_fieldset +// -------------------------------------------------- + +Schema::create('custom_field_custom_fieldset', function($table) { + $table->integer('custom_field_id'); + $table->integer('custom_fieldset_id'); + $table->integer('order'); + $table->boolean('required'); + }); + + +// +// NOTE -- custom_fields +// -------------------------------------------------- + +Schema::create('custom_fields', function($table) { + $table->increments('id')->unsigned(); + $table->string('name', 255); + $table->string('format', 255); + $table->string('element', 255); + $table->timestamp('created_at')->default("0000-00-00 00:00:00"); + $table->timestamp('updated_at')->default("0000-00-00 00:00:00"); + $table->integer('user_id')->nullable(); + }); + + +// +// NOTE -- custom_fieldsets +// -------------------------------------------------- + +Schema::create('custom_fieldsets', function($table) { + $table->increments('id')->unsigned(); + $table->string('name', 255); + $table->timestamp('created_at')->default("0000-00-00 00:00:00"); + $table->timestamp('updated_at')->default("0000-00-00 00:00:00"); + $table->integer('user_id')->nullable(); + }); + + +// +// NOTE -- depreciations +// -------------------------------------------------- + +Schema::create('depreciations', function($table) { + $table->increments('id')->unsigned(); + $table->string('name', 255); + $table->integer('months'); + $table->timestamp('created_at')->default("0000-00-00 00:00:00"); + $table->timestamp('updated_at')->default("0000-00-00 00:00:00"); + $table->integer('user_id'); + }); + + +// +// NOTE -- groups +// -------------------------------------------------- + +Schema::create('groups', function($table) { + $table->increments('id')->unsigned(); + $table->string('name', 255)->unique(); + $table->text('permissions')->nullable(); + $table->timestamp('created_at')->default("0000-00-00 00:00:00"); + $table->timestamp('updated_at')->default("0000-00-00 00:00:00"); + }); + + +// +// NOTE -- history +// -------------------------------------------------- + +Schema::create('history', function($table) { + $table->increments('id')->unsigned(); + $table->integer('checkedout_to'); + $table->integer('location_id'); + $table->timestamp('created_at')->default("0000-00-00 00:00:00"); + $table->timestamp('updated_at')->default("0000-00-00 00:00:00"); + $table->integer('user_id'); + }); + + +// +// NOTE -- license_seats +// -------------------------------------------------- + +Schema::create('license_seats', function($table) { + $table->increments('id')->unsigned(); + $table->integer('license_id'); + $table->integer('assigned_to')->nullable(); + $table->text('notes')->nullable(); + $table->integer('user_id'); + $table->timestamp('created_at')->default("0000-00-00 00:00:00"); + $table->timestamp('updated_at')->default("0000-00-00 00:00:00"); + $table->timestamp('deleted_at')->nullable(); + $table->integer('asset_id')->nullable(); + }); + + +// +// NOTE -- licenses +// -------------------------------------------------- + +Schema::create('licenses', function($table) { + $table->increments('id')->unsigned(); + $table->string('name', 255); + $table->text('serial')->nullable(); + $table->date('purchase_date')->nullable(); + $table->decimal('purchase_cost', 13,4)->nullable(); + $table->string('order_number', 50)->nullable(); + $table->integer('seats')->default("1"); + $table->text('notes')->nullable(); + $table->integer('user_id'); + $table->boolean('depreciation_id'); + $table->timestamp('created_at')->default("0000-00-00 00:00:00"); + $table->timestamp('updated_at')->default("0000-00-00 00:00:00"); + $table->timestamp('deleted_at')->nullable(); + $table->string('license_name', 100)->nullable(); + $table->string('license_email', 120)->nullable(); + $table->boolean('depreciate')->nullable(); + $table->integer('supplier_id')->nullable(); + $table->date('expiration_date')->nullable(); + $table->string('purchase_order', 255)->nullable(); + $table->date('termination_date')->nullable(); + $table->boolean('maintained'); + $table->boolean('reassignable')->default("1"); + $table->integer('company_id')->nullable()->unsigned(); + }); + + +// +// NOTE -- locations +// -------------------------------------------------- + +Schema::create('locations', function($table) { + $table->increments('id')->unsigned(); + $table->string('name', 255); + $table->string('city', 255); + $table->string('state', 255); + $table->string('country', 2); + $table->timestamp('created_at')->default("0000-00-00 00:00:00"); + $table->timestamp('updated_at')->default("0000-00-00 00:00:00"); + $table->integer('user_id'); + $table->string('address', 80); + $table->string('address2', 255)->nullable(); + $table->string('zip', 10)->nullable(); + $table->timestamp('deleted_at')->nullable(); + $table->integer('parent_id')->nullable(); + $table->string('currency', 10)->nullable(); + }); + + +// +// NOTE -- manufacturers +// -------------------------------------------------- + +Schema::create('manufacturers', function($table) { + $table->increments('id')->unsigned(); + $table->string('name', 255); + $table->timestamp('created_at')->default("0000-00-00 00:00:00"); + $table->timestamp('updated_at')->default("0000-00-00 00:00:00"); + $table->integer('user_id'); + $table->timestamp('deleted_at')->nullable(); + }); + + +// +// NOTE -- models +// -------------------------------------------------- + +Schema::create('models', function($table) { + $table->increments('id')->unsigned(); + $table->string('name', 255); + $table->string('modelno', 255)->nullable(); + $table->integer('manufacturer_id'); + $table->integer('category_id'); + $table->timestamp('created_at')->default("0000-00-00 00:00:00"); + $table->timestamp('updated_at')->default("0000-00-00 00:00:00"); + $table->integer('depreciation_id'); + $table->integer('user_id'); + $table->integer('eol')->nullable(); + $table->string('image', 255)->nullable(); + $table->boolean('deprecated_mac_address'); + $table->timestamp('deleted_at')->nullable(); + $table->integer('fieldset_id')->nullable(); + $table->text('note')->nullable(); + }); + + +// +// NOTE -- requested_assets +// -------------------------------------------------- + +Schema::create('requested_assets', function($table) { + $table->increments('id')->unsigned(); + $table->integer('asset_id'); + $table->integer('user_id'); + $table->dateTime('accepted_at')->nullable(); + $table->dateTime('denied_at')->nullable(); + $table->string('notes', 255); + $table->timestamp('created_at')->default("0000-00-00 00:00:00"); + $table->timestamp('updated_at')->default("0000-00-00 00:00:00"); + }); + + +// +// NOTE -- requests +// -------------------------------------------------- + +Schema::create('requests', function($table) { + $table->increments('id')->unsigned(); + $table->integer('asset_id'); + $table->integer('user_id'); + $table->text('request_code'); + $table->timestamp('created_at')->default("0000-00-00 00:00:00"); + $table->timestamp('updated_at')->default("0000-00-00 00:00:00"); + $table->timestamp('deleted_at')->nullable(); + }); + + +// +// NOTE -- settings +// -------------------------------------------------- + +Schema::create('settings', function($table) { + $table->increments('id')->unsigned(); + $table->timestamp('created_at')->default("0000-00-00 00:00:00"); + $table->timestamp('updated_at')->default("0000-00-00 00:00:00"); + $table->integer('user_id'); + $table->integer('per_page')->default("20"); + $table->string('site_name', 100)->default("Snipe IT Asset Management"); + $table->integer('qr_code')->nullable(); + $table->string('qr_text', 32)->nullable(); + $table->integer('display_asset_name')->nullable(); + $table->integer('display_checkout_date')->nullable(); + $table->integer('display_eol')->nullable(); + $table->integer('auto_increment_assets'); + $table->string('auto_increment_prefix', 255); + $table->boolean('load_remote')->default("1"); + $table->string('logo', 255)->nullable(); + $table->string('header_color', 255)->nullable(); + $table->string('alert_email', 255)->nullable(); + $table->boolean('alerts_enabled')->default("1"); + $table->text('default_eula_text')->nullable(); + $table->string('barcode_type', 255)->nullable()->default("QRCODE"); + $table->string('slack_endpoint', 255)->nullable(); + $table->string('slack_channel', 255)->nullable(); + $table->string('slack_botname', 255)->nullable(); + $table->string('default_currency', 10)->nullable(); + $table->text('custom_css')->nullable(); + $table->boolean('brand')->default("1"); + $table->string('ldap_enabled', 255)->nullable(); + $table->string('ldap_server', 255)->nullable(); + $table->string('ldap_uname', 255)->nullable(); + $table->string('ldap_pword')->nullable(); + $table->string('ldap_basedn', 255)->nullable(); + $table->string('ldap_filter', 255)->nullable()->default("cn=*"); + $table->string('ldap_username_field', 255)->nullable()->default("samaccountname"); + $table->string('ldap_lname_field', 255)->nullable()->default("sn"); + $table->string('ldap_fname_field', 255)->nullable()->default("givenname"); + $table->string('ldap_auth_filter_query', 255)->nullable()->default("uid=samaccountname"); + $table->integer('ldap_version')->nullable()->default("3"); + $table->string('ldap_active_flag', 255)->nullable(); + $table->string('ldap_emp_num', 255)->nullable(); + $table->string('ldap_email', 255)->nullable(); + $table->boolean('full_multiple_companies_support'); + $table->boolean('ldap_server_cert_ignore'); + }); + + +// +// NOTE -- status_labels +// -------------------------------------------------- + +Schema::create('status_labels', function($table) { + $table->increments('id')->unsigned(); + $table->string('name', 100); + $table->integer('user_id'); + $table->timestamp('created_at')->default("0000-00-00 00:00:00"); + $table->timestamp('updated_at')->default("0000-00-00 00:00:00"); + $table->timestamp('deleted_at')->nullable(); + $table->boolean('deployable'); + $table->boolean('pending'); + $table->boolean('archived'); + $table->text('notes')->nullable(); + }); + + +// +// NOTE -- suppliers +// -------------------------------------------------- + +Schema::create('suppliers', function($table) { + $table->increments('id')->unsigned(); + $table->string('name', 255); + $table->string('address', 50)->nullable(); + $table->string('address2', 50)->nullable(); + $table->string('city', 255)->nullable(); + $table->string('state', 32)->nullable(); + $table->string('country', 2)->nullable(); + $table->string('phone', 20)->nullable(); + $table->string('fax', 20)->nullable(); + $table->string('email', 150)->nullable(); + $table->string('contact', 100)->nullable(); + $table->string('notes', 255)->nullable(); + $table->timestamp('created_at')->default("0000-00-00 00:00:00"); + $table->timestamp('updated_at')->default("0000-00-00 00:00:00"); + $table->integer('user_id'); + $table->timestamp('deleted_at')->nullable(); + $table->string('zip', 10)->nullable(); + $table->string('url', 250)->nullable(); + $table->string('image', 255)->nullable(); + }); + + +// +// NOTE -- throttle +// -------------------------------------------------- + +Schema::create('throttle', function($table) { + $table->increments('id')->unsigned(); + $table->integer('user_id')->nullable()->unsigned(); + $table->string('ip_address', 255)->nullable(); + $table->integer('attempts'); + $table->boolean('suspended'); + $table->boolean('banned'); + $table->timestamp('last_attempt_at')->nullable(); + $table->timestamp('suspended_at')->nullable(); + $table->timestamp('banned_at')->nullable(); + }); + + +// +// NOTE -- users +// -------------------------------------------------- + +Schema::create('users', function($table) { + $table->increments('id')->unsigned(); + $table->string('email', 255)->nullable(); + $table->string('password', 255); + $table->text('permissions')->nullable(); + $table->boolean('activated'); + $table->string('activation_code', 255)->nullable(); + $table->timestamp('activated_at')->nullable(); + $table->timestamp('last_login')->nullable(); + $table->string('persist_code', 255)->nullable(); + $table->string('reset_password_code', 255)->nullable(); + $table->string('first_name', 255); + $table->string('last_name', 255); + $table->timestamp('created_at')->default("0000-00-00 00:00:00"); + $table->timestamp('updated_at')->default("0000-00-00 00:00:00"); + $table->timestamp('deleted_at')->nullable(); + $table->string('website', 255)->nullable(); + $table->string('country', 255)->nullable(); + $table->string('gravatar', 255)->nullable(); + $table->integer('location_id')->nullable(); + $table->string('phone', 20)->nullable(); + $table->string('jobtitle', 100)->nullable(); + $table->integer('manager_id')->nullable(); + $table->text('employee_num')->nullable(); + $table->string('avatar', 255)->nullable(); + $table->string('username', 255)->nullable(); + $table->string('notes', 255)->nullable(); + $table->integer('company_id')->nullable()->unsigned(); + }); + + +// +// NOTE -- users_groups +// -------------------------------------------------- + +Schema::create('users_groups', function($table) { + $table->increments('user_id')->unsigned(); + $table->integer('group_id')->unsigned(); + }); + + + +} + +// +// NOTE - Revert the changes to the database. +// -------------------------------------------------- + +public function down() +{ + +Schema::drop('accessories'); +Schema::drop('accessories_users'); +Schema::drop('asset_logs'); +Schema::drop('asset_maintenances'); +Schema::drop('asset_uploads'); +Schema::drop('assets'); +Schema::drop('categories'); +Schema::drop('companies'); +Schema::drop('consumables'); +Schema::drop('consumables_users'); +Schema::drop('custom_field_custom_fieldset'); +Schema::drop('custom_fields'); +Schema::drop('custom_fieldsets'); +Schema::drop('depreciations'); +Schema::drop('groups'); +Schema::drop('history'); +Schema::drop('license_seats'); +Schema::drop('licenses'); +Schema::drop('locations'); +Schema::drop('manufacturers'); +Schema::drop('models'); +Schema::drop('requested_assets'); +Schema::drop('requests'); +Schema::drop('settings'); +Schema::drop('status_labels'); +Schema::drop('suppliers'); +Schema::drop('throttle'); +Schema::drop('users'); +Schema::drop('users_groups'); + +} +} diff --git a/database/factories/ModelFactory.php b/database/factories/ModelFactory.php new file mode 100644 index 0000000000..ec4c2e088d --- /dev/null +++ b/database/factories/ModelFactory.php @@ -0,0 +1,297 @@ +defineAs(App\Models\Asset::class, 'asset', function (Faker\Generator $faker) { + return [ + 'name' => $faker->catchPhrase, + 'model_id' => $faker->numberBetween(1,5), + 'rtd_location_id' => $faker->numberBetween(1,5), + 'serial' => $faker->uuid, + 'status_id' => 1, + 'asset_tag' => $faker->unixTime('now'), + 'notes' => $faker->sentence, + 'purchase_date' => $faker->dateTime(), + 'order_number' => $faker->numberBetween(1000000,50000000), + 'supplier_id' => $faker->numberBetween(1,5), + 'requestable' => $faker->numberBetween(0,1), + ]; +}); + + +$factory->defineAs(App\Models\AssetModel::class, 'assetmodel', function (Faker\Generator $faker) { + return [ + 'name' => $faker->catchPhrase, + 'manufacturer_id' => $faker->numberBetween(1,10), + 'category_id' => $faker->numberBetween(1,9), + 'modelno' => $faker->numberBetween(1000000,50000000), + 'eol' => 1, + ]; +}); + +$factory->defineAs(App\Models\Location::class, 'location', function (Faker\Generator $faker) { + return [ + 'name' => $faker->city, + 'city' => $faker->city, + 'state' => $faker->stateAbbr, + 'country' => $faker->countryCode, + 'currency' => $faker->currencyCode, + ]; +}); + +$factory->defineAs(App\Models\Category::class, 'asset-category', function (Faker\Generator $faker) { + return [ + 'name' => $faker->text(20), + 'category_type' => $faker->randomElement($array = array ('asset')), + ]; +}); + +$factory->defineAs(App\Models\Category::class, 'accessory-category', function (Faker\Generator $faker) { + return [ + 'name' => $faker->text(20), + 'category_type' => $faker->randomElement($array = array ('accessory')), + ]; +}); + +$factory->defineAs(App\Models\Category::class, 'component-category', function (Faker\Generator $faker) { + return [ + 'name' => $faker->text(20), + 'category_type' => $faker->randomElement($array = array ('component')), + ]; +}); + +$factory->defineAs(App\Models\Category::class, 'consumable-category', function (Faker\Generator $faker) { + return [ + 'name' => $faker->text(20), + 'category_type' => $faker->randomElement($array = array ('consumable')), + ]; +}); + + +$factory->defineAs(App\Models\Company::class, 'company', function (Faker\Generator $faker) { + return [ + 'name' => $faker->company, + ]; +}); + +$factory->defineAs(App\Models\Manufacturer::class, 'manufacturer', function (Faker\Generator $faker) { + return [ + 'name' => $faker->company, + ]; +}); + +$factory->defineAs(App\Models\Component::class, 'component', function (Faker\Generator $faker) { + return [ + 'name' => $faker->text(20), + 'category_id' => $faker->numberBetween(16,20), + 'total_qty' => $faker->numberBetween(5, 10), + 'min_amt' => $faker->numberBetween($min = 1, $max = 2), + ]; +}); + +$factory->defineAs(App\Models\Depreciation::class, 'depreciation', function (Faker\Generator $faker) { + return [ + 'name' => $faker->text(20), + 'months' => $faker->numberBetween(1, 10), + ]; +}); + +$factory->defineAs(App\Models\Accessory::class, 'accessory', function (Faker\Generator $faker) { + return [ + 'name' => $faker->text(20), + 'category_id' => $faker->numberBetween(11,15), + 'qty' => $faker->numberBetween(5, 10), + 'location_id' => $faker->numberBetween(1,5), + 'min_amt' => $faker->numberBetween($min = 1, $max = 2), + ]; +}); + + +$factory->defineAs(App\Models\Supplier::class, 'supplier', function (Faker\Generator $faker) { + return [ + 'name' => $faker->company, + 'address' => $faker->streetAddress, + 'city' => $faker->city, + 'state' => $faker->stateAbbr, + 'country' => $faker->countryCode, + 'contact' => $faker->name, + 'phone' => $faker->phoneNumber, + 'email' => $faker->safeEmail, + ]; +}); + + +$factory->defineAs(App\Models\Consumable::class, 'consumable', function (Faker\Generator $faker) { + return [ + 'name' => $faker->text(20), + 'category_id' => $faker->numberBetween(16, 20), + 'company_id' => $faker->numberBetween(1, 10), + 'qty' => $faker->numberBetween(5, 10), + 'min_amt' => $faker->numberBetween($min = 1, $max = 2), + + ]; +}); + + +$factory->defineAs(App\Models\Statuslabel::class, 'rtd', function (Faker\Generator $faker) { + return [ + 'name' => 'Ready to Deploy', + 'created_at' => $faker->dateTime(), + 'updated_at' => $faker->dateTime(), + 'user_id' => 1, + 'deleted_at' => NULL, + 'deployable' => 1, + 'pending' => 0, + 'archived' => 0, + 'notes' => '' + ]; +}); + +$factory->defineAs(App\Models\Statuslabel::class, 'pending', function (Faker\Generator $faker) { + return [ + 'name' => 'Pending', + 'created_at' => $faker->dateTime(), + 'updated_at' => $faker->dateTime(), + 'user_id' => 1, + 'deleted_at' => NULL, + 'deployable' => 0, + 'pending' => 1, + 'archived' => 0, + 'notes' => '' + ]; +}); + +$factory->defineAs(App\Models\Statuslabel::class, 'archived', function (Faker\Generator $faker) { + return [ + 'name' => 'Archived', + 'created_at' => $faker->dateTime(), + 'updated_at' => $faker->dateTime(), + 'user_id' => 1, + 'deleted_at' => NULL, + 'deployable' => 0, + 'pending' => 0, + 'archived' => 1, + 'notes' => 'These assets are permanently undeployable' + ]; +}); + +$factory->defineAs(App\Models\Statuslabel::class, 'out_for_diagnostics', function (Faker\Generator $faker) { + return [ + 'name' => 'Out for Diagnostics', + 'created_at' => $faker->dateTime(), + 'updated_at' => $faker->dateTime(), + 'user_id' => 1, + 'deleted_at' => NULL, + 'deployable' => 0, + 'pending' => 0, + 'archived' => 0, + 'notes' => '' + ]; +}); + +$factory->defineAs(App\Models\Statuslabel::class, 'out_for_repair', function (Faker\Generator $faker) { + return [ + 'name' => 'Out for Repair', + 'created_at' => $faker->dateTime(), + 'updated_at' => $faker->dateTime(), + 'user_id' => 1, + 'deleted_at' => NULL, + 'deployable' => 0, + 'pending' => 0, + 'archived' => 0, + 'notes' => '' + ]; +}); + +$factory->defineAs(App\Models\Statuslabel::class, 'broken', function (Faker\Generator $faker) { + return [ + 'name' => 'Broken - Not Fixable', + 'created_at' => $faker->dateTime(), + 'updated_at' => $faker->dateTime(), + 'user_id' => 1, + 'deleted_at' => NULL, + 'deployable' => 0, + 'pending' => 0, + 'archived' => 1, + 'notes' => '' + ]; +}); + +$factory->defineAs(App\Models\Statuslabel::class, 'lost', function (Faker\Generator $faker) { + return [ + 'name' => 'Lost/Stolen', + 'created_at' => $faker->dateTime(), + 'updated_at' => $faker->dateTime(), + 'user_id' => 1, + 'deleted_at' => NULL, + 'deployable' => 0, + 'pending' => 0, + 'archived' => 1, + 'notes' => '', + ]; +}); + +$factory->defineAs(App\Models\License::class, 'license', function (Faker\Generator $faker) { + return [ + 'name' => $faker->catchPhrase, + 'serial' => $faker->uuid, + 'seats' => $faker->numberBetween(1, 10), + 'license_email' => $faker->safeEmail, + 'license_name' => $faker->name, + 'purchase_date' => $faker->dateTime(), + 'purchase_cost' => $faker->randomFloat(2), + 'notes' => $faker->sentence, + ]; +}); + +$factory->defineAs(App\Models\LicenseSeat::class, 'license-seat', function (Faker\Generator $faker) { + return [ + 'license_id' => $faker->numberBetween(1, 10), + 'created_at' => $faker->dateTime(), + 'updated_at' => $faker->dateTime(), + 'notes' => $faker->sentence, + 'user_id' => '1', + ]; +}); + +$factory->defineAs(App\Models\Actionlog::class, 'asset-checkout', function (Faker\Generator $faker) { + return [ + 'user_id' => 1, + 'action_type' => 'checkout', + 'asset_id' => $faker->numberBetween(1, 10), + 'checkedout_to' => 1, + 'created_at' => $faker->dateTime(), + 'asset_type' => 'hardware', + 'note' => $faker->sentence, + 'user_id' => '1', + ]; +}); + + +$factory->defineAs(App\Models\CustomField::class, 'customfield-ip', function (Faker\Generator $faker) { + return [ + 'name' => $faker->catchPhrase, + 'format' => 'IP', + 'element' => 'text', + ]; +}); + + +$factory->defineAs(App\Models\User::class, 'valid-user', function (Faker\Generator $faker) { + return [ + 'first_name' => $faker->firstName, + 'last_name' => $faker->lastName, + 'email' => $faker->safeEmail, + 'password' => $faker->password, + 'username' => $faker->username, + ]; +}); diff --git a/database/migrations/.gitkeep b/database/migrations/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/database/migrations/2012_12_06_225921_migration_cartalyst_sentry_install_users.php b/database/migrations/2012_12_06_225921_migration_cartalyst_sentry_install_users.php new file mode 100644 index 0000000000..bee5d9370c --- /dev/null +++ b/database/migrations/2012_12_06_225921_migration_cartalyst_sentry_install_users.php @@ -0,0 +1,67 @@ +increments('id'); + $table->string('email'); + $table->string('password'); + $table->text('permissions')->nullable(); + $table->boolean('activated')->default(0); + $table->string('activation_code')->nullable(); + $table->timestamp('activated_at')->nullable(); + $table->timestamp('last_login')->nullable(); + $table->string('persist_code')->nullable(); + $table->string('reset_password_code')->nullable(); + $table->string('first_name')->nullable(); + $table->string('last_name')->nullable(); + $table->timestamps(); + + // We'll need to ensure that MySQL uses the InnoDB engine to + // support the indexes, other engines aren't affected. + $table->engine = 'InnoDB'; + $table->unique('email'); + $table->index('activation_code'); + $table->index('reset_password_code'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('users'); + } + +} diff --git a/database/migrations/2012_12_06_225929_migration_cartalyst_sentry_install_groups.php b/database/migrations/2012_12_06_225929_migration_cartalyst_sentry_install_groups.php new file mode 100644 index 0000000000..034a6a16d8 --- /dev/null +++ b/database/migrations/2012_12_06_225929_migration_cartalyst_sentry_install_groups.php @@ -0,0 +1,52 @@ +increments('id'); + $table->string('name'); + $table->text('permissions')->nullable(); + $table->timestamps(); + $table->engine = 'InnoDB'; + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('groups'); + } + +} diff --git a/database/migrations/2012_12_06_225945_migration_cartalyst_sentry_install_users_groups_pivot.php b/database/migrations/2012_12_06_225945_migration_cartalyst_sentry_install_users_groups_pivot.php new file mode 100644 index 0000000000..012873c6c0 --- /dev/null +++ b/database/migrations/2012_12_06_225945_migration_cartalyst_sentry_install_users_groups_pivot.php @@ -0,0 +1,54 @@ +integer('user_id')->unsigned(); + $table->integer('group_id')->unsigned(); + + // We'll need to ensure that MySQL uses the InnoDB engine to + // support the indexes, other engines aren't affected. + $table->engine = 'InnoDB'; + $table->primary(array('user_id', 'group_id')); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('users_groups'); + } + +} diff --git a/database/migrations/2012_12_06_225988_migration_cartalyst_sentry_install_throttle.php b/database/migrations/2012_12_06_225988_migration_cartalyst_sentry_install_throttle.php new file mode 100644 index 0000000000..07c1d27a68 --- /dev/null +++ b/database/migrations/2012_12_06_225988_migration_cartalyst_sentry_install_throttle.php @@ -0,0 +1,61 @@ +increments('id'); + $table->integer('user_id')->unsigned()->nullable(); + $table->string('ip_address')->nullable(); + $table->integer('attempts')->default(0); + $table->boolean('suspended')->default(0); + $table->boolean('banned')->default(0); + $table->timestamp('last_attempt_at')->nullable(); + $table->timestamp('suspended_at')->nullable(); + $table->timestamp('banned_at')->nullable(); + + // We'll need to ensure that MySQL uses the InnoDB engine to + // support the indexes, other engines aren't affected. + $table->engine = 'InnoDB'; + $table->index('user_id'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('throttle'); + } + +} diff --git a/database/migrations/2013_03_23_193214_update_users_table.php b/database/migrations/2013_03_23_193214_update_users_table.php new file mode 100755 index 0000000000..eed98d12ee --- /dev/null +++ b/database/migrations/2013_03_23_193214_update_users_table.php @@ -0,0 +1,36 @@ +softDeletes(); + $table->string('website')->nullable(); + $table->string('country')->nullable(); + $table->string('gravatar')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // Update the users table + Schema::table('users', function ($table) { + $table->dropColumn('deleted_at', 'website', 'country', 'gravatar'); + }); + } + +} diff --git a/database/migrations/2013_11_13_075318_create_models_table.php b/database/migrations/2013_11_13_075318_create_models_table.php new file mode 100755 index 0000000000..393cbcf9a1 --- /dev/null +++ b/database/migrations/2013_11_13_075318_create_models_table.php @@ -0,0 +1,35 @@ +increments('id'); + $table->string('name'); + $table->string('modelno')->nullable(); + $table->integer('manufacturer_id')->nullable(); + $table->integer('category_id')->nullable(); + $table->timestamps(); + $table->engine = 'InnoDB'; + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('models'); + } + +} diff --git a/database/migrations/2013_11_13_075335_create_categories_table.php b/database/migrations/2013_11_13_075335_create_categories_table.php new file mode 100755 index 0000000000..bb64d87cb0 --- /dev/null +++ b/database/migrations/2013_11_13_075335_create_categories_table.php @@ -0,0 +1,33 @@ +increments('id'); + $table->string('name'); + $table->integer('parent')->default(0); + $table->timestamps(); + $table->engine = 'InnoDB'; + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('categories'); + } + +} diff --git a/database/migrations/2013_11_13_075347_create_manufacturers_table.php b/database/migrations/2013_11_13_075347_create_manufacturers_table.php new file mode 100755 index 0000000000..3f2426ea6d --- /dev/null +++ b/database/migrations/2013_11_13_075347_create_manufacturers_table.php @@ -0,0 +1,32 @@ +increments('id'); + $table->string('name'); + $table->timestamps(); + $table->engine = 'InnoDB'; + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('manufacturers'); + } + +} diff --git a/database/migrations/2013_11_15_015858_add_user_id_to_categories.php b/database/migrations/2013_11_15_015858_add_user_id_to_categories.php new file mode 100755 index 0000000000..a4744877ba --- /dev/null +++ b/database/migrations/2013_11_15_015858_add_user_id_to_categories.php @@ -0,0 +1,29 @@ +integer('user_id')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + } + +} diff --git a/database/migrations/2013_11_15_112701_add_user_id_to_manufacturers.php b/database/migrations/2013_11_15_112701_add_user_id_to_manufacturers.php new file mode 100755 index 0000000000..a21ad59277 --- /dev/null +++ b/database/migrations/2013_11_15_112701_add_user_id_to_manufacturers.php @@ -0,0 +1,29 @@ +integer('user_id')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + } + +} diff --git a/database/migrations/2013_11_15_190327_create_assets_table.php b/database/migrations/2013_11_15_190327_create_assets_table.php new file mode 100755 index 0000000000..12f906fa27 --- /dev/null +++ b/database/migrations/2013_11_15_190327_create_assets_table.php @@ -0,0 +1,42 @@ +increments('id'); + $table->string('name')->nullable(); + $table->string('asset_tag')->nullable(); + $table->integer('model_id')->nullable(); + $table->string('serial')->nullable(); + $table->date('purchase_date')->nullable(); + $table->decimal('purchase_cost', 8, 2)->nullable(); + $table->string('order_number')->nullable(); + $table->integer('assigned_to')->nullable(); + $table->text('notes')->nullable(); + $table->integer('user_id')->nullable(); + $table->timestamps(); + $table->boolean('physical')->default(1); + $table->engine = 'InnoDB'; + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('assets'); + } + +} diff --git a/database/migrations/2013_11_15_190357_create_licenses_table.php b/database/migrations/2013_11_15_190357_create_licenses_table.php new file mode 100755 index 0000000000..d6e01cac39 --- /dev/null +++ b/database/migrations/2013_11_15_190357_create_licenses_table.php @@ -0,0 +1,42 @@ +increments('id'); + $table->string('name'); + $table->integer('model_id'); + $table->text('serial'); + $table->string('license_email'); + $table->string('license_name'); + $table->date('purchase_date')->nullable(); + $table->decimal('purchase_cost', 8, 2)->nullable(); + $table->string('order_number'); + $table->integer('assigned_to'); + $table->text('notes'); + $table->integer('user_id')->nullable(); + $table->timestamps(); + $table->engine = 'InnoDB'; + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('licenses'); + } + +} diff --git a/database/migrations/2013_11_15_201848_add_license_name_to_licenses.php b/database/migrations/2013_11_15_201848_add_license_name_to_licenses.php new file mode 100755 index 0000000000..50b0a1ff05 --- /dev/null +++ b/database/migrations/2013_11_15_201848_add_license_name_to_licenses.php @@ -0,0 +1,27 @@ +increments('id'); + $table->string('name'); + $table->integer('months'); + $table->timestamps(); + $table->integer('user_id')->nullable(); + $table->engine = 'InnoDB'; + //$table->foreign('user_id')->references('id')->on('users'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('depreciations'); + } + +} diff --git a/database/migrations/2013_11_16_042851_add_depreciation_id_to_models.php b/database/migrations/2013_11_16_042851_add_depreciation_id_to_models.php new file mode 100755 index 0000000000..a9e9dbd496 --- /dev/null +++ b/database/migrations/2013_11_16_042851_add_depreciation_id_to_models.php @@ -0,0 +1,29 @@ +integer('depreciation_id')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + } + +} diff --git a/database/migrations/2013_11_16_084923_add_user_id_to_models.php b/database/migrations/2013_11_16_084923_add_user_id_to_models.php new file mode 100755 index 0000000000..b14f40be2e --- /dev/null +++ b/database/migrations/2013_11_16_084923_add_user_id_to_models.php @@ -0,0 +1,29 @@ +integer('user_id')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + } + +} diff --git a/database/migrations/2013_11_16_103258_create_locations_table.php b/database/migrations/2013_11_16_103258_create_locations_table.php new file mode 100755 index 0000000000..d87a273e35 --- /dev/null +++ b/database/migrations/2013_11_16_103258_create_locations_table.php @@ -0,0 +1,36 @@ +increments('id'); + $table->string('name')->nullable(); + $table->string('city')->nullable(); + $table->string('state',2)->nullable(); + $table->string('country',2)->nullable(); + $table->timestamps(); + $table->integer('user_id')->nullable(); + $table->engine = 'InnoDB'; + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('locations'); + } + +} diff --git a/database/migrations/2013_11_16_103336_add_location_id_to_assets.php b/database/migrations/2013_11_16_103336_add_location_id_to_assets.php new file mode 100755 index 0000000000..fbaee98b3e --- /dev/null +++ b/database/migrations/2013_11_16_103336_add_location_id_to_assets.php @@ -0,0 +1,29 @@ +integer('location_id')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + } + +} diff --git a/database/migrations/2013_11_16_103407_add_checkedout_to_to_assets.php b/database/migrations/2013_11_16_103407_add_checkedout_to_to_assets.php new file mode 100755 index 0000000000..8fdb112f03 --- /dev/null +++ b/database/migrations/2013_11_16_103407_add_checkedout_to_to_assets.php @@ -0,0 +1,29 @@ +integer('checkedout_to')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + } + +} diff --git a/database/migrations/2013_11_16_103425_create_history_table.php b/database/migrations/2013_11_16_103425_create_history_table.php new file mode 100755 index 0000000000..3e5d6ba84d --- /dev/null +++ b/database/migrations/2013_11_16_103425_create_history_table.php @@ -0,0 +1,34 @@ +increments('id'); + // $table->integer('checkedout_to')->nullable; + // $table->integer('location_id')->nullable; + // $table->timestamps(); + // $table->integer('user_id')->nullable(); + // $table->engine = 'InnoDB'; + // }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + //Schema::drop('history'); + } + +} diff --git a/database/migrations/2013_11_17_054359_drop_licenses_table.php b/database/migrations/2013_11_17_054359_drop_licenses_table.php new file mode 100755 index 0000000000..353dcc6944 --- /dev/null +++ b/database/migrations/2013_11_17_054359_drop_licenses_table.php @@ -0,0 +1,27 @@ +boolean('physical')->default(1); + $table->dropColumn('checkedout_to'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + $table->dropColumn('physical'); + } + +} diff --git a/database/migrations/2013_11_17_055126_create_settings_table.php b/database/migrations/2013_11_17_055126_create_settings_table.php new file mode 100755 index 0000000000..0bedd659bf --- /dev/null +++ b/database/migrations/2013_11_17_055126_create_settings_table.php @@ -0,0 +1,35 @@ +increments('id'); + $table->string('option_name'); + $table->string('option_value'); + $table->timestamps(); + $table->integer('user_id')->nullable(); + $table->engine = 'InnoDB'; + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('settings'); + } + +} diff --git a/database/migrations/2013_11_17_062634_add_license_to_assets.php b/database/migrations/2013_11_17_062634_add_license_to_assets.php new file mode 100755 index 0000000000..7766b34f2c --- /dev/null +++ b/database/migrations/2013_11_17_062634_add_license_to_assets.php @@ -0,0 +1,30 @@ +string('license_name')->nullable(); + // $table->string('license_email')->nullable(); + // }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + } + +} diff --git a/database/migrations/2013_11_18_134332_add_contacts_to_users.php b/database/migrations/2013_11_18_134332_add_contacts_to_users.php new file mode 100755 index 0000000000..bf6d482d37 --- /dev/null +++ b/database/migrations/2013_11_18_134332_add_contacts_to_users.php @@ -0,0 +1,38 @@ +integer('location_id')->nullable(); + $table->string('phone')->nullable(); + $table->string('jobtitle')->nullable(); + + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('users', function ($table) { + $table->dropColumn('location_id'); + $table->dropColumn('phone'); + $table->dropColumn('jobtitle'); + + }); + + } + +} diff --git a/database/migrations/2013_11_18_142847_add_info_to_locations.php b/database/migrations/2013_11_18_142847_add_info_to_locations.php new file mode 100755 index 0000000000..07f85b6116 --- /dev/null +++ b/database/migrations/2013_11_18_142847_add_info_to_locations.php @@ -0,0 +1,39 @@ +string('address', 80)->nullable(); + $table->string('address2', 80)->nullable(); + $table->string('zip', 10)->nullable(); + + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('locations', function ($table) { + + $table->dropColumn('address'); + $table->dropColumn('address2'); + $table->dropColumn('zip'); + + }); + } + +} diff --git a/database/migrations/2013_11_18_152942_remove_location_id_from_asset.php b/database/migrations/2013_11_18_152942_remove_location_id_from_asset.php new file mode 100755 index 0000000000..07ef525fe4 --- /dev/null +++ b/database/migrations/2013_11_18_152942_remove_location_id_from_asset.php @@ -0,0 +1,31 @@ +dropColumn('location_id'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('assets', function ($table) { + $table->integer('location_id')->nullable(); + }); + } + +} diff --git a/database/migrations/2013_11_18_164423_set_nullvalues_for_user.php b/database/migrations/2013_11_18_164423_set_nullvalues_for_user.php new file mode 100755 index 0000000000..6665934587 --- /dev/null +++ b/database/migrations/2013_11_18_164423_set_nullvalues_for_user.php @@ -0,0 +1,32 @@ +increments('id'); + $table->integer('user_id')->nullable(); + $table->string('action_type'); + $table->integer('asset_id'); + $table->integer('checkedout_to')->nullable(); + $table->integer('location_id')->nullable(); + $table->timestamps(); + $table->softDeletes(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('asset_logs'); + } + +} diff --git a/database/migrations/2013_11_19_061409_edit_added_on_asset_logs_table.php b/database/migrations/2013_11_19_061409_edit_added_on_asset_logs_table.php new file mode 100755 index 0000000000..b1c8a848b3 --- /dev/null +++ b/database/migrations/2013_11_19_061409_edit_added_on_asset_logs_table.php @@ -0,0 +1,28 @@ +string('location_id')->nullable()->change(); + // $table->dateTime('added_on',11)->nullable()->default(DB::raw('CURRENT_TIMESTAMP(0)'))->change(); + // }); + + + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + } + +} diff --git a/database/migrations/2013_11_20_055822_add_soft_delete_on_assets.php b/database/migrations/2013_11_20_055822_add_soft_delete_on_assets.php new file mode 100755 index 0000000000..c729376383 --- /dev/null +++ b/database/migrations/2013_11_20_055822_add_soft_delete_on_assets.php @@ -0,0 +1,29 @@ +softDeletes(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + } + +} diff --git a/database/migrations/2013_11_20_121404_add_soft_delete_on_locations.php b/database/migrations/2013_11_20_121404_add_soft_delete_on_locations.php new file mode 100755 index 0000000000..afdc9e2aa2 --- /dev/null +++ b/database/migrations/2013_11_20_121404_add_soft_delete_on_locations.php @@ -0,0 +1,29 @@ +softDeletes(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + } + +} diff --git a/database/migrations/2013_11_20_123137_add_soft_delete_on_manufacturers.php b/database/migrations/2013_11_20_123137_add_soft_delete_on_manufacturers.php new file mode 100755 index 0000000000..04cb01d15d --- /dev/null +++ b/database/migrations/2013_11_20_123137_add_soft_delete_on_manufacturers.php @@ -0,0 +1,29 @@ +softDeletes(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + } + +} diff --git a/database/migrations/2013_11_20_123725_add_soft_delete_on_categories.php b/database/migrations/2013_11_20_123725_add_soft_delete_on_categories.php new file mode 100755 index 0000000000..a17045bf79 --- /dev/null +++ b/database/migrations/2013_11_20_123725_add_soft_delete_on_categories.php @@ -0,0 +1,29 @@ +softDeletes(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + } + +} diff --git a/database/migrations/2013_11_20_130248_create_status_labels.php b/database/migrations/2013_11_20_130248_create_status_labels.php new file mode 100755 index 0000000000..7bdfb8a6f6 --- /dev/null +++ b/database/migrations/2013_11_20_130248_create_status_labels.php @@ -0,0 +1,34 @@ +increments('id'); + $table->string('name',100)->nullable(); + $table->integer('user_id')->nullable(); + $table->timestamps(); + $table->softDeletes(); + $table->engine = 'InnoDB'; + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('status_labels'); + } + +} diff --git a/database/migrations/2013_11_20_130830_add_status_id_on_assets_table.php b/database/migrations/2013_11_20_130830_add_status_id_on_assets_table.php new file mode 100755 index 0000000000..01b24c5a04 --- /dev/null +++ b/database/migrations/2013_11_20_130830_add_status_id_on_assets_table.php @@ -0,0 +1,31 @@ +integer('status_id')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('assets', function ($table) { + $table->dropColumn('status_id'); + }); + } + +} diff --git a/database/migrations/2013_11_20_131544_add_status_type_on_status_labels.php b/database/migrations/2013_11_20_131544_add_status_type_on_status_labels.php new file mode 100755 index 0000000000..2a8cfcd229 --- /dev/null +++ b/database/migrations/2013_11_20_131544_add_status_type_on_status_labels.php @@ -0,0 +1,31 @@ +boolean('deployable')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('status_labels', function ($table) { + $table->dropColumn('deployable'); + }); + } + +} diff --git a/database/migrations/2013_11_20_134103_add_archived_to_assets.php b/database/migrations/2013_11_20_134103_add_archived_to_assets.php new file mode 100755 index 0000000000..4623f67d7e --- /dev/null +++ b/database/migrations/2013_11_20_134103_add_archived_to_assets.php @@ -0,0 +1,31 @@ +boolean('archived')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('assets', function ($table) { + $table->dropColumn('archived'); + }); + } + +} diff --git a/database/migrations/2013_11_21_002321_add_uploads_table.php b/database/migrations/2013_11_21_002321_add_uploads_table.php new file mode 100755 index 0000000000..d54d5e5d76 --- /dev/null +++ b/database/migrations/2013_11_21_002321_add_uploads_table.php @@ -0,0 +1,36 @@ +increments('id'); + $table->integer('user_id')->nullable(); + $table->string('filename'); + $table->integer('asset_id'); + $table->string('filenotes')->nullable(); + $table->timestamps(); + $table->softDeletes(); + $table->engine = 'InnoDB'; + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('asset_uploads'); + } + +} diff --git a/database/migrations/2013_11_21_024531_remove_deployable_boolean_from_status_labels.php b/database/migrations/2013_11_21_024531_remove_deployable_boolean_from_status_labels.php new file mode 100755 index 0000000000..574c7bd8ec --- /dev/null +++ b/database/migrations/2013_11_21_024531_remove_deployable_boolean_from_status_labels.php @@ -0,0 +1,31 @@ +dropColumn('deployable'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('status_labels', function ($table) { + $table->boolean('deployable'); + }); + } + +} diff --git a/database/migrations/2013_11_22_075308_add_option_label_to_settings_table.php b/database/migrations/2013_11_22_075308_add_option_label_to_settings_table.php new file mode 100755 index 0000000000..9e007850d0 --- /dev/null +++ b/database/migrations/2013_11_22_075308_add_option_label_to_settings_table.php @@ -0,0 +1,31 @@ +string('option_label','80')->nullable(); + // }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // Schema::table('settings', function ($table) { + // $table->dropColumn('option_label'); + // }); + } + +} diff --git a/database/migrations/2013_11_22_213400_edits_to_settings_table.php b/database/migrations/2013_11_22_213400_edits_to_settings_table.php new file mode 100755 index 0000000000..e689e5cd0a --- /dev/null +++ b/database/migrations/2013_11_22_213400_edits_to_settings_table.php @@ -0,0 +1,35 @@ +dropColumn('option_label'); + //$table->dropColumn('option_name'); + // $table->dropColumn('option_value'); + $table->integer('per_page')->default(20); + $table->string('site_name','100')->default("Snipe IT Asset Management"); + }); + + + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + } + +} diff --git a/database/migrations/2013_11_25_013244_create_licenses_table.php b/database/migrations/2013_11_25_013244_create_licenses_table.php new file mode 100755 index 0000000000..38c2f6f68e --- /dev/null +++ b/database/migrations/2013_11_25_013244_create_licenses_table.php @@ -0,0 +1,43 @@ +increments('id'); + $table->string('name'); + $table->string('serial'); + $table->date('purchase_date')->nullable(); + $table->decimal('purchase_cost', 8, 2)->nullable(); + $table->string('order_number'); + $table->integer('seats'); + $table->text('notes'); + $table->integer('user_id')->nullable(); + $table->integer('depreciation_id'); + $table->timestamps(); + $table->softDeletes(); + $table->engine = 'InnoDB'; + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::drop('licenses'); + } + +} diff --git a/database/migrations/2013_11_25_031458_create_license_seats_table.php b/database/migrations/2013_11_25_031458_create_license_seats_table.php new file mode 100755 index 0000000000..acd101e3f8 --- /dev/null +++ b/database/migrations/2013_11_25_031458_create_license_seats_table.php @@ -0,0 +1,37 @@ +increments('id'); + $table->integer('license_id')->nullable(); + $table->integer('assigned_to')->nullable(); + $table->text('notes')->nullable(); + $table->integer('user_id')->nullable(); + $table->timestamps(); + $table->softDeletes(); + $table->engine = 'InnoDB'; + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + } + +} diff --git a/database/migrations/2013_11_25_032022_add_type_to_actionlog_table.php b/database/migrations/2013_11_25_032022_add_type_to_actionlog_table.php new file mode 100755 index 0000000000..4edfc94091 --- /dev/null +++ b/database/migrations/2013_11_25_032022_add_type_to_actionlog_table.php @@ -0,0 +1,33 @@ +string('asset_type')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::table('asset_logs', function ($table) { + $table->dropColumn('asset_type'); + }); + } + +} diff --git a/database/migrations/2013_11_25_033008_delete_bad_licenses_table.php b/database/migrations/2013_11_25_033008_delete_bad_licenses_table.php new file mode 100755 index 0000000000..755b647228 --- /dev/null +++ b/database/migrations/2013_11_25_033008_delete_bad_licenses_table.php @@ -0,0 +1,27 @@ +increments('id'); + $table->string('name')->nullable(); + $table->string('serial')->nullable(); + $table->date('purchase_date')->nullable(); + $table->decimal('purchase_cost', 8, 2)->nullable(); + $table->string('order_number'); + $table->integer('seats')->default(1); + $table->text('notes')->nullable(); + $table->integer('user_id')->nullable(); + $table->integer('depreciation_id')->nullable(); + $table->timestamps(); + $table->softDeletes(); + $table->engine = 'InnoDB'; + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::drop('licenses'); + } + +} diff --git a/database/migrations/2013_11_25_033534_add_licensed_to_licenses_table.php b/database/migrations/2013_11_25_033534_add_licensed_to_licenses_table.php new file mode 100755 index 0000000000..d51d88bceb --- /dev/null +++ b/database/migrations/2013_11_25_033534_add_licensed_to_licenses_table.php @@ -0,0 +1,35 @@ +string('license_name')->nullable(); + $table->string('license_email')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::table('licenses', function ($table) { + $table->dropColumn('license_name'); + $table->dropColumn('license_email'); + }); + } + +} diff --git a/database/migrations/2013_11_25_101308_add_warrantee_to_assets_table.php b/database/migrations/2013_11_25_101308_add_warrantee_to_assets_table.php new file mode 100755 index 0000000000..e912aacf86 --- /dev/null +++ b/database/migrations/2013_11_25_101308_add_warrantee_to_assets_table.php @@ -0,0 +1,33 @@ +integer('warrantee_months')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::table('assets', function ($table) { + $table->dropColumn('warrantee_months'); + }); + } + +} diff --git a/database/migrations/2013_11_25_104343_alter_warranty_column_on_assets.php b/database/migrations/2013_11_25_104343_alter_warranty_column_on_assets.php new file mode 100755 index 0000000000..e0d994f5e5 --- /dev/null +++ b/database/migrations/2013_11_25_104343_alter_warranty_column_on_assets.php @@ -0,0 +1,29 @@ +renameColumn('warrantee_months', 'warranty_months'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + } + +} diff --git a/database/migrations/2013_11_25_150450_drop_parent_from_categories.php b/database/migrations/2013_11_25_150450_drop_parent_from_categories.php new file mode 100755 index 0000000000..ba1949941a --- /dev/null +++ b/database/migrations/2013_11_25_150450_drop_parent_from_categories.php @@ -0,0 +1,29 @@ +dropColumn('parent'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + } + +} diff --git a/database/migrations/2013_11_25_151920_add_depreciate_to_assets.php b/database/migrations/2013_11_25_151920_add_depreciate_to_assets.php new file mode 100755 index 0000000000..13e009bfd4 --- /dev/null +++ b/database/migrations/2013_11_25_151920_add_depreciate_to_assets.php @@ -0,0 +1,36 @@ +boolean('depreciate')->nullable(); + + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('assets', function ($table) { + $table->dropColumn('depreciate'); + }); + + + + } + +} diff --git a/database/migrations/2013_11_25_152903_add_depreciate_to_licenses_table.php b/database/migrations/2013_11_25_152903_add_depreciate_to_licenses_table.php new file mode 100755 index 0000000000..1a2fbc05a0 --- /dev/null +++ b/database/migrations/2013_11_25_152903_add_depreciate_to_licenses_table.php @@ -0,0 +1,35 @@ +boolean('depreciate')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('licenses', function ($table) { + $table->dropColumn('depreciate'); + }); + + + + } + +} diff --git a/database/migrations/2013_11_26_211820_drop_license_from_assets_table.php b/database/migrations/2013_11_26_211820_drop_license_from_assets_table.php new file mode 100755 index 0000000000..611cf4b123 --- /dev/null +++ b/database/migrations/2013_11_26_211820_drop_license_from_assets_table.php @@ -0,0 +1,30 @@ +dropColumn('license_name'); + // $table->dropColumn('license_email'); + // }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + } + +} diff --git a/database/migrations/2013_11_27_062510_add_note_to_asset_logs_table.php b/database/migrations/2013_11_27_062510_add_note_to_asset_logs_table.php new file mode 100755 index 0000000000..de0d70a00f --- /dev/null +++ b/database/migrations/2013_11_27_062510_add_note_to_asset_logs_table.php @@ -0,0 +1,34 @@ +text('note')->nullable(); + + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::table('asset_logs', function ($table) { + $table->dropColumn('note'); + }); + } + +} diff --git a/database/migrations/2013_12_01_113426_add_filename_to_asset_log.php b/database/migrations/2013_12_01_113426_add_filename_to_asset_log.php new file mode 100755 index 0000000000..01b9e3130a --- /dev/null +++ b/database/migrations/2013_12_01_113426_add_filename_to_asset_log.php @@ -0,0 +1,34 @@ +text('filename')->nullable(); + + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::table('asset_logs', function ($table) { + $table->dropColumn('filename'); + }); + } + +} diff --git a/database/migrations/2013_12_06_094618_add_nullable_to_licenses_table.php b/database/migrations/2013_12_06_094618_add_nullable_to_licenses_table.php new file mode 100755 index 0000000000..fed1b8e9de --- /dev/null +++ b/database/migrations/2013_12_06_094618_add_nullable_to_licenses_table.php @@ -0,0 +1,33 @@ +string('order_number',50)->nullable()->change(); + $table->string('notes',255)->nullable()->change(); + $table->string('license_name',120)->nullable()->change(); + }); + + + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + } + +} diff --git a/database/migrations/2013_12_10_084038_add_eol_on_models_table.php b/database/migrations/2013_12_10_084038_add_eol_on_models_table.php new file mode 100755 index 0000000000..5e873bebb1 --- /dev/null +++ b/database/migrations/2013_12_10_084038_add_eol_on_models_table.php @@ -0,0 +1,32 @@ +integer('eol')->nullable()->default(NULL); + + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('models', function ($table) { + $table->dropColumn('old'); + }); + } + +} diff --git a/database/migrations/2013_12_12_055218_add_manager_to_users_table.php b/database/migrations/2013_12_12_055218_add_manager_to_users_table.php new file mode 100755 index 0000000000..3d399c39b4 --- /dev/null +++ b/database/migrations/2013_12_12_055218_add_manager_to_users_table.php @@ -0,0 +1,32 @@ +integer('manager_id')->nullable()->default(NULL); + + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('users', function ($table) { + $table->dropColumn('manager_id'); + }); + } + +} diff --git a/database/migrations/2014_01_28_031200_add_qr_code_to_settings_table.php b/database/migrations/2014_01_28_031200_add_qr_code_to_settings_table.php new file mode 100755 index 0000000000..671f127eaf --- /dev/null +++ b/database/migrations/2014_01_28_031200_add_qr_code_to_settings_table.php @@ -0,0 +1,32 @@ +integer('qr_code')->nullable()->default(NULL); + + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('settings', function ($table) { + $table->dropColumn('qr_code'); + }); + } + +} diff --git a/database/migrations/2014_02_13_183016_add_qr_text_to_settings_table.php b/database/migrations/2014_02_13_183016_add_qr_text_to_settings_table.php new file mode 100755 index 0000000000..48d17aed2b --- /dev/null +++ b/database/migrations/2014_02_13_183016_add_qr_text_to_settings_table.php @@ -0,0 +1,32 @@ +string('qr_text', 32)->nullable()->default(NULL); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('settings', function (Blueprint $table) { + $table->dropColumn('qr_text'); + }); + } + +} diff --git a/database/migrations/2014_05_24_093839_alter_default_license_depreciation_id.php b/database/migrations/2014_05_24_093839_alter_default_license_depreciation_id.php new file mode 100755 index 0000000000..bec8ae64b3 --- /dev/null +++ b/database/migrations/2014_05_24_093839_alter_default_license_depreciation_id.php @@ -0,0 +1,31 @@ +integer('depreciation_id')->nullable(); + // }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + } + +} diff --git a/database/migrations/2014_05_27_231658_alter_default_values_licenses.php b/database/migrations/2014_05_27_231658_alter_default_values_licenses.php new file mode 100755 index 0000000000..94c7b9eed4 --- /dev/null +++ b/database/migrations/2014_05_27_231658_alter_default_values_licenses.php @@ -0,0 +1,29 @@ +integer('display_asset_name')->nullable()->default(NULL); + + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('settings', function ($table) { + $table->dropColumn('display_asset_name'); + }); + } + +} diff --git a/database/migrations/2014_06_20_004847_make_asset_log_checkedout_to_nullable.php b/database/migrations/2014_06_20_004847_make_asset_log_checkedout_to_nullable.php new file mode 100755 index 0000000000..75eb893998 --- /dev/null +++ b/database/migrations/2014_06_20_004847_make_asset_log_checkedout_to_nullable.php @@ -0,0 +1,29 @@ +increments('id'); + $table->string('name'); + $table->string('address',50)->nullable()->default(NULL); + $table->string('address2',50)->nullable()->default(NULL); + $table->string('city')->nullable()->default(NULL); + $table->string('state',2)->nullable()->default(NULL); + $table->string('country',2)->nullable()->default(NULL); + $table->string('phone',20)->nullable()->default(NULL); + $table->string('fax',20)->nullable()->default(NULL); + $table->string('email',150)->nullable()->default(NULL); + $table->string('contact',100)->nullable()->default(NULL); + $table->string('notes')->nullable()->default(NULL); + $table->timestamps(); + $table->integer('user_id')->nullable(); + $table->softDeletes(); + $table->engine = 'InnoDB'; + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::drop('suppliers'); + } + +} diff --git a/database/migrations/2014_06_24_010742_add_supplier_id_to_asset.php b/database/migrations/2014_06_24_010742_add_supplier_id_to_asset.php new file mode 100755 index 0000000000..75c9c97e86 --- /dev/null +++ b/database/migrations/2014_06_24_010742_add_supplier_id_to_asset.php @@ -0,0 +1,32 @@ +integer('supplier_id')->nullable()->default(NULL); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('assets', function ($table) { + $table->dropColumn('supplier_id'); + }); + } + +} diff --git a/database/migrations/2014_06_24_012839_add_zip_to_supplier.php b/database/migrations/2014_06_24_012839_add_zip_to_supplier.php new file mode 100755 index 0000000000..49eff46409 --- /dev/null +++ b/database/migrations/2014_06_24_012839_add_zip_to_supplier.php @@ -0,0 +1,34 @@ +string('zip',10)->nullable()->default(NULL); + + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('suppliers', function ($table) { + $table->dropColumn('zip'); + }); + } + + +} diff --git a/database/migrations/2014_06_24_033908_add_url_to_supplier.php b/database/migrations/2014_06_24_033908_add_url_to_supplier.php new file mode 100755 index 0000000000..806a775e0c --- /dev/null +++ b/database/migrations/2014_06_24_033908_add_url_to_supplier.php @@ -0,0 +1,33 @@ +string('url',250)->nullable()->default(NULL); + + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('suppliers', function ($table) { + $table->dropColumn('url'); + }); + } + +} diff --git a/database/migrations/2014_07_08_054116_add_employee_id_to_users.php b/database/migrations/2014_07_08_054116_add_employee_id_to_users.php new file mode 100755 index 0000000000..dc64a9f601 --- /dev/null +++ b/database/migrations/2014_07_08_054116_add_employee_id_to_users.php @@ -0,0 +1,35 @@ +text('employee_num','50')->nullable()->default(NULL); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::table('users', function ($table) { + $table->dropColumn('employee_num'); + }); + + } + +} diff --git a/database/migrations/2014_07_09_134316_add_requestable_to_assets.php b/database/migrations/2014_07_09_134316_add_requestable_to_assets.php new file mode 100755 index 0000000000..69e4838b26 --- /dev/null +++ b/database/migrations/2014_07_09_134316_add_requestable_to_assets.php @@ -0,0 +1,37 @@ +tinyInteger('requestable')->default(0); + }); + + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::table('assets', function ($table) { + $table->dropColumn('requestable'); + }); + + } + +} + diff --git a/database/migrations/2014_07_17_085822_add_asset_to_software.php b/database/migrations/2014_07_17_085822_add_asset_to_software.php new file mode 100755 index 0000000000..ecca3f4387 --- /dev/null +++ b/database/migrations/2014_07_17_085822_add_asset_to_software.php @@ -0,0 +1,34 @@ +integer('asset_id')->nullable()->default(NULL); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::table('license_seats', function ($table) { + $table->dropColumn('asset_id'); + }); + } + +} diff --git a/database/migrations/2014_07_17_161625_make_asset_id_in_logs_nullable.php b/database/migrations/2014_07_17_161625_make_asset_id_in_logs_nullable.php new file mode 100755 index 0000000000..1c8f5c1cad --- /dev/null +++ b/database/migrations/2014_07_17_161625_make_asset_id_in_logs_nullable.php @@ -0,0 +1,29 @@ +integer('rtd_location_id')->nullable()->default(NULL); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::table('assets', function ($table) { + $table->dropColumn('rtd_location_id'); + }); + } + +} diff --git a/database/migrations/2014_10_24_000417_alter_supplier_state_to_32.php b/database/migrations/2014_10_24_000417_alter_supplier_state_to_32.php new file mode 100644 index 0000000000..5195c5c714 --- /dev/null +++ b/database/migrations/2014_10_24_000417_alter_supplier_state_to_32.php @@ -0,0 +1,28 @@ +integer('display_checkout_date')->nullable()->default(NULL); + + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('settings', function ($table) { + $table->dropColumn('display_checkout_date'); + }); + } + +} diff --git a/database/migrations/2014_10_28_222654_add_avatar_field_to_users_table.php b/database/migrations/2014_10_28_222654_add_avatar_field_to_users_table.php new file mode 100644 index 0000000000..27eb94684c --- /dev/null +++ b/database/migrations/2014_10_28_222654_add_avatar_field_to_users_table.php @@ -0,0 +1,37 @@ +string('avatar')->nullable(); + + }); + + } + + /** + * Revert the changes to the table. + * + * @return void + */ + public function down() + { + Schema::table('users', function(Blueprint $table) { + + $table->dropColumn('avatar'); + + }); + } + +} diff --git a/database/migrations/2014_10_29_045924_add_image_field_to_models_table.php b/database/migrations/2014_10_29_045924_add_image_field_to_models_table.php new file mode 100644 index 0000000000..27ec34cb03 --- /dev/null +++ b/database/migrations/2014_10_29_045924_add_image_field_to_models_table.php @@ -0,0 +1,37 @@ +string('image')->nullable(); + + }); + + } + + /** + * Revert the changes to the table. + * + * @return void + */ + public function down() + { + Schema::table('models', function(Blueprint $table) { + + $table->dropColumn('image'); + + }); + } + +} diff --git a/database/migrations/2014_11_01_214955_add_eol_display_to_settings.php b/database/migrations/2014_11_01_214955_add_eol_display_to_settings.php new file mode 100644 index 0000000000..9c7e8061fe --- /dev/null +++ b/database/migrations/2014_11_01_214955_add_eol_display_to_settings.php @@ -0,0 +1,33 @@ +integer('display_eol')->nullable()->default(NULL); + + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('settings', function ($table) { + $table->dropColumn('display_eol'); + }); + } + +} diff --git a/database/migrations/2014_11_04_231416_update_group_field_for_reporting.php b/database/migrations/2014_11_04_231416_update_group_field_for_reporting.php new file mode 100644 index 0000000000..004a96c4f7 --- /dev/null +++ b/database/migrations/2014_11_04_231416_update_group_field_for_reporting.php @@ -0,0 +1,40 @@ +integer('supplier_id')->nullable()->default(NULL); + $table->date('expiration_date')->nullable(); + $table->string('purchase_order')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('licenses', function ($table) { + $table->dropColumn('supplier_id'); + $table->dropColumn('expiration_date'); + $table->dropColumn('purchase_order'); + }); + } + +} diff --git a/database/migrations/2014_11_07_021042_add_image_to_supplier.php b/database/migrations/2014_11_07_021042_add_image_to_supplier.php new file mode 100644 index 0000000000..0efb41eb09 --- /dev/null +++ b/database/migrations/2014_11_07_021042_add_image_to_supplier.php @@ -0,0 +1,37 @@ +string('image')->nullable(); + + }); + + } + + /** + * Revert the changes to the table. + * + * @return void + */ + public function down() + { + Schema::table('suppliers', function(Blueprint $table) { + + $table->dropColumn('image'); + + }); + } + +} \ No newline at end of file diff --git a/database/migrations/2014_11_20_203007_add_username_to_user.php b/database/migrations/2014_11_20_203007_add_username_to_user.php new file mode 100644 index 0000000000..5dfecac39a --- /dev/null +++ b/database/migrations/2014_11_20_203007_add_username_to_user.php @@ -0,0 +1,39 @@ +string('username')->nullable()->default(NULL); + + }); + + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::table('users', function(Blueprint $table) { + + $table->dropColumn('username'); + + }); + } + +} diff --git a/database/migrations/2014_11_20_223947_add_auto_to_settings.php b/database/migrations/2014_11_20_223947_add_auto_to_settings.php new file mode 100644 index 0000000000..3d3a4765f7 --- /dev/null +++ b/database/migrations/2014_11_20_223947_add_auto_to_settings.php @@ -0,0 +1,38 @@ +integer('auto_increment_assets')->default(0); + + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::table('settings', function(Blueprint $table) { + + $table->dropColumn('auto_increment_assets'); + + }); + } + +} diff --git a/database/migrations/2014_11_20_224421_add_prefix_to_settings.php b/database/migrations/2014_11_20_224421_add_prefix_to_settings.php new file mode 100644 index 0000000000..dff67400b2 --- /dev/null +++ b/database/migrations/2014_11_20_224421_add_prefix_to_settings.php @@ -0,0 +1,38 @@ +string('auto_increment_prefix')->default(0); + + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::table('settings', function(Blueprint $table) { + + $table->dropColumn('auto_increment_prefix'); + + }); + } + +} diff --git a/database/migrations/2014_11_21_104401_change_licence_type.php b/database/migrations/2014_11_21_104401_change_licence_type.php new file mode 100644 index 0000000000..1028cca3e5 --- /dev/null +++ b/database/migrations/2014_11_21_104401_change_licence_type.php @@ -0,0 +1,32 @@ +date('termination_date')->nullable(); + $table->boolean('maintained')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('licenses', function ($table) { + $table->dropColumn('termination_date'); + $table->dropColumn('maintained'); + }); + } + +} diff --git a/database/migrations/2015_02_04_155757_increase_user_field_lengths.php b/database/migrations/2015_02_04_155757_increase_user_field_lengths.php new file mode 100644 index 0000000000..e71eedd007 --- /dev/null +++ b/database/migrations/2015_02_04_155757_increase_user_field_lengths.php @@ -0,0 +1,30 @@ +string('asset_type',100)->nullable()->change(); + }); + + // DB::statement('ALTER TABLE ' . DB::getTablePrefix() . 'asset_logs MODIFY column asset_type varchar(100) null'); + // DB::statement('ALTER TABLE ' . DB::getTablePrefix() . 'asset_logs MODIFY column added_on timestamp default "0000-00-00 00:00:00"'); + // Schema::table('asset_logs', function ($table) { + // $table->renameColumn('added_on', 'created_at'); + // $table->timestamp('updated_at'); + // $table->softDeletes(); + // }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // Schema::table('asset_logs', function ($table) { + // $table->renameColumn('created_at', 'added_on'); + // $table->dropColumn('updated_at'); + // $table->dropSoftDeletes(); + // }); + } + +} diff --git a/database/migrations/2015_02_10_040958_fix_bad_assigned_to_ids.php b/database/migrations/2015_02_10_040958_fix_bad_assigned_to_ids.php new file mode 100644 index 0000000000..5ca94c54a2 --- /dev/null +++ b/database/migrations/2015_02_10_040958_fix_bad_assigned_to_ids.php @@ -0,0 +1,48 @@ +boolean('deployable')->default(0); + $table->boolean('pending')->default(0); + $table->boolean('archived')->default(0); + $table->text('notes')->nullable(); + }); + + DB::statement('INSERT into ' . DB::getTablePrefix() . 'status_labels (user_id, name, deployable, pending, archived, notes) VALUES (1,"Pending",0,1,0,"These assets are not yet ready to be deployed, usually because of configuration or waiting on parts.")'); + DB::statement('INSERT into ' . DB::getTablePrefix() . 'status_labels (user_id, name, deployable, pending, archived, notes) VALUES (1,"Ready to Deploy",1,0,0,"These assets are ready to deploy.")'); + DB::statement('INSERT into ' . DB::getTablePrefix() . 'status_labels (user_id, name, deployable, pending, archived, notes) VALUES (1,"Archived",0,0,1,"These assets are no longer in circulation or viable.")'); + + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::table('status_labels', function ($table) { + $table->dropColumn('deployable'); + $table->dropColumn('pending'); + $table->dropColumn('archived'); + $table->dropColumn('notes'); + + }); + } + +} diff --git a/database/migrations/2015_02_10_053310_migrate_data_to_new_statuses.php b/database/migrations/2015_02_10_053310_migrate_data_to_new_statuses.php new file mode 100644 index 0000000000..66cb6609df --- /dev/null +++ b/database/migrations/2015_02_10_053310_migrate_data_to_new_statuses.php @@ -0,0 +1,60 @@ +name =="Pending") { + $pending_id = array($status->id); + } elseif ($status->name =="Ready to Deploy") { + $rtd_id = array($status->id); + } + } + + // Pending + $pendings = DB::select('select * from ' . DB::getTablePrefix() . 'assets where status_id IS NULL AND physical=1 '); + + foreach ($pendings as $pending) { + DB::update('update ' . DB::getTablePrefix() . 'assets set status_id = ? where status_id IS NULL AND physical=1',$pending_id); + + } + + + // Ready to Deploy + $rtds = DB::select('select * from ' . DB::getTablePrefix() . 'assets where status_id = 0 AND physical=1 '); + + foreach ($rtds as $rtd) { + //DB::update('update users set votes = 100 where name = ?', array('John')); + DB::update('update ' . DB::getTablePrefix() . 'assets set status_id = ? where status_id = 0 AND physical=1',$rtd_id); + + } + + + + + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + } + +} diff --git a/database/migrations/2015_02_11_044104_migrate_make_license_assigned_null.php b/database/migrations/2015_02_11_044104_migrate_make_license_assigned_null.php new file mode 100644 index 0000000000..75f2e46301 --- /dev/null +++ b/database/migrations/2015_02_11_044104_migrate_make_license_assigned_null.php @@ -0,0 +1,29 @@ +increments('id'); + $table->integer('asset_id'); + $table->integer('user_id')->nullable(); + $table->text('request_code'); + $table->timestamps(); + $table->softDeletes(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::drop('requests'); + } + +} diff --git a/database/migrations/2015_02_12_001312_add_mac_address_to_asset.php b/database/migrations/2015_02_12_001312_add_mac_address_to_asset.php new file mode 100644 index 0000000000..eb658a53ae --- /dev/null +++ b/database/migrations/2015_02_12_001312_add_mac_address_to_asset.php @@ -0,0 +1,43 @@ +string('mac_address')->nullable()->default(NULL); + }); + + Schema::table('models', function ($table) { + $table->boolean('show_mac_address')->default(0); + }); + + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::table('assets', function ($table) { + $table->dropColumn('mac_address'); + }); + + Schema::table('models', function ($table) { + $table->dropColumn('show_mac_address'); + }); + } + +} diff --git a/database/migrations/2015_02_12_024100_change_license_notes_type.php b/database/migrations/2015_02_12_024100_change_license_notes_type.php new file mode 100644 index 0000000000..a9a3029a8b --- /dev/null +++ b/database/migrations/2015_02_12_024100_change_license_notes_type.php @@ -0,0 +1,27 @@ +text('notes')->change(); + }); + + } + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + + } +} diff --git a/database/migrations/2015_02_17_231020_add_localonly_to_settings.php b/database/migrations/2015_02_17_231020_add_localonly_to_settings.php new file mode 100644 index 0000000000..6ac91ba23d --- /dev/null +++ b/database/migrations/2015_02_17_231020_add_localonly_to_settings.php @@ -0,0 +1,35 @@ +boolean('load_remote')->default(1); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::table('settings', function ($table) { + $table->dropColumn('load_remote'); + }); + + } + +} diff --git a/database/migrations/2015_02_19_222322_add_logo_and_colors_to_settings.php b/database/migrations/2015_02_19_222322_add_logo_and_colors_to_settings.php new file mode 100644 index 0000000000..f047a7080f --- /dev/null +++ b/database/migrations/2015_02_19_222322_add_logo_and_colors_to_settings.php @@ -0,0 +1,37 @@ +string('logo')->nullable()->default(NULL); + $table->string('header_color')->nullable()->default(NULL); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::table('settings', function ($table) { + $table->dropColumn('logo'); + $table->dropColumn('header_color'); + }); + + } + +} diff --git a/database/migrations/2015_02_24_072043_add_alerts_to_settings.php b/database/migrations/2015_02_24_072043_add_alerts_to_settings.php new file mode 100644 index 0000000000..8a208457ea --- /dev/null +++ b/database/migrations/2015_02_24_072043_add_alerts_to_settings.php @@ -0,0 +1,36 @@ +string('alert_email')->nullable()->default(NULL); + $table->boolean('alerts_enabled')->default(1); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::table('settings', function ($table) { + $table->dropColumn('alert_email'); + $table->dropColumn('alerts_enabled'); + }); + } + +} diff --git a/database/migrations/2015_02_25_022931_add_eula_fields.php b/database/migrations/2015_02_25_022931_add_eula_fields.php new file mode 100644 index 0000000000..a4eff87120 --- /dev/null +++ b/database/migrations/2015_02_25_022931_add_eula_fields.php @@ -0,0 +1,69 @@ +longText('default_eula_text')->nullable()->default(NULL); + }); + + Schema::table('categories', function ($table) { + $table->longText('eula_text')->nullable()->default(NULL); + $table->boolean('use_default_eula')->default(0); + $table->boolean('require_acceptance')->default(0); + }); + + Schema::table('asset_logs', function ($table) { + $table->dateTime('requested_at')->nullable()->default(NULL); + $table->dateTime('accepted_at')->nullable()->default(NULL); + }); + + + Schema::create('requested_assets', function ($table) { + $table->increments('id'); + $table->integer('asset_id')->default(NULL); + $table->integer('user_id')->default(NULL); + $table->dateTime('accepted_at')->nullable()->default(NULL); + $table->dateTime('denied_at')->nullable()->default(NULL); + $table->string('notes')->default(NULL); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::table('settings', function ($table) { + $table->dropColumn('default_eula_text'); + }); + + Schema::table('categories', function ($table) { + $table->dropColumn('eula_text'); + $table->dropColumn('use_default_eula'); + $table->dropColumn('require_acceptance'); + }); + + Schema::table('asset_logs', function ($table) { + $table->dropColumn('requested_at'); + $table->dropColumn('accepted_at'); + }); + + Schema::drop('requested_assets'); + } + +} diff --git a/database/migrations/2015_02_25_204513_add_accessories_table.php b/database/migrations/2015_02_25_204513_add_accessories_table.php new file mode 100644 index 0000000000..037351f861 --- /dev/null +++ b/database/migrations/2015_02_25_204513_add_accessories_table.php @@ -0,0 +1,49 @@ +increments('id'); + $table->string('name')->nullable()->default(NULL); + $table->integer('category_id')->nullable()->default(NULL); + $table->integer('user_id')->nullable()->default(NULL); + $table->integer('qty')->default(0); + $table->boolean('requestable')->default(0); + $table->timestamps(); + $table->softDeletes(); + $table->engine = 'InnoDB'; + }); + + Schema::table('asset_logs', function ($table) { + $table->integer('accessory_id')->nullable()->default(NULL); + }); + + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::drop('accessories'); + + Schema::table('asset_logs', function ($table) { + $table->dropColumn('accessory_id'); + }); + } + +} diff --git a/database/migrations/2015_02_26_091228_add_accessories_user_table.php b/database/migrations/2015_02_26_091228_add_accessories_user_table.php new file mode 100644 index 0000000000..e8a01d5508 --- /dev/null +++ b/database/migrations/2015_02_26_091228_add_accessories_user_table.php @@ -0,0 +1,46 @@ +increments('id'); + $table->integer('user_id')->nullable()->default(NULL); + $table->integer('accessory_id')->nullable()->default(NULL); + $table->integer('assigned_to')->nullable()->default(NULL); + $table->timestamps(); + }); + + Schema::table('accessories', function ($table) { + $table->integer('location_id')->nullable()->default(NULL); + }); + + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::drop('accessories_users'); + + Schema::table('accessories', function ($table) { + $table->dropColumn('location_id'); + }); + + } + +} diff --git a/database/migrations/2015_02_26_115128_add_deleted_at_models.php b/database/migrations/2015_02_26_115128_add_deleted_at_models.php new file mode 100644 index 0000000000..044647d43d --- /dev/null +++ b/database/migrations/2015_02_26_115128_add_deleted_at_models.php @@ -0,0 +1,32 @@ +softDeletes(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('models', function ($table){ + $table->dropColumn('deleted_at'); + }); + } + +} diff --git a/database/migrations/2015_02_26_233005_add_category_type.php b/database/migrations/2015_02_26_233005_add_category_type.php new file mode 100644 index 0000000000..7fe85587f1 --- /dev/null +++ b/database/migrations/2015_02_26_233005_add_category_type.php @@ -0,0 +1,34 @@ +string('category_type')->nullable()->default('asset'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::table('categories', function ($table) { + $table->dropColumn('category_type'); + }); + } + +} diff --git a/database/migrations/2015_03_01_231912_update_accepted_at_to_acceptance_id.php b/database/migrations/2015_03_01_231912_update_accepted_at_to_acceptance_id.php new file mode 100644 index 0000000000..0970c536ce --- /dev/null +++ b/database/migrations/2015_03_01_231912_update_accepted_at_to_acceptance_id.php @@ -0,0 +1,44 @@ +integer('accepted_id')->nullable()->default(NULL); + }); + + $results = DB::select('select invitation.id AS invitation_id, acceptance.id AS acceptance_id FROM asset_logs invitation INNER JOIN asset_logs acceptance ON (invitation.checkedout_to=acceptance.checkedout_to AND invitation.asset_id=acceptance.asset_id) WHERE invitation.action_type="checkout" AND acceptance.action_type="accepted"'); + + + foreach ($results as $result) { + $update = DB::update('update asset_logs set accepted_id=? where id=?', [$result->acceptance_id, $result->invitation_id]); + } + + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::table('asset_logs', function ($table) { + $table->dropColumn('accepted_id'); + }); + + } + +} diff --git a/database/migrations/2015_03_05_011929_add_qr_type_to_settings.php b/database/migrations/2015_03_05_011929_add_qr_type_to_settings.php new file mode 100644 index 0000000000..cc171bbfef --- /dev/null +++ b/database/migrations/2015_03_05_011929_add_qr_type_to_settings.php @@ -0,0 +1,34 @@ +string('barcode_type')->nullable()->default('QRCODE'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::table('settings', function ($table) { + $table->dropColumn('barcode_type'); + }); + } + +} diff --git a/database/migrations/2015_03_18_055327_add_note_to_user.php b/database/migrations/2015_03_18_055327_add_note_to_user.php new file mode 100644 index 0000000000..631f4574c0 --- /dev/null +++ b/database/migrations/2015_03_18_055327_add_note_to_user.php @@ -0,0 +1,32 @@ +text('notes')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('users', function ($table) { + $table->dropColumn('notes'); + }); + } + +} diff --git a/database/migrations/2015_04_29_234704_add_slack_to_settings.php b/database/migrations/2015_04_29_234704_add_slack_to_settings.php new file mode 100644 index 0000000000..8dca9e0b06 --- /dev/null +++ b/database/migrations/2015_04_29_234704_add_slack_to_settings.php @@ -0,0 +1,39 @@ +string('slack_endpoint')->nullable()->default(NULL); + $table->string('slack_channel')->nullable()->default(NULL); + $table->string('slack_botname')->nullable()->default(NULL); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('settings', function(Blueprint $table) + { + // + $table->dropColumn('slack_endpoint'); + $table->dropColumn('slack_channel'); + $table->dropColumn('slack_botname'); + }); + } + +} diff --git a/database/migrations/2015_05_04_085151_add_parent_id_to_locations_table.php b/database/migrations/2015_05_04_085151_add_parent_id_to_locations_table.php new file mode 100644 index 0000000000..6c0ed7f831 --- /dev/null +++ b/database/migrations/2015_05_04_085151_add_parent_id_to_locations_table.php @@ -0,0 +1,36 @@ +integer('parent_id')->nullable()->default(NULL); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('locations', function(Blueprint $table) + { + // + $table->dropColumn('parent_id'); + }); + } + +} diff --git a/database/migrations/2015_05_22_124421_add_reassignable_to_licenses.php b/database/migrations/2015_05_22_124421_add_reassignable_to_licenses.php new file mode 100644 index 0000000000..b0e94a92f8 --- /dev/null +++ b/database/migrations/2015_05_22_124421_add_reassignable_to_licenses.php @@ -0,0 +1,35 @@ +boolean('reassignable')->default(true); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('licenses', function(Blueprint $table) + { + // + $table->dropColumn('reassignable'); + }); + } + +} diff --git a/database/migrations/2015_06_10_003314_fix_default_for_user_notes.php b/database/migrations/2015_06_10_003314_fix_default_for_user_notes.php new file mode 100644 index 0000000000..12255c4c23 --- /dev/null +++ b/database/migrations/2015_06_10_003314_fix_default_for_user_notes.php @@ -0,0 +1,29 @@ +increments('id'); + $table->string('name')->nullable()->default(NULL); + $table->integer('category_id')->nullable()->default(NULL); + $table->integer('location_id')->nullable()->default(NULL); + $table->integer('user_id')->nullable()->default(NULL); + $table->integer('qty')->default(0); + $table->boolean('requestable')->default(0); + $table->timestamps(); + $table->softDeletes(); + $table->engine = 'InnoDB'; + }); + + Schema::table('asset_logs', function ($table) { + $table->integer('consumable_id')->nullable()->default(NULL); + }); + + Schema::create('consumables_users', function ($table) { + $table->increments('id'); + $table->integer('user_id')->nullable()->default(NULL); + $table->integer('consumable_id')->nullable()->default(NULL); + $table->integer('assigned_to')->nullable()->default(NULL); + $table->timestamps(); + }); + + + + } + + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::drop('consumables'); + + Schema::table('asset_logs', function ($table) { + $table->dropColumn('consumable_id'); + }); + + Schema::drop('consumables_users'); + + } + +} diff --git a/database/migrations/2015_06_15_183253_move_email_to_username.php b/database/migrations/2015_06_15_183253_move_email_to_username.php new file mode 100644 index 0000000000..f8af512b95 --- /dev/null +++ b/database/migrations/2015_06_15_183253_move_email_to_username.php @@ -0,0 +1,30 @@ +string('email')->nullable()->change(); + }); + + + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + + } + +} diff --git a/database/migrations/2015_06_26_213716_create_asset_maintenances_table.php b/database/migrations/2015_06_26_213716_create_asset_maintenances_table.php new file mode 100644 index 0000000000..e43b727a93 --- /dev/null +++ b/database/migrations/2015_06_26_213716_create_asset_maintenances_table.php @@ -0,0 +1,65 @@ +increments( 'id' ); + $table->integer( 'asset_id' ) + ->unsigned(); + $table->integer( 'supplier_id' ) + ->unsigned(); + $table->string( 'asset_maintenance_type'); + $table->string( 'title', 100 ); + $table->boolean( 'is_warranty' ); + $table->date( 'start_date' ); + $table->date( 'completion_date' ) + ->nullable(); + $table->integer( 'asset_maintenance_time' ) + ->nullable(); + $table->longText( 'notes' ) + ->nullable(); + $table->decimal( 'cost', 10, 2 ) + ->nullable(); + $table->dateTime( 'deleted_at' ) + ->nullable(); + $table->timestamps(); + } ); + } + + protected function getEnumFields() + { + + return [ + Lang::get( 'admin/asset_maintenances/general.maintenance' ), + Lang::get( 'admin/asset_maintenances/general.repair' ), + Lang::get( 'admin/asset_maintenances/general.upgrade' ) + ]; + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + + Schema::dropIfExists( 'asset_maintenances' ); + + } + +} diff --git a/database/migrations/2015_07_04_212443_create_custom_fields_table.php b/database/migrations/2015_07_04_212443_create_custom_fields_table.php new file mode 100644 index 0000000000..b2dbbebb8c --- /dev/null +++ b/database/migrations/2015_07_04_212443_create_custom_fields_table.php @@ -0,0 +1,36 @@ +increments('id'); + $table->string('name'); + $table->string('format'); + $table->string('element'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::drop('custom_fields'); + } + +} diff --git a/database/migrations/2015_07_09_014359_add_currency_to_settings_and_locations.php b/database/migrations/2015_07_09_014359_add_currency_to_settings_and_locations.php new file mode 100644 index 0000000000..ad9ebd93e6 --- /dev/null +++ b/database/migrations/2015_07_09_014359_add_currency_to_settings_and_locations.php @@ -0,0 +1,56 @@ +string('default_currency',10)->nullable()->default(NULL); + }); + + DB::update('UPDATE `'.DB::getTablePrefix().'settings` SET `default_currency`="'. Lang::get('general.currency').'"'); + + Schema::table('locations', function(Blueprint $table) + { + $table->string('currency',10)->nullable()->default(NULL); + }); + + DB::update('UPDATE `'.DB::getTablePrefix().'locations` SET `currency`="'. Lang::get('general.currency').'"'); + + + + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::table('settings', function(Blueprint $table) + { + // + $table->dropColumn('default_currency'); + }); + + Schema::table('locations', function(Blueprint $table) + { + // + $table->dropColumn('currency'); + }); + + } + +} diff --git a/database/migrations/2015_07_21_122022_add_expected_checkin_date_to_asset_logs.php b/database/migrations/2015_07_21_122022_add_expected_checkin_date_to_asset_logs.php new file mode 100644 index 0000000000..40826af579 --- /dev/null +++ b/database/migrations/2015_07_21_122022_add_expected_checkin_date_to_asset_logs.php @@ -0,0 +1,37 @@ +date('expected_checkin')->nullable()->default(NULL); + }); + + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + + Schema::table('asset_logs', function(Blueprint $table) + { + $table->dropColumn('expected_checkin'); + }); + + } + +} diff --git a/database/migrations/2015_07_24_093845_add_checkin_email_to_category_table.php b/database/migrations/2015_07_24_093845_add_checkin_email_to_category_table.php new file mode 100644 index 0000000000..a2009e4dea --- /dev/null +++ b/database/migrations/2015_07_24_093845_add_checkin_email_to_category_table.php @@ -0,0 +1,32 @@ +boolean('checkin_email')->default(0); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('categories', function ($table) { + $table->dropColumn('checkin_email'); + }); + } + +} diff --git a/database/migrations/2015_07_25_055415_remove_email_unique_constraint.php b/database/migrations/2015_07_25_055415_remove_email_unique_constraint.php new file mode 100644 index 0000000000..06c84a9df3 --- /dev/null +++ b/database/migrations/2015_07_25_055415_remove_email_unique_constraint.php @@ -0,0 +1,31 @@ +dropUnique('users_email_unique'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + } + +} diff --git a/database/migrations/2015_07_29_230054_add_thread_id_to_asset_logs_table.php b/database/migrations/2015_07_29_230054_add_thread_id_to_asset_logs_table.php new file mode 100644 index 0000000000..d96d9ff696 --- /dev/null +++ b/database/migrations/2015_07_29_230054_add_thread_id_to_asset_logs_table.php @@ -0,0 +1,214 @@ +integer( 'thread_id' ) + ->nullable() + ->default( null ); + $table->index( 'thread_id' ); + } ); + } + + $this->actionlog = new App\Models\Actionlog(); + $this->assetLogs = $this->actionlog->getListingOfActionLogsChronologicalOrder(); + + foreach ($this->assetLogs as $assetLog) { + + if ($this->hasAssetChanged( $assetLog )) { + $this->resetCurrentAssetInformation( $assetLog ); + } + + if ($this->hasBegunNewChain( $assetLog )) { + $this->startOfCurrentThread = false; + continue; + } + + $this->updateAssetLogWithThreadInformation( $assetLog ); + + if ($this->hasReachedEndOfChain( $assetLog ) + ) { + $this->clearCurrentAssetInformation(); + } + + } + } + + + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + + Schema::table( 'asset_logs', function ( Blueprint $table ) { + + $table->dropIndex( 'thread_id' ); + $table->dropColumn( 'thread_id' ); + } ); + } + + /** + * hasAssetChanged + * + * @param $assetLog + * + * @return bool + * @author Vincent Sposato + * @version v1.0 + */ + protected function hasAssetChanged( $assetLog ) + { + + return $assetLog->asset_id !== $this->currentAssetId; + } + + /** + * resetCurrentAssetInformation + * + * @param $assetLog + * + * @author Vincent Sposato + * @version v1.0 + */ + protected function resetCurrentAssetInformation( $assetLog ) + { + + $this->currentAssetId = $assetLog->asset_id; + $this->currentAssetLogId = $assetLog->id; + $this->startOfCurrentThread = true; + } + + /** + * hasReachedEndOfChain + * + * @param $assetLog + * + * @return bool + * @author Vincent Sposato + * @version v1.0 + */ + protected function hasReachedEndOfChain( $assetLog ) + { + + return in_array( $assetLog->action_type, $this->threadFinalActionTypes ) + && $this->startOfCurrentThread == false; + } + + /** + * clearCurrentAssetInformation + * @author Vincent Sposato + * @version v1.0 + */ + protected function clearCurrentAssetInformation() + { + + $this->startOfCurrentThread = true; + $this->currentAssetLogId = null; + $this->currentAssetId = null; + } + + /** + * updateAssetLogWithThreadInformation + * + * @param $assetLog + * + * @author Vincent Sposato + * @version v1.0 + */ + protected function updateAssetLogWithThreadInformation( $assetLog ) + { + + $loadedAssetLog = Actionlog::find( $assetLog->id ); + + $loadedAssetLog->thread_id = $this->currentAssetLogId; + + $loadedAssetLog->update(); + + unset( $loadedAssetLog ); + } + + /** + * hasBegunNewChain + * + * @param $assetLog + * + * @return bool + * @author Vincent Sposato + * @version v1.0 + */ + protected function hasBegunNewChain( $assetLog ) + { + + return in_array( $assetLog->action_type, $this->threadStartingActionTypes ) + && $this->startOfCurrentThread == true; + } + + } diff --git a/database/migrations/2015_07_31_015430_add_accepted_to_assets.php b/database/migrations/2015_07_31_015430_add_accepted_to_assets.php new file mode 100644 index 0000000000..8f07b0951c --- /dev/null +++ b/database/migrations/2015_07_31_015430_add_accepted_to_assets.php @@ -0,0 +1,34 @@ +string('accepted')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('assets', function(Blueprint $table) + { + $table->dropColumn('accepted'); + }); + } + +} diff --git a/database/migrations/2015_09_09_195301_add_custom_css_to_settings.php b/database/migrations/2015_09_09_195301_add_custom_css_to_settings.php new file mode 100644 index 0000000000..0baa89bb08 --- /dev/null +++ b/database/migrations/2015_09_09_195301_add_custom_css_to_settings.php @@ -0,0 +1,34 @@ +text('custom_css')->nullable()->default(NULL); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('settings', function(Blueprint $table) + { + $table->dropColumn('custom_css'); + }); + } + +} diff --git a/database/migrations/2015_09_21_235926_create_custom_field_custom_fieldset.php b/database/migrations/2015_09_21_235926_create_custom_field_custom_fieldset.php new file mode 100644 index 0000000000..acf920ce73 --- /dev/null +++ b/database/migrations/2015_09_21_235926_create_custom_field_custom_fieldset.php @@ -0,0 +1,36 @@ +integer('custom_field_id'); + $table->integer('custom_fieldset_id'); + + $table->integer('order'); + $table->boolean('required'); + $table->engine = 'InnoDB'; + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('custom_field_custom_fieldset'); + } + +} diff --git a/database/migrations/2015_09_22_000104_create_custom_fieldsets.php b/database/migrations/2015_09_22_000104_create_custom_fieldsets.php new file mode 100644 index 0000000000..436a579692 --- /dev/null +++ b/database/migrations/2015_09_22_000104_create_custom_fieldsets.php @@ -0,0 +1,34 @@ +increments('id'); + $table->string('name'); + $table->engine = 'InnoDB'; + // + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('custom_fieldsets'); + } + +} diff --git a/database/migrations/2015_09_22_003321_add_fieldset_id_to_assets.php b/database/migrations/2015_09_22_003321_add_fieldset_id_to_assets.php new file mode 100644 index 0000000000..7771b30e0e --- /dev/null +++ b/database/migrations/2015_09_22_003321_add_fieldset_id_to_assets.php @@ -0,0 +1,33 @@ +integer('fieldset_id')->nullable(); + }); + + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('models',function (Blueprint $table) { + $table->dropColumn('fieldset_id'); + }); + } + +} diff --git a/database/migrations/2015_09_22_003413_migrate_mac_address.php b/database/migrations/2015_09_22_003413_migrate_mac_address.php new file mode 100644 index 0000000000..ff31042f9a --- /dev/null +++ b/database/migrations/2015_09_22_003413_migrate_mac_address.php @@ -0,0 +1,61 @@ +getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string'); + + $f2=new \App\Models\CustomFieldset(['name' => "Asset with MAC Address"]); + $f2->timestamps=false; //when this model was first created, it had no timestamps. But later on it gets them. + if(!$f2->save()) { + throw new Exception("couldn't save customfieldset"); + } + $macid=DB::table('custom_fields')->insertGetId([ + 'name' => "MAC Address", + 'format' => \App\Models\CustomField::$PredefinedFormats['MAC'], + 'element'=>'text']); + if(!$macid) { + throw new Exception("Can't save MAC Custom field: $macid"); + } + + $f2->fields()->attach($macid,['required' => false, 'order' => 1]); + \App\Models\AssetModel::where(["show_mac_address" => true])->update(["fieldset_id"=>$f2->id]); + + Schema::table('assets', function (Blueprint $table) { + $table->renameColumn('mac_address', '_snipeit_mac_address'); + }); + + // DB::statement("ALTER TABLE assets CHANGE mac_address _snipeit_mac_address varchar(255)"); + + $ans=Schema::table("models",function (Blueprint $table) { + $table->renameColumn('show_mac_address','deprecated_mac_address'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + $f=\App\Models\CustomFieldset::where(["name" => "Asset with MAC Address"])->first(); + $f->fields()->delete(); + $f->delete(); + Schema::table("models",function(Blueprint $table) { + $table->renameColumn("deprecated_mac_address","show_mac_address"); + }); + DB::statement("ALTER TABLE assets CHANGE _snipeit_mac_address mac_address varchar(255)"); + } + +} diff --git a/database/migrations/2015_09_28_003314_fix_default_purchase_order.php b/database/migrations/2015_09_28_003314_fix_default_purchase_order.php new file mode 100644 index 0000000000..5e9f14c1a6 --- /dev/null +++ b/database/migrations/2015_09_28_003314_fix_default_purchase_order.php @@ -0,0 +1,33 @@ +string('purchase_order')->nullable()->change(); + }); + + // DB::statement('ALTER TABLE `'.DB::getTablePrefix().'licenses` MODIFY `purchase_order` varchar(255) DEFAULT NULL;'); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + // DB::statement('ALTER TABLE `'.DB::getTablePrefix().'licenses` MODIFY `purchase_order` varchar(255);'); + } + +} diff --git a/database/migrations/2015_10_01_024551_add_accessory_consumable_price_info.php b/database/migrations/2015_10_01_024551_add_accessory_consumable_price_info.php new file mode 100644 index 0000000000..7e3535c71a --- /dev/null +++ b/database/migrations/2015_10_01_024551_add_accessory_consumable_price_info.php @@ -0,0 +1,48 @@ +date('purchase_date')->nullable(); + $table->decimal('purchase_cost', 13, 4)->nullable(); + $table->string('order_number')->nullable(); + }); + + Schema::table('consumables', function ($table) { + $table->date('purchase_date')->nullable(); + $table->decimal('purchase_cost', 13, 4)->nullable(); + $table->string('order_number')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('accessories', function ($table) { + $table->dropColumn('purchase_date'); + $table->dropColumn('purchase_cost'); + $table->dropColumn('order_number'); + }); + + Schema::table('consumables', function ($table) { + $table->dropColumn('purchase_date'); + $table->dropColumn('purchase_cost'); + $table->dropColumn('order_number'); + }); + } + +} diff --git a/database/migrations/2015_10_12_192706_add_brand_to_settings.php b/database/migrations/2015_10_12_192706_add_brand_to_settings.php new file mode 100644 index 0000000000..eae3acd849 --- /dev/null +++ b/database/migrations/2015_10_12_192706_add_brand_to_settings.php @@ -0,0 +1,34 @@ +tinyInteger('brand')->default(1); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('settings', function(Blueprint $table) + { + $table->dropColumn('brand'); + }); + } + +} diff --git a/database/migrations/2015_10_22_003314_fix_defaults_accessories.php b/database/migrations/2015_10_22_003314_fix_defaults_accessories.php new file mode 100644 index 0000000000..9ac9e824d1 --- /dev/null +++ b/database/migrations/2015_10_22_003314_fix_defaults_accessories.php @@ -0,0 +1,41 @@ +string('order_number')->nullable()->change(); + }); + + Schema::table('consumables', function (Blueprint $table) { + $table->string('order_number')->nullable()->change(); + }); + + // + // DB::statement('ALTER TABLE `'.DB::getTablePrefix().'accessories` MODIFY `order_number` varchar(255) DEFAULT NULL;'); + // + // DB::statement('ALTER TABLE `'.DB::getTablePrefix().'consumables` MODIFY `order_number` varchar(255) DEFAULT NULL;'); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + DB::statement('ALTER TABLE `'.DB::getTablePrefix().'accessories` MODIFY `order_number` varchar(255);'); + DB::statement('ALTER TABLE `'.DB::getTablePrefix().'consumables` MODIFY `order_number` varchar(255);'); + } + +} diff --git a/database/migrations/2015_10_23_182625_add_checkout_time_and_expected_checkout_date_to_assets.php b/database/migrations/2015_10_23_182625_add_checkout_time_and_expected_checkout_date_to_assets.php new file mode 100644 index 0000000000..d4032feb82 --- /dev/null +++ b/database/migrations/2015_10_23_182625_add_checkout_time_and_expected_checkout_date_to_assets.php @@ -0,0 +1,40 @@ +dateTime('last_checkout')->nullable(); + $table->date('expected_checkin')->nullable(); + }); + DB::statement("UPDATE assets SET last_checkout=(SELECT MAX(created_at) FROM asset_logs WHERE asset_logs.id=assets.id AND action_type='checkout') WHERE assigned_to IS NOT NULL"); + DB::statement("UPDATE assets SET expected_checkin=(SELECT expected_checkin FROM asset_logs WHERE asset_logs.id=assets.id AND action_type='checkout' ORDER BY id DESC limit 1) WHERE assigned_to IS NOT NULL"); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('assets', function(Blueprint $table) + { + // + $table->dropColumn('last_checkout'); + $table->dropColumn('expected_checkin'); + }); + } + +} diff --git a/database/migrations/2015_11_05_061015_create_companies_table.php b/database/migrations/2015_11_05_061015_create_companies_table.php new file mode 100644 index 0000000000..d0bc86cbe6 --- /dev/null +++ b/database/migrations/2015_11_05_061015_create_companies_table.php @@ -0,0 +1,33 @@ +increments('id'); + $table->string('name')->unique(); + $table->timestamps(); + $table->engine = 'InnoDB'; + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('companies'); + } +} diff --git a/database/migrations/2015_11_05_061115_add_company_id_to_consumables_table.php b/database/migrations/2015_11_05_061115_add_company_id_to_consumables_table.php new file mode 100644 index 0000000000..930b47e3c9 --- /dev/null +++ b/database/migrations/2015_11_05_061115_add_company_id_to_consumables_table.php @@ -0,0 +1,35 @@ +integer('company_id')->unsigned()->nullable(); + //$table->foreign('company_id')->references('id')->on('companies'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('consumables', function(Blueprint $table) + { + //$table->dropForeign('consumables_company_id_foreign'); + $table->dropColumn('company_id'); + }); + } +} diff --git a/database/migrations/2015_11_05_183749_image.php b/database/migrations/2015_11_05_183749_image.php new file mode 100644 index 0000000000..8d5749a43a --- /dev/null +++ b/database/migrations/2015_11_05_183749_image.php @@ -0,0 +1,34 @@ +text('image')->after('notes')->nullable()->default(NULL); + // + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('assets', function ($table) { + $table->dropColumn('image'); + }); + } + +} diff --git a/database/migrations/2015_11_06_092038_add_company_id_to_accessories_table.php b/database/migrations/2015_11_06_092038_add_company_id_to_accessories_table.php new file mode 100644 index 0000000000..cee633bc3d --- /dev/null +++ b/database/migrations/2015_11_06_092038_add_company_id_to_accessories_table.php @@ -0,0 +1,35 @@ +integer('company_id')->unsigned()->nullable(); + //$table->foreign('company_id')->references('id')->on('companies'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('accessories', function(Blueprint $table) + { + //$table->dropForeign('accessories_company_id_foreign'); + $table->dropColumn('company_id'); + }); + } +} diff --git a/database/migrations/2015_11_06_100045_add_company_id_to_users_table.php b/database/migrations/2015_11_06_100045_add_company_id_to_users_table.php new file mode 100644 index 0000000000..aef83fe265 --- /dev/null +++ b/database/migrations/2015_11_06_100045_add_company_id_to_users_table.php @@ -0,0 +1,35 @@ +integer('company_id')->unsigned()->nullable(); + //$table->foreign('company_id')->references('id')->on('companies'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('users', function(Blueprint $table) + { + //$table->dropForeign('users_company_id_foreign'); + $table->dropColumn('company_id'); + }); + } +} diff --git a/database/migrations/2015_11_06_134742_add_company_id_to_licenses_table.php b/database/migrations/2015_11_06_134742_add_company_id_to_licenses_table.php new file mode 100644 index 0000000000..4f0756cf2c --- /dev/null +++ b/database/migrations/2015_11_06_134742_add_company_id_to_licenses_table.php @@ -0,0 +1,35 @@ +integer('company_id')->unsigned()->nullable(); + //$table->foreign('company_id')->references('id')->on('companies'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('licenses', function(Blueprint $table) + { + //$table->dropForeign('licenses_company_id_foreign'); + $table->dropColumn('company_id'); + }); + } +} diff --git a/database/migrations/2015_11_08_035832_add_company_id_to_assets_table.php b/database/migrations/2015_11_08_035832_add_company_id_to_assets_table.php new file mode 100644 index 0000000000..010ec528e7 --- /dev/null +++ b/database/migrations/2015_11_08_035832_add_company_id_to_assets_table.php @@ -0,0 +1,35 @@ +integer('company_id')->unsigned()->nullable(); + //$table->foreign('company_id')->references('id')->on('companies'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('assets', function(Blueprint $table) + { + // $table->dropForeign('assets_company_id_foreign'); + $table->dropColumn('company_id'); + }); + } +} diff --git a/database/migrations/2015_11_08_222305_add_ldap_fields_to_settings.php b/database/migrations/2015_11_08_222305_add_ldap_fields_to_settings.php new file mode 100644 index 0000000000..a293b43525 --- /dev/null +++ b/database/migrations/2015_11_08_222305_add_ldap_fields_to_settings.php @@ -0,0 +1,60 @@ +string('ldap_enabled')->nullable()->default(NULL); + $table->string('ldap_server')->nullable()->default(NULL); + $table->string('ldap_uname')->nullable()->default(NULL); + $table->longText('ldap_pword')->nullable()->default(NULL); + $table->string('ldap_basedn')->nullable()->default(NULL); + $table->string('ldap_filter')->nullable()->default('cn=*'); + $table->string('ldap_username_field')->nullable()->default('samaccountname'); + $table->string('ldap_lname_field')->nullable()->default('sn'); + $table->string('ldap_fname_field')->nullable()->default('givenname'); + $table->string('ldap_auth_filter_query')->nullable()->default('uid=samaccountname'); + $table->integer('ldap_version')->nullable()->default(3); + $table->string('ldap_active_flag')->nullable()->default(NULL); + $table->string('ldap_emp_num')->nullable()->default(NULL); + $table->string('ldap_email')->nullable()->default(NULL); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('settings', function(Blueprint $table) + { + $table->dropColumn('ldap_enabled'); + $table->dropColumn('ldap_server'); + $table->dropColumn('ldap_uname'); + $table->dropColumn('ldap_pword'); + $table->dropColumn('ldap_basedn'); + $table->dropColumn('ldap_filter'); + $table->dropColumn('ldap_username_field'); + $table->dropColumn('ldap_lname_field'); + $table->dropColumn('ldap_fname_field'); + $table->dropColumn('ldap_auth_filter_query'); + $table->dropColumn('ldap_version'); + $table->dropColumn('ldap_active_flag'); + $table->dropColumn('ldap_emp_num'); + $table->dropColumn('ldap_email'); + }); + } + +} diff --git a/database/migrations/2015_11_15_151803_add_full_multiple_companies_support_to_settings_table.php b/database/migrations/2015_11_15_151803_add_full_multiple_companies_support_to_settings_table.php new file mode 100644 index 0000000000..9cf8b163b0 --- /dev/null +++ b/database/migrations/2015_11_15_151803_add_full_multiple_companies_support_to_settings_table.php @@ -0,0 +1,34 @@ +boolean('full_multiple_companies_support')->default(FALSE); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('settings', function(Blueprint $table) + { + $table->dropColumn('full_multiple_companies_support'); + }); + } + +} diff --git a/database/migrations/2015_11_26_195528_import_ldap_settings.php b/database/migrations/2015_11_26_195528_import_ldap_settings.php new file mode 100644 index 0000000000..3cd3826901 --- /dev/null +++ b/database/migrations/2015_11_26_195528_import_ldap_settings.php @@ -0,0 +1,77 @@ +ldap_server)) { + + $settings->ldap_enabled = 1; + $settings->ldap_server = config('ldap.url'); + $settings->ldap_uname = config('ldap.username'); + $settings->ldap_pword = Crypt::encrypt(config('ldap.password')); + $settings->ldap_basedn = config('ldap.basedn'); + $settings->ldap_filter = config('ldap.filter'); + $settings->ldap_username_field = config('ldap.result.username'); + $settings->ldap_lname_field = config('ldap.result.last.name'); + $settings->ldap_fname_field = config('ldap.result.first.name'); + $settings->ldap_auth_filter_query = config('ldap.authentication.filter.query'); + $settings->ldap_version = config('ldap.version'); + $settings->ldap_active_flag = config('ldap.result.active.flag'); + $settings->ldap_emp_num = config('ldap.result.emp.num'); + $settings->ldap_email = config('ldap.result.email'); + + // Save the imported settings + if ($settings->save()) { + echo 'LDAP settings imported into database'."\n"; + + // Copy the old LDAP config file to prevent any future confusion + if (@copy(app_path().'/config/'.app()->environment().'/ldap.php', app_path().'/config/'.app()->environment().'/deprecated.ldap.php')) { + + if (@unlink(app_path().'/config/'.app()->environment().'/ldap.php')) { + echo 'Original LDAP file archived to '.app_path().'/config/'.app()->environment().'/deprecated.ldap.php'."\n"; + } else { + echo 'Could not archive LDAP config file'."\n"; + } + + } else { + echo 'Could not archive LDAP config file'."\n"; + } + + } + + } + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + + if (@copy(app_path().'/config/'.app()->environment().'/deprecated.ldap.php', app_path().'/config/'.app()->environment().'/ldap.php')) { + echo 'Un-archived LDAP config file'."\n"; + @unlink(app_path().'/config/'.app()->environment().'/deprecated.ldap.php'); + + } else { + echo 'Could not un-archive LDAP config file. Manually rename it instead.'."\n"; + } + } + +} diff --git a/database/migrations/2015_11_30_191504_remove_fk_company_id.php b/database/migrations/2015_11_30_191504_remove_fk_company_id.php new file mode 100644 index 0000000000..bd0a9bda06 --- /dev/null +++ b/database/migrations/2015_11_30_191504_remove_fk_company_id.php @@ -0,0 +1,54 @@ +dropForeign('users_company_id_foreign'); + // }); + // + // Schema::table('accessories', function(Blueprint $table) + // { + // $table->dropForeign('accessories_company_id_foreign'); + // }); + // + // Schema::table('assets', function(Blueprint $table) + // { + // $table->dropForeign('assets_company_id_foreign'); + // }); + // + // Schema::table('consumables', function(Blueprint $table) + // { + // $table->dropForeign('consumables_company_id_foreign'); + // }); + // + // Schema::table('licenses', function(Blueprint $table) + // { + // $table->dropForeign('licenses_company_id_foreign'); + // }); + + + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + } + +} diff --git a/database/migrations/2015_12_21_193006_add_ldap_server_cert_ignore_to_settings_table.php b/database/migrations/2015_12_21_193006_add_ldap_server_cert_ignore_to_settings_table.php new file mode 100644 index 0000000000..0e22c78683 --- /dev/null +++ b/database/migrations/2015_12_21_193006_add_ldap_server_cert_ignore_to_settings_table.php @@ -0,0 +1,34 @@ +boolean('ldap_server_cert_ignore')->default(FALSE); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('settings', function(Blueprint $table) + { + $table->dropColumn('ldap_server_cert_ignore'); + }); + } + +} diff --git a/database/migrations/2015_12_30_233509_add_timestamp_and_userId_to_custom_fields.php b/database/migrations/2015_12_30_233509_add_timestamp_and_userId_to_custom_fields.php new file mode 100644 index 0000000000..9b7854615a --- /dev/null +++ b/database/migrations/2015_12_30_233509_add_timestamp_and_userId_to_custom_fields.php @@ -0,0 +1,34 @@ +integer("user_id")->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('custom_fields', function(Blueprint $table) + { + $table->dropColumn("user_id"); + }); + } + +} diff --git a/database/migrations/2015_12_30_233658_add_timestamp_and_userId_to_custom_fieldsets.php b/database/migrations/2015_12_30_233658_add_timestamp_and_userId_to_custom_fieldsets.php new file mode 100644 index 0000000000..1d2ba523ee --- /dev/null +++ b/database/migrations/2015_12_30_233658_add_timestamp_and_userId_to_custom_fieldsets.php @@ -0,0 +1,38 @@ +timestamps(); + $table->integer("user_id")->nullable(); + }); + + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('custom_fieldsets', function(Blueprint $table) + { + $table->dropTimestamps(); + $table->dropColumn("user_id"); + }); + } + +} diff --git a/database/migrations/2016_01_28_041048_add_notes_to_models.php b/database/migrations/2016_01_28_041048_add_notes_to_models.php new file mode 100644 index 0000000000..de922da180 --- /dev/null +++ b/database/migrations/2016_01_28_041048_add_notes_to_models.php @@ -0,0 +1,32 @@ +text('note')->nullable()->default(NULL); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('models', function ($table) { + $table->dropColumn('note'); + }); + } + +} diff --git a/database/migrations/2016_02_19_070119_add_remember_token_to_users_table.php b/database/migrations/2016_02_19_070119_add_remember_token_to_users_table.php new file mode 100644 index 0000000000..d5595ac1d5 --- /dev/null +++ b/database/migrations/2016_02_19_070119_add_remember_token_to_users_table.php @@ -0,0 +1,31 @@ +text('remember_token')->nullable()->default(NULL); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('users', function (Blueprint $table) { + // + }); + } +} diff --git a/database/migrations/2016_02_19_073625_create_password_resets_table.php b/database/migrations/2016_02_19_073625_create_password_resets_table.php new file mode 100644 index 0000000000..30637e15a5 --- /dev/null +++ b/database/migrations/2016_02_19_073625_create_password_resets_table.php @@ -0,0 +1,37 @@ +engine = 'InnoDB'; + $table->string('email')->index(); + $table->string('token')->index(); + $table->timestamp('created_at'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + } +} diff --git a/database/migrations/2016_03_02_193043_add_ldap_flag_to_users.php b/database/migrations/2016_03_02_193043_add_ldap_flag_to_users.php new file mode 100644 index 0000000000..c7e6f2b9a7 --- /dev/null +++ b/database/migrations/2016_03_02_193043_add_ldap_flag_to_users.php @@ -0,0 +1,34 @@ +boolean('ldap_import')->default(0); + }); + + DB::table('users')->where('notes','LIKE','%LDAP%')->update(['ldap_import' => 1]); + + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('users', function ($table) { + $table->dropColumn('ldap_import'); + }); + } +} diff --git a/database/migrations/2016_03_02_220517_update_ldap_filter_to_longer_field.php b/database/migrations/2016_03_02_220517_update_ldap_filter_to_longer_field.php new file mode 100644 index 0000000000..57a1786dba --- /dev/null +++ b/database/migrations/2016_03_02_220517_update_ldap_filter_to_longer_field.php @@ -0,0 +1,29 @@ +text('ldap_filter')->default(NULL)->change(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + } +} diff --git a/database/migrations/2016_03_08_225351_create_components_table.php b/database/migrations/2016_03_08_225351_create_components_table.php new file mode 100644 index 0000000000..446285b014 --- /dev/null +++ b/database/migrations/2016_03_08_225351_create_components_table.php @@ -0,0 +1,68 @@ +increments('id'); + $table->string('name')->nullable()->default(NULL); + $table->integer('category_id')->nullable()->default(NULL); + $table->integer('location_id')->nullable()->default(NULL); + $table->integer('company_id')->nullable()->default(NULL); + $table->integer('user_id')->nullable()->default(NULL); + $table->integer('total_qty')->default(1); + $table->integer('order_number')->nullable()->default(NULL); + $table->date('purchase_date')->nullable()->default(NULL); + $table->decimal('purchase_cost', 13,4)->nullable()->default(NULL); + $table->timestamps(); + $table->softDeletes(); + $table->engine = 'InnoDB'; + }); + + Schema::table('asset_logs', function ($table) { + $table->integer('component_id')->nullable()->default(NULL); + }); + + Schema::create('components_assets', function ($table) { + $table->increments('id'); + $table->integer('user_id')->nullable()->default(NULL); + $table->integer('assigned_qty')->nullable()->default(1); + $table->integer('component_id')->nullable()->default(NULL); + $table->integer('asset_id')->nullable()->default(NULL); + $table->timestamps(); + }); + + + + } + + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + Schema::dropIfExists('components'); + Schema::dropIfExists('components_assets'); + + Schema::table('asset_logs', function ($table) { + $table->dropColumn('component_id'); + }); + + + } + +} diff --git a/database/migrations/2016_03_09_024038_add_min_stock_to_tables.php b/database/migrations/2016_03_09_024038_add_min_stock_to_tables.php new file mode 100644 index 0000000000..5fd8cc6e2e --- /dev/null +++ b/database/migrations/2016_03_09_024038_add_min_stock_to_tables.php @@ -0,0 +1,43 @@ +integer('min_amt')->nullable()->default(NULL); + }); + Schema::table('consumables', function (Blueprint $table) { + $table->integer('min_amt')->nullable()->default(NULL); + }); + Schema::table('components', function (Blueprint $table) { + $table->integer('min_amt')->nullable()->default(NULL); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('accessories', function ($table) { + $table->dropColumn('min_amt'); + }); + Schema::table('components', function ($table) { + $table->dropColumn('min_amt'); + }); + Schema::table('consumables', function ($table) { + $table->dropColumn('min_amt'); + }); + } +} diff --git a/database/migrations/2016_03_10_133849_add_locale_to_users.php b/database/migrations/2016_03_10_133849_add_locale_to_users.php new file mode 100644 index 0000000000..cf2d484dee --- /dev/null +++ b/database/migrations/2016_03_10_133849_add_locale_to_users.php @@ -0,0 +1,31 @@ +string('locale',5)->nullable()->default(config('app.locale')); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('users', function ($table) { + $table->dropColumn('locale'); + }); + } +} diff --git a/database/migrations/2016_03_10_135519_add_locale_to_settings.php b/database/migrations/2016_03_10_135519_add_locale_to_settings.php new file mode 100644 index 0000000000..58ade4724f --- /dev/null +++ b/database/migrations/2016_03_10_135519_add_locale_to_settings.php @@ -0,0 +1,31 @@ +string('locale',5)->nullable()->default(config('app.locale')); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('settings', function ($table) { + $table->dropColumn('locale'); + }); + } +} diff --git a/database/migrations/2016_03_11_185621_add_label_settings_to_settings.php b/database/migrations/2016_03_11_185621_add_label_settings_to_settings.php new file mode 100644 index 0000000000..ab85695cbd --- /dev/null +++ b/database/migrations/2016_03_11_185621_add_label_settings_to_settings.php @@ -0,0 +1,61 @@ +tinyInteger('labels_per_page')->default(30); + $table->decimal('labels_width', 6, 5)->default(2.625); + $table->decimal('labels_height', 6, 5)->default(1); + $table->decimal('labels_pmargin_left', 6, 5)->default(0.21975); + $table->decimal('labels_pmargin_right', 6, 5)->default(0.21975); + $table->decimal('labels_pmargin_top', 6, 5)->default(0.5); + $table->decimal('labels_pmargin_bottom', 6, 5)->default(0.5); + $table->decimal('labels_display_bgutter', 6, 5)->default(0.07); + $table->decimal('labels_display_sgutter', 6, 5)->default(0.05); + $table->tinyInteger('labels_fontsize')->default(9); + $table->decimal('labels_pagewidth', 7, 5)->default(8.5); + $table->decimal('labels_pageheight', 7, 5)->default(11); + $table->tinyInteger('labels_display_name')->default(0); + $table->tinyInteger('labels_display_serial')->default(1); + $table->tinyInteger('labels_display_tag')->default(1); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('settings', function ($table) { + $table->dropColumn( + 'labels_per_page', + 'labels_width', + 'labels_height', + 'labels_pmargin_left', + 'labels_pmargin_right', + 'labels_pmargin_top', + 'labels_pmargin_bottom', + 'labels_display_bgutter', + 'labels_display_sgutter', + 'labels_fontsize', + 'labels_pagewidth', + 'labels_pageheight', + 'labels_display_name', + 'labels_display_serial', + 'labels_display_tag' + ); + }); + } +} diff --git a/database/migrations/2016_03_22_125911_fix_custom_fields_regexes.php b/database/migrations/2016_03_22_125911_fix_custom_fields_regexes.php new file mode 100644 index 0000000000..e731a1b05e --- /dev/null +++ b/database/migrations/2016_03_22_125911_fix_custom_fields_regexes.php @@ -0,0 +1,48 @@ +format) { + + case '[a-zA-Z]*': + $custom_field->format='ALPHA'; + break; + + case '[0-9]*': + $custom_field->format='NUMERIC'; + break; + + case '([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])': + $custom_field->format='IP'; + break; + + //ANYTHING ELSE. + default: + $custom_field->format='regex:/^'.$custom_field->format."$/"; + } + $custom_field->save(); + } + + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + } +} diff --git a/database/seeds/.gitkeep b/database/seeds/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/database/seeds/AccessorySeeder.php b/database/seeds/AccessorySeeder.php new file mode 100644 index 0000000000..81dafb98a4 --- /dev/null +++ b/database/seeds/AccessorySeeder.php @@ -0,0 +1,12 @@ +create(); + } +} diff --git a/database/seeds/ActionlogSeeder.php b/database/seeds/ActionlogSeeder.php new file mode 100644 index 0000000000..1d01b438a1 --- /dev/null +++ b/database/seeds/ActionlogSeeder.php @@ -0,0 +1,12 @@ +create(); + } +} diff --git a/database/seeds/AssetModelSeeder.php b/database/seeds/AssetModelSeeder.php new file mode 100755 index 0000000000..90f40525a0 --- /dev/null +++ b/database/seeds/AssetModelSeeder.php @@ -0,0 +1,14 @@ +create(); + } + +} diff --git a/database/seeds/AssetSeeder.php b/database/seeds/AssetSeeder.php new file mode 100644 index 0000000000..dbaddcff03 --- /dev/null +++ b/database/seeds/AssetSeeder.php @@ -0,0 +1,17 @@ +create(); + + // factory(App\Models\Asset::class, 50)->create()->each(function($u) { + // $u->assetmodel()->save(factory(App\AssetModel::class)->make()); + // }); + } +} diff --git a/database/seeds/CategorySeeder.php b/database/seeds/CategorySeeder.php new file mode 100755 index 0000000000..b4d87424e3 --- /dev/null +++ b/database/seeds/CategorySeeder.php @@ -0,0 +1,16 @@ +create(); + factory(Category::class, 'accessory-category', 5)->create(); + factory(Category::class, 'consumable-category', 5)->create(); + factory(Category::class, 'component-category', 5)->create(); + } + +} diff --git a/database/seeds/ComponentSeeder.php b/database/seeds/ComponentSeeder.php new file mode 100644 index 0000000000..079e20c14d --- /dev/null +++ b/database/seeds/ComponentSeeder.php @@ -0,0 +1,13 @@ +truncate(); + factory(Component::class, 'component',10)->create(); + } +} diff --git a/database/seeds/ConsumableSeeder.php b/database/seeds/ConsumableSeeder.php new file mode 100644 index 0000000000..39947c3f4d --- /dev/null +++ b/database/seeds/ConsumableSeeder.php @@ -0,0 +1,12 @@ +create(); + } +} diff --git a/database/seeds/CustomFieldSeeder.php b/database/seeds/CustomFieldSeeder.php new file mode 100644 index 0000000000..f497b94065 --- /dev/null +++ b/database/seeds/CustomFieldSeeder.php @@ -0,0 +1,13 @@ +call(AssetModelSeeder::class); + $this->call(AccessorySeeder::class); + $this->call(AssetSeeder::class); + $this->call(ConsumableSeeder::class); + $this->call(StatuslabelSeeder::class); + $this->call(SupplierSeeder::class); + $this->call(CategorySeeder::class); + $this->call(LicenseSeeder::class); + $this->call(ActionlogSeeder::class); + $this->call(DepreciationSeeder::class); + $this->call(ManufacturerSeeder::class); + $this->call(LocationSeeder::class); + $this->call(CustomFieldSeeder::class); + $this->call(ComponentSeeder::class); + + Model::reguard(); + } +} diff --git a/database/seeds/DepreciationSeeder.php b/database/seeds/DepreciationSeeder.php new file mode 100644 index 0000000000..ac567cd692 --- /dev/null +++ b/database/seeds/DepreciationSeeder.php @@ -0,0 +1,12 @@ +create(); + } +} diff --git a/database/seeds/LicenseSeeder.php b/database/seeds/LicenseSeeder.php new file mode 100644 index 0000000000..a3c5c702ab --- /dev/null +++ b/database/seeds/LicenseSeeder.php @@ -0,0 +1,21 @@ +create(); + + LicenseSeat::truncate(); + factory(LicenseSeat::class, 'license-seat', 10)->create(); + + // factory(App\Models\Asset::class, 50)->create()->each(function($u) { + // $u->assetmodel()->save(factory(App\AssetModel::class)->make()); + // }); + } +} diff --git a/database/seeds/LocationSeeder.php b/database/seeds/LocationSeeder.php new file mode 100644 index 0000000000..fd0d3b2ed2 --- /dev/null +++ b/database/seeds/LocationSeeder.php @@ -0,0 +1,14 @@ +create(); + + } +} diff --git a/database/seeds/ManufacturerSeeder.php b/database/seeds/ManufacturerSeeder.php new file mode 100644 index 0000000000..73388ca018 --- /dev/null +++ b/database/seeds/ManufacturerSeeder.php @@ -0,0 +1,13 @@ +create(); + } + +} diff --git a/database/seeds/StatuslabelSeeder.php b/database/seeds/StatuslabelSeeder.php new file mode 100755 index 0000000000..ac9731504c --- /dev/null +++ b/database/seeds/StatuslabelSeeder.php @@ -0,0 +1,20 @@ +create(); + factory(Statuslabel::class, 'pending')->create(); + factory(Statuslabel::class, 'archived')->create(); + factory(Statuslabel::class, 'out_for_diagnostics')->create(); + factory(Statuslabel::class, 'out_for_repair')->create(); + factory(Statuslabel::class, 'broken')->create(); + factory(Statuslabel::class, 'lost')->create(); + } + +} diff --git a/database/seeds/SupplierSeeder.php b/database/seeds/SupplierSeeder.php new file mode 100644 index 0000000000..ea56bd09f7 --- /dev/null +++ b/database/seeds/SupplierSeeder.php @@ -0,0 +1,13 @@ +create(); + } + +} diff --git a/docker.env b/docker.env new file mode 100644 index 0000000000..67c9b37d70 --- /dev/null +++ b/docker.env @@ -0,0 +1,20 @@ +# Docker Environment File + +#Database Variables +MYSQL_DATABASE=snipeit +MYSQL_USER=snipeit +MYSQL_PASSWORD=tinglewingler + +#Email Variables +MAIL_PORT_587_TCP_ADDR=smtp.mandrillapp.com +MAIL_PORT_587_TCP_PORT=587 +MAIL_ENV_FROM_ADDR=uberbrady@gmail.com +MAIL_ENV_FROM_NAME=Brady Wetherington +MAIL_ENV_ENCRYPTION=tcp +MAIL_ENV_USERNAME=uberbrady@gmail.com +MAIL_ENV_PASSWORD=N7AqLufTZMULWHWYwJ0ZCw + +#SNIPE-IT Variables +SNIPEIT_TIMEZONE=America/Los_Angeles +SNIPEIT_LOCALE=es-ES +SERVER_URL=https://192.168.99.100:32775 diff --git a/docker/000-default.conf b/docker/000-default.conf new file mode 100644 index 0000000000..290df69d26 --- /dev/null +++ b/docker/000-default.conf @@ -0,0 +1,41 @@ + + # The ServerName directive sets the request scheme, hostname and port that + # the server uses to identify itself. This is used when creating + # redirection URLs. In the context of virtual hosts, the ServerName + # specifies what hostname must appear in the request's Host: header to + # match this virtual host. For the default virtual host (this file) this + # value is not decisive as it is used as a last resort host regardless. + # However, you must set it for any further virtual host explicitly. + #ServerName www.example.com + + ServerAdmin webmaster@localhost + + DocumentRoot "/var/www/html/public" + DirectoryIndex index.php index.html + # php_value include_path "/var/www/html/include" + + Options All +MultiViews -ExecCGI -Indexes + + DAV Off + + AllowOverride All + + LogLevel warn + # Available loglevels: trace8, ..., trace1, debug, info, notice, warn, + # error, crit, alert, emerg. + # It is also possible to configure the loglevel for particular + # modules, e.g. + #LogLevel info ssl:warn + + ErrorLog ${APACHE_LOG_DIR}/error.log + CustomLog ${APACHE_LOG_DIR}/access.log combined + + # For most configuration files from conf-available/, which are + # enabled or disabled at a global level, it is possible to + # include a line for only one particular virtual host. For example the + # following line enables the CGI configuration for this host only + # after it has been globally disabled with "a2disconf". + #Include conf-available/serve-cgi-bin.conf + + +# vim: syntax=apache ts=4 sw=4 sts=4 sr noet diff --git a/docker/001-default-ssl.conf b/docker/001-default-ssl.conf new file mode 100644 index 0000000000..ed3f60bfda --- /dev/null +++ b/docker/001-default-ssl.conf @@ -0,0 +1,145 @@ + + + ServerAdmin webmaster@localhost + + DocumentRoot "/var/www/html/public" + DirectoryIndex index.php index.html + + Options All +MultiViews -ExecCGI -Indexes + + DAV Off + + AllowOverride All + + + # Available loglevels: trace8, ..., trace1, debug, info, notice, warn, + # error, crit, alert, emerg. + # It is also possible to configure the loglevel for particular + # modules, e.g. + #LogLevel info ssl:warn + + ErrorLog ${APACHE_LOG_DIR}/error.log + CustomLog ${APACHE_LOG_DIR}/access.log combined + + # For most configuration files from conf-available/, which are + # enabled or disabled at a global level, it is possible to + # include a line for only one particular virtual host. For example the + # following line enables the CGI configuration for this host only + # after it has been globally disabled with "a2disconf". + #Include conf-available/serve-cgi-bin.conf + + # SSL Engine Switch: + # Enable/Disable SSL for this virtual host. + SSLEngine on + + # A self-signed (snakeoil) certificate can be created by installing + # the ssl-cert package. See + # /usr/share/doc/apache2/README.Debian.gz for more info. + # If both key and certificate are stored in the same file, only the + # SSLCertificateFile directive is needed. + #SSLCertificateFile /etc/ssl/private/ssl-cert-snakeoil.crt + SSLCertificateFile /etc/ssl/private/snipeit-ssl.crt + #SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key + SSLCertificateKeyFile /etc/ssl/private/snipeit-ssl.key + + # Server Certificate Chain: + # Point SSLCertificateChainFile at a file containing the + # concatenation of PEM encoded CA certificates which form the + # certificate chain for the server certificate. Alternatively + # the referenced file can be the same as SSLCertificateFile + # when the CA certificates are directly appended to the server + # certificate for convinience. + #SSLCertificateChainFile /etc/apache2/ssl.crt/server-ca.crt + SSLCertificateChainFile /etc/ssl/private/snipeit-ssl.crt + + # Certificate Authority (CA): + # Set the CA certificate verification path where to find CA + # certificates for client authentication or alternatively one + # huge file containing all of them (file must be PEM encoded) + # Note: Inside SSLCACertificatePath you need hash symlinks + # to point to the certificate files. Use the provided + # Makefile to update the hash symlinks after changes. + #SSLCACertificatePath /etc/ssl/certs/ + #SSLCACertificateFile /etc/apache2/ssl.crt/ca-bundle.crt + + # Certificate Revocation Lists (CRL): + # Set the CA revocation path where to find CA CRLs for client + # authentication or alternatively one huge file containing all + # of them (file must be PEM encoded) + # Note: Inside SSLCARevocationPath you need hash symlinks + # to point to the certificate files. Use the provided + # Makefile to update the hash symlinks after changes. + #SSLCARevocationPath /etc/apache2/ssl.crl/ + #SSLCARevocationFile /etc/apache2/ssl.crl/ca-bundle.crl + + # Client Authentication (Type): + # Client certificate verification type and depth. Types are + # none, optional, require and optional_no_ca. Depth is a + # number which specifies how deeply to verify the certificate + # issuer chain before deciding the certificate is not valid. + #SSLVerifyClient require + #SSLVerifyDepth 10 + + # SSL Engine Options: + # Set various options for the SSL engine. + # o FakeBasicAuth: + # Translate the client X.509 into a Basic Authorisation. This means that + # the standard Auth/DBMAuth methods can be used for access control. The + # user name is the `one line' version of the client's X.509 certificate. + # Note that no password is obtained from the user. Every entry in the user + # file needs this password: `xxj31ZMTZzkVA'. + # o ExportCertData: + # This exports two additional environment variables: SSL_CLIENT_CERT and + # SSL_SERVER_CERT. These contain the PEM-encoded certificates of the + # server (always existing) and the client (only existing when client + # authentication is used). This can be used to import the certificates + # into CGI scripts. + # o StdEnvVars: + # This exports the standard SSL/TLS related `SSL_*' environment variables. + # Per default this exportation is switched off for performance reasons, + # because the extraction step is an expensive operation and is usually + # useless for serving static content. So one usually enables the + # exportation for CGI and SSI requests only. + # o OptRenegotiate: + # This enables optimized SSL connection renegotiation handling when SSL + # directives are used in per-directory context. + #SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire + + SSLOptions +StdEnvVars + + + SSLOptions +StdEnvVars + + + # SSL Protocol Adjustments: + # The safe and default but still SSL/TLS standard compliant shutdown + # approach is that mod_ssl sends the close notify alert but doesn't wait for + # the close notify alert from client. When you need a different shutdown + # approach you can use one of the following variables: + # o ssl-unclean-shutdown: + # This forces an unclean shutdown when the connection is closed, i.e. no + # SSL close notify alert is send or allowed to received. This violates + # the SSL/TLS standard but is needed for some brain-dead browsers. Use + # this when you receive I/O errors because of the standard approach where + # mod_ssl sends the close notify alert. + # o ssl-accurate-shutdown: + # This forces an accurate shutdown when the connection is closed, i.e. a + # SSL close notify alert is send and mod_ssl waits for the close notify + # alert of the client. This is 100% SSL/TLS standard compliant, but in + # practice often causes hanging connections with brain-dead browsers. Use + # this only for browsers where you know that their SSL implementation + # works correctly. + # Notice: Most problems of broken clients are also related to the HTTP + # keep-alive facility, so you usually additionally want to disable + # keep-alive for those clients, too. Use variable "nokeepalive" for this. + # Similarly, one has to force some clients to use HTTP/1.0 to workaround + # their broken HTTP/1.1 implementation. Use variables "downgrade-1.0" and + # "force-response-1.0" for this. + BrowserMatch "MSIE [2-6]" \ + nokeepalive ssl-unclean-shutdown \ + downgrade-1.0 force-response-1.0 + # MSIE 7 and newer should be able to use keepalive + BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown + + + diff --git a/docker/README.md b/docker/README.md new file mode 100644 index 0000000000..1e4436b7e9 --- /dev/null +++ b/docker/README.md @@ -0,0 +1 @@ +See http://docs.snipeitapp.com/installation/server/docker.html for Docker information diff --git a/docker/app.php b/docker/app.php new file mode 100644 index 0000000000..529ed6c85a --- /dev/null +++ b/docker/app.php @@ -0,0 +1,49 @@ + false, + + 'timezone' => isset($_ENV['SNIPEIT_TIMEZONE']) ? $_ENV['SNIPEIT_TIMEZONE'] : 'UTC', + 'locale' => isset($_ENV['SNIPEIT_LOCALE']) ? $_ENV['SNIPEIT_LOCALE'] : 'en', + + + /* + |-------------------------------------------------------------------------- + | Application URL + |-------------------------------------------------------------------------- + | + | This URL is used by the console to properly generate URLs when using + | the Artisan command line tool. You should set this to the root of + | your application so that it is used when running Artisan tasks. + | + */ + + 'url' => isset($_ENV['SERVER_URL']) ? $_ENV['SERVER_URL'] : 'https://production.yourserver.com', + + /* + |-------------------------------------------------------------------------- + | Encryption Key + |-------------------------------------------------------------------------- + | + | This key is used by the Illuminate encrypter service and should be set + | to a random, 32 character string, otherwise these encrypted strings + | will not be safe. Please do this before deploying an application! + | + | Run a php artisan key:generate --env=staging to create a random one + */ + + 'key' => 'Change_this_key_or_snipe_will_get_ya', + +); diff --git a/docker/app_install.exp b/docker/app_install.exp new file mode 100644 index 0000000000..956969086c --- /dev/null +++ b/docker/app_install.exp @@ -0,0 +1,77 @@ +#!/usr/bin/expect -f +# +# This Expect script was generated by autoexpect on Mon Feb 16 23:58:34 2015 +# Expect and autoexpect were both written by Don Libes, NIST. +# +# Note that autoexpect does not guarantee a working script. It +# necessarily has to guess about certain things. Two reasons a script +# might fail are: +# +# 1) timing - A surprising number of programs (rn, ksh, zsh, telnet, +# etc.) and devices discard or ignore keystrokes that arrive "too +# quickly" after prompts. If you find your new script hanging up at +# one spot, try adding a short sleep just before the previous send. +# Setting "force_conservative" to 1 (see below) makes Expect do this +# automatically - pausing briefly before sending each character. This +# pacifies every program I know of. The -c flag makes the script do +# this in the first place. The -C flag allows you to define a +# character to toggle this mode off and on. + +set force_conservative 0 ;# set to 1 to force conservative mode even if + ;# script wasn't run conservatively originally +if {$force_conservative} { + set send_slow {1 .1} + proc send {ignore arg} { + sleep .1 + exp_send -s -- $arg + } +} + +# +# 2) differing output - Some programs produce different output each time +# they run. The "date" command is an obvious example. Another is +# ftp, if it produces throughput statistics at the end of a file +# transfer. If this causes a problem, delete these patterns or replace +# them with wildcards. An alternative is to use the -p flag (for +# "prompt") which makes Expect only look for the last line of output +# (i.e., the prompt). The -P flag allows you to define a character to +# toggle this mode off and on. +# +# Read the man page for more info. +# +# -Don + + +set timeout -1 +spawn php artisan app:install --no-ansi +match_max 100000 +expect -exact "=====================================\r +\r + Step: 1\r +\r + Please follow the following\r + instructions to create your\r + default user.\r +\r +-------------------------------------\r +\r +Please enter your first name: " +send -- "Sample\r" +expect -exact "Sample\r +Please enter your last name: " +send -- "User\r" +expect -exact "User\r +Please enter your username: " +send -- "snipeitadmin" +expect -exact "snipeitadmin" +send -- "\r" +Please enter your email: " +send -- "snipeit@example.com" +expect -exact "snipeit@example.com" +send -- "\r" +expect -exact "\r +Please enter your user password (at least 8 characters): " +send -- "example1" +expect -exact "example1" +send -- "\r" +expect eof diff --git a/docker/database.php b/docker/database.php new file mode 100755 index 0000000000..f2b0f92a30 --- /dev/null +++ b/docker/database.php @@ -0,0 +1,125 @@ + PDO::FETCH_CLASS, + + /* + |-------------------------------------------------------------------------- + | Default Database Connection Name + |-------------------------------------------------------------------------- + | + | Here you may specify which of the database connections below you wish + | to use as your default connection for all database work. Of course + | you may use many connections at once using the Database library. + | + */ + + 'default' => 'mysql', + + /* + |-------------------------------------------------------------------------- + | Database Connections + |-------------------------------------------------------------------------- + | + | Here are each of the database connections setup for your application. + | Of course, examples of configuring each database platform that is + | supported by Laravel is shown below to make development simple. + | + | + | All database work in Laravel is done through the PHP PDO facilities + | so make sure you have the driver for your particular database of + | choice installed on your machine before you begin development. + | + */ + + 'connections' => array( + + 'sqlite' => array( + 'driver' => 'sqlite', + 'database' => __DIR__.'/../database/production.sqlite', + 'prefix' => '', + ), + + 'mysql' => array( + 'driver' => 'mysql', + 'host' => $_ENV['MYSQL_PORT_3306_TCP_ADDR'], + 'port' => $_ENV['MYSQL_PORT_3306_TCP_PORT'], + 'database' => $_ENV['MYSQL_ENV_MYSQL_DATABASE'], + 'username' => $_ENV['MYSQL_ENV_MYSQL_USER'], + 'password' => $_ENV['MYSQL_ENV_MYSQL_PASSWORD'], + 'charset' => 'utf8', + 'collation' => 'utf8_unicode_ci', + 'prefix' => '', + ), + + 'pgsql' => array( + 'driver' => 'pgsql', + 'host' => 'localhost', + 'database' => 'database', + 'username' => 'root', + 'password' => '', + 'charset' => 'utf8', + 'prefix' => '', + 'schema' => 'public', + ), + + 'sqlsrv' => array( + 'driver' => 'sqlsrv', + 'host' => 'localhost', + 'database' => 'database', + 'username' => 'root', + 'password' => '', + 'prefix' => '', + ), + + ), + + /* + |-------------------------------------------------------------------------- + | Migration Repository Table + |-------------------------------------------------------------------------- + | + | This table keeps track of all the migrations that have already run for + | your application. Using this information, we can determine which of + | the migrations on disk have not actually be run in the databases. + | + */ + + 'migrations' => 'migrations', + + /* + |-------------------------------------------------------------------------- + | Redis Databases + |-------------------------------------------------------------------------- + | + | Redis is an open source, fast, and advanced key-value store that also + | provides a richer set of commands than a typical key-value systems + | such as APC or Memcached. Laravel makes it easy to dig right in. + | + */ + + 'redis' => array( + + 'cluster' => true, + + 'default' => array( + 'host' => '127.0.0.1', + 'port' => 6379, + 'database' => 0, + ), + + ), + +); diff --git a/docker/develop.sh b/docker/develop.sh new file mode 100644 index 0000000000..bf550ea1a6 --- /dev/null +++ b/docker/develop.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +#docker run -v docker start mysql +# docker run --name snipe-mysql -e MYSQL_ROOT_PASSWORD=fartwingus -e MYSQL_DATABASE=snipeit -e MYSQL_USER=snipeit -e MYSQL_PASSWORD=whateverdood -d mysql +docker run -d snipe-mysql +docker run -d -v ~/Documents/snipeyhead/snipe-it/:/var/www/html -p $(boot2docker ip)::80 --link snipe-mysql:mysql --name=snipeit snipeit diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh new file mode 100644 index 0000000000..014d759817 --- /dev/null +++ b/docker/entrypoint.sh @@ -0,0 +1,19 @@ +#!/bin/sh +cd /var/www/html + +# fix key if needed +if grep -q Change_this_key_or_snipe_will_get_ya app/config/production/app.php +then + MYSQL_PORT_3306_TCP_ADDR='' MYSQL_PORT_3306_TCP_PORT='' MYSQL_ENV_MYSQL_DATABASE='' \ + MYSQL_ENV_MYSQL_USER='' MYSQL_ENV_MYSQL_PASSWORD='' php artisan --env=production -n key:generate +fi + +if [ -f /etc/ssl/private/snipeit-ssl.crt -a -f /etc/ssl/private/snipeit-ssl.key ] +then + a2enmod ssl +else + a2dismod ssl +fi + +. /etc/apache2/envvars +exec apache2 -DNO_DETACH < /dev/null diff --git a/docker/ldap.php b/docker/ldap.php new file mode 100644 index 0000000000..90850a761d --- /dev/null +++ b/docker/ldap.php @@ -0,0 +1,112 @@ + isset($_ENV['LDAP_URL']) ? $_ENV['LDAP_URL'] : "", + + + /* + |-------------------------------------------------------------------------- + | Username + |-------------------------------------------------------------------------- + | + | Username to use to connect authenticate to LDAP, for example: + | cn=read-only-admin,dc=example,dc=com + | + */ + 'username' => isset($_ENV['LDAP_USERNAME']) ? $_ENV['LDAP_USERNAME'] : "", + + /* + |-------------------------------------------------------------------------- + | Password + |-------------------------------------------------------------------------- + | + | Password to use when authenticating to LDAP. + | + */ + 'password' => isset($_ENV['LDAP_PASSWORD']) ? $_ENV['LDAP_PASSWORD'] : "", + + /* + |-------------------------------------------------------------------------- + | Basedn + |-------------------------------------------------------------------------- + | + | The base where the search for users will be executed, for example: + | dc=example,dc=com + | + */ + 'basedn' => isset($_ENV['LDAP_BASEDN']) ? $_ENV['LDAP_BASEDN'] : "", + + + /* + |-------------------------------------------------------------------------- + | Filter + |-------------------------------------------------------------------------- + | + | The search filter for the LDAP query. This probably does not have to be + | changed. + | + */ + 'filter' => isset($_ENV['LDAP_FILTER']) ? $_ENV['LDAP_FILTER'] : "&(cn=*)", + + + /* + |-------------------------------------------------------------------------- + | LDAP field names that will be retrieved to create a user. + | + | Using the username as an example: + | If I set 'result.username' => 'my-org-username', the code will connect to + | LDAP as follows (where $results[$i] represents a row in the LDAP query: + | $username-to-insert-in-snipe-it = $results[$i]["my-org-username"][0] + | + | Note: all these fields are required. + |-------------------------------------------------------------------------- + | + | The search filter for the LDAP query. + | + */ + 'result.username' => isset($_ENV['LDAP_RESULT_USERNAME']) ? $_ENV['LDAP_RESULT_USERNAME'] : "", + 'result.last.name' => isset($_ENV['LDAP_RESULT_LAST_NAME']) ? $_ENV['LDAP_RESULT_LAST_NAME'] : "", + 'result.first.name' => isset($_ENV['LDAP_RESULT_FIRST_NAME']) ? $_ENV['LDAP_RESULT_FIRST_NAME'] : "", + + /* + | These fields are optional as not all LDAP directories will have it. If yours + | does not have them, just leave these blank and the extra check will + | be omitted. + */ + 'result.active.flag' => isset($_ENV['LDAP_RESULT_ACTIVE_FLAG']) ? $_ENV['LDAP_RESULT_ACTIVE_FLAG'] : "", + 'result.emp.num' => isset($_ENV['LDAP_RESULT_EMP_NUM']) ? $_ENV['LDAP_RESULT_EMP_NUM'] : "", + 'result.email' => isset($_ENV['LDAP_RESULT_EMAIL']) ? $_ENV['LDAP_RESULT_EMAIL'] : "", + + /* + |-------------------------------------------------------------------------- + | LDAP filter query for authentication + |-------------------------------------------------------------------------- + | + | The LDAP query that we want to execute when authenticating a user. This + | should not have to be changed. + | + */ + 'authentication.filter.query' => isset($_ENV['LDAP_AUTHENTICATION_FILTER_QUERY']) ? $_ENV['LDAP_AUTHENTICATION_FILTER_QUERY'] : "uid=", + + /* + |-------------------------------------------------------------------------- + | LDAP Version + |-------------------------------------------------------------------------- + | + | Version of LDAP you are using. + | + */ + 'version' => 3, + + +); diff --git a/docker/mail.php b/docker/mail.php new file mode 100755 index 0000000000..676ced1733 --- /dev/null +++ b/docker/mail.php @@ -0,0 +1,124 @@ + 'smtp', + + /* + |-------------------------------------------------------------------------- + | SMTP Host Address + |-------------------------------------------------------------------------- + | + | Here you may provide the host address of the SMTP server used by your + | applications. A default option is provided that is compatible with + | the Postmark mail service, which will provide reliable delivery. + | + */ + + 'host' => $_ENV['MAIL_PORT_587_TCP_ADDR'], + + /* + |-------------------------------------------------------------------------- + | SMTP Host Port + |-------------------------------------------------------------------------- + | + | This is the SMTP port used by your application to delivery e-mails to + | users of your application. Like the host we have set this value to + | stay compatible with the Postmark e-mail application by default. + | + */ + + 'port' => $_ENV['MAIL_PORT_587_TCP_PORT'], + + /* + |-------------------------------------------------------------------------- + | Global "From" Address + |-------------------------------------------------------------------------- + | + | You may wish for all e-mails sent by your application to be sent from + | the same address. Here, you may specify a name and address that is + | used globally for all e-mails that are sent by your application. + | + */ + + 'from' => array('address' => $_ENV['MAIL_ENV_FROM_ADDR'], 'name' => $_ENV['MAIL_ENV_FROM_NAME']), + + /* + |-------------------------------------------------------------------------- + | E-Mail Encryption Protocol + |-------------------------------------------------------------------------- + | + | Here you may specify the encryption protocol that should be used when + | the application send e-mail messages. A sensible default using the + | transport layer security protocol should provide great security. + | + */ + + 'encryption' => $_ENV['MAIL_ENV_ENCRYPTION'], //'tls' commonly + + /* + |-------------------------------------------------------------------------- + | SMTP Server Username + |-------------------------------------------------------------------------- + | + | If your SMTP server requires a username for authentication, you should + | set it here. This will get used to authenticate with your server on + | connection. You may also set the "password" value below this one. + | + */ + + 'username' => $_ENV['MAIL_ENV_USERNAME'], + + /* + |-------------------------------------------------------------------------- + | SMTP Server Password + |-------------------------------------------------------------------------- + | + | Here you may set the password required by your SMTP server to send out + | messages from your application. This will be given to the server on + | connection so that the application will be able to send messages. + | + */ + + 'password' => $_ENV['MAIL_ENV_PASSWORD'], + + /* + |-------------------------------------------------------------------------- + | Sendmail System Path + |-------------------------------------------------------------------------- + | + | When using the "sendmail" driver to send e-mails, we will need to know + | the path to where Sendmail lives on this server. A default path has + | been provided here, which will work well on most of your systems. + | + */ + + 'sendmail' => '/usr/sbin/sendmail -bs', + + /* + |-------------------------------------------------------------------------- + | Mail "Pretend" + |-------------------------------------------------------------------------- + | + | When this option is enabled, e-mail will not actually be sent over the + | web and will instead be written to your application's logs files so + | you may inspect the message. This is great for local development. + | + */ + + 'pretend' => false, + +); diff --git a/gh-changelog.php b/gh-changelog.php new file mode 100644 index 0000000000..8ca2fd26e9 --- /dev/null +++ b/gh-changelog.php @@ -0,0 +1,61 @@ +view •'; + $gitlog .= ' %s \' --reverse | grep -i -E '.escapeshellarg($string).' '; + + if ($omit!=''){ + $gitlog .= ' | grep -i -E -v '.escapeshellarg($omit).''; + } + + $gitlog .= '>> '.escapeshellarg($file); + exec($gitlog); +} diff --git a/gulpfile.js b/gulpfile.js new file mode 100644 index 0000000000..2bc03246ff --- /dev/null +++ b/gulpfile.js @@ -0,0 +1,30 @@ +var elixir = require('laravel-elixir'); +require('laravel-elixir-codeception'); +/* + |-------------------------------------------------------------------------- + | Elixir Asset Management + |-------------------------------------------------------------------------- + | + | Elixir provides a clean, fluent API for defining some basic Gulp tasks + | for your Laravel application. By default, we are compiling the Sass + | file for our application, as well as publishing vendor resources. + | + */ + +elixir(function(mix) { + //mix.sass(['app.scss','bootstrap-overrides.scss'],'public/assets/css'); + mix.less(['overrides.less'],'public/assets/css'); + mix.version('assets/css/app.css'); + + mix.scripts([ + 'snipeit.js', + 'app.js' + + ],'public/assets/js'); + + + // mix.codeception(); + + + +}); diff --git a/index.html b/index.html new file mode 100644 index 0000000000..1baa9773c5 --- /dev/null +++ b/index.html @@ -0,0 +1,55 @@ + + + + + Snipe-IT Setup + + + + + + + + + + + +
    +
    +
    +

    D'oh. If you're seeing this, your DocumentRoot is set incorrectly. It should be set to the public directory. +

    +
    +
    + + + diff --git a/install.sh b/install.sh new file mode 100755 index 0000000000..8bc20705a9 --- /dev/null +++ b/install.sh @@ -0,0 +1,7 @@ +# ensure running as root +if [ "$(id -u)" != "0" ]; then + exec sudo "$0" "$@" +fi +wget https://raw.githubusercontent.com/snipe/snipe-it/master/snipeit.sh +chmod 744 snipeit.sh +sudo ./snipeit.sh 2>&1 | sudo tee -a /var/log/snipeit-install.log diff --git a/phpunit.xml b/phpunit.xml new file mode 100644 index 0000000000..cc0841c1d3 --- /dev/null +++ b/phpunit.xml @@ -0,0 +1,27 @@ + + + + + ./tests/ + + + + + app/ + + + + + + + + + diff --git a/public/.htaccess b/public/.htaccess new file mode 100644 index 0000000000..eafa69a6e6 --- /dev/null +++ b/public/.htaccess @@ -0,0 +1,24 @@ + + + Options -MultiViews + + + RewriteEngine On + + # Uncomment these two lines to force SSL redirect + # RewriteCond %{HTTPS} off + # RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] + + # Redirect Trailing Slashes If Not A Folder... + RewriteCond %{REQUEST_FILENAME} !-d + RewriteRule ^(.*)/$ /$1 [L,R=301] + + # Handle Front Controller... + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_FILENAME} !-f + RewriteRule ^ index.php [L] + + # Handle Authorization Header + RewriteCond %{HTTP:Authorization} . + RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] + diff --git a/public/_debugbar/assets/jquery.min.map b/public/_debugbar/assets/jquery.min.map new file mode 100644 index 0000000000..e69de29bb2 diff --git a/public/assets/compiled/css/app.css b/public/assets/compiled/css/app.css new file mode 100644 index 0000000000..a921dcb393 --- /dev/null +++ b/public/assets/compiled/css/app.css @@ -0,0 +1,5916 @@ +@charset "UTF-8"; +@import url(https://fonts.googleapis.com/css?family=Lato); +/*! + * 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; + -ms-text-size-adjust: 100%; + -webkit-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 { + font-size: 2em; + margin: 0.67em 0; } + +mark { + background: #ff0; + color: #000; } + +small { + font-size: 80%; } + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; } + +sup { + top: -0.5em; } + +sub { + bottom: -0.25em; } + +img { + border: 0; } + +svg:not(:root) { + overflow: hidden; } + +figure { + margin: 1em 40px; } + +hr { + box-sizing: content-box; + height: 0; } + +pre { + overflow: auto; } + +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; } + +button, +input, +optgroup, +select, +textarea { + color: inherit; + font: inherit; + margin: 0; } + +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 { + border: 0; + padding: 0; } + +input { + line-height: normal; } + +input[type="checkbox"], +input[type="radio"] { + 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-appearance: textfield; + box-sizing: content-box; } + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; } + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; } + +legend { + border: 0; + padding: 0; } + +textarea { + overflow: auto; } + +optgroup { + font-weight: bold; } + +table { + border-collapse: collapse; + border-spacing: 0; } + +td, +th { + padding: 0; } + +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ +@media print { + *, + *:before, + *:after { + background: transparent !important; + color: #000 !important; + box-shadow: none !important; + text-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/bootstrap/glyphicons-halflings-regular.eot"); + src: url("../fonts/bootstrap/glyphicons-halflings-regular.eot?#iefix") format("embedded-opentype"), url("../fonts/bootstrap/glyphicons-halflings-regular.woff2") format("woff2"), url("../fonts/bootstrap/glyphicons-halflings-regular.woff") format("woff"), url("../fonts/bootstrap/glyphicons-halflings-regular.ttf") format("truetype"), url("../fonts/bootstrap/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"; } + +* { + box-sizing: border-box; } + +*:before, +*:after { + box-sizing: border-box; } + +html { + font-size: 10px; + -webkit-tap-highlight-color: transparent; } + +body { + font-family: "Lato", sans-serif; + font-size: 14px; + line-height: 1.428571429; + color: #333333; + 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 { + display: block; + max-width: 100%; + height: auto; } + +.img-rounded { + border-radius: 6px; } + +.img-thumbnail { + padding: 4px; + line-height: 1.428571429; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + transition: all 0.2s ease-in-out; + display: inline-block; + max-width: 100%; + height: auto; } + +.img-circle { + border-radius: 50%; } + +hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eeeeee; } + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + 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: normal; + line-height: 1; + color: #777777; } + +h1, .h1, +h2, .h2, +h3, .h3 { + margin-top: 20px; + margin-bottom: 10px; } + h1 small, + h1 .small, .h1 small, + .h1 .small, + h2 small, + h2 .small, .h2 small, + .h2 .small, + h3 small, + h3 .small, .h3 small, + .h3 .small { + font-size: 65%; } + +h4, .h4, +h5, .h5, +h6, .h6 { + margin-top: 10px; + margin-bottom: 10px; } + h4 small, + h4 .small, .h4 small, + .h4 .small, + h5 small, + h5 .small, .h5 small, + .h5 .small, + h6 small, + h6 .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 { + background-color: #fcf8e3; + padding: .2em; } + +.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, .initialism { + text-transform: uppercase; } + +.text-capitalize { + text-transform: capitalize; } + +.text-muted { + color: #777777; } + +.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; } + +.bg-primary { + 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 #eeeeee; } + +ul, +ol { + margin-top: 0; + margin-bottom: 10px; } + ul ul, + ul ol, + ol ul, + ol ol { + margin-bottom: 0; } + +.list-unstyled { + padding-left: 0; + list-style: none; } + +.list-inline { + padding-left: 0; + list-style: none; + margin-left: -5px; } + .list-inline > li { + display: inline-block; + padding-left: 5px; + padding-right: 5px; } + +dl { + margin-top: 0; + margin-bottom: 20px; } + +dt, +dd { + line-height: 1.428571429; } + +dt { + font-weight: bold; } + +dd { + margin-left: 0; } + +.dl-horizontal dd:before, .dl-horizontal dd:after { + content: " "; + display: table; } + +.dl-horizontal dd:after { + clear: both; } + +@media (min-width: 768px) { + .dl-horizontal dt { + float: left; + width: 160px; + clear: left; + text-align: right; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } + .dl-horizontal dd { + margin-left: 180px; } } + +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #777777; } + +.initialism { + font-size: 90%; } + +blockquote { + padding: 10px 20px; + margin: 0 0 20px; + font-size: 17.5px; + border-left: 5px solid #eeeeee; } + 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.428571429; + color: #777777; } + blockquote footer:before, + blockquote small:before, + blockquote .small:before { + content: '\2014 \00A0'; } + +.blockquote-reverse, +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #eeeeee; + border-left: 0; + text-align: right; } + .blockquote-reverse footer:before, + .blockquote-reverse small:before, + .blockquote-reverse .small:before, + blockquote.pull-right footer:before, + blockquote.pull-right small:before, + blockquote.pull-right .small:before { + content: ''; } + .blockquote-reverse footer:after, + .blockquote-reverse small:after, + .blockquote-reverse .small:after, + blockquote.pull-right footer:after, + blockquote.pull-right small:after, + blockquote.pull-right .small:after { + content: '\00A0 \2014'; } + +address { + margin-bottom: 20px; + font-style: normal; + line-height: 1.428571429; } + +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; + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); } + kbd kbd { + padding: 0; + font-size: 100%; + font-weight: bold; + box-shadow: none; } + +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.428571429; + word-break: break-all; + word-wrap: break-word; + color: #333333; + 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 { + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; } + .container:before, .container:after { + content: " "; + display: table; } + .container:after { + clear: both; } + @media (min-width: 768px) { + .container { + width: 750px; } } + @media (min-width: 992px) { + .container { + width: 970px; } } + @media (min-width: 1200px) { + .container { + width: 1170px; } } + +.container-fluid { + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; } + .container-fluid:before, .container-fluid:after { + content: " "; + display: table; } + .container-fluid:after { + clear: both; } + +.row { + margin-left: -15px; + margin-right: -15px; } + .row:before, .row:after { + content: " "; + display: table; } + .row:after { + clear: both; } + +.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-left: 15px; + padding-right: 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-1 { + width: 8.3333333333%; } + +.col-xs-2 { + width: 16.6666666667%; } + +.col-xs-3 { + width: 25%; } + +.col-xs-4 { + width: 33.3333333333%; } + +.col-xs-5 { + width: 41.6666666667%; } + +.col-xs-6 { + width: 50%; } + +.col-xs-7 { + width: 58.3333333333%; } + +.col-xs-8 { + width: 66.6666666667%; } + +.col-xs-9 { + width: 75%; } + +.col-xs-10 { + width: 83.3333333333%; } + +.col-xs-11 { + width: 91.6666666667%; } + +.col-xs-12 { + width: 100%; } + +.col-xs-pull-0 { + right: auto; } + +.col-xs-pull-1 { + right: 8.3333333333%; } + +.col-xs-pull-2 { + right: 16.6666666667%; } + +.col-xs-pull-3 { + right: 25%; } + +.col-xs-pull-4 { + right: 33.3333333333%; } + +.col-xs-pull-5 { + right: 41.6666666667%; } + +.col-xs-pull-6 { + right: 50%; } + +.col-xs-pull-7 { + right: 58.3333333333%; } + +.col-xs-pull-8 { + right: 66.6666666667%; } + +.col-xs-pull-9 { + right: 75%; } + +.col-xs-pull-10 { + right: 83.3333333333%; } + +.col-xs-pull-11 { + right: 91.6666666667%; } + +.col-xs-pull-12 { + right: 100%; } + +.col-xs-push-0 { + left: auto; } + +.col-xs-push-1 { + left: 8.3333333333%; } + +.col-xs-push-2 { + left: 16.6666666667%; } + +.col-xs-push-3 { + left: 25%; } + +.col-xs-push-4 { + left: 33.3333333333%; } + +.col-xs-push-5 { + left: 41.6666666667%; } + +.col-xs-push-6 { + left: 50%; } + +.col-xs-push-7 { + left: 58.3333333333%; } + +.col-xs-push-8 { + left: 66.6666666667%; } + +.col-xs-push-9 { + left: 75%; } + +.col-xs-push-10 { + left: 83.3333333333%; } + +.col-xs-push-11 { + left: 91.6666666667%; } + +.col-xs-push-12 { + left: 100%; } + +.col-xs-offset-0 { + margin-left: 0%; } + +.col-xs-offset-1 { + margin-left: 8.3333333333%; } + +.col-xs-offset-2 { + margin-left: 16.6666666667%; } + +.col-xs-offset-3 { + margin-left: 25%; } + +.col-xs-offset-4 { + margin-left: 33.3333333333%; } + +.col-xs-offset-5 { + margin-left: 41.6666666667%; } + +.col-xs-offset-6 { + margin-left: 50%; } + +.col-xs-offset-7 { + margin-left: 58.3333333333%; } + +.col-xs-offset-8 { + margin-left: 66.6666666667%; } + +.col-xs-offset-9 { + margin-left: 75%; } + +.col-xs-offset-10 { + margin-left: 83.3333333333%; } + +.col-xs-offset-11 { + margin-left: 91.6666666667%; } + +.col-xs-offset-12 { + margin-left: 100%; } + +@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-1 { + width: 8.3333333333%; } + .col-sm-2 { + width: 16.6666666667%; } + .col-sm-3 { + width: 25%; } + .col-sm-4 { + width: 33.3333333333%; } + .col-sm-5 { + width: 41.6666666667%; } + .col-sm-6 { + width: 50%; } + .col-sm-7 { + width: 58.3333333333%; } + .col-sm-8 { + width: 66.6666666667%; } + .col-sm-9 { + width: 75%; } + .col-sm-10 { + width: 83.3333333333%; } + .col-sm-11 { + width: 91.6666666667%; } + .col-sm-12 { + width: 100%; } + .col-sm-pull-0 { + right: auto; } + .col-sm-pull-1 { + right: 8.3333333333%; } + .col-sm-pull-2 { + right: 16.6666666667%; } + .col-sm-pull-3 { + right: 25%; } + .col-sm-pull-4 { + right: 33.3333333333%; } + .col-sm-pull-5 { + right: 41.6666666667%; } + .col-sm-pull-6 { + right: 50%; } + .col-sm-pull-7 { + right: 58.3333333333%; } + .col-sm-pull-8 { + right: 66.6666666667%; } + .col-sm-pull-9 { + right: 75%; } + .col-sm-pull-10 { + right: 83.3333333333%; } + .col-sm-pull-11 { + right: 91.6666666667%; } + .col-sm-pull-12 { + right: 100%; } + .col-sm-push-0 { + left: auto; } + .col-sm-push-1 { + left: 8.3333333333%; } + .col-sm-push-2 { + left: 16.6666666667%; } + .col-sm-push-3 { + left: 25%; } + .col-sm-push-4 { + left: 33.3333333333%; } + .col-sm-push-5 { + left: 41.6666666667%; } + .col-sm-push-6 { + left: 50%; } + .col-sm-push-7 { + left: 58.3333333333%; } + .col-sm-push-8 { + left: 66.6666666667%; } + .col-sm-push-9 { + left: 75%; } + .col-sm-push-10 { + left: 83.3333333333%; } + .col-sm-push-11 { + left: 91.6666666667%; } + .col-sm-push-12 { + left: 100%; } + .col-sm-offset-0 { + margin-left: 0%; } + .col-sm-offset-1 { + margin-left: 8.3333333333%; } + .col-sm-offset-2 { + margin-left: 16.6666666667%; } + .col-sm-offset-3 { + margin-left: 25%; } + .col-sm-offset-4 { + margin-left: 33.3333333333%; } + .col-sm-offset-5 { + margin-left: 41.6666666667%; } + .col-sm-offset-6 { + margin-left: 50%; } + .col-sm-offset-7 { + margin-left: 58.3333333333%; } + .col-sm-offset-8 { + margin-left: 66.6666666667%; } + .col-sm-offset-9 { + margin-left: 75%; } + .col-sm-offset-10 { + margin-left: 83.3333333333%; } + .col-sm-offset-11 { + margin-left: 91.6666666667%; } + .col-sm-offset-12 { + margin-left: 100%; } } + +@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-1 { + width: 8.3333333333%; } + .col-md-2 { + width: 16.6666666667%; } + .col-md-3 { + width: 25%; } + .col-md-4 { + width: 33.3333333333%; } + .col-md-5 { + width: 41.6666666667%; } + .col-md-6 { + width: 50%; } + .col-md-7 { + width: 58.3333333333%; } + .col-md-8 { + width: 66.6666666667%; } + .col-md-9 { + width: 75%; } + .col-md-10 { + width: 83.3333333333%; } + .col-md-11 { + width: 91.6666666667%; } + .col-md-12 { + width: 100%; } + .col-md-pull-0 { + right: auto; } + .col-md-pull-1 { + right: 8.3333333333%; } + .col-md-pull-2 { + right: 16.6666666667%; } + .col-md-pull-3 { + right: 25%; } + .col-md-pull-4 { + right: 33.3333333333%; } + .col-md-pull-5 { + right: 41.6666666667%; } + .col-md-pull-6 { + right: 50%; } + .col-md-pull-7 { + right: 58.3333333333%; } + .col-md-pull-8 { + right: 66.6666666667%; } + .col-md-pull-9 { + right: 75%; } + .col-md-pull-10 { + right: 83.3333333333%; } + .col-md-pull-11 { + right: 91.6666666667%; } + .col-md-pull-12 { + right: 100%; } + .col-md-push-0 { + left: auto; } + .col-md-push-1 { + left: 8.3333333333%; } + .col-md-push-2 { + left: 16.6666666667%; } + .col-md-push-3 { + left: 25%; } + .col-md-push-4 { + left: 33.3333333333%; } + .col-md-push-5 { + left: 41.6666666667%; } + .col-md-push-6 { + left: 50%; } + .col-md-push-7 { + left: 58.3333333333%; } + .col-md-push-8 { + left: 66.6666666667%; } + .col-md-push-9 { + left: 75%; } + .col-md-push-10 { + left: 83.3333333333%; } + .col-md-push-11 { + left: 91.6666666667%; } + .col-md-push-12 { + left: 100%; } + .col-md-offset-0 { + margin-left: 0%; } + .col-md-offset-1 { + margin-left: 8.3333333333%; } + .col-md-offset-2 { + margin-left: 16.6666666667%; } + .col-md-offset-3 { + margin-left: 25%; } + .col-md-offset-4 { + margin-left: 33.3333333333%; } + .col-md-offset-5 { + margin-left: 41.6666666667%; } + .col-md-offset-6 { + margin-left: 50%; } + .col-md-offset-7 { + margin-left: 58.3333333333%; } + .col-md-offset-8 { + margin-left: 66.6666666667%; } + .col-md-offset-9 { + margin-left: 75%; } + .col-md-offset-10 { + margin-left: 83.3333333333%; } + .col-md-offset-11 { + margin-left: 91.6666666667%; } + .col-md-offset-12 { + margin-left: 100%; } } + +@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-1 { + width: 8.3333333333%; } + .col-lg-2 { + width: 16.6666666667%; } + .col-lg-3 { + width: 25%; } + .col-lg-4 { + width: 33.3333333333%; } + .col-lg-5 { + width: 41.6666666667%; } + .col-lg-6 { + width: 50%; } + .col-lg-7 { + width: 58.3333333333%; } + .col-lg-8 { + width: 66.6666666667%; } + .col-lg-9 { + width: 75%; } + .col-lg-10 { + width: 83.3333333333%; } + .col-lg-11 { + width: 91.6666666667%; } + .col-lg-12 { + width: 100%; } + .col-lg-pull-0 { + right: auto; } + .col-lg-pull-1 { + right: 8.3333333333%; } + .col-lg-pull-2 { + right: 16.6666666667%; } + .col-lg-pull-3 { + right: 25%; } + .col-lg-pull-4 { + right: 33.3333333333%; } + .col-lg-pull-5 { + right: 41.6666666667%; } + .col-lg-pull-6 { + right: 50%; } + .col-lg-pull-7 { + right: 58.3333333333%; } + .col-lg-pull-8 { + right: 66.6666666667%; } + .col-lg-pull-9 { + right: 75%; } + .col-lg-pull-10 { + right: 83.3333333333%; } + .col-lg-pull-11 { + right: 91.6666666667%; } + .col-lg-pull-12 { + right: 100%; } + .col-lg-push-0 { + left: auto; } + .col-lg-push-1 { + left: 8.3333333333%; } + .col-lg-push-2 { + left: 16.6666666667%; } + .col-lg-push-3 { + left: 25%; } + .col-lg-push-4 { + left: 33.3333333333%; } + .col-lg-push-5 { + left: 41.6666666667%; } + .col-lg-push-6 { + left: 50%; } + .col-lg-push-7 { + left: 58.3333333333%; } + .col-lg-push-8 { + left: 66.6666666667%; } + .col-lg-push-9 { + left: 75%; } + .col-lg-push-10 { + left: 83.3333333333%; } + .col-lg-push-11 { + left: 91.6666666667%; } + .col-lg-push-12 { + left: 100%; } + .col-lg-offset-0 { + margin-left: 0%; } + .col-lg-offset-1 { + margin-left: 8.3333333333%; } + .col-lg-offset-2 { + margin-left: 16.6666666667%; } + .col-lg-offset-3 { + margin-left: 25%; } + .col-lg-offset-4 { + margin-left: 33.3333333333%; } + .col-lg-offset-5 { + margin-left: 41.6666666667%; } + .col-lg-offset-6 { + margin-left: 50%; } + .col-lg-offset-7 { + margin-left: 58.3333333333%; } + .col-lg-offset-8 { + margin-left: 66.6666666667%; } + .col-lg-offset-9 { + margin-left: 75%; } + .col-lg-offset-10 { + margin-left: 83.3333333333%; } + .col-lg-offset-11 { + margin-left: 91.6666666667%; } + .col-lg-offset-12 { + margin-left: 100%; } } + +table { + background-color: transparent; } + +caption { + padding-top: 8px; + padding-bottom: 8px; + color: #777777; + text-align: left; } + +th { + text-align: left; } + +.table { + width: 100%; + max-width: 100%; + margin-bottom: 20px; } + .table > thead > tr > th, + .table > thead > tr > td, + .table > tbody > tr > th, + .table > tbody > tr > td, + .table > tfoot > tr > th, + .table > tfoot > tr > td { + padding: 8px; + line-height: 1.428571429; + 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 > caption + thead > tr:first-child > td, + .table > colgroup + thead > tr:first-child > th, + .table > colgroup + thead > tr:first-child > td, + .table > thead:first-child > tr:first-child > th, + .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 > thead > tr > td, +.table-condensed > tbody > tr > th, +.table-condensed > tbody > tr > td, +.table-condensed > tfoot > tr > th, +.table-condensed > tfoot > tr > td { + padding: 5px; } + +.table-bordered { + border: 1px solid #ddd; } + .table-bordered > thead > tr > th, + .table-bordered > thead > tr > td, + .table-bordered > tbody > tr > th, + .table-bordered > tbody > tr > td, + .table-bordered > tfoot > tr > th, + .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; + float: none; + display: table-column; } + +table td[class*="col-"], +table th[class*="col-"] { + position: static; + float: none; + display: table-cell; } + +.table > thead > tr > td.active, +.table > thead > tr > th.active, +.table > thead > tr.active > td, +.table > thead > tr.active > th, +.table > tbody > tr > td.active, +.table > tbody > tr > th.active, +.table > tbody > tr.active > td, +.table > tbody > tr.active > th, +.table > tfoot > tr > td.active, +.table > tfoot > tr > th.active, +.table > tfoot > tr.active > td, +.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 > thead > tr > th.success, +.table > thead > tr.success > td, +.table > thead > tr.success > th, +.table > tbody > tr > td.success, +.table > tbody > tr > th.success, +.table > tbody > tr.success > td, +.table > tbody > tr.success > th, +.table > tfoot > tr > td.success, +.table > tfoot > tr > th.success, +.table > tfoot > tr.success > td, +.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 > thead > tr > th.info, +.table > thead > tr.info > td, +.table > thead > tr.info > th, +.table > tbody > tr > td.info, +.table > tbody > tr > th.info, +.table > tbody > tr.info > td, +.table > tbody > tr.info > th, +.table > tfoot > tr > td.info, +.table > tfoot > tr > th.info, +.table > tfoot > tr.info > td, +.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 > thead > tr > th.warning, +.table > thead > tr.warning > td, +.table > thead > tr.warning > th, +.table > tbody > tr > td.warning, +.table > tbody > tr > th.warning, +.table > tbody > tr.warning > td, +.table > tbody > tr.warning > th, +.table > tfoot > tr > td.warning, +.table > tfoot > tr > th.warning, +.table > tfoot > tr.warning > td, +.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 > thead > tr > th.danger, +.table > thead > tr.danger > td, +.table > thead > tr.danger > th, +.table > tbody > tr > td.danger, +.table > tbody > tr > th.danger, +.table > tbody > tr.danger > td, +.table > tbody > tr.danger > th, +.table > tfoot > tr > td.danger, +.table > tfoot > tr > th.danger, +.table > tfoot > tr.danger > td, +.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 { + overflow-x: auto; + min-height: 0.01%; } + @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 > thead > tr > td, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > th, + .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 > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > th: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 > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > th: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 > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; } } + +fieldset { + padding: 0; + margin: 0; + border: 0; + min-width: 0; } + +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: #333333; + border: 0; + border-bottom: 1px solid #e5e5e5; } + +label { + display: inline-block; + max-width: 100%; + margin-bottom: 5px; + font-weight: bold; } + +input[type="search"] { + 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.428571429; + color: #555555; } + +.form-control { + display: block; + width: 100%; + height: 34px; + padding: 6px 12px; + font-size: 14px; + line-height: 1.428571429; + color: #555555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; } + .form-control:focus { + border-color: #66afe9; + outline: 0; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.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 { + border: 0; + background-color: transparent; } + .form-control[disabled], .form-control[readonly], + fieldset[disabled] .form-control { + background-color: #eeeeee; + 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-group-sm > input[type="date"].form-control, + .input-group-sm > input[type="date"].input-group-addon, + .input-group-sm > .input-group-btn > input[type="date"].btn, + .input-group-sm input[type="date"], + input[type="time"].input-sm, + .input-group-sm > input[type="time"].form-control, + .input-group-sm > input[type="time"].input-group-addon, + .input-group-sm > .input-group-btn > input[type="time"].btn, + .input-group-sm + input[type="time"], + input[type="datetime-local"].input-sm, + .input-group-sm > input[type="datetime-local"].form-control, + .input-group-sm > input[type="datetime-local"].input-group-addon, + .input-group-sm > .input-group-btn > input[type="datetime-local"].btn, + .input-group-sm + input[type="datetime-local"], + input[type="month"].input-sm, + .input-group-sm > input[type="month"].form-control, + .input-group-sm > input[type="month"].input-group-addon, + .input-group-sm > .input-group-btn > input[type="month"].btn, + .input-group-sm + input[type="month"] { + line-height: 30px; } + input[type="date"].input-lg, .input-group-lg > input[type="date"].form-control, + .input-group-lg > input[type="date"].input-group-addon, + .input-group-lg > .input-group-btn > input[type="date"].btn, + .input-group-lg input[type="date"], + input[type="time"].input-lg, + .input-group-lg > input[type="time"].form-control, + .input-group-lg > input[type="time"].input-group-addon, + .input-group-lg > .input-group-btn > input[type="time"].btn, + .input-group-lg + input[type="time"], + input[type="datetime-local"].input-lg, + .input-group-lg > input[type="datetime-local"].form-control, + .input-group-lg > input[type="datetime-local"].input-group-addon, + .input-group-lg > .input-group-btn > input[type="datetime-local"].btn, + .input-group-lg + input[type="datetime-local"], + input[type="month"].input-lg, + .input-group-lg > input[type="month"].form-control, + .input-group-lg > input[type="month"].input-group-addon, + .input-group-lg > .input-group-btn > input[type="month"].btn, + .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-left: -20px; + margin-top: 4px \9; } + +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; } + +.radio-inline, +.checkbox-inline { + position: relative; + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + vertical-align: middle; + font-weight: normal; + cursor: pointer; } + +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; } + +input[type="radio"][disabled], input[type="radio"].disabled, +fieldset[disabled] input[type="radio"], +input[type="checkbox"][disabled], +input[type="checkbox"].disabled, +fieldset[disabled] +input[type="checkbox"] { + cursor: not-allowed; } + +.radio-inline.disabled, +fieldset[disabled] .radio-inline, +.checkbox-inline.disabled, +fieldset[disabled] +.checkbox-inline { + cursor: not-allowed; } + +.radio.disabled label, +fieldset[disabled] .radio label, +.checkbox.disabled label, +fieldset[disabled] +.checkbox label { + cursor: not-allowed; } + +.form-control-static { + padding-top: 7px; + padding-bottom: 7px; + margin-bottom: 0; + min-height: 34px; } + .form-control-static.input-lg, .input-group-lg > .form-control-static.form-control, + .input-group-lg > .form-control-static.input-group-addon, + .input-group-lg > .input-group-btn > .form-control-static.btn, .form-control-static.input-sm, .input-group-sm > .form-control-static.form-control, + .input-group-sm > .form-control-static.input-group-addon, + .input-group-sm > .input-group-btn > .form-control-static.btn { + padding-left: 0; + padding-right: 0; } + +.input-sm, .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-sm, .input-group-sm > select.form-control, +.input-group-sm > select.input-group-addon, +.input-group-sm > .input-group-btn > select.btn { + height: 30px; + line-height: 30px; } + +textarea.input-sm, .input-group-sm > textarea.form-control, +.input-group-sm > textarea.input-group-addon, +.input-group-sm > .input-group-btn > textarea.btn, +select[multiple].input-sm, +.input-group-sm > select[multiple].form-control, +.input-group-sm > select[multiple].input-group-addon, +.input-group-sm > .input-group-btn > select[multiple].btn { + 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, .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-lg, .input-group-lg > select.form-control, +.input-group-lg > select.input-group-addon, +.input-group-lg > .input-group-btn > select.btn { + height: 46px; + line-height: 46px; } + +textarea.input-lg, .input-group-lg > textarea.form-control, +.input-group-lg > textarea.input-group-addon, +.input-group-lg > .input-group-btn > textarea.btn, +select[multiple].input-lg, +.input-group-lg > select[multiple].form-control, +.input-group-lg > select[multiple].input-group-addon, +.input-group-lg > .input-group-btn > select[multiple].btn { + 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 + .form-control-feedback, +.input-group-lg > .input-group-addon + .form-control-feedback, +.input-group-lg > .input-group-btn > .btn + .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 + .form-control-feedback, +.input-group-sm > .input-group-addon + .form-control-feedback, +.input-group-sm > .input-group-btn > .btn + .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; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } + .has-success .form-control:focus { + border-color: #2b542c; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; } + +.has-success .input-group-addon { + color: #3c763d; + border-color: #3c763d; + background-color: #dff0d8; } + +.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; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } + .has-warning .form-control:focus { + border-color: #66512c; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; } + +.has-warning .input-group-addon { + color: #8a6d3b; + border-color: #8a6d3b; + background-color: #fcf8e3; } + +.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; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } + .has-error .form-control:focus { + border-color: #843534; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; } + +.has-error .input-group-addon { + color: #a94442; + border-color: #a94442; + background-color: #f2dede; } + +.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 { + margin-top: 0; + margin-bottom: 0; + padding-top: 7px; } + +.form-horizontal .radio, +.form-horizontal .checkbox { + min-height: 27px; } + +.form-horizontal .form-group { + margin-left: -15px; + margin-right: -15px; } + .form-horizontal .form-group:before, .form-horizontal .form-group:after { + content: " "; + display: table; } + .form-horizontal .form-group:after { + clear: both; } + +@media (min-width: 768px) { + .form-horizontal .control-label { + text-align: right; + margin-bottom: 0; + padding-top: 7px; } } + +.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; + margin-bottom: 0; + font-weight: normal; + text-align: center; + vertical-align: middle; + -ms-touch-action: manipulation; + touch-action: manipulation; + cursor: pointer; + background-image: none; + border: 1px solid transparent; + white-space: nowrap; + padding: 6px 12px; + font-size: 14px; + line-height: 1.428571429; + border-radius: 4px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + .btn:focus, .btn.focus, .btn:active:focus, .btn:active.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 { + outline: 0; + background-image: none; + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); } + .btn.disabled, .btn[disabled], + fieldset[disabled] .btn { + cursor: not-allowed; + opacity: 0.65; + filter: alpha(opacity=65); + box-shadow: none; } + +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 > .btn-default.dropdown-toggle { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; } + .btn-default:active:hover, .btn-default:active:focus, .btn-default:active.focus, .btn-default.active:hover, .btn-default.active:focus, .btn-default.active.focus, + .open > .btn-default.dropdown-toggle:hover, + .open > .btn-default.dropdown-toggle:focus, + .open > .btn-default.dropdown-toggle.focus { + color: #333; + background-color: #d4d4d4; + border-color: #8c8c8c; } + .btn-default:active, .btn-default.active, + .open > .btn-default.dropdown-toggle { + background-image: none; } + .btn-default.disabled:hover, .btn-default.disabled:focus, .btn-default.disabled.focus, .btn-default[disabled]:hover, .btn-default[disabled]:focus, .btn-default[disabled].focus, + fieldset[disabled] .btn-default:hover, + fieldset[disabled] .btn-default: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 > .btn-primary.dropdown-toggle { + color: #fff; + background-color: #286090; + border-color: #204d74; } + .btn-primary:active:hover, .btn-primary:active:focus, .btn-primary:active.focus, .btn-primary.active:hover, .btn-primary.active:focus, .btn-primary.active.focus, + .open > .btn-primary.dropdown-toggle:hover, + .open > .btn-primary.dropdown-toggle:focus, + .open > .btn-primary.dropdown-toggle.focus { + color: #fff; + background-color: #204d74; + border-color: #122b40; } + .btn-primary:active, .btn-primary.active, + .open > .btn-primary.dropdown-toggle { + background-image: none; } + .btn-primary.disabled:hover, .btn-primary.disabled:focus, .btn-primary.disabled.focus, .btn-primary[disabled]:hover, .btn-primary[disabled]:focus, .btn-primary[disabled].focus, + fieldset[disabled] .btn-primary:hover, + fieldset[disabled] .btn-primary: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 > .btn-success.dropdown-toggle { + color: #fff; + background-color: #449d44; + border-color: #398439; } + .btn-success:active:hover, .btn-success:active:focus, .btn-success:active.focus, .btn-success.active:hover, .btn-success.active:focus, .btn-success.active.focus, + .open > .btn-success.dropdown-toggle:hover, + .open > .btn-success.dropdown-toggle:focus, + .open > .btn-success.dropdown-toggle.focus { + color: #fff; + background-color: #398439; + border-color: #255625; } + .btn-success:active, .btn-success.active, + .open > .btn-success.dropdown-toggle { + background-image: none; } + .btn-success.disabled:hover, .btn-success.disabled:focus, .btn-success.disabled.focus, .btn-success[disabled]:hover, .btn-success[disabled]:focus, .btn-success[disabled].focus, + fieldset[disabled] .btn-success:hover, + fieldset[disabled] .btn-success: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 > .btn-info.dropdown-toggle { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; } + .btn-info:active:hover, .btn-info:active:focus, .btn-info:active.focus, .btn-info.active:hover, .btn-info.active:focus, .btn-info.active.focus, + .open > .btn-info.dropdown-toggle:hover, + .open > .btn-info.dropdown-toggle:focus, + .open > .btn-info.dropdown-toggle.focus { + color: #fff; + background-color: #269abc; + border-color: #1b6d85; } + .btn-info:active, .btn-info.active, + .open > .btn-info.dropdown-toggle { + background-image: none; } + .btn-info.disabled:hover, .btn-info.disabled:focus, .btn-info.disabled.focus, .btn-info[disabled]:hover, .btn-info[disabled]:focus, .btn-info[disabled].focus, + fieldset[disabled] .btn-info:hover, + fieldset[disabled] .btn-info: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 > .btn-warning.dropdown-toggle { + color: #fff; + background-color: #ec971f; + border-color: #d58512; } + .btn-warning:active:hover, .btn-warning:active:focus, .btn-warning:active.focus, .btn-warning.active:hover, .btn-warning.active:focus, .btn-warning.active.focus, + .open > .btn-warning.dropdown-toggle:hover, + .open > .btn-warning.dropdown-toggle:focus, + .open > .btn-warning.dropdown-toggle.focus { + color: #fff; + background-color: #d58512; + border-color: #985f0d; } + .btn-warning:active, .btn-warning.active, + .open > .btn-warning.dropdown-toggle { + background-image: none; } + .btn-warning.disabled:hover, .btn-warning.disabled:focus, .btn-warning.disabled.focus, .btn-warning[disabled]:hover, .btn-warning[disabled]:focus, .btn-warning[disabled].focus, + fieldset[disabled] .btn-warning:hover, + fieldset[disabled] .btn-warning: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 > .btn-danger.dropdown-toggle { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; } + .btn-danger:active:hover, .btn-danger:active:focus, .btn-danger:active.focus, .btn-danger.active:hover, .btn-danger.active:focus, .btn-danger.active.focus, + .open > .btn-danger.dropdown-toggle:hover, + .open > .btn-danger.dropdown-toggle:focus, + .open > .btn-danger.dropdown-toggle.focus { + color: #fff; + background-color: #ac2925; + border-color: #761c19; } + .btn-danger:active, .btn-danger.active, + .open > .btn-danger.dropdown-toggle { + background-image: none; } + .btn-danger.disabled:hover, .btn-danger.disabled:focus, .btn-danger.disabled.focus, .btn-danger[disabled]:hover, .btn-danger[disabled]:focus, .btn-danger[disabled].focus, + fieldset[disabled] .btn-danger:hover, + fieldset[disabled] .btn-danger:focus, + fieldset[disabled] .btn-danger.focus { + background-color: #d9534f; + border-color: #d43f3a; } + .btn-danger .badge { + color: #d9534f; + background-color: #fff; } + +.btn-link { + color: #337ab7; + font-weight: normal; + border-radius: 0; } + .btn-link, .btn-link:active, .btn-link.active, .btn-link[disabled], + fieldset[disabled] .btn-link { + background-color: transparent; + 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, .btn-link[disabled]:focus, + fieldset[disabled] .btn-link:hover, + fieldset[disabled] .btn-link:focus { + color: #777777; + 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; + transition: opacity 0.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; + transition-property: height, visibility; + transition-duration: 0.35s; + transition-timing-function: ease; } + +.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; + list-style: none; + font-size: 14px; + text-align: left; + background-color: #fff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 4px; + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + background-clip: padding-box; } + .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.428571429; + color: #333333; + white-space: nowrap; } + +.dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { + text-decoration: none; + color: #262626; + background-color: #f5f5f5; } + +.dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { + color: #fff; + text-decoration: none; + outline: 0; + background-color: #337ab7; } + +.dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { + color: #777777; } + +.dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { + text-decoration: none; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + cursor: not-allowed; } + +.open > .dropdown-menu { + display: block; } + +.open > a { + outline: 0; } + +.dropdown-menu-right { + left: auto; + right: 0; } + +.dropdown-menu-left { + left: 0; + right: auto; } + +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.428571429; + color: #777777; + white-space: nowrap; } + +.dropdown-backdrop { + position: fixed; + left: 0; + right: 0; + bottom: 0; + top: 0; + z-index: 990; } + +.pull-right > .dropdown-menu { + right: 0; + left: auto; } + +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px dashed; + border-bottom: 4px solid \9; + content: ""; } + +.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 { + left: 0; + right: auto; } } + +.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 > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active, + .btn-group-vertical > .btn:hover, + .btn-group-vertical > .btn:focus, + .btn-group-vertical > .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:before, .btn-toolbar:after { + content: " "; + display: table; } + .btn-toolbar:after { + clear: both; } + .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-bottom-right-radius: 0; + border-top-right-radius: 0; } + +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-bottom-left-radius: 0; + border-top-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-bottom-right-radius: 0; + border-top-right-radius: 0; } + +.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-bottom-left-radius: 0; + border-top-left-radius: 0; } + +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; } + +.btn-group > .btn + .dropdown-toggle { + padding-left: 8px; + padding-right: 8px; } + +.btn-group > .btn-lg + .dropdown-toggle, .btn-group-lg.btn-group > .btn + .dropdown-toggle { + padding-left: 12px; + padding-right: 12px; } + +.btn-group.open .dropdown-toggle { + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); } + .btn-group.open .dropdown-toggle.btn-link { + box-shadow: none; } + +.btn .caret { + margin-left: 0; } + +.btn-lg .caret, .btn-group-lg > .btn .caret { + border-width: 5px 5px 0; + border-bottom-width: 0; } + +.dropup .btn-lg .caret, .dropup .btn-group-lg > .btn .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:before, .btn-group-vertical > .btn-group:after { + content: " "; + display: table; } + +.btn-group-vertical > .btn-group:after { + clear: both; } + +.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-right-radius: 4px; + border-top-left-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; } + +.btn-group-vertical > .btn:last-child:not(:first-child) { + border-top-right-radius: 0; + border-top-left-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-right-radius: 0; + border-top-left-radius: 0; } + +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; } + .btn-group-justified > .btn, + .btn-group-justified > .btn-group { + float: none; + display: table-cell; + 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 input[type="checkbox"], +[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], +[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-left: 0; + padding-right: 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-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: #555555; + text-align: center; + background-color: #eeeeee; + border: 1px solid #ccc; + border-radius: 4px; } + .input-group-addon.input-sm, + .input-group-sm > .input-group-addon, + .input-group-sm > .input-group-btn > .input-group-addon.btn { + padding: 5px 10px; + font-size: 12px; + border-radius: 3px; } + .input-group-addon.input-lg, + .input-group-lg > .input-group-addon, + .input-group-lg > .input-group-btn > .input-group-addon.btn { + 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-bottom-right-radius: 0; + border-top-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-bottom-left-radius: 0; + border-top-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 { + margin-bottom: 0; + padding-left: 0; + list-style: none; } + .nav:before, .nav:after { + content: " "; + display: table; } + .nav:after { + clear: both; } + .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: #eeeeee; } + .nav > li.disabled > a { + color: #777777; } + .nav > li.disabled > a:hover, .nav > li.disabled > a:focus { + color: #777777; + text-decoration: none; + background-color: transparent; + cursor: not-allowed; } + .nav .open > a, .nav .open > a:hover, .nav .open > a:focus { + background-color: #eeeeee; + 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.428571429; + border: 1px solid transparent; + border-radius: 4px 4px 0 0; } + .nav-tabs > li > a:hover { + border-color: #eeeeee #eeeeee #ddd; } + .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus { + color: #555555; + background-color: #fff; + border: 1px solid #ddd; + border-bottom-color: transparent; + cursor: default; } + +.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, .nav-tabs.nav-justified { + width: 100%; } + .nav-justified > li, .nav-tabs.nav-justified > li { + float: none; } + .nav-justified > li > a, .nav-tabs.nav-justified > li > a { + text-align: center; + margin-bottom: 5px; } + .nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; } + @media (min-width: 768px) { + .nav-justified > li, .nav-tabs.nav-justified > li { + display: table-cell; + width: 1%; } + .nav-justified > li > a, .nav-tabs.nav-justified > li > a { + margin-bottom: 0; } } + +.nav-tabs-justified, .nav-tabs.nav-justified { + border-bottom: 0; } + .nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a { + margin-right: 0; + border-radius: 4px; } + .nav-tabs-justified > .active > a, .nav-tabs.nav-justified > .active > a, + .nav-tabs-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus, .nav-tabs.nav-justified > .active > a:focus { + border: 1px solid #ddd; } + @media (min-width: 768px) { + .nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; } + .nav-tabs-justified > .active > a, .nav-tabs.nav-justified > .active > a, + .nav-tabs-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus, .nav-tabs.nav-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-right-radius: 0; + border-top-left-radius: 0; } + +.navbar { + position: relative; + min-height: 50px; + margin-bottom: 20px; + border: 1px solid transparent; } + .navbar:before, .navbar:after { + content: " "; + display: table; } + .navbar:after { + clear: both; } + @media (min-width: 768px) { + .navbar { + border-radius: 4px; } } + +.navbar-header:before, .navbar-header:after { + content: " "; + display: table; } + +.navbar-header:after { + clear: both; } + +@media (min-width: 768px) { + .navbar-header { + float: left; } } + +.navbar-collapse { + overflow-x: visible; + padding-right: 15px; + padding-left: 15px; + border-top: 1px solid transparent; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); + -webkit-overflow-scrolling: touch; } + .navbar-collapse:before, .navbar-collapse:after { + content: " "; + display: table; } + .navbar-collapse:after { + clear: both; } + .navbar-collapse.in { + overflow-y: auto; } + @media (min-width: 768px) { + .navbar-collapse { + width: auto; + border-top: 0; + 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-left: 0; + padding-right: 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 > .navbar-collapse, +.container-fluid > .navbar-header, +.container-fluid > .navbar-collapse { + margin-right: -15px; + margin-left: -15px; } + @media (min-width: 768px) { + .container > .navbar-header, + .container > .navbar-collapse, + .container-fluid > .navbar-header, + .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; + padding: 15px 15px; + font-size: 18px; + line-height: 20px; + height: 50px; } + .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; + margin-right: 15px; + padding: 9px 10px; + margin-top: 8px; + 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; + 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 { + margin-left: -15px; + margin-right: -15px; + padding: 10px 15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + margin-top: 8px; + margin-bottom: 8px; } + @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; + border: 0; + margin-left: 0; + margin-right: 0; + padding-top: 0; + padding-bottom: 0; + box-shadow: none; } } + +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-right-radius: 0; + border-top-left-radius: 0; } + +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + margin-bottom: 0; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; } + +.navbar-btn { + margin-top: 8px; + margin-bottom: 8px; } + .navbar-btn.btn-sm, .btn-group-sm > .navbar-btn.btn { + margin-top: 10px; + margin-bottom: 10px; } + .navbar-btn.btn-xs, .btn-group-xs > .navbar-btn.btn { + margin-top: 14px; + margin-bottom: 14px; } + +.navbar-text { + margin-top: 15px; + margin-bottom: 15px; } + @media (min-width: 768px) { + .navbar-text { + float: left; + margin-left: 15px; + margin-right: 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 { + background-color: #e7e7e7; + color: #555; } + @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, .navbar-default .btn-link[disabled]:focus, + fieldset[disabled] .navbar-default .btn-link:hover, + fieldset[disabled] .navbar-default .btn-link:focus { + color: #ccc; } + +.navbar-inverse { + background-color: #222; + border-color: #090909; } + .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: #090909; } + .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 { + background-color: #090909; + color: #fff; } + @media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #090909; } + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #090909; } + .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: #090909; } + .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, .navbar-inverse .btn-link[disabled]:focus, + fieldset[disabled] .navbar-inverse .btn-link:hover, + 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 { + content: "/ "; + padding: 0 5px; + color: #ccc; } + .breadcrumb > .active { + color: #777777; } + +.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; + line-height: 1.428571429; + text-decoration: none; + color: #337ab7; + background-color: #fff; + border: 1px solid #ddd; + margin-left: -1px; } + .pagination > li:first-child > a, + .pagination > li:first-child > span { + margin-left: 0; + border-bottom-left-radius: 4px; + border-top-left-radius: 4px; } + .pagination > li:last-child > a, + .pagination > li:last-child > span { + border-bottom-right-radius: 4px; + border-top-right-radius: 4px; } + .pagination > li > a:hover, .pagination > li > a:focus, + .pagination > li > span:hover, + .pagination > li > span:focus { + z-index: 2; + color: #23527c; + background-color: #eeeeee; + border-color: #ddd; } + .pagination > .active > a, .pagination > .active > a:hover, .pagination > .active > a:focus, + .pagination > .active > span, + .pagination > .active > span:hover, + .pagination > .active > span:focus { + z-index: 3; + color: #fff; + background-color: #337ab7; + border-color: #337ab7; + cursor: default; } + .pagination > .disabled > span, + .pagination > .disabled > span:hover, + .pagination > .disabled > span:focus, + .pagination > .disabled > a, + .pagination > .disabled > a:hover, + .pagination > .disabled > a:focus { + color: #777777; + background-color: #fff; + border-color: #ddd; + cursor: not-allowed; } + +.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-bottom-left-radius: 6px; + border-top-left-radius: 6px; } + +.pagination-lg > li:last-child > a, +.pagination-lg > li:last-child > span { + border-bottom-right-radius: 6px; + border-top-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-bottom-left-radius: 3px; + border-top-left-radius: 3px; } + +.pagination-sm > li:last-child > a, +.pagination-sm > li:last-child > span { + border-bottom-right-radius: 3px; + border-top-right-radius: 3px; } + +.pager { + padding-left: 0; + margin: 20px 0; + list-style: none; + text-align: center; } + .pager:before, .pager:after { + content: " "; + display: table; } + .pager:after { + clear: both; } + .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: #eeeeee; } + .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: #777777; + background-color: #fff; + cursor: not-allowed; } + +.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; } + .label:empty { + display: none; } + .btn .label { + position: relative; + top: -1px; } + +a.label:hover, a.label:focus { + color: #fff; + text-decoration: none; + cursor: pointer; } + +.label-default { + background-color: #777777; } + .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; + color: #fff; + line-height: 1; + vertical-align: middle; + white-space: nowrap; + text-align: center; + background-color: #777777; + border-radius: 10px; } + .badge:empty { + display: none; } + .btn .badge { + position: relative; + top: -1px; } + .btn-xs .badge, .btn-group-xs > .btn .badge, + .btn-group-xs > .btn .badge { + top: 0; + padding: 1px 5px; } + .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; } + +a.badge:hover, a.badge:focus { + color: #fff; + text-decoration: none; + cursor: pointer; } + +.jumbotron { + padding-top: 30px; + padding-bottom: 30px; + margin-bottom: 30px; + color: inherit; + background-color: #eeeeee; } + .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 { + border-radius: 6px; + padding-left: 15px; + padding-right: 15px; } + .jumbotron .container { + max-width: 100%; } + @media screen and (min-width: 768px) { + .jumbotron { + padding-top: 48px; + padding-bottom: 48px; } + .container .jumbotron, + .container-fluid .jumbotron { + padding-left: 60px; + padding-right: 60px; } + .jumbotron h1, + .jumbotron .h1 { + font-size: 63px; } } + +.thumbnail { + display: block; + padding: 4px; + margin-bottom: 20px; + line-height: 1.428571429; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + transition: border 0.2s ease-in-out; } + .thumbnail > img, + .thumbnail a > img { + display: block; + max-width: 100%; + height: auto; + margin-left: auto; + margin-right: auto; } + .thumbnail .caption { + padding: 9px; + color: #333333; } + +a.thumbnail:hover, +a.thumbnail:focus, +a.thumbnail.active { + border-color: #337ab7; } + +.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 { + background-color: #dff0d8; + border-color: #d6e9c6; + color: #3c763d; } + .alert-success hr { + border-top-color: #c9e2b3; } + .alert-success .alert-link { + color: #2b542c; } + +.alert-info { + background-color: #d9edf7; + border-color: #bce8f1; + color: #31708f; } + .alert-info hr { + border-top-color: #a6e1ec; } + .alert-info .alert-link { + color: #245269; } + +.alert-warning { + background-color: #fcf8e3; + border-color: #faebcc; + color: #8a6d3b; } + .alert-warning hr { + border-top-color: #f7e1b5; } + .alert-warning .alert-link { + color: #66512c; } + +.alert-danger { + background-color: #f2dede; + border-color: #ebccd1; + color: #a94442; } + .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; } } + +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; } + to { + background-position: 0 0; } } + +.progress { + overflow: hidden; + height: 20px; + margin-bottom: 20px; + background-color: #f5f5f5; + border-radius: 4px; + box-shadow: inset 0 1px 2px rgba(0, 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; + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + transition: width 0.6s ease; } + +.progress-striped .progress-bar, +.progress-bar-striped { + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-size: 40px 40px; } + +.progress.active .progress-bar, +.progress-bar.active { + -webkit-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: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } + +.progress-bar-info { + background-color: #5bc0de; } + .progress-striped .progress-bar-info { + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } + +.progress-bar-warning { + background-color: #f0ad4e; } + .progress-striped .progress-bar-warning { + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } + +.progress-bar-danger { + background-color: #d9534f; } + .progress-striped .progress-bar-danger { + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } + +.media { + margin-top: 15px; } + .media:first-child { + margin-top: 0; } + +.media, +.media-body { + zoom: 1; + overflow: hidden; } + +.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 { + margin-bottom: 20px; + padding-left: 0; } + +.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-right-radius: 4px; + border-top-left-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, a.list-group-item:focus, + button.list-group-item:hover, + button.list-group-item:focus { + text-decoration: none; + color: #555; + 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 { + background-color: #eeeeee; + color: #777777; + cursor: not-allowed; } + .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: #777777; } + +.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 .list-group-item-heading > small, + .list-group-item.active .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, .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 { + 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, a.list-group-item-success:focus, + button.list-group-item-success:hover, + button.list-group-item-success:focus { + color: #3c763d; + background-color: #d0e9c6; } + a.list-group-item-success.active, a.list-group-item-success.active:hover, a.list-group-item-success.active:focus, + button.list-group-item-success.active, + button.list-group-item-success.active:hover, + 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, a.list-group-item-info:focus, + button.list-group-item-info:hover, + button.list-group-item-info:focus { + color: #31708f; + background-color: #c4e3f3; } + a.list-group-item-info.active, a.list-group-item-info.active:hover, a.list-group-item-info.active:focus, + button.list-group-item-info.active, + button.list-group-item-info.active:hover, + 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, a.list-group-item-warning:focus, + button.list-group-item-warning:hover, + button.list-group-item-warning:focus { + color: #8a6d3b; + background-color: #faf2cc; } + a.list-group-item-warning.active, a.list-group-item-warning.active:hover, a.list-group-item-warning.active:focus, + button.list-group-item-warning.active, + button.list-group-item-warning.active:hover, + 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, a.list-group-item-danger:focus, + button.list-group-item-danger:hover, + button.list-group-item-danger:focus { + color: #a94442; + background-color: #ebcccc; } + a.list-group-item-danger.active, a.list-group-item-danger.active:hover, a.list-group-item-danger.active:focus, + button.list-group-item-danger.active, + button.list-group-item-danger.active:hover, + 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; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); } + +.panel-body { + padding: 15px; } + .panel-body:before, .panel-body:after { + content: " "; + display: table; } + .panel-body:after { + clear: both; } + +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-right-radius: 3px; + border-top-left-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-right-radius: 3px; + border-top-left-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-right-radius: 0; + border-top-left-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-left: 15px; + padding-right: 15px; } + +.panel > .table:first-child, +.panel > .table-responsive:first-child > .table:first-child { + border-top-right-radius: 3px; + border-top-left-radius: 3px; } + .panel > .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 > thead: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: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-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-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 { + border-top-left-radius: 3px; } + .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, + .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-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-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 { + 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:last-child > tfoot:last-child > tr:last-child, + .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 { + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; } + .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, + .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 { + border-bottom-left-radius: 3px; } + .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, + .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 { + 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-bordered > thead > tr > td:first-child, + .panel > .table-bordered > tbody > tr > th:first-child, + .panel > .table-bordered > tbody > tr > td:first-child, + .panel > .table-bordered > tfoot > tr > th:first-child, + .panel > .table-bordered > tfoot > tr > td:first-child, + .panel > .table-responsive > .table-bordered > thead > tr > th:first-child, + .panel > .table-responsive > .table-bordered > thead > tr > td:first-child, + .panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, + .panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, + .panel > .table-responsive > .table-bordered > tfoot > tr > th: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-bordered > thead > tr > td:last-child, + .panel > .table-bordered > tbody > tr > th:last-child, + .panel > .table-bordered > tbody > tr > td:last-child, + .panel > .table-bordered > tfoot > tr > th:last-child, + .panel > .table-bordered > tfoot > tr > td:last-child, + .panel > .table-responsive > .table-bordered > thead > tr > th:last-child, + .panel > .table-responsive > .table-bordered > thead > tr > td:last-child, + .panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, + .panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, + .panel > .table-responsive > .table-bordered > tfoot > tr > th: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-bordered > thead > tr:first-child > th, + .panel > .table-bordered > tbody > tr:first-child > td, + .panel > .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, + .panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, + .panel > .table-responsive > .table-bordered > tbody > 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 { + border: 0; + margin-bottom: 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: #333333; + 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: #333333; } + .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; + left: 0; + bottom: 0; + height: 100%; + width: 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; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); } + .well blockquote { + border-color: #ddd; + border-color: rgba(0, 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; + opacity: 0.2; + filter: alpha(opacity=20); } + .close:hover, .close:focus { + color: #000; + text-decoration: none; + cursor: pointer; + opacity: 0.5; + filter: alpha(opacity=50); } + +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; } + +.modal-open { + overflow: hidden; } + +.modal { + display: none; + overflow: hidden; + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1050; + -webkit-overflow-scrolling: touch; + outline: 0; } + .modal.fade .modal-dialog { + -webkit-transform: translate(0, -25%); + transform: translate(0, -25%); + transition: -webkit-transform 0.3s ease-out; + transition: transform 0.3s ease-out; } + .modal.in .modal-dialog { + -webkit-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; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 6px; + box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + background-clip: padding-box; + outline: 0; } + +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000; } + .modal-backdrop.fade { + opacity: 0; + filter: alpha(opacity=0); } + .modal-backdrop.in { + opacity: 0.5; + filter: alpha(opacity=50); } + +.modal-header { + padding: 15px; + border-bottom: 1px solid #e5e5e5; } + .modal-header:before, .modal-header:after { + content: " "; + display: table; } + .modal-header:after { + clear: both; } + +.modal-header .close { + margin-top: -2px; } + +.modal-title { + margin: 0; + line-height: 1.428571429; } + +.modal-body { + position: relative; + padding: 15px; } + +.modal-footer { + padding: 15px; + text-align: right; + border-top: 1px solid #e5e5e5; } + .modal-footer:before, .modal-footer:after { + content: " "; + display: table; } + .modal-footer:after { + clear: both; } + .modal-footer .btn + .btn { + margin-left: 5px; + margin-bottom: 0; } + .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 { + box-shadow: 0 5px 15px rgba(0, 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: "Lato", sans-serif; + font-style: normal; + font-weight: normal; + letter-spacing: normal; + line-break: auto; + line-height: 1.428571429; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + white-space: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + font-size: 12px; + opacity: 0; + filter: alpha(opacity=0); } + .tooltip.in { + opacity: 0.9; + filter: alpha(opacity=90); } + .tooltip.top { + margin-top: -3px; + padding: 5px 0; } + .tooltip.right { + margin-left: 3px; + padding: 0 5px; } + .tooltip.bottom { + margin-top: 3px; + padding: 5px 0; } + .tooltip.left { + margin-left: -3px; + padding: 0 5px; } + +.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 { + bottom: 0; + right: 5px; + 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: "Lato", sans-serif; + font-style: normal; + font-weight: normal; + letter-spacing: normal; + line-break: auto; + line-height: 1.428571429; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + white-space: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + font-size: 14px; + background-color: #fff; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 6px; + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); } + .popover.top { + margin-top: -10px; } + .popover.right { + margin-left: 10px; } + .popover.bottom { + margin-top: 10px; } + .popover.left { + margin-left: -10px; } + +.popover-title { + margin: 0; + padding: 8px 14px; + 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 { + border-width: 10px; + content: ""; } + +.popover.top > .arrow { + left: 50%; + margin-left: -11px; + border-bottom-width: 0; + border-top-color: #999999; + border-top-color: rgba(0, 0, 0, 0.25); + bottom: -11px; } + .popover.top > .arrow:after { + content: " "; + bottom: 1px; + margin-left: -10px; + border-bottom-width: 0; + border-top-color: #fff; } + +.popover.right > .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-left-width: 0; + border-right-color: #999999; + border-right-color: rgba(0, 0, 0, 0.25); } + .popover.right > .arrow:after { + content: " "; + left: 1px; + bottom: -10px; + border-left-width: 0; + border-right-color: #fff; } + +.popover.bottom > .arrow { + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #999999; + border-bottom-color: rgba(0, 0, 0, 0.25); + top: -11px; } + .popover.bottom > .arrow:after { + content: " "; + top: 1px; + margin-left: -10px; + 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: #999999; + border-left-color: rgba(0, 0, 0, 0.25); } + .popover.left > .arrow:after { + content: " "; + right: 1px; + border-right-width: 0; + border-left-color: #fff; + bottom: -10px; } + +.carousel { + position: relative; } + +.carousel-inner { + position: relative; + overflow: hidden; + width: 100%; } + .carousel-inner > .item { + display: none; + position: relative; + transition: 0.6s ease-in-out left; } + .carousel-inner > .item > img, + .carousel-inner > .item > a > img { + display: block; + max-width: 100%; + height: auto; + line-height: 1; } + @media all and (transform-3d), (-webkit-transform-3d) { + .carousel-inner > .item { + transition: -webkit-transform 0.6s ease-in-out; + transition: transform 0.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 { + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + left: 0; } + .carousel-inner > .item.prev, .carousel-inner > .item.active.left { + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + left: 0; } + .carousel-inner > .item.next.left, .carousel-inner > .item.prev.right, .carousel-inner > .item.active { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + left: 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; + left: 0; + bottom: 0; + width: 15%; + opacity: 0.5; + filter: alpha(opacity=50); + font-size: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); + background-color: transparent; } + .carousel-control.left { + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); } + .carousel-control.right { + left: auto; + right: 0; + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); } + .carousel-control:hover, .carousel-control:focus { + outline: 0; + color: #fff; + text-decoration: none; + opacity: 0.9; + filter: alpha(opacity=90); } + .carousel-control .icon-prev, + .carousel-control .icon-next, + .carousel-control .glyphicon-chevron-left, + .carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + margin-top: -10px; + z-index: 5; + display: inline-block; } + .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; + line-height: 1; + font-family: serif; } + .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%; + margin-left: -30%; + padding-left: 0; + list-style: none; + text-align: center; } + .carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + border: 1px solid #fff; + border-radius: 10px; + cursor: pointer; + background-color: #000 \9; + background-color: transparent; } + .carousel-indicators .active { + margin: 0; + width: 12px; + height: 12px; + background-color: #fff; } + +.carousel-caption { + position: absolute; + left: 15%; + right: 15%; + bottom: 20px; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 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 { + left: 20%; + right: 20%; + padding-bottom: 30px; } + .carousel-indicators { + bottom: 20px; } } + +.clearfix:before, .clearfix:after { + content: " "; + display: table; } + +.clearfix:after { + clear: both; } + +.center-block { + display: block; + margin-left: auto; + margin-right: 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 { + display: none !important; } + +.visible-sm { + display: none !important; } + +.visible-md { + display: none !important; } + +.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; } } + +/*! + * Start Bootstrap - SB Admin Bootstrap Admin Template (http://startbootstrap.com) + * Code licensed under the Apache License v2.0. + * For details, see http://www.apache.org/licenses/LICENSE-2.0. + */ +/* Global Styles */ +body { + margin-top: 100px; + background-color: #222; } + +@media (min-width: 768px) { + body { + margin-top: 50px; } } + +#wrapper { + padding-left: 0; } + +#page-wrapper { + width: 100%; + padding: 0; + background-color: #fff; } + +.huge { + font-size: 50px; + line-height: normal; } + +@media (min-width: 768px) { + #wrapper { + padding-left: 225px; } + #page-wrapper { + padding: 10px; } } + +/* Top Navigation */ +.top-nav { + padding: 0 15px; } + .top-nav > li { + display: inline-block; + float: left; } + .top-nav > li > a { + padding-top: 15px; + padding-bottom: 15px; + line-height: 20px; + color: #999; } + .top-nav > li > a:hover, .top-nav > li > a:focus { + color: #fff; + background-color: #000; } + .top-nav > .open > a { + color: #fff; + background-color: #000; } + .top-nav > .open > a:hover, .top-nav > .open > a:focus { + color: #fff; + background-color: #000; } + .top-nav > .open > .dropdown-menu { + float: left; + position: absolute; + margin-top: 0; + border: 1px solid rgba(0, 0, 0, 0.15); + border-top-left-radius: 0; + border-top-right-radius: 0; + background-color: #fff; + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); } + .top-nav > .open > .dropdown-menu > li > a { + white-space: normal; } + +ul.message-dropdown { + padding: 0; + max-height: 250px; + overflow-x: hidden; + overflow-y: auto; } + +li.message-preview { + width: 275px; + border-bottom: 1px solid rgba(0, 0, 0, 0.15); } + li.message-preview > a { + padding-top: 15px; + padding-bottom: 15px; } + +li.message-footer { + margin: 5px 0; } + +ul.alert-dropdown { + width: 200px; } + +/* Side Navigation */ +@media (min-width: 768px) { + .side-nav { + position: fixed; + top: 51px; + left: 225px; + width: 225px; + margin-left: -225px; + border: none; + border-radius: 0; + overflow-y: auto; + background-color: #222; + bottom: 0; + overflow-x: hidden; + padding-bottom: 40px; } + .side-nav > li > a { + width: 225px; } + .side-nav li a:hover, .side-nav li a:focus { + outline: none; + background-color: #000 !important; } } + +.side-nav > li > ul { + padding: 0; } + .side-nav > li > ul > li > a { + display: block; + padding: 10px 15px 10px 38px; + text-decoration: none; + color: #999; } + .side-nav > li > ul > li > a:hover { + color: #fff; } + +/* Flot Chart Containers */ +.flot-chart { + display: block; + height: 400px; } + +.flot-chart-content { + width: 100%; + height: 100%; } + +/* Custom Colored Panels */ +.huge { + font-size: 40px; } + +.panel-green { + border-color: #5cb85c; } + .panel-green > .panel-heading { + border-color: #5cb85c; + color: #fff; + background-color: #5cb85c; } + .panel-green > a { + color: #5cb85c; } + .panel-green > a:hover { + color: #3d8b3d; } + +.panel-red { + border-color: #d9534f; } + .panel-red > .panel-heading { + border-color: #d9534f; + color: #fff; + background-color: #d9534f; } + .panel-red > a { + color: #d9534f; } + .panel-red > a:hover { + color: #b52b27; } + +.panel-yellow { + border-color: #f0ad4e; } + .panel-yellow > .panel-heading { + border-color: #f0ad4e; + color: #fff; + background-color: #f0ad4e; } + .panel-yellow > a { + color: #f0ad4e; } + .panel-yellow > a:hover { + color: #df8a13; } + +.navbar { + border-radius: 0px; } + +/*# sourceMappingURL=app.css.map */ diff --git a/public/assets/compiled/css/app.css.map b/public/assets/compiled/css/app.css.map new file mode 100644 index 0000000000..a9d381e6c7 --- /dev/null +++ b/public/assets/compiled/css/app.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["app.css","app.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/_bootstrap.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_normalize.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_print.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_glyphicons.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_scaffolding.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_vendor-prefixes.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_variables.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_tab-focus.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_image.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_type.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_background-variant.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_clearfix.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_text-overflow.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_code.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_grid.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_grid.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_grid-framework.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_tables.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_table-row.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_forms.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_forms.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_buttons.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_buttons.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_opacity.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_component-animations.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_dropdowns.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_nav-divider.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_reset-filter.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_button-groups.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_border-radius.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_input-groups.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_navs.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_navbar.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_nav-vertical-align.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_breadcrumbs.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_pagination.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_pagination.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_pager.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_labels.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_labels.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_badges.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_jumbotron.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_thumbnails.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_alerts.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_alerts.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_progress-bars.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_gradients.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_progress-bar.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_media.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_list-group.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_list-group.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_panels.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_panels.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_responsive-embed.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_wells.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_close.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_modals.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_tooltip.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_reset-text.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_popovers.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_carousel.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_utilities.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_center-block.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_hide-text.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/_responsive-utilities.scss","../../../node_modules/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_responsive-visibility.scss","bootstrap-overrides.scss"],"names":[],"mappings":"AAAA,iBAAiB;ACAjB,0DAAY;ACAZ;;;;GAIG;ACJH,4EAA4E;AAQ5E;EACE,wBAAwB;EACxB,2BAA2B;EAC3B,+BAA+B,EAChC;;AAMD;EACE,UAAU,EACX;;AAYD;;;;;;;;;;;;;EAaE,eAAe,EAChB;;AAOD;;;;EAIE,sBAAsB;EACtB,yBAAyB,EAC1B;;AAOD;EACE,cAAc;EACd,UAAU,EACX;;AH3BD;;EGoCE,cAAc,EACf;;AASD;EACE,8BAA8B,EAC/B;;AAOD;;EAEE,WAAW,EACZ;;AASD;EACE,0BAA0B,EAC3B;;AAMD;;EAEE,kBAAkB,EACnB;;AAMD;EACE,mBAAmB,EACpB;;AAOD;EACE,eAAe;EACf,iBAAiB,EAClB;;AAMD;EACE,iBAAiB;EACjB,YAAY,EACb;;AAMD;EACE,eAAe,EAChB;;AAMD;;EAEE,eAAe;EACf,eAAe;EACf,mBAAmB;EACnB,yBAAyB,EAC1B;;AAED;EACE,YAAY,EACb;;AAED;EACE,gBAAgB,EACjB;;AASD;EACE,UAAU,EACX;;AAMD;EACE,iBAAiB,EAClB;;AASD;EACE,iBAAiB,EAClB;;AAMD;EACE,wBAAwB;EACxB,UAAU,EACX;;AAMD;EACE,eAAe,EAChB;;AAMD;;;;EAIE,kCAAkC;EAClC,eAAe,EAChB;;AAiBD;;;;;EAKE,eAAe;EACf,cAAc;EACd,UAAU,EACX;;AAMD;EACE,kBAAkB,EACnB;;AASD;;EAEE,qBAAqB,EACtB;;AAUD;;;;EAIE,2BAA2B;EAC3B,gBAAgB,EACjB;;AAMD;;EAEE,gBAAgB,EACjB;;AAMD;;EAEE,UAAU;EACV,WAAW,EACZ;;AAOD;EACE,oBAAoB,EACrB;;AAUD;;EAEE,uBAAuB;EACvB,WAAW,EACZ;;AAQD;;EAEE,aAAa,EACd;;AAOD;EACE,8BAA8B;EAC9B,wBAAwB,EACzB;;AAQD;;EAEE,yBAAyB,EAC1B;;AAMD;EACE,0BAA0B;EAC1B,cAAc;EACd,+BAA+B,EAChC;;AAOD;EACE,UAAU;EACV,WAAW,EACZ;;AAMD;EACE,eAAe,EAChB;;AAOD;EACE,kBAAkB,EACnB;;AASD;EACE,0BAA0B;EAC1B,kBAAkB,EACnB;;AAED;;EAEE,WAAW,EACZ;;ACvaD,qFAAqF;AAOrF;EACI;;;IAGI,mCAAmC;IACnC,uBAAuB;IACvB,4BAA4B;IAC5B,6BAA6B,EAChC;EAED;;IAEI,2BAA2B,EAC9B;EAED;IACI,6BAA4B,EAC/B;EAED;IACI,8BAA6B,EAChC;EAID;;IAEI,YAAY,EACf;EAED;;IAEI,uBAAuB;IACvB,yBAAyB,EAC5B;EAED;IACI,4BAA4B,EAC/B;EAED;;IAEI,yBAAyB,EAC5B;EAED;IACI,2BAA2B,EAC9B;EAED;;;IAGI,WAAW;IACX,UAAU,EACb;EAED;;IAEI,wBAAwB,EAC3B;EAKD;IACI,cAAc,EACjB;EACD;;IAGQ,kCAAkC,EACrC;EAEL;IACI,uBAAuB,EAC1B;EAED;IACI,qCAAqC,EAMxC;IAPD;;MAKQ,kCAAkC,EACrC;EAEL;;IAGQ,kCAAkC,EACrC,EAAA;;ACrFP;EACE,oCAAoC;EACpC,gEAAQ;EACR,kbAImM,EAAA;;AAKvM;EACE,mBAAmB;EACnB,SAAS;EACT,sBAAsB;EACtB,oCAAoC;EACpC,mBAAmB;EACnB,oBAAoB;EACpB,eAAe;EACf,oCAAoC;EACpC,mCAAmC,EACpC;;AAGD;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;;EAC+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AASpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;ACxSpE;ECkEU,uBDjEsB,EAC/B;;AACD;;EC+DU,uBD7DsB,EAC/B;;AAKD;EACE,gBAAgB;EAChB,yCAAiC,EAClC;;AAED;EACE,gCL1ByC;EK2BzC,gBEuB4B;EFtB5B,yBEkCmC;EFjCnC,eElB8B;EFmB9B,uBEF0B,EFG3B;;AAGD;;;;EAIE,qBAAqB;EACrB,mBAAmB;EACnB,qBAAqB,EACtB;;AAKD;EACE,eE/B4B;EFgC5B,sBAAsB,EAWvB;EAbD;IAMI,eEjB0B;IFkB1B,2BEhB6B,EFiB9B;EARH;IG3CE,qBAAqB;IAErB,2CAA2C;IAC3C,qBAAqB,EHoDpB;;AASH;EACE,UAAU,EACX;;AAKD;EACE,uBAAuB,EACxB;;AAGD;EIvEE,eADmC;EAEnC,gBAAgB;EAChB,aAAa,EJuEd;;AAGD;EACE,mBEwB6B,EFvB9B;;AAKD;EACE,aEgpB+B;EF/oB/B,yBE/BmC;EFgCnC,uBElE0B;EFmE1B,uBEipBgC;EFhpBhC,mBEY6B;ED8ErB,iCDzF+B;EIzFvC,sBJ4FoC;EI3FpC,gBAAgB;EAChB,aAAa,EJ2Fd;;AAGD;EACE,mBAAmB,EACpB;;AAKD;EACE,iBEhD6B;EFiD7B,oBEjD6B;EFkD7B,UAAU;EACV,8BErG8B,EFsG/B;;AAOD;EACE,mBAAmB;EACnB,WAAW;EACX,YAAY;EACZ,aAAa;EACb,WAAW;EACX,iBAAiB;EACjB,uBAAU;EACV,UAAU,EACX;;AAMD;EAGI,iBAAiB;EACjB,YAAY;EACZ,aAAa;EACb,UAAU;EACV,kBAAkB;EAClB,WAAW,EACZ;;AN69BH;EMl9BE,gBAAgB,EACjB;;AKxJD;;EAEE,qBH0D+B;EGzD/B,iBH0D2B;EGzD3B,iBH0D2B;EGzD3B,eH0D+B,EGlDhC;EAbD;;;;;;;;;;;;;;IASI,oBAAoB;IACpB,eAAe;IACf,eHL4B,EGM7B;;AAGH;;;EAGE,iBHuC6B;EGtC7B,oBAAqC,EAMtC;EAVD;;;;;;;;;IAQI,eAAe,EAChB;;AAEH;;;EAGE,iBAAkC;EAClC,oBAAqC,EAMtC;EAVD;;;;;;;;;IAQI,eAAe,EAChB;;AAGH;EAAU,gBHSqB,EGTO;;AACtC;EAAU,gBHSqB,EGTO;;AACtC;EAAU,gBHSoB,EGTQ;;AACtC;EAAU,gBHSoB,EGTQ;;AACtC;EAAU,gBHCoB,EGDQ;;AACtC;EAAU,gBHSoB,EGTQ;;AAMtC;EACE,iBAAkC,EACnC;;AAED;EACE,oBHG6B;EGF7B,gBAAgB;EAChB,iBAAiB;EACjB,iBAAiB,EAKlB;EAHC;IANF;MAOI,gBAA2B,EAE9B,EAAA;;AAOD;;EAEE,eAAgB,EACjB;;AAED;;EAEE,0BH4asC;EG3atC,cAAc,EACf;;AAGD;EAAuB,iBAAiB,EAAI;;AAC5C;EAAuB,kBAAkB,EAAI;;AAC7C;EAAuB,mBAAmB,EAAI;;AAC9C;EAAuB,oBAAoB,EAAI;;AAC/C;EAAuB,oBAAoB,EAAI;;AAG/C;EAAuB,0BAA0B,EAAI;;AACrD;EAAuB,0BAA0B,EAAI;;AACrD;EAAuB,2BAA2B,EAAI;;AAGtD;EACE,eHxF8B,EGyF/B;;ACnGC;EACE,eJY0B,EIX3B;;AACD;;EACE,eAAa,EACd;;AALD;EACE,eJkfoC,EIjfrC;;AACD;;EACE,eAAa,EACd;;AALD;EACE,eJsfoC,EIrfrC;;AACD;;EACE,eAAa,EACd;;AALD;EACE,eJ0foC,EIzfrC;;AACD;;EACE,eAAa,EACd;;AALD;EACE,eJ8foC,EI7frC;;AACD;;EACE,eAAa,EACd;;AD6GH;EAGE,YAAY,EACb;;AEtHC;EACE,0BLY0B,EKX3B;;AACD;;EACE,0BAAwB,EACzB;;AALD;EACE,0BLmfoC,EKlfrC;;AACD;;EACE,0BAAwB,EACzB;;AALD;EACE,0BLufoC,EKtfrC;;AACD;;EACE,0BAAwB,EACzB;;AALD;EACE,0BL2foC,EK1frC;;AACD;;EACE,0BAAwB,EACzB;;AALD;EACE,0BL+foC,EK9frC;;AACD;;EACE,0BAAwB,EACzB;;AFgIH;EACE,oBAAuC;EACvC,oBH1E6B;EG2E7B,iCH7H8B,EG8H/B;;AAOD;;EAEE,cAAc;EACd,oBAAqC,EAKtC;EARD;;;;IAMI,iBAAiB,EAClB;;AAWH;EAJE,gBAAgB;EAChB,iBAAiB,EAKlB;;AAID;EAVE,gBAAgB;EAChB,iBAAiB;EAWjB,kBAAkB,EAOnB;EATD;IAKI,sBAAsB;IACtB,kBAAkB;IAClB,mBAAmB,EACpB;;AAIH;EACE,cAAc;EACd,oBHzH6B,EG0H9B;;AACD;;EAEE,yBH/HmC,EGgIpC;;AACD;EACE,kBAAkB,EACnB;;AACD;EACE,eAAe,EAChB;;AAOD;EG7LI,aAAa;EACb,eAAe,EAChB;;AH2LH;EGzLI,YAAY,EACb;;AH6LD;EALF;IAOM,YAAY;IACZ,aAA6B;IAC7B,YAAY;IACZ,kBAAkB;IIlNtB,iBAAiB;IACjB,wBAAwB;IACxB,oBAAoB,EJkNjB;EAZL;IAcM,mBH2nB6B,EG1nB9B,EAAA;;AASL;;EAGE,aAAa;EACb,kCH1N8B,EG2N/B;;AACD;EACE,eAAe,EAEhB;;AAGD;EACE,mBHhL6B;EGiL7B,iBHjL6B;EGkL7B,kBH4mB4C;EG3mB5C,+BHrO8B,EG6P/B;EA5BD;;;IAUM,iBAAiB,EAClB;EAXL;;;IAmBI,eAAe;IACf,eAAe;IACf,yBHtMiC;IGuMjC,eHxP4B,EG6P7B;IA3BH;;;MAyBM,uBAAuB,EACxB;;AAOL;;EAEE,oBAAoB;EACpB,gBAAgB;EAChB,gCHtQ8B;EGuQ9B,eAAe;EACf,kBAAkB,EAWnB;EAjBD;;;;;;IAYe,YAAY,EAAI;EAZ/B;;;;;;IAcM,uBAAuB,EACxB;;AAKL;EACE,oBHrO6B;EGsO7B,mBAAmB;EACnB,yBHzOmC,EG0OpC;;AKnSD;;;;EAIE,+DRsCyE,EQrC1E;;AAGD;EACE,iBAAiB;EACjB,eAAe;EACf,eRmzBmC;EQlzBnC,0BRmzBmC;EQlzBnC,mBR0F6B,EQzF9B;;AAGD;EACE,iBAAiB;EACjB,eAAe;EACf,YR6yBgC;EQ5yBhC,uBR6yBgC;EQ5yBhC,mBRmF6B;EQlF7B,+CAA+B,EAQhC;EAdD;IASI,WAAW;IACX,gBAAgB;IAChB,kBAAkB;IAClB,iBAAiB,EAClB;;AAIH;EACE,eAAe;EACf,eAAgC;EAChC,iBAAkC;EAClC,gBAA2B;EAC3B,yBRkBmC;EQjBnC,sBAAsB;EACtB,sBAAsB;EACtB,eRpC8B;EQqC9B,0BRyxBmC;EQxxBnC,uBR0xBgC;EQzxBhC,mBR0D6B,EQ/C9B;EAtBD;IAeI,WAAW;IACX,mBAAmB;IACnB,eAAe;IACf,sBAAsB;IACtB,8BAA8B;IAC9B,iBAAiB,EAClB;;AAIH;EACE,kBR2wBiC;EQ1wBjC,mBAAmB,EACpB;;AC3DD;ECHE,mBAAmB;EACnB,kBAAkB;EAClB,mBAAoB;EACpB,oBAAmB,EDYpB;EAZD;IHMI,aAAa;IACb,eAAe,EAChB;EGRH;IHUI,YAAY,EACb;EGRD;IAHF;MAII,aT2UiC,ESnUpC,EAAA;EANC;IANF;MAOI,aT6UiC,ESxUpC,EAAA;EAHC;IATF;MAUI,cT+UkC,ES7UrC,EAAA;;AAQD;ECvBE,mBAAmB;EACnB,kBAAkB;EAClB,mBAAoB;EACpB,oBAAmB,EDsBpB;EAFD;IHdI,aAAa;IACb,eAAe,EAChB;EGYH;IHVI,YAAY,EACb;;AGkBH;ECvBE,mBAAkB;EAClB,oBAAmB,EDwBpB;EAFD;IHvBI,aAAa;IACb,eAAe,EAChB;EGqBH;IHnBI,YAAY,EACb;;AKVD;EACE,mBAAmB;EAEnB,gBAAgB;EAEhB,mBAAmB;EACnB,oBAAoB,EACrB;;AASD;EACE,YAAY,EACb;;AAMC;EACE,qBAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,WAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,WAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,WAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,YAAiB,EAClB;;AAkBD;EACE,YAAY,EACb;;AAPD;EACE,qBAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,WAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,WAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,WAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,sBAAiB,EAClB;;AAFD;EACE,YAAiB,EAClB;;AAPD;EACE,WAAW,EACZ;;AAPD;EACE,oBAAgB,EACjB;;AAFD;EACE,qBAAgB,EACjB;;AAFD;EACE,UAAgB,EACjB;;AAFD;EACE,qBAAgB,EACjB;;AAFD;EACE,qBAAgB,EACjB;;AAFD;EACE,UAAgB,EACjB;;AAFD;EACE,qBAAgB,EACjB;;AAFD;EACE,qBAAgB,EACjB;;AAFD;EACE,UAAgB,EACjB;;AAFD;EACE,qBAAgB,EACjB;;AAFD;EACE,qBAAgB,EACjB;;AAFD;EACE,WAAgB,EACjB;;AAkBD;EACE,gBAAuB,EACxB;;AAFD;EACE,2BAAuB,EACxB;;AAFD;EACE,4BAAuB,EACxB;;AAFD;EACE,iBAAuB,EACxB;;AAFD;EACE,4BAAuB,EACxB;;AAFD;EACE,4BAAuB,EACxB;;AAFD;EACE,iBAAuB,EACxB;;AAFD;EACE,4BAAuB,EACxB;;AAFD;EACE,4BAAuB,EACxB;;AAFD;EACE,iBAAuB,EACxB;;AAFD;EACE,4BAAuB,EACxB;;AAFD;EACE,4BAAuB,EACxB;;AAFD;EACE,kBAAuB,EACxB;;AFEL;EErCE;IACE,YAAY,EACb;EAMC;IACE,qBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,YAAiB,EAClB;EAkBD;IACE,YAAY,EACb;EAPD;IACE,qBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,YAAiB,EAClB;EAPD;IACE,WAAW,EACZ;EAPD;IACE,oBAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,UAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,UAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,UAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,WAAgB,EACjB;EAkBD;IACE,gBAAuB,EACxB;EAFD;IACE,2BAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,iBAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,iBAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,iBAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,kBAAuB,EACxB,EAAA;;AFWL;EE9CE;IACE,YAAY,EACb;EAMC;IACE,qBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,YAAiB,EAClB;EAkBD;IACE,YAAY,EACb;EAPD;IACE,qBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,YAAiB,EAClB;EAPD;IACE,WAAW,EACZ;EAPD;IACE,oBAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,UAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,UAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,UAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,WAAgB,EACjB;EAkBD;IACE,gBAAuB,EACxB;EAFD;IACE,2BAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,iBAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,iBAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,iBAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,kBAAuB,EACxB,EAAA;;AFoBL;EEvDE;IACE,YAAY,EACb;EAMC;IACE,qBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,YAAiB,EAClB;EAkBD;IACE,YAAY,EACb;EAPD;IACE,qBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,WAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,sBAAiB,EAClB;EAFD;IACE,YAAiB,EAClB;EAPD;IACE,WAAW,EACZ;EAPD;IACE,oBAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,UAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,UAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,UAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,qBAAgB,EACjB;EAFD;IACE,WAAgB,EACjB;EAkBD;IACE,gBAAuB,EACxB;EAFD;IACE,2BAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,iBAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,iBAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,iBAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,4BAAuB,EACxB;EAFD;IACE,kBAAuB,EACxB,EAAA;;ACxDL;EACE,8BZgIyC,EY/H1C;;AACD;EACE,iBZwHiC;EYvHjC,oBZuHiC;EYtHjC,eZG8B;EYF9B,iBAAiB,EAClB;;AACD;EACE,iBAAiB,EAClB;;AAKD;EACE,YAAY;EACZ,gBAAgB;EAChB,oBZyC6B,EYD9B;EA3CD;;;;;;IAWQ,aZiG2B;IYhG3B,yBZ8B6B;IY7B7B,oBAAoB;IACpB,2BZ2G4B,EY1G7B;EAfP;IAoBI,uBAAuB;IACvB,8BZoGgC,EYnGjC;EAtBH;;;;;;IA8BQ,cAAc,EACf;EA/BP;IAoCI,2BZqFgC,EYpFjC;EArCH;IAyCI,uBZjCwB,EYkCzB;;AAMH;;;;;;EAOQ,aZuD2B,EYtD5B;;AAUP;EACE,uBZsDkC,EYrCnC;EAlBD;;;;;;IAQQ,uBZ+C4B,EY9C7B;EATP;;IAeM,yBAAyB,EAC1B;;AASL;EAEI,0BZsBmC,EYrBpC;;AAQH;EAEI,0BZamC,EYZpC;;AAQH;EACE,iBAAiB;EACjB,YAAY;EACZ,sBAAsB,EACvB;;AACD;;EAIM,iBAAiB;EACjB,YAAY;EACZ,oBAAoB,EACrB;;AC7IH;;;;;;;;;;;;EAII,0BbiIiC,EahIlC;;AAKH;;;;;EAEI,0BAAwB,EACzB;;AAbH;;;;;;;;;;;;EAII,0Bb+ekC,Ea9enC;;AAKH;;;;;EAEI,0BAAwB,EACzB;;AAbH;;;;;;;;;;;;EAII,0BbmfkC,EalfnC;;AAKH;;;;;EAEI,0BAAwB,EACzB;;AAbH;;;;;;;;;;;;EAII,0BbufkC,EatfnC;;AAKH;;;;;EAEI,0BAAwB,EACzB;;AAbH;;;;;;;;;;;;EAII,0Bb2fkC,Ea1fnC;;AAKH;;;;;EAEI,0BAAwB,EACzB;;ADwJL;EACE,iBAAiB;EACjB,kBAAkB,EA6DnB;EA3DC;IAJF;MAKI,YAAY;MACZ,oBAAqC;MACrC,mBAAmB;MACnB,6CAA6C;MAC7C,uBZrCgC,EY2FnC;MA/DD;QAaM,iBAAiB,EAalB;QA1BL;;;;;;UAsBY,oBAAoB,EACrB;MAvBX;QA8BM,UAAU,EA+BX;QA7DL;;;;;;UAuCY,eAAe,EAChB;QAxCX;;;;;;UA2CY,gBAAgB,EACjB;QA5CX;;;;UAwDY,iBAAiB,EAClB,EAAA;;AE1NX;EACE,WAAW;EACX,UAAU;EACV,UAAU;EAIV,aAAa,EACd;;AAED;EACE,eAAe;EACf,YAAY;EACZ,WAAW;EACX,oBd0C6B;EczC7B,gBAA2B;EAC3B,qBAAqB;EACrB,edd8B;Ece9B,UAAU;EACV,iCdmMsC,EclMvC;;AAED;EACE,sBAAsB;EACtB,gBAAgB;EAChB,mBAAmB;EACnB,kBAAkB,EACnB;;AAUD;Ef8BU,uBe7BsB,EAC/B;;AAGD;;EAEE,gBAAgB;EAChB,mBAAmB;EACnB,oBAAoB,EACrB;;AAED;EACE,eAAe,EAChB;;AAGD;EACE,eAAe;EACf,YAAY,EACb;;AAGD;;EAEE,aAAa,EACd;;AAGD;;;EbvEE,qBAAqB;EAErB,2CAA2C;EAC3C,qBAAqB,EawEtB;;AAGD;EACE,eAAe;EACf,iBAAoC;EACpC,gBdlC4B;EcmC5B,yBdvBmC;EcwBnC,ed1E8B,Ec2E/B;;AAyBD;EACE,eAAe;EACf,YAAY;EACZ,adiGqD;EchGrD,kBdtB8B;EcuB9B,gBdnE4B;EcoE5B,yBdxDmC;EcyDnC,ed3G8B;Ec4G9B,uBdmEmC;EclEnC,uBAAuB;EACvB,uBdwEmC;EcvEnC,mBdf6B;EDxCrB,iDewDgC;Ef8DhC,yEe7DsE,EAgC/E;EA7CD;ICxDI,sBfsJoC;IerJpC,WAAW;IhBWL,mFgBdS,EAKhB;EDqDH;IfVI,YC2GiC;ID1GjC,WAAW,EACZ;EeQH;IfP4B,YCwGS,EDxGQ;EeO7C;IfNkC,YCuGG,EDvGc;EeMnD;IAuBI,UAAU;IACV,8BAA8B,EAC/B;EAzBH;;IAmCI,0BdrI4B;IcsI5B,WAAW,EACZ;EArCH;;IAyCI,oBd6EwC,Ec5EzC;;AAMH;EACE,aAAa,EACd;;AAUD;EACE,yBAAyB,EAC1B;;AAYD;EACE;;;;IAKI,kBdoBiD,EcnBlD;EANH;;;;;;;;;;;;;;;;;;;;;;IAUI,kBdmBiC,EclBlC;EAXH;;;;;;;;;;;;;;;;;;;;;;IAeI,kBdYgC,EcXjC,EAAA;;AAUL;EACE,oBdKmC,EcJpC;;AAOD;;EAEE,mBAAmB;EACnB,eAAe;EACf,iBAAiB;EACjB,oBAAoB,EASrB;EAdD;;IAQI,iBdtK2B;IcuK3B,mBAAmB;IACnB,iBAAiB;IACjB,oBAAoB;IACpB,gBAAgB,EACjB;;AAEH;;;;EAIE,mBAAmB;EACnB,mBAAmB;EACnB,mBAAmB,EACpB;;AAED;;EAEE,iBAAiB,EAClB;;AAGD;;EAEE,mBAAmB;EACnB,sBAAsB;EACtB,mBAAmB;EACnB,iBAAiB;EACjB,uBAAuB;EACvB,oBAAoB;EACpB,gBAAgB,EACjB;;AACD;;EAEE,cAAc;EACd,kBAAkB,EACnB;;AAMD;;;;;;EAKI,oBd/CwC,EcgDzC;;AAGH;;;;;EAII,oBdvDwC,EcwDzC;;AAGH;;;;;EAKM,oBdhEsC,EciEvC;;AAUL;EAEE,iBAAoC;EACpC,oBAAuC;EAEvC,iBAAiB;EACjB,iBAAkC,EAOnC;EAbD;;;;;IAUI,gBAAgB;IAChB,iBAAiB,EAClB;;ACxPD;;;EACE,afkJmC;EejJnC,kBf6B4B;Ee5B5B,gBfpB0B;EeqB1B,iBfiC2B;EehC3B,mBfoC2B,EenC5B;;AAED;;;EACE,af0ImC;EezInC,kBfyImC,EexIpC;;AAED;;;;;;;EACE,aAAa,EACd;;ADsPH;EAEI,adpHmC;EcqHnC,kBdzO4B;Ec0O5B,gBd1R0B;Ec2R1B,iBdrO2B;EcsO3B,mBdlO2B,EcmO5B;;AAPH;EASI,ad3HmC;Ec4HnC,kBd5HmC,Ec6HpC;;AAXH;;EAcI,aAAa,EACd;;AAfH;EAiBI,adnImC;EcoInC,iBAAkC;EAClC,kBdzP4B;Ec0P5B,gBd1S0B;Ec2S1B,iBdrP2B,EcsP5B;;AC3RD;;;EACE,afgJkC;Ee/IlC,mBf0B4B;EezB5B,gBfrB0B;EesB1B,uBfgCiC;Ee/BjC,mBfmC2B,EelC5B;;AAED;;;EACE,afwIkC;EevIlC,kBfuIkC,EetInC;;AAED;;;;;;;EACE,aAAa,EACd;;ADgRH;EAEI,adhJkC;EciJlC,mBdtQ4B;EcuQ5B,gBdrT0B;EcsT1B,uBdhQiC;EciQjC,mBd7P2B,Ec8P5B;;AAPH;EASI,advJkC;EcwJlC,kBdxJkC,EcyJnC;;AAXH;;EAcI,aAAa,EACd;;AAfH;EAiBI,ad/JkC;EcgKlC,iBAAkC;EAClC,mBdtR4B;EcuR5B,gBdrU0B;EcsU1B,uBdhRiC,EciRlC;;AAQH;EAEE,mBAAmB,EAMpB;EARD;IAMI,sBAAkC,EACnC;;AAGH;EACE,mBAAmB;EACnB,OAAO;EACP,SAAS;EACT,WAAW;EACX,eAAe;EACf,Yd9LqD;Ec+LrD,ad/LqD;EcgMrD,kBdhMqD;EciMrD,mBAAmB;EACnB,qBAAqB,EACtB;;AACD;;;;;EAGE,YdrMoC;EcsMpC,adtMoC;EcuMpC,kBdvMoC,EcwMrC;;AACD;;;;;EAGE,Yd1MqC;Ec2MrC,ad3MqC;Ec4MrC,kBd5MqC,Ec6MtC;;AAGD;;;;;;;;;;ECxZI,efseoC,EererC;;ADuZH;ECpZI,sBfkeoC;EDlb9B,iDgB/CkC,EAMzC;ED6YH;ICjZM,sBAAoB;IhB6ChB,kEgB5CsD,EAE3D;;AD8YL;EC1YI,efwdoC;EevdpC,sBfudoC;EetdpC,0BfudoC,EetdrC;;ADuYH;ECpYI,efkdoC,EejdrC;;ADsYH;;;;;;;;;;EC3ZI,ef8eoC,Ee7erC;;AD0ZH;ECvZI,sBf0eoC;ED1b9B,iDgB/CkC,EAMzC;EDgZH;ICpZM,sBAAoB;IhB6ChB,kEgB5CsD,EAE3D;;ADiZL;EC7YI,efgeoC;Ee/dpC,sBf+doC;Ee9dpC,0Bf+doC,Ee9drC;;AD0YH;ECvYI,ef0doC,EezdrC;;ADyYH;;;;;;;;;;EC9ZI,efkfoC,EejfrC;;AD6ZH;EC1ZI,sBf8eoC;ED9b9B,iDgB/CkC,EAMzC;EDmZH;ICvZM,sBAAoB;IhB6ChB,kEgB5CsD,EAE3D;;ADoZL;EChZI,efoeoC;EenepC,sBfmeoC;EelepC,0BfmeoC,EelerC;;AD6YH;EC1YI,ef8doC,Ee7drC;;AD8YH;EAGI,UAA2B,EAC5B;;AAJH;EAMI,OAAO,EACR;;AASH;EACE,eAAe;EACf,gBAAgB;EAChB,oBAAoB;EACpB,eAAc,EACf;;AAkBC;EAmEF;IAhEM,sBAAsB;IACtB,iBAAiB;IACjB,uBAAuB,EACxB;EA6DL;IAzDM,sBAAsB;IACtB,YAAY;IACZ,uBAAuB,EACxB;EAsDL;IAlDM,sBAAsB,EACvB;EAiDL;IA9CM,sBAAsB;IACtB,uBAAuB,EAOxB;IAsCL;;;MAxCQ,YAAY,EACb;EAuCP;IAlCM,YAAY,EACb;EAiCL;IA9BM,iBAAiB;IACjB,uBAAuB,EACxB;EA4BL;;IAtBM,sBAAsB;IACtB,cAAc;IACd,iBAAiB;IACjB,uBAAuB,EAKxB;IAcL;;MAhBQ,gBAAgB,EACjB;EAeP;;IAXM,mBAAmB;IACnB,eAAe,EAChB;EASL;IALM,OAAO,EACR,EAAA;;AAeL;;;;EASI,cAAc;EACd,iBAAiB;EACjB,iBAAoC,EACrC;;AAZH;;EAiBI,iBAAkC,EACnC;;AAlBH;EJ1hBE,mBAAkB;EAClB,oBAAmB,EIgjBlB;EAvBH;IR1hBI,aAAa;IACb,eAAe,EAChB;EQwhBH;IRthBI,YAAY,EACb;;AQgjBD;EA3BF;IA6BM,kBAAkB;IAClB,iBAAiB;IACjB,iBAAoC,EACrC,EAAA;;AAhCL;EAwCI,YAAY,EACb;;AAOC;EAhDJ;IAkDQ,kBAAqC;IACrC,gBdxiBsB,EcyiBvB,EAAA;;AAIH;EAxDJ;IA0DQ,iBAAqC;IACrC,gBd/iBsB,EcgjBvB,EAAA;;AE7lBP;EACE,sBAAsB;EACtB,iBAAiB;EACjB,oBhB0IqC;EgBzIrC,mBAAmB;EACnB,uBAAuB;EACvB,+BAA2B;EAA3B,2BAA2B;EAC3B,gBAAgB;EAChB,uBAAuB;EACvB,8BAA8B;EAC9B,oBAAoB;EC0CpB,kBjBmC8B;EiBlC9B,gBjBV4B;EiBW5B,yBjBCmC;EiBAnC,mBjB8C6B;ED4G7B,0BiBrMyB;EjBsMtB,uBiBtMsB;EjBuMrB,sBiBvMqB;EjBwMjB,kBiBxMiB,EAkC1B;EA9CD;IfJE,qBAAqB;IAErB,2CAA2C;IAC3C,qBAAqB,EeqBlB;EApBL;IA0BI,YhBqHiC;IgBpHjC,sBAAsB,EACvB;EA5BH;IAgCI,WAAW;IACX,uBAAuB;IjB4BjB,iDiB3BkC,EACzC;EAnCH;;IAwCI,oBhBuLwC;IkBpO1C,cF8CsB;IE3CtB,0BAAa;InB+DL,iBiBnBkB,EACzB;;AAKH;;EAGI,qBAAqB,EACtB;;AAOH;EC7DE,YjBiJmC;EiBhJnC,uBjBiJmC;EiBhJnC,mBjBiJmC,EgBpFpC;EAFD;ICvDI,YjB2IiC;IiB1IjC,0BAAwB;IACpB,sBAAoB,EACzB;EDoDH;IClDI,YjBsIiC;IiBrIjC,0BAAwB;IACpB,sBAAoB,EACzB;ED+CH;;IC3CI,YjB+HiC;IiB9HjC,0BAAwB;IACpB,sBAAoB,EASzB;IDgCH;;;;MCpCM,YjBwH+B;MiBvH/B,0BAAwB;MACpB,sBAAoB,EACzB;EDiCL;;IC5BI,uBAAuB,EACxB;ED2BH;;;;ICpBM,uBjByG+B;IiBxG3B,mBjByG2B,EiBxGhC;EDkBL;ICdI,YjBmGiC;IiBlGjC,uBjBiGiC,EiBhGlC;;ADeH;EChEE,YjBqJmC;EiBpJnC,0BjBU4B;EiBT5B,sBjBqJqC,EgBrFtC;EAFD;IC1DI,YjB+IiC;IiB9IjC,0BAAwB;IACpB,sBAAoB,EACzB;EDuDH;ICrDI,YjB0IiC;IiBzIjC,0BAAwB;IACpB,sBAAoB,EACzB;EDkDH;;IC9CI,YjBmIiC;IiBlIjC,0BAAwB;IACpB,sBAAoB,EASzB;IDmCH;;;;MCvCM,YjB4H+B;MiB3H/B,0BAAwB;MACpB,sBAAoB,EACzB;EDoCL;;IC/BI,uBAAuB,EACxB;ED8BH;;;;ICvBM,0BjB9BwB;IiB+BpB,sBjB6G6B,EiB5GlC;EDqBL;ICjBI,ejBpC0B;IiBqC1B,uBjBqGiC,EiBpGlC;;ADmBH;ECpEE,YjByJmC;EiBxJnC,0BjBW6B;EiBV7B,sBjByJqC,EgBrFtC;EAFD;IC9DI,YjBmJiC;IiBlJjC,0BAAwB;IACpB,sBAAoB,EACzB;ED2DH;ICzDI,YjB8IiC;IiB7IjC,0BAAwB;IACpB,sBAAoB,EACzB;EDsDH;;IClDI,YjBuIiC;IiBtIjC,0BAAwB;IACpB,sBAAoB,EASzB;IDuCH;;;;MC3CM,YjBgI+B;MiB/H/B,0BAAwB;MACpB,sBAAoB,EACzB;EDwCL;;ICnCI,uBAAuB,EACxB;EDkCH;;;;IC3BM,0BjB7ByB;IiB8BrB,sBjBiH6B,EiBhHlC;EDyBL;ICrBI,ejBnC2B;IiBoC3B,uBjByGiC,EiBxGlC;;ADuBH;ECxEE,YjB6JmC;EiB5JnC,0BjBY6B;EiBX7B,sBjB6JqC,EgBrFtC;EAFD;IClEI,YjBuJiC;IiBtJjC,0BAAwB;IACpB,sBAAoB,EACzB;ED+DH;IC7DI,YjBkJiC;IiBjJjC,0BAAwB;IACpB,sBAAoB,EACzB;ED0DH;;ICtDI,YjB2IiC;IiB1IjC,0BAAwB;IACpB,sBAAoB,EASzB;ID2CH;;;;MC/CM,YjBoI+B;MiBnI/B,0BAAwB;MACpB,sBAAoB,EACzB;ED4CL;;ICvCI,uBAAuB,EACxB;EDsCH;;;;IC/BM,0BjB5ByB;IiB6BrB,sBjBqH6B,EiBpHlC;ED6BL;ICzBI,ejBlC2B;IiBmC3B,uBjB6GiC,EiB5GlC;;AD2BH;EC5EE,YjBiKmC;EiBhKnC,0BjBa6B;EiBZ7B,sBjBiKqC,EgBrFtC;EAFD;ICtEI,YjB2JiC;IiB1JjC,0BAAwB;IACpB,sBAAoB,EACzB;EDmEH;ICjEI,YjBsJiC;IiBrJjC,0BAAwB;IACpB,sBAAoB,EACzB;ED8DH;;IC1DI,YjB+IiC;IiB9IjC,0BAAwB;IACpB,sBAAoB,EASzB;ID+CH;;;;MCnDM,YjBwI+B;MiBvI/B,0BAAwB;MACpB,sBAAoB,EACzB;EDgDL;;IC3CI,uBAAuB,EACxB;ED0CH;;;;ICnCM,0BjB3ByB;IiB4BrB,sBjByH6B,EiBxHlC;EDiCL;IC7BI,ejBjC2B;IiBkC3B,uBjBiHiC,EiBhHlC;;AD+BH;EChFE,YjBqKmC;EiBpKnC,0BjBc6B;EiBb7B,sBjBqKqC,EgBrFtC;EAFD;IC1EI,YjB+JiC;IiB9JjC,0BAAwB;IACpB,sBAAoB,EACzB;EDuEH;ICrEI,YjB0JiC;IiBzJjC,0BAAwB;IACpB,sBAAoB,EACzB;EDkEH;;IC9DI,YjBmJiC;IiBlJjC,0BAAwB;IACpB,sBAAoB,EASzB;IDmDH;;;;MCvDM,YjB4I+B;MiB3I/B,0BAAwB;MACpB,sBAAoB,EACzB;EDoDL;;IC/CI,uBAAuB,EACxB;ED8CH;;;;ICvCM,0BjB1ByB;IiB2BrB,sBjB6H6B,EiB5HlC;EDqCL;ICjCI,ejBhC2B;IiBiC3B,uBjBqHiC,EiBpHlC;;ADwCH;EACE,ehB/E4B;EgBgF5B,oBAAoB;EACpB,iBAAiB,EA8BlB;EAjCD;;IAUI,8BAA8B;IjBpCxB,iBiBqCkB,EACzB;EAZH;IAiBI,0BAA0B,EAC3B;EAlBH;IAqBI,ehBhF0B;IgBiF1B,2BhB/E6B;IgBgF7B,8BAA8B,EAC/B;EAxBH;;;IA6BM,ehB9G0B;IgB+G1B,sBAAsB,EACvB;;AAQL;EC1EE,mBjBsC8B;EiBrC9B,gBjBT4B;EiBU5B,uBjB4CmC;EiB3CnC,mBjB+C6B,EgB2B9B;;AACD;EC9EE,kBjByC8B;EiBxC9B,gBjBR4B;EiBS5B,iBjB6C6B;EiB5C7B,mBjBgD6B,EgB8B9B;;AACD;EClFE,iBjB4C6B;EiB3C7B,gBjBR4B;EiBS5B,iBjB6C6B;EiB5C7B,mBjBgD6B,EgBiC9B;;AAMD;EACE,eAAe;EACf,YAAY,EACb;;AAGD;EACE,gBAAgB,EACjB;;AAGD;;;EAII,YAAY,EACb;;AG7JH;EACE,WAAW;EpBiLH,iCoBhL+B,EAIxC;EAND;IAII,WAAW,EACZ;;AAGH;EACE,cAAc,EAKf;EAND;IAGc,eAAe,EAAI;;AAKjC;EAAoB,mBAAmB,EAAI;;AAE3C;EAAoB,yBAAyB,EAAI;;AAEjD;EACE,mBAAmB;EACnB,UAAU;EACV,iBAAiB;EpB+JT,wCoB9JuC;EpBsKvC,2BoBrKyB;EpByKzB,iCoBxKgC,EACzC;;AC9BD;EACE,sBAAsB;EACtB,SAAS;EACT,UAAU;EACV,iBAAiB;EACjB,uBAAuB;EACvB,uBAAsC;EACtC,yBAAwC;EACxC,oCAAiD;EACjD,mCAAiD,EAClD;;AAGD;;EAEE,mBAAmB,EACpB;;AAGD;EACE,WAAW,EACZ;;AAGD;EACE,mBAAmB;EACnB,UAAU;EACV,QAAQ;EACR,cpBmP6B;EoBlP7B,cAAc;EACd,YAAY;EACZ,iBAAiB;EACjB,eAAe;EACf,gBAAgB;EAChB,iBAAiB;EACjB,gBpBU4B;EoBT5B,iBAAiB;EACjB,uBpBoMmC;EoBnMnC,uBpBuMmC;EoBtMnC,sCpBoMmC;EoBnMnC,mBpB+D6B;EDxCrB,4CqBtB2B;EACnC,6BAA6B,EAyB9B;EA3CD;IAwBI,SAAS;IACT,WAAW,EACZ;EA1BH;ICzBE,YAAY;IACZ,cAA2C;IAC3C,iBAAiB;IACjB,0BrB6OsC,EoBxLrC;EA/BH;IAmCI,eAAe;IACf,kBAAkB;IAClB,YAAY;IACZ,oBAAoB;IACpB,yBpBNiC;IoBOjC,epB1D4B;IoB2D5B,oBAAoB,EACrB;;AAIH;EAGI,sBAAsB;EACtB,epB0KmC;EoBzKnC,0BpB2KoC,EoB1KrC;;AAIH;EAII,YpBwB4B;EoBvB5B,sBAAsB;EACtB,WAAW;EACX,0BpB5E0B,EoB6E3B;;AAOH;EAII,epB3F4B,EoB4F7B;;AALH;EAUI,sBAAsB;EACtB,8BAA8B;EAC9B,uBAAuB;EE3GzB,oEAAmE;EF6GjE,oBpBoHwC,EoBnHzC;;AAIH;EAGI,eAAe,EAChB;;AAJH;EAQI,WAAW,EACZ;;AAOH;EACE,WAAW;EACX,SAAS,EACV;;AAOD;EACE,QAAQ;EACR,YAAY,EACb;;AAGD;EACE,eAAe;EACf,kBAAkB;EAClB,gBpBtG4B;EoBuG5B,yBpB7FmC;EoB8FnC,epB/I8B;EoBgJ9B,oBAAoB,EACrB;;AAGD;EACE,gBAAgB;EAChB,QAAQ;EACR,SAAS;EACT,UAAU;EACV,OAAO;EACP,aAA0B,EAC3B;;AAGD;EACE,SAAS;EACT,WAAW,EACZ;;AAOD;;EAII,cAAc;EACd,0BAAuC;EACvC,4BAAyC;EACzC,YAAY,EACb;;AARH;;EAWI,UAAU;EACV,aAAa;EACb,mBAAmB,EACpB;;AAQH;EACE;IAEI,SAAS;IAAE,WAAW,EACvB;EAHH;IAOI,QAAQ;IAAE,YAAY,EACvB,EAAA;;AGhNL;;EAEE,mBAAmB;EACnB,sBAAsB;EACtB,uBAAuB,EAYxB;EAhBD;;IAMI,mBAAmB;IACnB,YAAY,EAQb;IAfH;;;;;MAaM,WAAW,EACZ;;AAKL;;;;EAKI,kBAAkB,EACnB;;AAIH;EACE,kBAAkB,EAanB;EAdD;IjBnBI,aAAa;IACb,eAAe,EAChB;EiBiBH;IjBfI,YAAY,EACb;EiBcH;;;IAOI,YAAY,EACb;EARH;;;IAYI,iBAAiB,EAClB;;AAGH;EACE,iBAAiB,EAClB;;AAGD;EACE,eAAe,EAIhB;EALD;IChDE,8BDmDgC;IClD7B,2BDkD6B,EAC/B;;AAGH;;EC/CE,6BDiD6B;EChD1B,0BDgD0B,EAC9B;;AAGD;EACE,YAAY,EACb;;AACD;EACE,iBAAiB,EAClB;;AACD;;ECnEE,8BDsEgC;ECrE7B,2BDqE6B,EAC/B;;AAEH;ECjEE,6BDkE6B;ECjE1B,0BDiE0B,EAC9B;;AAGD;;EAEE,WAAW,EACZ;;AAgBD;EACE,kBAAkB;EAClB,mBAAmB,EACpB;;AACD;EACE,mBAAmB;EACnB,oBAAoB,EACrB;;AAID;ExB9CU,iDwB+CgC,EAMzC;EAPD;IxB9CU,iBwBmDkB,EACzB;;AAKH;EACE,eAAe,EAChB;;AAED;EACE,wBAAqD;EACrD,uBAAuB,EACxB;;AAED;EACE,wBvBf6B,EuBgB9B;;AAMD;;;EAII,eAAe;EACf,YAAY;EACZ,YAAY;EACZ,gBAAgB,EACjB;;AARH;EjBhII,aAAa;EACb,eAAe,EAChB;;AiB8HH;EjB5HI,YAAY,EACb;;AiB2HH;EAcM,YAAY,EACb;;AAfL;;;;EAsBI,iBAAiB;EACjB,eAAe,EAChB;;AAGH;EAEI,iBAAiB,EAClB;;AAHH;ECvKE,6BxB0G6B;EwBzG5B,4BxByG4B;EwBlG7B,8BDqKiC;ECpKhC,6BDoKgC,EAChC;;AAPH;ECvKE,2BDgL8B;EC/K7B,0BD+K6B;ECxK9B,gCxBkG6B;EwBjG5B,+BxBiG4B,EuBwE5B;;AAEH;EACE,iBAAiB,EAClB;;AACD;;EC/KE,8BDkLiC;ECjLhC,6BDiLgC,EAChC;;AAEH;EC7LE,2BD8L4B;EC7L3B,0BD6L2B,EAC7B;;AAMD;EACE,eAAe;EACf,YAAY;EACZ,oBAAoB;EACpB,0BAA0B,EAc3B;EAlBD;;IAOI,YAAY;IACZ,oBAAoB;IACpB,UAAU,EACX;EAVH;IAYI,YAAY,EACb;EAbH;IAgBI,WAAW,EACZ;;A/B4oGH;;;;E+BvnGM,mBAAmB;EACnB,uBAAU;EACV,qBAAqB,EACtB;;AE3OL;EACE,mBAAmB;EACnB,eAAe;EACf,0BAA0B,EA2B3B;EA9BD;IAOI,YAAY;IACZ,gBAAgB;IAChB,iBAAiB,EAClB;EAVH;IAeI,mBAAmB;IACnB,WAAW;IAKX,YAAY;IAEZ,YAAY;IACZ,iBAAiB,EAKlB;IA7BH;MA2BM,WAAW,EACZ;;AAuBL;;;EAGE,oBAAoB,EAKrB;EARD;;;IAMI,iBAAiB,EAClB;;AAGH;;EAEE,UAAU;EACV,oBAAoB;EACpB,uBAAuB,EACxB;;AAID;EACE,kBzBkB8B;EyBjB9B,gBzB3B4B;EyB4B5B,oBAAoB;EACpB,eAAe;EACf,ezBpE8B;EyBqE9B,mBAAmB;EACnB,0BzBpE8B;EyBqE9B,uBzB+GmC;EyB9GnC,mBzBwB6B,EyBL9B;EA5BD;;;IAaI,kBzBY4B;IyBX5B,gBzBrC0B;IyBsC1B,mBzBoB2B,EyBnB5B;EAhBH;;;IAkBI,mBzBI4B;IyBH5B,gBzB3C0B;IyB4C1B,mBzBc2B,EyBb5B;EArBH;;IA0BI,cAAc,EACf;;AAIH;;;;;;;EDpGE,8BC2G8B;ED1G3B,2BC0G2B,EAC/B;;AACD;EACE,gBAAgB,EACjB;;AACD;;;;;;;EDxGE,6BC+G6B;ED9G1B,0BC8G0B,EAC9B;;AACD;EACE,eAAe,EAChB;;AAID;EACE,mBAAmB;EAGnB,aAAa;EACb,oBAAoB,EA+BrB;EApCD;IAUI,mBAAmB,EAUpB;IApBH;MAYM,kBAAkB,EACnB;IAbL;MAkBM,WAAW,EACZ;EAnBL;;IA0BM,mBAAmB,EACpB;EA3BL;;IAgCM,WAAW;IACX,kBAAkB,EACnB;;AChKL;EACE,iBAAiB;EACjB,gBAAgB;EAChB,iBAAiB,EAyDlB;EA5DD;IpBOI,aAAa;IACb,eAAe,EAChB;EoBTH;IpBWI,YAAY,EACb;EoBZH;IAOI,mBAAmB;IACnB,eAAe,EAyBhB;IAjCH;MAWM,mBAAmB;MACnB,eAAe;MACf,mB1BqZ+C,E0B/YhD;MAnBL;QAgBQ,sBAAsB;QACtB,0B1BVwB,E0BWzB;IAlBP;MAuBM,e1BjB0B,E0B0B3B;MAhCL;QA2BQ,e1BrBwB;Q0BsBxB,sBAAsB;QACtB,8BAA8B;QAC9B,oB1BiMoC,E0BhMrC;EA/BP;IAwCM,0B1BjC0B;I0BkC1B,sB1BhCwB,E0BiCzB;EA1CL;ILHE,YAAY;IACZ,cAA2C;IAC3C,iBAAiB;IACjB,0BAJgC,EKwD/B;EApDH;IA0DI,gBAAgB,EACjB;;AAQH;EACE,8B1BqW8C,E0BlU/C;EApCD;IAGI,YAAY;IAEZ,oBAAoB,EAyBrB;IA9BH;MASM,kBAAkB;MAClB,yB1BtB+B;M0BuB/B,8BAA8B;MAC9B,2BAA0D,EAI3D;MAhBL;QAcQ,mC1BwVwC,E0BvVzC;IAfP;MAuBQ,e1BrFwB;M0BsFxB,uB1BtEoB;M0BuEpB,uB1BmVwC;M0BlVxC,iCAAiC;MACjC,gBAAgB,EACjB;;AAaP;EAEI,YAAY,EAmBb;EArBH;IAMM,mB1BbyB,E0Bc1B;EAPL;IASM,iBAAiB,EAClB;EAVL;IAiBQ,Y1BnBwB;I0BoBxB,0B1BrHsB,E0BsHvB;;AAOP;EAEI,YAAY,EAKb;EAPH;IAIM,gBAAgB;IAChB,eAAe,EAChB;;AAWL;EACE,YAAY,EAwBb;EAzBD;IAII,YAAY,EAKb;IATH;MAMM,mBAAmB;MACnB,mBAAmB,EACpB;EARL;IAYI,UAAU;IACV,WAAW,EACZ;EAED;IAhBF;MAkBM,oBAAoB;MACpB,UAAU,EAIX;MAvBL;QAqBQ,iBAAiB,EAClB,EAAA;;AAQP;EACE,iBAAiB,EAyBlB;EA1BD;IAKI,gBAAgB;IAChB,mB1BtF2B,E0BuF5B;EAPH;;;IAYI,uB1BgPkD,E0B/OnD;EAED;IAfF;MAiBM,8B1B2OgD;M0B1OhD,2BAA0D,EAC3D;IAnBL;;;MAuBM,0B1BvLsB,E0BwLvB,EAAA;;AASL;EAEI,cAAc,EACf;;AAHH;EAKI,eAAe,EAChB;;AAQH;EAEE,iBAAiB;EF3OjB,2BE6O4B;EF5O3B,0BE4O2B,EAC7B;;ACvOD;EACE,mBAAmB;EACnB,iB3BgWqC;E2B/VrC,oB3BoD6B;E2BnD7B,8BAA8B,EAQ/B;EAZD;IrBKI,aAAa;IACb,eAAe,EAChB;EqBPH;IrBSI,YAAY,EACb;EqBDD;IATF;MAUI,mB3ByF2B,E2BvF9B,EAAA;;AAQD;ErBfI,aAAa;EACb,eAAe,EAChB;;AqBaH;ErBXI,YAAY,EACb;;AqBaD;EAHF;IAII,YAAY,EAEf,EAAA;;AAaD;EACE,oBAAoB;EACpB,oB3B4TsC;E2B3TtC,mB3B2TsC;E2B1TtC,kCAAkC;EAClC,mDAA8B;EAE9B,kCAAkC,EA+BnC;EAtCD;IrBlCI,aAAa;IACb,eAAe,EAChB;EqBgCH;IrB9BI,YAAY,EACb;EqB6BH;IAUI,iBAAiB,EAClB;EAED;IAbF;MAcI,YAAY;MACZ,cAAc;MACd,iBAAiB,EAsBpB;MAtCD;QAmBM,0BAA0B;QAC1B,wBAAwB;QACxB,kBAAkB;QAClB,6BAA6B,EAC9B;MAvBL;QA0BM,oBAAoB,EACrB;MAID;;;QAGE,gBAAgB;QAChB,iBAAiB,EAClB,EAAA;;AAIL;;EAGI,kB3BqRoC,E2BhRrC;EAHC;IALJ;;MAMM,kBAAkB,EAErB,EAAA;;AAQH;;;;EAII,oB3BkQoC;E2BjQpC,mB3BiQoC,E2B3PrC;EAJC;IAPJ;;;;MAQM,gBAAgB;MAChB,eAAgB,EAEnB,EAAA;;AAWH;EACE,c3BoJ6B;E2BnJ7B,sBAAsB,EAKvB;EAHC;IAJF;MAKI,iBAAiB,EAEpB,EAAA;;AAGD;;EAEE,gBAAgB;EAChB,SAAS;EACT,QAAQ;EACR,c3B0I6B,E2BpI9B;EAHC;IARF;;MASI,iBAAiB,EAEpB,EAAA;;AACD;EACE,OAAO;EACP,sBAAsB,EACvB;;AACD;EACE,UAAU;EACV,iBAAiB;EACjB,sBAAsB,EACvB;;AAKD;EACE,YAAY;EACZ,mB3B2MsC;E2B1MtC,gB3BjH4B;E2BkH5B,kB3BrG6B;E2BsG7B,a3BqMqC,E2BpLtC;EAtBD;IASI,sBAAsB,EACvB;EAVH;IAaI,eAAe,EAChB;EAED;IACE;;MAEE,mB3B0LkC,E2BzLnC,EAAA;;AAUL;EACE,mBAAmB;EACnB,aAAa;EACb,mB3B4KsC;E2B3KtC,kBAAkB;EC9LlB,gBAA4B;EAC5B,mBAA+B;ED+L/B,8BAA8B;EAC9B,uBAAuB;EACvB,8BAA8B;EAC9B,mB3B5F6B,E2BkH9B;EA/BD;IAcI,WAAW,EACZ;EAfH;IAmBI,eAAe;IACf,YAAY;IACZ,YAAY;IACZ,mBAAmB,EACpB;EAvBH;IAyBI,gBAAgB,EACjB;EAED;IA5BF;MA6BI,cAAc,EAEjB,EAAA;;AAQD;EACE,oB3BuIsC,E2B1FvC;EA9CD;IAII,kBAAqB;IACrB,qBAAqB;IACrB,kB3B5K2B,E2B6K5B;EAED;IATF;MAYM,iBAAiB;MACjB,YAAY;MACZ,YAAY;MACZ,cAAc;MACd,8BAA8B;MAC9B,UAAU;MACV,iBAAiB,EAYlB;MA9BL;;QAqBQ,2BAA2B,EAC5B;MAtBP;QAwBQ,kB3B9LuB,E2BmMxB;QA7BP;UA2BU,uBAAuB,EACxB,EAAA;EAMP;IAlCF;MAmCI,YAAY;MACZ,UAAU,EAUb;MA9CD;QAuCM,YAAY,EAKb;QA5CL;UAyCQ,kB3BgG2C;U2B/F3C,qB3B+F2C,E2B9F5C,EAAA;;AAWP;EACE,mB3BiFsC;E2BhFtC,oB3BgFsC;E2B/EtC,mB3B+EsC;E2B9EtC,kCAAkC;EAClC,qCAAqC;E5B7N7B,qF4B8NiD;EC7RzD,gBAA4B;EAC5B,mBAA+B,EDyThC;Eb2JC;Ia9LF;MbiMM,sBAAsB;MACtB,iBAAiB;MACjB,uBAAuB,EACxB;IapML;MbwMM,sBAAsB;MACtB,YAAY;MACZ,uBAAuB,EACxB;Ia3ML;Mb+MM,sBAAsB,EACvB;IahNL;MbmNM,sBAAsB;MACtB,uBAAuB,EAOxB;Ma3NL;;;QbyNQ,YAAY,EACb;Ia1NP;Mb+NM,YAAY,EACb;IahOL;MbmOM,iBAAiB;MACjB,uBAAuB,EACxB;IarOL;;Mb2OM,sBAAsB;MACtB,cAAc;MACd,iBAAiB;MACjB,uBAAuB,EAKxB;ManPL;;QbiPQ,gBAAgB,EACjB;IalPP;;MbsPM,mBAAmB;MACnB,eAAe,EAChB;IaxPL;Mb4PM,OAAO,EACR,EAAA;EahPD;IAbJ;MAcM,mBAAmB,EAMtB;MApBH;QAiBQ,iBAAiB,EAClB,EAAA;EAQL;IA1BF;MA2BI,YAAY;MACZ,UAAU;MACV,eAAe;MACf,gBAAgB;MAChB,eAAe;MACf,kBAAkB;M5BxPZ,iB4ByPkB,EAE3B,EAAA;;AAMD;EACE,cAAc;EHpUd,2BGqU4B;EHpU3B,0BGoU2B,EAC7B;;AAED;EACE,iBAAiB;EHzUjB,6BxB0G6B;EwBzG5B,4BxByG4B;EwBlG7B,8BGmU+B;EHlU9B,6BGkU8B,EAChC;;AAOD;EChVE,gBAA4B;EAC5B,mBAA+B,EDwVhC;EATD;IChVE,iBAA4B;IAC5B,oBAA+B,EDoV9B;EALH;IChVE,iBAA4B;IAC5B,oBAA+B,EDuV9B;;AAQH;EChWE,iBAA4B;EAC5B,oBAA+B,EDuWhC;EALC;IAHF;MAII,YAAY;MACZ,kB3BIoC;M2BHpC,mB3BGoC,E2BDvC,EAAA;;AAWD;EACE;IACE,uBAAuB,EACxB;EACD;IACE,wBAAwB;IAC1B,oB3BhBsC,E2BqBrC;IAPD;MAKI,gBAAgB,EACjB,EAAA;;AASL;EACE,0B3BzBwC;E2B0BxC,sB3BzBuC,E2ByJxC;EAlID;IAKI,Y3BzB2C,E2B+B5C;IAXH;MAQM,e3BlB2C;M2BmB3C,8B3BlBgD,E2BmBjD;EAVL;IAcI,Y3BvCmC,E2BwCpC;EAfH;IAmBM,Y3BvCyC,E2B8C1C;IA1BL;MAuBQ,Y3B1CuC;M2B2CvC,8B3B1C8C,E2B2C/C;EAzBP;IA+BQ,Y3BhDuC;I2BiDvC,0B3BhDyC,E2BiD1C;EAjCP;IAuCQ,Y3BtDuC;I2BuDvC,8B3BtD8C,E2BuD/C;EAzCP;IA8CI,mB3BlD2C,E2B0D5C;IAtDH;MAiDM,uB3BvDyC,E2BwD1C;IAlDL;MAoDM,uB3BzDyC,E2B0D1C;EArDL;;IA0DI,sB3BjFqC,E2BkFtC;EA3DH;IAoEQ,0B3BpFyC;I2BqFzC,Y3BtFuC,E2BuFxC;EAGH;IAzEJ;MA6EU,Y3BjGqC,E2BuGtC;MAnFT;QAgFY,Y3BnGmC;Q2BoGnC,8B3BnG0C,E2BoG3C;IAlFX;MAwFY,Y3BzGmC;M2B0GnC,0B3BzGqC,E2B0GtC;IA1FX;MAgGY,Y3B/GmC;M2BgHnC,8B3B/G0C,E2BgH3C,EAAA;EAlGX;IA8GI,Y3BlI2C,E2BsI5C;IAlHH;MAgHM,Y3BnIyC,E2BoI1C;EAjHL;IAqHI,Y3BzI2C,E2BqJ5C;IAjIH;MAwHM,Y3B3IyC,E2B4I1C;IAzHL;;;MA8HQ,Y3B7IuC,E2B8IxC;;AAOP;EACE,uB3BrI8C;E2BsI9C,sB3BrIgD,E2BsQjD;EAnID;IAKI,e3BrI+C,E2B2IhD;IAXH;MAQM,Y3B9H0C;M2B+H1C,8B3B9HiD,E2B+HlD;EAVL;IAcI,e3BnJ+C,E2BoJhD;EAfH;IAmBM,e3BnJ6C,E2B0J9C;IA1BL;MAuBQ,Y3BtJwC;M2BuJxC,8B3BtJ+C,E2BuJhD;EAzBP;IA+BQ,Y3B9JwC;I2B+JxC,0B3B5J0C,E2B6J3C;EAjCP;IAuCQ,Y3BlKwC;I2BmKxC,8B3BlK+C,E2BmKhD;EAzCP;IA+CI,mB3B/J4C,E2BuK7C;IAvDH;MAkDM,uB3BpK0C,E2BqK3C;IAnDL;MAqDM,uB3BtK0C,E2BuK3C;EAtDL;;IA2DI,sBAAoB,EACrB;EA5DH;IAoEQ,0B3BhM0C;I2BiM1C,Y3BpMwC,E2BqMzC;EAGH;IAzEJ;MA6EU,sB3BhNwC,E2BiNzC;IA9ET;MAgFU,0B3BnNwC,E2BoNzC;IAjFT;MAmFU,e3BnNyC,E2ByN1C;MAzFT;QAsFY,Y3BrNoC;Q2BsNpC,8B3BrN2C,E2BsN5C;IAxFX;MA8FY,Y3B7NoC;M2B8NpC,0B3B3NsC,E2B4NvC;IAhGX;MAsGY,Y3BjOoC;M2BkOpC,8B3BjO2C,E2BkO5C,EAAA;EAxGX;IA+GI,e3B/O+C,E2BmPhD;IAnHH;MAiHM,Y3BhP0C,E2BiP3C;EAlHL;IAsHI,e3BtP+C,E2BkQhD;IAlIH;MAyHM,Y3BxP0C,E2ByP3C;IA1HL;;;MA+HQ,Y3B1PwC,E2B2PzC;;AE7oBP;EACE,kB7BqxBkC;E6BpxBlC,oB7B0D6B;E6BzD7B,iBAAiB;EACjB,0B7BoxBqC;E6BnxBrC,mB7BmG6B,E6BlF9B;EAtBD;IAQI,sBAAsB,EASvB;IAjBH;MAaM,cAA2C;MAC3C,eAAe;MACf,Y7B2wB8B,E6B1wB/B;EAhBL;IAoBI,e7BX4B,E6BY7B;;ACvBH;EACE,sBAAsB;EACtB,gBAAgB;EAChB,eAA+B;EAC/B,mB9BsG6B,E8BlC9B;EAxED;IAOI,gBAAgB,EA0BjB;IAjCH;;MAUM,mBAAmB;MACnB,YAAY;MACZ,kB9BgF0B;M8B/E1B,yB9B+C+B;M8B9C/B,sBAAsB;MACtB,e9BDwB;M8BExB,uB9BobqC;M8BnbrC,uB9BobqC;M8BnbrC,kBAAkB,EACnB;IAnBL;;MAuBQ,eAAe;MNXrB,+BxB8F6B;MwB7F1B,4BxB6F0B,E8BjFxB;IAzBP;;MNIE,gCxBsG6B;MwBrG1B,6BxBqG0B,E8B3ExB;EA/BP;;;IAuCM,WAAW;IACX,e9BPwB;I8BQxB,0B9B7B0B;I8B8B1B,mB9B+ZqC,E8B9ZtC;EA3CL;;;;IAmDM,WAAW;IACX,Y9BuZqC;I8BtZrC,0B9BvCwB;I8BwCxB,sB9BxCwB;I8ByCxB,gBAAgB,EACjB;EAxDL;;;;;;IAkEM,e9BvD0B;I8BwD1B,uB9B6YqC;I8B5YrC,mB9B6YqC;I8B5YrC,oB9B+JsC,E8B9JvC;;AAQL;;EC3EM,mB/B4F0B;E+B3F1B,gB/B6CwB;E+B5CxB,uB/BkG+B,E+BjGhC;;ADwEL;;ENlEE,+BxB+F6B;EwB9F1B,4BxB8F0B,E+BhGxB;;ADmEP;;EN1EE,gCxBuG6B;EwBtG1B,6BxBsG0B,E+B1FxB;;ADkEP;;EChFM,kB/B+F0B;E+B9F1B,gB/B8CwB;E+B7CxB,iB/BmGyB,E+BlG1B;;AD6EL;;ENvEE,+BxBgG6B;EwB/F1B,4BxB+F0B,E+BjGxB;;ADwEP;;EN/EE,gCxBwG6B;EwBvG1B,6BxBuG0B,E+B3FxB;;ACfP;EACE,gBAAgB;EAChB,eAA+B;EAC/B,iBAAiB;EACjB,mBAAmB,EA4CpB;EAhDD;I1BUI,aAAa;IACb,eAAe,EAChB;E0BZH;I1BcI,YAAY,EACb;E0BfH;IAOI,gBAAgB,EAejB;IAtBH;;MAUM,sBAAsB;MACtB,kBAAkB;MAClB,uBhCsbqC;MgCrbrC,uBhCsbqC;MgCrbrC,oBhC0cqC,EgCzctC;IAfL;;MAmBM,sBAAsB;MACtB,0BhCV0B,EgCW3B;EArBL;;IA2BM,aAAa,EACd;EA5BL;;IAkCM,YAAY,EACb;EAnCL;;;;IA2CM,ehClC0B;IgCmC1B,uBhCsZqC;IgCrZrC,oBhCqLsC,EgCpLvC;;AC/CL;EACE,gBAAgB;EAChB,wBAAwB;EACxB,eAAe;EACf,kBAAkB;EAClB,eAAe;EACf,YjC+jBgC;EiC9jBhC,mBAAmB;EACnB,oBAAoB;EACpB,yBAAyB;EACzB,qBAAqB,EActB;EAxBD;IAgBI,cAAc,EACf;EAGD;IACE,mBAAmB;IACnB,UAAU,EACX;;AAIH;EAGI,YjCyiB8B;EiCxiB9B,sBAAsB;EACtB,gBAAgB,EACjB;;AAMH;ECxCE,0BlCW8B,EiC+B/B;EAFD;ICnCM,0BAAwB,EACzB;;ADsCL;EC5CE,0BlCc4B,EiCgC7B;EAFD;ICvCM,0BAAwB,EACzB;;AD0CL;EChDE,0BlCe6B,EiCmC9B;EAFD;IC3CM,0BAAwB,EACzB;;AD8CL;ECpDE,0BlCgB6B,EiCsC9B;EAFD;IC/CM,0BAAwB,EACzB;;ADkDL;ECxDE,0BlCiB6B,EiCyC9B;EAFD;ICnDM,0BAAwB,EACzB;;ADsDL;EC5DE,0BlCkB6B,EiC4C9B;EAFD;ICvDM,0BAAwB,EACzB;;ACHL;EACE,sBAAsB;EACtB,gBAAgB;EAChB,iBAAiB;EACjB,gBnC2C4B;EmC1C5B,kBnCswBgC;EmCrwBhC,YnC2vBgC;EmC1vBhC,enCqwB6B;EmCpwB7B,uBAAuB;EACvB,oBAAoB;EACpB,mBAAmB;EACnB,0BnCH8B;EmCI9B,oBnCiwBgC,EmC1tBjC;EAnDD;IAgBI,cAAc,EACf;EAGD;IACE,mBAAmB;IACnB,UAAU,EACX;EAED;;IAEE,OAAO;IACP,iBAAiB,EAClB;EAKD;;IAEE,enCzB0B;ImC0B1B,uBnCouB8B,EmCnuB/B;EAED;IACE,aAAa,EACd;EAED;IACE,kBAAkB,EACnB;EAED;IACE,iBAAiB,EAClB;;AAIH;EAGI,YnC0sB8B;EmCzsB9B,sBAAsB;EACtB,gBAAgB,EACjB;;AC7DH;EACE,kBpCqemC;EoCpenC,qBpCoemC;EoCnenC,oBpCmemC;EoClenC,epCmesC;EoCletC,0BpCK8B,EoCsC/B;EAhDD;;IASI,epCgeoC,EoC/drC;EAVH;IAaI,oBAAkC;IAClC,gBpC4diC;IoC3djC,iBAAiB,EAClB;EAhBH;IAmBI,0BAAwB,EACzB;EAED;;IAEE,mBpCiF2B;IoChF3B,mBAAkC;IAClC,oBAAkC,EACnC;EA3BH;IA8BI,gBAAgB,EACjB;EAED;IAjCF;MAkCI,kBAAmC;MACnC,qBAAmC,EAatC;MAXG;;QAEE,mBAAkC;QAClC,oBAAkC,EACnC;MAzCL;;QA6CM,gBpC8b+B,EoC7bhC,EAAA;;AC7CL;EACE,eAAe;EACf,arCquB+B;EqCpuB/B,oBrCwD6B;EqCvD7B,yBrCqDmC;EqCpDnC,uBrCkB0B;EqCjB1B,uBrCquBgC;EqCpuBhC,mBrCgG6B;ED8ErB,oCsC7KkC,EAgB3C;EAxBD;;InCGE,eADmC;IAEnC,gBAAgB;IAChB,aAAa;ImCQX,kBAAkB;IAClB,mBAAmB,EACpB;EAfH;IAqBI,arC6tB6B;IqC5tB7B,erChB4B,EqCiB7B;;AAIH;;;EAGE,sBrCnB4B,EqCoB7B;;AC7BD;EACE,ctC0mBgC;EsCzmBhC,oBtCuD6B;EsCtD7B,8BAA8B;EAC9B,mBtCiG6B,EsC1E9B;EA3BD;IAQI,cAAc;IAEd,eAAe,EAChB;EAXH;IAeI,kBtC8lB8B,EsC7lB/B;EAhBH;;IAqBI,iBAAiB,EAClB;EAtBH;IAyBI,gBAAgB,EACjB;;AAOH;;EAEE,oBAA8B,EAS/B;EAXD;;IAMI,mBAAmB;IACnB,UAAU;IACV,aAAa;IACb,eAAe,EAChB;;AAOH;ECvDE,0BvCqfsC;EuCpftC,sBvCqfqC;EuCpfrC,evCkfsC,EsC3bvC;EAFD;IClDI,0BAAwB,EACzB;EDiDH;IC/CI,eAAa,EACd;;ADkDH;EC3DE,0BvCyfsC;EuCxftC,sBvCyfqC;EuCxfrC,evCsfsC,EsC3bvC;EAFD;ICtDI,0BAAwB,EACzB;EDqDH;ICnDI,eAAa,EACd;;ADsDH;EC/DE,0BvC6fsC;EuC5ftC,sBvC6fqC;EuC5frC,evC0fsC,EsC3bvC;EAFD;IC1DI,0BAAwB,EACzB;EDyDH;ICvDI,eAAa,EACd;;AD0DH;ECnEE,0BvCigBsC;EuChgBtC,sBvCigBqC;EuChgBrC,evC8fsC,EsC3bvC;EAFD;IC9DI,0BAAwB,EACzB;ED6DH;IC3DI,eAAa,EACd;;ACHH;EACE;IAAQ,4BAA4B,EAAA;EACpC;IAAQ,yBAAyB,EAAA,EAAA;;AAInC;EACE;IAAQ,4BAA4B,EAAA;EACpC;IAAQ,yBAAyB,EAAA,EAAA;;AAQnC;EACE,iBAAiB;EACjB,axCsC6B;EwCrC7B,oBxCqC6B;EwCpC7B,0BxCgnBmC;EwC/mBnC,mBxC+E6B;EDxCrB,+CyCtCgC,EACzC;;AAGD;EACE,YAAY;EACZ,UAAU;EACV,aAAa;EACb,gBxCc4B;EwCb5B,kBxCyB6B;EwCxB7B,YxCsmBgC;EwCrmBhC,mBAAmB;EACnB,0BxC1B4B;EDoDpB,+CyCzB+B;EzC+I/B,4ByC9I0B,EACnC;;AAOD;;ECGE,sMAAiC;EDAjC,2BAA2B,EAC5B;;AAMD;;EzC5CE,2DyC8C0D;EzC5ClD,mDyC4CkD,EAC3D;;AAMD;EErEE,0B1Ce6B,EwCwD9B;EEpEC;IDkDA,sMAAiC,EChDhC;;AFoEH;EEzEE,0B1CgB6B,EwC2D9B;EExEC;IDkDA,sMAAiC,EChDhC;;AFwEH;EE7EE,0B1CiB6B,EwC8D9B;EE5EC;IDkDA,sMAAiC,EChDhC;;AF4EH;EEjFE,0B1CkB6B,EwCiE9B;EEhFC;IDkDA,sMAAiC,EChDhC;;ACRH;EAEE,iBAAiB,EAKlB;EAPD;IAKI,cAAc,EACf;;AAGH;;EAEE,QAAQ;EACR,iBAAiB,EAClB;;AAED;EACE,eAAe,EAChB;;AAED;EACE,eAAe,EAMhB;EAPD;IAKI,gBAAgB,EACjB;;AAGH;;EAEE,mBAAmB,EACpB;;AAED;;EAEE,oBAAoB,EACrB;;AAED;;;EAGE,oBAAoB;EACpB,oBAAoB,EACrB;;AAED;EACE,uBAAuB,EACxB;;AAED;EACE,uBAAuB,EACxB;;AAGD;EACE,cAAc;EACd,mBAAmB,EACpB;;AAKD;EACE,gBAAgB;EAChB,iBAAiB,EAClB;;ACxDD;EAEE,oBAAoB;EACpB,gBAAgB,EACjB;;AAOD;EACE,mBAAmB;EACnB,eAAe;EACf,mBAAmB;EAEnB,oBAAoB;EACpB,uB5C0oBkC;E4CzoBlC,uB5C2oBkC,E4CjoBnC;EAjBD;IpBjBE,6BxB0G6B;IwBzG5B,4BxByG4B,E4C7E5B;EAZH;IAcI,iBAAiB;IpBvBnB,gCxBkG6B;IwBjG5B,+BxBiG4B,E4CzE5B;;AASH;;EAEE,Y5C6oBkC,E4ChoBnC;EAfD;;IAKI,Y5C4oBgC,E4C3oBjC;EANH;;;IAWI,sBAAsB;IACtB,Y5CmoBgC;I4CloBhC,0B5CinBmC,E4ChnBpC;;AAGH;EACE,YAAY;EACZ,iBAAiB,EAClB;;AAED;EAKI,0B5CzD4B;E4C0D5B,e5C3D4B;E4C4D5B,oB5C6JwC,E4CpJzC;EAhBH;IAWM,eAAe,EAChB;EAZL;IAcM,e5CnE0B,E4CoE3B;;AAfL;EAsBI,WAAW;EACX,Y5CwB4B;E4CvB5B,0B5C1E0B;E4C2E1B,sB5C3E0B,E4CsF3B;EApCH;;;;;;;IA+BM,eAAe,EAChB;EAhCL;IAkCM,e5C8kBiC,E4C7kBlC;;ACnGH;EACE,e7CmfoC;E6ClfpC,0B7CmfoC,E6ChfrC;;AAED;;EACE,e7C4eoC,E6C1drC;EAnBD;;IAII,eAAe,EAChB;EALH;;;IASI,e7CoekC;I6CnelC,0BAAwB,EACzB;EAXH;;;;IAeI,YAAY;IACZ,0B7C6dkC;I6C5dlC,sB7C4dkC,E6C3dnC;;AAzBH;EACE,e7CufoC;E6CtfpC,0B7CufoC,E6CpfrC;;AAED;;EACE,e7CgfoC,E6C9drC;EAnBD;;IAII,eAAe,EAChB;EALH;;;IASI,e7CwekC;I6CvelC,0BAAwB,EACzB;EAXH;;;;IAeI,YAAY;IACZ,0B7CiekC;I6ChelC,sB7CgekC,E6C/dnC;;AAzBH;EACE,e7C2foC;E6C1fpC,0B7C2foC,E6CxfrC;;AAED;;EACE,e7CofoC,E6ClerC;EAnBD;;IAII,eAAe,EAChB;EALH;;;IASI,e7C4ekC;I6C3elC,0BAAwB,EACzB;EAXH;;;;IAeI,YAAY;IACZ,0B7CqekC;I6CpelC,sB7CoekC,E6CnenC;;AAzBH;EACE,e7C+foC;E6C9fpC,0B7C+foC,E6C5frC;;AAED;;EACE,e7CwfoC,E6CterC;EAnBD;;IAII,eAAe,EAChB;EALH;;;IASI,e7CgfkC;I6C/elC,0BAAwB,EACzB;EAXH;;;;IAeI,YAAY;IACZ,0B7CyekC;I6CxelC,sB7CwekC,E6CvenC;;AD8FL;EACE,cAAc;EACd,mBAAmB,EACpB;;AACD;EACE,iBAAiB;EACjB,iBAAiB,EAClB;;AE3HD;EACE,oB9C0D6B;E8CzD7B,uB9C6rBgC;E8C5rBhC,8BAA8B;EAC9B,mB9CmG6B;EDxCrB,0C+C1D0B,EACnC;;AAGD;EACE,c9CsrBgC,E8CprBjC;EAHD;IxCAI,aAAa;IACb,eAAe,EAChB;EwCFH;IxCII,YAAY,EACb;;AwCCH;EACE,mB9CirBqC;E8ChrBrC,qCAAqC;EtBpBrC,6BsBqBgD;EtBpB/C,4BsBoB+C,EAKjD;EARD;IAMI,eAAe,EAChB;;AAIH;EACE,cAAc;EACd,iBAAiB;EACjB,gBAAe;EACf,eAAe,EAShB;EAbD;;;;;IAWI,eAAe,EAChB;;AAIH;EACE,mB9CspBqC;E8CrpBrC,0B9C2pBmC;E8C1pBnC,2B9CypBgC;EwBjsBhC,gCsByCmD;EtBxClD,+BsBwCkD,EACpD;;AAQD;;EAGI,iBAAiB,EAsBlB;EAzBH;;IAMM,oBAAoB;IACpB,iBAAiB,EAClB;EARL;;IAaQ,cAAc;ItBvEpB,6BsBwEsD;ItBvErD,4BsBuEqD,EACjD;EAfP;;IAqBQ,iBAAiB;ItBvEvB,gCsBwEyD;ItBvExD,+BsBuEwD,EACpD;;AAvBP;EtB1DE,2BsBsFgC;EtBrF/B,0BsBqF+B,EAC7B;;AAIL;EAEI,oBAAoB,EACrB;;AAEH;EACE,oBAAoB,EACrB;;AAOD;;;EAII,iBAAiB,EAMlB;EAVH;;;IAOM,mB9CmlB4B;I8CllB5B,oB9CklB4B,E8CjlB7B;;AATL;;EtBzGE,6BsBuHkD;EtBtHjD,4BsBsHiD,EAkBjD;EAhCH;;;;IAmBQ,4BAA6C;IAC7C,6BAA8C,EAU/C;IA9BP;;;;;;;;MAwBU,4BAA6C,EAC9C;IAzBT;;;;;;;;MA4BU,6BAA8C,EAC/C;;AA7BT;;EtBjGE,gCsBqIqD;EtBpIpD,+BsBoIoD,EAkBpD;EAtDH;;;;IAyCQ,+BAAgD;IAChD,gCAAiD,EAUlD;IApDP;;;;;;;;MA8CU,+BAAgD,EACjD;IA/CT;;;;;;;;MAkDU,gCAAiD,EAClD;;AAnDT;;;;EA2DI,2B9CzBgC,E8C0BjC;;AA5DH;;EA+DI,cAAc,EACf;;AAhEH;;EAmEI,UAAU,EAiCX;EApGH;;;;;;;;;;;;IA0EU,eAAe,EAChB;EA3ET;;;;;;;;;;;;IA8EU,gBAAgB,EACjB;EA/ET;;;;;;;;IAuFU,iBAAiB,EAClB;EAxFT;;;;;;;;IAgGU,iBAAiB,EAClB;;AAjGT;EAsGI,UAAU;EACV,iBAAiB,EAClB;;AASH;EACE,oB9C7J6B,E8CwL9B;EA5BD;IAKI,iBAAiB;IACjB,mB9CtH2B,E8C2H5B;IAXH;MASM,gBAAgB,EACjB;EAVL;IAcI,iBAAiB,EAMlB;IApBH;;MAkBM,2B9C6d4B,E8C5d7B;EAnBL;IAuBI,cAAc,EAIf;IA3BH;MAyBM,8B9Csd4B,E8Crd7B;;AAML;EC1PE,mB/C6sBgC,E8CjdjC;EAFD;ICvPI,e/CM4B;I+CL5B,0B/C0sBiC;I+CzsBjC,mB/CwsB8B,E+C/rB/B;ID4OH;MClPM,uB/CqsB4B,E+CpsB7B;IDiPL;MC/OM,e/CmsB+B;M+ClsB/B,0B/CH0B,E+CI3B;ED6OL;ICzOM,0B/C4rB4B,E+C3rB7B;;AD2OL;EC7PE,sB/Cc4B,E8CiP7B;EAFD;IC1PI,Y/C6sB8B;I+C5sB9B,0B/CU0B;I+CT1B,sB/CS0B,E+CA3B;ID+OH;MCrPM,0B/CMwB,E+CLzB;IDoPL;MClPM,e/CGwB;M+CFxB,uB/CosB4B,E+CnsB7B;EDgPL;IC5OM,6B/CHwB,E+CIzB;;AD8OL;EChQE,sB/CsfqC,E8CpPtC;EAFD;IC7PI,e/CifoC;I+ChfpC,0B/CifoC;I+ChfpC,sB/CifmC,E+CxepC;IDkPH;MCxPM,0B/C8eiC,E+C7elC;IDuPL;MCrPM,e/C0ekC;M+CzelC,0B/CwekC,E+CvenC;EDmPL;IC/OM,6B/CqeiC,E+CpelC;;ADiPL;ECnQE,sB/C0fqC,E8CrPtC;EAFD;IChQI,e/CqfoC;I+CpfpC,0B/CqfoC;I+CpfpC,sB/CqfmC,E+C5epC;IDqPH;MC3PM,0B/CkfiC,E+CjflC;ID0PL;MCxPM,e/C8ekC;M+C7elC,0B/C4ekC,E+C3enC;EDsPL;IClPM,6B/CyeiC,E+CxelC;;ADoPL;ECtQE,sB/C8fqC,E8CtPtC;EAFD;ICnQI,e/CyfoC;I+CxfpC,0B/CyfoC;I+CxfpC,sB/CyfmC,E+ChfpC;IDwPH;MC9PM,0B/CsfiC,E+CrflC;ID6PL;MC3PM,e/CkfkC;M+CjflC,0B/CgfkC,E+C/enC;EDyPL;ICrPM,6B/C6eiC,E+C5elC;;ADuPL;ECzQE,sB/CkgBqC,E8CvPtC;EAFD;ICtQI,e/C6foC;I+C5fpC,0B/C6foC;I+C5fpC,sB/C6fmC,E+CpfpC;ID2PH;MCjQM,0B/C0fiC,E+CzflC;IDgQL;MC9PM,e/CsfkC;M+CrflC,0B/CofkC,E+CnfnC;ED4PL;ICxPM,6B/CifiC,E+ChflC;;ACjBL;EACE,mBAAmB;EACnB,eAAe;EACf,UAAU;EACV,WAAW;EACX,iBAAiB,EAelB;EApBD;;;;;IAYI,mBAAmB;IACnB,OAAO;IACP,QAAQ;IACR,UAAU;IACV,aAAa;IACb,YAAY;IACZ,UAAU,EACX;;AAIH;EACE,uBAAuB,EACxB;;AAGD;EACE,oBAAoB,EACrB;;AC5BD;EACE,iBAAiB;EACjB,cAAc;EACd,oBAAoB;EACpB,0BjDqvBmC;EiDpvBnC,0BjDqvBkC;EiDpvBlC,mBjDiG6B;EDxCrB,gDkDxDgC,EAKzC;EAZD;IASI,mBAAmB;IACnB,kCAAkB,EACnB;;AAIH;EACE,cAAc;EACd,mBjDuF6B,EiDtF9B;;AACD;EACE,aAAa;EACb,mBjDoF6B,EiDnF9B;;ACvBD;EACE,aAAa;EACb,gBAA2B;EAC3B,kBlDmzBgC;EkDlzBhC,eAAe;EACf,YlDkzBgC;EkDjzBhC,0BlDkzBwC;EkB1zBxC,agCSmB;EhCNnB,0BAAa,EgCiBd;EAlBD;IAWI,YlD4yB8B;IkD3yB9B,sBAAsB;IACtB,gBAAgB;IhCflB,agCgBqB;IhCbrB,0BAAa,EgCcZ;;AASH;EACE,WAAW;EACX,gBAAgB;EAChB,wBAAwB;EACxB,UAAU;EACV,yBAAyB,EAC1B;;ACzBD;EACE,iBAAiB,EAClB;;AAGD;EACE,cAAc;EACd,iBAAiB;EACjB,gBAAgB;EAChB,OAAO;EACP,SAAS;EACT,UAAU;EACV,QAAQ;EACR,cnDmQ6B;EmDlQ7B,kCAAkC;EAIlC,WAAW,EAQZ;EArBD;IpD0HE,sCAA4B;IAGpB,8BAAoB;IAqEpB,4CoDhLqC;IpDgLrC,oCoDhLqC,EAC5C;EAnBH;IpD0HE,mCAA4B;IAGpB,2BAAoB,EoDzGoB;;AAElD;EACE,mBAAmB;EACnB,iBAAiB,EAClB;;AAGD;EACE,mBAAmB;EACnB,YAAY;EACZ,aAAa,EACd;;AAGD;EACE,mBAAmB;EACnB,uBnDuiBiD;EmDtiBjD,uBnD0iBiD;EmDziBjD,qCnDuiBiD;EmDtiBjD,mBnDuD6B;EDzCrB,yCoDb0B;EAClC,6BAA6B;EAE7B,WAAW,EACZ;;AAGD;EACE,gBAAgB;EAChB,OAAO;EACP,SAAS;EACT,UAAU;EACV,QAAQ;EACR,cnDoN6B;EmDnN7B,uBnD4hBgC,EmDxhBjC;EAXD;IjC5DE,WiCqE2B;IjClE3B,yBAAa,EiCkEmB;EATlC;IjC5DE,alBimB8B;IkB9lB9B,0BAAa,EiCmEuC;;AAKtD;EACE,cnDugBgC;EmDtgBhC,iCnDshBmC,EmDphBpC;EAJD;I7C/DI,aAAa;IACb,eAAe,EAChB;E6C6DH;I7C3DI,YAAY,EACb;;A6CgEH;EACE,iBAAiB,EAClB;;AAGD;EACE,UAAU;EACV,yBnD5BmC,EmD6BpC;;AAID;EACE,mBAAmB;EACnB,cnDifgC,EmDhfjC;;AAGD;EACE,cnD4egC;EmD3ehC,kBAAkB;EAClB,8BnD6fmC,EmD7epC;EAnBD;I7CvFI,aAAa;IACb,eAAe,EAChB;E6CqFH;I7CnFI,YAAY,EACb;E6CkFH;IAQI,iBAAiB;IACjB,iBAAiB,EAClB;EAVH;IAaI,kBAAkB,EACnB;EAdH;IAiBI,eAAe,EAChB;;AAIH;EACE,mBAAmB;EACnB,aAAa;EACb,YAAY;EACZ,aAAa;EACb,iBAAiB,EAClB;;AAGD;EAEE;IACE,anDme+B;ImDle/B,kBAAkB,EACnB;EACD;IpDtEQ,0CoDuE6B,EACpC;EAGD;IAAY,anD4dqB,EmD5dD,EAAA;;AAGlC;EACE;IAAY,anDsdqB,EmDtdD,EAAA;;AC9IlC;EACE,mBAAmB;EACnB,cpD+Q6B;EoD9Q7B,eAAe;ECRf,gC5DAyC;E4DEzC,mBAAmB;EACnB,oBAAoB;EACpB,uBAAuB;EACvB,iBAAiB;EACjB,yBrDwDmC;EqDvDnC,iBAAiB;EACjB,kBAAkB;EAClB,sBAAsB;EACtB,kBAAkB;EAClB,qBAAqB;EACrB,oBAAoB;EACpB,mBAAmB;EACnB,qBAAqB;EACrB,kBAAkB;EDHlB,gBpDwC4B;EkBlD5B,WkCYkB;ElCTlB,yBAAa,EkCgBd;EAhBD;IlCHE,alB+gB8B;IkB5gB9B,0BAAa,EkCWoC;EAXnD;IAYa,iBAAkB;IAAE,eAA+B,EAAI;EAZpE;IAaa,iBAAkB;IAAE,epDkgBA,EoDlgBmC;EAbpE;IAca,gBAAkB;IAAE,eAA+B,EAAI;EAdpE;IAea,kBAAkB;IAAE,epDggBA,EoDhgBmC;;AAIpE;EACE,iBpDmfiC;EoDlfjC,iBAAiB;EACjB,YpDmfgC;EoDlfhC,mBAAmB;EACnB,uBpDmfgC;EoDlfhC,mBpD8E6B,EoD7E9B;;AAGD;EACE,mBAAmB;EACnB,SAAS;EACT,UAAU;EACV,0BAA0B;EAC1B,oBAAoB,EACrB;;AAED;EAEI,UAAU;EACV,UAAU;EACV,kBpDse6B;EoDre7B,wBAAyD;EACzD,uBpDge8B,EoD/d/B;;AAPH;EASI,UAAU;EACV,WpDge6B;EoD/d7B,oBpD+d6B;EoD9d7B,wBAAyD;EACzD,uBpDyd8B,EoDxd/B;;AAdH;EAgBI,UAAU;EACV,UpDyd6B;EoDxd7B,oBpDwd6B;EoDvd7B,wBAAyD;EACzD,uBpDkd8B,EoDjd/B;;AArBH;EAuBI,SAAS;EACT,QAAQ;EACR,iBpDid6B;EoDhd7B,4BAA8E;EAC9E,yBpD2c8B,EoD1c/B;;AA5BH;EA8BI,SAAS;EACT,SAAS;EACT,iBpD0c6B;EoDzc7B,4BpDyc6B;EoDxc7B,wBpDoc8B,EoDnc/B;;AAnCH;EAqCI,OAAO;EACP,UAAU;EACV,kBpDmc6B;EoDlc7B,wBpDkc6B;EoDjc7B,0BpD6b8B,EoD5b/B;;AA1CH;EA4CI,OAAO;EACP,WpD6b6B;EoD5b7B,iBpD4b6B;EoD3b7B,wBpD2b6B;EoD1b7B,0BpDsb8B,EoDrb/B;;AAjDH;EAmDI,OAAO;EACP,UpDsb6B;EoDrb7B,iBpDqb6B;EoDpb7B,wBpDob6B;EoDnb7B,0BpD+a8B,EoD9a/B;;AE9FH;EACE,mBAAmB;EACnB,OAAO;EACP,QAAQ;EACR,ctD6Q6B;EsD5Q7B,cAAc;EACd,iBtDshByC;EsDrhBzC,aAAa;EDXb,gC5DAyC;E4DEzC,mBAAmB;EACnB,oBAAoB;EACpB,uBAAuB;EACvB,iBAAiB;EACjB,yBrDwDmC;EqDvDnC,iBAAiB;EACjB,kBAAkB;EAClB,sBAAsB;EACtB,kBAAkB;EAClB,qBAAqB;EACrB,oBAAoB;EACpB,mBAAmB;EACnB,qBAAqB;EACrB,kBAAkB;ECAlB,gBtDmC4B;EsDjC5B,uBtD6gBwC;EsD5gBxC,6BAA6B;EAC7B,uBtDihBwC;EsDhhBxC,qCtD8gBwC;EsD7gBxC,mBtDwF6B;EDzCrB,0CuD9C2B,EAOpC;EAzBD;IAqBc,kBtDihB4B,EsDjhBS;EArBnD;IAsBc,kBtDghB4B,EsDhhBS;EAtBnD;IAuBc,iBtD+gB4B,EsD/gBQ;EAvBlD;IAwBc,mBtD8gB4B,EsD9gBU;;AAGpD;EACE,UAAU;EACV,kBAAkB;EAClB,gBtDgB4B;EsDf5B,0BtDogB0C;EsDngB1C,iCAA+B;EAC/B,2BAAwE,EACzE;;AAED;EACE,kBAAkB,EACnB;;AAMD;EAGI,mBAAmB;EACnB,eAAe;EACf,SAAS;EACT,UAAU;EACV,0BAA0B;EAC1B,oBAAoB,EACrB;;AAEH;EACE,mBtDmfyD,EsDlf1D;;AACD;EACE,mBtD2ewC;EsD1exC,YAAY,EACb;;AAED;EAEI,UAAU;EACV,mBtDyeuD;EsDxevD,uBAAuB;EACvB,0BtD2ewC;EsD1exC,sCtDweyC;EsDvezC,ctDqeuD,EsD7dxD;EAfH;IASM,aAAa;IACb,YAAY;IACZ,mBtD4doC;IsD3dpC,uBAAuB;IACvB,uBtD8coC,EsD7crC;;AAdL;EAiBI,SAAS;EACT,YtD0duD;EsDzdvD,kBtDyduD;EsDxdvD,qBAAqB;EACrB,4BtD2dwC;EsD1dxC,wCtDwdyC,EsDhd1C;EA9BH;IAwBM,aAAa;IACb,UAAU;IACV,ctD6coC;IsD5cpC,qBAAqB;IACrB,yBtD+boC,EsD9brC;;AA7BL;EAgCI,UAAU;EACV,mBtD2cuD;EsD1cvD,oBAAoB;EACpB,6BtD6cwC;EsD5cxC,yCtD0cyC;EsDzczC,WtDucuD,EsD/bxD;EA7CH;IAuCM,aAAa;IACb,SAAS;IACT,mBtD8boC;IsD7bpC,oBAAoB;IACpB,0BtDgboC,EsD/arC;;AA5CL;EAgDI,SAAS;EACT,atD2buD;EsD1bvD,kBtD0buD;EsDzbvD,sBAAsB;EACtB,2BtD4bwC;EsD3bxC,uCtDybyC,EsDjb1C;EA7DH;IAuDM,aAAa;IACb,WAAW;IACX,sBAAsB;IACtB,wBtDiaoC;IsDhapC,ctD4aoC,EsD3arC;;AC1HL;EACE,mBAAmB,EACpB;;AAED;EACE,mBAAmB;EACnB,iBAAiB;EACjB,YAAY,EA0Eb;EA7ED;IAMI,cAAc;IACd,mBAAmB;IxD0Kb,kCwDzKkC,EAgCzC;IAxCH;;MrDDE,eADmC;MAEnC,gBAAgB;MAChB,aAAa;MqDaT,eAAe,EAChB;IAGD;MAlBJ;QxDuMU,+CwDpL0C;QxDoL1C,uCwDpL0C;QxD4BlD,oCwD3BuC;QxD6B/B,4BwD7B+B;QxDuIvC,4BwDtI+B;QxDwIvB,oBwDxIuB,EAmB9B;QAxCH;UxDqIE,2CAA8B;UACtB,mCAAsB;UwD5GxB,QAAQ,EACT;QA3BP;UxDqIE,4CAA8B;UACtB,oCAAsB;UwDvGxB,QAAQ,EACT;QAhCP;UxDqIE,wCAA8B;UACtB,gCAAsB;UwDjGxB,QAAQ,EACT,EAAA;EAtCP;;;IA6CI,eAAe,EAChB;EA9CH;IAiDI,QAAQ,EACT;EAlDH;;IAsDI,mBAAmB;IACnB,OAAO;IACP,YAAY,EACb;EAzDH;IA4DI,WAAW,EACZ;EA7DH;IA+DI,YAAY,EACb;EAhEH;;IAmEI,QAAQ,EACT;EApEH;IAuEI,YAAY,EACb;EAxEH;IA0EI,WAAW,EACZ;;AAOH;EACE,mBAAmB;EACnB,OAAO;EACP,QAAQ;EACR,UAAU;EACV,WvD4sB+C;EkB1yB/C,alB2yB8C;EkBxyB9C,0BAAa;EqC6Fb,gBvD4sBgD;EuD3sBhD,YvDwsBgD;EuDvsBhD,mBAAmB;EACnB,0CvDosB0D;EuDnsB1D,8BAAsB,EA+DvB;EA1ED;IdjFE,+FAAiC;IACjC,4BAA4B;IAC5B,uHAAwJ,EciGvJ;EAlBH;IAoBI,WAAW;IACX,SAAS;IdtGX,+FAAiC;IACjC,4BAA4B;IAC5B,uHAAwJ,EcsGvJ;EAvBH;IA4BI,WAAW;IACX,YvDmrB8C;IuDlrB9C,sBAAsB;IrCvHxB,aqCwHqB;IrCrHrB,0BAAa,EqCsHZ;EAhCH;;;;IAuCI,mBAAmB;IACnB,SAAS;IACT,kBAAkB;IAClB,WAAW;IACX,sBAAsB,EACvB;EA5CH;;IA+CI,UAAU;IACV,mBAAmB,EACpB;EAjDH;;IAoDI,WAAW;IACX,oBAAoB,EACrB;EAtDH;;IAyDI,YAAa;IACb,aAAa;IACb,eAAe;IACf,mBAAmB,EACpB;EA7DH;IAkEM,iBAAiB,EAClB;EAnEL;IAuEM,iBAAiB,EAClB;;AASL;EACE,mBAAmB;EACnB,aAAa;EACb,UAAU;EACV,YAAY;EACZ,WAAW;EACX,kBAAkB;EAClB,gBAAgB;EAChB,iBAAiB;EACjB,mBAAmB,EA8BpB;EAvCD;IAYI,sBAAsB;IACtB,YAAa;IACb,aAAa;IACb,YAAY;IACZ,oBAAoB;IACpB,uBvDonB8C;IuDnnB9C,oBAAoB;IACpB,gBAAgB;IAWhB,0BAA0B;IAC1B,8BAAsB,EACvB;EAhCH;IAkCI,UAAU;IACV,YAAa;IACb,aAAa;IACb,uBvD+lB8C,EuD9lB/C;;AAMH;EACE,mBAAmB;EACnB,UAAU;EACV,WAAW;EACX,aAAa;EACb,YAAY;EACZ,kBAAkB;EAClB,qBAAqB;EACrB,YvDmlBgD;EuDllBhD,mBAAmB;EACnB,0CvDukB0D,EuDnkB3D;EAdD;IAYI,kBAAkB,EACnB;;AAKH;EAGE;;;;IAKI,YAAmC;IACnC,aAAoC;IACpC,kBAAwC;IACxC,gBAAuC,EACxC;EATH;;IAYI,mBAAyC,EAC1C;EAbH;;IAgBI,oBAA0C,EAC3C;EAIH;IACE,UAAU;IACV,WAAW;IACX,qBAAqB,EACtB;EAGD;IACE,aAAa,EACd,EAAA;;ACpQH;ElDOI,aAAa;EACb,eAAe,EAChB;;AkDTH;ElDWI,YAAY,EACb;;AkDTH;ECRE,eAAe;EACf,kBAAkB;EAClB,mBAAmB,EDQpB;;AACD;EACE,wBAAwB,EACzB;;AACD;EACE,uBAAuB,EACxB;;AAOD;EACE,yBAAyB,EAC1B;;AACD;EACE,0BAA0B,EAC3B;;AACD;EACE,mBAAmB,EACpB;;AACD;EEzBE,YAAY;EACZ,mBAAmB;EACnB,kBAAkB;EAClB,8BAA8B;EAC9B,UAAU,EFuBX;;AAOD;EACE,yBAAyB,EAC1B;;AAMD;EACE,gBAAgB,EACjB;;AGjCC;EACE,oBAAoB,EAAA;;ACNtB;EACE,yBAAyB,EAC1B;;AAFD;EACE,yBAAyB,EAC1B;;AAFD;EACE,yBAAyB,EAC1B;;AAFD;EACE,yBAAyB,EAC1B;;ADiBH;;;;;;;;;;;;EAYE,yBAAyB,EAC1B;;AAED;EC5CE;IACE,0BAA0B,EAC3B;EACD;IAAE,0BAA0B,EAAI;EAChC;IAAE,8BAA8B,EAAI;EACpC;;IAAE,+BAA+B,EAAI,EAAA;;AD2CrC;EADF;IAEI,0BAA0B,EAE7B,EAAA;;AAEC;EADF;IAEI,2BAA2B,EAE9B,EAAA;;AAEC;EADF;IAEI,iCAAiC,EAEpC,EAAA;;AAED;EC/DE;IACE,0BAA0B,EAC3B;EACD;IAAE,0BAA0B,EAAI;EAChC;IAAE,8BAA8B,EAAI;EACpC;;IAAE,+BAA+B,EAAI,EAAA;;AD8DrC;EADF;IAEI,0BAA0B,EAE7B,EAAA;;AAEC;EADF;IAEI,2BAA2B,EAE9B,EAAA;;AAEC;EADF;IAEI,iCAAiC,EAEpC,EAAA;;AAED;EClFE;IACE,0BAA0B,EAC3B;EACD;IAAE,0BAA0B,EAAI;EAChC;IAAE,8BAA8B,EAAI;EACpC;;IAAE,+BAA+B,EAAI,EAAA;;ADiFrC;EADF;IAEI,0BAA0B,EAE7B,EAAA;;AAEC;EADF;IAEI,2BAA2B,EAE9B,EAAA;;AAEC;EADF;IAEI,iCAAiC,EAEpC,EAAA;;AAED;ECrGE;IACE,0BAA0B,EAC3B;EACD;IAAE,0BAA0B,EAAI;EAChC;IAAE,8BAA8B,EAAI;EACpC;;IAAE,+BAA+B,EAAI,EAAA;;ADoGrC;EADF;IAEI,0BAA0B,EAE7B,EAAA;;AAEC;EADF;IAEI,2BAA2B,EAE9B,EAAA;;AAEC;EADF;IAEI,iCAAiC,EAEpC,EAAA;;AAED;EC9GE;IACE,yBAAyB,EAC1B,EAAA;;ADgHH;EClHE;IACE,yBAAyB,EAC1B,EAAA;;ADoHH;ECtHE;IACE,yBAAyB,EAC1B,EAAA;;ADwHH;EC1HE;IACE,yBAAyB,EAC1B,EAAA;;AAFD;EACE,yBAAyB,EAC1B;;ADqIH;ECjJE;IACE,0BAA0B,EAC3B;EACD;IAAE,0BAA0B,EAAI;EAChC;IAAE,8BAA8B,EAAI;EACpC;;IAAE,+BAA+B,EAAI,EAAA;;AD+IvC;EACE,yBAAyB,EAK1B;EAHC;IAHF;MAII,0BAA0B,EAE7B,EAAA;;AACD;EACE,yBAAyB,EAK1B;EAHC;IAHF;MAII,2BAA2B,EAE9B,EAAA;;AACD;EACE,yBAAyB,EAK1B;EAHC;IAHF;MAII,iCAAiC,EAEpC,EAAA;;AAED;EChKE;IACE,yBAAyB,EAC1B,EAAA;;AClBH;;;;GAIG;AAEH,mBAAmB;AAEnB;EACE,kBAAkB;EAClB,uBAAuB,EACxB;;AAED;EACE;IACE,iBAAiB,EAClB,EAAA;;AAGH;EACE,gBAAgB,EACjB;;AAED;EACE,YAAY;EACZ,WAAW;EACX,uBAAuB,EACxB;;AAED;EACE,gBAAgB;EAChB,oBAAoB,EACrB;;AAED;EACE;IACE,oBAAoB,EACrB;EACD;IACE,cAAc,EACf,EAAA;;AAGH,oBAAoB;AAEpB;EACE,gBAAgB,EAyCjB;EA1CD;IAIM,sBAAsB;IACtB,YAAY,EAWb;IAhBL;MAOQ,kBAAkB;MAClB,qBAAqB;MACrB,kBAAkB;MAClB,YAAY,EAKb;MAfP;QAYU,YAAY;QACZ,uBAAuB,EACxB;EAdT;IAmBQ,YAAY;IACZ,uBAAuB,EAKxB;IAzBP;MAsBU,YAAY;MACZ,uBAAuB,EACxB;EAxBT;IA2BQ,YAAY;IACZ,mBAAmB;IACnB,cAAc;IACd,sCAAsB;IACtB,0BAA0B;IAC1B,2BAA2B;IAC3B,uBAAuB;IAEvB,4CAA2B,EAI5B;IAvCP;MAqCU,oBAAoB,EACrB;;AAMT;EACE,WAAW;EACX,kBAAkB;EAClB,mBAAmB;EACnB,iBAAiB,EAClB;;AAED;EAEI,aAAa;EACb,6CAA6B,EAK9B;EARH;IAKM,kBAAkB;IAClB,qBAAqB,EACtB;;AAPL;EAUI,cAAc,EACf;;AAGH;EACE,aAAa,EACd;;AAED,qBAAqB;AAErB;EACE;IACE,gBAAgB;IAChB,UAAU;IACV,YAAY;IACZ,aAAa;IACb,oBAAoB;IACpB,aAAa;IACb,iBAAiB;IACjB,iBAAiB;IACjB,uBAAuB;IACvB,UAAU;IACV,mBAAmB;IACnB,qBAAqB,EAUtB;IAtBD;MAcI,aAAa,EACd;IAfH;MAkBM,cAAc;MACd,kCAAkC,EACnC,EAAA;;AAKP;EACE,WAAW,EAUZ;EAXD;IAGI,eAAe;IACf,6BAA6B;IAC7B,sBAAsB;IACtB,YAAY,EAIb;IAVH;MAQM,YAAY,EACb;;AAIL,2BAA2B;AAE3B;EACE,eAAe;EACf,cAAc,EACf;;AAED;EACE,YAAY;EACZ,aAAa,EACd;;AAED,2BAA2B;AAE3B;EACE,gBAAgB,EACjB;;AAED;EACE,sBAAsB,EAcvB;EAfD;IAIM,sBAAsB;IACtB,YAAY;IACZ,0BAA0B,EAC3B;EAPL;IASM,eAAe,EAIhB;IAbL;MAWQ,eAAe,EAChB;;AAKP;EACE,sBAAsB,EAcvB;EAfD;IAIM,sBAAsB;IACtB,YAAY;IACZ,0BAA0B,EAC3B;EAPL;IASM,eAAe,EAIhB;IAbL;MAWQ,eAAe,EAChB;;AAKP;EACE,sBAAsB,EAcvB;EAfD;IAIM,sBAAsB;IACtB,YAAY;IACZ,0BAA0B,EAC3B;EAPL;IASM,eAAe,EAIhB;IAbL;MAWQ,eAAe,EAChB;;AAKP;EACE,mBAAmB,EACpB","file":"app.css","sourcesContent":["@charset \"UTF-8\";\n@import url(https://fonts.googleapis.com/css?family=Lato);\n/*!\n * Bootstrap v3.3.6 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml {\n font-family: sans-serif;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%; }\n\nbody {\n margin: 0; }\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block; }\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block;\n vertical-align: baseline; }\n\naudio:not([controls]) {\n display: none;\n height: 0; }\n\n[hidden],\ntemplate {\n display: none; }\n\na {\n background-color: transparent; }\n\na:active,\na:hover {\n outline: 0; }\n\nabbr[title] {\n border-bottom: 1px dotted; }\n\nb,\nstrong {\n font-weight: bold; }\n\ndfn {\n font-style: italic; }\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0; }\n\nmark {\n background: #ff0;\n color: #000; }\n\nsmall {\n font-size: 80%; }\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline; }\n\nsup {\n top: -0.5em; }\n\nsub {\n bottom: -0.25em; }\n\nimg {\n border: 0; }\n\nsvg:not(:root) {\n overflow: hidden; }\n\nfigure {\n margin: 1em 40px; }\n\nhr {\n box-sizing: content-box;\n height: 0; }\n\npre {\n overflow: auto; }\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em; }\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit;\n font: inherit;\n margin: 0; }\n\nbutton {\n overflow: visible; }\n\nbutton,\nselect {\n text-transform: none; }\n\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button;\n cursor: pointer; }\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default; }\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0; }\n\ninput {\n line-height: normal; }\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box;\n padding: 0; }\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto; }\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield;\n box-sizing: content-box; }\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none; }\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em; }\n\nlegend {\n border: 0;\n padding: 0; }\n\ntextarea {\n overflow: auto; }\n\noptgroup {\n font-weight: bold; }\n\ntable {\n border-collapse: collapse;\n border-spacing: 0; }\n\ntd,\nth {\n padding: 0; }\n\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important;\n box-shadow: none !important;\n text-shadow: none !important; }\n a,\n a:visited {\n text-decoration: underline; }\n a[href]:after {\n content: \" (\" attr(href) \")\"; }\n abbr[title]:after {\n content: \" (\" attr(title) \")\"; }\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\"; }\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid; }\n thead {\n display: table-header-group; }\n tr,\n img {\n page-break-inside: avoid; }\n img {\n max-width: 100% !important; }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3; }\n h2,\n h3 {\n page-break-after: avoid; }\n .navbar {\n display: none; }\n .btn > .caret,\n .dropup > .btn > .caret {\n border-top-color: #000 !important; }\n .label {\n border: 1px solid #000; }\n .table {\n border-collapse: collapse !important; }\n .table td,\n .table th {\n background-color: #fff !important; }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #ddd !important; } }\n\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url(\"../fonts/bootstrap/glyphicons-halflings-regular.eot\");\n src: url(\"../fonts/bootstrap/glyphicons-halflings-regular.eot?#iefix\") format(\"embedded-opentype\"), url(\"../fonts/bootstrap/glyphicons-halflings-regular.woff2\") format(\"woff2\"), url(\"../fonts/bootstrap/glyphicons-halflings-regular.woff\") format(\"woff\"), url(\"../fonts/bootstrap/glyphicons-halflings-regular.ttf\") format(\"truetype\"), url(\"../fonts/bootstrap/glyphicons-halflings-regular.svg#glyphicons_halflingsregular\") format(\"svg\"); }\n\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale; }\n\n.glyphicon-asterisk:before {\n content: \"\\002a\"; }\n\n.glyphicon-plus:before {\n content: \"\\002b\"; }\n\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n content: \"\\20ac\"; }\n\n.glyphicon-minus:before {\n content: \"\\2212\"; }\n\n.glyphicon-cloud:before {\n content: \"\\2601\"; }\n\n.glyphicon-envelope:before {\n content: \"\\2709\"; }\n\n.glyphicon-pencil:before {\n content: \"\\270f\"; }\n\n.glyphicon-glass:before {\n content: \"\\e001\"; }\n\n.glyphicon-music:before {\n content: \"\\e002\"; }\n\n.glyphicon-search:before {\n content: \"\\e003\"; }\n\n.glyphicon-heart:before {\n content: \"\\e005\"; }\n\n.glyphicon-star:before {\n content: \"\\e006\"; }\n\n.glyphicon-star-empty:before {\n content: \"\\e007\"; }\n\n.glyphicon-user:before {\n content: \"\\e008\"; }\n\n.glyphicon-film:before {\n content: \"\\e009\"; }\n\n.glyphicon-th-large:before {\n content: \"\\e010\"; }\n\n.glyphicon-th:before {\n content: \"\\e011\"; }\n\n.glyphicon-th-list:before {\n content: \"\\e012\"; }\n\n.glyphicon-ok:before {\n content: \"\\e013\"; }\n\n.glyphicon-remove:before {\n content: \"\\e014\"; }\n\n.glyphicon-zoom-in:before {\n content: \"\\e015\"; }\n\n.glyphicon-zoom-out:before {\n content: \"\\e016\"; }\n\n.glyphicon-off:before {\n content: \"\\e017\"; }\n\n.glyphicon-signal:before {\n content: \"\\e018\"; }\n\n.glyphicon-cog:before {\n content: \"\\e019\"; }\n\n.glyphicon-trash:before {\n content: \"\\e020\"; }\n\n.glyphicon-home:before {\n content: \"\\e021\"; }\n\n.glyphicon-file:before {\n content: \"\\e022\"; }\n\n.glyphicon-time:before {\n content: \"\\e023\"; }\n\n.glyphicon-road:before {\n content: \"\\e024\"; }\n\n.glyphicon-download-alt:before {\n content: \"\\e025\"; }\n\n.glyphicon-download:before {\n content: \"\\e026\"; }\n\n.glyphicon-upload:before {\n content: \"\\e027\"; }\n\n.glyphicon-inbox:before {\n content: \"\\e028\"; }\n\n.glyphicon-play-circle:before {\n content: \"\\e029\"; }\n\n.glyphicon-repeat:before {\n content: \"\\e030\"; }\n\n.glyphicon-refresh:before {\n content: \"\\e031\"; }\n\n.glyphicon-list-alt:before {\n content: \"\\e032\"; }\n\n.glyphicon-lock:before {\n content: \"\\e033\"; }\n\n.glyphicon-flag:before {\n content: \"\\e034\"; }\n\n.glyphicon-headphones:before {\n content: \"\\e035\"; }\n\n.glyphicon-volume-off:before {\n content: \"\\e036\"; }\n\n.glyphicon-volume-down:before {\n content: \"\\e037\"; }\n\n.glyphicon-volume-up:before {\n content: \"\\e038\"; }\n\n.glyphicon-qrcode:before {\n content: \"\\e039\"; }\n\n.glyphicon-barcode:before {\n content: \"\\e040\"; }\n\n.glyphicon-tag:before {\n content: \"\\e041\"; }\n\n.glyphicon-tags:before {\n content: \"\\e042\"; }\n\n.glyphicon-book:before {\n content: \"\\e043\"; }\n\n.glyphicon-bookmark:before {\n content: \"\\e044\"; }\n\n.glyphicon-print:before {\n content: \"\\e045\"; }\n\n.glyphicon-camera:before {\n content: \"\\e046\"; }\n\n.glyphicon-font:before {\n content: \"\\e047\"; }\n\n.glyphicon-bold:before {\n content: \"\\e048\"; }\n\n.glyphicon-italic:before {\n content: \"\\e049\"; }\n\n.glyphicon-text-height:before {\n content: \"\\e050\"; }\n\n.glyphicon-text-width:before {\n content: \"\\e051\"; }\n\n.glyphicon-align-left:before {\n content: \"\\e052\"; }\n\n.glyphicon-align-center:before {\n content: \"\\e053\"; }\n\n.glyphicon-align-right:before {\n content: \"\\e054\"; }\n\n.glyphicon-align-justify:before {\n content: \"\\e055\"; }\n\n.glyphicon-list:before {\n content: \"\\e056\"; }\n\n.glyphicon-indent-left:before {\n content: \"\\e057\"; }\n\n.glyphicon-indent-right:before {\n content: \"\\e058\"; }\n\n.glyphicon-facetime-video:before {\n content: \"\\e059\"; }\n\n.glyphicon-picture:before {\n content: \"\\e060\"; }\n\n.glyphicon-map-marker:before {\n content: \"\\e062\"; }\n\n.glyphicon-adjust:before {\n content: \"\\e063\"; }\n\n.glyphicon-tint:before {\n content: \"\\e064\"; }\n\n.glyphicon-edit:before {\n content: \"\\e065\"; }\n\n.glyphicon-share:before {\n content: \"\\e066\"; }\n\n.glyphicon-check:before {\n content: \"\\e067\"; }\n\n.glyphicon-move:before {\n content: \"\\e068\"; }\n\n.glyphicon-step-backward:before {\n content: \"\\e069\"; }\n\n.glyphicon-fast-backward:before {\n content: \"\\e070\"; }\n\n.glyphicon-backward:before {\n content: \"\\e071\"; }\n\n.glyphicon-play:before {\n content: \"\\e072\"; }\n\n.glyphicon-pause:before {\n content: \"\\e073\"; }\n\n.glyphicon-stop:before {\n content: \"\\e074\"; }\n\n.glyphicon-forward:before {\n content: \"\\e075\"; }\n\n.glyphicon-fast-forward:before {\n content: \"\\e076\"; }\n\n.glyphicon-step-forward:before {\n content: \"\\e077\"; }\n\n.glyphicon-eject:before {\n content: \"\\e078\"; }\n\n.glyphicon-chevron-left:before {\n content: \"\\e079\"; }\n\n.glyphicon-chevron-right:before {\n content: \"\\e080\"; }\n\n.glyphicon-plus-sign:before {\n content: \"\\e081\"; }\n\n.glyphicon-minus-sign:before {\n content: \"\\e082\"; }\n\n.glyphicon-remove-sign:before {\n content: \"\\e083\"; }\n\n.glyphicon-ok-sign:before {\n content: \"\\e084\"; }\n\n.glyphicon-question-sign:before {\n content: \"\\e085\"; }\n\n.glyphicon-info-sign:before {\n content: \"\\e086\"; }\n\n.glyphicon-screenshot:before {\n content: \"\\e087\"; }\n\n.glyphicon-remove-circle:before {\n content: \"\\e088\"; }\n\n.glyphicon-ok-circle:before {\n content: \"\\e089\"; }\n\n.glyphicon-ban-circle:before {\n content: \"\\e090\"; }\n\n.glyphicon-arrow-left:before {\n content: \"\\e091\"; }\n\n.glyphicon-arrow-right:before {\n content: \"\\e092\"; }\n\n.glyphicon-arrow-up:before {\n content: \"\\e093\"; }\n\n.glyphicon-arrow-down:before {\n content: \"\\e094\"; }\n\n.glyphicon-share-alt:before {\n content: \"\\e095\"; }\n\n.glyphicon-resize-full:before {\n content: \"\\e096\"; }\n\n.glyphicon-resize-small:before {\n content: \"\\e097\"; }\n\n.glyphicon-exclamation-sign:before {\n content: \"\\e101\"; }\n\n.glyphicon-gift:before {\n content: \"\\e102\"; }\n\n.glyphicon-leaf:before {\n content: \"\\e103\"; }\n\n.glyphicon-fire:before {\n content: \"\\e104\"; }\n\n.glyphicon-eye-open:before {\n content: \"\\e105\"; }\n\n.glyphicon-eye-close:before {\n content: \"\\e106\"; }\n\n.glyphicon-warning-sign:before {\n content: \"\\e107\"; }\n\n.glyphicon-plane:before {\n content: \"\\e108\"; }\n\n.glyphicon-calendar:before {\n content: \"\\e109\"; }\n\n.glyphicon-random:before {\n content: \"\\e110\"; }\n\n.glyphicon-comment:before {\n content: \"\\e111\"; }\n\n.glyphicon-magnet:before {\n content: \"\\e112\"; }\n\n.glyphicon-chevron-up:before {\n content: \"\\e113\"; }\n\n.glyphicon-chevron-down:before {\n content: \"\\e114\"; }\n\n.glyphicon-retweet:before {\n content: \"\\e115\"; }\n\n.glyphicon-shopping-cart:before {\n content: \"\\e116\"; }\n\n.glyphicon-folder-close:before {\n content: \"\\e117\"; }\n\n.glyphicon-folder-open:before {\n content: \"\\e118\"; }\n\n.glyphicon-resize-vertical:before {\n content: \"\\e119\"; }\n\n.glyphicon-resize-horizontal:before {\n content: \"\\e120\"; }\n\n.glyphicon-hdd:before {\n content: \"\\e121\"; }\n\n.glyphicon-bullhorn:before {\n content: \"\\e122\"; }\n\n.glyphicon-bell:before {\n content: \"\\e123\"; }\n\n.glyphicon-certificate:before {\n content: \"\\e124\"; }\n\n.glyphicon-thumbs-up:before {\n content: \"\\e125\"; }\n\n.glyphicon-thumbs-down:before {\n content: \"\\e126\"; }\n\n.glyphicon-hand-right:before {\n content: \"\\e127\"; }\n\n.glyphicon-hand-left:before {\n content: \"\\e128\"; }\n\n.glyphicon-hand-up:before {\n content: \"\\e129\"; }\n\n.glyphicon-hand-down:before {\n content: \"\\e130\"; }\n\n.glyphicon-circle-arrow-right:before {\n content: \"\\e131\"; }\n\n.glyphicon-circle-arrow-left:before {\n content: \"\\e132\"; }\n\n.glyphicon-circle-arrow-up:before {\n content: \"\\e133\"; }\n\n.glyphicon-circle-arrow-down:before {\n content: \"\\e134\"; }\n\n.glyphicon-globe:before {\n content: \"\\e135\"; }\n\n.glyphicon-wrench:before {\n content: \"\\e136\"; }\n\n.glyphicon-tasks:before {\n content: \"\\e137\"; }\n\n.glyphicon-filter:before {\n content: \"\\e138\"; }\n\n.glyphicon-briefcase:before {\n content: \"\\e139\"; }\n\n.glyphicon-fullscreen:before {\n content: \"\\e140\"; }\n\n.glyphicon-dashboard:before {\n content: \"\\e141\"; }\n\n.glyphicon-paperclip:before {\n content: \"\\e142\"; }\n\n.glyphicon-heart-empty:before {\n content: \"\\e143\"; }\n\n.glyphicon-link:before {\n content: \"\\e144\"; }\n\n.glyphicon-phone:before {\n content: \"\\e145\"; }\n\n.glyphicon-pushpin:before {\n content: \"\\e146\"; }\n\n.glyphicon-usd:before {\n content: \"\\e148\"; }\n\n.glyphicon-gbp:before {\n content: \"\\e149\"; }\n\n.glyphicon-sort:before {\n content: \"\\e150\"; }\n\n.glyphicon-sort-by-alphabet:before {\n content: \"\\e151\"; }\n\n.glyphicon-sort-by-alphabet-alt:before {\n content: \"\\e152\"; }\n\n.glyphicon-sort-by-order:before {\n content: \"\\e153\"; }\n\n.glyphicon-sort-by-order-alt:before {\n content: \"\\e154\"; }\n\n.glyphicon-sort-by-attributes:before {\n content: \"\\e155\"; }\n\n.glyphicon-sort-by-attributes-alt:before {\n content: \"\\e156\"; }\n\n.glyphicon-unchecked:before {\n content: \"\\e157\"; }\n\n.glyphicon-expand:before {\n content: \"\\e158\"; }\n\n.glyphicon-collapse-down:before {\n content: \"\\e159\"; }\n\n.glyphicon-collapse-up:before {\n content: \"\\e160\"; }\n\n.glyphicon-log-in:before {\n content: \"\\e161\"; }\n\n.glyphicon-flash:before {\n content: \"\\e162\"; }\n\n.glyphicon-log-out:before {\n content: \"\\e163\"; }\n\n.glyphicon-new-window:before {\n content: \"\\e164\"; }\n\n.glyphicon-record:before {\n content: \"\\e165\"; }\n\n.glyphicon-save:before {\n content: \"\\e166\"; }\n\n.glyphicon-open:before {\n content: \"\\e167\"; }\n\n.glyphicon-saved:before {\n content: \"\\e168\"; }\n\n.glyphicon-import:before {\n content: \"\\e169\"; }\n\n.glyphicon-export:before {\n content: \"\\e170\"; }\n\n.glyphicon-send:before {\n content: \"\\e171\"; }\n\n.glyphicon-floppy-disk:before {\n content: \"\\e172\"; }\n\n.glyphicon-floppy-saved:before {\n content: \"\\e173\"; }\n\n.glyphicon-floppy-remove:before {\n content: \"\\e174\"; }\n\n.glyphicon-floppy-save:before {\n content: \"\\e175\"; }\n\n.glyphicon-floppy-open:before {\n content: \"\\e176\"; }\n\n.glyphicon-credit-card:before {\n content: \"\\e177\"; }\n\n.glyphicon-transfer:before {\n content: \"\\e178\"; }\n\n.glyphicon-cutlery:before {\n content: \"\\e179\"; }\n\n.glyphicon-header:before {\n content: \"\\e180\"; }\n\n.glyphicon-compressed:before {\n content: \"\\e181\"; }\n\n.glyphicon-earphone:before {\n content: \"\\e182\"; }\n\n.glyphicon-phone-alt:before {\n content: \"\\e183\"; }\n\n.glyphicon-tower:before {\n content: \"\\e184\"; }\n\n.glyphicon-stats:before {\n content: \"\\e185\"; }\n\n.glyphicon-sd-video:before {\n content: \"\\e186\"; }\n\n.glyphicon-hd-video:before {\n content: \"\\e187\"; }\n\n.glyphicon-subtitles:before {\n content: \"\\e188\"; }\n\n.glyphicon-sound-stereo:before {\n content: \"\\e189\"; }\n\n.glyphicon-sound-dolby:before {\n content: \"\\e190\"; }\n\n.glyphicon-sound-5-1:before {\n content: \"\\e191\"; }\n\n.glyphicon-sound-6-1:before {\n content: \"\\e192\"; }\n\n.glyphicon-sound-7-1:before {\n content: \"\\e193\"; }\n\n.glyphicon-copyright-mark:before {\n content: \"\\e194\"; }\n\n.glyphicon-registration-mark:before {\n content: \"\\e195\"; }\n\n.glyphicon-cloud-download:before {\n content: \"\\e197\"; }\n\n.glyphicon-cloud-upload:before {\n content: \"\\e198\"; }\n\n.glyphicon-tree-conifer:before {\n content: \"\\e199\"; }\n\n.glyphicon-tree-deciduous:before {\n content: \"\\e200\"; }\n\n.glyphicon-cd:before {\n content: \"\\e201\"; }\n\n.glyphicon-save-file:before {\n content: \"\\e202\"; }\n\n.glyphicon-open-file:before {\n content: \"\\e203\"; }\n\n.glyphicon-level-up:before {\n content: \"\\e204\"; }\n\n.glyphicon-copy:before {\n content: \"\\e205\"; }\n\n.glyphicon-paste:before {\n content: \"\\e206\"; }\n\n.glyphicon-alert:before {\n content: \"\\e209\"; }\n\n.glyphicon-equalizer:before {\n content: \"\\e210\"; }\n\n.glyphicon-king:before {\n content: \"\\e211\"; }\n\n.glyphicon-queen:before {\n content: \"\\e212\"; }\n\n.glyphicon-pawn:before {\n content: \"\\e213\"; }\n\n.glyphicon-bishop:before {\n content: \"\\e214\"; }\n\n.glyphicon-knight:before {\n content: \"\\e215\"; }\n\n.glyphicon-baby-formula:before {\n content: \"\\e216\"; }\n\n.glyphicon-tent:before {\n content: \"\\26fa\"; }\n\n.glyphicon-blackboard:before {\n content: \"\\e218\"; }\n\n.glyphicon-bed:before {\n content: \"\\e219\"; }\n\n.glyphicon-apple:before {\n content: \"\\f8ff\"; }\n\n.glyphicon-erase:before {\n content: \"\\e221\"; }\n\n.glyphicon-hourglass:before {\n content: \"\\231b\"; }\n\n.glyphicon-lamp:before {\n content: \"\\e223\"; }\n\n.glyphicon-duplicate:before {\n content: \"\\e224\"; }\n\n.glyphicon-piggy-bank:before {\n content: \"\\e225\"; }\n\n.glyphicon-scissors:before {\n content: \"\\e226\"; }\n\n.glyphicon-bitcoin:before {\n content: \"\\e227\"; }\n\n.glyphicon-btc:before {\n content: \"\\e227\"; }\n\n.glyphicon-xbt:before {\n content: \"\\e227\"; }\n\n.glyphicon-yen:before {\n content: \"\\00a5\"; }\n\n.glyphicon-jpy:before {\n content: \"\\00a5\"; }\n\n.glyphicon-ruble:before {\n content: \"\\20bd\"; }\n\n.glyphicon-rub:before {\n content: \"\\20bd\"; }\n\n.glyphicon-scale:before {\n content: \"\\e230\"; }\n\n.glyphicon-ice-lolly:before {\n content: \"\\e231\"; }\n\n.glyphicon-ice-lolly-tasted:before {\n content: \"\\e232\"; }\n\n.glyphicon-education:before {\n content: \"\\e233\"; }\n\n.glyphicon-option-horizontal:before {\n content: \"\\e234\"; }\n\n.glyphicon-option-vertical:before {\n content: \"\\e235\"; }\n\n.glyphicon-menu-hamburger:before {\n content: \"\\e236\"; }\n\n.glyphicon-modal-window:before {\n content: \"\\e237\"; }\n\n.glyphicon-oil:before {\n content: \"\\e238\"; }\n\n.glyphicon-grain:before {\n content: \"\\e239\"; }\n\n.glyphicon-sunglasses:before {\n content: \"\\e240\"; }\n\n.glyphicon-text-size:before {\n content: \"\\e241\"; }\n\n.glyphicon-text-color:before {\n content: \"\\e242\"; }\n\n.glyphicon-text-background:before {\n content: \"\\e243\"; }\n\n.glyphicon-object-align-top:before {\n content: \"\\e244\"; }\n\n.glyphicon-object-align-bottom:before {\n content: \"\\e245\"; }\n\n.glyphicon-object-align-horizontal:before {\n content: \"\\e246\"; }\n\n.glyphicon-object-align-left:before {\n content: \"\\e247\"; }\n\n.glyphicon-object-align-vertical:before {\n content: \"\\e248\"; }\n\n.glyphicon-object-align-right:before {\n content: \"\\e249\"; }\n\n.glyphicon-triangle-right:before {\n content: \"\\e250\"; }\n\n.glyphicon-triangle-left:before {\n content: \"\\e251\"; }\n\n.glyphicon-triangle-bottom:before {\n content: \"\\e252\"; }\n\n.glyphicon-triangle-top:before {\n content: \"\\e253\"; }\n\n.glyphicon-console:before {\n content: \"\\e254\"; }\n\n.glyphicon-superscript:before {\n content: \"\\e255\"; }\n\n.glyphicon-subscript:before {\n content: \"\\e256\"; }\n\n.glyphicon-menu-left:before {\n content: \"\\e257\"; }\n\n.glyphicon-menu-right:before {\n content: \"\\e258\"; }\n\n.glyphicon-menu-down:before {\n content: \"\\e259\"; }\n\n.glyphicon-menu-up:before {\n content: \"\\e260\"; }\n\n* {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box; }\n\n*:before,\n*:after {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box; }\n\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: transparent; }\n\nbody {\n font-family: \"Lato\", sans-serif;\n font-size: 14px;\n line-height: 1.428571429;\n color: #333333;\n background-color: #fff; }\n\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit; }\n\na {\n color: #337ab7;\n text-decoration: none; }\n a:hover, a:focus {\n color: #23527c;\n text-decoration: underline; }\n a:focus {\n outline: thin dotted;\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px; }\n\nfigure {\n margin: 0; }\n\nimg {\n vertical-align: middle; }\n\n.img-responsive {\n display: block;\n max-width: 100%;\n height: auto; }\n\n.img-rounded {\n border-radius: 6px; }\n\n.img-thumbnail {\n padding: 4px;\n line-height: 1.428571429;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: all 0.2s ease-in-out;\n -o-transition: all 0.2s ease-in-out;\n transition: all 0.2s ease-in-out;\n display: inline-block;\n max-width: 100%;\n height: auto; }\n\n.img-circle {\n border-radius: 50%; }\n\nhr {\n margin-top: 20px;\n margin-bottom: 20px;\n border: 0;\n border-top: 1px solid #eeeeee; }\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0; }\n\n.sr-only-focusable:active, .sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto; }\n\n[role=\"button\"] {\n cursor: pointer; }\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit; }\n h1 small,\n h1 .small, h2 small,\n h2 .small, h3 small,\n h3 .small, h4 small,\n h4 .small, h5 small,\n h5 .small, h6 small,\n h6 .small,\n .h1 small,\n .h1 .small, .h2 small,\n .h2 .small, .h3 small,\n .h3 .small, .h4 small,\n .h4 .small, .h5 small,\n .h5 .small, .h6 small,\n .h6 .small {\n font-weight: normal;\n line-height: 1;\n color: #777777; }\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n margin-top: 20px;\n margin-bottom: 10px; }\n h1 small,\n h1 .small, .h1 small,\n .h1 .small,\n h2 small,\n h2 .small, .h2 small,\n .h2 .small,\n h3 small,\n h3 .small, .h3 small,\n .h3 .small {\n font-size: 65%; }\n\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n margin-top: 10px;\n margin-bottom: 10px; }\n h4 small,\n h4 .small, .h4 small,\n .h4 .small,\n h5 small,\n h5 .small, .h5 small,\n .h5 .small,\n h6 small,\n h6 .small, .h6 small,\n .h6 .small {\n font-size: 75%; }\n\nh1, .h1 {\n font-size: 36px; }\n\nh2, .h2 {\n font-size: 30px; }\n\nh3, .h3 {\n font-size: 24px; }\n\nh4, .h4 {\n font-size: 18px; }\n\nh5, .h5 {\n font-size: 14px; }\n\nh6, .h6 {\n font-size: 12px; }\n\np {\n margin: 0 0 10px; }\n\n.lead {\n margin-bottom: 20px;\n font-size: 16px;\n font-weight: 300;\n line-height: 1.4; }\n @media (min-width: 768px) {\n .lead {\n font-size: 21px; } }\n\nsmall,\n.small {\n font-size: 85%; }\n\nmark,\n.mark {\n background-color: #fcf8e3;\n padding: .2em; }\n\n.text-left {\n text-align: left; }\n\n.text-right {\n text-align: right; }\n\n.text-center {\n text-align: center; }\n\n.text-justify {\n text-align: justify; }\n\n.text-nowrap {\n white-space: nowrap; }\n\n.text-lowercase {\n text-transform: lowercase; }\n\n.text-uppercase, .initialism {\n text-transform: uppercase; }\n\n.text-capitalize {\n text-transform: capitalize; }\n\n.text-muted {\n color: #777777; }\n\n.text-primary {\n color: #337ab7; }\n\na.text-primary:hover,\na.text-primary:focus {\n color: #286090; }\n\n.text-success {\n color: #3c763d; }\n\na.text-success:hover,\na.text-success:focus {\n color: #2b542c; }\n\n.text-info {\n color: #31708f; }\n\na.text-info:hover,\na.text-info:focus {\n color: #245269; }\n\n.text-warning {\n color: #8a6d3b; }\n\na.text-warning:hover,\na.text-warning:focus {\n color: #66512c; }\n\n.text-danger {\n color: #a94442; }\n\na.text-danger:hover,\na.text-danger:focus {\n color: #843534; }\n\n.bg-primary {\n color: #fff; }\n\n.bg-primary {\n background-color: #337ab7; }\n\na.bg-primary:hover,\na.bg-primary:focus {\n background-color: #286090; }\n\n.bg-success {\n background-color: #dff0d8; }\n\na.bg-success:hover,\na.bg-success:focus {\n background-color: #c1e2b3; }\n\n.bg-info {\n background-color: #d9edf7; }\n\na.bg-info:hover,\na.bg-info:focus {\n background-color: #afd9ee; }\n\n.bg-warning {\n background-color: #fcf8e3; }\n\na.bg-warning:hover,\na.bg-warning:focus {\n background-color: #f7ecb5; }\n\n.bg-danger {\n background-color: #f2dede; }\n\na.bg-danger:hover,\na.bg-danger:focus {\n background-color: #e4b9b9; }\n\n.page-header {\n padding-bottom: 9px;\n margin: 40px 0 20px;\n border-bottom: 1px solid #eeeeee; }\n\nul,\nol {\n margin-top: 0;\n margin-bottom: 10px; }\n ul ul,\n ul ol,\n ol ul,\n ol ol {\n margin-bottom: 0; }\n\n.list-unstyled {\n padding-left: 0;\n list-style: none; }\n\n.list-inline {\n padding-left: 0;\n list-style: none;\n margin-left: -5px; }\n .list-inline > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px; }\n\ndl {\n margin-top: 0;\n margin-bottom: 20px; }\n\ndt,\ndd {\n line-height: 1.428571429; }\n\ndt {\n font-weight: bold; }\n\ndd {\n margin-left: 0; }\n\n.dl-horizontal dd:before, .dl-horizontal dd:after {\n content: \" \";\n display: table; }\n\n.dl-horizontal dd:after {\n clear: both; }\n\n@media (min-width: 768px) {\n .dl-horizontal dt {\n float: left;\n width: 160px;\n clear: left;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap; }\n .dl-horizontal dd {\n margin-left: 180px; } }\n\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted #777777; }\n\n.initialism {\n font-size: 90%; }\n\nblockquote {\n padding: 10px 20px;\n margin: 0 0 20px;\n font-size: 17.5px;\n border-left: 5px solid #eeeeee; }\n blockquote p:last-child,\n blockquote ul:last-child,\n blockquote ol:last-child {\n margin-bottom: 0; }\n blockquote footer,\n blockquote small,\n blockquote .small {\n display: block;\n font-size: 80%;\n line-height: 1.428571429;\n color: #777777; }\n blockquote footer:before,\n blockquote small:before,\n blockquote .small:before {\n content: '\\2014 \\00A0'; }\n\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid #eeeeee;\n border-left: 0;\n text-align: right; }\n .blockquote-reverse footer:before,\n .blockquote-reverse small:before,\n .blockquote-reverse .small:before,\n blockquote.pull-right footer:before,\n blockquote.pull-right small:before,\n blockquote.pull-right .small:before {\n content: ''; }\n .blockquote-reverse footer:after,\n .blockquote-reverse small:after,\n .blockquote-reverse .small:after,\n blockquote.pull-right footer:after,\n blockquote.pull-right small:after,\n blockquote.pull-right .small:after {\n content: '\\00A0 \\2014'; }\n\naddress {\n margin-bottom: 20px;\n font-style: normal;\n line-height: 1.428571429; }\n\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace; }\n\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: #c7254e;\n background-color: #f9f2f4;\n border-radius: 4px; }\n\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: #fff;\n background-color: #333;\n border-radius: 3px;\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); }\n kbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none; }\n\npre {\n display: block;\n padding: 9.5px;\n margin: 0 0 10px;\n font-size: 13px;\n line-height: 1.428571429;\n word-break: break-all;\n word-wrap: break-word;\n color: #333333;\n background-color: #f5f5f5;\n border: 1px solid #ccc;\n border-radius: 4px; }\n pre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0; }\n\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll; }\n\n.container {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px; }\n .container:before, .container:after {\n content: \" \";\n display: table; }\n .container:after {\n clear: both; }\n @media (min-width: 768px) {\n .container {\n width: 750px; } }\n @media (min-width: 992px) {\n .container {\n width: 970px; } }\n @media (min-width: 1200px) {\n .container {\n width: 1170px; } }\n\n.container-fluid {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px; }\n .container-fluid:before, .container-fluid:after {\n content: \" \";\n display: table; }\n .container-fluid:after {\n clear: both; }\n\n.row {\n margin-left: -15px;\n margin-right: -15px; }\n .row:before, .row:after {\n content: \" \";\n display: table; }\n .row:after {\n clear: both; }\n\n.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 {\n position: relative;\n min-height: 1px;\n padding-left: 15px;\n padding-right: 15px; }\n\n.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 {\n float: left; }\n\n.col-xs-1 {\n width: 8.3333333333%; }\n\n.col-xs-2 {\n width: 16.6666666667%; }\n\n.col-xs-3 {\n width: 25%; }\n\n.col-xs-4 {\n width: 33.3333333333%; }\n\n.col-xs-5 {\n width: 41.6666666667%; }\n\n.col-xs-6 {\n width: 50%; }\n\n.col-xs-7 {\n width: 58.3333333333%; }\n\n.col-xs-8 {\n width: 66.6666666667%; }\n\n.col-xs-9 {\n width: 75%; }\n\n.col-xs-10 {\n width: 83.3333333333%; }\n\n.col-xs-11 {\n width: 91.6666666667%; }\n\n.col-xs-12 {\n width: 100%; }\n\n.col-xs-pull-0 {\n right: auto; }\n\n.col-xs-pull-1 {\n right: 8.3333333333%; }\n\n.col-xs-pull-2 {\n right: 16.6666666667%; }\n\n.col-xs-pull-3 {\n right: 25%; }\n\n.col-xs-pull-4 {\n right: 33.3333333333%; }\n\n.col-xs-pull-5 {\n right: 41.6666666667%; }\n\n.col-xs-pull-6 {\n right: 50%; }\n\n.col-xs-pull-7 {\n right: 58.3333333333%; }\n\n.col-xs-pull-8 {\n right: 66.6666666667%; }\n\n.col-xs-pull-9 {\n right: 75%; }\n\n.col-xs-pull-10 {\n right: 83.3333333333%; }\n\n.col-xs-pull-11 {\n right: 91.6666666667%; }\n\n.col-xs-pull-12 {\n right: 100%; }\n\n.col-xs-push-0 {\n left: auto; }\n\n.col-xs-push-1 {\n left: 8.3333333333%; }\n\n.col-xs-push-2 {\n left: 16.6666666667%; }\n\n.col-xs-push-3 {\n left: 25%; }\n\n.col-xs-push-4 {\n left: 33.3333333333%; }\n\n.col-xs-push-5 {\n left: 41.6666666667%; }\n\n.col-xs-push-6 {\n left: 50%; }\n\n.col-xs-push-7 {\n left: 58.3333333333%; }\n\n.col-xs-push-8 {\n left: 66.6666666667%; }\n\n.col-xs-push-9 {\n left: 75%; }\n\n.col-xs-push-10 {\n left: 83.3333333333%; }\n\n.col-xs-push-11 {\n left: 91.6666666667%; }\n\n.col-xs-push-12 {\n left: 100%; }\n\n.col-xs-offset-0 {\n margin-left: 0%; }\n\n.col-xs-offset-1 {\n margin-left: 8.3333333333%; }\n\n.col-xs-offset-2 {\n margin-left: 16.6666666667%; }\n\n.col-xs-offset-3 {\n margin-left: 25%; }\n\n.col-xs-offset-4 {\n margin-left: 33.3333333333%; }\n\n.col-xs-offset-5 {\n margin-left: 41.6666666667%; }\n\n.col-xs-offset-6 {\n margin-left: 50%; }\n\n.col-xs-offset-7 {\n margin-left: 58.3333333333%; }\n\n.col-xs-offset-8 {\n margin-left: 66.6666666667%; }\n\n.col-xs-offset-9 {\n margin-left: 75%; }\n\n.col-xs-offset-10 {\n margin-left: 83.3333333333%; }\n\n.col-xs-offset-11 {\n margin-left: 91.6666666667%; }\n\n.col-xs-offset-12 {\n margin-left: 100%; }\n\n@media (min-width: 768px) {\n .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 {\n float: left; }\n .col-sm-1 {\n width: 8.3333333333%; }\n .col-sm-2 {\n width: 16.6666666667%; }\n .col-sm-3 {\n width: 25%; }\n .col-sm-4 {\n width: 33.3333333333%; }\n .col-sm-5 {\n width: 41.6666666667%; }\n .col-sm-6 {\n width: 50%; }\n .col-sm-7 {\n width: 58.3333333333%; }\n .col-sm-8 {\n width: 66.6666666667%; }\n .col-sm-9 {\n width: 75%; }\n .col-sm-10 {\n width: 83.3333333333%; }\n .col-sm-11 {\n width: 91.6666666667%; }\n .col-sm-12 {\n width: 100%; }\n .col-sm-pull-0 {\n right: auto; }\n .col-sm-pull-1 {\n right: 8.3333333333%; }\n .col-sm-pull-2 {\n right: 16.6666666667%; }\n .col-sm-pull-3 {\n right: 25%; }\n .col-sm-pull-4 {\n right: 33.3333333333%; }\n .col-sm-pull-5 {\n right: 41.6666666667%; }\n .col-sm-pull-6 {\n right: 50%; }\n .col-sm-pull-7 {\n right: 58.3333333333%; }\n .col-sm-pull-8 {\n right: 66.6666666667%; }\n .col-sm-pull-9 {\n right: 75%; }\n .col-sm-pull-10 {\n right: 83.3333333333%; }\n .col-sm-pull-11 {\n right: 91.6666666667%; }\n .col-sm-pull-12 {\n right: 100%; }\n .col-sm-push-0 {\n left: auto; }\n .col-sm-push-1 {\n left: 8.3333333333%; }\n .col-sm-push-2 {\n left: 16.6666666667%; }\n .col-sm-push-3 {\n left: 25%; }\n .col-sm-push-4 {\n left: 33.3333333333%; }\n .col-sm-push-5 {\n left: 41.6666666667%; }\n .col-sm-push-6 {\n left: 50%; }\n .col-sm-push-7 {\n left: 58.3333333333%; }\n .col-sm-push-8 {\n left: 66.6666666667%; }\n .col-sm-push-9 {\n left: 75%; }\n .col-sm-push-10 {\n left: 83.3333333333%; }\n .col-sm-push-11 {\n left: 91.6666666667%; }\n .col-sm-push-12 {\n left: 100%; }\n .col-sm-offset-0 {\n margin-left: 0%; }\n .col-sm-offset-1 {\n margin-left: 8.3333333333%; }\n .col-sm-offset-2 {\n margin-left: 16.6666666667%; }\n .col-sm-offset-3 {\n margin-left: 25%; }\n .col-sm-offset-4 {\n margin-left: 33.3333333333%; }\n .col-sm-offset-5 {\n margin-left: 41.6666666667%; }\n .col-sm-offset-6 {\n margin-left: 50%; }\n .col-sm-offset-7 {\n margin-left: 58.3333333333%; }\n .col-sm-offset-8 {\n margin-left: 66.6666666667%; }\n .col-sm-offset-9 {\n margin-left: 75%; }\n .col-sm-offset-10 {\n margin-left: 83.3333333333%; }\n .col-sm-offset-11 {\n margin-left: 91.6666666667%; }\n .col-sm-offset-12 {\n margin-left: 100%; } }\n\n@media (min-width: 992px) {\n .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 {\n float: left; }\n .col-md-1 {\n width: 8.3333333333%; }\n .col-md-2 {\n width: 16.6666666667%; }\n .col-md-3 {\n width: 25%; }\n .col-md-4 {\n width: 33.3333333333%; }\n .col-md-5 {\n width: 41.6666666667%; }\n .col-md-6 {\n width: 50%; }\n .col-md-7 {\n width: 58.3333333333%; }\n .col-md-8 {\n width: 66.6666666667%; }\n .col-md-9 {\n width: 75%; }\n .col-md-10 {\n width: 83.3333333333%; }\n .col-md-11 {\n width: 91.6666666667%; }\n .col-md-12 {\n width: 100%; }\n .col-md-pull-0 {\n right: auto; }\n .col-md-pull-1 {\n right: 8.3333333333%; }\n .col-md-pull-2 {\n right: 16.6666666667%; }\n .col-md-pull-3 {\n right: 25%; }\n .col-md-pull-4 {\n right: 33.3333333333%; }\n .col-md-pull-5 {\n right: 41.6666666667%; }\n .col-md-pull-6 {\n right: 50%; }\n .col-md-pull-7 {\n right: 58.3333333333%; }\n .col-md-pull-8 {\n right: 66.6666666667%; }\n .col-md-pull-9 {\n right: 75%; }\n .col-md-pull-10 {\n right: 83.3333333333%; }\n .col-md-pull-11 {\n right: 91.6666666667%; }\n .col-md-pull-12 {\n right: 100%; }\n .col-md-push-0 {\n left: auto; }\n .col-md-push-1 {\n left: 8.3333333333%; }\n .col-md-push-2 {\n left: 16.6666666667%; }\n .col-md-push-3 {\n left: 25%; }\n .col-md-push-4 {\n left: 33.3333333333%; }\n .col-md-push-5 {\n left: 41.6666666667%; }\n .col-md-push-6 {\n left: 50%; }\n .col-md-push-7 {\n left: 58.3333333333%; }\n .col-md-push-8 {\n left: 66.6666666667%; }\n .col-md-push-9 {\n left: 75%; }\n .col-md-push-10 {\n left: 83.3333333333%; }\n .col-md-push-11 {\n left: 91.6666666667%; }\n .col-md-push-12 {\n left: 100%; }\n .col-md-offset-0 {\n margin-left: 0%; }\n .col-md-offset-1 {\n margin-left: 8.3333333333%; }\n .col-md-offset-2 {\n margin-left: 16.6666666667%; }\n .col-md-offset-3 {\n margin-left: 25%; }\n .col-md-offset-4 {\n margin-left: 33.3333333333%; }\n .col-md-offset-5 {\n margin-left: 41.6666666667%; }\n .col-md-offset-6 {\n margin-left: 50%; }\n .col-md-offset-7 {\n margin-left: 58.3333333333%; }\n .col-md-offset-8 {\n margin-left: 66.6666666667%; }\n .col-md-offset-9 {\n margin-left: 75%; }\n .col-md-offset-10 {\n margin-left: 83.3333333333%; }\n .col-md-offset-11 {\n margin-left: 91.6666666667%; }\n .col-md-offset-12 {\n margin-left: 100%; } }\n\n@media (min-width: 1200px) {\n .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 {\n float: left; }\n .col-lg-1 {\n width: 8.3333333333%; }\n .col-lg-2 {\n width: 16.6666666667%; }\n .col-lg-3 {\n width: 25%; }\n .col-lg-4 {\n width: 33.3333333333%; }\n .col-lg-5 {\n width: 41.6666666667%; }\n .col-lg-6 {\n width: 50%; }\n .col-lg-7 {\n width: 58.3333333333%; }\n .col-lg-8 {\n width: 66.6666666667%; }\n .col-lg-9 {\n width: 75%; }\n .col-lg-10 {\n width: 83.3333333333%; }\n .col-lg-11 {\n width: 91.6666666667%; }\n .col-lg-12 {\n width: 100%; }\n .col-lg-pull-0 {\n right: auto; }\n .col-lg-pull-1 {\n right: 8.3333333333%; }\n .col-lg-pull-2 {\n right: 16.6666666667%; }\n .col-lg-pull-3 {\n right: 25%; }\n .col-lg-pull-4 {\n right: 33.3333333333%; }\n .col-lg-pull-5 {\n right: 41.6666666667%; }\n .col-lg-pull-6 {\n right: 50%; }\n .col-lg-pull-7 {\n right: 58.3333333333%; }\n .col-lg-pull-8 {\n right: 66.6666666667%; }\n .col-lg-pull-9 {\n right: 75%; }\n .col-lg-pull-10 {\n right: 83.3333333333%; }\n .col-lg-pull-11 {\n right: 91.6666666667%; }\n .col-lg-pull-12 {\n right: 100%; }\n .col-lg-push-0 {\n left: auto; }\n .col-lg-push-1 {\n left: 8.3333333333%; }\n .col-lg-push-2 {\n left: 16.6666666667%; }\n .col-lg-push-3 {\n left: 25%; }\n .col-lg-push-4 {\n left: 33.3333333333%; }\n .col-lg-push-5 {\n left: 41.6666666667%; }\n .col-lg-push-6 {\n left: 50%; }\n .col-lg-push-7 {\n left: 58.3333333333%; }\n .col-lg-push-8 {\n left: 66.6666666667%; }\n .col-lg-push-9 {\n left: 75%; }\n .col-lg-push-10 {\n left: 83.3333333333%; }\n .col-lg-push-11 {\n left: 91.6666666667%; }\n .col-lg-push-12 {\n left: 100%; }\n .col-lg-offset-0 {\n margin-left: 0%; }\n .col-lg-offset-1 {\n margin-left: 8.3333333333%; }\n .col-lg-offset-2 {\n margin-left: 16.6666666667%; }\n .col-lg-offset-3 {\n margin-left: 25%; }\n .col-lg-offset-4 {\n margin-left: 33.3333333333%; }\n .col-lg-offset-5 {\n margin-left: 41.6666666667%; }\n .col-lg-offset-6 {\n margin-left: 50%; }\n .col-lg-offset-7 {\n margin-left: 58.3333333333%; }\n .col-lg-offset-8 {\n margin-left: 66.6666666667%; }\n .col-lg-offset-9 {\n margin-left: 75%; }\n .col-lg-offset-10 {\n margin-left: 83.3333333333%; }\n .col-lg-offset-11 {\n margin-left: 91.6666666667%; }\n .col-lg-offset-12 {\n margin-left: 100%; } }\n\ntable {\n background-color: transparent; }\n\ncaption {\n padding-top: 8px;\n padding-bottom: 8px;\n color: #777777;\n text-align: left; }\n\nth {\n text-align: left; }\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 20px; }\n .table > thead > tr > th,\n .table > thead > tr > td,\n .table > tbody > tr > th,\n .table > tbody > tr > td,\n .table > tfoot > tr > th,\n .table > tfoot > tr > td {\n padding: 8px;\n line-height: 1.428571429;\n vertical-align: top;\n border-top: 1px solid #ddd; }\n .table > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid #ddd; }\n .table > caption + thead > tr:first-child > th,\n .table > caption + thead > tr:first-child > td,\n .table > colgroup + thead > tr:first-child > th,\n .table > colgroup + thead > tr:first-child > td,\n .table > thead:first-child > tr:first-child > th,\n .table > thead:first-child > tr:first-child > td {\n border-top: 0; }\n .table > tbody + tbody {\n border-top: 2px solid #ddd; }\n .table .table {\n background-color: #fff; }\n\n.table-condensed > thead > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > th,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > th,\n.table-condensed > tfoot > tr > td {\n padding: 5px; }\n\n.table-bordered {\n border: 1px solid #ddd; }\n .table-bordered > thead > tr > th,\n .table-bordered > thead > tr > td,\n .table-bordered > tbody > tr > th,\n .table-bordered > tbody > tr > td,\n .table-bordered > tfoot > tr > th,\n .table-bordered > tfoot > tr > td {\n border: 1px solid #ddd; }\n .table-bordered > thead > tr > th,\n .table-bordered > thead > tr > td {\n border-bottom-width: 2px; }\n\n.table-striped > tbody > tr:nth-of-type(odd) {\n background-color: #f9f9f9; }\n\n.table-hover > tbody > tr:hover {\n background-color: #f5f5f5; }\n\ntable col[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-column; }\n\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-cell; }\n\n.table > thead > tr > td.active,\n.table > thead > tr > th.active,\n.table > thead > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr > td.active,\n.table > tbody > tr > th.active,\n.table > tbody > tr.active > td,\n.table > tbody > tr.active > th,\n.table > tfoot > tr > td.active,\n.table > tfoot > tr > th.active,\n.table > tfoot > tr.active > td,\n.table > tfoot > tr.active > th {\n background-color: #f5f5f5; }\n\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n background-color: #e8e8e8; }\n\n.table > thead > tr > td.success,\n.table > thead > tr > th.success,\n.table > thead > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr > td.success,\n.table > tbody > tr > th.success,\n.table > tbody > tr.success > td,\n.table > tbody > tr.success > th,\n.table > tfoot > tr > td.success,\n.table > tfoot > tr > th.success,\n.table > tfoot > tr.success > td,\n.table > tfoot > tr.success > th {\n background-color: #dff0d8; }\n\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #d0e9c6; }\n\n.table > thead > tr > td.info,\n.table > thead > tr > th.info,\n.table > thead > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr > td.info,\n.table > tbody > tr > th.info,\n.table > tbody > tr.info > td,\n.table > tbody > tr.info > th,\n.table > tfoot > tr > td.info,\n.table > tfoot > tr > th.info,\n.table > tfoot > tr.info > td,\n.table > tfoot > tr.info > th {\n background-color: #d9edf7; }\n\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #c4e3f3; }\n\n.table > thead > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr > td.warning,\n.table > tbody > tr > th.warning,\n.table > tbody > tr.warning > td,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr > td.warning,\n.table > tfoot > tr > th.warning,\n.table > tfoot > tr.warning > td,\n.table > tfoot > tr.warning > th {\n background-color: #fcf8e3; }\n\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #faf2cc; }\n\n.table > thead > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr > td.danger,\n.table > tbody > tr > th.danger,\n.table > tbody > tr.danger > td,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr > td.danger,\n.table > tfoot > tr > th.danger,\n.table > tfoot > tr.danger > td,\n.table > tfoot > tr.danger > th {\n background-color: #f2dede; }\n\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #ebcccc; }\n\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%; }\n @media screen and (max-width: 767px) {\n .table-responsive {\n width: 100%;\n margin-bottom: 15px;\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid #ddd; }\n .table-responsive > .table {\n margin-bottom: 0; }\n .table-responsive > .table > thead > tr > th,\n .table-responsive > .table > thead > tr > td,\n .table-responsive > .table > tbody > tr > th,\n .table-responsive > .table > tbody > tr > td,\n .table-responsive > .table > tfoot > tr > th,\n .table-responsive > .table > tfoot > tr > td {\n white-space: nowrap; }\n .table-responsive > .table-bordered {\n border: 0; }\n .table-responsive > .table-bordered > thead > tr > th:first-child,\n .table-responsive > .table-bordered > thead > tr > td:first-child,\n .table-responsive > .table-bordered > tbody > tr > th:first-child,\n .table-responsive > .table-bordered > tbody > tr > td:first-child,\n .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0; }\n .table-responsive > .table-bordered > thead > tr > th:last-child,\n .table-responsive > .table-bordered > thead > tr > td:last-child,\n .table-responsive > .table-bordered > tbody > tr > th:last-child,\n .table-responsive > .table-bordered > tbody > tr > td:last-child,\n .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0; }\n .table-responsive > .table-bordered > tbody > tr:last-child > th,\n .table-responsive > .table-bordered > tbody > tr:last-child > td,\n .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n border-bottom: 0; } }\n\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n min-width: 0; }\n\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: 20px;\n font-size: 21px;\n line-height: inherit;\n color: #333333;\n border: 0;\n border-bottom: 1px solid #e5e5e5; }\n\nlabel {\n display: inline-block;\n max-width: 100%;\n margin-bottom: 5px;\n font-weight: bold; }\n\ninput[type=\"search\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box; }\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9;\n line-height: normal; }\n\ninput[type=\"file\"] {\n display: block; }\n\ninput[type=\"range\"] {\n display: block;\n width: 100%; }\n\nselect[multiple],\nselect[size] {\n height: auto; }\n\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n outline: thin dotted;\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px; }\n\noutput {\n display: block;\n padding-top: 7px;\n font-size: 14px;\n line-height: 1.428571429;\n color: #555555; }\n\n.form-control {\n display: block;\n width: 100%;\n height: 34px;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.428571429;\n color: #555555;\n background-color: #fff;\n background-image: none;\n border: 1px solid #ccc;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n -o-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; }\n .form-control:focus {\n border-color: #66afe9;\n outline: 0;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); }\n .form-control::-moz-placeholder {\n color: #999;\n opacity: 1; }\n .form-control:-ms-input-placeholder {\n color: #999; }\n .form-control::-webkit-input-placeholder {\n color: #999; }\n .form-control::-ms-expand {\n border: 0;\n background-color: transparent; }\n .form-control[disabled], .form-control[readonly],\n fieldset[disabled] .form-control {\n background-color: #eeeeee;\n opacity: 1; }\n .form-control[disabled],\n fieldset[disabled] .form-control {\n cursor: not-allowed; }\n\ntextarea.form-control {\n height: auto; }\n\ninput[type=\"search\"] {\n -webkit-appearance: none; }\n\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"].form-control,\n input[type=\"time\"].form-control,\n input[type=\"datetime-local\"].form-control,\n input[type=\"month\"].form-control {\n line-height: 34px; }\n input[type=\"date\"].input-sm, .input-group-sm > input[type=\"date\"].form-control,\n .input-group-sm > input[type=\"date\"].input-group-addon,\n .input-group-sm > .input-group-btn > input[type=\"date\"].btn,\n .input-group-sm input[type=\"date\"],\n input[type=\"time\"].input-sm,\n .input-group-sm > input[type=\"time\"].form-control,\n .input-group-sm > input[type=\"time\"].input-group-addon,\n .input-group-sm > .input-group-btn > input[type=\"time\"].btn,\n .input-group-sm\n input[type=\"time\"],\n input[type=\"datetime-local\"].input-sm,\n .input-group-sm > input[type=\"datetime-local\"].form-control,\n .input-group-sm > input[type=\"datetime-local\"].input-group-addon,\n .input-group-sm > .input-group-btn > input[type=\"datetime-local\"].btn,\n .input-group-sm\n input[type=\"datetime-local\"],\n input[type=\"month\"].input-sm,\n .input-group-sm > input[type=\"month\"].form-control,\n .input-group-sm > input[type=\"month\"].input-group-addon,\n .input-group-sm > .input-group-btn > input[type=\"month\"].btn,\n .input-group-sm\n input[type=\"month\"] {\n line-height: 30px; }\n input[type=\"date\"].input-lg, .input-group-lg > input[type=\"date\"].form-control,\n .input-group-lg > input[type=\"date\"].input-group-addon,\n .input-group-lg > .input-group-btn > input[type=\"date\"].btn,\n .input-group-lg input[type=\"date\"],\n input[type=\"time\"].input-lg,\n .input-group-lg > input[type=\"time\"].form-control,\n .input-group-lg > input[type=\"time\"].input-group-addon,\n .input-group-lg > .input-group-btn > input[type=\"time\"].btn,\n .input-group-lg\n input[type=\"time\"],\n input[type=\"datetime-local\"].input-lg,\n .input-group-lg > input[type=\"datetime-local\"].form-control,\n .input-group-lg > input[type=\"datetime-local\"].input-group-addon,\n .input-group-lg > .input-group-btn > input[type=\"datetime-local\"].btn,\n .input-group-lg\n input[type=\"datetime-local\"],\n input[type=\"month\"].input-lg,\n .input-group-lg > input[type=\"month\"].form-control,\n .input-group-lg > input[type=\"month\"].input-group-addon,\n .input-group-lg > .input-group-btn > input[type=\"month\"].btn,\n .input-group-lg\n input[type=\"month\"] {\n line-height: 46px; } }\n\n.form-group {\n margin-bottom: 15px; }\n\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px; }\n .radio label,\n .checkbox label {\n min-height: 20px;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer; }\n\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9; }\n\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px; }\n\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer; }\n\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px; }\n\ninput[type=\"radio\"][disabled], input[type=\"radio\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled]\ninput[type=\"checkbox\"] {\n cursor: not-allowed; }\n\n.radio-inline.disabled,\nfieldset[disabled] .radio-inline,\n.checkbox-inline.disabled,\nfieldset[disabled]\n.checkbox-inline {\n cursor: not-allowed; }\n\n.radio.disabled label,\nfieldset[disabled] .radio label,\n.checkbox.disabled label,\nfieldset[disabled]\n.checkbox label {\n cursor: not-allowed; }\n\n.form-control-static {\n padding-top: 7px;\n padding-bottom: 7px;\n margin-bottom: 0;\n min-height: 34px; }\n .form-control-static.input-lg, .input-group-lg > .form-control-static.form-control,\n .input-group-lg > .form-control-static.input-group-addon,\n .input-group-lg > .input-group-btn > .form-control-static.btn, .form-control-static.input-sm, .input-group-sm > .form-control-static.form-control,\n .input-group-sm > .form-control-static.input-group-addon,\n .input-group-sm > .input-group-btn > .form-control-static.btn {\n padding-left: 0;\n padding-right: 0; }\n\n.input-sm, .input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px; }\n\nselect.input-sm, .input-group-sm > select.form-control,\n.input-group-sm > select.input-group-addon,\n.input-group-sm > .input-group-btn > select.btn {\n height: 30px;\n line-height: 30px; }\n\ntextarea.input-sm, .input-group-sm > textarea.form-control,\n.input-group-sm > textarea.input-group-addon,\n.input-group-sm > .input-group-btn > textarea.btn,\nselect[multiple].input-sm,\n.input-group-sm > select[multiple].form-control,\n.input-group-sm > select[multiple].input-group-addon,\n.input-group-sm > .input-group-btn > select[multiple].btn {\n height: auto; }\n\n.form-group-sm .form-control {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px; }\n\n.form-group-sm select.form-control {\n height: 30px;\n line-height: 30px; }\n\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n height: auto; }\n\n.form-group-sm .form-control-static {\n height: 30px;\n min-height: 32px;\n padding: 6px 10px;\n font-size: 12px;\n line-height: 1.5; }\n\n.input-lg, .input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px; }\n\nselect.input-lg, .input-group-lg > select.form-control,\n.input-group-lg > select.input-group-addon,\n.input-group-lg > .input-group-btn > select.btn {\n height: 46px;\n line-height: 46px; }\n\ntextarea.input-lg, .input-group-lg > textarea.form-control,\n.input-group-lg > textarea.input-group-addon,\n.input-group-lg > .input-group-btn > textarea.btn,\nselect[multiple].input-lg,\n.input-group-lg > select[multiple].form-control,\n.input-group-lg > select[multiple].input-group-addon,\n.input-group-lg > .input-group-btn > select[multiple].btn {\n height: auto; }\n\n.form-group-lg .form-control {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px; }\n\n.form-group-lg select.form-control {\n height: 46px;\n line-height: 46px; }\n\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n height: auto; }\n\n.form-group-lg .form-control-static {\n height: 46px;\n min-height: 38px;\n padding: 11px 16px;\n font-size: 18px;\n line-height: 1.3333333; }\n\n.has-feedback {\n position: relative; }\n .has-feedback .form-control {\n padding-right: 42.5px; }\n\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n display: block;\n width: 34px;\n height: 34px;\n line-height: 34px;\n text-align: center;\n pointer-events: none; }\n\n.input-lg + .form-control-feedback, .input-group-lg > .form-control + .form-control-feedback,\n.input-group-lg > .input-group-addon + .form-control-feedback,\n.input-group-lg > .input-group-btn > .btn + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: 46px;\n height: 46px;\n line-height: 46px; }\n\n.input-sm + .form-control-feedback, .input-group-sm > .form-control + .form-control-feedback,\n.input-group-sm > .input-group-addon + .form-control-feedback,\n.input-group-sm > .input-group-btn > .btn + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: 30px;\n height: 30px;\n line-height: 30px; }\n\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n color: #3c763d; }\n\n.has-success .form-control {\n border-color: #3c763d;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); }\n .has-success .form-control:focus {\n border-color: #2b542c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; }\n\n.has-success .input-group-addon {\n color: #3c763d;\n border-color: #3c763d;\n background-color: #dff0d8; }\n\n.has-success .form-control-feedback {\n color: #3c763d; }\n\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n color: #8a6d3b; }\n\n.has-warning .form-control {\n border-color: #8a6d3b;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); }\n .has-warning .form-control:focus {\n border-color: #66512c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; }\n\n.has-warning .input-group-addon {\n color: #8a6d3b;\n border-color: #8a6d3b;\n background-color: #fcf8e3; }\n\n.has-warning .form-control-feedback {\n color: #8a6d3b; }\n\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n color: #a94442; }\n\n.has-error .form-control {\n border-color: #a94442;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); }\n .has-error .form-control:focus {\n border-color: #843534;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; }\n\n.has-error .input-group-addon {\n color: #a94442;\n border-color: #a94442;\n background-color: #f2dede; }\n\n.has-error .form-control-feedback {\n color: #a94442; }\n\n.has-feedback label ~ .form-control-feedback {\n top: 25px; }\n\n.has-feedback label.sr-only ~ .form-control-feedback {\n top: 0; }\n\n.help-block {\n display: block;\n margin-top: 5px;\n margin-bottom: 10px;\n color: #737373; }\n\n@media (min-width: 768px) {\n .form-inline .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle; }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle; }\n .form-inline .form-control-static {\n display: inline-block; }\n .form-inline .input-group {\n display: inline-table;\n vertical-align: middle; }\n .form-inline .input-group .input-group-addon,\n .form-inline .input-group .input-group-btn,\n .form-inline .input-group .form-control {\n width: auto; }\n .form-inline .input-group > .form-control {\n width: 100%; }\n .form-inline .control-label {\n margin-bottom: 0;\n vertical-align: middle; }\n .form-inline .radio,\n .form-inline .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle; }\n .form-inline .radio label,\n .form-inline .checkbox label {\n padding-left: 0; }\n .form-inline .radio input[type=\"radio\"],\n .form-inline .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0; }\n .form-inline .has-feedback .form-control-feedback {\n top: 0; } }\n\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: 7px; }\n\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n min-height: 27px; }\n\n.form-horizontal .form-group {\n margin-left: -15px;\n margin-right: -15px; }\n .form-horizontal .form-group:before, .form-horizontal .form-group:after {\n content: \" \";\n display: table; }\n .form-horizontal .form-group:after {\n clear: both; }\n\n@media (min-width: 768px) {\n .form-horizontal .control-label {\n text-align: right;\n margin-bottom: 0;\n padding-top: 7px; } }\n\n.form-horizontal .has-feedback .form-control-feedback {\n right: 15px; }\n\n@media (min-width: 768px) {\n .form-horizontal .form-group-lg .control-label {\n padding-top: 11px;\n font-size: 18px; } }\n\n@media (min-width: 768px) {\n .form-horizontal .form-group-sm .control-label {\n padding-top: 6px;\n font-size: 12px; } }\n\n.btn {\n display: inline-block;\n margin-bottom: 0;\n font-weight: normal;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none;\n border: 1px solid transparent;\n white-space: nowrap;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.428571429;\n border-radius: 4px;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none; }\n .btn:focus, .btn.focus, .btn:active:focus, .btn:active.focus, .btn.active:focus, .btn.active.focus {\n outline: thin dotted;\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px; }\n .btn:hover, .btn:focus, .btn.focus {\n color: #333;\n text-decoration: none; }\n .btn:active, .btn.active {\n outline: 0;\n background-image: none;\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); }\n .btn.disabled, .btn[disabled],\n fieldset[disabled] .btn {\n cursor: not-allowed;\n opacity: 0.65;\n filter: alpha(opacity=65);\n -webkit-box-shadow: none;\n box-shadow: none; }\n\na.btn.disabled,\nfieldset[disabled] a.btn {\n pointer-events: none; }\n\n.btn-default {\n color: #333;\n background-color: #fff;\n border-color: #ccc; }\n .btn-default:focus, .btn-default.focus {\n color: #333;\n background-color: #e6e6e6;\n border-color: #8c8c8c; }\n .btn-default:hover {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad; }\n .btn-default:active, .btn-default.active,\n .open > .btn-default.dropdown-toggle {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad; }\n .btn-default:active:hover, .btn-default:active:focus, .btn-default:active.focus, .btn-default.active:hover, .btn-default.active:focus, .btn-default.active.focus,\n .open > .btn-default.dropdown-toggle:hover,\n .open > .btn-default.dropdown-toggle:focus,\n .open > .btn-default.dropdown-toggle.focus {\n color: #333;\n background-color: #d4d4d4;\n border-color: #8c8c8c; }\n .btn-default:active, .btn-default.active,\n .open > .btn-default.dropdown-toggle {\n background-image: none; }\n .btn-default.disabled:hover, .btn-default.disabled:focus, .btn-default.disabled.focus, .btn-default[disabled]:hover, .btn-default[disabled]:focus, .btn-default[disabled].focus,\n fieldset[disabled] .btn-default:hover,\n fieldset[disabled] .btn-default:focus,\n fieldset[disabled] .btn-default.focus {\n background-color: #fff;\n border-color: #ccc; }\n .btn-default .badge {\n color: #fff;\n background-color: #333; }\n\n.btn-primary {\n color: #fff;\n background-color: #337ab7;\n border-color: #2e6da4; }\n .btn-primary:focus, .btn-primary.focus {\n color: #fff;\n background-color: #286090;\n border-color: #122b40; }\n .btn-primary:hover {\n color: #fff;\n background-color: #286090;\n border-color: #204d74; }\n .btn-primary:active, .btn-primary.active,\n .open > .btn-primary.dropdown-toggle {\n color: #fff;\n background-color: #286090;\n border-color: #204d74; }\n .btn-primary:active:hover, .btn-primary:active:focus, .btn-primary:active.focus, .btn-primary.active:hover, .btn-primary.active:focus, .btn-primary.active.focus,\n .open > .btn-primary.dropdown-toggle:hover,\n .open > .btn-primary.dropdown-toggle:focus,\n .open > .btn-primary.dropdown-toggle.focus {\n color: #fff;\n background-color: #204d74;\n border-color: #122b40; }\n .btn-primary:active, .btn-primary.active,\n .open > .btn-primary.dropdown-toggle {\n background-image: none; }\n .btn-primary.disabled:hover, .btn-primary.disabled:focus, .btn-primary.disabled.focus, .btn-primary[disabled]:hover, .btn-primary[disabled]:focus, .btn-primary[disabled].focus,\n fieldset[disabled] .btn-primary:hover,\n fieldset[disabled] .btn-primary:focus,\n fieldset[disabled] .btn-primary.focus {\n background-color: #337ab7;\n border-color: #2e6da4; }\n .btn-primary .badge {\n color: #337ab7;\n background-color: #fff; }\n\n.btn-success {\n color: #fff;\n background-color: #5cb85c;\n border-color: #4cae4c; }\n .btn-success:focus, .btn-success.focus {\n color: #fff;\n background-color: #449d44;\n border-color: #255625; }\n .btn-success:hover {\n color: #fff;\n background-color: #449d44;\n border-color: #398439; }\n .btn-success:active, .btn-success.active,\n .open > .btn-success.dropdown-toggle {\n color: #fff;\n background-color: #449d44;\n border-color: #398439; }\n .btn-success:active:hover, .btn-success:active:focus, .btn-success:active.focus, .btn-success.active:hover, .btn-success.active:focus, .btn-success.active.focus,\n .open > .btn-success.dropdown-toggle:hover,\n .open > .btn-success.dropdown-toggle:focus,\n .open > .btn-success.dropdown-toggle.focus {\n color: #fff;\n background-color: #398439;\n border-color: #255625; }\n .btn-success:active, .btn-success.active,\n .open > .btn-success.dropdown-toggle {\n background-image: none; }\n .btn-success.disabled:hover, .btn-success.disabled:focus, .btn-success.disabled.focus, .btn-success[disabled]:hover, .btn-success[disabled]:focus, .btn-success[disabled].focus,\n fieldset[disabled] .btn-success:hover,\n fieldset[disabled] .btn-success:focus,\n fieldset[disabled] .btn-success.focus {\n background-color: #5cb85c;\n border-color: #4cae4c; }\n .btn-success .badge {\n color: #5cb85c;\n background-color: #fff; }\n\n.btn-info {\n color: #fff;\n background-color: #5bc0de;\n border-color: #46b8da; }\n .btn-info:focus, .btn-info.focus {\n color: #fff;\n background-color: #31b0d5;\n border-color: #1b6d85; }\n .btn-info:hover {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc; }\n .btn-info:active, .btn-info.active,\n .open > .btn-info.dropdown-toggle {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc; }\n .btn-info:active:hover, .btn-info:active:focus, .btn-info:active.focus, .btn-info.active:hover, .btn-info.active:focus, .btn-info.active.focus,\n .open > .btn-info.dropdown-toggle:hover,\n .open > .btn-info.dropdown-toggle:focus,\n .open > .btn-info.dropdown-toggle.focus {\n color: #fff;\n background-color: #269abc;\n border-color: #1b6d85; }\n .btn-info:active, .btn-info.active,\n .open > .btn-info.dropdown-toggle {\n background-image: none; }\n .btn-info.disabled:hover, .btn-info.disabled:focus, .btn-info.disabled.focus, .btn-info[disabled]:hover, .btn-info[disabled]:focus, .btn-info[disabled].focus,\n fieldset[disabled] .btn-info:hover,\n fieldset[disabled] .btn-info:focus,\n fieldset[disabled] .btn-info.focus {\n background-color: #5bc0de;\n border-color: #46b8da; }\n .btn-info .badge {\n color: #5bc0de;\n background-color: #fff; }\n\n.btn-warning {\n color: #fff;\n background-color: #f0ad4e;\n border-color: #eea236; }\n .btn-warning:focus, .btn-warning.focus {\n color: #fff;\n background-color: #ec971f;\n border-color: #985f0d; }\n .btn-warning:hover {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512; }\n .btn-warning:active, .btn-warning.active,\n .open > .btn-warning.dropdown-toggle {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512; }\n .btn-warning:active:hover, .btn-warning:active:focus, .btn-warning:active.focus, .btn-warning.active:hover, .btn-warning.active:focus, .btn-warning.active.focus,\n .open > .btn-warning.dropdown-toggle:hover,\n .open > .btn-warning.dropdown-toggle:focus,\n .open > .btn-warning.dropdown-toggle.focus {\n color: #fff;\n background-color: #d58512;\n border-color: #985f0d; }\n .btn-warning:active, .btn-warning.active,\n .open > .btn-warning.dropdown-toggle {\n background-image: none; }\n .btn-warning.disabled:hover, .btn-warning.disabled:focus, .btn-warning.disabled.focus, .btn-warning[disabled]:hover, .btn-warning[disabled]:focus, .btn-warning[disabled].focus,\n fieldset[disabled] .btn-warning:hover,\n fieldset[disabled] .btn-warning:focus,\n fieldset[disabled] .btn-warning.focus {\n background-color: #f0ad4e;\n border-color: #eea236; }\n .btn-warning .badge {\n color: #f0ad4e;\n background-color: #fff; }\n\n.btn-danger {\n color: #fff;\n background-color: #d9534f;\n border-color: #d43f3a; }\n .btn-danger:focus, .btn-danger.focus {\n color: #fff;\n background-color: #c9302c;\n border-color: #761c19; }\n .btn-danger:hover {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925; }\n .btn-danger:active, .btn-danger.active,\n .open > .btn-danger.dropdown-toggle {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925; }\n .btn-danger:active:hover, .btn-danger:active:focus, .btn-danger:active.focus, .btn-danger.active:hover, .btn-danger.active:focus, .btn-danger.active.focus,\n .open > .btn-danger.dropdown-toggle:hover,\n .open > .btn-danger.dropdown-toggle:focus,\n .open > .btn-danger.dropdown-toggle.focus {\n color: #fff;\n background-color: #ac2925;\n border-color: #761c19; }\n .btn-danger:active, .btn-danger.active,\n .open > .btn-danger.dropdown-toggle {\n background-image: none; }\n .btn-danger.disabled:hover, .btn-danger.disabled:focus, .btn-danger.disabled.focus, .btn-danger[disabled]:hover, .btn-danger[disabled]:focus, .btn-danger[disabled].focus,\n fieldset[disabled] .btn-danger:hover,\n fieldset[disabled] .btn-danger:focus,\n fieldset[disabled] .btn-danger.focus {\n background-color: #d9534f;\n border-color: #d43f3a; }\n .btn-danger .badge {\n color: #d9534f;\n background-color: #fff; }\n\n.btn-link {\n color: #337ab7;\n font-weight: normal;\n border-radius: 0; }\n .btn-link, .btn-link:active, .btn-link.active, .btn-link[disabled],\n fieldset[disabled] .btn-link {\n background-color: transparent;\n -webkit-box-shadow: none;\n box-shadow: none; }\n .btn-link, .btn-link:hover, .btn-link:focus, .btn-link:active {\n border-color: transparent; }\n .btn-link:hover, .btn-link:focus {\n color: #23527c;\n text-decoration: underline;\n background-color: transparent; }\n .btn-link[disabled]:hover, .btn-link[disabled]:focus,\n fieldset[disabled] .btn-link:hover,\n fieldset[disabled] .btn-link:focus {\n color: #777777;\n text-decoration: none; }\n\n.btn-lg, .btn-group-lg > .btn {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px; }\n\n.btn-sm, .btn-group-sm > .btn {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px; }\n\n.btn-xs, .btn-group-xs > .btn {\n padding: 1px 5px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px; }\n\n.btn-block {\n display: block;\n width: 100%; }\n\n.btn-block + .btn-block {\n margin-top: 5px; }\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%; }\n\n.fade {\n opacity: 0;\n -webkit-transition: opacity 0.15s linear;\n -o-transition: opacity 0.15s linear;\n transition: opacity 0.15s linear; }\n .fade.in {\n opacity: 1; }\n\n.collapse {\n display: none; }\n .collapse.in {\n display: block; }\n\ntr.collapse.in {\n display: table-row; }\n\ntbody.collapse.in {\n display: table-row-group; }\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n -webkit-transition-property: height, visibility;\n transition-property: height, visibility;\n -webkit-transition-duration: 0.35s;\n transition-duration: 0.35s;\n -webkit-transition-timing-function: ease;\n transition-timing-function: ease; }\n\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: 4px dashed;\n border-top: 4px solid \\9;\n border-right: 4px solid transparent;\n border-left: 4px solid transparent; }\n\n.dropup,\n.dropdown {\n position: relative; }\n\n.dropdown-toggle:focus {\n outline: 0; }\n\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0;\n list-style: none;\n font-size: 14px;\n text-align: left;\n background-color: #fff;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 4px;\n -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n background-clip: padding-box; }\n .dropdown-menu.pull-right {\n right: 0;\n left: auto; }\n .dropdown-menu .divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5; }\n .dropdown-menu > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: 1.428571429;\n color: #333333;\n white-space: nowrap; }\n\n.dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus {\n text-decoration: none;\n color: #262626;\n background-color: #f5f5f5; }\n\n.dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus {\n color: #fff;\n text-decoration: none;\n outline: 0;\n background-color: #337ab7; }\n\n.dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus {\n color: #777777; }\n\n.dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n cursor: not-allowed; }\n\n.open > .dropdown-menu {\n display: block; }\n\n.open > a {\n outline: 0; }\n\n.dropdown-menu-right {\n left: auto;\n right: 0; }\n\n.dropdown-menu-left {\n left: 0;\n right: auto; }\n\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: 12px;\n line-height: 1.428571429;\n color: #777777;\n white-space: nowrap; }\n\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: 990; }\n\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto; }\n\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n border-top: 0;\n border-bottom: 4px dashed;\n border-bottom: 4px solid \\9;\n content: \"\"; }\n\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px; }\n\n@media (min-width: 768px) {\n .navbar-right .dropdown-menu {\n right: 0;\n left: auto; }\n .navbar-right .dropdown-menu-left {\n left: 0;\n right: auto; } }\n\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle; }\n .btn-group > .btn,\n .btn-group-vertical > .btn {\n position: relative;\n float: left; }\n .btn-group > .btn:hover, .btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,\n .btn-group-vertical > .btn:hover,\n .btn-group-vertical > .btn:focus,\n .btn-group-vertical > .btn:active,\n .btn-group-vertical > .btn.active {\n z-index: 2; }\n\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n margin-left: -1px; }\n\n.btn-toolbar {\n margin-left: -5px; }\n .btn-toolbar:before, .btn-toolbar:after {\n content: \" \";\n display: table; }\n .btn-toolbar:after {\n clear: both; }\n .btn-toolbar .btn,\n .btn-toolbar .btn-group,\n .btn-toolbar .input-group {\n float: left; }\n .btn-toolbar > .btn,\n .btn-toolbar > .btn-group,\n .btn-toolbar > .input-group {\n margin-left: 5px; }\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0; }\n\n.btn-group > .btn:first-child {\n margin-left: 0; }\n .btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0; }\n\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0; }\n\n.btn-group > .btn-group {\n float: left; }\n\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0; }\n\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0; }\n\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0; }\n\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0; }\n\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px; }\n\n.btn-group > .btn-lg + .dropdown-toggle, .btn-group-lg.btn-group > .btn + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px; }\n\n.btn-group.open .dropdown-toggle {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); }\n .btn-group.open .dropdown-toggle.btn-link {\n -webkit-box-shadow: none;\n box-shadow: none; }\n\n.btn .caret {\n margin-left: 0; }\n\n.btn-lg .caret, .btn-group-lg > .btn .caret {\n border-width: 5px 5px 0;\n border-bottom-width: 0; }\n\n.dropup .btn-lg .caret, .dropup .btn-group-lg > .btn .caret {\n border-width: 0 5px 5px; }\n\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%; }\n\n.btn-group-vertical > .btn-group:before, .btn-group-vertical > .btn-group:after {\n content: \" \";\n display: table; }\n\n.btn-group-vertical > .btn-group:after {\n clear: both; }\n\n.btn-group-vertical > .btn-group > .btn {\n float: none; }\n\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0; }\n\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n border-radius: 0; }\n\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0; }\n\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px; }\n\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0; }\n\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0; }\n\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0; }\n\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate; }\n .btn-group-justified > .btn,\n .btn-group-justified > .btn-group {\n float: none;\n display: table-cell;\n width: 1%; }\n .btn-group-justified > .btn-group .btn {\n width: 100%; }\n .btn-group-justified > .btn-group .dropdown-menu {\n left: auto; }\n\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none; }\n\n.input-group {\n position: relative;\n display: table;\n border-collapse: separate; }\n .input-group[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0; }\n .input-group .form-control {\n position: relative;\n z-index: 2;\n float: left;\n width: 100%;\n margin-bottom: 0; }\n .input-group .form-control:focus {\n z-index: 3; }\n\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell; }\n .input-group-addon:not(:first-child):not(:last-child),\n .input-group-btn:not(:first-child):not(:last-child),\n .input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0; }\n\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle; }\n\n.input-group-addon {\n padding: 6px 12px;\n font-size: 14px;\n font-weight: normal;\n line-height: 1;\n color: #555555;\n text-align: center;\n background-color: #eeeeee;\n border: 1px solid #ccc;\n border-radius: 4px; }\n .input-group-addon.input-sm,\n .input-group-sm > .input-group-addon,\n .input-group-sm > .input-group-btn > .input-group-addon.btn {\n padding: 5px 10px;\n font-size: 12px;\n border-radius: 3px; }\n .input-group-addon.input-lg,\n .input-group-lg > .input-group-addon,\n .input-group-lg > .input-group-btn > .input-group-addon.btn {\n padding: 10px 16px;\n font-size: 18px;\n border-radius: 6px; }\n .input-group-addon input[type=\"radio\"],\n .input-group-addon input[type=\"checkbox\"] {\n margin-top: 0; }\n\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0; }\n\n.input-group-addon:first-child {\n border-right: 0; }\n\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0; }\n\n.input-group-addon:last-child {\n border-left: 0; }\n\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap; }\n .input-group-btn > .btn {\n position: relative; }\n .input-group-btn > .btn + .btn {\n margin-left: -1px; }\n .input-group-btn > .btn:hover, .input-group-btn > .btn:focus, .input-group-btn > .btn:active {\n z-index: 2; }\n .input-group-btn:first-child > .btn,\n .input-group-btn:first-child > .btn-group {\n margin-right: -1px; }\n .input-group-btn:last-child > .btn,\n .input-group-btn:last-child > .btn-group {\n z-index: 2;\n margin-left: -1px; }\n\n.nav {\n margin-bottom: 0;\n padding-left: 0;\n list-style: none; }\n .nav:before, .nav:after {\n content: \" \";\n display: table; }\n .nav:after {\n clear: both; }\n .nav > li {\n position: relative;\n display: block; }\n .nav > li > a {\n position: relative;\n display: block;\n padding: 10px 15px; }\n .nav > li > a:hover, .nav > li > a:focus {\n text-decoration: none;\n background-color: #eeeeee; }\n .nav > li.disabled > a {\n color: #777777; }\n .nav > li.disabled > a:hover, .nav > li.disabled > a:focus {\n color: #777777;\n text-decoration: none;\n background-color: transparent;\n cursor: not-allowed; }\n .nav .open > a, .nav .open > a:hover, .nav .open > a:focus {\n background-color: #eeeeee;\n border-color: #337ab7; }\n .nav .nav-divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5; }\n .nav > li > a > img {\n max-width: none; }\n\n.nav-tabs {\n border-bottom: 1px solid #ddd; }\n .nav-tabs > li {\n float: left;\n margin-bottom: -1px; }\n .nav-tabs > li > a {\n margin-right: 2px;\n line-height: 1.428571429;\n border: 1px solid transparent;\n border-radius: 4px 4px 0 0; }\n .nav-tabs > li > a:hover {\n border-color: #eeeeee #eeeeee #ddd; }\n .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus {\n color: #555555;\n background-color: #fff;\n border: 1px solid #ddd;\n border-bottom-color: transparent;\n cursor: default; }\n\n.nav-pills > li {\n float: left; }\n .nav-pills > li > a {\n border-radius: 4px; }\n .nav-pills > li + li {\n margin-left: 2px; }\n .nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus {\n color: #fff;\n background-color: #337ab7; }\n\n.nav-stacked > li {\n float: none; }\n .nav-stacked > li + li {\n margin-top: 2px;\n margin-left: 0; }\n\n.nav-justified, .nav-tabs.nav-justified {\n width: 100%; }\n .nav-justified > li, .nav-tabs.nav-justified > li {\n float: none; }\n .nav-justified > li > a, .nav-tabs.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px; }\n .nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto; }\n @media (min-width: 768px) {\n .nav-justified > li, .nav-tabs.nav-justified > li {\n display: table-cell;\n width: 1%; }\n .nav-justified > li > a, .nav-tabs.nav-justified > li > a {\n margin-bottom: 0; } }\n\n.nav-tabs-justified, .nav-tabs.nav-justified {\n border-bottom: 0; }\n .nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a {\n margin-right: 0;\n border-radius: 4px; }\n .nav-tabs-justified > .active > a, .nav-tabs.nav-justified > .active > a,\n .nav-tabs-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:hover,\n .nav-tabs-justified > .active > a:focus, .nav-tabs.nav-justified > .active > a:focus {\n border: 1px solid #ddd; }\n @media (min-width: 768px) {\n .nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0; }\n .nav-tabs-justified > .active > a, .nav-tabs.nav-justified > .active > a,\n .nav-tabs-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:hover,\n .nav-tabs-justified > .active > a:focus, .nav-tabs.nav-justified > .active > a:focus {\n border-bottom-color: #fff; } }\n\n.tab-content > .tab-pane {\n display: none; }\n\n.tab-content > .active {\n display: block; }\n\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-right-radius: 0;\n border-top-left-radius: 0; }\n\n.navbar {\n position: relative;\n min-height: 50px;\n margin-bottom: 20px;\n border: 1px solid transparent; }\n .navbar:before, .navbar:after {\n content: \" \";\n display: table; }\n .navbar:after {\n clear: both; }\n @media (min-width: 768px) {\n .navbar {\n border-radius: 4px; } }\n\n.navbar-header:before, .navbar-header:after {\n content: \" \";\n display: table; }\n\n.navbar-header:after {\n clear: both; }\n\n@media (min-width: 768px) {\n .navbar-header {\n float: left; } }\n\n.navbar-collapse {\n overflow-x: visible;\n padding-right: 15px;\n padding-left: 15px;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n -webkit-overflow-scrolling: touch; }\n .navbar-collapse:before, .navbar-collapse:after {\n content: \" \";\n display: table; }\n .navbar-collapse:after {\n clear: both; }\n .navbar-collapse.in {\n overflow-y: auto; }\n @media (min-width: 768px) {\n .navbar-collapse {\n width: auto;\n border-top: 0;\n box-shadow: none; }\n .navbar-collapse.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0;\n overflow: visible !important; }\n .navbar-collapse.in {\n overflow-y: visible; }\n .navbar-fixed-top .navbar-collapse,\n .navbar-static-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n padding-left: 0;\n padding-right: 0; } }\n\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n max-height: 340px; }\n @media (max-device-width: 480px) and (orientation: landscape) {\n .navbar-fixed-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n max-height: 200px; } }\n\n.container > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-header,\n.container-fluid > .navbar-collapse {\n margin-right: -15px;\n margin-left: -15px; }\n @media (min-width: 768px) {\n .container > .navbar-header,\n .container > .navbar-collapse,\n .container-fluid > .navbar-header,\n .container-fluid > .navbar-collapse {\n margin-right: 0;\n margin-left: 0; } }\n\n.navbar-static-top {\n z-index: 1000;\n border-width: 0 0 1px; }\n @media (min-width: 768px) {\n .navbar-static-top {\n border-radius: 0; } }\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: 1030; }\n @media (min-width: 768px) {\n .navbar-fixed-top,\n .navbar-fixed-bottom {\n border-radius: 0; } }\n\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px; }\n\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0;\n border-width: 1px 0 0; }\n\n.navbar-brand {\n float: left;\n padding: 15px 15px;\n font-size: 18px;\n line-height: 20px;\n height: 50px; }\n .navbar-brand:hover, .navbar-brand:focus {\n text-decoration: none; }\n .navbar-brand > img {\n display: block; }\n @media (min-width: 768px) {\n .navbar > .container .navbar-brand,\n .navbar > .container-fluid .navbar-brand {\n margin-left: -15px; } }\n\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: 15px;\n padding: 9px 10px;\n margin-top: 8px;\n margin-bottom: 8px;\n background-color: transparent;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px; }\n .navbar-toggle:focus {\n outline: 0; }\n .navbar-toggle .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px; }\n .navbar-toggle .icon-bar + .icon-bar {\n margin-top: 4px; }\n @media (min-width: 768px) {\n .navbar-toggle {\n display: none; } }\n\n.navbar-nav {\n margin: 7.5px -15px; }\n .navbar-nav > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: 20px; }\n @media (max-width: 767px) {\n .navbar-nav .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none; }\n .navbar-nav .open .dropdown-menu > li > a,\n .navbar-nav .open .dropdown-menu .dropdown-header {\n padding: 5px 15px 5px 25px; }\n .navbar-nav .open .dropdown-menu > li > a {\n line-height: 20px; }\n .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-nav .open .dropdown-menu > li > a:focus {\n background-image: none; } }\n @media (min-width: 768px) {\n .navbar-nav {\n float: left;\n margin: 0; }\n .navbar-nav > li {\n float: left; }\n .navbar-nav > li > a {\n padding-top: 15px;\n padding-bottom: 15px; } }\n\n.navbar-form {\n margin-left: -15px;\n margin-right: -15px;\n padding: 10px 15px;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n margin-top: 8px;\n margin-bottom: 8px; }\n @media (min-width: 768px) {\n .navbar-form .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle; }\n .navbar-form .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle; }\n .navbar-form .form-control-static {\n display: inline-block; }\n .navbar-form .input-group {\n display: inline-table;\n vertical-align: middle; }\n .navbar-form .input-group .input-group-addon,\n .navbar-form .input-group .input-group-btn,\n .navbar-form .input-group .form-control {\n width: auto; }\n .navbar-form .input-group > .form-control {\n width: 100%; }\n .navbar-form .control-label {\n margin-bottom: 0;\n vertical-align: middle; }\n .navbar-form .radio,\n .navbar-form .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle; }\n .navbar-form .radio label,\n .navbar-form .checkbox label {\n padding-left: 0; }\n .navbar-form .radio input[type=\"radio\"],\n .navbar-form .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0; }\n .navbar-form .has-feedback .form-control-feedback {\n top: 0; } }\n @media (max-width: 767px) {\n .navbar-form .form-group {\n margin-bottom: 5px; }\n .navbar-form .form-group:last-child {\n margin-bottom: 0; } }\n @media (min-width: 768px) {\n .navbar-form {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n -webkit-box-shadow: none;\n box-shadow: none; } }\n\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n border-top-right-radius: 0;\n border-top-left-radius: 0; }\n\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0; }\n\n.navbar-btn {\n margin-top: 8px;\n margin-bottom: 8px; }\n .navbar-btn.btn-sm, .btn-group-sm > .navbar-btn.btn {\n margin-top: 10px;\n margin-bottom: 10px; }\n .navbar-btn.btn-xs, .btn-group-xs > .navbar-btn.btn {\n margin-top: 14px;\n margin-bottom: 14px; }\n\n.navbar-text {\n margin-top: 15px;\n margin-bottom: 15px; }\n @media (min-width: 768px) {\n .navbar-text {\n float: left;\n margin-left: 15px;\n margin-right: 15px; } }\n\n@media (min-width: 768px) {\n .navbar-left {\n float: left !important; }\n .navbar-right {\n float: right !important;\n margin-right: -15px; }\n .navbar-right ~ .navbar-right {\n margin-right: 0; } }\n\n.navbar-default {\n background-color: #f8f8f8;\n border-color: #e7e7e7; }\n .navbar-default .navbar-brand {\n color: #777; }\n .navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus {\n color: #5e5e5e;\n background-color: transparent; }\n .navbar-default .navbar-text {\n color: #777; }\n .navbar-default .navbar-nav > li > a {\n color: #777; }\n .navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus {\n color: #333;\n background-color: transparent; }\n .navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus {\n color: #555;\n background-color: #e7e7e7; }\n .navbar-default .navbar-nav > .disabled > a, .navbar-default .navbar-nav > .disabled > a:hover, .navbar-default .navbar-nav > .disabled > a:focus {\n color: #ccc;\n background-color: transparent; }\n .navbar-default .navbar-toggle {\n border-color: #ddd; }\n .navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus {\n background-color: #ddd; }\n .navbar-default .navbar-toggle .icon-bar {\n background-color: #888; }\n .navbar-default .navbar-collapse,\n .navbar-default .navbar-form {\n border-color: #e7e7e7; }\n .navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus {\n background-color: #e7e7e7;\n color: #555; }\n @media (max-width: 767px) {\n .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n color: #777; }\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #333;\n background-color: transparent; }\n .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 {\n color: #555;\n background-color: #e7e7e7; }\n .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 {\n color: #ccc;\n background-color: transparent; } }\n .navbar-default .navbar-link {\n color: #777; }\n .navbar-default .navbar-link:hover {\n color: #333; }\n .navbar-default .btn-link {\n color: #777; }\n .navbar-default .btn-link:hover, .navbar-default .btn-link:focus {\n color: #333; }\n .navbar-default .btn-link[disabled]:hover, .navbar-default .btn-link[disabled]:focus,\n fieldset[disabled] .navbar-default .btn-link:hover,\n fieldset[disabled] .navbar-default .btn-link:focus {\n color: #ccc; }\n\n.navbar-inverse {\n background-color: #222;\n border-color: #090909; }\n .navbar-inverse .navbar-brand {\n color: #9d9d9d; }\n .navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus {\n color: #fff;\n background-color: transparent; }\n .navbar-inverse .navbar-text {\n color: #9d9d9d; }\n .navbar-inverse .navbar-nav > li > a {\n color: #9d9d9d; }\n .navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus {\n color: #fff;\n background-color: transparent; }\n .navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus {\n color: #fff;\n background-color: #090909; }\n .navbar-inverse .navbar-nav > .disabled > a, .navbar-inverse .navbar-nav > .disabled > a:hover, .navbar-inverse .navbar-nav > .disabled > a:focus {\n color: #444;\n background-color: transparent; }\n .navbar-inverse .navbar-toggle {\n border-color: #333; }\n .navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus {\n background-color: #333; }\n .navbar-inverse .navbar-toggle .icon-bar {\n background-color: #fff; }\n .navbar-inverse .navbar-collapse,\n .navbar-inverse .navbar-form {\n border-color: #101010; }\n .navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus {\n background-color: #090909;\n color: #fff; }\n @media (max-width: 767px) {\n .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n border-color: #090909; }\n .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n background-color: #090909; }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n color: #9d9d9d; }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #fff;\n background-color: transparent; }\n .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 {\n color: #fff;\n background-color: #090909; }\n .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 {\n color: #444;\n background-color: transparent; } }\n .navbar-inverse .navbar-link {\n color: #9d9d9d; }\n .navbar-inverse .navbar-link:hover {\n color: #fff; }\n .navbar-inverse .btn-link {\n color: #9d9d9d; }\n .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link:focus {\n color: #fff; }\n .navbar-inverse .btn-link[disabled]:hover, .navbar-inverse .btn-link[disabled]:focus,\n fieldset[disabled] .navbar-inverse .btn-link:hover,\n fieldset[disabled] .navbar-inverse .btn-link:focus {\n color: #444; }\n\n.breadcrumb {\n padding: 8px 15px;\n margin-bottom: 20px;\n list-style: none;\n background-color: #f5f5f5;\n border-radius: 4px; }\n .breadcrumb > li {\n display: inline-block; }\n .breadcrumb > li + li:before {\n content: \"/ \";\n padding: 0 5px;\n color: #ccc; }\n .breadcrumb > .active {\n color: #777777; }\n\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: 20px 0;\n border-radius: 4px; }\n .pagination > li {\n display: inline; }\n .pagination > li > a,\n .pagination > li > span {\n position: relative;\n float: left;\n padding: 6px 12px;\n line-height: 1.428571429;\n text-decoration: none;\n color: #337ab7;\n background-color: #fff;\n border: 1px solid #ddd;\n margin-left: -1px; }\n .pagination > li:first-child > a,\n .pagination > li:first-child > span {\n margin-left: 0;\n border-bottom-left-radius: 4px;\n border-top-left-radius: 4px; }\n .pagination > li:last-child > a,\n .pagination > li:last-child > span {\n border-bottom-right-radius: 4px;\n border-top-right-radius: 4px; }\n .pagination > li > a:hover, .pagination > li > a:focus,\n .pagination > li > span:hover,\n .pagination > li > span:focus {\n z-index: 2;\n color: #23527c;\n background-color: #eeeeee;\n border-color: #ddd; }\n .pagination > .active > a, .pagination > .active > a:hover, .pagination > .active > a:focus,\n .pagination > .active > span,\n .pagination > .active > span:hover,\n .pagination > .active > span:focus {\n z-index: 3;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n cursor: default; }\n .pagination > .disabled > span,\n .pagination > .disabled > span:hover,\n .pagination > .disabled > span:focus,\n .pagination > .disabled > a,\n .pagination > .disabled > a:hover,\n .pagination > .disabled > a:focus {\n color: #777777;\n background-color: #fff;\n border-color: #ddd;\n cursor: not-allowed; }\n\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333; }\n\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n border-bottom-left-radius: 6px;\n border-top-left-radius: 6px; }\n\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n border-bottom-right-radius: 6px;\n border-top-right-radius: 6px; }\n\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5; }\n\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n border-bottom-left-radius: 3px;\n border-top-left-radius: 3px; }\n\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n border-bottom-right-radius: 3px;\n border-top-right-radius: 3px; }\n\n.pager {\n padding-left: 0;\n margin: 20px 0;\n list-style: none;\n text-align: center; }\n .pager:before, .pager:after {\n content: \" \";\n display: table; }\n .pager:after {\n clear: both; }\n .pager li {\n display: inline; }\n .pager li > a,\n .pager li > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 15px; }\n .pager li > a:hover,\n .pager li > a:focus {\n text-decoration: none;\n background-color: #eeeeee; }\n .pager .next > a,\n .pager .next > span {\n float: right; }\n .pager .previous > a,\n .pager .previous > span {\n float: left; }\n .pager .disabled > a,\n .pager .disabled > a:hover,\n .pager .disabled > a:focus,\n .pager .disabled > span {\n color: #777777;\n background-color: #fff;\n cursor: not-allowed; }\n\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em; }\n .label:empty {\n display: none; }\n .btn .label {\n position: relative;\n top: -1px; }\n\na.label:hover, a.label:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer; }\n\n.label-default {\n background-color: #777777; }\n .label-default[href]:hover, .label-default[href]:focus {\n background-color: #5e5e5e; }\n\n.label-primary {\n background-color: #337ab7; }\n .label-primary[href]:hover, .label-primary[href]:focus {\n background-color: #286090; }\n\n.label-success {\n background-color: #5cb85c; }\n .label-success[href]:hover, .label-success[href]:focus {\n background-color: #449d44; }\n\n.label-info {\n background-color: #5bc0de; }\n .label-info[href]:hover, .label-info[href]:focus {\n background-color: #31b0d5; }\n\n.label-warning {\n background-color: #f0ad4e; }\n .label-warning[href]:hover, .label-warning[href]:focus {\n background-color: #ec971f; }\n\n.label-danger {\n background-color: #d9534f; }\n .label-danger[href]:hover, .label-danger[href]:focus {\n background-color: #c9302c; }\n\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: 12px;\n font-weight: bold;\n color: #fff;\n line-height: 1;\n vertical-align: middle;\n white-space: nowrap;\n text-align: center;\n background-color: #777777;\n border-radius: 10px; }\n .badge:empty {\n display: none; }\n .btn .badge {\n position: relative;\n top: -1px; }\n .btn-xs .badge, .btn-group-xs > .btn .badge,\n .btn-group-xs > .btn .badge {\n top: 0;\n padding: 1px 5px; }\n .list-group-item.active > .badge,\n .nav-pills > .active > a > .badge {\n color: #337ab7;\n background-color: #fff; }\n .list-group-item > .badge {\n float: right; }\n .list-group-item > .badge + .badge {\n margin-right: 5px; }\n .nav-pills > li > a > .badge {\n margin-left: 3px; }\n\na.badge:hover, a.badge:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer; }\n\n.jumbotron {\n padding-top: 30px;\n padding-bottom: 30px;\n margin-bottom: 30px;\n color: inherit;\n background-color: #eeeeee; }\n .jumbotron h1,\n .jumbotron .h1 {\n color: inherit; }\n .jumbotron p {\n margin-bottom: 15px;\n font-size: 21px;\n font-weight: 200; }\n .jumbotron > hr {\n border-top-color: #d5d5d5; }\n .container .jumbotron,\n .container-fluid .jumbotron {\n border-radius: 6px;\n padding-left: 15px;\n padding-right: 15px; }\n .jumbotron .container {\n max-width: 100%; }\n @media screen and (min-width: 768px) {\n .jumbotron {\n padding-top: 48px;\n padding-bottom: 48px; }\n .container .jumbotron,\n .container-fluid .jumbotron {\n padding-left: 60px;\n padding-right: 60px; }\n .jumbotron h1,\n .jumbotron .h1 {\n font-size: 63px; } }\n\n.thumbnail {\n display: block;\n padding: 4px;\n margin-bottom: 20px;\n line-height: 1.428571429;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: border 0.2s ease-in-out;\n -o-transition: border 0.2s ease-in-out;\n transition: border 0.2s ease-in-out; }\n .thumbnail > img,\n .thumbnail a > img {\n display: block;\n max-width: 100%;\n height: auto;\n margin-left: auto;\n margin-right: auto; }\n .thumbnail .caption {\n padding: 9px;\n color: #333333; }\n\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n border-color: #337ab7; }\n\n.alert {\n padding: 15px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n border-radius: 4px; }\n .alert h4 {\n margin-top: 0;\n color: inherit; }\n .alert .alert-link {\n font-weight: bold; }\n .alert > p,\n .alert > ul {\n margin-bottom: 0; }\n .alert > p + p {\n margin-top: 5px; }\n\n.alert-dismissable,\n.alert-dismissible {\n padding-right: 35px; }\n .alert-dismissable .close,\n .alert-dismissible .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit; }\n\n.alert-success {\n background-color: #dff0d8;\n border-color: #d6e9c6;\n color: #3c763d; }\n .alert-success hr {\n border-top-color: #c9e2b3; }\n .alert-success .alert-link {\n color: #2b542c; }\n\n.alert-info {\n background-color: #d9edf7;\n border-color: #bce8f1;\n color: #31708f; }\n .alert-info hr {\n border-top-color: #a6e1ec; }\n .alert-info .alert-link {\n color: #245269; }\n\n.alert-warning {\n background-color: #fcf8e3;\n border-color: #faebcc;\n color: #8a6d3b; }\n .alert-warning hr {\n border-top-color: #f7e1b5; }\n .alert-warning .alert-link {\n color: #66512c; }\n\n.alert-danger {\n background-color: #f2dede;\n border-color: #ebccd1;\n color: #a94442; }\n .alert-danger hr {\n border-top-color: #e4b9c0; }\n .alert-danger .alert-link {\n color: #843534; }\n\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0; }\n to {\n background-position: 0 0; } }\n\n@keyframes progress-bar-stripes {\n from {\n background-position: 40px 0; }\n to {\n background-position: 0 0; } }\n\n.progress {\n overflow: hidden;\n height: 20px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); }\n\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: 12px;\n line-height: 20px;\n color: #fff;\n text-align: center;\n background-color: #337ab7;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n -webkit-transition: width 0.6s ease;\n -o-transition: width 0.6s ease;\n transition: width 0.6s ease; }\n\n.progress-striped .progress-bar,\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 40px 40px; }\n\n.progress.active .progress-bar,\n.progress-bar.active {\n -webkit-animation: progress-bar-stripes 2s linear infinite;\n -o-animation: progress-bar-stripes 2s linear infinite;\n animation: progress-bar-stripes 2s linear infinite; }\n\n.progress-bar-success {\n background-color: #5cb85c; }\n .progress-striped .progress-bar-success {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); }\n\n.progress-bar-info {\n background-color: #5bc0de; }\n .progress-striped .progress-bar-info {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); }\n\n.progress-bar-warning {\n background-color: #f0ad4e; }\n .progress-striped .progress-bar-warning {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); }\n\n.progress-bar-danger {\n background-color: #d9534f; }\n .progress-striped .progress-bar-danger {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); }\n\n.media {\n margin-top: 15px; }\n .media:first-child {\n margin-top: 0; }\n\n.media,\n.media-body {\n zoom: 1;\n overflow: hidden; }\n\n.media-body {\n width: 10000px; }\n\n.media-object {\n display: block; }\n .media-object.img-thumbnail {\n max-width: none; }\n\n.media-right,\n.media > .pull-right {\n padding-left: 10px; }\n\n.media-left,\n.media > .pull-left {\n padding-right: 10px; }\n\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top; }\n\n.media-middle {\n vertical-align: middle; }\n\n.media-bottom {\n vertical-align: bottom; }\n\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px; }\n\n.media-list {\n padding-left: 0;\n list-style: none; }\n\n.list-group {\n margin-bottom: 20px;\n padding-left: 0; }\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid #ddd; }\n .list-group-item:first-child {\n border-top-right-radius: 4px;\n border-top-left-radius: 4px; }\n .list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px; }\n\na.list-group-item,\nbutton.list-group-item {\n color: #555; }\n a.list-group-item .list-group-item-heading,\n button.list-group-item .list-group-item-heading {\n color: #333; }\n a.list-group-item:hover, a.list-group-item:focus,\n button.list-group-item:hover,\n button.list-group-item:focus {\n text-decoration: none;\n color: #555;\n background-color: #f5f5f5; }\n\nbutton.list-group-item {\n width: 100%;\n text-align: left; }\n\n.list-group-item.disabled, .list-group-item.disabled:hover, .list-group-item.disabled:focus {\n background-color: #eeeeee;\n color: #777777;\n cursor: not-allowed; }\n .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 {\n color: inherit; }\n .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 {\n color: #777777; }\n\n.list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus {\n z-index: 2;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7; }\n .list-group-item.active .list-group-item-heading,\n .list-group-item.active .list-group-item-heading > small,\n .list-group-item.active .list-group-item-heading > .small, .list-group-item.active:hover .list-group-item-heading,\n .list-group-item.active:hover .list-group-item-heading > small,\n .list-group-item.active:hover .list-group-item-heading > .small, .list-group-item.active:focus .list-group-item-heading,\n .list-group-item.active:focus .list-group-item-heading > small,\n .list-group-item.active:focus .list-group-item-heading > .small {\n color: inherit; }\n .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 {\n color: #c7ddef; }\n\n.list-group-item-success {\n color: #3c763d;\n background-color: #dff0d8; }\n\na.list-group-item-success,\nbutton.list-group-item-success {\n color: #3c763d; }\n a.list-group-item-success .list-group-item-heading,\n button.list-group-item-success .list-group-item-heading {\n color: inherit; }\n a.list-group-item-success:hover, a.list-group-item-success:focus,\n button.list-group-item-success:hover,\n button.list-group-item-success:focus {\n color: #3c763d;\n background-color: #d0e9c6; }\n a.list-group-item-success.active, a.list-group-item-success.active:hover, a.list-group-item-success.active:focus,\n button.list-group-item-success.active,\n button.list-group-item-success.active:hover,\n button.list-group-item-success.active:focus {\n color: #fff;\n background-color: #3c763d;\n border-color: #3c763d; }\n\n.list-group-item-info {\n color: #31708f;\n background-color: #d9edf7; }\n\na.list-group-item-info,\nbutton.list-group-item-info {\n color: #31708f; }\n a.list-group-item-info .list-group-item-heading,\n button.list-group-item-info .list-group-item-heading {\n color: inherit; }\n a.list-group-item-info:hover, a.list-group-item-info:focus,\n button.list-group-item-info:hover,\n button.list-group-item-info:focus {\n color: #31708f;\n background-color: #c4e3f3; }\n a.list-group-item-info.active, a.list-group-item-info.active:hover, a.list-group-item-info.active:focus,\n button.list-group-item-info.active,\n button.list-group-item-info.active:hover,\n button.list-group-item-info.active:focus {\n color: #fff;\n background-color: #31708f;\n border-color: #31708f; }\n\n.list-group-item-warning {\n color: #8a6d3b;\n background-color: #fcf8e3; }\n\na.list-group-item-warning,\nbutton.list-group-item-warning {\n color: #8a6d3b; }\n a.list-group-item-warning .list-group-item-heading,\n button.list-group-item-warning .list-group-item-heading {\n color: inherit; }\n a.list-group-item-warning:hover, a.list-group-item-warning:focus,\n button.list-group-item-warning:hover,\n button.list-group-item-warning:focus {\n color: #8a6d3b;\n background-color: #faf2cc; }\n a.list-group-item-warning.active, a.list-group-item-warning.active:hover, a.list-group-item-warning.active:focus,\n button.list-group-item-warning.active,\n button.list-group-item-warning.active:hover,\n button.list-group-item-warning.active:focus {\n color: #fff;\n background-color: #8a6d3b;\n border-color: #8a6d3b; }\n\n.list-group-item-danger {\n color: #a94442;\n background-color: #f2dede; }\n\na.list-group-item-danger,\nbutton.list-group-item-danger {\n color: #a94442; }\n a.list-group-item-danger .list-group-item-heading,\n button.list-group-item-danger .list-group-item-heading {\n color: inherit; }\n a.list-group-item-danger:hover, a.list-group-item-danger:focus,\n button.list-group-item-danger:hover,\n button.list-group-item-danger:focus {\n color: #a94442;\n background-color: #ebcccc; }\n a.list-group-item-danger.active, a.list-group-item-danger.active:hover, a.list-group-item-danger.active:focus,\n button.list-group-item-danger.active,\n button.list-group-item-danger.active:hover,\n button.list-group-item-danger.active:focus {\n color: #fff;\n background-color: #a94442;\n border-color: #a94442; }\n\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px; }\n\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3; }\n\n.panel {\n margin-bottom: 20px;\n background-color: #fff;\n border: 1px solid transparent;\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); }\n\n.panel-body {\n padding: 15px; }\n .panel-body:before, .panel-body:after {\n content: \" \";\n display: table; }\n .panel-body:after {\n clear: both; }\n\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px; }\n .panel-heading > .dropdown .dropdown-toggle {\n color: inherit; }\n\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: 16px;\n color: inherit; }\n .panel-title > a,\n .panel-title > small,\n .panel-title > .small,\n .panel-title > small > a,\n .panel-title > .small > a {\n color: inherit; }\n\n.panel-footer {\n padding: 10px 15px;\n background-color: #f5f5f5;\n border-top: 1px solid #ddd;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px; }\n\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n margin-bottom: 0; }\n .panel > .list-group .list-group-item,\n .panel > .panel-collapse > .list-group .list-group-item {\n border-width: 1px 0;\n border-radius: 0; }\n .panel > .list-group:first-child .list-group-item:first-child,\n .panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n border-top: 0;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px; }\n .panel > .list-group:last-child .list-group-item:last-child,\n .panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n border-bottom: 0;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px; }\n\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0; }\n\n.panel-heading + .list-group .list-group-item:first-child {\n border-top-width: 0; }\n\n.list-group + .panel-footer {\n border-top-width: 0; }\n\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n margin-bottom: 0; }\n .panel > .table caption,\n .panel > .table-responsive > .table caption,\n .panel > .panel-collapse > .table caption {\n padding-left: 15px;\n padding-right: 15px; }\n\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n border-top-right-radius: 3px;\n border-top-left-radius: 3px; }\n .panel > .table:first-child > thead:first-child > tr:first-child,\n .panel > .table:first-child > tbody:first-child > tr:first-child,\n .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px; }\n .panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n .panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n .panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n .panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n border-top-left-radius: 3px; }\n .panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n .panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n .panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n .panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n border-top-right-radius: 3px; }\n\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px; }\n .panel > .table:last-child > tbody:last-child > tr:last-child,\n .panel > .table:last-child > tfoot:last-child > tr:last-child,\n .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n border-bottom-left-radius: 3px;\n border-bottom-right-radius: 3px; }\n .panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n .panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n .panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n .panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n border-bottom-left-radius: 3px; }\n .panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n .panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n .panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n .panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n border-bottom-right-radius: 3px; }\n\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n border-top: 1px solid #ddd; }\n\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n border-top: 0; }\n\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n border: 0; }\n .panel > .table-bordered > thead > tr > th:first-child,\n .panel > .table-bordered > thead > tr > td:first-child,\n .panel > .table-bordered > tbody > tr > th:first-child,\n .panel > .table-bordered > tbody > tr > td:first-child,\n .panel > .table-bordered > tfoot > tr > th:first-child,\n .panel > .table-bordered > tfoot > tr > td:first-child,\n .panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n .panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n .panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n .panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n .panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n .panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0; }\n .panel > .table-bordered > thead > tr > th:last-child,\n .panel > .table-bordered > thead > tr > td:last-child,\n .panel > .table-bordered > tbody > tr > th:last-child,\n .panel > .table-bordered > tbody > tr > td:last-child,\n .panel > .table-bordered > tfoot > tr > th:last-child,\n .panel > .table-bordered > tfoot > tr > td:last-child,\n .panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n .panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n .panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n .panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n .panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n .panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0; }\n .panel > .table-bordered > thead > tr:first-child > td,\n .panel > .table-bordered > thead > tr:first-child > th,\n .panel > .table-bordered > tbody > tr:first-child > td,\n .panel > .table-bordered > tbody > tr:first-child > th,\n .panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n .panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n .panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n .panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n border-bottom: 0; }\n .panel > .table-bordered > tbody > tr:last-child > td,\n .panel > .table-bordered > tbody > tr:last-child > th,\n .panel > .table-bordered > tfoot > tr:last-child > td,\n .panel > .table-bordered > tfoot > tr:last-child > th,\n .panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n .panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n border-bottom: 0; }\n\n.panel > .table-responsive {\n border: 0;\n margin-bottom: 0; }\n\n.panel-group {\n margin-bottom: 20px; }\n .panel-group .panel {\n margin-bottom: 0;\n border-radius: 4px; }\n .panel-group .panel + .panel {\n margin-top: 5px; }\n .panel-group .panel-heading {\n border-bottom: 0; }\n .panel-group .panel-heading + .panel-collapse > .panel-body,\n .panel-group .panel-heading + .panel-collapse > .list-group {\n border-top: 1px solid #ddd; }\n .panel-group .panel-footer {\n border-top: 0; }\n .panel-group .panel-footer + .panel-collapse .panel-body {\n border-bottom: 1px solid #ddd; }\n\n.panel-default {\n border-color: #ddd; }\n .panel-default > .panel-heading {\n color: #333333;\n background-color: #f5f5f5;\n border-color: #ddd; }\n .panel-default > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ddd; }\n .panel-default > .panel-heading .badge {\n color: #f5f5f5;\n background-color: #333333; }\n .panel-default > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ddd; }\n\n.panel-primary {\n border-color: #337ab7; }\n .panel-primary > .panel-heading {\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7; }\n .panel-primary > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #337ab7; }\n .panel-primary > .panel-heading .badge {\n color: #337ab7;\n background-color: #fff; }\n .panel-primary > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #337ab7; }\n\n.panel-success {\n border-color: #d6e9c6; }\n .panel-success > .panel-heading {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6; }\n .panel-success > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #d6e9c6; }\n .panel-success > .panel-heading .badge {\n color: #dff0d8;\n background-color: #3c763d; }\n .panel-success > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #d6e9c6; }\n\n.panel-info {\n border-color: #bce8f1; }\n .panel-info > .panel-heading {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1; }\n .panel-info > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #bce8f1; }\n .panel-info > .panel-heading .badge {\n color: #d9edf7;\n background-color: #31708f; }\n .panel-info > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #bce8f1; }\n\n.panel-warning {\n border-color: #faebcc; }\n .panel-warning > .panel-heading {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc; }\n .panel-warning > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #faebcc; }\n .panel-warning > .panel-heading .badge {\n color: #fcf8e3;\n background-color: #8a6d3b; }\n .panel-warning > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #faebcc; }\n\n.panel-danger {\n border-color: #ebccd1; }\n .panel-danger > .panel-heading {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1; }\n .panel-danger > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ebccd1; }\n .panel-danger > .panel-heading .badge {\n color: #f2dede;\n background-color: #a94442; }\n .panel-danger > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ebccd1; }\n\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden; }\n .embed-responsive .embed-responsive-item,\n .embed-responsive iframe,\n .embed-responsive embed,\n .embed-responsive object,\n .embed-responsive video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0; }\n\n.embed-responsive-16by9 {\n padding-bottom: 56.25%; }\n\n.embed-responsive-4by3 {\n padding-bottom: 75%; }\n\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border: 1px solid #e3e3e3;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); }\n .well blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, 0.15); }\n\n.well-lg {\n padding: 24px;\n border-radius: 6px; }\n\n.well-sm {\n padding: 9px;\n border-radius: 3px; }\n\n.close {\n float: right;\n font-size: 21px;\n font-weight: bold;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n opacity: 0.2;\n filter: alpha(opacity=20); }\n .close:hover, .close:focus {\n color: #000;\n text-decoration: none;\n cursor: pointer;\n opacity: 0.5;\n filter: alpha(opacity=50); }\n\nbutton.close {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none; }\n\n.modal-open {\n overflow: hidden; }\n\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1050;\n -webkit-overflow-scrolling: touch;\n outline: 0; }\n .modal.fade .modal-dialog {\n -webkit-transform: translate(0, -25%);\n -ms-transform: translate(0, -25%);\n -o-transform: translate(0, -25%);\n transform: translate(0, -25%);\n -webkit-transition: -webkit-transform 0.3s ease-out;\n -moz-transition: -moz-transform 0.3s ease-out;\n -o-transition: -o-transform 0.3s ease-out;\n transition: transform 0.3s ease-out; }\n .modal.in .modal-dialog {\n -webkit-transform: translate(0, 0);\n -ms-transform: translate(0, 0);\n -o-transform: translate(0, 0);\n transform: translate(0, 0); }\n\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto; }\n\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px; }\n\n.modal-content {\n position: relative;\n background-color: #fff;\n border: 1px solid #999;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n background-clip: padding-box;\n outline: 0; }\n\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n background-color: #000; }\n .modal-backdrop.fade {\n opacity: 0;\n filter: alpha(opacity=0); }\n .modal-backdrop.in {\n opacity: 0.5;\n filter: alpha(opacity=50); }\n\n.modal-header {\n padding: 15px;\n border-bottom: 1px solid #e5e5e5; }\n .modal-header:before, .modal-header:after {\n content: \" \";\n display: table; }\n .modal-header:after {\n clear: both; }\n\n.modal-header .close {\n margin-top: -2px; }\n\n.modal-title {\n margin: 0;\n line-height: 1.428571429; }\n\n.modal-body {\n position: relative;\n padding: 15px; }\n\n.modal-footer {\n padding: 15px;\n text-align: right;\n border-top: 1px solid #e5e5e5; }\n .modal-footer:before, .modal-footer:after {\n content: \" \";\n display: table; }\n .modal-footer:after {\n clear: both; }\n .modal-footer .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0; }\n .modal-footer .btn-group .btn + .btn {\n margin-left: -1px; }\n .modal-footer .btn-block + .btn-block {\n margin-left: 0; }\n\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll; }\n\n@media (min-width: 768px) {\n .modal-dialog {\n width: 600px;\n margin: 30px auto; }\n .modal-content {\n -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); }\n .modal-sm {\n width: 300px; } }\n\n@media (min-width: 992px) {\n .modal-lg {\n width: 900px; } }\n\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n font-family: \"Lato\", sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.428571429;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 12px;\n opacity: 0;\n filter: alpha(opacity=0); }\n .tooltip.in {\n opacity: 0.9;\n filter: alpha(opacity=90); }\n .tooltip.top {\n margin-top: -3px;\n padding: 5px 0; }\n .tooltip.right {\n margin-left: 3px;\n padding: 0 5px; }\n .tooltip.bottom {\n margin-top: 3px;\n padding: 5px 0; }\n .tooltip.left {\n margin-left: -3px;\n padding: 0 5px; }\n\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 4px; }\n\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid; }\n\n.tooltip.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000; }\n\n.tooltip.top-left .tooltip-arrow {\n bottom: 0;\n right: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000; }\n\n.tooltip.top-right .tooltip-arrow {\n bottom: 0;\n left: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000; }\n\n.tooltip.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: #000; }\n\n.tooltip.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: #000; }\n\n.tooltip.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000; }\n\n.tooltip.bottom-left .tooltip-arrow {\n top: 0;\n right: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000; }\n\n.tooltip.bottom-right .tooltip-arrow {\n top: 0;\n left: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000; }\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: none;\n max-width: 276px;\n padding: 1px;\n font-family: \"Lato\", sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.428571429;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 14px;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); }\n .popover.top {\n margin-top: -10px; }\n .popover.right {\n margin-left: 10px; }\n .popover.bottom {\n margin-top: 10px; }\n .popover.left {\n margin-left: -10px; }\n\n.popover-title {\n margin: 0;\n padding: 8px 14px;\n font-size: 14px;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-radius: 5px 5px 0 0; }\n\n.popover-content {\n padding: 9px 14px; }\n\n.popover > .arrow, .popover > .arrow:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid; }\n\n.popover > .arrow {\n border-width: 11px; }\n\n.popover > .arrow:after {\n border-width: 10px;\n content: \"\"; }\n\n.popover.top > .arrow {\n left: 50%;\n margin-left: -11px;\n border-bottom-width: 0;\n border-top-color: #999999;\n border-top-color: rgba(0, 0, 0, 0.25);\n bottom: -11px; }\n .popover.top > .arrow:after {\n content: \" \";\n bottom: 1px;\n margin-left: -10px;\n border-bottom-width: 0;\n border-top-color: #fff; }\n\n.popover.right > .arrow {\n top: 50%;\n left: -11px;\n margin-top: -11px;\n border-left-width: 0;\n border-right-color: #999999;\n border-right-color: rgba(0, 0, 0, 0.25); }\n .popover.right > .arrow:after {\n content: \" \";\n left: 1px;\n bottom: -10px;\n border-left-width: 0;\n border-right-color: #fff; }\n\n.popover.bottom > .arrow {\n left: 50%;\n margin-left: -11px;\n border-top-width: 0;\n border-bottom-color: #999999;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n top: -11px; }\n .popover.bottom > .arrow:after {\n content: \" \";\n top: 1px;\n margin-left: -10px;\n border-top-width: 0;\n border-bottom-color: #fff; }\n\n.popover.left > .arrow {\n top: 50%;\n right: -11px;\n margin-top: -11px;\n border-right-width: 0;\n border-left-color: #999999;\n border-left-color: rgba(0, 0, 0, 0.25); }\n .popover.left > .arrow:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: #fff;\n bottom: -10px; }\n\n.carousel {\n position: relative; }\n\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%; }\n .carousel-inner > .item {\n display: none;\n position: relative;\n -webkit-transition: 0.6s ease-in-out left;\n -o-transition: 0.6s ease-in-out left;\n transition: 0.6s ease-in-out left; }\n .carousel-inner > .item > img,\n .carousel-inner > .item > a > img {\n display: block;\n max-width: 100%;\n height: auto;\n line-height: 1; }\n @media all and (transform-3d), (-webkit-transform-3d) {\n .carousel-inner > .item {\n -webkit-transition: -webkit-transform 0.6s ease-in-out;\n -moz-transition: -moz-transform 0.6s ease-in-out;\n -o-transition: -o-transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out;\n -webkit-backface-visibility: hidden;\n -moz-backface-visibility: hidden;\n backface-visibility: hidden;\n -webkit-perspective: 1000px;\n -moz-perspective: 1000px;\n perspective: 1000px; }\n .carousel-inner > .item.next, .carousel-inner > .item.active.right {\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n left: 0; }\n .carousel-inner > .item.prev, .carousel-inner > .item.active.left {\n -webkit-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n left: 0; }\n .carousel-inner > .item.next.left, .carousel-inner > .item.prev.right, .carousel-inner > .item.active {\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n left: 0; } }\n .carousel-inner > .active,\n .carousel-inner > .next,\n .carousel-inner > .prev {\n display: block; }\n .carousel-inner > .active {\n left: 0; }\n .carousel-inner > .next,\n .carousel-inner > .prev {\n position: absolute;\n top: 0;\n width: 100%; }\n .carousel-inner > .next {\n left: 100%; }\n .carousel-inner > .prev {\n left: -100%; }\n .carousel-inner > .next.left,\n .carousel-inner > .prev.right {\n left: 0; }\n .carousel-inner > .active.left {\n left: -100%; }\n .carousel-inner > .active.right {\n left: 100%; }\n\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: 15%;\n opacity: 0.5;\n filter: alpha(opacity=50);\n font-size: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n background-color: transparent; }\n .carousel-control.left {\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); }\n .carousel-control.right {\n left: auto;\n right: 0;\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); }\n .carousel-control:hover, .carousel-control:focus {\n outline: 0;\n color: #fff;\n text-decoration: none;\n opacity: 0.9;\n filter: alpha(opacity=90); }\n .carousel-control .icon-prev,\n .carousel-control .icon-next,\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n margin-top: -10px;\n z-index: 5;\n display: inline-block; }\n .carousel-control .icon-prev,\n .carousel-control .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px; }\n .carousel-control .icon-next,\n .carousel-control .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px; }\n .carousel-control .icon-prev,\n .carousel-control .icon-next {\n width: 20px;\n height: 20px;\n line-height: 1;\n font-family: serif; }\n .carousel-control .icon-prev:before {\n content: '\\2039'; }\n .carousel-control .icon-next:before {\n content: '\\203a'; }\n\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center; }\n .carousel-indicators li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid #fff;\n border-radius: 10px;\n cursor: pointer;\n background-color: #000 \\9;\n background-color: transparent; }\n .carousel-indicators .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: #fff; }\n\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); }\n .carousel-caption .btn {\n text-shadow: none; }\n\n@media screen and (min-width: 768px) {\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-prev,\n .carousel-control .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -10px;\n font-size: 30px; }\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .icon-prev {\n margin-left: -10px; }\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-next {\n margin-right: -10px; }\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px; }\n .carousel-indicators {\n bottom: 20px; } }\n\n.clearfix:before, .clearfix:after {\n content: \" \";\n display: table; }\n\n.clearfix:after {\n clear: both; }\n\n.center-block {\n display: block;\n margin-left: auto;\n margin-right: auto; }\n\n.pull-right {\n float: right !important; }\n\n.pull-left {\n float: left !important; }\n\n.hide {\n display: none !important; }\n\n.show {\n display: block !important; }\n\n.invisible {\n visibility: hidden; }\n\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0; }\n\n.hidden {\n display: none !important; }\n\n.affix {\n position: fixed; }\n\n@-ms-viewport {\n width: device-width; }\n\n.visible-xs {\n display: none !important; }\n\n.visible-sm {\n display: none !important; }\n\n.visible-md {\n display: none !important; }\n\n.visible-lg {\n display: none !important; }\n\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important; }\n\n@media (max-width: 767px) {\n .visible-xs {\n display: block !important; }\n table.visible-xs {\n display: table !important; }\n tr.visible-xs {\n display: table-row !important; }\n th.visible-xs,\n td.visible-xs {\n display: table-cell !important; } }\n\n@media (max-width: 767px) {\n .visible-xs-block {\n display: block !important; } }\n\n@media (max-width: 767px) {\n .visible-xs-inline {\n display: inline !important; } }\n\n@media (max-width: 767px) {\n .visible-xs-inline-block {\n display: inline-block !important; } }\n\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm {\n display: block !important; }\n table.visible-sm {\n display: table !important; }\n tr.visible-sm {\n display: table-row !important; }\n th.visible-sm,\n td.visible-sm {\n display: table-cell !important; } }\n\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-block {\n display: block !important; } }\n\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline {\n display: inline !important; } }\n\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline-block {\n display: inline-block !important; } }\n\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md {\n display: block !important; }\n table.visible-md {\n display: table !important; }\n tr.visible-md {\n display: table-row !important; }\n th.visible-md,\n td.visible-md {\n display: table-cell !important; } }\n\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-block {\n display: block !important; } }\n\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline {\n display: inline !important; } }\n\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline-block {\n display: inline-block !important; } }\n\n@media (min-width: 1200px) {\n .visible-lg {\n display: block !important; }\n table.visible-lg {\n display: table !important; }\n tr.visible-lg {\n display: table-row !important; }\n th.visible-lg,\n td.visible-lg {\n display: table-cell !important; } }\n\n@media (min-width: 1200px) {\n .visible-lg-block {\n display: block !important; } }\n\n@media (min-width: 1200px) {\n .visible-lg-inline {\n display: inline !important; } }\n\n@media (min-width: 1200px) {\n .visible-lg-inline-block {\n display: inline-block !important; } }\n\n@media (max-width: 767px) {\n .hidden-xs {\n display: none !important; } }\n\n@media (min-width: 768px) and (max-width: 991px) {\n .hidden-sm {\n display: none !important; } }\n\n@media (min-width: 992px) and (max-width: 1199px) {\n .hidden-md {\n display: none !important; } }\n\n@media (min-width: 1200px) {\n .hidden-lg {\n display: none !important; } }\n\n.visible-print {\n display: none !important; }\n\n@media print {\n .visible-print {\n display: block !important; }\n table.visible-print {\n display: table !important; }\n tr.visible-print {\n display: table-row !important; }\n th.visible-print,\n td.visible-print {\n display: table-cell !important; } }\n\n.visible-print-block {\n display: none !important; }\n @media print {\n .visible-print-block {\n display: block !important; } }\n\n.visible-print-inline {\n display: none !important; }\n @media print {\n .visible-print-inline {\n display: inline !important; } }\n\n.visible-print-inline-block {\n display: none !important; }\n @media print {\n .visible-print-inline-block {\n display: inline-block !important; } }\n\n@media print {\n .hidden-print {\n display: none !important; } }\n","@import url(https://fonts.googleapis.com/css?family=Lato);\n$font-family-sans-serif: 'Lato', sans-serif;\n\n@import \"node_modules/bootstrap-sass/assets/stylesheets/bootstrap\";\n","/*!\n * Bootstrap v3.3.6 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n// Core variables and mixins\n@import \"bootstrap/variables\";\n@import \"bootstrap/mixins\";\n\n// Reset and dependencies\n@import \"bootstrap/normalize\";\n@import \"bootstrap/print\";\n@import \"bootstrap/glyphicons\";\n\n// Core CSS\n@import \"bootstrap/scaffolding\";\n@import \"bootstrap/type\";\n@import \"bootstrap/code\";\n@import \"bootstrap/grid\";\n@import \"bootstrap/tables\";\n@import \"bootstrap/forms\";\n@import \"bootstrap/buttons\";\n\n// Components\n@import \"bootstrap/component-animations\";\n@import \"bootstrap/dropdowns\";\n@import \"bootstrap/button-groups\";\n@import \"bootstrap/input-groups\";\n@import \"bootstrap/navs\";\n@import \"bootstrap/navbar\";\n@import \"bootstrap/breadcrumbs\";\n@import \"bootstrap/pagination\";\n@import \"bootstrap/pager\";\n@import \"bootstrap/labels\";\n@import \"bootstrap/badges\";\n@import \"bootstrap/jumbotron\";\n@import \"bootstrap/thumbnails\";\n@import \"bootstrap/alerts\";\n@import \"bootstrap/progress-bars\";\n@import \"bootstrap/media\";\n@import \"bootstrap/list-group\";\n@import \"bootstrap/panels\";\n@import \"bootstrap/responsive-embed\";\n@import \"bootstrap/wells\";\n@import \"bootstrap/close\";\n\n// Components w/ JavaScript\n@import \"bootstrap/modals\";\n@import \"bootstrap/tooltip\";\n@import \"bootstrap/popovers\";\n@import \"bootstrap/carousel\";\n\n// Utility classes\n@import \"bootstrap/utilities\";\n@import \"bootstrap/responsive-utilities\";\n","/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS and IE text size adjust after device orientation change,\n// without disabling user zoom.\n//\n\nhtml {\n font-family: sans-serif; // 1\n -ms-text-size-adjust: 100%; // 2\n -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11\n// and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; // 1\n vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n background-color: transparent;\n}\n\n//\n// Improve readability of focused elements when they are also in an\n// active/hover state.\n//\n\na:active,\na:hover {\n outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n//\n\nabbr[title] {\n border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n box-sizing: content-box;\n height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n// Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; // 1\n font: inherit; // 2\n margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n// and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n// `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; // 2\n cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; // 1\n padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome.\n//\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; // 1\n box-sizing: content-box; //2\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n border: 0; // 1\n padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n","/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request: h5bp.com/r\n// ==========================================================================\n\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important; // Black prints faster: h5bp.com/s\n box-shadow: none !important;\n text-shadow: none !important;\n }\n\n a,\n a:visited {\n text-decoration: underline;\n }\n\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n\n // Don't show links that are fragment identifiers,\n // or use the `javascript:` pseudo protocol\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n\n thead {\n display: table-header-group; // h5bp.com/t\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n img {\n max-width: 100% !important;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Bootstrap specific changes start\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .btn,\n .dropup > .btn {\n > .caret {\n border-top-color: #000 !important;\n }\n }\n .label {\n border: 1px solid #000;\n }\n\n .table {\n border-collapse: collapse !important;\n\n td,\n th {\n background-color: #fff !important;\n }\n }\n .table-bordered {\n th,\n td {\n border: 1px solid #ddd !important;\n }\n }\n\n // Bootstrap specific changes end\n}\n","//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// Star\n\n@at-root {\n // Import the fonts\n @font-face {\n font-family: 'Glyphicons Halflings';\n src: url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.eot'), '#{$icon-font-path}#{$icon-font-name}.eot'));\n src: url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.eot?#iefix'), '#{$icon-font-path}#{$icon-font-name}.eot?#iefix')) format('embedded-opentype'),\n url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.woff2'), '#{$icon-font-path}#{$icon-font-name}.woff2')) format('woff2'),\n url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.woff'), '#{$icon-font-path}#{$icon-font-name}.woff')) format('woff'),\n url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.ttf'), '#{$icon-font-path}#{$icon-font-name}.ttf')) format('truetype'),\n url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.svg##{$icon-font-svg-id}'), '#{$icon-font-path}#{$icon-font-name}.svg##{$icon-font-svg-id}')) format('svg');\n }\n}\n\n// Catchall baseclass\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk { &:before { content: \"\\002a\"; } }\n.glyphicon-plus { &:before { content: \"\\002b\"; } }\n.glyphicon-euro,\n.glyphicon-eur { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil { &:before { content: \"\\270f\"; } }\n.glyphicon-glass { &:before { content: \"\\e001\"; } }\n.glyphicon-music { &:before { content: \"\\e002\"; } }\n.glyphicon-search { &:before { content: \"\\e003\"; } }\n.glyphicon-heart { &:before { content: \"\\e005\"; } }\n.glyphicon-star { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty { &:before { content: \"\\e007\"; } }\n.glyphicon-user { &:before { content: \"\\e008\"; } }\n.glyphicon-film { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large { &:before { content: \"\\e010\"; } }\n.glyphicon-th { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list { &:before { content: \"\\e012\"; } }\n.glyphicon-ok { &:before { content: \"\\e013\"; } }\n.glyphicon-remove { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out { &:before { content: \"\\e016\"; } }\n.glyphicon-off { &:before { content: \"\\e017\"; } }\n.glyphicon-signal { &:before { content: \"\\e018\"; } }\n.glyphicon-cog { &:before { content: \"\\e019\"; } }\n.glyphicon-trash { &:before { content: \"\\e020\"; } }\n.glyphicon-home { &:before { content: \"\\e021\"; } }\n.glyphicon-file { &:before { content: \"\\e022\"; } }\n.glyphicon-time { &:before { content: \"\\e023\"; } }\n.glyphicon-road { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt { &:before { content: \"\\e025\"; } }\n.glyphicon-download { &:before { content: \"\\e026\"; } }\n.glyphicon-upload { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt { &:before { content: \"\\e032\"; } }\n.glyphicon-lock { &:before { content: \"\\e033\"; } }\n.glyphicon-flag { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode { &:before { content: \"\\e040\"; } }\n.glyphicon-tag { &:before { content: \"\\e041\"; } }\n.glyphicon-tags { &:before { content: \"\\e042\"; } }\n.glyphicon-book { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark { &:before { content: \"\\e044\"; } }\n.glyphicon-print { &:before { content: \"\\e045\"; } }\n.glyphicon-camera { &:before { content: \"\\e046\"; } }\n.glyphicon-font { &:before { content: \"\\e047\"; } }\n.glyphicon-bold { &:before { content: \"\\e048\"; } }\n.glyphicon-italic { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify { &:before { content: \"\\e055\"; } }\n.glyphicon-list { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video { &:before { content: \"\\e059\"; } }\n.glyphicon-picture { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust { &:before { content: \"\\e063\"; } }\n.glyphicon-tint { &:before { content: \"\\e064\"; } }\n.glyphicon-edit { &:before { content: \"\\e065\"; } }\n.glyphicon-share { &:before { content: \"\\e066\"; } }\n.glyphicon-check { &:before { content: \"\\e067\"; } }\n.glyphicon-move { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward { &:before { content: \"\\e070\"; } }\n.glyphicon-backward { &:before { content: \"\\e071\"; } }\n.glyphicon-play { &:before { content: \"\\e072\"; } }\n.glyphicon-pause { &:before { content: \"\\e073\"; } }\n.glyphicon-stop { &:before { content: \"\\e074\"; } }\n.glyphicon-forward { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward { &:before { content: \"\\e077\"; } }\n.glyphicon-eject { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign { &:before { content: \"\\e101\"; } }\n.glyphicon-gift { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf { &:before { content: \"\\e103\"; } }\n.glyphicon-fire { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign { &:before { content: \"\\e107\"; } }\n.glyphicon-plane { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar { &:before { content: \"\\e109\"; } }\n.glyphicon-random { &:before { content: \"\\e110\"; } }\n.glyphicon-comment { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn { &:before { content: \"\\e122\"; } }\n.glyphicon-bell { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down { &:before { content: \"\\e134\"; } }\n.glyphicon-globe { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks { &:before { content: \"\\e137\"; } }\n.glyphicon-filter { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty { &:before { content: \"\\e143\"; } }\n.glyphicon-link { &:before { content: \"\\e144\"; } }\n.glyphicon-phone { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin { &:before { content: \"\\e146\"; } }\n.glyphicon-usd { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp { &:before { content: \"\\e149\"; } }\n.glyphicon-sort { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked { &:before { content: \"\\e157\"; } }\n.glyphicon-expand { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in { &:before { content: \"\\e161\"; } }\n.glyphicon-flash { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window { &:before { content: \"\\e164\"; } }\n.glyphicon-record { &:before { content: \"\\e165\"; } }\n.glyphicon-save { &:before { content: \"\\e166\"; } }\n.glyphicon-open { &:before { content: \"\\e167\"; } }\n.glyphicon-saved { &:before { content: \"\\e168\"; } }\n.glyphicon-import { &:before { content: \"\\e169\"; } }\n.glyphicon-export { &:before { content: \"\\e170\"; } }\n.glyphicon-send { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery { &:before { content: \"\\e179\"; } }\n.glyphicon-header { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt { &:before { content: \"\\e183\"; } }\n.glyphicon-tower { &:before { content: \"\\e184\"; } }\n.glyphicon-stats { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1 { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1 { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1 { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous { &:before { content: \"\\e200\"; } }\n.glyphicon-cd { &:before { content: \"\\e201\"; } }\n.glyphicon-save-file { &:before { content: \"\\e202\"; } }\n.glyphicon-open-file { &:before { content: \"\\e203\"; } }\n.glyphicon-level-up { &:before { content: \"\\e204\"; } }\n.glyphicon-copy { &:before { content: \"\\e205\"; } }\n.glyphicon-paste { &:before { content: \"\\e206\"; } }\n// The following 2 Glyphicons are omitted for the time being because\n// they currently use Unicode codepoints that are outside the\n// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle\n// non-BMP codepoints in CSS string escapes, and thus can't display these two icons.\n// Notably, the bug affects some older versions of the Android Browser.\n// More info: https://github.com/twbs/bootstrap/issues/10106\n// .glyphicon-door { &:before { content: \"\\1f6aa\"; } }\n// .glyphicon-key { &:before { content: \"\\1f511\"; } }\n.glyphicon-alert { &:before { content: \"\\e209\"; } }\n.glyphicon-equalizer { &:before { content: \"\\e210\"; } }\n.glyphicon-king { &:before { content: \"\\e211\"; } }\n.glyphicon-queen { &:before { content: \"\\e212\"; } }\n.glyphicon-pawn { &:before { content: \"\\e213\"; } }\n.glyphicon-bishop { &:before { content: \"\\e214\"; } }\n.glyphicon-knight { &:before { content: \"\\e215\"; } }\n.glyphicon-baby-formula { &:before { content: \"\\e216\"; } }\n.glyphicon-tent { &:before { content: \"\\26fa\"; } }\n.glyphicon-blackboard { &:before { content: \"\\e218\"; } }\n.glyphicon-bed { &:before { content: \"\\e219\"; } }\n.glyphicon-apple { &:before { content: \"\\f8ff\"; } }\n.glyphicon-erase { &:before { content: \"\\e221\"; } }\n.glyphicon-hourglass { &:before { content: \"\\231b\"; } }\n.glyphicon-lamp { &:before { content: \"\\e223\"; } }\n.glyphicon-duplicate { &:before { content: \"\\e224\"; } }\n.glyphicon-piggy-bank { &:before { content: \"\\e225\"; } }\n.glyphicon-scissors { &:before { content: \"\\e226\"; } }\n.glyphicon-bitcoin { &:before { content: \"\\e227\"; } }\n.glyphicon-btc { &:before { content: \"\\e227\"; } }\n.glyphicon-xbt { &:before { content: \"\\e227\"; } }\n.glyphicon-yen { &:before { content: \"\\00a5\"; } }\n.glyphicon-jpy { &:before { content: \"\\00a5\"; } }\n.glyphicon-ruble { &:before { content: \"\\20bd\"; } }\n.glyphicon-rub { &:before { content: \"\\20bd\"; } }\n.glyphicon-scale { &:before { content: \"\\e230\"; } }\n.glyphicon-ice-lolly { &:before { content: \"\\e231\"; } }\n.glyphicon-ice-lolly-tasted { &:before { content: \"\\e232\"; } }\n.glyphicon-education { &:before { content: \"\\e233\"; } }\n.glyphicon-option-horizontal { &:before { content: \"\\e234\"; } }\n.glyphicon-option-vertical { &:before { content: \"\\e235\"; } }\n.glyphicon-menu-hamburger { &:before { content: \"\\e236\"; } }\n.glyphicon-modal-window { &:before { content: \"\\e237\"; } }\n.glyphicon-oil { &:before { content: \"\\e238\"; } }\n.glyphicon-grain { &:before { content: \"\\e239\"; } }\n.glyphicon-sunglasses { &:before { content: \"\\e240\"; } }\n.glyphicon-text-size { &:before { content: \"\\e241\"; } }\n.glyphicon-text-color { &:before { content: \"\\e242\"; } }\n.glyphicon-text-background { &:before { content: \"\\e243\"; } }\n.glyphicon-object-align-top { &:before { content: \"\\e244\"; } }\n.glyphicon-object-align-bottom { &:before { content: \"\\e245\"; } }\n.glyphicon-object-align-horizontal{ &:before { content: \"\\e246\"; } }\n.glyphicon-object-align-left { &:before { content: \"\\e247\"; } }\n.glyphicon-object-align-vertical { &:before { content: \"\\e248\"; } }\n.glyphicon-object-align-right { &:before { content: \"\\e249\"; } }\n.glyphicon-triangle-right { &:before { content: \"\\e250\"; } }\n.glyphicon-triangle-left { &:before { content: \"\\e251\"; } }\n.glyphicon-triangle-bottom { &:before { content: \"\\e252\"; } }\n.glyphicon-triangle-top { &:before { content: \"\\e253\"; } }\n.glyphicon-console { &:before { content: \"\\e254\"; } }\n.glyphicon-superscript { &:before { content: \"\\e255\"; } }\n.glyphicon-subscript { &:before { content: \"\\e256\"; } }\n.glyphicon-menu-left { &:before { content: \"\\e257\"; } }\n.glyphicon-menu-right { &:before { content: \"\\e258\"; } }\n.glyphicon-menu-down { &:before { content: \"\\e259\"; } }\n.glyphicon-menu-up { &:before { content: \"\\e260\"; } }\n","//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// http://getbootstrap.com/getting-started/#third-box-sizing\n* {\n @include box-sizing(border-box);\n}\n*:before,\n*:after {\n @include box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n font-family: $font-family-base;\n font-size: $font-size-base;\n line-height: $line-height-base;\n color: $text-color;\n background-color: $body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n\n// Links\n\na {\n color: $link-color;\n text-decoration: none;\n\n &:hover,\n &:focus {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n\n &:focus {\n @include tab-focus;\n }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n margin: 0;\n}\n\n\n// Images\n\nimg {\n vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n @include img-responsive;\n}\n\n// Rounded corners\n.img-rounded {\n border-radius: $border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n padding: $thumbnail-padding;\n line-height: $line-height-base;\n background-color: $thumbnail-bg;\n border: 1px solid $thumbnail-border;\n border-radius: $thumbnail-border-radius;\n @include transition(all .2s ease-in-out);\n\n // Keep them at most 100% wide\n @include img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n margin-top: $line-height-computed;\n margin-bottom: $line-height-computed;\n border: 0;\n border-top: 1px solid $hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content/\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0,0,0,0);\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n }\n}\n\n\n// iOS \"clickable elements\" fix for role=\"button\"\n//\n// Fixes \"clickability\" issue (and more generally, the firing of events such as focus as well)\n// for traditionally non-focusable elements with role=\"button\"\n// see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n\n[role=\"button\"] {\n cursor: pointer;\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n@mixin animation($animation) {\n -webkit-animation: $animation;\n -o-animation: $animation;\n animation: $animation;\n}\n@mixin animation-name($name) {\n -webkit-animation-name: $name;\n animation-name: $name;\n}\n@mixin animation-duration($duration) {\n -webkit-animation-duration: $duration;\n animation-duration: $duration;\n}\n@mixin animation-timing-function($timing-function) {\n -webkit-animation-timing-function: $timing-function;\n animation-timing-function: $timing-function;\n}\n@mixin animation-delay($delay) {\n -webkit-animation-delay: $delay;\n animation-delay: $delay;\n}\n@mixin animation-iteration-count($iteration-count) {\n -webkit-animation-iteration-count: $iteration-count;\n animation-iteration-count: $iteration-count;\n}\n@mixin animation-direction($direction) {\n -webkit-animation-direction: $direction;\n animation-direction: $direction;\n}\n@mixin animation-fill-mode($fill-mode) {\n -webkit-animation-fill-mode: $fill-mode;\n animation-fill-mode: $fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n@mixin backface-visibility($visibility) {\n -webkit-backface-visibility: $visibility;\n -moz-backface-visibility: $visibility;\n backface-visibility: $visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n@mixin box-shadow($shadow...) {\n -webkit-box-shadow: $shadow; // iOS <4.3 & Android <4.1\n box-shadow: $shadow;\n}\n\n// Box sizing\n@mixin box-sizing($boxmodel) {\n -webkit-box-sizing: $boxmodel;\n -moz-box-sizing: $boxmodel;\n box-sizing: $boxmodel;\n}\n\n// CSS3 Content Columns\n@mixin content-columns($column-count, $column-gap: $grid-gutter-width) {\n -webkit-column-count: $column-count;\n -moz-column-count: $column-count;\n column-count: $column-count;\n -webkit-column-gap: $column-gap;\n -moz-column-gap: $column-gap;\n column-gap: $column-gap;\n}\n\n// Optional hyphenation\n@mixin hyphens($mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: $mode;\n -moz-hyphens: $mode;\n -ms-hyphens: $mode; // IE10+\n -o-hyphens: $mode;\n hyphens: $mode;\n}\n\n// Placeholder text\n@mixin placeholder($color: $input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: $color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: $color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: $color; } // Safari and Chrome\n}\n\n// Transformations\n@mixin scale($ratio...) {\n -webkit-transform: scale($ratio);\n -ms-transform: scale($ratio); // IE9 only\n -o-transform: scale($ratio);\n transform: scale($ratio);\n}\n\n@mixin scaleX($ratio) {\n -webkit-transform: scaleX($ratio);\n -ms-transform: scaleX($ratio); // IE9 only\n -o-transform: scaleX($ratio);\n transform: scaleX($ratio);\n}\n@mixin scaleY($ratio) {\n -webkit-transform: scaleY($ratio);\n -ms-transform: scaleY($ratio); // IE9 only\n -o-transform: scaleY($ratio);\n transform: scaleY($ratio);\n}\n@mixin skew($x, $y) {\n -webkit-transform: skewX($x) skewY($y);\n -ms-transform: skewX($x) skewY($y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX($x) skewY($y);\n transform: skewX($x) skewY($y);\n}\n@mixin translate($x, $y) {\n -webkit-transform: translate($x, $y);\n -ms-transform: translate($x, $y); // IE9 only\n -o-transform: translate($x, $y);\n transform: translate($x, $y);\n}\n@mixin translate3d($x, $y, $z) {\n -webkit-transform: translate3d($x, $y, $z);\n transform: translate3d($x, $y, $z);\n}\n@mixin rotate($degrees) {\n -webkit-transform: rotate($degrees);\n -ms-transform: rotate($degrees); // IE9 only\n -o-transform: rotate($degrees);\n transform: rotate($degrees);\n}\n@mixin rotateX($degrees) {\n -webkit-transform: rotateX($degrees);\n -ms-transform: rotateX($degrees); // IE9 only\n -o-transform: rotateX($degrees);\n transform: rotateX($degrees);\n}\n@mixin rotateY($degrees) {\n -webkit-transform: rotateY($degrees);\n -ms-transform: rotateY($degrees); // IE9 only\n -o-transform: rotateY($degrees);\n transform: rotateY($degrees);\n}\n@mixin perspective($perspective) {\n -webkit-perspective: $perspective;\n -moz-perspective: $perspective;\n perspective: $perspective;\n}\n@mixin perspective-origin($perspective) {\n -webkit-perspective-origin: $perspective;\n -moz-perspective-origin: $perspective;\n perspective-origin: $perspective;\n}\n@mixin transform-origin($origin) {\n -webkit-transform-origin: $origin;\n -moz-transform-origin: $origin;\n -ms-transform-origin: $origin; // IE9 only\n transform-origin: $origin;\n}\n\n\n// Transitions\n\n@mixin transition($transition...) {\n -webkit-transition: $transition;\n -o-transition: $transition;\n transition: $transition;\n}\n@mixin transition-property($transition-property...) {\n -webkit-transition-property: $transition-property;\n transition-property: $transition-property;\n}\n@mixin transition-delay($transition-delay) {\n -webkit-transition-delay: $transition-delay;\n transition-delay: $transition-delay;\n}\n@mixin transition-duration($transition-duration...) {\n -webkit-transition-duration: $transition-duration;\n transition-duration: $transition-duration;\n}\n@mixin transition-timing-function($timing-function) {\n -webkit-transition-timing-function: $timing-function;\n transition-timing-function: $timing-function;\n}\n@mixin transition-transform($transition...) {\n -webkit-transition: -webkit-transform $transition;\n -moz-transition: -moz-transform $transition;\n -o-transition: -o-transform $transition;\n transition: transform $transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n@mixin user-select($select) {\n -webkit-user-select: $select;\n -moz-user-select: $select;\n -ms-user-select: $select; // IE10+\n user-select: $select;\n}\n","$bootstrap-sass-asset-helper: false !default;\n//\n// Variables\n// --------------------------------------------------\n\n\n//== Colors\n//\n//## Gray and brand colors for use across Bootstrap.\n\n$gray-base: #000 !default;\n$gray-darker: lighten($gray-base, 13.5%) !default; // #222\n$gray-dark: lighten($gray-base, 20%) !default; // #333\n$gray: lighten($gray-base, 33.5%) !default; // #555\n$gray-light: lighten($gray-base, 46.7%) !default; // #777\n$gray-lighter: lighten($gray-base, 93.5%) !default; // #eee\n\n$brand-primary: darken(#428bca, 6.5%) !default; // #337ab7\n$brand-success: #5cb85c !default;\n$brand-info: #5bc0de !default;\n$brand-warning: #f0ad4e !default;\n$brand-danger: #d9534f !default;\n\n\n//== Scaffolding\n//\n//## Settings for some of the most global styles.\n\n//** Background color for ``.\n$body-bg: #fff !default;\n//** Global text color on ``.\n$text-color: $gray-dark !default;\n\n//** Global textual link color.\n$link-color: $brand-primary !default;\n//** Link hover color set via `darken()` function.\n$link-hover-color: darken($link-color, 15%) !default;\n//** Link hover decoration.\n$link-hover-decoration: underline !default;\n\n\n//== Typography\n//\n//## Font, line-height, and color for body text, headings, and more.\n\n$font-family-sans-serif: \"Helvetica Neue\", Helvetica, Arial, sans-serif !default;\n$font-family-serif: Georgia, \"Times New Roman\", Times, serif !default;\n//** Default monospace fonts for ``, ``, and `
    `.\n$font-family-monospace:   Menlo, Monaco, Consolas, \"Courier New\", monospace !default;\n$font-family-base:        $font-family-sans-serif !default;\n\n$font-size-base:          14px !default;\n$font-size-large:         ceil(($font-size-base * 1.25)) !default; // ~18px\n$font-size-small:         ceil(($font-size-base * 0.85)) !default; // ~12px\n\n$font-size-h1:            floor(($font-size-base * 2.6)) !default; // ~36px\n$font-size-h2:            floor(($font-size-base * 2.15)) !default; // ~30px\n$font-size-h3:            ceil(($font-size-base * 1.7)) !default; // ~24px\n$font-size-h4:            ceil(($font-size-base * 1.25)) !default; // ~18px\n$font-size-h5:            $font-size-base !default;\n$font-size-h6:            ceil(($font-size-base * 0.85)) !default; // ~12px\n\n//** Unit-less `line-height` for use in components like buttons.\n$line-height-base:        1.428571429 !default; // 20/14\n//** Computed \"line-height\" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.\n$line-height-computed:    floor(($font-size-base * $line-height-base)) !default; // ~20px\n\n//** By default, this inherits from the ``.\n$headings-font-family:    inherit !default;\n$headings-font-weight:    500 !default;\n$headings-line-height:    1.1 !default;\n$headings-color:          inherit !default;\n\n\n//== Iconography\n//\n//## Specify custom location and filename of the included Glyphicons icon font. Useful for those including Bootstrap via Bower.\n\n//** Load fonts from this directory.\n\n// [converter] If $bootstrap-sass-asset-helper if used, provide path relative to the assets load path.\n// [converter] This is because some asset helpers, such as Sprockets, do not work with file-relative paths.\n$icon-font-path: if($bootstrap-sass-asset-helper, \"bootstrap/\", \"../fonts/bootstrap/\") !default;\n\n//** File name for all font files.\n$icon-font-name:          \"glyphicons-halflings-regular\" !default;\n//** Element ID within SVG icon file.\n$icon-font-svg-id:        \"glyphicons_halflingsregular\" !default;\n\n\n//== Components\n//\n//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).\n\n$padding-base-vertical:     6px !default;\n$padding-base-horizontal:   12px !default;\n\n$padding-large-vertical:    10px !default;\n$padding-large-horizontal:  16px !default;\n\n$padding-small-vertical:    5px !default;\n$padding-small-horizontal:  10px !default;\n\n$padding-xs-vertical:       1px !default;\n$padding-xs-horizontal:     5px !default;\n\n$line-height-large:         1.3333333 !default; // extra decimals for Win 8.1 Chrome\n$line-height-small:         1.5 !default;\n\n$border-radius-base:        4px !default;\n$border-radius-large:       6px !default;\n$border-radius-small:       3px !default;\n\n//** Global color for active items (e.g., navs or dropdowns).\n$component-active-color:    #fff !default;\n//** Global background color for active items (e.g., navs or dropdowns).\n$component-active-bg:       $brand-primary !default;\n\n//** Width of the `border` for generating carets that indicator dropdowns.\n$caret-width-base:          4px !default;\n//** Carets increase slightly in size for larger components.\n$caret-width-large:         5px !default;\n\n\n//== Tables\n//\n//## Customizes the `.table` component with basic values, each used across all table variations.\n\n//** Padding for ``s and ``s.\n$table-cell-padding:            8px !default;\n//** Padding for cells in `.table-condensed`.\n$table-condensed-cell-padding:  5px !default;\n\n//** Default background color used for all tables.\n$table-bg:                      transparent !default;\n//** Background color used for `.table-striped`.\n$table-bg-accent:               #f9f9f9 !default;\n//** Background color used for `.table-hover`.\n$table-bg-hover:                #f5f5f5 !default;\n$table-bg-active:               $table-bg-hover !default;\n\n//** Border color for table and cell borders.\n$table-border-color:            #ddd !default;\n\n\n//== Buttons\n//\n//## For each of Bootstrap's buttons, define text, background and border color.\n\n$btn-font-weight:                normal !default;\n\n$btn-default-color:              #333 !default;\n$btn-default-bg:                 #fff !default;\n$btn-default-border:             #ccc !default;\n\n$btn-primary-color:              #fff !default;\n$btn-primary-bg:                 $brand-primary !default;\n$btn-primary-border:             darken($btn-primary-bg, 5%) !default;\n\n$btn-success-color:              #fff !default;\n$btn-success-bg:                 $brand-success !default;\n$btn-success-border:             darken($btn-success-bg, 5%) !default;\n\n$btn-info-color:                 #fff !default;\n$btn-info-bg:                    $brand-info !default;\n$btn-info-border:                darken($btn-info-bg, 5%) !default;\n\n$btn-warning-color:              #fff !default;\n$btn-warning-bg:                 $brand-warning !default;\n$btn-warning-border:             darken($btn-warning-bg, 5%) !default;\n\n$btn-danger-color:               #fff !default;\n$btn-danger-bg:                  $brand-danger !default;\n$btn-danger-border:              darken($btn-danger-bg, 5%) !default;\n\n$btn-link-disabled-color:        $gray-light !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius-base:         $border-radius-base !default;\n$btn-border-radius-large:        $border-radius-large !default;\n$btn-border-radius-small:        $border-radius-small !default;\n\n\n//== Forms\n//\n//##\n\n//** `` background color\n$input-bg:                       #fff !default;\n//** `` background color\n$input-bg-disabled:              $gray-lighter !default;\n\n//** Text color for ``s\n$input-color:                    $gray !default;\n//** `` border color\n$input-border:                   #ccc !default;\n\n// TODO: Rename `$input-border-radius` to `$input-border-radius-base` in v4\n//** Default `.form-control` border radius\n// This has no effect on ``s in CSS.\n$input-border-radius:            $border-radius-base !default;\n//** Large `.form-control` border radius\n$input-border-radius-large:      $border-radius-large !default;\n//** Small `.form-control` border radius\n$input-border-radius-small:      $border-radius-small !default;\n\n//** Border color for inputs on focus\n$input-border-focus:             #66afe9 !default;\n\n//** Placeholder text color\n$input-color-placeholder:        #999 !default;\n\n//** Default `.form-control` height\n$input-height-base:              ($line-height-computed + ($padding-base-vertical * 2) + 2) !default;\n//** Large `.form-control` height\n$input-height-large:             (ceil($font-size-large * $line-height-large) + ($padding-large-vertical * 2) + 2) !default;\n//** Small `.form-control` height\n$input-height-small:             (floor($font-size-small * $line-height-small) + ($padding-small-vertical * 2) + 2) !default;\n\n//** `.form-group` margin\n$form-group-margin-bottom:       15px !default;\n\n$legend-color:                   $gray-dark !default;\n$legend-border-color:            #e5e5e5 !default;\n\n//** Background color for textual input addons\n$input-group-addon-bg:           $gray-lighter !default;\n//** Border color for textual input addons\n$input-group-addon-border-color: $input-border !default;\n\n//** Disabled cursor for form controls and buttons.\n$cursor-disabled:                not-allowed !default;\n\n\n//== Dropdowns\n//\n//## Dropdown menu container and contents.\n\n//** Background for the dropdown menu.\n$dropdown-bg:                    #fff !default;\n//** Dropdown menu `border-color`.\n$dropdown-border:                rgba(0,0,0,.15) !default;\n//** Dropdown menu `border-color` **for IE8**.\n$dropdown-fallback-border:       #ccc !default;\n//** Divider color for between dropdown items.\n$dropdown-divider-bg:            #e5e5e5 !default;\n\n//** Dropdown link text color.\n$dropdown-link-color:            $gray-dark !default;\n//** Hover color for dropdown links.\n$dropdown-link-hover-color:      darken($gray-dark, 5%) !default;\n//** Hover background for dropdown links.\n$dropdown-link-hover-bg:         #f5f5f5 !default;\n\n//** Active dropdown menu item text color.\n$dropdown-link-active-color:     $component-active-color !default;\n//** Active dropdown menu item background color.\n$dropdown-link-active-bg:        $component-active-bg !default;\n\n//** Disabled dropdown menu item background color.\n$dropdown-link-disabled-color:   $gray-light !default;\n\n//** Text color for headers within dropdown menus.\n$dropdown-header-color:          $gray-light !default;\n\n//** Deprecated `$dropdown-caret-color` as of v3.1.0\n$dropdown-caret-color:           #000 !default;\n\n\n//-- Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n//\n// Note: These variables are not generated into the Customizer.\n\n$zindex-navbar:            1000 !default;\n$zindex-dropdown:          1000 !default;\n$zindex-popover:           1060 !default;\n$zindex-tooltip:           1070 !default;\n$zindex-navbar-fixed:      1030 !default;\n$zindex-modal-background:  1040 !default;\n$zindex-modal:             1050 !default;\n\n\n//== Media queries breakpoints\n//\n//## Define the breakpoints at which your layout will change, adapting to different screen sizes.\n\n// Extra small screen / phone\n//** Deprecated `$screen-xs` as of v3.0.1\n$screen-xs:                  480px !default;\n//** Deprecated `$screen-xs-min` as of v3.2.0\n$screen-xs-min:              $screen-xs !default;\n//** Deprecated `$screen-phone` as of v3.0.1\n$screen-phone:               $screen-xs-min !default;\n\n// Small screen / tablet\n//** Deprecated `$screen-sm` as of v3.0.1\n$screen-sm:                  768px !default;\n$screen-sm-min:              $screen-sm !default;\n//** Deprecated `$screen-tablet` as of v3.0.1\n$screen-tablet:              $screen-sm-min !default;\n\n// Medium screen / desktop\n//** Deprecated `$screen-md` as of v3.0.1\n$screen-md:                  992px !default;\n$screen-md-min:              $screen-md !default;\n//** Deprecated `$screen-desktop` as of v3.0.1\n$screen-desktop:             $screen-md-min !default;\n\n// Large screen / wide desktop\n//** Deprecated `$screen-lg` as of v3.0.1\n$screen-lg:                  1200px !default;\n$screen-lg-min:              $screen-lg !default;\n//** Deprecated `$screen-lg-desktop` as of v3.0.1\n$screen-lg-desktop:          $screen-lg-min !default;\n\n// So media queries don't overlap when required, provide a maximum\n$screen-xs-max:              ($screen-sm-min - 1) !default;\n$screen-sm-max:              ($screen-md-min - 1) !default;\n$screen-md-max:              ($screen-lg-min - 1) !default;\n\n\n//== Grid system\n//\n//## Define your custom responsive grid.\n\n//** Number of columns in the grid.\n$grid-columns:              12 !default;\n//** Padding between columns. Gets divided in half for the left and right.\n$grid-gutter-width:         30px !default;\n// Navbar collapse\n//** Point at which the navbar becomes uncollapsed.\n$grid-float-breakpoint:     $screen-sm-min !default;\n//** Point at which the navbar begins collapsing.\n$grid-float-breakpoint-max: ($grid-float-breakpoint - 1) !default;\n\n\n//== Container sizes\n//\n//## Define the maximum width of `.container` for different screen sizes.\n\n// Small screen / tablet\n$container-tablet:             (720px + $grid-gutter-width) !default;\n//** For `$screen-sm-min` and up.\n$container-sm:                 $container-tablet !default;\n\n// Medium screen / desktop\n$container-desktop:            (940px + $grid-gutter-width) !default;\n//** For `$screen-md-min` and up.\n$container-md:                 $container-desktop !default;\n\n// Large screen / wide desktop\n$container-large-desktop:      (1140px + $grid-gutter-width) !default;\n//** For `$screen-lg-min` and up.\n$container-lg:                 $container-large-desktop !default;\n\n\n//== Navbar\n//\n//##\n\n// Basics of a navbar\n$navbar-height:                    50px !default;\n$navbar-margin-bottom:             $line-height-computed !default;\n$navbar-border-radius:             $border-radius-base !default;\n$navbar-padding-horizontal:        floor(($grid-gutter-width / 2)) !default;\n$navbar-padding-vertical:          (($navbar-height - $line-height-computed) / 2) !default;\n$navbar-collapse-max-height:       340px !default;\n\n$navbar-default-color:             #777 !default;\n$navbar-default-bg:                #f8f8f8 !default;\n$navbar-default-border:            darken($navbar-default-bg, 6.5%) !default;\n\n// Navbar links\n$navbar-default-link-color:                #777 !default;\n$navbar-default-link-hover-color:          #333 !default;\n$navbar-default-link-hover-bg:             transparent !default;\n$navbar-default-link-active-color:         #555 !default;\n$navbar-default-link-active-bg:            darken($navbar-default-bg, 6.5%) !default;\n$navbar-default-link-disabled-color:       #ccc !default;\n$navbar-default-link-disabled-bg:          transparent !default;\n\n// Navbar brand label\n$navbar-default-brand-color:               $navbar-default-link-color !default;\n$navbar-default-brand-hover-color:         darken($navbar-default-brand-color, 10%) !default;\n$navbar-default-brand-hover-bg:            transparent !default;\n\n// Navbar toggle\n$navbar-default-toggle-hover-bg:           #ddd !default;\n$navbar-default-toggle-icon-bar-bg:        #888 !default;\n$navbar-default-toggle-border-color:       #ddd !default;\n\n\n//=== Inverted navbar\n// Reset inverted navbar basics\n$navbar-inverse-color:                      lighten($gray-light, 15%) !default;\n$navbar-inverse-bg:                         #222 !default;\n$navbar-inverse-border:                     darken($navbar-inverse-bg, 10%) !default;\n\n// Inverted navbar links\n$navbar-inverse-link-color:                 lighten($gray-light, 15%) !default;\n$navbar-inverse-link-hover-color:           #fff !default;\n$navbar-inverse-link-hover-bg:              transparent !default;\n$navbar-inverse-link-active-color:          $navbar-inverse-link-hover-color !default;\n$navbar-inverse-link-active-bg:             darken($navbar-inverse-bg, 10%) !default;\n$navbar-inverse-link-disabled-color:        #444 !default;\n$navbar-inverse-link-disabled-bg:           transparent !default;\n\n// Inverted navbar brand label\n$navbar-inverse-brand-color:                $navbar-inverse-link-color !default;\n$navbar-inverse-brand-hover-color:          #fff !default;\n$navbar-inverse-brand-hover-bg:             transparent !default;\n\n// Inverted navbar toggle\n$navbar-inverse-toggle-hover-bg:            #333 !default;\n$navbar-inverse-toggle-icon-bar-bg:         #fff !default;\n$navbar-inverse-toggle-border-color:        #333 !default;\n\n\n//== Navs\n//\n//##\n\n//=== Shared nav styles\n$nav-link-padding:                          10px 15px !default;\n$nav-link-hover-bg:                         $gray-lighter !default;\n\n$nav-disabled-link-color:                   $gray-light !default;\n$nav-disabled-link-hover-color:             $gray-light !default;\n\n//== Tabs\n$nav-tabs-border-color:                     #ddd !default;\n\n$nav-tabs-link-hover-border-color:          $gray-lighter !default;\n\n$nav-tabs-active-link-hover-bg:             $body-bg !default;\n$nav-tabs-active-link-hover-color:          $gray !default;\n$nav-tabs-active-link-hover-border-color:   #ddd !default;\n\n$nav-tabs-justified-link-border-color:            #ddd !default;\n$nav-tabs-justified-active-link-border-color:     $body-bg !default;\n\n//== Pills\n$nav-pills-border-radius:                   $border-radius-base !default;\n$nav-pills-active-link-hover-bg:            $component-active-bg !default;\n$nav-pills-active-link-hover-color:         $component-active-color !default;\n\n\n//== Pagination\n//\n//##\n\n$pagination-color:                     $link-color !default;\n$pagination-bg:                        #fff !default;\n$pagination-border:                    #ddd !default;\n\n$pagination-hover-color:               $link-hover-color !default;\n$pagination-hover-bg:                  $gray-lighter !default;\n$pagination-hover-border:              #ddd !default;\n\n$pagination-active-color:              #fff !default;\n$pagination-active-bg:                 $brand-primary !default;\n$pagination-active-border:             $brand-primary !default;\n\n$pagination-disabled-color:            $gray-light !default;\n$pagination-disabled-bg:               #fff !default;\n$pagination-disabled-border:           #ddd !default;\n\n\n//== Pager\n//\n//##\n\n$pager-bg:                             $pagination-bg !default;\n$pager-border:                         $pagination-border !default;\n$pager-border-radius:                  15px !default;\n\n$pager-hover-bg:                       $pagination-hover-bg !default;\n\n$pager-active-bg:                      $pagination-active-bg !default;\n$pager-active-color:                   $pagination-active-color !default;\n\n$pager-disabled-color:                 $pagination-disabled-color !default;\n\n\n//== Jumbotron\n//\n//##\n\n$jumbotron-padding:              30px !default;\n$jumbotron-color:                inherit !default;\n$jumbotron-bg:                   $gray-lighter !default;\n$jumbotron-heading-color:        inherit !default;\n$jumbotron-font-size:            ceil(($font-size-base * 1.5)) !default;\n$jumbotron-heading-font-size:    ceil(($font-size-base * 4.5)) !default;\n\n\n//== Form states and alerts\n//\n//## Define colors for form feedback states and, by default, alerts.\n\n$state-success-text:             #3c763d !default;\n$state-success-bg:               #dff0d8 !default;\n$state-success-border:           darken(adjust-hue($state-success-bg, -10), 5%) !default;\n\n$state-info-text:                #31708f !default;\n$state-info-bg:                  #d9edf7 !default;\n$state-info-border:              darken(adjust-hue($state-info-bg, -10), 7%) !default;\n\n$state-warning-text:             #8a6d3b !default;\n$state-warning-bg:               #fcf8e3 !default;\n$state-warning-border:           darken(adjust-hue($state-warning-bg, -10), 5%) !default;\n\n$state-danger-text:              #a94442 !default;\n$state-danger-bg:                #f2dede !default;\n$state-danger-border:            darken(adjust-hue($state-danger-bg, -10), 5%) !default;\n\n\n//== Tooltips\n//\n//##\n\n//** Tooltip max width\n$tooltip-max-width:           200px !default;\n//** Tooltip text color\n$tooltip-color:               #fff !default;\n//** Tooltip background color\n$tooltip-bg:                  #000 !default;\n$tooltip-opacity:             .9 !default;\n\n//** Tooltip arrow width\n$tooltip-arrow-width:         5px !default;\n//** Tooltip arrow color\n$tooltip-arrow-color:         $tooltip-bg !default;\n\n\n//== Popovers\n//\n//##\n\n//** Popover body background color\n$popover-bg:                          #fff !default;\n//** Popover maximum width\n$popover-max-width:                   276px !default;\n//** Popover border color\n$popover-border-color:                rgba(0,0,0,.2) !default;\n//** Popover fallback border color\n$popover-fallback-border-color:       #ccc !default;\n\n//** Popover title background color\n$popover-title-bg:                    darken($popover-bg, 3%) !default;\n\n//** Popover arrow width\n$popover-arrow-width:                 10px !default;\n//** Popover arrow color\n$popover-arrow-color:                 $popover-bg !default;\n\n//** Popover outer arrow width\n$popover-arrow-outer-width:           ($popover-arrow-width + 1) !default;\n//** Popover outer arrow color\n$popover-arrow-outer-color:           fade_in($popover-border-color, 0.05) !default;\n//** Popover outer arrow fallback color\n$popover-arrow-outer-fallback-color:  darken($popover-fallback-border-color, 20%) !default;\n\n\n//== Labels\n//\n//##\n\n//** Default label background color\n$label-default-bg:            $gray-light !default;\n//** Primary label background color\n$label-primary-bg:            $brand-primary !default;\n//** Success label background color\n$label-success-bg:            $brand-success !default;\n//** Info label background color\n$label-info-bg:               $brand-info !default;\n//** Warning label background color\n$label-warning-bg:            $brand-warning !default;\n//** Danger label background color\n$label-danger-bg:             $brand-danger !default;\n\n//** Default label text color\n$label-color:                 #fff !default;\n//** Default text color of a linked label\n$label-link-hover-color:      #fff !default;\n\n\n//== Modals\n//\n//##\n\n//** Padding applied to the modal body\n$modal-inner-padding:         15px !default;\n\n//** Padding applied to the modal title\n$modal-title-padding:         15px !default;\n//** Modal title line-height\n$modal-title-line-height:     $line-height-base !default;\n\n//** Background color of modal content area\n$modal-content-bg:                             #fff !default;\n//** Modal content border color\n$modal-content-border-color:                   rgba(0,0,0,.2) !default;\n//** Modal content border color **for IE8**\n$modal-content-fallback-border-color:          #999 !default;\n\n//** Modal backdrop background color\n$modal-backdrop-bg:           #000 !default;\n//** Modal backdrop opacity\n$modal-backdrop-opacity:      .5 !default;\n//** Modal header border color\n$modal-header-border-color:   #e5e5e5 !default;\n//** Modal footer border color\n$modal-footer-border-color:   $modal-header-border-color !default;\n\n$modal-lg:                    900px !default;\n$modal-md:                    600px !default;\n$modal-sm:                    300px !default;\n\n\n//== Alerts\n//\n//## Define alert colors, border radius, and padding.\n\n$alert-padding:               15px !default;\n$alert-border-radius:         $border-radius-base !default;\n$alert-link-font-weight:      bold !default;\n\n$alert-success-bg:            $state-success-bg !default;\n$alert-success-text:          $state-success-text !default;\n$alert-success-border:        $state-success-border !default;\n\n$alert-info-bg:               $state-info-bg !default;\n$alert-info-text:             $state-info-text !default;\n$alert-info-border:           $state-info-border !default;\n\n$alert-warning-bg:            $state-warning-bg !default;\n$alert-warning-text:          $state-warning-text !default;\n$alert-warning-border:        $state-warning-border !default;\n\n$alert-danger-bg:             $state-danger-bg !default;\n$alert-danger-text:           $state-danger-text !default;\n$alert-danger-border:         $state-danger-border !default;\n\n\n//== Progress bars\n//\n//##\n\n//** Background color of the whole progress component\n$progress-bg:                 #f5f5f5 !default;\n//** Progress bar text color\n$progress-bar-color:          #fff !default;\n//** Variable for setting rounded corners on progress bar.\n$progress-border-radius:      $border-radius-base !default;\n\n//** Default progress bar color\n$progress-bar-bg:             $brand-primary !default;\n//** Success progress bar color\n$progress-bar-success-bg:     $brand-success !default;\n//** Warning progress bar color\n$progress-bar-warning-bg:     $brand-warning !default;\n//** Danger progress bar color\n$progress-bar-danger-bg:      $brand-danger !default;\n//** Info progress bar color\n$progress-bar-info-bg:        $brand-info !default;\n\n\n//== List group\n//\n//##\n\n//** Background color on `.list-group-item`\n$list-group-bg:                 #fff !default;\n//** `.list-group-item` border color\n$list-group-border:             #ddd !default;\n//** List group border radius\n$list-group-border-radius:      $border-radius-base !default;\n\n//** Background color of single list items on hover\n$list-group-hover-bg:           #f5f5f5 !default;\n//** Text color of active list items\n$list-group-active-color:       $component-active-color !default;\n//** Background color of active list items\n$list-group-active-bg:          $component-active-bg !default;\n//** Border color of active list elements\n$list-group-active-border:      $list-group-active-bg !default;\n//** Text color for content within active list items\n$list-group-active-text-color:  lighten($list-group-active-bg, 40%) !default;\n\n//** Text color of disabled list items\n$list-group-disabled-color:      $gray-light !default;\n//** Background color of disabled list items\n$list-group-disabled-bg:         $gray-lighter !default;\n//** Text color for content within disabled list items\n$list-group-disabled-text-color: $list-group-disabled-color !default;\n\n$list-group-link-color:         #555 !default;\n$list-group-link-hover-color:   $list-group-link-color !default;\n$list-group-link-heading-color: #333 !default;\n\n\n//== Panels\n//\n//##\n\n$panel-bg:                    #fff !default;\n$panel-body-padding:          15px !default;\n$panel-heading-padding:       10px 15px !default;\n$panel-footer-padding:        $panel-heading-padding !default;\n$panel-border-radius:         $border-radius-base !default;\n\n//** Border color for elements within panels\n$panel-inner-border:          #ddd !default;\n$panel-footer-bg:             #f5f5f5 !default;\n\n$panel-default-text:          $gray-dark !default;\n$panel-default-border:        #ddd !default;\n$panel-default-heading-bg:    #f5f5f5 !default;\n\n$panel-primary-text:          #fff !default;\n$panel-primary-border:        $brand-primary !default;\n$panel-primary-heading-bg:    $brand-primary !default;\n\n$panel-success-text:          $state-success-text !default;\n$panel-success-border:        $state-success-border !default;\n$panel-success-heading-bg:    $state-success-bg !default;\n\n$panel-info-text:             $state-info-text !default;\n$panel-info-border:           $state-info-border !default;\n$panel-info-heading-bg:       $state-info-bg !default;\n\n$panel-warning-text:          $state-warning-text !default;\n$panel-warning-border:        $state-warning-border !default;\n$panel-warning-heading-bg:    $state-warning-bg !default;\n\n$panel-danger-text:           $state-danger-text !default;\n$panel-danger-border:         $state-danger-border !default;\n$panel-danger-heading-bg:     $state-danger-bg !default;\n\n\n//== Thumbnails\n//\n//##\n\n//** Padding around the thumbnail image\n$thumbnail-padding:           4px !default;\n//** Thumbnail background color\n$thumbnail-bg:                $body-bg !default;\n//** Thumbnail border color\n$thumbnail-border:            #ddd !default;\n//** Thumbnail border radius\n$thumbnail-border-radius:     $border-radius-base !default;\n\n//** Custom text color for thumbnail captions\n$thumbnail-caption-color:     $text-color !default;\n//** Padding around the thumbnail caption\n$thumbnail-caption-padding:   9px !default;\n\n\n//== Wells\n//\n//##\n\n$well-bg:                     #f5f5f5 !default;\n$well-border:                 darken($well-bg, 7%) !default;\n\n\n//== Badges\n//\n//##\n\n$badge-color:                 #fff !default;\n//** Linked badge text color on hover\n$badge-link-hover-color:      #fff !default;\n$badge-bg:                    $gray-light !default;\n\n//** Badge text color in active nav link\n$badge-active-color:          $link-color !default;\n//** Badge background color in active nav link\n$badge-active-bg:             #fff !default;\n\n$badge-font-weight:           bold !default;\n$badge-line-height:           1 !default;\n$badge-border-radius:         10px !default;\n\n\n//== Breadcrumbs\n//\n//##\n\n$breadcrumb-padding-vertical:   8px !default;\n$breadcrumb-padding-horizontal: 15px !default;\n//** Breadcrumb background color\n$breadcrumb-bg:                 #f5f5f5 !default;\n//** Breadcrumb text color\n$breadcrumb-color:              #ccc !default;\n//** Text color of current page in the breadcrumb\n$breadcrumb-active-color:       $gray-light !default;\n//** Textual separator for between breadcrumb elements\n$breadcrumb-separator:          \"/\" !default;\n\n\n//== Carousel\n//\n//##\n\n$carousel-text-shadow:                        0 1px 2px rgba(0,0,0,.6) !default;\n\n$carousel-control-color:                      #fff !default;\n$carousel-control-width:                      15% !default;\n$carousel-control-opacity:                    .5 !default;\n$carousel-control-font-size:                  20px !default;\n\n$carousel-indicator-active-bg:                #fff !default;\n$carousel-indicator-border-color:             #fff !default;\n\n$carousel-caption-color:                      #fff !default;\n\n\n//== Close\n//\n//##\n\n$close-font-weight:           bold !default;\n$close-color:                 #000 !default;\n$close-text-shadow:           0 1px 0 #fff !default;\n\n\n//== Code\n//\n//##\n\n$code-color:                  #c7254e !default;\n$code-bg:                     #f9f2f4 !default;\n\n$kbd-color:                   #fff !default;\n$kbd-bg:                      #333 !default;\n\n$pre-bg:                      #f5f5f5 !default;\n$pre-color:                   $gray-dark !default;\n$pre-border-color:            #ccc !default;\n$pre-scrollable-max-height:   340px !default;\n\n\n//== Type\n//\n//##\n\n//** Horizontal offset for forms and lists.\n$component-offset-horizontal: 180px !default;\n//** Text muted color\n$text-muted:                  $gray-light !default;\n//** Abbreviations and acronyms border color\n$abbr-border-color:           $gray-light !default;\n//** Headings small color\n$headings-small-color:        $gray-light !default;\n//** Blockquote small color\n$blockquote-small-color:      $gray-light !default;\n//** Blockquote font size\n$blockquote-font-size:        ($font-size-base * 1.25) !default;\n//** Blockquote border color\n$blockquote-border-color:     $gray-lighter !default;\n//** Page header border color\n$page-header-border-color:    $gray-lighter !default;\n//** Width of horizontal description list titles\n$dl-horizontal-offset:        $component-offset-horizontal !default;\n//** Point at which .dl-horizontal becomes horizontal\n$dl-horizontal-breakpoint:    $grid-float-breakpoint !default;\n//** Horizontal line color.\n$hr-border:                   $gray-lighter !default;\n","// WebKit-style focus\n\n@mixin tab-focus() {\n  // Default\n  outline: thin dotted;\n  // WebKit\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n@mixin img-responsive($display: block) {\n  display: $display;\n  max-width: 100%; // Part 1: Set a maximum relative to the parent\n  height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n@mixin img-retina($file-1x, $file-2x, $width-1x, $height-1x) {\n  background-image: url(if($bootstrap-sass-asset-helper, twbs-image-path(\"#{$file-1x}\"), \"#{$file-1x}\"));\n\n  @media\n  only screen and (-webkit-min-device-pixel-ratio: 2),\n  only screen and (   min--moz-device-pixel-ratio: 2),\n  only screen and (     -o-min-device-pixel-ratio: 2/1),\n  only screen and (        min-device-pixel-ratio: 2),\n  only screen and (                min-resolution: 192dpi),\n  only screen and (                min-resolution: 2dppx) {\n    background-image: url(if($bootstrap-sass-asset-helper, twbs-image-path(\"#{$file-2x}\"), \"#{$file-2x}\"));\n    background-size: $width-1x $height-1x;\n  }\n}\n","//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n  font-family: $headings-font-family;\n  font-weight: $headings-font-weight;\n  line-height: $headings-line-height;\n  color: $headings-color;\n\n  small,\n  .small {\n    font-weight: normal;\n    line-height: 1;\n    color: $headings-small-color;\n  }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n  margin-top: $line-height-computed;\n  margin-bottom: ($line-height-computed / 2);\n\n  small,\n  .small {\n    font-size: 65%;\n  }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n  margin-top: ($line-height-computed / 2);\n  margin-bottom: ($line-height-computed / 2);\n\n  small,\n  .small {\n    font-size: 75%;\n  }\n}\n\nh1, .h1 { font-size: $font-size-h1; }\nh2, .h2 { font-size: $font-size-h2; }\nh3, .h3 { font-size: $font-size-h3; }\nh4, .h4 { font-size: $font-size-h4; }\nh5, .h5 { font-size: $font-size-h5; }\nh6, .h6 { font-size: $font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n  margin: 0 0 ($line-height-computed / 2);\n}\n\n.lead {\n  margin-bottom: $line-height-computed;\n  font-size: floor(($font-size-base * 1.15));\n  font-weight: 300;\n  line-height: 1.4;\n\n  @media (min-width: $screen-sm-min) {\n    font-size: ($font-size-base * 1.5);\n  }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n  font-size: floor((100% * $font-size-small / $font-size-base));\n}\n\nmark,\n.mark {\n  background-color: $state-warning-bg;\n  padding: .2em;\n}\n\n// Alignment\n.text-left           { text-align: left; }\n.text-right          { text-align: right; }\n.text-center         { text-align: center; }\n.text-justify        { text-align: justify; }\n.text-nowrap         { white-space: nowrap; }\n\n// Transformation\n.text-lowercase      { text-transform: lowercase; }\n.text-uppercase      { text-transform: uppercase; }\n.text-capitalize     { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n  color: $text-muted;\n}\n\n@include text-emphasis-variant('.text-primary', $brand-primary);\n\n@include text-emphasis-variant('.text-success', $state-success-text);\n\n@include text-emphasis-variant('.text-info', $state-info-text);\n\n@include text-emphasis-variant('.text-warning', $state-warning-text);\n\n@include text-emphasis-variant('.text-danger', $state-danger-text);\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n  // Given the contrast here, this is the only class to have its color inverted\n  // automatically.\n  color: #fff;\n}\n@include bg-variant('.bg-primary', $brand-primary);\n\n@include bg-variant('.bg-success', $state-success-bg);\n\n@include bg-variant('.bg-info', $state-info-bg);\n\n@include bg-variant('.bg-warning', $state-warning-bg);\n\n@include bg-variant('.bg-danger', $state-danger-bg);\n\n\n// Page header\n// -------------------------\n\n.page-header {\n  padding-bottom: (($line-height-computed / 2) - 1);\n  margin: ($line-height-computed * 2) 0 $line-height-computed;\n  border-bottom: 1px solid $page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n  margin-top: 0;\n  margin-bottom: ($line-height-computed / 2);\n  ul,\n  ol {\n    margin-bottom: 0;\n  }\n}\n\n// List options\n\n// [converter] extracted from `.list-unstyled` for libsass compatibility\n@mixin list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n// [converter] extracted as `@mixin list-unstyled` for libsass compatibility\n.list-unstyled {\n  @include list-unstyled;\n}\n\n\n// Inline turns list items into inline-block\n.list-inline {\n  @include list-unstyled;\n  margin-left: -5px;\n\n  > li {\n    display: inline-block;\n    padding-left: 5px;\n    padding-right: 5px;\n  }\n}\n\n// Description Lists\ndl {\n  margin-top: 0; // Remove browser default\n  margin-bottom: $line-height-computed;\n}\ndt,\ndd {\n  line-height: $line-height-base;\n}\ndt {\n  font-weight: bold;\n}\ndd {\n  margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n  dd {\n    @include clearfix; // Clear the floated `dt` if an empty `dd` is present\n  }\n\n  @media (min-width: $dl-horizontal-breakpoint) {\n    dt {\n      float: left;\n      width: ($dl-horizontal-offset - 20);\n      clear: left;\n      text-align: right;\n      @include text-overflow;\n    }\n    dd {\n      margin-left: $dl-horizontal-offset;\n    }\n  }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted $abbr-border-color;\n}\n.initialism {\n  font-size: 90%;\n  @extend .text-uppercase;\n}\n\n// Blockquotes\nblockquote {\n  padding: ($line-height-computed / 2) $line-height-computed;\n  margin: 0 0 $line-height-computed;\n  font-size: $blockquote-font-size;\n  border-left: 5px solid $blockquote-border-color;\n\n  p,\n  ul,\n  ol {\n    &:last-child {\n      margin-bottom: 0;\n    }\n  }\n\n  // Note: Deprecated small and .small as of v3.1.0\n  // Context: https://github.com/twbs/bootstrap/issues/11660\n  footer,\n  small,\n  .small {\n    display: block;\n    font-size: 80%; // back to default font-size\n    line-height: $line-height-base;\n    color: $blockquote-small-color;\n\n    &:before {\n      content: '\\2014 \\00A0'; // em dash, nbsp\n    }\n  }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid $blockquote-border-color;\n  border-left: 0;\n  text-align: right;\n\n  // Account for citation\n  footer,\n  small,\n  .small {\n    &:before { content: ''; }\n    &:after {\n      content: '\\00A0 \\2014'; // nbsp, em dash\n    }\n  }\n}\n\n// Addresses\naddress {\n  margin-bottom: $line-height-computed;\n  font-style: normal;\n  line-height: $line-height-base;\n}\n","// Typography\n\n// [converter] $parent hack\n@mixin text-emphasis-variant($parent, $color) {\n  #{$parent} {\n    color: $color;\n  }\n  a#{$parent}:hover,\n  a#{$parent}:focus {\n    color: darken($color, 10%);\n  }\n}\n","// Contextual backgrounds\n\n// [converter] $parent hack\n@mixin bg-variant($parent, $color) {\n  #{$parent} {\n    background-color: $color;\n  }\n  a#{$parent}:hover,\n  a#{$parent}:focus {\n    background-color: darken($color, 10%);\n  }\n}\n","// Clearfix\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n//    contenteditable attribute is included anywhere else in the document.\n//    Otherwise it causes space to appear at the top and bottom of elements\n//    that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n//    `:before` to contain the top-margins of child elements.\n//\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n\n@mixin clearfix() {\n  &:before,\n  &:after {\n    content: \" \"; // 1\n    display: table; // 2\n  }\n  &:after {\n    clear: both;\n  }\n}\n","// Text overflow\n// Requires inline-block or block for proper styling\n\n@mixin text-overflow() {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n  font-family: $font-family-monospace;\n}\n\n// Inline code\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: $code-color;\n  background-color: $code-bg;\n  border-radius: $border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: $kbd-color;\n  background-color: $kbd-bg;\n  border-radius: $border-radius-small;\n  box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n\n  kbd {\n    padding: 0;\n    font-size: 100%;\n    font-weight: bold;\n    box-shadow: none;\n  }\n}\n\n// Blocks of code\npre {\n  display: block;\n  padding: (($line-height-computed - 1) / 2);\n  margin: 0 0 ($line-height-computed / 2);\n  font-size: ($font-size-base - 1); // 14px to 13px\n  line-height: $line-height-base;\n  word-break: break-all;\n  word-wrap: break-word;\n  color: $pre-color;\n  background-color: $pre-bg;\n  border: 1px solid $pre-border-color;\n  border-radius: $border-radius-base;\n\n  // Account for some code outputs that place code tags in pre tags\n  code {\n    padding: 0;\n    font-size: inherit;\n    color: inherit;\n    white-space: pre-wrap;\n    background-color: transparent;\n    border-radius: 0;\n  }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n  max-height: $pre-scrollable-max-height;\n  overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n  @include container-fixed;\n\n  @media (min-width: $screen-sm-min) {\n    width: $container-sm;\n  }\n  @media (min-width: $screen-md-min) {\n    width: $container-md;\n  }\n  @media (min-width: $screen-lg-min) {\n    width: $container-lg;\n  }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n  @include container-fixed;\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n  @include make-row;\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@include make-grid-columns;\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n@include make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: $screen-sm-min) {\n  @include make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: $screen-md-min) {\n  @include make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: $screen-lg-min) {\n  @include make-grid(lg);\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n@mixin container-fixed($gutter: $grid-gutter-width) {\n  margin-right: auto;\n  margin-left: auto;\n  padding-left:  floor(($gutter / 2));\n  padding-right: ceil(($gutter / 2));\n  @include clearfix;\n}\n\n// Creates a wrapper for a series of columns\n@mixin make-row($gutter: $grid-gutter-width) {\n  margin-left:  ceil(($gutter / -2));\n  margin-right: floor(($gutter / -2));\n  @include clearfix;\n}\n\n// Generate the extra small columns\n@mixin make-xs-column($columns, $gutter: $grid-gutter-width) {\n  position: relative;\n  float: left;\n  width: percentage(($columns / $grid-columns));\n  min-height: 1px;\n  padding-left:  ($gutter / 2);\n  padding-right: ($gutter / 2);\n}\n@mixin make-xs-column-offset($columns) {\n  margin-left: percentage(($columns / $grid-columns));\n}\n@mixin make-xs-column-push($columns) {\n  left: percentage(($columns / $grid-columns));\n}\n@mixin make-xs-column-pull($columns) {\n  right: percentage(($columns / $grid-columns));\n}\n\n// Generate the small columns\n@mixin make-sm-column($columns, $gutter: $grid-gutter-width) {\n  position: relative;\n  min-height: 1px;\n  padding-left:  ($gutter / 2);\n  padding-right: ($gutter / 2);\n\n  @media (min-width: $screen-sm-min) {\n    float: left;\n    width: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-sm-column-offset($columns) {\n  @media (min-width: $screen-sm-min) {\n    margin-left: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-sm-column-push($columns) {\n  @media (min-width: $screen-sm-min) {\n    left: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-sm-column-pull($columns) {\n  @media (min-width: $screen-sm-min) {\n    right: percentage(($columns / $grid-columns));\n  }\n}\n\n// Generate the medium columns\n@mixin make-md-column($columns, $gutter: $grid-gutter-width) {\n  position: relative;\n  min-height: 1px;\n  padding-left:  ($gutter / 2);\n  padding-right: ($gutter / 2);\n\n  @media (min-width: $screen-md-min) {\n    float: left;\n    width: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-md-column-offset($columns) {\n  @media (min-width: $screen-md-min) {\n    margin-left: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-md-column-push($columns) {\n  @media (min-width: $screen-md-min) {\n    left: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-md-column-pull($columns) {\n  @media (min-width: $screen-md-min) {\n    right: percentage(($columns / $grid-columns));\n  }\n}\n\n// Generate the large columns\n@mixin make-lg-column($columns, $gutter: $grid-gutter-width) {\n  position: relative;\n  min-height: 1px;\n  padding-left:  ($gutter / 2);\n  padding-right: ($gutter / 2);\n\n  @media (min-width: $screen-lg-min) {\n    float: left;\n    width: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-lg-column-offset($columns) {\n  @media (min-width: $screen-lg-min) {\n    margin-left: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-lg-column-push($columns) {\n  @media (min-width: $screen-lg-min) {\n    left: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-lg-column-pull($columns) {\n  @media (min-width: $screen-lg-min) {\n    right: percentage(($columns / $grid-columns));\n  }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n// [converter] This is defined recursively in LESS, but Sass supports real loops\n@mixin make-grid-columns($i: 1, $list: \".col-xs-#{$i}, .col-sm-#{$i}, .col-md-#{$i}, .col-lg-#{$i}\") {\n  @for $i from (1 + 1) through $grid-columns {\n    $list: \"#{$list}, .col-xs-#{$i}, .col-sm-#{$i}, .col-md-#{$i}, .col-lg-#{$i}\";\n  }\n  #{$list} {\n    position: relative;\n    // Prevent columns from collapsing when empty\n    min-height: 1px;\n    // Inner gutter via padding\n    padding-left:  ceil(($grid-gutter-width / 2));\n    padding-right: floor(($grid-gutter-width / 2));\n  }\n}\n\n\n// [converter] This is defined recursively in LESS, but Sass supports real loops\n@mixin float-grid-columns($class, $i: 1, $list: \".col-#{$class}-#{$i}\") {\n  @for $i from (1 + 1) through $grid-columns {\n    $list: \"#{$list}, .col-#{$class}-#{$i}\";\n  }\n  #{$list} {\n    float: left;\n  }\n}\n\n\n@mixin calc-grid-column($index, $class, $type) {\n  @if ($type == width) and ($index > 0) {\n    .col-#{$class}-#{$index} {\n      width: percentage(($index / $grid-columns));\n    }\n  }\n  @if ($type == push) and ($index > 0) {\n    .col-#{$class}-push-#{$index} {\n      left: percentage(($index / $grid-columns));\n    }\n  }\n  @if ($type == push) and ($index == 0) {\n    .col-#{$class}-push-0 {\n      left: auto;\n    }\n  }\n  @if ($type == pull) and ($index > 0) {\n    .col-#{$class}-pull-#{$index} {\n      right: percentage(($index / $grid-columns));\n    }\n  }\n  @if ($type == pull) and ($index == 0) {\n    .col-#{$class}-pull-0 {\n      right: auto;\n    }\n  }\n  @if ($type == offset) {\n    .col-#{$class}-offset-#{$index} {\n      margin-left: percentage(($index / $grid-columns));\n    }\n  }\n}\n\n// [converter] This is defined recursively in LESS, but Sass supports real loops\n@mixin loop-grid-columns($columns, $class, $type) {\n  @for $i from 0 through $columns {\n    @include calc-grid-column($i, $class, $type);\n  }\n}\n\n\n// Create grid for specific class\n@mixin make-grid($class) {\n  @include float-grid-columns($class);\n  @include loop-grid-columns($grid-columns, $class, width);\n  @include loop-grid-columns($grid-columns, $class, pull);\n  @include loop-grid-columns($grid-columns, $class, push);\n  @include loop-grid-columns($grid-columns, $class, offset);\n}\n","//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n  background-color: $table-bg;\n}\ncaption {\n  padding-top: $table-cell-padding;\n  padding-bottom: $table-cell-padding;\n  color: $text-muted;\n  text-align: left;\n}\nth {\n  text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n  width: 100%;\n  max-width: 100%;\n  margin-bottom: $line-height-computed;\n  // Cells\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        padding: $table-cell-padding;\n        line-height: $line-height-base;\n        vertical-align: top;\n        border-top: 1px solid $table-border-color;\n      }\n    }\n  }\n  // Bottom align for column headings\n  > thead > tr > th {\n    vertical-align: bottom;\n    border-bottom: 2px solid $table-border-color;\n  }\n  // Remove top border from thead by default\n  > caption + thead,\n  > colgroup + thead,\n  > thead:first-child {\n    > tr:first-child {\n      > th,\n      > td {\n        border-top: 0;\n      }\n    }\n  }\n  // Account for multiple tbody instances\n  > tbody + tbody {\n    border-top: 2px solid $table-border-color;\n  }\n\n  // Nesting\n  .table {\n    background-color: $body-bg;\n  }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        padding: $table-condensed-cell-padding;\n      }\n    }\n  }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n  border: 1px solid $table-border-color;\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        border: 1px solid $table-border-color;\n      }\n    }\n  }\n  > thead > tr {\n    > th,\n    > td {\n      border-bottom-width: 2px;\n    }\n  }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n  > tbody > tr:nth-of-type(odd) {\n    background-color: $table-bg-accent;\n  }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n  > tbody > tr:hover {\n    background-color: $table-bg-hover;\n  }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n  position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n  float: none;\n  display: table-column;\n}\ntable {\n  td,\n  th {\n    &[class*=\"col-\"] {\n      position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n      float: none;\n      display: table-cell;\n    }\n  }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n@include table-row-variant('active', $table-bg-active);\n@include table-row-variant('success', $state-success-bg);\n@include table-row-variant('info', $state-info-bg);\n@include table-row-variant('warning', $state-warning-bg);\n@include table-row-variant('danger', $state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n  overflow-x: auto;\n  min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)\n\n  @media screen and (max-width: $screen-xs-max) {\n    width: 100%;\n    margin-bottom: ($line-height-computed * 0.75);\n    overflow-y: hidden;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    border: 1px solid $table-border-color;\n\n    // Tighten up spacing\n    > .table {\n      margin-bottom: 0;\n\n      // Ensure the content doesn't wrap\n      > thead,\n      > tbody,\n      > tfoot {\n        > tr {\n          > th,\n          > td {\n            white-space: nowrap;\n          }\n        }\n      }\n    }\n\n    // Special overrides for the bordered tables\n    > .table-bordered {\n      border: 0;\n\n      // Nuke the appropriate borders so that the parent can handle them\n      > thead,\n      > tbody,\n      > tfoot {\n        > tr {\n          > th:first-child,\n          > td:first-child {\n            border-left: 0;\n          }\n          > th:last-child,\n          > td:last-child {\n            border-right: 0;\n          }\n        }\n      }\n\n      // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n      // chances are there will be only one `tr` in a `thead` and that would\n      // remove the border altogether.\n      > tbody,\n      > tfoot {\n        > tr:last-child {\n          > th,\n          > td {\n            border-bottom: 0;\n          }\n        }\n      }\n\n    }\n  }\n}\n","// Tables\n\n@mixin table-row-variant($state, $background) {\n  // Exact selectors below required to override `.table-striped` and prevent\n  // inheritance to nested tables.\n  .table > thead > tr,\n  .table > tbody > tr,\n  .table > tfoot > tr {\n    > td.#{$state},\n    > th.#{$state},\n    &.#{$state} > td,\n    &.#{$state} > th {\n      background-color: $background;\n    }\n  }\n\n  // Hover states for `.table-hover`\n  // Note: this is not available for cells or rows within `thead` or `tfoot`.\n  .table-hover > tbody > tr {\n    > td.#{$state}:hover,\n    > th.#{$state}:hover,\n    &.#{$state}:hover > td,\n    &:hover > .#{$state},\n    &.#{$state}:hover > th {\n      background-color: darken($background, 5%);\n    }\n  }\n}\n","//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n  // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n  // so we reset that to ensure it behaves more like a standard block element.\n  // See https://github.com/twbs/bootstrap/issues/12359.\n  min-width: 0;\n}\n\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: $line-height-computed;\n  font-size: ($font-size-base * 1.5);\n  line-height: inherit;\n  color: $legend-color;\n  border: 0;\n  border-bottom: 1px solid $legend-border-color;\n}\n\nlabel {\n  display: inline-block;\n  max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n  margin-bottom: 5px;\n  font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n  @include box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9; // IE8-9\n  line-height: normal;\n}\n\ninput[type=\"file\"] {\n  display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n  display: block;\n  width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n  height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  @include tab-focus;\n}\n\n// Adjust output element\noutput {\n  display: block;\n  padding-top: ($padding-base-vertical + 1);\n  font-size: $font-size-base;\n  line-height: $line-height-base;\n  color: $input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n  display: block;\n  width: 100%;\n  height: $input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n  padding: $padding-base-vertical $padding-base-horizontal;\n  font-size: $font-size-base;\n  line-height: $line-height-base;\n  color: $input-color;\n  background-color: $input-bg;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid $input-border;\n  border-radius: $input-border-radius; // Note: This has no effect on s in CSS.\n  @include box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n  @include transition(border-color ease-in-out .15s, box-shadow ease-in-out .15s);\n\n  // Customize the `:focus` state to imitate native WebKit styles.\n  @include form-control-focus;\n\n  // Placeholder\n  @include placeholder;\n\n  // Unstyle the caret on ``\n// element gets special love because it's special, and that's a fact!\n// [converter] $parent hack\n@mixin input-size($parent, $input-height, $padding-vertical, $padding-horizontal, $font-size, $line-height, $border-radius) {\n  #{$parent} {\n    height: $input-height;\n    padding: $padding-vertical $padding-horizontal;\n    font-size: $font-size;\n    line-height: $line-height;\n    border-radius: $border-radius;\n  }\n\n  select#{$parent} {\n    height: $input-height;\n    line-height: $input-height;\n  }\n\n  textarea#{$parent},\n  select[multiple]#{$parent} {\n    height: auto;\n  }\n}\n","//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n.btn {\n  display: inline-block;\n  margin-bottom: 0; // For input.btn\n  font-weight: $btn-font-weight;\n  text-align: center;\n  vertical-align: middle;\n  touch-action: manipulation;\n  cursor: pointer;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid transparent;\n  white-space: nowrap;\n  @include button-size($padding-base-vertical, $padding-base-horizontal, $font-size-base, $line-height-base, $btn-border-radius-base);\n  @include user-select(none);\n\n  &,\n  &:active,\n  &.active {\n    &:focus,\n    &.focus {\n      @include tab-focus;\n    }\n  }\n\n  &:hover,\n  &:focus,\n  &.focus {\n    color: $btn-default-color;\n    text-decoration: none;\n  }\n\n  &:active,\n  &.active {\n    outline: 0;\n    background-image: none;\n    @include box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n  }\n\n  &.disabled,\n  &[disabled],\n  fieldset[disabled] & {\n    cursor: $cursor-disabled;\n    @include opacity(.65);\n    @include box-shadow(none);\n  }\n\n  // [converter] extracted a& to a.btn\n}\n\na.btn {\n  &.disabled,\n  fieldset[disabled] & {\n    pointer-events: none; // Future-proof disabling of clicks on `` elements\n  }\n}\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n.btn-default {\n  @include button-variant($btn-default-color, $btn-default-bg, $btn-default-border);\n}\n.btn-primary {\n  @include button-variant($btn-primary-color, $btn-primary-bg, $btn-primary-border);\n}\n// Success appears as green\n.btn-success {\n  @include button-variant($btn-success-color, $btn-success-bg, $btn-success-border);\n}\n// Info appears as blue-green\n.btn-info {\n  @include button-variant($btn-info-color, $btn-info-bg, $btn-info-border);\n}\n// Warning appears as orange\n.btn-warning {\n  @include button-variant($btn-warning-color, $btn-warning-bg, $btn-warning-border);\n}\n// Danger and error appear as red\n.btn-danger {\n  @include button-variant($btn-danger-color, $btn-danger-bg, $btn-danger-border);\n}\n\n\n// Link buttons\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n  color: $link-color;\n  font-weight: normal;\n  border-radius: 0;\n\n  &,\n  &:active,\n  &.active,\n  &[disabled],\n  fieldset[disabled] & {\n    background-color: transparent;\n    @include box-shadow(none);\n  }\n  &,\n  &:hover,\n  &:focus,\n  &:active {\n    border-color: transparent;\n  }\n  &:hover,\n  &:focus {\n    color: $link-hover-color;\n    text-decoration: $link-hover-decoration;\n    background-color: transparent;\n  }\n  &[disabled],\n  fieldset[disabled] & {\n    &:hover,\n    &:focus {\n      color: $btn-link-disabled-color;\n      text-decoration: none;\n    }\n  }\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-lg {\n  // line-height: ensure even-numbered height of button next to large input\n  @include button-size($padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $btn-border-radius-large);\n}\n.btn-sm {\n  // line-height: ensure proper height of button next to small input\n  @include button-size($padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $btn-border-radius-small);\n}\n.btn-xs {\n  @include button-size($padding-xs-vertical, $padding-xs-horizontal, $font-size-small, $line-height-small, $btn-border-radius-small);\n}\n\n\n// Block button\n// --------------------------------------------------\n\n.btn-block {\n  display: block;\n  width: 100%;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n  &.btn-block {\n    width: 100%;\n  }\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n@mixin button-variant($color, $background, $border) {\n  color: $color;\n  background-color: $background;\n  border-color: $border;\n\n  &:focus,\n  &.focus {\n    color: $color;\n    background-color: darken($background, 10%);\n        border-color: darken($border, 25%);\n  }\n  &:hover {\n    color: $color;\n    background-color: darken($background, 10%);\n        border-color: darken($border, 12%);\n  }\n  &:active,\n  &.active,\n  .open > &.dropdown-toggle {\n    color: $color;\n    background-color: darken($background, 10%);\n        border-color: darken($border, 12%);\n\n    &:hover,\n    &:focus,\n    &.focus {\n      color: $color;\n      background-color: darken($background, 17%);\n          border-color: darken($border, 25%);\n    }\n  }\n  &:active,\n  &.active,\n  .open > &.dropdown-toggle {\n    background-image: none;\n  }\n  &.disabled,\n  &[disabled],\n  fieldset[disabled] & {\n    &:hover,\n    &:focus,\n    &.focus {\n      background-color: $background;\n          border-color: $border;\n    }\n  }\n\n  .badge {\n    color: $background;\n    background-color: $color;\n  }\n}\n\n// Button sizes\n@mixin button-size($padding-vertical, $padding-horizontal, $font-size, $line-height, $border-radius) {\n  padding: $padding-vertical $padding-horizontal;\n  font-size: $font-size;\n  line-height: $line-height;\n  border-radius: $border-radius;\n}\n","// Opacity\n\n@mixin opacity($opacity) {\n  opacity: $opacity;\n  // IE8 filter\n  $opacity-ie: ($opacity * 100);\n  filter: alpha(opacity=$opacity-ie);\n}\n","//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `.opacity()` mixin here since it causes a bug with text\n// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.\n\n.fade {\n  opacity: 0;\n  @include transition(opacity .15s linear);\n  &.in {\n    opacity: 1;\n  }\n}\n\n.collapse {\n  display: none;\n\n  &.in      { display: block; }\n  // [converter] extracted tr&.in to tr.collapse.in\n  // [converter] extracted tbody&.in to tbody.collapse.in\n}\n\ntr.collapse.in    { display: table-row; }\n\ntbody.collapse.in { display: table-row-group; }\n\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  @include transition-property(height, visibility);\n  @include transition-duration(.35s);\n  @include transition-timing-function(ease);\n}\n","//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top:   $caret-width-base dashed;\n  border-top:   $caret-width-base solid \\9; // IE8\n  border-right: $caret-width-base solid transparent;\n  border-left:  $caret-width-base solid transparent;\n}\n\n// The dropdown wrapper (div)\n.dropup,\n.dropdown {\n  position: relative;\n}\n\n// Prevent the focus on the dropdown toggle when closing dropdowns\n.dropdown-toggle:focus {\n  outline: 0;\n}\n\n// The dropdown menu (ul)\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: $zindex-dropdown;\n  display: none; // none by default, but block on \"open\" of the menu\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0; // override default ul\n  list-style: none;\n  font-size: $font-size-base;\n  text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n  background-color: $dropdown-bg;\n  border: 1px solid $dropdown-fallback-border; // IE8 fallback\n  border: 1px solid $dropdown-border;\n  border-radius: $border-radius-base;\n  @include box-shadow(0 6px 12px rgba(0,0,0,.175));\n  background-clip: padding-box;\n\n  // Aligns the dropdown menu to right\n  //\n  // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`\n  &.pull-right {\n    right: 0;\n    left: auto;\n  }\n\n  // Dividers (basically an hr) within the dropdown\n  .divider {\n    @include nav-divider($dropdown-divider-bg);\n  }\n\n  // Links within the dropdown menu\n  > li > a {\n    display: block;\n    padding: 3px 20px;\n    clear: both;\n    font-weight: normal;\n    line-height: $line-height-base;\n    color: $dropdown-link-color;\n    white-space: nowrap; // prevent links from randomly breaking onto new lines\n  }\n}\n\n// Hover/Focus state\n.dropdown-menu > li > a {\n  &:hover,\n  &:focus {\n    text-decoration: none;\n    color: $dropdown-link-hover-color;\n    background-color: $dropdown-link-hover-bg;\n  }\n}\n\n// Active state\n.dropdown-menu > .active > a {\n  &,\n  &:hover,\n  &:focus {\n    color: $dropdown-link-active-color;\n    text-decoration: none;\n    outline: 0;\n    background-color: $dropdown-link-active-bg;\n  }\n}\n\n// Disabled state\n//\n// Gray out text and ensure the hover/focus state remains gray\n\n.dropdown-menu > .disabled > a {\n  &,\n  &:hover,\n  &:focus {\n    color: $dropdown-link-disabled-color;\n  }\n\n  // Nuke hover/focus effects\n  &:hover,\n  &:focus {\n    text-decoration: none;\n    background-color: transparent;\n    background-image: none; // Remove CSS gradient\n    @include reset-filter;\n    cursor: $cursor-disabled;\n  }\n}\n\n// Open state for the dropdown\n.open {\n  // Show the menu\n  > .dropdown-menu {\n    display: block;\n  }\n\n  // Remove the outline when :focus is triggered\n  > a {\n    outline: 0;\n  }\n}\n\n// Menu positioning\n//\n// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown\n// menu with the parent.\n.dropdown-menu-right {\n  left: auto; // Reset the default from `.dropdown-menu`\n  right: 0;\n}\n// With v3, we enabled auto-flipping if you have a dropdown within a right\n// aligned nav component. To enable the undoing of that, we provide an override\n// to restore the default dropdown menu alignment.\n//\n// This is only for left-aligning a dropdown menu within a `.navbar-right` or\n// `.pull-right` nav component.\n.dropdown-menu-left {\n  left: 0;\n  right: auto;\n}\n\n// Dropdown section headers\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: $font-size-small;\n  line-height: $line-height-base;\n  color: $dropdown-header-color;\n  white-space: nowrap; // as with > li > a\n}\n\n// Backdrop to catch body clicks on mobile, etc.\n.dropdown-backdrop {\n  position: fixed;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  top: 0;\n  z-index: ($zindex-dropdown - 10);\n}\n\n// Right aligned dropdowns\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n//\n// Just add .dropup after the standard .dropdown class and you're set, bro.\n// TODO: abstract this so that the navbar fixed styles are not placed here?\n\n.dropup,\n.navbar-fixed-bottom .dropdown {\n  // Reverse the caret\n  .caret {\n    border-top: 0;\n    border-bottom: $caret-width-base dashed;\n    border-bottom: $caret-width-base solid \\9; // IE8\n    content: \"\";\n  }\n  // Different positioning for bottom up menu\n  .dropdown-menu {\n    top: auto;\n    bottom: 100%;\n    margin-bottom: 2px;\n  }\n}\n\n\n// Component alignment\n//\n// Reiterate per navbar.less and the modified component alignment there.\n\n@media (min-width: $grid-float-breakpoint) {\n  .navbar-right {\n    .dropdown-menu {\n      right: 0; left: auto;\n    }\n    // Necessary for overrides of the default right aligned menu.\n    // Will remove come v4 in all likelihood.\n    .dropdown-menu-left {\n      left: 0; right: auto;\n    }\n  }\n}\n","// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n@mixin nav-divider($color: #e5e5e5) {\n  height: 1px;\n  margin: (($line-height-computed / 2) - 1) 0;\n  overflow: hidden;\n  background-color: $color;\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n@mixin reset-filter() {\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n","//\n// Button groups\n// --------------------------------------------------\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle; // match .btn alignment given font-size hack above\n  > .btn {\n    position: relative;\n    float: left;\n    // Bring the \"active\" button to the front\n    &:hover,\n    &:focus,\n    &:active,\n    &.active {\n      z-index: 2;\n    }\n  }\n}\n\n// Prevent double borders when buttons are next to each other\n.btn-group {\n  .btn + .btn,\n  .btn + .btn-group,\n  .btn-group + .btn,\n  .btn-group + .btn-group {\n    margin-left: -1px;\n  }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n  margin-left: -5px; // Offset the first child's margin\n  @include clearfix;\n\n  .btn,\n  .btn-group,\n  .input-group {\n    float: left;\n  }\n  > .btn,\n  > .btn-group,\n  > .input-group {\n    margin-left: 5px;\n  }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n  margin-left: 0;\n  &:not(:last-child):not(.dropdown-toggle) {\n    @include border-right-radius(0);\n  }\n}\n// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  @include border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n  float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) {\n  > .btn:last-child,\n  > .dropdown-toggle {\n    @include border-right-radius(0);\n  }\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  @include border-left-radius(0);\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-xs > .btn { @extend .btn-xs; }\n.btn-group-sm > .btn { @extend .btn-sm; }\n.btn-group-lg > .btn { @extend .btn-lg; }\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n  padding-left: 8px;\n  padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-left: 12px;\n  padding-right: 12px;\n}\n\n// The clickable button for toggling the menu\n// Remove the gradient and set the same inset shadow as the :active state\n.btn-group.open .dropdown-toggle {\n  @include box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n\n  // Show no shadow for `.btn-link` since it has no other button styles.\n  &.btn-link {\n    @include box-shadow(none);\n  }\n}\n\n\n// Reposition the caret\n.btn .caret {\n  margin-left: 0;\n}\n// Carets in other button sizes\n.btn-lg .caret {\n  border-width: $caret-width-large $caret-width-large 0;\n  border-bottom-width: 0;\n}\n// Upside down carets for .dropup\n.dropup .btn-lg .caret {\n  border-width: 0 $caret-width-large $caret-width-large;\n}\n\n\n// Vertical button groups\n// ----------------------\n\n.btn-group-vertical {\n  > .btn,\n  > .btn-group,\n  > .btn-group > .btn {\n    display: block;\n    float: none;\n    width: 100%;\n    max-width: 100%;\n  }\n\n  // Clear floats so dropdown menus can be properly placed\n  > .btn-group {\n    @include clearfix;\n    > .btn {\n      float: none;\n    }\n  }\n\n  > .btn + .btn,\n  > .btn + .btn-group,\n  > .btn-group + .btn,\n  > .btn-group + .btn-group {\n    margin-top: -1px;\n    margin-left: 0;\n  }\n}\n\n.btn-group-vertical > .btn {\n  &:not(:first-child):not(:last-child) {\n    border-radius: 0;\n  }\n  &:first-child:not(:last-child) {\n    @include border-top-radius($btn-border-radius-base);\n    @include border-bottom-radius(0);\n  }\n  &:last-child:not(:first-child) {\n    @include border-top-radius(0);\n    @include border-bottom-radius($btn-border-radius-base);\n  }\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) {\n  > .btn:last-child,\n  > .dropdown-toggle {\n    @include border-bottom-radius(0);\n  }\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  @include border-top-radius(0);\n}\n\n\n// Justified button groups\n// ----------------------\n\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  table-layout: fixed;\n  border-collapse: separate;\n  > .btn,\n  > .btn-group {\n    float: none;\n    display: table-cell;\n    width: 1%;\n  }\n  > .btn-group .btn {\n    width: 100%;\n  }\n\n  > .btn-group .dropdown-menu {\n    left: auto;\n  }\n}\n\n\n// Checkbox and radio options\n//\n// In order to support the browser's form validation feedback, powered by the\n// `required` attribute, we have to \"hide\" the inputs via `clip`. We cannot use\n// `display: none;` or `visibility: hidden;` as that also hides the popover.\n// Simply visually hiding the inputs via `opacity` would leave them clickable in\n// certain cases which is prevented by using `clip` and `pointer-events`.\n// This way, we ensure a DOM element is visible to position the popover from.\n//\n// See https://github.com/twbs/bootstrap/pull/12794 and\n// https://github.com/twbs/bootstrap/pull/14559 for more information.\n\n[data-toggle=\"buttons\"] {\n  > .btn,\n  > .btn-group > .btn {\n    input[type=\"radio\"],\n    input[type=\"checkbox\"] {\n      position: absolute;\n      clip: rect(0,0,0,0);\n      pointer-events: none;\n    }\n  }\n}\n","// Single side border-radius\n\n@mixin border-top-radius($radius) {\n  border-top-right-radius: $radius;\n   border-top-left-radius: $radius;\n}\n@mixin border-right-radius($radius) {\n  border-bottom-right-radius: $radius;\n     border-top-right-radius: $radius;\n}\n@mixin border-bottom-radius($radius) {\n  border-bottom-right-radius: $radius;\n   border-bottom-left-radius: $radius;\n}\n@mixin border-left-radius($radius) {\n  border-bottom-left-radius: $radius;\n     border-top-left-radius: $radius;\n}\n","//\n// Input groups\n// --------------------------------------------------\n\n// Base styles\n// -------------------------\n.input-group {\n  position: relative; // For dropdowns\n  display: table;\n  border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table\n\n  // Undo padding and float of grid classes\n  &[class*=\"col-\"] {\n    float: none;\n    padding-left: 0;\n    padding-right: 0;\n  }\n\n  .form-control {\n    // Ensure that the input is always above the *appended* addon button for\n    // proper border colors.\n    position: relative;\n    z-index: 2;\n\n    // IE9 fubars the placeholder attribute in text inputs and the arrows on\n    // select elements in input groups. To fix it, we float the input. Details:\n    // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855\n    float: left;\n\n    width: 100%;\n    margin-bottom: 0;\n    \n    &:focus {\n      z-index: 3;\n    }\n  }\n}\n\n// Sizing options\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n  @extend .input-lg;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n  @extend .input-sm;\n}\n\n\n// Display as table-cell\n// -------------------------\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell;\n\n  &:not(:first-child):not(:last-child) {\n    border-radius: 0;\n  }\n}\n// Addon and addon wrapper for buttons\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle; // Match the inputs\n}\n\n// Text input groups\n// -------------------------\n.input-group-addon {\n  padding: $padding-base-vertical $padding-base-horizontal;\n  font-size: $font-size-base;\n  font-weight: normal;\n  line-height: 1;\n  color: $input-color;\n  text-align: center;\n  background-color: $input-group-addon-bg;\n  border: 1px solid $input-group-addon-border-color;\n  border-radius: $input-border-radius;\n\n  // Sizing\n  &.input-sm {\n    padding: $padding-small-vertical $padding-small-horizontal;\n    font-size: $font-size-small;\n    border-radius: $input-border-radius-small;\n  }\n  &.input-lg {\n    padding: $padding-large-vertical $padding-large-horizontal;\n    font-size: $font-size-large;\n    border-radius: $input-border-radius-large;\n  }\n\n  // Nuke default margins from checkboxes and radios to vertically center within.\n  input[type=\"radio\"],\n  input[type=\"checkbox\"] {\n    margin-top: 0;\n  }\n}\n\n// Reset rounded corners\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n  @include border-right-radius(0);\n}\n.input-group-addon:first-child {\n  border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n  @include border-left-radius(0);\n}\n.input-group-addon:last-child {\n  border-left: 0;\n}\n\n// Button input groups\n// -------------------------\n.input-group-btn {\n  position: relative;\n  // Jankily prevent input button groups from wrapping with `white-space` and\n  // `font-size` in combination with `inline-block` on buttons.\n  font-size: 0;\n  white-space: nowrap;\n\n  // Negative margin for spacing, position for bringing hovered/focused/actived\n  // element above the siblings.\n  > .btn {\n    position: relative;\n    + .btn {\n      margin-left: -1px;\n    }\n    // Bring the \"active\" button to the front\n    &:hover,\n    &:focus,\n    &:active {\n      z-index: 2;\n    }\n  }\n\n  // Negative margin to only have a 1px border between the two\n  &:first-child {\n    > .btn,\n    > .btn-group {\n      margin-right: -1px;\n    }\n  }\n  &:last-child {\n    > .btn,\n    > .btn-group {\n      z-index: 2;\n      margin-left: -1px;\n    }\n  }\n}\n","//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// --------------------------------------------------\n\n.nav {\n  margin-bottom: 0;\n  padding-left: 0; // Override default ul/ol\n  list-style: none;\n  @include clearfix;\n\n  > li {\n    position: relative;\n    display: block;\n\n    > a {\n      position: relative;\n      display: block;\n      padding: $nav-link-padding;\n      &:hover,\n      &:focus {\n        text-decoration: none;\n        background-color: $nav-link-hover-bg;\n      }\n    }\n\n    // Disabled state sets text to gray and nukes hover/tab effects\n    &.disabled > a {\n      color: $nav-disabled-link-color;\n\n      &:hover,\n      &:focus {\n        color: $nav-disabled-link-hover-color;\n        text-decoration: none;\n        background-color: transparent;\n        cursor: $cursor-disabled;\n      }\n    }\n  }\n\n  // Open dropdowns\n  .open > a {\n    &,\n    &:hover,\n    &:focus {\n      background-color: $nav-link-hover-bg;\n      border-color: $link-color;\n    }\n  }\n\n  // Nav dividers (deprecated with v3.0.1)\n  //\n  // This should have been removed in v3 with the dropping of `.nav-list`, but\n  // we missed it. We don't currently support this anywhere, but in the interest\n  // of maintaining backward compatibility in case you use it, it's deprecated.\n  .nav-divider {\n    @include nav-divider;\n  }\n\n  // Prevent IE8 from misplacing imgs\n  //\n  // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989\n  > li > a > img {\n    max-width: none;\n  }\n}\n\n\n// Tabs\n// -------------------------\n\n// Give the tabs something to sit on\n.nav-tabs {\n  border-bottom: 1px solid $nav-tabs-border-color;\n  > li {\n    float: left;\n    // Make the list-items overlay the bottom border\n    margin-bottom: -1px;\n\n    // Actual tabs (as links)\n    > a {\n      margin-right: 2px;\n      line-height: $line-height-base;\n      border: 1px solid transparent;\n      border-radius: $border-radius-base $border-radius-base 0 0;\n      &:hover {\n        border-color: $nav-tabs-link-hover-border-color $nav-tabs-link-hover-border-color $nav-tabs-border-color;\n      }\n    }\n\n    // Active state, and its :hover to override normal :hover\n    &.active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: $nav-tabs-active-link-hover-color;\n        background-color: $nav-tabs-active-link-hover-bg;\n        border: 1px solid $nav-tabs-active-link-hover-border-color;\n        border-bottom-color: transparent;\n        cursor: default;\n      }\n    }\n  }\n  // pulling this in mainly for less shorthand\n  &.nav-justified {\n    @extend .nav-justified;\n    @extend .nav-tabs-justified;\n  }\n}\n\n\n// Pills\n// -------------------------\n.nav-pills {\n  > li {\n    float: left;\n\n    // Links rendered as pills\n    > a {\n      border-radius: $nav-pills-border-radius;\n    }\n    + li {\n      margin-left: 2px;\n    }\n\n    // Active state\n    &.active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: $nav-pills-active-link-hover-color;\n        background-color: $nav-pills-active-link-hover-bg;\n      }\n    }\n  }\n}\n\n\n// Stacked pills\n.nav-stacked {\n  > li {\n    float: none;\n    + li {\n      margin-top: 2px;\n      margin-left: 0; // no need for this gap between nav items\n    }\n  }\n}\n\n\n// Nav variations\n// --------------------------------------------------\n\n// Justified nav links\n// -------------------------\n\n.nav-justified {\n  width: 100%;\n\n  > li {\n    float: none;\n    > a {\n      text-align: center;\n      margin-bottom: 5px;\n    }\n  }\n\n  > .dropdown .dropdown-menu {\n    top: auto;\n    left: auto;\n  }\n\n  @media (min-width: $screen-sm-min) {\n    > li {\n      display: table-cell;\n      width: 1%;\n      > a {\n        margin-bottom: 0;\n      }\n    }\n  }\n}\n\n// Move borders to anchors instead of bottom of list\n//\n// Mixin for adding on top the shared `.nav-justified` styles for our tabs\n.nav-tabs-justified {\n  border-bottom: 0;\n\n  > li > a {\n    // Override margin from .nav-tabs\n    margin-right: 0;\n    border-radius: $border-radius-base;\n  }\n\n  > .active > a,\n  > .active > a:hover,\n  > .active > a:focus {\n    border: 1px solid $nav-tabs-justified-link-border-color;\n  }\n\n  @media (min-width: $screen-sm-min) {\n    > li > a {\n      border-bottom: 1px solid $nav-tabs-justified-link-border-color;\n      border-radius: $border-radius-base $border-radius-base 0 0;\n    }\n    > .active > a,\n    > .active > a:hover,\n    > .active > a:focus {\n      border-bottom-color: $nav-tabs-justified-active-link-border-color;\n    }\n  }\n}\n\n\n// Tabbable tabs\n// -------------------------\n\n// Hide tabbable panes to start, show them when `.active`\n.tab-content {\n  > .tab-pane {\n    display: none;\n  }\n  > .active {\n    display: block;\n  }\n}\n\n\n// Dropdowns\n// -------------------------\n\n// Specific dropdowns\n.nav-tabs .dropdown-menu {\n  // make dropdown border overlap tab border\n  margin-top: -1px;\n  // Remove the top rounded corners here since there is a hard edge above the menu\n  @include border-top-radius(0);\n}\n","//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n  position: relative;\n  min-height: $navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)\n  margin-bottom: $navbar-margin-bottom;\n  border: 1px solid transparent;\n\n  // Prevent floats from breaking the navbar\n  @include clearfix;\n\n  @media (min-width: $grid-float-breakpoint) {\n    border-radius: $navbar-border-radius;\n  }\n}\n\n\n// Navbar heading\n//\n// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy\n// styling of responsive aspects.\n\n.navbar-header {\n  @include clearfix;\n\n  @media (min-width: $grid-float-breakpoint) {\n    float: left;\n  }\n}\n\n\n// Navbar collapse (body)\n//\n// Group your navbar content into this for easy collapsing and expanding across\n// various device sizes. By default, this content is collapsed when <768px, but\n// will expand past that for a horizontal display.\n//\n// To start (on mobile devices) the navbar links, forms, and buttons are stacked\n// vertically and include a `max-height` to overflow in case you have too much\n// content for the user's viewport.\n\n.navbar-collapse {\n  overflow-x: visible;\n  padding-right: $navbar-padding-horizontal;\n  padding-left:  $navbar-padding-horizontal;\n  border-top: 1px solid transparent;\n  box-shadow: inset 0 1px 0 rgba(255,255,255,.1);\n  @include clearfix;\n  -webkit-overflow-scrolling: touch;\n\n  &.in {\n    overflow-y: auto;\n  }\n\n  @media (min-width: $grid-float-breakpoint) {\n    width: auto;\n    border-top: 0;\n    box-shadow: none;\n\n    &.collapse {\n      display: block !important;\n      height: auto !important;\n      padding-bottom: 0; // Override default setting\n      overflow: visible !important;\n    }\n\n    &.in {\n      overflow-y: visible;\n    }\n\n    // Undo the collapse side padding for navbars with containers to ensure\n    // alignment of right-aligned contents.\n    .navbar-fixed-top &,\n    .navbar-static-top &,\n    .navbar-fixed-bottom & {\n      padding-left: 0;\n      padding-right: 0;\n    }\n  }\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  .navbar-collapse {\n    max-height: $navbar-collapse-max-height;\n\n    @media (max-device-width: $screen-xs-min) and (orientation: landscape) {\n      max-height: 200px;\n    }\n  }\n}\n\n\n// Both navbar header and collapse\n//\n// When a container is present, change the behavior of the header and collapse.\n\n.container,\n.container-fluid {\n  > .navbar-header,\n  > .navbar-collapse {\n    margin-right: -$navbar-padding-horizontal;\n    margin-left:  -$navbar-padding-horizontal;\n\n    @media (min-width: $grid-float-breakpoint) {\n      margin-right: 0;\n      margin-left:  0;\n    }\n  }\n}\n\n\n//\n// Navbar alignment options\n//\n// Display the navbar across the entirety of the page or fixed it to the top or\n// bottom of the page.\n\n// Static top (unfixed, but 100% wide) navbar\n.navbar-static-top {\n  z-index: $zindex-navbar;\n  border-width: 0 0 1px;\n\n  @media (min-width: $grid-float-breakpoint) {\n    border-radius: 0;\n  }\n}\n\n// Fix the top/bottom navbars when screen real estate supports it\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: $zindex-navbar-fixed;\n\n  // Undo the rounded corners\n  @media (min-width: $grid-float-breakpoint) {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top {\n  top: 0;\n  border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0; // override .navbar defaults\n  border-width: 1px 0 0;\n}\n\n\n// Brand/project name\n\n.navbar-brand {\n  float: left;\n  padding: $navbar-padding-vertical $navbar-padding-horizontal;\n  font-size: $font-size-large;\n  line-height: $line-height-computed;\n  height: $navbar-height;\n\n  &:hover,\n  &:focus {\n    text-decoration: none;\n  }\n\n  > img {\n    display: block;\n  }\n\n  @media (min-width: $grid-float-breakpoint) {\n    .navbar > .container &,\n    .navbar > .container-fluid & {\n      margin-left: -$navbar-padding-horizontal;\n    }\n  }\n}\n\n\n// Navbar toggle\n//\n// Custom button for toggling the `.navbar-collapse`, powered by the collapse\n// JavaScript plugin.\n\n.navbar-toggle {\n  position: relative;\n  float: right;\n  margin-right: $navbar-padding-horizontal;\n  padding: 9px 10px;\n  @include navbar-vertical-align(34px);\n  background-color: transparent;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid transparent;\n  border-radius: $border-radius-base;\n\n  // We remove the `outline` here, but later compensate by attaching `:hover`\n  // styles to `:focus`.\n  &:focus {\n    outline: 0;\n  }\n\n  // Bars\n  .icon-bar {\n    display: block;\n    width: 22px;\n    height: 2px;\n    border-radius: 1px;\n  }\n  .icon-bar + .icon-bar {\n    margin-top: 4px;\n  }\n\n  @media (min-width: $grid-float-breakpoint) {\n    display: none;\n  }\n}\n\n\n// Navbar nav links\n//\n// Builds on top of the `.nav` components with its own modifier class to make\n// the nav the full height of the horizontal nav (above 768px).\n\n.navbar-nav {\n  margin: ($navbar-padding-vertical / 2) (-$navbar-padding-horizontal);\n\n  > li > a {\n    padding-top:    10px;\n    padding-bottom: 10px;\n    line-height: $line-height-computed;\n  }\n\n  @media (max-width: $grid-float-breakpoint-max) {\n    // Dropdowns get custom display when collapsed\n    .open .dropdown-menu {\n      position: static;\n      float: none;\n      width: auto;\n      margin-top: 0;\n      background-color: transparent;\n      border: 0;\n      box-shadow: none;\n      > li > a,\n      .dropdown-header {\n        padding: 5px 15px 5px 25px;\n      }\n      > li > a {\n        line-height: $line-height-computed;\n        &:hover,\n        &:focus {\n          background-image: none;\n        }\n      }\n    }\n  }\n\n  // Uncollapse the nav\n  @media (min-width: $grid-float-breakpoint) {\n    float: left;\n    margin: 0;\n\n    > li {\n      float: left;\n      > a {\n        padding-top:    $navbar-padding-vertical;\n        padding-bottom: $navbar-padding-vertical;\n      }\n    }\n  }\n}\n\n\n// Navbar form\n//\n// Extension of the `.form-inline` with some extra flavor for optimum display in\n// our navbars.\n\n.navbar-form {\n  margin-left: -$navbar-padding-horizontal;\n  margin-right: -$navbar-padding-horizontal;\n  padding: 10px $navbar-padding-horizontal;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  $shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n  @include box-shadow($shadow);\n\n  // Mixin behavior for optimum display\n  @include form-inline;\n\n  .form-group {\n    @media (max-width: $grid-float-breakpoint-max) {\n      margin-bottom: 5px;\n\n      &:last-child {\n        margin-bottom: 0;\n      }\n    }\n  }\n\n  // Vertically center in expanded, horizontal navbar\n  @include navbar-vertical-align($input-height-base);\n\n  // Undo 100% width for pull classes\n  @media (min-width: $grid-float-breakpoint) {\n    width: auto;\n    border: 0;\n    margin-left: 0;\n    margin-right: 0;\n    padding-top: 0;\n    padding-bottom: 0;\n    @include box-shadow(none);\n  }\n}\n\n\n// Dropdown menus\n\n// Menu position and menu carets\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  @include border-top-radius(0);\n}\n// Menu position and menu caret support for dropups via extra dropup class\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  margin-bottom: 0;\n  @include border-top-radius($navbar-border-radius);\n  @include border-bottom-radius(0);\n}\n\n\n// Buttons in navbars\n//\n// Vertically center a button within a navbar (when *not* in a form).\n\n.navbar-btn {\n  @include navbar-vertical-align($input-height-base);\n\n  &.btn-sm {\n    @include navbar-vertical-align($input-height-small);\n  }\n  &.btn-xs {\n    @include navbar-vertical-align(22);\n  }\n}\n\n\n// Text in navbars\n//\n// Add a class to make any element properly align itself vertically within the navbars.\n\n.navbar-text {\n  @include navbar-vertical-align($line-height-computed);\n\n  @media (min-width: $grid-float-breakpoint) {\n    float: left;\n    margin-left: $navbar-padding-horizontal;\n    margin-right: $navbar-padding-horizontal;\n  }\n}\n\n\n// Component alignment\n//\n// Repurpose the pull utilities as their own navbar utilities to avoid specificity\n// issues with parents and chaining. Only do this when the navbar is uncollapsed\n// though so that navbar contents properly stack and align in mobile.\n//\n// Declared after the navbar components to ensure more specificity on the margins.\n\n@media (min-width: $grid-float-breakpoint) {\n  .navbar-left {\n    float: left !important;\n  }\n  .navbar-right {\n    float: right !important;\n  margin-right: -$navbar-padding-horizontal;\n\n    ~ .navbar-right {\n      margin-right: 0;\n    }\n  }\n}\n\n\n// Alternate navbars\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n  background-color: $navbar-default-bg;\n  border-color: $navbar-default-border;\n\n  .navbar-brand {\n    color: $navbar-default-brand-color;\n    &:hover,\n    &:focus {\n      color: $navbar-default-brand-hover-color;\n      background-color: $navbar-default-brand-hover-bg;\n    }\n  }\n\n  .navbar-text {\n    color: $navbar-default-color;\n  }\n\n  .navbar-nav {\n    > li > a {\n      color: $navbar-default-link-color;\n\n      &:hover,\n      &:focus {\n        color: $navbar-default-link-hover-color;\n        background-color: $navbar-default-link-hover-bg;\n      }\n    }\n    > .active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: $navbar-default-link-active-color;\n        background-color: $navbar-default-link-active-bg;\n      }\n    }\n    > .disabled > a {\n      &,\n      &:hover,\n      &:focus {\n        color: $navbar-default-link-disabled-color;\n        background-color: $navbar-default-link-disabled-bg;\n      }\n    }\n  }\n\n  .navbar-toggle {\n    border-color: $navbar-default-toggle-border-color;\n    &:hover,\n    &:focus {\n      background-color: $navbar-default-toggle-hover-bg;\n    }\n    .icon-bar {\n      background-color: $navbar-default-toggle-icon-bar-bg;\n    }\n  }\n\n  .navbar-collapse,\n  .navbar-form {\n    border-color: $navbar-default-border;\n  }\n\n  // Dropdown menu items\n  .navbar-nav {\n    // Remove background color from open dropdown\n    > .open > a {\n      &,\n      &:hover,\n      &:focus {\n        background-color: $navbar-default-link-active-bg;\n        color: $navbar-default-link-active-color;\n      }\n    }\n\n    @media (max-width: $grid-float-breakpoint-max) {\n      // Dropdowns get custom display when collapsed\n      .open .dropdown-menu {\n        > li > a {\n          color: $navbar-default-link-color;\n          &:hover,\n          &:focus {\n            color: $navbar-default-link-hover-color;\n            background-color: $navbar-default-link-hover-bg;\n          }\n        }\n        > .active > a {\n          &,\n          &:hover,\n          &:focus {\n            color: $navbar-default-link-active-color;\n            background-color: $navbar-default-link-active-bg;\n          }\n        }\n        > .disabled > a {\n          &,\n          &:hover,\n          &:focus {\n            color: $navbar-default-link-disabled-color;\n            background-color: $navbar-default-link-disabled-bg;\n          }\n        }\n      }\n    }\n  }\n\n\n  // Links in navbars\n  //\n  // Add a class to ensure links outside the navbar nav are colored correctly.\n\n  .navbar-link {\n    color: $navbar-default-link-color;\n    &:hover {\n      color: $navbar-default-link-hover-color;\n    }\n  }\n\n  .btn-link {\n    color: $navbar-default-link-color;\n    &:hover,\n    &:focus {\n      color: $navbar-default-link-hover-color;\n    }\n    &[disabled],\n    fieldset[disabled] & {\n      &:hover,\n      &:focus {\n        color: $navbar-default-link-disabled-color;\n      }\n    }\n  }\n}\n\n// Inverse navbar\n\n.navbar-inverse {\n  background-color: $navbar-inverse-bg;\n  border-color: $navbar-inverse-border;\n\n  .navbar-brand {\n    color: $navbar-inverse-brand-color;\n    &:hover,\n    &:focus {\n      color: $navbar-inverse-brand-hover-color;\n      background-color: $navbar-inverse-brand-hover-bg;\n    }\n  }\n\n  .navbar-text {\n    color: $navbar-inverse-color;\n  }\n\n  .navbar-nav {\n    > li > a {\n      color: $navbar-inverse-link-color;\n\n      &:hover,\n      &:focus {\n        color: $navbar-inverse-link-hover-color;\n        background-color: $navbar-inverse-link-hover-bg;\n      }\n    }\n    > .active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: $navbar-inverse-link-active-color;\n        background-color: $navbar-inverse-link-active-bg;\n      }\n    }\n    > .disabled > a {\n      &,\n      &:hover,\n      &:focus {\n        color: $navbar-inverse-link-disabled-color;\n        background-color: $navbar-inverse-link-disabled-bg;\n      }\n    }\n  }\n\n  // Darken the responsive nav toggle\n  .navbar-toggle {\n    border-color: $navbar-inverse-toggle-border-color;\n    &:hover,\n    &:focus {\n      background-color: $navbar-inverse-toggle-hover-bg;\n    }\n    .icon-bar {\n      background-color: $navbar-inverse-toggle-icon-bar-bg;\n    }\n  }\n\n  .navbar-collapse,\n  .navbar-form {\n    border-color: darken($navbar-inverse-bg, 7%);\n  }\n\n  // Dropdowns\n  .navbar-nav {\n    > .open > a {\n      &,\n      &:hover,\n      &:focus {\n        background-color: $navbar-inverse-link-active-bg;\n        color: $navbar-inverse-link-active-color;\n      }\n    }\n\n    @media (max-width: $grid-float-breakpoint-max) {\n      // Dropdowns get custom display\n      .open .dropdown-menu {\n        > .dropdown-header {\n          border-color: $navbar-inverse-border;\n        }\n        .divider {\n          background-color: $navbar-inverse-border;\n        }\n        > li > a {\n          color: $navbar-inverse-link-color;\n          &:hover,\n          &:focus {\n            color: $navbar-inverse-link-hover-color;\n            background-color: $navbar-inverse-link-hover-bg;\n          }\n        }\n        > .active > a {\n          &,\n          &:hover,\n          &:focus {\n            color: $navbar-inverse-link-active-color;\n            background-color: $navbar-inverse-link-active-bg;\n          }\n        }\n        > .disabled > a {\n          &,\n          &:hover,\n          &:focus {\n            color: $navbar-inverse-link-disabled-color;\n            background-color: $navbar-inverse-link-disabled-bg;\n          }\n        }\n      }\n    }\n  }\n\n  .navbar-link {\n    color: $navbar-inverse-link-color;\n    &:hover {\n      color: $navbar-inverse-link-hover-color;\n    }\n  }\n\n  .btn-link {\n    color: $navbar-inverse-link-color;\n    &:hover,\n    &:focus {\n      color: $navbar-inverse-link-hover-color;\n    }\n    &[disabled],\n    fieldset[disabled] & {\n      &:hover,\n      &:focus {\n        color: $navbar-inverse-link-disabled-color;\n      }\n    }\n  }\n}\n","// Navbar vertical align\n//\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\n\n@mixin navbar-vertical-align($element-height) {\n  margin-top: (($navbar-height - $element-height) / 2);\n  margin-bottom: (($navbar-height - $element-height) / 2);\n}\n","//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n  padding: $breadcrumb-padding-vertical $breadcrumb-padding-horizontal;\n  margin-bottom: $line-height-computed;\n  list-style: none;\n  background-color: $breadcrumb-bg;\n  border-radius: $border-radius-base;\n\n  > li {\n    display: inline-block;\n\n    + li:before {\n      // [converter] Workaround for https://github.com/sass/libsass/issues/1115\n      $nbsp: \"\\00a0\";\n      content: \"#{$breadcrumb-separator}#{$nbsp}\"; // Unicode space added since inline-block means non-collapsing white-space\n      padding: 0 5px;\n      color: $breadcrumb-color;\n    }\n  }\n\n  > .active {\n    color: $breadcrumb-active-color;\n  }\n}\n","//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: $line-height-computed 0;\n  border-radius: $border-radius-base;\n\n  > li {\n    display: inline; // Remove list-style and block-level defaults\n    > a,\n    > span {\n      position: relative;\n      float: left; // Collapse white-space\n      padding: $padding-base-vertical $padding-base-horizontal;\n      line-height: $line-height-base;\n      text-decoration: none;\n      color: $pagination-color;\n      background-color: $pagination-bg;\n      border: 1px solid $pagination-border;\n      margin-left: -1px;\n    }\n    &:first-child {\n      > a,\n      > span {\n        margin-left: 0;\n        @include border-left-radius($border-radius-base);\n      }\n    }\n    &:last-child {\n      > a,\n      > span {\n        @include border-right-radius($border-radius-base);\n      }\n    }\n  }\n\n  > li > a,\n  > li > span {\n    &:hover,\n    &:focus {\n      z-index: 2;\n      color: $pagination-hover-color;\n      background-color: $pagination-hover-bg;\n      border-color: $pagination-hover-border;\n    }\n  }\n\n  > .active > a,\n  > .active > span {\n    &,\n    &:hover,\n    &:focus {\n      z-index: 3;\n      color: $pagination-active-color;\n      background-color: $pagination-active-bg;\n      border-color: $pagination-active-border;\n      cursor: default;\n    }\n  }\n\n  > .disabled {\n    > span,\n    > span:hover,\n    > span:focus,\n    > a,\n    > a:hover,\n    > a:focus {\n      color: $pagination-disabled-color;\n      background-color: $pagination-disabled-bg;\n      border-color: $pagination-disabled-border;\n      cursor: $cursor-disabled;\n    }\n  }\n}\n\n// Sizing\n// --------------------------------------------------\n\n// Large\n.pagination-lg {\n  @include pagination-size($padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $border-radius-large);\n}\n\n// Small\n.pagination-sm {\n  @include pagination-size($padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $border-radius-small);\n}\n","// Pagination\n\n@mixin pagination-size($padding-vertical, $padding-horizontal, $font-size, $line-height, $border-radius) {\n  > li {\n    > a,\n    > span {\n      padding: $padding-vertical $padding-horizontal;\n      font-size: $font-size;\n      line-height: $line-height;\n    }\n    &:first-child {\n      > a,\n      > span {\n        @include border-left-radius($border-radius);\n      }\n    }\n    &:last-child {\n      > a,\n      > span {\n        @include border-right-radius($border-radius);\n      }\n    }\n  }\n}\n","//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n  padding-left: 0;\n  margin: $line-height-computed 0;\n  list-style: none;\n  text-align: center;\n  @include clearfix;\n  li {\n    display: inline;\n    > a,\n    > span {\n      display: inline-block;\n      padding: 5px 14px;\n      background-color: $pager-bg;\n      border: 1px solid $pager-border;\n      border-radius: $pager-border-radius;\n    }\n\n    > a:hover,\n    > a:focus {\n      text-decoration: none;\n      background-color: $pager-hover-bg;\n    }\n  }\n\n  .next {\n    > a,\n    > span {\n      float: right;\n    }\n  }\n\n  .previous {\n    > a,\n    > span {\n      float: left;\n    }\n  }\n\n  .disabled {\n    > a,\n    > a:hover,\n    > a:focus,\n    > span {\n      color: $pager-disabled-color;\n      background-color: $pager-bg;\n      cursor: $cursor-disabled;\n    }\n  }\n}\n","//\n// Labels\n// --------------------------------------------------\n\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: $label-color;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n\n  // [converter] extracted a& to a.label\n\n  // Empty labels collapse automatically (not available in IE8)\n  &:empty {\n    display: none;\n  }\n\n  // Quick fix for labels in buttons\n  .btn & {\n    position: relative;\n    top: -1px;\n  }\n}\n\n// Add hover effects, but only for links\na.label {\n  &:hover,\n  &:focus {\n    color: $label-link-hover-color;\n    text-decoration: none;\n    cursor: pointer;\n  }\n}\n\n// Colors\n// Contextual variations (linked labels get darker on :hover)\n\n.label-default {\n  @include label-variant($label-default-bg);\n}\n\n.label-primary {\n  @include label-variant($label-primary-bg);\n}\n\n.label-success {\n  @include label-variant($label-success-bg);\n}\n\n.label-info {\n  @include label-variant($label-info-bg);\n}\n\n.label-warning {\n  @include label-variant($label-warning-bg);\n}\n\n.label-danger {\n  @include label-variant($label-danger-bg);\n}\n","// Labels\n\n@mixin label-variant($color) {\n  background-color: $color;\n\n  &[href] {\n    &:hover,\n    &:focus {\n      background-color: darken($color, 10%);\n    }\n  }\n}\n","//\n// Badges\n// --------------------------------------------------\n\n\n// Base class\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: $font-size-small;\n  font-weight: $badge-font-weight;\n  color: $badge-color;\n  line-height: $badge-line-height;\n  vertical-align: middle;\n  white-space: nowrap;\n  text-align: center;\n  background-color: $badge-bg;\n  border-radius: $badge-border-radius;\n\n  // Empty badges collapse automatically (not available in IE8)\n  &:empty {\n    display: none;\n  }\n\n  // Quick fix for badges in buttons\n  .btn & {\n    position: relative;\n    top: -1px;\n  }\n\n  .btn-xs &,\n  .btn-group-xs > .btn & {\n    top: 0;\n    padding: 1px 5px;\n  }\n\n  // [converter] extracted a& to a.badge\n\n  // Account for badges in navs\n  .list-group-item.active > &,\n  .nav-pills > .active > a > & {\n    color: $badge-active-color;\n    background-color: $badge-active-bg;\n  }\n\n  .list-group-item > & {\n    float: right;\n  }\n\n  .list-group-item > & + & {\n    margin-right: 5px;\n  }\n\n  .nav-pills > li > a > & {\n    margin-left: 3px;\n  }\n}\n\n// Hover state, but only for links\na.badge {\n  &:hover,\n  &:focus {\n    color: $badge-link-hover-color;\n    text-decoration: none;\n    cursor: pointer;\n  }\n}\n","//\n// Jumbotron\n// --------------------------------------------------\n\n\n.jumbotron {\n  padding-top:    $jumbotron-padding;\n  padding-bottom: $jumbotron-padding;\n  margin-bottom: $jumbotron-padding;\n  color: $jumbotron-color;\n  background-color: $jumbotron-bg;\n\n  h1,\n  .h1 {\n    color: $jumbotron-heading-color;\n  }\n\n  p {\n    margin-bottom: ($jumbotron-padding / 2);\n    font-size: $jumbotron-font-size;\n    font-weight: 200;\n  }\n\n  > hr {\n    border-top-color: darken($jumbotron-bg, 10%);\n  }\n\n  .container &,\n  .container-fluid & {\n    border-radius: $border-radius-large; // Only round corners at higher resolutions if contained in a container\n    padding-left:  ($grid-gutter-width / 2);\n    padding-right: ($grid-gutter-width / 2);\n  }\n\n  .container {\n    max-width: 100%;\n  }\n\n  @media screen and (min-width: $screen-sm-min) {\n    padding-top:    ($jumbotron-padding * 1.6);\n    padding-bottom: ($jumbotron-padding * 1.6);\n\n    .container &,\n    .container-fluid & {\n      padding-left:  ($jumbotron-padding * 2);\n      padding-right: ($jumbotron-padding * 2);\n    }\n\n    h1,\n    .h1 {\n      font-size: $jumbotron-heading-font-size;\n    }\n  }\n}\n","//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.thumbnail {\n  display: block;\n  padding: $thumbnail-padding;\n  margin-bottom: $line-height-computed;\n  line-height: $line-height-base;\n  background-color: $thumbnail-bg;\n  border: 1px solid $thumbnail-border;\n  border-radius: $thumbnail-border-radius;\n  @include transition(border .2s ease-in-out);\n\n  > img,\n  a > img {\n    @include img-responsive;\n    margin-left: auto;\n    margin-right: auto;\n  }\n\n  // [converter] extracted a&:hover, a&:focus, a&.active to a.thumbnail:hover, a.thumbnail:focus, a.thumbnail.active\n\n  // Image captions\n  .caption {\n    padding: $thumbnail-caption-padding;\n    color: $thumbnail-caption-color;\n  }\n}\n\n// Add a hover state for linked versions only\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n  border-color: $link-color;\n}\n","//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n  padding: $alert-padding;\n  margin-bottom: $line-height-computed;\n  border: 1px solid transparent;\n  border-radius: $alert-border-radius;\n\n  // Headings for larger alerts\n  h4 {\n    margin-top: 0;\n    // Specified for the h4 to prevent conflicts of changing $headings-color\n    color: inherit;\n  }\n\n  // Provide class for links that match alerts\n  .alert-link {\n    font-weight: $alert-link-font-weight;\n  }\n\n  // Improve alignment and spacing of inner content\n  > p,\n  > ul {\n    margin-bottom: 0;\n  }\n\n  > p + p {\n    margin-top: 5px;\n  }\n}\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.\n.alert-dismissible {\n  padding-right: ($alert-padding + 20);\n\n  // Adjust close link position\n  .close {\n    position: relative;\n    top: -2px;\n    right: -21px;\n    color: inherit;\n  }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n  @include alert-variant($alert-success-bg, $alert-success-border, $alert-success-text);\n}\n\n.alert-info {\n  @include alert-variant($alert-info-bg, $alert-info-border, $alert-info-text);\n}\n\n.alert-warning {\n  @include alert-variant($alert-warning-bg, $alert-warning-border, $alert-warning-text);\n}\n\n.alert-danger {\n  @include alert-variant($alert-danger-bg, $alert-danger-border, $alert-danger-text);\n}\n","// Alerts\n\n@mixin alert-variant($background, $border, $text-color) {\n  background-color: $background;\n  border-color: $border;\n  color: $text-color;\n\n  hr {\n    border-top-color: darken($border, 5%);\n  }\n  .alert-link {\n    color: darken($text-color, 10%);\n  }\n}\n","//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -------------------------\n\n// WebKit\n@-webkit-keyframes progress-bar-stripes {\n  from  { background-position: 40px 0; }\n  to    { background-position: 0 0; }\n}\n\n// Spec and IE10+\n@keyframes progress-bar-stripes {\n  from  { background-position: 40px 0; }\n  to    { background-position: 0 0; }\n}\n\n\n// Bar itself\n// -------------------------\n\n// Outer container\n.progress {\n  overflow: hidden;\n  height: $line-height-computed;\n  margin-bottom: $line-height-computed;\n  background-color: $progress-bg;\n  border-radius: $progress-border-radius;\n  @include box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\n}\n\n// Bar of progress\n.progress-bar {\n  float: left;\n  width: 0%;\n  height: 100%;\n  font-size: $font-size-small;\n  line-height: $line-height-computed;\n  color: $progress-bar-color;\n  text-align: center;\n  background-color: $progress-bar-bg;\n  @include box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));\n  @include transition(width .6s ease);\n}\n\n// Striped bars\n//\n// `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar-striped` class, which you just add to an existing\n// `.progress-bar`.\n.progress-striped .progress-bar,\n.progress-bar-striped {\n  @include gradient-striped;\n  background-size: 40px 40px;\n}\n\n// Call animation for the active one\n//\n// `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar.active` approach.\n.progress.active .progress-bar,\n.progress-bar.active {\n  @include animation(progress-bar-stripes 2s linear infinite);\n}\n\n\n// Variations\n// -------------------------\n\n.progress-bar-success {\n  @include progress-bar-variant($progress-bar-success-bg);\n}\n\n.progress-bar-info {\n  @include progress-bar-variant($progress-bar-info-bg);\n}\n\n.progress-bar-warning {\n  @include progress-bar-variant($progress-bar-warning-bg);\n}\n\n.progress-bar-danger {\n  @include progress-bar-variant($progress-bar-danger-bg);\n}\n","// Gradients\n\n\n\n// Horizontal gradient, from left to right\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n// Color stops are not available in IE9 and below.\n@mixin gradient-horizontal($start-color: #555, $end-color: #333, $start-percent: 0%, $end-percent: 100%) {\n  background-image: -webkit-linear-gradient(left, $start-color $start-percent, $end-color $end-percent); // Safari 5.1-6, Chrome 10+\n  background-image: -o-linear-gradient(left, $start-color $start-percent, $end-color $end-percent); // Opera 12\n  background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=1); // IE9 and down\n}\n\n// Vertical gradient, from top to bottom\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n// Color stops are not available in IE9 and below.\n@mixin gradient-vertical($start-color: #555, $end-color: #333, $start-percent: 0%, $end-percent: 100%) {\n  background-image: -webkit-linear-gradient(top, $start-color $start-percent, $end-color $end-percent);  // Safari 5.1-6, Chrome 10+\n  background-image: -o-linear-gradient(top, $start-color $start-percent, $end-color $end-percent);  // Opera 12\n  background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=0); // IE9 and down\n}\n\n@mixin gradient-directional($start-color: #555, $end-color: #333, $deg: 45deg) {\n  background-repeat: repeat-x;\n  background-image: -webkit-linear-gradient($deg, $start-color, $end-color); // Safari 5.1-6, Chrome 10+\n  background-image: -o-linear-gradient($deg, $start-color, $end-color); // Opera 12\n  background-image: linear-gradient($deg, $start-color, $end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n}\n@mixin gradient-horizontal-three-colors($start-color: #00b3ee, $mid-color: #7a43b6, $color-stop: 50%, $end-color: #c3325f) {\n  background-image: -webkit-linear-gradient(left, $start-color, $mid-color $color-stop, $end-color);\n  background-image: -o-linear-gradient(left, $start-color, $mid-color $color-stop, $end-color);\n  background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color);\n  background-repeat: no-repeat;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=1); // IE9 and down, gets no color-stop at all for proper fallback\n}\n@mixin gradient-vertical-three-colors($start-color: #00b3ee, $mid-color: #7a43b6, $color-stop: 50%, $end-color: #c3325f) {\n  background-image: -webkit-linear-gradient($start-color, $mid-color $color-stop, $end-color);\n  background-image: -o-linear-gradient($start-color, $mid-color $color-stop, $end-color);\n  background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color);\n  background-repeat: no-repeat;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=0); // IE9 and down, gets no color-stop at all for proper fallback\n}\n@mixin gradient-radial($inner-color: #555, $outer-color: #333) {\n  background-image: -webkit-radial-gradient(circle, $inner-color, $outer-color);\n  background-image: radial-gradient(circle, $inner-color, $outer-color);\n  background-repeat: no-repeat;\n}\n@mixin gradient-striped($color: rgba(255,255,255,.15), $angle: 45deg) {\n  background-image: -webkit-linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);\n  background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);\n}\n","// Progress bars\n\n@mixin progress-bar-variant($color) {\n  background-color: $color;\n\n  // Deprecated parent class requirement as of v3.2.0\n  .progress-striped & {\n    @include gradient-striped;\n  }\n}\n",".media {\n  // Proper spacing between instances of .media\n  margin-top: 15px;\n\n  &:first-child {\n    margin-top: 0;\n  }\n}\n\n.media,\n.media-body {\n  zoom: 1;\n  overflow: hidden;\n}\n\n.media-body {\n  width: 10000px;\n}\n\n.media-object {\n  display: block;\n\n  // Fix collapse in webkit from max-width: 100% and display: table-cell.\n  &.img-thumbnail {\n    max-width: none;\n  }\n}\n\n.media-right,\n.media > .pull-right {\n  padding-left: 10px;\n}\n\n.media-left,\n.media > .pull-left {\n  padding-right: 10px;\n}\n\n.media-left,\n.media-right,\n.media-body {\n  display: table-cell;\n  vertical-align: top;\n}\n\n.media-middle {\n  vertical-align: middle;\n}\n\n.media-bottom {\n  vertical-align: bottom;\n}\n\n// Reset margins on headings for tighter default spacing\n.media-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n\n// Media list variation\n//\n// Undo default ul/ol styles\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n","//\n// List groups\n// --------------------------------------------------\n\n\n// Base class\n//\n// Easily usable on "].join("")).appendTo(b),c.off("click").on("click",a.proxy(this.clearFilterControl,this)))}},k.prototype.initHeader=function(){n.apply(this,Array.prototype.slice.apply(arguments)),this.options.filterControl&&j(this,this.$header)},k.prototype.initBody=function(){o.apply(this,Array.prototype.slice.apply(arguments));for(var b=this,d=this.options.data,e=this.pageTof;f++){var g=d[f];a.each(this.header.fields,function(d,e){var h=g[e],i=b.columns[a.fn.bootstrapTable.utils.getFieldIndex(b.columns,e)];if(h=a.fn.bootstrapTable.utils.calculateObjectValue(b.header,b.header.formatters[d],[h,g,f],h),!(i.checkbox&&i.radio||void 0===i.filterControl||"select"!==i.filterControl.toLowerCase()||!i.searchable||void 0!==i.filterData&&"column"!==i.filterData.toLowerCase())){var j=a("."+i.field);void 0!==j&&j.length>0&&(0===j.get(j.length-1).options.length&&c(j,"",""),c(j,h,h))}})}},k.prototype.initSearch=function(){p.apply(this,Array.prototype.slice.apply(arguments));var b=this,c=a.isEmptyObject(this.filterColumnsPartial)?null:this.filterColumnsPartial;this.data=c?a.grep(this.data,function(d,e){for(var f in c){var g=b.columns[a.fn.bootstrapTable.utils.getFieldIndex(b.columns,f)],h=c[f].toLowerCase(),i=d[f];if(i=a.fn.bootstrapTable.utils.calculateObjectValue(b.header,b.header.formatters[a.inArray(f,b.header.fields)],[i,d,e],i),g.filterStrictSearch){if(-1===a.inArray(f,b.header.fields)||"string"!=typeof i&&"number"!=typeof i||i.toString().toLowerCase()!==h.toString().toLowerCase())return!1}else if(-1===a.inArray(f,b.header.fields)||"string"!=typeof i&&"number"!=typeof i||-1===(i+"").toLowerCase().indexOf(h))return!1}return!0}):this.data},k.prototype.onColumnSearch=function(b){h(this);var c=a.trim(a(b.currentTarget).val()),d=a(b.currentTarget).parent().parent().parent().data("field");a.isEmptyObject(this.filterColumnsPartial)&&(this.filterColumnsPartial={}),c?this.filterColumnsPartial[d]=c:delete this.filterColumnsPartial[d],this.options.pageNumber=1,this.onSearch(b),this.updatePagination(),this.trigger("column-search",d,c)},k.prototype.clearFilterControl=function(){if(this.options.filterControl&&this.options.filterShowClear){a.each(this.options.values,function(a,b){b.value=""}),i(this);var b=f(this).find(g(this)),c=0;b.length>0&&(this.filterColumnsPartial={},clearTimeout(c),c=setTimeout(function(){a(b[0]).trigger("INPUT"===b[0].tagName?"keyup":"change")},this.options.searchTimeOut))}}}(jQuery);
    \ No newline at end of file
    diff --git a/public/assets/js/extensions/filter/bootstrap-table-filter.js b/public/assets/js/extensions/filter/bootstrap-table-filter.js
    new file mode 100755
    index 0000000000..14af13da06
    --- /dev/null
    +++ b/public/assets/js/extensions/filter/bootstrap-table-filter.js
    @@ -0,0 +1,67 @@
    +/**
    + * @author zhixin wen 
    + * extensions: https://github.com/lukaskral/bootstrap-table-filter
    + */
    +
    +!function($) {
    +
    +    'use strict';
    +
    +    $.extend($.fn.bootstrapTable.defaults, {
    +        showFilter: false
    +    });
    +
    +    var BootstrapTable = $.fn.bootstrapTable.Constructor,
    +        _init = BootstrapTable.prototype.init,
    +        _initSearch = BootstrapTable.prototype.initSearch;
    +
    +    BootstrapTable.prototype.init = function () {
    +        _init.apply(this, Array.prototype.slice.apply(arguments));
    +
    +        var that = this;
    +        this.$el.on('load-success.bs.table', function () {
    +            if (that.options.showFilter) {
    +                $(that.options.toolbar).bootstrapTableFilter({
    +                    connectTo: that.$el
    +                });
    +            }
    +        });
    +    };
    +
    +    BootstrapTable.prototype.initSearch = function () {
    +        _initSearch.apply(this, Array.prototype.slice.apply(arguments));
    +
    +        if (this.options.sidePagination !== 'server') {
    +            if (typeof this.searchCallback === 'function') {
    +                this.data = $.grep(this.options.data, this.searchCallback);
    +            }
    +        }
    +    };
    +
    +    BootstrapTable.prototype.getData = function () {
    +        return (this.searchText || this.searchCallback) ? this.data : this.options.data;
    +    };
    +
    +    BootstrapTable.prototype.getColumns = function () {
    +        return this.columns;
    +    };
    +
    +    BootstrapTable.prototype.registerSearchCallback = function (callback) {
    +        this.searchCallback = callback;
    +    };
    +
    +    BootstrapTable.prototype.updateSearch = function () {
    +        this.options.pageNumber = 1;
    +        this.initSearch();
    +        this.updatePagination();
    +    };
    +
    +    BootstrapTable.prototype.getServerUrl = function () {
    +        return (this.options.sidePagination === 'server') ? this.options.url : false;
    +    };
    +
    +    $.fn.bootstrapTable.methods.push('getColumns',
    +        'registerSearchCallback', 'updateSearch',
    +        'getServerUrl');
    +
    +}(jQuery);
    \ No newline at end of file
    diff --git a/public/assets/js/extensions/filter/bootstrap-table-filter.min.js b/public/assets/js/extensions/filter/bootstrap-table-filter.min.js
    new file mode 100755
    index 0000000000..9d0e05704d
    --- /dev/null
    +++ b/public/assets/js/extensions/filter/bootstrap-table-filter.min.js
    @@ -0,0 +1,7 @@
    +/*
    +* bootstrap-table - v1.9.1 - 2015-10-25
    +* https://github.com/wenzhixin/bootstrap-table
    +* Copyright (c) 2015 zhixin wen
    +* Licensed MIT License
    +*/
    +!function(a){"use strict";a.extend(a.fn.bootstrapTable.defaults,{showFilter:!1});var b=a.fn.bootstrapTable.Constructor,c=b.prototype.init,d=b.prototype.initSearch;b.prototype.init=function(){c.apply(this,Array.prototype.slice.apply(arguments));var b=this;this.$el.on("load-success.bs.table",function(){b.options.showFilter&&a(b.options.toolbar).bootstrapTableFilter({connectTo:b.$el})})},b.prototype.initSearch=function(){d.apply(this,Array.prototype.slice.apply(arguments)),"server"!==this.options.sidePagination&&"function"==typeof this.searchCallback&&(this.data=a.grep(this.options.data,this.searchCallback))},b.prototype.getData=function(){return this.searchText||this.searchCallback?this.data:this.options.data},b.prototype.getColumns=function(){return this.columns},b.prototype.registerSearchCallback=function(a){this.searchCallback=a},b.prototype.updateSearch=function(){this.options.pageNumber=1,this.initSearch(),this.updatePagination()},b.prototype.getServerUrl=function(){return"server"===this.options.sidePagination?this.options.url:!1},a.fn.bootstrapTable.methods.push("getColumns","registerSearchCallback","updateSearch","getServerUrl")}(jQuery);
    \ No newline at end of file
    diff --git a/public/assets/js/extensions/flat-json/bootstrap-table-flat-json.js b/public/assets/js/extensions/flat-json/bootstrap-table-flat-json.js
    new file mode 100755
    index 0000000000..4bbf3a2a9e
    --- /dev/null
    +++ b/public/assets/js/extensions/flat-json/bootstrap-table-flat-json.js
    @@ -0,0 +1,62 @@
    +/**
    + * @author: Dennis Hernández
    + * @webSite: http://djhvscf.github.io/Blog
    + * @version: v1.3.0
    + */
    +
    +(function ($) {
    +    'use strict';
    +
    +    var flat = function (element, that) {
    +        var result = {};
    +
    +        function recurse(cur, prop) {
    +            if (Object(cur) !== cur) {
    +                result[prop] = cur;
    +            } else if ($.isArray(cur)) {
    +                for (var i = 0, l = cur.length; i < l; i++) {
    +                    recurse(cur[i], prop ? prop + that.options.flatSeparator + i : "" + i);
    +                    if (l == 0) {
    +                        result[prop] = [];
    +                    }
    +                }
    +            } else {
    +                var isEmpty = true;
    +                for (var p in cur) {
    +                    isEmpty = false;
    +                    recurse(cur[p], prop ? prop + that.options.flatSeparator + p : p);
    +                }
    +                if (isEmpty) {
    +                    result[prop] = {};
    +                }
    +            }
    +        }
    +
    +        recurse(element, "");
    +        return result;
    +    };
    +
    +    var flatHelper = function (data, that) {
    +        var flatArray = [];
    +
    +        $.each(!$.isArray(data) ? [data] : data, function (i, element) {
    +            flatArray.push(flat(element, that));
    +        });
    +        return flatArray;
    +    };
    +
    +    $.extend($.fn.bootstrapTable.defaults, {
    +        flat: false,
    +        flatSeparator: '.'
    +    });
    +
    +    var BootstrapTable = $.fn.bootstrapTable.Constructor,
    +        _initData = BootstrapTable.prototype.initData;
    +
    +    BootstrapTable.prototype.initData = function (data, type) {
    +        if (this.options.flat) {
    +            data = flatHelper(data ? data : this.options.data, this);
    +        }
    +        _initData.apply(this, [data, type]);
    +    };
    +})(jQuery);
    diff --git a/public/assets/js/extensions/flat-json/bootstrap-table-flat-json.min.js b/public/assets/js/extensions/flat-json/bootstrap-table-flat-json.min.js
    new file mode 100755
    index 0000000000..844f5428dd
    --- /dev/null
    +++ b/public/assets/js/extensions/flat-json/bootstrap-table-flat-json.min.js
    @@ -0,0 +1,7 @@
    +/*
    +* bootstrap-table - v1.9.1 - 2015-10-25
    +* https://github.com/wenzhixin/bootstrap-table
    +* Copyright (c) 2015 zhixin wen
    +* Licensed MIT License
    +*/
    +!function(a){"use strict";var b=function(b,c){function d(b,f){if(Object(b)!==b)e[f]=b;else if(a.isArray(b))for(var g=0,h=b.length;h>g;g++)d(b[g],f?f+c.options.flatSeparator+g:""+g),0==h&&(e[f]=[]);else{var i=!0;for(var j in b)i=!1,d(b[j],f?f+c.options.flatSeparator+j:j);i&&(e[f]={})}}var e={};return d(b,""),e},c=function(c,d){var e=[];return a.each(a.isArray(c)?c:[c],function(a,c){e.push(b(c,d))}),e};a.extend(a.fn.bootstrapTable.defaults,{flat:!1,flatSeparator:"."});var d=a.fn.bootstrapTable.Constructor,e=d.prototype.initData;d.prototype.initData=function(a,b){this.options.flat&&(a=c(a?a:this.options.data,this)),e.apply(this,[a,b])}}(jQuery);
    \ No newline at end of file
    diff --git a/public/assets/js/extensions/group-by/bootstrap-table-group-by.css b/public/assets/js/extensions/group-by/bootstrap-table-group-by.css
    new file mode 100755
    index 0000000000..fce5a9a7b1
    --- /dev/null
    +++ b/public/assets/js/extensions/group-by/bootstrap-table-group-by.css
    @@ -0,0 +1,53 @@
    +table.treetable tbody tr td {
    +    cursor: default;
    +}
    +
    +table.treetable span {
    +    background-position: center left;
    +    background-repeat: no-repeat;
    +    padding: .2em 0 .2em 1.5em;
    +}
    +
    +table.treetable tr.collapsed span.indenter a {
    +    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAAHlJREFUeNrcU1sNgDAQ6wgmcAM2MICGGlg1gJnNzWQcvwQGy1j4oUl/7tH0mpwzM7SgQyO+EZAUWh2MkkzSWhJwuRAlHYsJwEwyvs1gABDuzqoJcTw5qxaIJN0bgQRgIjnlmn1heSO5PE6Y2YXe+5Cr5+h++gs12AcAS6FS+7YOsj4AAAAASUVORK5CYII=);
    +    padding-right: 12px;
    +}
    +
    +table.treetable tr.expanded span.indenter a {
    +    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAAHFJREFUeNpi/P//PwMlgImBQsA44C6gvhfa29v3MzAwOODRc6CystIRbxi0t7fjDJjKykpGYrwwi1hxnLHQ3t7+jIGBQRJJ6HllZaUUKYEYRYBPOB0gBShKwKGA////48VtbW3/8clTnBIH3gCKkzJgAGvBX0dDm0sCAAAAAElFTkSuQmCC);
    +    padding-right: 12px;
    +}
    +
    +table.treetable tr.branch {
    +    background-color: #f9f9f9;
    +}
    +
    +table.treetable tr.selected {
    +    background-color: #3875d7;
    +    color: #fff;
    +}
    +
    +table.treetable tr span.indenter a {
    +    outline: none; /* Expander shows outline after upgrading to 3.0 (#141) */
    +}
    +
    +table.treetable tr.collapsed.selected span.indenter a {
    +    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAAFpJREFUeNpi/P//PwMlgHHADWD4//8/NtyAQxwD45KAAQdKDfj//////fgMIsYAZIMw1DKREFwODAwM/4kNRKq64AADA4MjFDOQ6gKyY4HodMA49PMCxQYABgAVYHsjyZ1x7QAAAABJRU5ErkJggg==);
    +}
    +
    +table.treetable tr.expanded.selected span.indenter a {
    +    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAAFtJREFUeNpi/P//PwMlgImBQsA44C6giQENDAwM//HgBmLCAF/AMBLjBUeixf///48L7/+PCvZjU4fPAAc0AxywqcMXCwegGJ1NckL6jx5wpKYDxqGXEkkCgAEAmrqBIejdgngAAAAASUVORK5CYII=);
    +}
    +
    +table.treetable tr.accept {
    +    background-color: #a3bce4;
    +    color: #fff
    +}
    +
    +table.treetable tr.collapsed.accept td span.indenter a {
    +    background-image: url(data:image/x-png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAAFpJREFUeNpi/P//PwMlgHHADWD4//8/NtyAQxwD45KAAQdKDfj//////fgMIsYAZIMw1DKREFwODAwM/4kNRKq64AADA4MjFDOQ6gKyY4HodMA49PMCxQYABgAVYHsjyZ1x7QAAAABJRU5ErkJggg==);
    +}
    +
    +table.treetable tr.expanded.accept td span.indenter a {
    +    background-image: url(data:image/x-png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAAFtJREFUeNpi/P//PwMlgImBQsA44C6giQENDAwM//HgBmLCAF/AMBLjBUeixf///48L7/+PCvZjU4fPAAc0AxywqcMXCwegGJ1NckL6jx5wpKYDxqGXEkkCgAEAmrqBIejdgngAAAAASUVORK5CYII=);
    +}
    \ No newline at end of file
    diff --git a/public/assets/js/extensions/group-by/bootstrap-table-group-by.js b/public/assets/js/extensions/group-by/bootstrap-table-group-by.js
    new file mode 100755
    index 0000000000..6f95e61bdd
    --- /dev/null
    +++ b/public/assets/js/extensions/group-by/bootstrap-table-group-by.js
    @@ -0,0 +1,243 @@
    +/**
    + * @author: Dennis Hernández
    + * @webSite: http://djhvscf.github.io/Blog
    + * @version: v1.1.0
    + */
    +
    +!function ($) {
    +
    +    'use strict';
    +
    +    var originalRowAttr,
    +        dataTTId = 'data-tt-id',
    +        dataTTParentId = 'data-tt-parent-id',
    +        obj = {},
    +        parentId = undefined;
    +
    +    var getParentRowId = function (that, id) {
    +        var parentRows = that.$body.find('tr').not('[' + 'data-tt-parent-id]');
    +
    +        for (var i = 0; i < parentRows.length; i++) {
    +            if (i === id) {
    +                return $(parentRows[i]).attr('data-tt-id');
    +            }
    +        }
    +
    +        return undefined;
    +    };
    +
    +    var sumData = function (that, data) {
    +        var sumRow = {};
    +        $.each(data, function (i, row) {
    +            if (!row.IsParent) {
    +                for (var prop in row) {
    +                    if (!isNaN(parseFloat(row[prop]))) {
    +                        if (that.columns[$.fn.bootstrapTable.utils.getFieldIndex(that.columns, prop)].groupBySumGroup) {
    +                            if (sumRow[prop] === undefined) {
    +                                sumRow[prop] = 0;
    +                            }
    +                            sumRow[prop] += +row[prop];
    +                        }
    +                    }
    +                }
    +            }
    +        });
    +        return sumRow;
    +    };
    +
    +    var rowAttr = function (row, index) {
    +        //Call the User Defined Function
    +        originalRowAttr.apply([row, index]);
    +
    +        obj[dataTTId.toString()] = index;
    +
    +        if (!row.IsParent) {
    +            obj[dataTTParentId.toString()] = parentId === undefined ? index : parentId;
    +        } else {
    +            parentId = index;
    +            delete obj[dataTTParentId.toString()];
    +        }
    +
    +        return obj;
    +    };
    +
    +    var setObjectKeys = function () {
    +        // From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
    +        Object.keys = function (o) {
    +            if (o !== Object(o)) {
    +                throw new TypeError('Object.keys called on a non-object');
    +            }
    +            var k = [],
    +                p;
    +            for (p in o) {
    +                if (Object.prototype.hasOwnProperty.call(o, p)) {
    +                    k.push(p);
    +                }
    +            }
    +            return k;
    +        }
    +    };
    +
    +    var getDataArrayFromItem = function (that, item) {
    +        var itemDataArray = [];
    +        for (var i = 0; i < that.options.groupByField.length; i++) {
    +            itemDataArray.push(item[that.options.groupByField[i]]);
    +        }
    +
    +        return itemDataArray;
    +    };
    +
    +    var getNewRow = function (that, result, index) {
    +        var newRow = {};
    +        for (var i = 0; i < that.options.groupByField.length; i++) {
    +            newRow[that.options.groupByField[i].toString()] = result[index][0][that.options.groupByField[i]];
    +        }
    +
    +        newRow.IsParent = true;
    +
    +        return newRow;
    +    };
    +
    +    var groupBy = function (array, f) {
    +        var groups = {};
    +        $.each(array, function (i, o) {
    +            var group = JSON.stringify(f(o));
    +            groups[group] = groups[group] || [];
    +            groups[group].push(o);
    +        });
    +        return Object.keys(groups).map(function (group) {
    +            return groups[group];
    +        });
    +    };
    +
    +    var makeGrouped = function (that, data) {
    +        var newData = [],
    +            sumRow = {};
    +
    +        var result = groupBy(data, function (item) {
    +            return getDataArrayFromItem(that, item);
    +        });
    +
    +        for (var i = 0; i < result.length; i++) {
    +            result[i].unshift(getNewRow(that, result, i));
    +            if (that.options.groupBySumGroup) {
    +                sumRow = sumData(that, result[i]);
    +                if (!$.isEmptyObject(sumRow)) {
    +                    result[i].push(sumRow);
    +                }
    +            }
    +        }
    +
    +        newData = newData.concat.apply(newData, result);
    +
    +        if (!that.options.loaded && newData.length > 0) {
    +            that.options.loaded = true;
    +            that.options.originalData = that.options.data;
    +            that.options.data = newData;
    +        }
    +
    +        return newData;
    +    };
    +
    +    $.extend($.fn.bootstrapTable.defaults, {
    +        groupBy: false,
    +        groupByField: [],
    +        groupBySumGroup: false,
    +        groupByInitExpanded: undefined, //node, 'all'
    +        //internal variables
    +        loaded: false,
    +        originalData: undefined
    +    });
    +
    +    $.fn.bootstrapTable.methods.push('collapseAll', 'expandAll', 'refreshGroupByField');
    +
    +    $.extend($.fn.bootstrapTable.COLUMN_DEFAULTS, {
    +        groupBySumGroup: false
    +    });
    +
    +    var BootstrapTable = $.fn.bootstrapTable.Constructor,
    +        _init = BootstrapTable.prototype.init,
    +        _initData = BootstrapTable.prototype.initData;
    +
    +    BootstrapTable.prototype.init = function () {
    +        //Temporal validation
    +        if (!this.options.sortName) {
    +            if ((this.options.groupBy) && (this.options.groupByField.length > 0)) {
    +                var that = this;
    +
    +                // Compatibility: IE < 9 and old browsers
    +                if (!Object.keys) {
    +                    setObjectKeys();
    +                }
    +
    +                //Make sure that the internal variables are set correctly
    +                this.options.loaded = false;
    +                this.options.originalData = undefined;
    +
    +                originalRowAttr = this.options.rowAttributes;
    +                this.options.rowAttributes = rowAttr;
    +                this.$el.on('post-body.bs.table', function () {
    +                    that.$el.treetable({
    +                        expandable: true,
    +                        onNodeExpand: function () {
    +                            if (that.options.height) {
    +                                that.resetHeader();
    +                            }
    +                        },
    +                        onNodeCollapse: function () {
    +                            if (that.options.height) {
    +                                that.resetHeader();
    +                            }
    +                        }
    +                    }, true);
    +
    +                    if (that.options.groupByInitExpanded !== undefined) {
    +                        if (typeof that.options.groupByInitExpanded === 'number') {
    +                            that.expandNode(that.options.groupByInitExpanded);
    +                        } else if (that.options.groupByInitExpanded.toLowerCase() === 'all') {
    +                            that.expandAll();
    +                        }
    +                    }
    +                });
    +            }
    +        }
    +        _init.apply(this, Array.prototype.slice.apply(arguments));
    +    };
    +
    +    BootstrapTable.prototype.initData = function (data, type) {
    +        //Temporal validation
    +        if (!this.options.sortName) {
    +            if ((this.options.groupBy) && (this.options.groupByField.length > 0)) {
    +
    +                this.options.groupByField = typeof this.options.groupByField === 'string' ?
    +                    this.options.groupByField.replace('[', '').replace(']', '')
    +                        .replace(/ /g, '').toLowerCase().split(',') : this.options.groupByField;
    +
    +                data = makeGrouped(this, data ? data : this.options.data);
    +            }
    +        }
    +        _initData.apply(this, [data, type]);
    +    };
    +
    +    BootstrapTable.prototype.expandAll = function () {
    +        this.$el.treetable('expandAll');
    +    };
    +
    +    BootstrapTable.prototype.collapseAll = function () {
    +        this.$el.treetable('collapseAll');
    +    };
    +
    +    BootstrapTable.prototype.expandNode = function (id) {
    +        id = getParentRowId(this, id);
    +        if (id !== undefined) {
    +            this.$el.treetable('expandNode', id);
    +        }
    +    };
    +
    +    BootstrapTable.prototype.refreshGroupByField = function (groupByFields) {
    +        if (!$.fn.bootstrapTable.utils.compareObjects(this.options.groupByField, groupByFields)) {
    +            this.options.groupByField = groupByFields;
    +            this.load(this.options.originalData);
    +        }
    +    };
    +}(jQuery);
    diff --git a/public/assets/js/extensions/group-by/bootstrap-table-group-by.min.js b/public/assets/js/extensions/group-by/bootstrap-table-group-by.min.js
    new file mode 100755
    index 0000000000..9d55090040
    --- /dev/null
    +++ b/public/assets/js/extensions/group-by/bootstrap-table-group-by.min.js
    @@ -0,0 +1,7 @@
    +/*
    +* bootstrap-table - v1.9.1 - 2015-10-25
    +* https://github.com/wenzhixin/bootstrap-table
    +* Copyright (c) 2015 zhixin wen
    +* Licensed MIT License
    +*/
    +!function(a){"use strict";var b,c="data-tt-id",d="data-tt-parent-id",e={},f=void 0,g=function(b,c){for(var d=b.$body.find("tr").not("[data-tt-parent-id]"),e=0;e0&&(b.options.loaded=!0,b.options.originalData=b.options.data,b.options.data=d),d};a.extend(a.fn.bootstrapTable.defaults,{groupBy:!1,groupByField:[],groupBySumGroup:!1,groupByInitExpanded:void 0,loaded:!1,originalData:void 0}),a.fn.bootstrapTable.methods.push("collapseAll","expandAll","refreshGroupByField"),a.extend(a.fn.bootstrapTable.COLUMN_DEFAULTS,{groupBySumGroup:!1});var o=a.fn.bootstrapTable.Constructor,p=o.prototype.init,q=o.prototype.initData;o.prototype.init=function(){if(!this.options.sortName&&this.options.groupBy&&this.options.groupByField.length>0){var a=this;Object.keys||j(),this.options.loaded=!1,this.options.originalData=void 0,b=this.options.rowAttributes,this.options.rowAttributes=i,this.$el.on("post-body.bs.table",function(){a.$el.treetable({expandable:!0,onNodeExpand:function(){a.options.height&&a.resetHeader()},onNodeCollapse:function(){a.options.height&&a.resetHeader()}},!0),void 0!==a.options.groupByInitExpanded&&("number"==typeof a.options.groupByInitExpanded?a.expandNode(a.options.groupByInitExpanded):"all"===a.options.groupByInitExpanded.toLowerCase()&&a.expandAll())})}p.apply(this,Array.prototype.slice.apply(arguments))},o.prototype.initData=function(a,b){this.options.sortName||this.options.groupBy&&this.options.groupByField.length>0&&(this.options.groupByField="string"==typeof this.options.groupByField?this.options.groupByField.replace("[","").replace("]","").replace(/ /g,"").toLowerCase().split(","):this.options.groupByField,a=n(this,a?a:this.options.data)),q.apply(this,[a,b])},o.prototype.expandAll=function(){this.$el.treetable("expandAll")},o.prototype.collapseAll=function(){this.$el.treetable("collapseAll")},o.prototype.expandNode=function(a){a=g(this,a),void 0!==a&&this.$el.treetable("expandNode",a)},o.prototype.refreshGroupByField=function(b){a.fn.bootstrapTable.utils.compareObjects(this.options.groupByField,b)||(this.options.groupByField=b,this.load(this.options.originalData))}}(jQuery);
    \ No newline at end of file
    diff --git a/public/assets/js/extensions/key-events/bootstrap-table-key-events.js b/public/assets/js/extensions/key-events/bootstrap-table-key-events.js
    new file mode 100755
    index 0000000000..887f803562
    --- /dev/null
    +++ b/public/assets/js/extensions/key-events/bootstrap-table-key-events.js
    @@ -0,0 +1,80 @@
    +/**
    + * @author: Dennis Hernández
    + * @webSite: http://djhvscf.github.io/Blog
    + * @version: v1.0.0
    + *
    + * @update zhixin wen 
    + */
    +
    +!function ($) {
    +
    +    'use strict';
    +
    +    $.extend($.fn.bootstrapTable.defaults, {
    +        keyEvents: false
    +    });
    +
    +    var BootstrapTable = $.fn.bootstrapTable.Constructor,
    +        _init = BootstrapTable.prototype.init;
    +
    +    BootstrapTable.prototype.init = function () {
    +        _init.apply(this, Array.prototype.slice.apply(arguments));
    +        this.initKeyEvents();
    +    };
    +
    +    BootstrapTable.prototype.initKeyEvents = function () {
    +        if (this.options.keyEvents) {
    +            var that = this;
    +
    +            $(document).off('keydown').on('keydown', function (e) {
    +                var $search = that.$toolbar.find('.search input'),
    +                    $refresh = that.$toolbar.find('button[name="refresh"]'),
    +                    $toggle = that.$toolbar.find('button[name="toggle"]'),
    +                    $paginationSwitch = that.$toolbar.find('button[name="paginationSwitch"]');
    +
    +                if (document.activeElement === $search.get(0)) {
    +                    return true;
    +                }
    +
    +                switch (e.keyCode) {
    +                    case 83: //s
    +                        if (!that.options.search) {
    +                            return;
    +                        }
    +                        $search.focus();
    +                        return false;
    +                    case 82: //r
    +                        if (!that.options.showRefresh) {
    +                            return;
    +                        }
    +                        $refresh.click();
    +                        return false;
    +                    case 84: //t
    +                        if (!that.options.showToggle) {
    +                            return;
    +                        }
    +                        $toggle.click();
    +                        return false;
    +                    case 80: //p
    +                        if (!that.options.showPaginationSwitch) {
    +                            return;
    +                        }
    +                        $paginationSwitch.click();
    +                        return false;
    +                    case 37: // left
    +                        if (!that.options.pagination) {
    +                            return;
    +                        }
    +                        that.prevPage();
    +                        return false;
    +                    case 39: // right
    +                        if (!that.options.pagination) {
    +                            return;
    +                        }
    +                        that.nextPage();
    +                        return;
    +                }
    +            });
    +        }
    +    };
    +}(jQuery);
    diff --git a/public/assets/js/extensions/key-events/bootstrap-table-key-events.min.js b/public/assets/js/extensions/key-events/bootstrap-table-key-events.min.js
    new file mode 100755
    index 0000000000..db1561aa48
    --- /dev/null
    +++ b/public/assets/js/extensions/key-events/bootstrap-table-key-events.min.js
    @@ -0,0 +1,7 @@
    +/*
    +* bootstrap-table - v1.9.1 - 2015-10-25
    +* https://github.com/wenzhixin/bootstrap-table
    +* Copyright (c) 2015 zhixin wen
    +* Licensed MIT License
    +*/
    +!function(a){"use strict";a.extend(a.fn.bootstrapTable.defaults,{keyEvents:!1});var b=a.fn.bootstrapTable.Constructor,c=b.prototype.init;b.prototype.init=function(){c.apply(this,Array.prototype.slice.apply(arguments)),this.initKeyEvents()},b.prototype.initKeyEvents=function(){if(this.options.keyEvents){var b=this;a(document).off("keydown").on("keydown",function(a){var c=b.$toolbar.find(".search input"),d=b.$toolbar.find('button[name="refresh"]'),e=b.$toolbar.find('button[name="toggle"]'),f=b.$toolbar.find('button[name="paginationSwitch"]');if(document.activeElement===c.get(0))return!0;switch(a.keyCode){case 83:if(!b.options.search)return;return c.focus(),!1;case 82:if(!b.options.showRefresh)return;return d.click(),!1;case 84:if(!b.options.showToggle)return;return e.click(),!1;case 80:if(!b.options.showPaginationSwitch)return;return f.click(),!1;case 37:if(!b.options.pagination)return;return b.prevPage(),!1;case 39:if(!b.options.pagination)return;return void b.nextPage()}})}}}(jQuery);
    \ No newline at end of file
    diff --git a/public/assets/js/extensions/mobile/bootstrap-table-mobile.js b/public/assets/js/extensions/mobile/bootstrap-table-mobile.js
    new file mode 100755
    index 0000000000..5fb6704338
    --- /dev/null
    +++ b/public/assets/js/extensions/mobile/bootstrap-table-mobile.js
    @@ -0,0 +1,131 @@
    +/**
    + * @author: Dennis Hernández
    + * @webSite: http://djhvscf.github.io/Blog
    + * @version: v1.1.0
    + */
    +
    +!function ($) {
    +
    +    'use strict';
    +
    +    var showHideColumns = function (that, checked) {
    +        if (that.options.columnsHidden.length > 0 ) {
    +            $.each(that.columns, function (i, column) {
    +                if (that.options.columnsHidden.indexOf(column.field) !== -1) {
    +                    if (column.visible !== checked) {
    +                        that.toggleColumn($.fn.bootstrapTable.utils.getFieldIndex(that.columns, column.field), checked, true);
    +                    }
    +                }
    +            });
    +        }
    +    };
    +
    +    var resetView = function (that) {
    +        if (that.options.height || that.options.showFooter) {
    +            setTimeout(function(){
    +                that.resetView.call(that);
    +            }, 1);
    +        }
    +    };
    +
    +    var changeView = function (that, width, height) {
    +        if (that.options.minHeight) {
    +            if ((width <= that.options.minWidth) && (height <= that.options.minHeight)) {
    +                conditionCardView(that);
    +            } else if ((width > that.options.minWidth) && (height > that.options.minHeight)) {
    +                conditionFullView(that);
    +            }
    +        } else {
    +            if (width <= that.options.minWidth) {
    +                conditionCardView(that);
    +            } else if (width > that.options.minWidth) {
    +                conditionFullView(that);
    +            }
    +        }
    +
    +        resetView(that);
    +    };
    +
    +    var conditionCardView = function (that) {
    +        changeTableView(that, false);
    +        showHideColumns(that, false);
    +    };
    +
    +    var conditionFullView = function (that) {
    +        changeTableView(that, true);
    +        showHideColumns(that, true);
    +    };
    +
    +    var changeTableView = function (that, cardViewState) {
    +        that.options.cardView = cardViewState;
    +        that.toggleView();
    +    };
    +
    +    var debounce = function(func,wait) {
    +        var timeout;
    +        return function() {
    +            var context = this,
    +                args = arguments;
    +            var later = function() {
    +                timeout = null;
    +                func.apply(context,args);
    +            };
    +            clearTimeout(timeout);
    +            timeout = setTimeout(later, wait);
    +        };
    +    };
    +
    +    $.extend($.fn.bootstrapTable.defaults, {
    +        mobileResponsive: false,
    +        minWidth: 562,
    +        minHeight: undefined,
    +        heightThreshold: 100, // just slightly larger than mobile chrome's auto-hiding toolbar
    +        checkOnInit: true,
    +        columnsHidden: []
    +    });
    +
    +    var BootstrapTable = $.fn.bootstrapTable.Constructor,
    +        _init = BootstrapTable.prototype.init;
    +
    +    BootstrapTable.prototype.init = function () {
    +        _init.apply(this, Array.prototype.slice.apply(arguments));
    +
    +        if (!this.options.mobileResponsive) {
    +            return;
    +        }
    +
    +        if (!this.options.minWidth) {
    +            return;
    +        }
    +
    +        var that = this,
    +            old = {
    +                width: $(window).width(),
    +                height: $(window).height()
    +            };
    +
    +        $(window).on('resize orientationchange',debounce(function (evt) {
    +            // reset view if height has only changed by at least the threshold.
    +            var height = $(this).height(),
    +                width = $(this).width();
    +
    +            if (Math.abs(old.height - height) > that.options.heightThreshold || old.width != width) {
    +                changeView(that, width, height);
    +                old = {
    +                    width: width,
    +                    height: height
    +                };
    +            }
    +        },200));
    +
    +        if (this.options.checkOnInit) {
    +            var height = $(window).height(),
    +                width = $(window).width();
    +            changeView(this, width, height);
    +            old = {
    +                width: width,
    +                height: height
    +            };
    +        }
    +    };
    +}(jQuery);
    diff --git a/public/assets/js/extensions/mobile/bootstrap-table-mobile.min.js b/public/assets/js/extensions/mobile/bootstrap-table-mobile.min.js
    new file mode 100755
    index 0000000000..c693a824c3
    --- /dev/null
    +++ b/public/assets/js/extensions/mobile/bootstrap-table-mobile.min.js
    @@ -0,0 +1,7 @@
    +/*
    +* bootstrap-table - v1.9.1 - 2015-10-25
    +* https://github.com/wenzhixin/bootstrap-table
    +* Copyright (c) 2015 zhixin wen
    +* Licensed MIT License
    +*/
    +!function(a){"use strict";var b=function(b,c){b.options.columnsHidden.length>0&&a.each(b.columns,function(d,e){-1!==b.options.columnsHidden.indexOf(e.field)&&e.visible!==c&&b.toggleColumn(a.fn.bootstrapTable.utils.getFieldIndex(b.columns,e.field),c,!0)})},c=function(a){(a.options.height||a.options.showFooter)&&setTimeout(function(){a.resetView.call(a)},1)},d=function(a,b,d){a.options.minHeight?b<=a.options.minWidth&&d<=a.options.minHeight?e(a):b>a.options.minWidth&&d>a.options.minHeight&&f(a):b<=a.options.minWidth?e(a):b>a.options.minWidth&&f(a),c(a)},e=function(a){g(a,!1),b(a,!1)},f=function(a){g(a,!0),b(a,!0)},g=function(a,b){a.options.cardView=b,a.toggleView()},h=function(a,b){var c;return function(){var d=this,e=arguments,f=function(){c=null,a.apply(d,e)};clearTimeout(c),c=setTimeout(f,b)}};a.extend(a.fn.bootstrapTable.defaults,{mobileResponsive:!1,minWidth:562,minHeight:void 0,heightThreshold:100,checkOnInit:!0,columnsHidden:[]});var i=a.fn.bootstrapTable.Constructor,j=i.prototype.init;i.prototype.init=function(){if(j.apply(this,Array.prototype.slice.apply(arguments)),this.options.mobileResponsive&&this.options.minWidth){var b=this,c={width:a(window).width(),height:a(window).height()};if(a(window).on("resize orientationchange",h(function(){var e=a(this).height(),f=a(this).width();(Math.abs(c.height-e)>b.options.heightThreshold||c.width!=f)&&(d(b,f,e),c={width:f,height:e})},200)),this.options.checkOnInit){var e=a(window).height(),f=a(window).width();d(this,f,e),c={width:f,height:e}}}}}(jQuery);
    \ No newline at end of file
    diff --git a/public/assets/js/extensions/multiple-search/bootstrap-table-multiple-search.js b/public/assets/js/extensions/multiple-search/bootstrap-table-multiple-search.js
    new file mode 100755
    index 0000000000..22df2ae933
    --- /dev/null
    +++ b/public/assets/js/extensions/multiple-search/bootstrap-table-multiple-search.js
    @@ -0,0 +1,67 @@
    +/**
    + * @author: Dennis Hernández
    + * @webSite: http://djhvscf.github.io/Blog
    + * @version: v1.0.0
    + */
    +
    +!function ($) {
    +
    +    'use strict';
    +
    +    $.extend($.fn.bootstrapTable.defaults, {
    +        multipleSearch: false
    +    });
    +
    +    var BootstrapTable = $.fn.bootstrapTable.Constructor,
    +        _initSearch = BootstrapTable.prototype.initSearch;
    +
    +    BootstrapTable.prototype.initSearch = function () {
    +        if (this.options.multipleSearch) {
    +            var strArray = this.searchText.split(" "),
    +                that = this,
    +                f = $.isEmptyObject(this.filterColumns) ? null : this.filterColumns,
    +                dataFiltered = [];
    +
    +            if (strArray.length === 1) {
    +                _initSearch.apply(this, Array.prototype.slice.apply(arguments));
    +            } else {
    +                for (var i = 0; i < strArray.length; i++) {
    +                    var str = strArray[i].trim();
    +                    dataFiltered = str ? $.grep(dataFiltered.length === 0 ? this.options.data : dataFiltered, function (item, i) {
    +                        for (var key in item) {
    +                            key = $.isNumeric(key) ? parseInt(key, 10) : key;
    +                            var value = item[key],
    +                                column = that.columns[$.fn.bootstrapTable.utils.getFieldIndex(that.columns, key)],
    +                                j = $.inArray(key, that.header.fields);
    +
    +                            // Fix #142: search use formated data
    +                            if (column && column.searchFormatter) {
    +                                value = $.fn.bootstrapTable.utils.calculateObjectValue(column,
    +                                    that.header.formatters[j], [value, item, i], value);
    +                            }
    +
    +                            var index = $.inArray(key, that.header.fields);
    +                            if (index !== -1 && that.header.searchables[index] && (typeof value === 'string' || typeof value === 'number')) {
    +                                if (that.options.strictSearch) {
    +                                    if ((value + '').toLowerCase() === str) {
    +                                        return true;
    +                                    }
    +                                } else {
    +                                    if ((value + '').toLowerCase().indexOf(str) !== -1) {
    +                                        return true;
    +                                    }
    +                                }
    +                            }
    +                        }
    +                        return false;
    +                    }) : this.data;
    +                }
    +
    +                this.data = dataFiltered;
    +            }
    +        } else {
    +            _initSearch.apply(this, Array.prototype.slice.apply(arguments));
    +        }
    +    };
    +
    +}(jQuery);
    diff --git a/public/assets/js/extensions/multiple-search/bootstrap-table-multiple-search.min.js b/public/assets/js/extensions/multiple-search/bootstrap-table-multiple-search.min.js
    new file mode 100755
    index 0000000000..49cbf7c9d6
    --- /dev/null
    +++ b/public/assets/js/extensions/multiple-search/bootstrap-table-multiple-search.min.js
    @@ -0,0 +1,7 @@
    +/*
    +* bootstrap-table - v1.9.1 - 2015-10-25
    +* https://github.com/wenzhixin/bootstrap-table
    +* Copyright (c) 2015 zhixin wen
    +* Licensed MIT License
    +*/
    +!function(a){"use strict";a.extend(a.fn.bootstrapTable.defaults,{multipleSearch:!1});var b=a.fn.bootstrapTable.Constructor,c=b.prototype.initSearch;b.prototype.initSearch=function(){if(this.options.multipleSearch){var b=this.searchText.split(" "),d=this,e=(a.isEmptyObject(this.filterColumns)?null:this.filterColumns,[]);if(1===b.length)c.apply(this,Array.prototype.slice.apply(arguments));else{for(var f=0;f
    + * @version: v1.0.0
    + * https://github.com/dimbslmh/bootstrap-table/tree/master/src/extensions/multiple-sort/bootstrap-table-multiple-sort.js
    + */
    +
    +(function($) {
    +    'use strict';
    +
    +    var isSingleSort = false;
    +
    +    var sort_order = {
    +        asc: 'Ascending',
    +        desc: 'Descending'
    +    };
    +
    +    var showSortModal = function(that) {
    +        var _selector = that.$sortModal.selector,
    +            _id = _selector.substr(1);
    +
    +        if (!$(_id).hasClass("modal")) {
    +            var sModal = '  ';
    +
    +            $("body").append($(sModal));
    +
    +            that.$sortModal = $(_selector);
    +            var $rows = that.$sortModal.find("tbody > tr");
    +
    +            that.$sortModal.off('click', '#add').on('click', '#add', function() {
    +                var total = that.$sortModal.find('.multi-sort-name:first option').length,
    +                    current = that.$sortModal.find('tbody tr').length;
    +
    +                if (current < total) {
    +                    current++;
    +                    that.addLevel();
    +                    that.setButtonStates();
    +                }
    +            });
    +
    +            that.$sortModal.off('click', '#delete').on('click', '#delete', function() {
    +                var total = that.$sortModal.find('.multi-sort-name:first option').length,
    +                    current = that.$sortModal.find('tbody tr').length;
    +
    +                if (current > 1 && current <= total) {
    +                    current--;
    +                    that.$sortModal.find('tbody tr:last').remove();
    +                    that.setButtonStates();
    +                }
    +            });
    +
    +            that.$sortModal.off('click', '.btn-primary').on('click', '.btn-primary', function() {
    +                var $rows = that.$sortModal.find("tbody > tr"),
    +                    $alert = that.$sortModal.find('div.alert'),
    +                    fields = [],
    +                    results = [];
    +
    +
    +                that.options.sortPriority = $.map($rows, function(row) {
    +                    var $row = $(row),
    +                        name = $row.find('.multi-sort-name').val(),
    +                        order = $row.find('.multi-sort-order').val();
    +
    +                    fields.push(name);
    +
    +                    return {
    +                        sortName: name,
    +                        sortOrder: order
    +                    };
    +                });
    +
    +                var sorted_fields = fields.sort();
    +
    +                for (var i = 0; i < fields.length - 1; i++) {
    +                    if (sorted_fields[i + 1] == sorted_fields[i]) {
    +                        results.push(sorted_fields[i]);
    +                    }
    +                }
    +
    +                if (results.length > 0) {
    +                    if ($alert.length === 0) {
    +                        $alert = '';
    +                        $($alert).insertBefore(that.$sortModal.find('.bars'));
    +                    }
    +                } else {
    +                    if ($alert.length === 1) {
    +                        $($alert).remove();
    +                    }
    +
    +                    that.options.sortName = "";
    +                    that.onMultipleSort();
    +                    that.$sortModal.modal('hide');
    +                }
    +            });
    +
    +            if (that.options.sortPriority === null || that.options.sortPriority.length === 0) {
    +                if (that.options.sortName) {
    +                    that.options.sortPriority = [{
    +                        sortName: that.options.sortName,
    +                        sortOrder: that.options.sortOrder
    +                    }];
    +                }
    +            }
    +
    +            if (that.options.sortPriority !== null && that.options.sortPriority.length > 0) {
    +                if ($rows.length < that.options.sortPriority.length && typeof that.options.sortPriority === 'object') {
    +                    for (var i = 0; i < that.options.sortPriority.length; i++) {
    +                        that.addLevel(i, that.options.sortPriority[i]);
    +                    }
    +                }
    +            } else {
    +                that.addLevel(0);
    +            }
    +
    +            that.setButtonStates();
    +        }
    +    };
    +
    +    $.extend($.fn.bootstrapTable.defaults, {
    +        showMultiSort: false,
    +        sortPriority: null,
    +        onMultipleSort: function() {
    +            return false;
    +        }
    +    });
    +
    +    $.extend($.fn.bootstrapTable.defaults.icons, {
    +        sort: 'glyphicon-sort',
    +        plus: 'glyphicon-plus',
    +        minus: 'glyphicon-minus'
    +    });
    +
    +    $.extend($.fn.bootstrapTable.Constructor.EVENTS, {
    +        'multiple-sort.bs.table': 'onMultipleSort'
    +    });
    +
    +    $.extend($.fn.bootstrapTable.locales, {
    +        formatMultipleSort: function() {
    +            return 'Multiple Sort';
    +        },
    +        formatAddLevel: function() {
    +            return "Add Level";
    +        },
    +        formatDeleteLevel: function() {
    +            return "Delete Level";
    +        },
    +        formatColumn: function() {
    +            return "Column";
    +        },
    +        formatOrder: function() {
    +            return "Order";
    +        },
    +        formatSortBy: function() {
    +            return "Sort by";
    +        },
    +        formatThenBy: function() {
    +            return "Then by";
    +        },
    +        formatSort: function() {
    +            return "Sort";
    +        },
    +        formatCancel: function() {
    +            return "Cancel";
    +        },
    +        formatDuplicateAlertTitle: function() {
    +            return "Duplicate(s) detected!";
    +        },
    +        formatDuplicateAlertDescription: function() {
    +            return "Please remove or change any duplicate column.";
    +        }
    +    });
    +
    +    $.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales);
    +
    +    var BootstrapTable = $.fn.bootstrapTable.Constructor,
    +        _initToolbar = BootstrapTable.prototype.initToolbar;
    +
    +    BootstrapTable.prototype.initToolbar = function() {
    +        this.showToolbar = true;
    +        var that = this,
    +            sortModalId = '#sortModal_' + this.$el.attr('id');
    +        this.$sortModal = $(sortModalId);
    +
    +        _initToolbar.apply(this, Array.prototype.slice.apply(arguments));
    +
    +        if (this.options.showMultiSort) {
    +            var $btnGroup = this.$toolbar.find('>.btn-group').first(),
    +                $multiSortBtn = this.$toolbar.find('div.multi-sort');
    +
    +            if (!$multiSortBtn.length) {
    +                $multiSortBtn = '  ';
    +
    +                $btnGroup.append($multiSortBtn);
    +
    +                showSortModal(that);
    +            }
    +
    +            this.$el.on('sort.bs.table', function() {
    +                isSingleSort = true;
    +            });
    +
    +            this.$el.on('multiple-sort.bs.table', function() {
    +                isSingleSort = false;
    +            });
    +
    +            this.$el.on('load-success.bs.table', function() {
    +                if (!isSingleSort && that.options.sortPriority !== null && typeof that.options.sortPriority === 'object') {
    +                    that.onMultipleSort();
    +                }
    +            });
    +
    +            this.$el.on('column-switch.bs.table', function(field, checked) {
    +                for (var i = 0; i < that.options.sortPriority.length; i++) {
    +                    if (that.options.sortPriority[i].sortName === checked) {
    +                        that.options.sortPriority.splice(i, 1);
    +                    }
    +                }
    +
    +                that.assignSortableArrows();
    +                that.$sortModal.remove();
    +                showSortModal(that);
    +            });
    +
    +            this.$el.on('reset-view.bs.table', function() {
    +                if (!isSingleSort && that.options.sortPriority !== null && typeof that.options.sortPriority === 'object') {
    +                    that.assignSortableArrows();
    +                }
    +            });
    +        }
    +    };
    +
    +    BootstrapTable.prototype.onMultipleSort = function() {
    +        var that = this;
    +
    +        var cmp = function(x, y) {
    +            return x > y ? 1 : x < y ? -1 : 0;
    +        };
    +
    +        var arrayCmp = function(a, b) {
    +            var arr1 = [],
    +                arr2 = [];
    +
    +            for (var i = 0; i < that.options.sortPriority.length; i++) {
    +                var order = that.options.sortPriority[i].sortOrder === 'desc' ? -1 : 1,
    +                    aa = a[that.options.sortPriority[i].sortName],
    +                    bb = b[that.options.sortPriority[i].sortName];
    +
    +                if (aa === undefined || aa === null) {
    +                    aa = '';
    +                }
    +                if (bb === undefined || bb === null) {
    +                    bb = '';
    +                }
    +                if ($.isNumeric(aa) && $.isNumeric(bb)) {
    +                    aa = parseFloat(aa);
    +                    bb = parseFloat(bb);
    +                }
    +                if (typeof aa !== 'string') {
    +                    aa = aa.toString();
    +                }
    +
    +                arr1.push(
    +                    order * cmp(aa, bb));
    +                arr2.push(
    +                    order * cmp(bb, aa));
    +            }
    +
    +            return cmp(arr1, arr2);
    +        };
    +
    +        this.data.sort(function(a, b) {
    +            return arrayCmp(a, b);
    +        });
    +
    +        this.initBody();
    +        this.assignSortableArrows();
    +        this.trigger('multiple-sort');
    +    };
    +
    +    BootstrapTable.prototype.addLevel = function(index, sortPriority) {
    +        var text = index === 0 ? this.options.formatSortBy() : this.options.formatThenBy();
    +
    +        this.$sortModal.find('tbody')
    +            .append($('')
    +                .append($('').text(text))
    +                .append($('').append($('')))
    +        );
    +
    +        var $multiSortName = this.$sortModal.find('.multi-sort-name').last(),
    +            $multiSortOrder = this.$sortModal.find('.multi-sort-order').last();
    +
    +        $.each(this.columns, function (i, column) {
    +            if (column.sortable === false || column.visible === false) {
    +                return true;
    +            }
    +            $multiSortName.append('');
    +        });
    +
    +        $.each(sort_order, function(value, order) {
    +            $multiSortOrder.append('');
    +        });
    +
    +        if (sortPriority !== undefined) {
    +            $multiSortName.find('option[value="' + sortPriority.sortName + '"]').attr("selected", true);
    +            $multiSortOrder.find('option[value="' + sortPriority.sortOrder + '"]').attr("selected", true);
    +        }
    +    };
    +
    +    BootstrapTable.prototype.assignSortableArrows = function() {
    +        var that = this,
    +            headers = that.$header.find('th');
    +
    +        for (var i = 0; i < headers.length; i++) {
    +            for (var c = 0; c < that.options.sortPriority.length; c++) {
    +                if ($(headers[i]).data('field') === that.options.sortPriority[c].sortName) {
    +                    $(headers[i]).find('.sortable').removeClass('desc asc').addClass(that.options.sortPriority[c].sortOrder);
    +                }
    +            }
    +        }
    +    };
    +
    +    BootstrapTable.prototype.setButtonStates = function() {
    +        var total = this.$sortModal.find('.multi-sort-name:first option').length,
    +            current = this.$sortModal.find('tbody tr').length;
    +
    +        if (current == total) {
    +            this.$sortModal.find('#add').attr('disabled', 'disabled');
    +        }
    +        if (current > 1) {
    +            this.$sortModal.find('#delete').removeAttr('disabled');
    +        }
    +        if (current < total) {
    +            this.$sortModal.find('#add').removeAttr('disabled');
    +        }
    +        if (current == 1) {
    +            this.$sortModal.find('#delete').attr('disabled', 'disabled');
    +        }
    +    };
    +})(jQuery);
    diff --git a/public/assets/js/extensions/multiple-sort/bootstrap-table-multiple-sort.min.js b/public/assets/js/extensions/multiple-sort/bootstrap-table-multiple-sort.min.js
    new file mode 100755
    index 0000000000..a8cb610da8
    --- /dev/null
    +++ b/public/assets/js/extensions/multiple-sort/bootstrap-table-multiple-sort.min.js
    @@ -0,0 +1,7 @@
    +/*
    +* bootstrap-table - v1.9.1 - 2015-10-25
    +* https://github.com/wenzhixin/bootstrap-table
    +* Copyright (c) 2015 zhixin wen
    +* Licensed MIT License
    +*/
    +!function(a){"use strict";var b=!1,c={asc:"Ascending",desc:"Descending"},d=function(b){var c=b.$sortModal.selector,d=c.substr(1);if(!a(d).hasClass("modal")){var e='  ",a("body").append(a(e)),b.$sortModal=a(c);var f=b.$sortModal.find("tbody > tr");if(b.$sortModal.off("click","#add").on("click","#add",function(){var a=b.$sortModal.find(".multi-sort-name:first option").length,c=b.$sortModal.find("tbody tr").length;a>c&&(c++,b.addLevel(),b.setButtonStates())}),b.$sortModal.off("click","#delete").on("click","#delete",function(){var a=b.$sortModal.find(".multi-sort-name:first option").length,c=b.$sortModal.find("tbody tr").length;c>1&&a>=c&&(c--,b.$sortModal.find("tbody tr:last").remove(),b.setButtonStates())}),b.$sortModal.off("click",".btn-primary").on("click",".btn-primary",function(){var c=b.$sortModal.find("tbody > tr"),d=b.$sortModal.find("div.alert"),e=[],f=[];b.options.sortPriority=a.map(c,function(b){var c=a(b),d=c.find(".multi-sort-name").val(),f=c.find(".multi-sort-order").val();return e.push(d),{sortName:d,sortOrder:f}});for(var g=e.sort(),h=0;h0?0===d.length&&(d='",a(d).insertBefore(b.$sortModal.find(".bars"))):(1===d.length&&a(d).remove(),b.options.sortName="",b.onMultipleSort(),b.$sortModal.modal("hide"))}),(null===b.options.sortPriority||0===b.options.sortPriority.length)&&b.options.sortName&&(b.options.sortPriority=[{sortName:b.options.sortName,sortOrder:b.options.sortOrder}]),null!==b.options.sortPriority&&b.options.sortPriority.length>0){if(f.length.btn-group").first(),h=this.$toolbar.find("div.multi-sort");h.length||(h='  ",g.append(h),d(c)),this.$el.on("sort.bs.table",function(){b=!0}),this.$el.on("multiple-sort.bs.table",function(){b=!1}),this.$el.on("load-success.bs.table",function(){b||null===c.options.sortPriority||"object"!=typeof c.options.sortPriority||c.onMultipleSort()}),this.$el.on("column-switch.bs.table",function(a,b){for(var e=0;eb?1:b>a?-1:0},d=function(d,e){for(var f=[],g=[],h=0;h").append(a("").text(e)).append(a("").append(a(''))));var f=this.$sortModal.find(".multi-sort-name").last(),g=this.$sortModal.find(".multi-sort-order").last();a.each(this.columns,function(a,b){return b.sortable===!1||b.visible===!1?!0:void f.append('")}),a.each(c,function(a,b){g.append('")}),void 0!==d&&(f.find('option[value="'+d.sortName+'"]').attr("selected",!0),g.find('option[value="'+d.sortOrder+'"]').attr("selected",!0))},e.prototype.assignSortableArrows=function(){for(var b=this,c=b.$header.find("th"),d=0;d1&&this.$sortModal.find("#delete").removeAttr("disabled"),a>b&&this.$sortModal.find("#add").removeAttr("disabled"),1==b&&this.$sortModal.find("#delete").attr("disabled","disabled")}}(jQuery);
    \ No newline at end of file
    diff --git a/public/assets/js/extensions/natural-sorting/bootstrap-table-natural-sorting.js b/public/assets/js/extensions/natural-sorting/bootstrap-table-natural-sorting.js
    new file mode 100755
    index 0000000000..8e84eb659b
    --- /dev/null
    +++ b/public/assets/js/extensions/natural-sorting/bootstrap-table-natural-sorting.js
    @@ -0,0 +1,47 @@
    +/**
    + * @author: Brian Huisman
    + * @webSite: http://www.greywyvern.com
    + * @version: v1.0.0
    + * JS function to allow natural sorting on bootstrap-table columns
    + * just add data-sorter="alphanum" to any th
    + *
    + * @update Dennis Hernández 
    + */
    +
    +function alphanum(a, b) {
    +  function chunkify(t) {
    +    var tz = [],
    +        x = 0,
    +        y = -1,
    +        n = 0,
    +        i,
    +        j;
    +
    +    while (i = (j = t.charAt(x++)).charCodeAt(0)) {
    +      var m = (i === 46 || (i >= 48 && i <= 57));
    +      if (m !== n) {
    +        tz[++y] = "";
    +        n = m;
    +      }
    +      tz[y] += j;
    +    }
    +    return tz;
    +  }
    +
    +  var aa = chunkify(a);
    +  var bb = chunkify(b);
    +
    +  for (x = 0; aa[x] && bb[x]; x++) {
    +    if (aa[x] !== bb[x]) {
    +      var c = Number(aa[x]),
    +          d = Number(bb[x]);
    +
    +      if (c == aa[x] && d == bb[x]) {
    +        return c - d;
    +      } else {
    +          return (aa[x] > bb[x]) ? 1 : -1;
    +      }
    +    }
    +  }
    +  return aa.length - bb.length;
    +}
    \ No newline at end of file
    diff --git a/public/assets/js/extensions/natural-sorting/bootstrap-table-natural-sorting.min.js b/public/assets/js/extensions/natural-sorting/bootstrap-table-natural-sorting.min.js
    new file mode 100755
    index 0000000000..2ccb66b63d
    --- /dev/null
    +++ b/public/assets/js/extensions/natural-sorting/bootstrap-table-natural-sorting.min.js
    @@ -0,0 +1,7 @@
    +/*
    +* bootstrap-table - v1.9.1 - 2015-10-25
    +* https://github.com/wenzhixin/bootstrap-table
    +* Copyright (c) 2015 zhixin wen
    +* Licensed MIT License
    +*/
    +function alphanum(a,b){function c(a){for(var b,c,d=[],e=0,f=-1,g=0;b=(c=a.charAt(e++)).charCodeAt(0);){var h=46===b||b>=48&&57>=b;h!==g&&(d[++f]="",g=h),d[f]+=c}return d}var d=c(a),e=c(b);for(x=0;d[x]&&e[x];x++)if(d[x]!==e[x]){var f=Number(d[x]),g=Number(e[x]);return f==d[x]&&g==e[x]?f-g:d[x]>e[x]?1:-1}return d.length-e.length}
    \ No newline at end of file
    diff --git a/public/assets/js/extensions/reorder-columns/bootstrap-table-reorder-columns.js b/public/assets/js/extensions/reorder-columns/bootstrap-table-reorder-columns.js
    new file mode 100755
    index 0000000000..0c8b8b3f7e
    --- /dev/null
    +++ b/public/assets/js/extensions/reorder-columns/bootstrap-table-reorder-columns.js
    @@ -0,0 +1,121 @@
    +/**
    + * @author: Dennis Hernández
    + * @webSite: http://djhvscf.github.io/Blog
    + * @version: v1.1.0
    + */
    +
    +!function ($) {
    +
    +    'use strict';
    +
    +    $.extend($.fn.bootstrapTable.defaults, {
    +        reorderableColumns: false,
    +        maxMovingRows: 10,
    +        onReorderColumn: function (headerFields) {
    +            return false;
    +        },
    +        dragaccept: null
    +    });
    +
    +    $.extend($.fn.bootstrapTable.Constructor.EVENTS, {
    +        'reorder-column.bs.table': 'onReorderColumn'
    +    });
    +
    +    var BootstrapTable = $.fn.bootstrapTable.Constructor,
    +        _initHeader = BootstrapTable.prototype.initHeader,
    +        _toggleColumn = BootstrapTable.prototype.toggleColumn,
    +        _toggleView = BootstrapTable.prototype.toggleView,
    +        _resetView = BootstrapTable.prototype.resetView;
    +
    +    BootstrapTable.prototype.initHeader = function () {
    +        _initHeader.apply(this, Array.prototype.slice.apply(arguments));
    +
    +        if (!this.options.reorderableColumns) {
    +            return;
    +        }
    +
    +        this.makeRowsReorderable();
    +    };
    +
    +    BootstrapTable.prototype.toggleColumn = function () {
    +        _toggleColumn.apply(this, Array.prototype.slice.apply(arguments));
    +
    +        if (!this.options.reorderableColumns) {
    +            return;
    +        }
    +
    +        this.makeRowsReorderable();
    +    };
    +
    +    BootstrapTable.prototype.toggleView = function () {
    +        _toggleView.apply(this, Array.prototype.slice.apply(arguments));
    +
    +        if (!this.options.reorderableColumns) {
    +            return;
    +        }
    +
    +        if (this.options.cardView) {
    +            return;
    +        }
    +
    +        this.makeRowsReorderable();
    +    };
    +
    +    BootstrapTable.prototype.resetView = function () {
    +        _resetView.apply(this, Array.prototype.slice.apply(arguments));
    +
    +        if (!this.options.reorderableColumns) {
    +            return;
    +        }
    +
    +        this.makeRowsReorderable();
    +    };
    +
    +    BootstrapTable.prototype.makeRowsReorderable = function () {
    +        var that = this;
    +        try {
    +            $(this.$el).dragtable('destroy');
    +        } catch (e) {}
    +        $(this.$el).dragtable({
    +            maxMovingRows: that.options.maxMovingRows,
    +            dragaccept: that.options.dragaccept,
    +            clickDelay:200,
    +            beforeStop: function() {
    +                var ths = [],
    +                    formatters = [],
    +                    columns = [],
    +                    columnsHidden = [],
    +                    columnIndex = -1;
    +                that.$header.find('th').each(function (i) {
    +                    ths.push($(this).data('field'));
    +                    formatters.push($(this).data('formatter'));
    +                });
    +
    +                //Exist columns not shown
    +                if (ths.length < that.columns.length) {
    +                    columnsHidden = $.grep(that.columns, function (column) {
    +                       return !column.visible;
    +                    });
    +                    for (var i = 0; i < columnsHidden.length; i++) {
    +                        ths.push(columnsHidden[i].field);
    +                        formatters.push(columnsHidden[i].formatter);
    +                    }
    +                }
    +
    +                for (var i = 0; i < ths.length; i++ ) {
    +                    columnIndex = $.fn.bootstrapTable.utils.getFieldIndex(that.columns, ths[i]);
    +                    if (columnIndex !== -1) {
    +                        columns.push(that.columns[columnIndex]);
    +                        that.columns.splice(columnIndex, 1);
    +                    }
    +                }
    +
    +                that.columns = that.columns.concat(columns);
    +                that.header.fields = ths;
    +                that.header.formatters = formatters;
    +                that.resetView();
    +                that.trigger('reorder-column', ths);
    +            }
    +        });
    +    };
    +}(jQuery);
    diff --git a/public/assets/js/extensions/reorder-columns/bootstrap-table-reorder-columns.min.js b/public/assets/js/extensions/reorder-columns/bootstrap-table-reorder-columns.min.js
    new file mode 100755
    index 0000000000..50cad77bed
    --- /dev/null
    +++ b/public/assets/js/extensions/reorder-columns/bootstrap-table-reorder-columns.min.js
    @@ -0,0 +1,7 @@
    +/*
    +* bootstrap-table - v1.9.1 - 2015-10-25
    +* https://github.com/wenzhixin/bootstrap-table
    +* Copyright (c) 2015 zhixin wen
    +* Licensed MIT License
    +*/
    +!function(a){"use strict";a.extend(a.fn.bootstrapTable.defaults,{reorderableColumns:!1,maxMovingRows:10,onReorderColumn:function(){return!1},dragaccept:null}),a.extend(a.fn.bootstrapTable.Constructor.EVENTS,{"reorder-column.bs.table":"onReorderColumn"});var b=a.fn.bootstrapTable.Constructor,c=b.prototype.initHeader,d=b.prototype.toggleColumn,e=b.prototype.toggleView,f=b.prototype.resetView;b.prototype.initHeader=function(){c.apply(this,Array.prototype.slice.apply(arguments)),this.options.reorderableColumns&&this.makeRowsReorderable()},b.prototype.toggleColumn=function(){d.apply(this,Array.prototype.slice.apply(arguments)),this.options.reorderableColumns&&this.makeRowsReorderable()},b.prototype.toggleView=function(){e.apply(this,Array.prototype.slice.apply(arguments)),this.options.reorderableColumns&&(this.options.cardView||this.makeRowsReorderable())},b.prototype.resetView=function(){f.apply(this,Array.prototype.slice.apply(arguments)),this.options.reorderableColumns&&this.makeRowsReorderable()},b.prototype.makeRowsReorderable=function(){var b=this;try{a(this.$el).dragtable("destroy")}catch(c){}a(this.$el).dragtable({maxMovingRows:b.options.maxMovingRows,dragaccept:b.options.dragaccept,clickDelay:200,beforeStop:function(){var c=[],d=[],e=[],f=[],g=-1;if(b.$header.find("th").each(function(){c.push(a(this).data("field")),d.push(a(this).data("formatter"))}),c.length
    + * @version: v2.0.0
    + *
    + * @update Dennis Hernández 
    + */
    +
    +!function($) {
    +    'use strict';
    +
    +    var firstLoad = false;
    +
    +    var sprintf = $.fn.bootstrapTable.utils.sprintf;
    +
    +    var showAvdSearch = function(pColumns, searchTitle, searchText, that) {
    +        if (!$("#avdSearchModal" + "_" + that.options.idTable).hasClass("modal")) {
    +            var vModal = sprintf("
    ", "_" + that.options.idTable); + vModal += "
    "; + vModal += "
    "; + vModal += "
    "; + vModal += " "; + vModal += sprintf("

    %s

    ", searchTitle); + vModal += "
    "; + vModal += "
    "; + vModal += sprintf("
    ", "_" + that.options.idTable); + vModal += "
    "; + vModal += "
    "; + vModal += "
    "; + vModal += "
    "; + vModal += "
    "; + + $("body").append($(vModal)); + + var vFormAvd = createFormAvd(pColumns, searchText, that), + timeoutId = 0;; + + $('#avdSearchModalContent' + "_" + that.options.idTable).append(vFormAvd.join('')); + + $('#' + that.options.idForm).off('keyup blur', 'input').on('keyup blur', 'input', function (event) { + clearTimeout(timeoutId); + timeoutId = setTimeout(function () { + that.onColumnAdvancedSearch(event); + }, that.options.searchTimeOut); + }); + + $("#btnCloseAvd" + "_" + that.options.idTable).click(function() { + $("#avdSearchModal" + "_" + that.options.idTable).modal('hide'); + }); + + $("#avdSearchModal" + "_" + that.options.idTable).modal(); + } else { + $("#avdSearchModal" + "_" + that.options.idTable).modal(); + } + }; + + var createFormAvd = function(pColumns, searchText, that) { + var htmlForm = []; + htmlForm.push(sprintf('
    ', that.options.idForm, that.options.actionForm)); + for (var i in pColumns) { + var vObjCol = pColumns[i]; + if (!vObjCol.checkbox && vObjCol.visible && vObjCol.searchable) { + htmlForm.push('
    '); + htmlForm.push(sprintf('', vObjCol.title)); + htmlForm.push('
    '); + htmlForm.push(sprintf('', vObjCol.field, vObjCol.title, vObjCol.field)); + htmlForm.push('
    '); + htmlForm.push('
    '); + } + } + + htmlForm.push('
    '); + htmlForm.push('
    '); + htmlForm.push(sprintf('', "_" + that.options.idTable, searchText)); + htmlForm.push('
    '); + htmlForm.push('
    '); + htmlForm.push('
    '); + + return htmlForm; + }; + + $.extend($.fn.bootstrapTable.defaults, { + advancedSearch: false, + idForm: 'advancedSearch', + actionForm: '', + idTable: undefined, + onColumnAdvancedSearch: function (field, text) { + return false; + } + }); + + $.extend($.fn.bootstrapTable.defaults.icons, { + advancedSearchIcon: 'glyphicon-chevron-down' + }); + + $.extend($.fn.bootstrapTable.Constructor.EVENTS, { + 'column-advanced-search.bs.table': 'onColumnAdvancedSearch' + }); + + $.extend($.fn.bootstrapTable.locales, { + formatAdvancedSearch: function() { + return 'Advanced search'; + }, + formatAdvancedCloseButton: function() { + return "Close"; + } + }); + + $.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales); + + var BootstrapTable = $.fn.bootstrapTable.Constructor, + _initToolbar = BootstrapTable.prototype.initToolbar, + _load = BootstrapTable.prototype.load, + _initSearch = BootstrapTable.prototype.initSearch; + + BootstrapTable.prototype.initToolbar = function() { + _initToolbar.apply(this, Array.prototype.slice.apply(arguments)); + + if (!this.options.search) { + return; + } + + if (!this.options.advancedSearch) { + return; + } + + if (!this.options.idTable) { + return; + } + + var that = this, + html = []; + + html.push(sprintf('
    ', this.options.buttonsAlign, this.options.buttonsAlign)); + html.push(sprintf('
    '); + + that.$toolbar.prepend(html.join('')); + + that.$toolbar.find('button[name="advancedSearch"]') + .off('click').on('click', function() { + showAvdSearch(that.columns, that.options.formatAdvancedSearch(), that.options.formatAdvancedCloseButton(), that); + }); + }; + + BootstrapTable.prototype.load = function(data) { + _load.apply(this, Array.prototype.slice.apply(arguments)); + + if (!this.options.advancedSearch) { + return; + } + + if (typeof this.options.idTable === 'undefined') { + return; + } else { + if (!firstLoad) { + var height = parseInt($(".bootstrap-table").height()); + height += 10; + $("#" + this.options.idTable).bootstrapTable("resetView", {height: height}); + firstLoad = true; + } + } + }; + + BootstrapTable.prototype.initSearch = function () { + _initSearch.apply(this, Array.prototype.slice.apply(arguments)); + + if (!this.options.advancedSearch) { + return; + } + + var that = this; + var fp = $.isEmptyObject(this.filterColumnsPartial) ? null : this.filterColumnsPartial; + + this.data = fp ? $.grep(this.data, function (item, i) { + for (var key in fp) { + var fval = fp[key].toLowerCase(); + var value = item[key]; + value = $.fn.bootstrapTable.utils.calculateObjectValue(that.header, + that.header.formatters[$.inArray(key, that.header.fields)], + [value, item, i], value); + + if (!($.inArray(key, that.header.fields) !== -1 && + (typeof value === 'string' || typeof value === 'number') && + (value + '').toLowerCase().indexOf(fval) !== -1)) { + return false; + } + } + return true; + }) : this.data; + }; + + BootstrapTable.prototype.onColumnAdvancedSearch = function (event) { + var text = $.trim($(event.currentTarget).val()); + var $field = $(event.currentTarget)[0].id; + + if ($.isEmptyObject(this.filterColumnsPartial)) { + this.filterColumnsPartial = {}; + } + if (text) { + this.filterColumnsPartial[$field] = text; + } else { + delete this.filterColumnsPartial[$field]; + } + + this.options.pageNumber = 1; + this.onSearch(event); + this.updatePagination(); + this.trigger('column-advanced-search', $field, text); + }; +}(jQuery); diff --git a/public/assets/js/extensions/toolbar/bootstrap-table-toolbar.min.js b/public/assets/js/extensions/toolbar/bootstrap-table-toolbar.min.js new file mode 100755 index 0000000000..f5a6490e9e --- /dev/null +++ b/public/assets/js/extensions/toolbar/bootstrap-table-toolbar.min.js @@ -0,0 +1,7 @@ +/* +* bootstrap-table - v1.9.1 - 2015-10-25 +* https://github.com/wenzhixin/bootstrap-table +* Copyright (c) 2015 zhixin wen +* Licensed MIT License +*/ +!function(a){"use strict";var b=!1,c=a.fn.bootstrapTable.utils.sprintf,d=function(b,d,f,g){if(a("#avdSearchModal_"+g.options.idTable).hasClass("modal"))a("#avdSearchModal_"+g.options.idTable).modal();else{var h=c('",a("body").append(a(h));var i=e(b,f,g),j=0;a("#avdSearchModalContent_"+g.options.idTable).append(i.join("")),a("#"+g.options.idForm).off("keyup blur","input").on("keyup blur","input",function(a){clearTimeout(j),j=setTimeout(function(){g.onColumnAdvancedSearch(a)},g.options.searchTimeOut)}),a("#btnCloseAvd_"+g.options.idTable).click(function(){a("#avdSearchModal_"+g.options.idTable).modal("hide")}),a("#avdSearchModal_"+g.options.idTable).modal()}},e=function(a,b,d){var e=[];e.push(c('
    ',d.options.idForm,d.options.actionForm));for(var f in a){var g=a[f];!g.checkbox&&g.visible&&g.searchable&&(e.push('
    '),e.push(c('',g.title)),e.push('
    '),e.push(c('',g.field,g.title,g.field)),e.push("
    "),e.push("
    "))}return e.push('
    '),e.push('
    '),e.push(c('',"_"+d.options.idTable,b)),e.push("
    "),e.push("
    "),e.push("
    "),e};a.extend(a.fn.bootstrapTable.defaults,{advancedSearch:!1,idForm:"advancedSearch",actionForm:"",idTable:void 0,onColumnAdvancedSearch:function(){return!1}}),a.extend(a.fn.bootstrapTable.defaults.icons,{advancedSearchIcon:"glyphicon-chevron-down"}),a.extend(a.fn.bootstrapTable.Constructor.EVENTS,{"column-advanced-search.bs.table":"onColumnAdvancedSearch"}),a.extend(a.fn.bootstrapTable.locales,{formatAdvancedSearch:function(){return"Advanced search"},formatAdvancedCloseButton:function(){return"Close"}}),a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales);var f=a.fn.bootstrapTable.Constructor,g=f.prototype.initToolbar,h=f.prototype.load,i=f.prototype.initSearch;f.prototype.initToolbar=function(){if(g.apply(this,Array.prototype.slice.apply(arguments)),this.options.search&&this.options.advancedSearch&&this.options.idTable){var a=this,b=[];b.push(c('
    ',this.options.buttonsAlign,this.options.buttonsAlign)),b.push(c('
    "),a.$toolbar.prepend(b.join("")),a.$toolbar.find('button[name="advancedSearch"]').off("click").on("click",function(){d(a.columns,a.options.formatAdvancedSearch(),a.options.formatAdvancedCloseButton(),a)})}},f.prototype.load=function(){if(h.apply(this,Array.prototype.slice.apply(arguments)),this.options.advancedSearch&&"undefined"!=typeof this.options.idTable&&!b){var c=parseInt(a(".bootstrap-table").height());c+=10,a("#"+this.options.idTable).bootstrapTable("resetView",{height:c}),b=!0}},f.prototype.initSearch=function(){if(i.apply(this,Array.prototype.slice.apply(arguments)),this.options.advancedSearch){var b=this,c=a.isEmptyObject(this.filterColumnsPartial)?null:this.filterColumnsPartial;this.data=c?a.grep(this.data,function(d,e){for(var f in c){var g=c[f].toLowerCase(),h=d[f];if(h=a.fn.bootstrapTable.utils.calculateObjectValue(b.header,b.header.formatters[a.inArray(f,b.header.fields)],[h,d,e],h),-1===a.inArray(f,b.header.fields)||"string"!=typeof h&&"number"!=typeof h||-1===(h+"").toLowerCase().indexOf(g))return!1}return!0}):this.data}},f.prototype.onColumnAdvancedSearch=function(b){var c=a.trim(a(b.currentTarget).val()),d=a(b.currentTarget)[0].id;a.isEmptyObject(this.filterColumnsPartial)&&(this.filterColumnsPartial={}),c?this.filterColumnsPartial[d]=c:delete this.filterColumnsPartial[d],this.options.pageNumber=1,this.onSearch(b),this.updatePagination(),this.trigger("column-advanced-search",d,c)}}(jQuery); \ No newline at end of file diff --git a/public/assets/js/html5.js b/public/assets/js/html5.js new file mode 100644 index 0000000000..6168aacd5e --- /dev/null +++ b/public/assets/js/html5.js @@ -0,0 +1,8 @@ +/* + HTML5 Shiv v3.7.0 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +(function(l,f){function m(){var a=e.elements;return"string"==typeof a?a.split(" "):a}function i(a){var b=n[a[o]];b||(b={},h++,a[o]=h,n[h]=b);return b}function p(a,b,c){b||(b=f);if(g)return b.createElement(a);c||(c=i(b));b=c.cache[a]?c.cache[a].cloneNode():r.test(a)?(c.cache[a]=c.createElem(a)).cloneNode():c.createElem(a);return b.canHaveChildren&&!s.test(a)?c.frag.appendChild(b):b}function t(a,b){if(!b.cache)b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag(); +a.createElement=function(c){return!e.shivMethods?b.createElem(c):p(c,a,b)};a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+m().join().replace(/[\w\-]+/g,function(a){b.createElem(a);b.frag.createElement(a);return'c("'+a+'")'})+");return n}")(e,b.frag)}function q(a){a||(a=f);var b=i(a);if(e.shivCSS&&!j&&!b.hasCSS){var c,d=a;c=d.createElement("p");d=d.getElementsByTagName("head")[0]||d.documentElement;c.innerHTML="x"; +c=d.insertBefore(c.lastChild,d.firstChild);b.hasCSS=!!c}g||t(a,b);return a}var k=l.html5||{},s=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,r=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,j,o="_html5shiv",h=0,n={},g;(function(){try{var a=f.createElement("a");a.innerHTML="";j="hidden"in a;var b;if(!(b=1==a.childNodes.length)){f.createElement("a");var c=f.createDocumentFragment();b="undefined"==typeof c.cloneNode|| +"undefined"==typeof c.createDocumentFragment||"undefined"==typeof c.createElement}g=b}catch(d){g=j=!0}})();var e={elements:k.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video",version:"3.7.0",shivCSS:!1!==k.shivCSS,supportsUnknownElements:g,shivMethods:!1!==k.shivMethods,type:"default",shivDocument:q,createElement:p,createDocumentFragment:function(a,b){a||(a=f); +if(g)return a.createDocumentFragment();for(var b=b||i(a),c=b.frag.cloneNode(),d=0,e=m(),h=e.length;d').prop('disabled')); + + // The FileReader API is not actually used, but works as feature detection, + // as some Safari versions (5?) support XHR file uploads via the FormData API, + // but not non-multipart XHR file uploads. + // window.XMLHttpRequestUpload is not available on IE10, so we check for + // window.ProgressEvent instead to detect XHR2 file upload capability: + $.support.xhrFileUpload = !!(window.ProgressEvent && window.FileReader); + $.support.xhrFormDataFileUpload = !!window.FormData; + + // Detect support for Blob slicing (required for chunked uploads): + $.support.blobSlice = window.Blob && (Blob.prototype.slice || + Blob.prototype.webkitSlice || Blob.prototype.mozSlice); + + // Helper function to create drag handlers for dragover/dragenter/dragleave: + function getDragHandler(type) { + var isDragOver = type === 'dragover'; + return function (e) { + e.dataTransfer = e.originalEvent && e.originalEvent.dataTransfer; + var dataTransfer = e.dataTransfer; + if (dataTransfer && $.inArray('Files', dataTransfer.types) !== -1 && + this._trigger( + type, + $.Event(type, {delegatedEvent: e}) + ) !== false) { + e.preventDefault(); + if (isDragOver) { + dataTransfer.dropEffect = 'copy'; + } + } + }; + } + + // The fileupload widget listens for change events on file input fields defined + // via fileInput setting and paste or drop events of the given dropZone. + // In addition to the default jQuery Widget methods, the fileupload widget + // exposes the "add" and "send" methods, to add or directly send files using + // the fileupload API. + // By default, files added via file input selection, paste, drag & drop or + // "add" method are uploaded immediately, but it is possible to override + // the "add" callback option to queue file uploads. + $.widget('blueimp.fileupload', { + + options: { + // The drop target element(s), by the default the complete document. + // Set to null to disable drag & drop support: + dropZone: $(document), + // The paste target element(s), by the default undefined. + // Set to a DOM node or jQuery object to enable file pasting: + pasteZone: undefined, + // The file input field(s), that are listened to for change events. + // If undefined, it is set to the file input fields inside + // of the widget element on plugin initialization. + // Set to null to disable the change listener. + fileInput: undefined, + // By default, the file input field is replaced with a clone after + // each input field change event. This is required for iframe transport + // queues and allows change events to be fired for the same file + // selection, but can be disabled by setting the following option to false: + replaceFileInput: true, + // The parameter name for the file form data (the request argument name). + // If undefined or empty, the name property of the file input field is + // used, or "files[]" if the file input name property is also empty, + // can be a string or an array of strings: + paramName: undefined, + // By default, each file of a selection is uploaded using an individual + // request for XHR type uploads. Set to false to upload file + // selections in one request each: + singleFileUploads: true, + // To limit the number of files uploaded with one XHR request, + // set the following option to an integer greater than 0: + limitMultiFileUploads: undefined, + // The following option limits the number of files uploaded with one + // XHR request to keep the request size under or equal to the defined + // limit in bytes: + limitMultiFileUploadSize: undefined, + // Multipart file uploads add a number of bytes to each uploaded file, + // therefore the following option adds an overhead for each file used + // in the limitMultiFileUploadSize configuration: + limitMultiFileUploadSizeOverhead: 512, + // Set the following option to true to issue all file upload requests + // in a sequential order: + sequentialUploads: false, + // To limit the number of concurrent uploads, + // set the following option to an integer greater than 0: + limitConcurrentUploads: undefined, + // Set the following option to true to force iframe transport uploads: + forceIframeTransport: false, + // Set the following option to the location of a redirect url on the + // origin server, for cross-domain iframe transport uploads: + redirect: undefined, + // The parameter name for the redirect url, sent as part of the form + // data and set to 'redirect' if this option is empty: + redirectParamName: undefined, + // Set the following option to the location of a postMessage window, + // to enable postMessage transport uploads: + postMessage: undefined, + // By default, XHR file uploads are sent as multipart/form-data. + // The iframe transport is always using multipart/form-data. + // Set to false to enable non-multipart XHR uploads: + multipart: true, + // To upload large files in smaller chunks, set the following option + // to a preferred maximum chunk size. If set to 0, null or undefined, + // or the browser does not support the required Blob API, files will + // be uploaded as a whole. + maxChunkSize: undefined, + // When a non-multipart upload or a chunked multipart upload has been + // aborted, this option can be used to resume the upload by setting + // it to the size of the already uploaded bytes. This option is most + // useful when modifying the options object inside of the "add" or + // "send" callbacks, as the options are cloned for each file upload. + uploadedBytes: undefined, + // By default, failed (abort or error) file uploads are removed from the + // global progress calculation. Set the following option to false to + // prevent recalculating the global progress data: + recalculateProgress: true, + // Interval in milliseconds to calculate and trigger progress events: + progressInterval: 100, + // Interval in milliseconds to calculate progress bitrate: + bitrateInterval: 500, + // By default, uploads are started automatically when adding files: + autoUpload: true, + + // Error and info messages: + messages: { + uploadedBytes: 'Uploaded bytes exceed file size' + }, + + // Translation function, gets the message key to be translated + // and an object with context specific data as arguments: + i18n: function (message, context) { + message = this.messages[message] || message.toString(); + if (context) { + $.each(context, function (key, value) { + message = message.replace('{' + key + '}', value); + }); + } + return message; + }, + + // Additional form data to be sent along with the file uploads can be set + // using this option, which accepts an array of objects with name and + // value properties, a function returning such an array, a FormData + // object (for XHR file uploads), or a simple object. + // The form of the first fileInput is given as parameter to the function: + formData: function (form) { + return form.serializeArray(); + }, + + // The add callback is invoked as soon as files are added to the fileupload + // widget (via file input selection, drag & drop, paste or add API call). + // If the singleFileUploads option is enabled, this callback will be + // called once for each file in the selection for XHR file uploads, else + // once for each file selection. + // + // The upload starts when the submit method is invoked on the data parameter. + // The data object contains a files property holding the added files + // and allows you to override plugin options as well as define ajax settings. + // + // Listeners for this callback can also be bound the following way: + // .bind('fileuploadadd', func); + // + // data.submit() returns a Promise object and allows to attach additional + // handlers using jQuery's Deferred callbacks: + // data.submit().done(func).fail(func).always(func); + add: function (e, data) { + if (e.isDefaultPrevented()) { + return false; + } + if (data.autoUpload || (data.autoUpload !== false && + $(this).fileupload('option', 'autoUpload'))) { + data.process().done(function () { + data.submit(); + }); + } + }, + + // Other callbacks: + + // Callback for the submit event of each file upload: + // submit: function (e, data) {}, // .bind('fileuploadsubmit', func); + + // Callback for the start of each file upload request: + // send: function (e, data) {}, // .bind('fileuploadsend', func); + + // Callback for successful uploads: + // done: function (e, data) {}, // .bind('fileuploaddone', func); + + // Callback for failed (abort or error) uploads: + // fail: function (e, data) {}, // .bind('fileuploadfail', func); + + // Callback for completed (success, abort or error) requests: + // always: function (e, data) {}, // .bind('fileuploadalways', func); + + // Callback for upload progress events: + // progress: function (e, data) {}, // .bind('fileuploadprogress', func); + + // Callback for global upload progress events: + // progressall: function (e, data) {}, // .bind('fileuploadprogressall', func); + + // Callback for uploads start, equivalent to the global ajaxStart event: + // start: function (e) {}, // .bind('fileuploadstart', func); + + // Callback for uploads stop, equivalent to the global ajaxStop event: + // stop: function (e) {}, // .bind('fileuploadstop', func); + + // Callback for change events of the fileInput(s): + // change: function (e, data) {}, // .bind('fileuploadchange', func); + + // Callback for paste events to the pasteZone(s): + // paste: function (e, data) {}, // .bind('fileuploadpaste', func); + + // Callback for drop events of the dropZone(s): + // drop: function (e, data) {}, // .bind('fileuploaddrop', func); + + // Callback for dragover events of the dropZone(s): + // dragover: function (e) {}, // .bind('fileuploaddragover', func); + + // Callback for the start of each chunk upload request: + // chunksend: function (e, data) {}, // .bind('fileuploadchunksend', func); + + // Callback for successful chunk uploads: + // chunkdone: function (e, data) {}, // .bind('fileuploadchunkdone', func); + + // Callback for failed (abort or error) chunk uploads: + // chunkfail: function (e, data) {}, // .bind('fileuploadchunkfail', func); + + // Callback for completed (success, abort or error) chunk upload requests: + // chunkalways: function (e, data) {}, // .bind('fileuploadchunkalways', func); + + // The plugin options are used as settings object for the ajax calls. + // The following are jQuery ajax settings required for the file uploads: + processData: false, + contentType: false, + cache: false, + timeout: 0 + }, + + // A list of options that require reinitializing event listeners and/or + // special initialization code: + _specialOptions: [ + 'fileInput', + 'dropZone', + 'pasteZone', + 'multipart', + 'forceIframeTransport' + ], + + _blobSlice: $.support.blobSlice && function () { + var slice = this.slice || this.webkitSlice || this.mozSlice; + return slice.apply(this, arguments); + }, + + _BitrateTimer: function () { + this.timestamp = ((Date.now) ? Date.now() : (new Date()).getTime()); + this.loaded = 0; + this.bitrate = 0; + this.getBitrate = function (now, loaded, interval) { + var timeDiff = now - this.timestamp; + if (!this.bitrate || !interval || timeDiff > interval) { + this.bitrate = (loaded - this.loaded) * (1000 / timeDiff) * 8; + this.loaded = loaded; + this.timestamp = now; + } + return this.bitrate; + }; + }, + + _isXHRUpload: function (options) { + return !options.forceIframeTransport && + ((!options.multipart && $.support.xhrFileUpload) || + $.support.xhrFormDataFileUpload); + }, + + _getFormData: function (options) { + var formData; + if ($.type(options.formData) === 'function') { + return options.formData(options.form); + } + if ($.isArray(options.formData)) { + return options.formData; + } + if ($.type(options.formData) === 'object') { + formData = []; + $.each(options.formData, function (name, value) { + formData.push({name: name, value: value}); + }); + return formData; + } + return []; + }, + + _getTotal: function (files) { + var total = 0; + $.each(files, function (index, file) { + total += file.size || 1; + }); + return total; + }, + + _initProgressObject: function (obj) { + var progress = { + loaded: 0, + total: 0, + bitrate: 0 + }; + if (obj._progress) { + $.extend(obj._progress, progress); + } else { + obj._progress = progress; + } + }, + + _initResponseObject: function (obj) { + var prop; + if (obj._response) { + for (prop in obj._response) { + if (obj._response.hasOwnProperty(prop)) { + delete obj._response[prop]; + } + } + } else { + obj._response = {}; + } + }, + + _onProgress: function (e, data) { + if (e.lengthComputable) { + var now = ((Date.now) ? Date.now() : (new Date()).getTime()), + loaded; + if (data._time && data.progressInterval && + (now - data._time < data.progressInterval) && + e.loaded !== e.total) { + return; + } + data._time = now; + loaded = Math.floor( + e.loaded / e.total * (data.chunkSize || data._progress.total) + ) + (data.uploadedBytes || 0); + // Add the difference from the previously loaded state + // to the global loaded counter: + this._progress.loaded += (loaded - data._progress.loaded); + this._progress.bitrate = this._bitrateTimer.getBitrate( + now, + this._progress.loaded, + data.bitrateInterval + ); + data._progress.loaded = data.loaded = loaded; + data._progress.bitrate = data.bitrate = data._bitrateTimer.getBitrate( + now, + loaded, + data.bitrateInterval + ); + // Trigger a custom progress event with a total data property set + // to the file size(s) of the current upload and a loaded data + // property calculated accordingly: + this._trigger( + 'progress', + $.Event('progress', {delegatedEvent: e}), + data + ); + // Trigger a global progress event for all current file uploads, + // including ajax calls queued for sequential file uploads: + this._trigger( + 'progressall', + $.Event('progressall', {delegatedEvent: e}), + this._progress + ); + } + }, + + _initProgressListener: function (options) { + var that = this, + xhr = options.xhr ? options.xhr() : $.ajaxSettings.xhr(); + // Accesss to the native XHR object is required to add event listeners + // for the upload progress event: + if (xhr.upload) { + $(xhr.upload).bind('progress', function (e) { + var oe = e.originalEvent; + // Make sure the progress event properties get copied over: + e.lengthComputable = oe.lengthComputable; + e.loaded = oe.loaded; + e.total = oe.total; + that._onProgress(e, options); + }); + options.xhr = function () { + return xhr; + }; + } + }, + + _isInstanceOf: function (type, obj) { + // Cross-frame instanceof check + return Object.prototype.toString.call(obj) === '[object ' + type + ']'; + }, + + _initXHRData: function (options) { + var that = this, + formData, + file = options.files[0], + // Ignore non-multipart setting if not supported: + multipart = options.multipart || !$.support.xhrFileUpload, + paramName = $.type(options.paramName) === 'array' ? + options.paramName[0] : options.paramName; + options.headers = $.extend({}, options.headers); + if (options.contentRange) { + options.headers['Content-Range'] = options.contentRange; + } + if (!multipart || options.blob || !this._isInstanceOf('File', file)) { + options.headers['Content-Disposition'] = 'attachment; filename="' + + encodeURI(file.name) + '"'; + } + if (!multipart) { + options.contentType = file.type || 'application/octet-stream'; + options.data = options.blob || file; + } else if ($.support.xhrFormDataFileUpload) { + if (options.postMessage) { + // window.postMessage does not allow sending FormData + // objects, so we just add the File/Blob objects to + // the formData array and let the postMessage window + // create the FormData object out of this array: + formData = this._getFormData(options); + if (options.blob) { + formData.push({ + name: paramName, + value: options.blob + }); + } else { + $.each(options.files, function (index, file) { + formData.push({ + name: ($.type(options.paramName) === 'array' && + options.paramName[index]) || paramName, + value: file + }); + }); + } + } else { + if (that._isInstanceOf('FormData', options.formData)) { + formData = options.formData; + } else { + formData = new FormData(); + $.each(this._getFormData(options), function (index, field) { + formData.append(field.name, field.value); + }); + } + if (options.blob) { + formData.append(paramName, options.blob, file.name); + } else { + $.each(options.files, function (index, file) { + // This check allows the tests to run with + // dummy objects: + if (that._isInstanceOf('File', file) || + that._isInstanceOf('Blob', file)) { + formData.append( + ($.type(options.paramName) === 'array' && + options.paramName[index]) || paramName, + file, + file.uploadName || file.name + ); + } + }); + } + } + options.data = formData; + } + // Blob reference is not needed anymore, free memory: + options.blob = null; + }, + + _initIframeSettings: function (options) { + var targetHost = $('').prop('href', options.url).prop('host'); + // Setting the dataType to iframe enables the iframe transport: + options.dataType = 'iframe ' + (options.dataType || ''); + // The iframe transport accepts a serialized array as form data: + options.formData = this._getFormData(options); + // Add redirect url to form data on cross-domain uploads: + if (options.redirect && targetHost && targetHost !== location.host) { + options.formData.push({ + name: options.redirectParamName || 'redirect', + value: options.redirect + }); + } + }, + + _initDataSettings: function (options) { + if (this._isXHRUpload(options)) { + if (!this._chunkedUpload(options, true)) { + if (!options.data) { + this._initXHRData(options); + } + this._initProgressListener(options); + } + if (options.postMessage) { + // Setting the dataType to postmessage enables the + // postMessage transport: + options.dataType = 'postmessage ' + (options.dataType || ''); + } + } else { + this._initIframeSettings(options); + } + }, + + _getParamName: function (options) { + var fileInput = $(options.fileInput), + paramName = options.paramName; + if (!paramName) { + paramName = []; + fileInput.each(function () { + var input = $(this), + name = input.prop('name') || 'files[]', + i = (input.prop('files') || [1]).length; + while (i) { + paramName.push(name); + i -= 1; + } + }); + if (!paramName.length) { + paramName = [fileInput.prop('name') || 'files[]']; + } + } else if (!$.isArray(paramName)) { + paramName = [paramName]; + } + return paramName; + }, + + _initFormSettings: function (options) { + // Retrieve missing options from the input field and the + // associated form, if available: + if (!options.form || !options.form.length) { + options.form = $(options.fileInput.prop('form')); + // If the given file input doesn't have an associated form, + // use the default widget file input's form: + if (!options.form.length) { + options.form = $(this.options.fileInput.prop('form')); + } + } + options.paramName = this._getParamName(options); + if (!options.url) { + options.url = options.form.prop('action') || location.href; + } + // The HTTP request method must be "POST" or "PUT": + options.type = (options.type || + ($.type(options.form.prop('method')) === 'string' && + options.form.prop('method')) || '' + ).toUpperCase(); + if (options.type !== 'POST' && options.type !== 'PUT' && + options.type !== 'PATCH') { + options.type = 'POST'; + } + if (!options.formAcceptCharset) { + options.formAcceptCharset = options.form.attr('accept-charset'); + } + }, + + _getAJAXSettings: function (data) { + var options = $.extend({}, this.options, data); + this._initFormSettings(options); + this._initDataSettings(options); + return options; + }, + + // jQuery 1.6 doesn't provide .state(), + // while jQuery 1.8+ removed .isRejected() and .isResolved(): + _getDeferredState: function (deferred) { + if (deferred.state) { + return deferred.state(); + } + if (deferred.isResolved()) { + return 'resolved'; + } + if (deferred.isRejected()) { + return 'rejected'; + } + return 'pending'; + }, + + // Maps jqXHR callbacks to the equivalent + // methods of the given Promise object: + _enhancePromise: function (promise) { + promise.success = promise.done; + promise.error = promise.fail; + promise.complete = promise.always; + return promise; + }, + + // Creates and returns a Promise object enhanced with + // the jqXHR methods abort, success, error and complete: + _getXHRPromise: function (resolveOrReject, context, args) { + var dfd = $.Deferred(), + promise = dfd.promise(); + context = context || this.options.context || promise; + if (resolveOrReject === true) { + dfd.resolveWith(context, args); + } else if (resolveOrReject === false) { + dfd.rejectWith(context, args); + } + promise.abort = dfd.promise; + return this._enhancePromise(promise); + }, + + // Adds convenience methods to the data callback argument: + _addConvenienceMethods: function (e, data) { + var that = this, + getPromise = function (args) { + return $.Deferred().resolveWith(that, args).promise(); + }; + data.process = function (resolveFunc, rejectFunc) { + if (resolveFunc || rejectFunc) { + data._processQueue = this._processQueue = + (this._processQueue || getPromise([this])).pipe( + function () { + if (data.errorThrown) { + return $.Deferred() + .rejectWith(that, [data]).promise(); + } + return getPromise(arguments); + } + ).pipe(resolveFunc, rejectFunc); + } + return this._processQueue || getPromise([this]); + }; + data.submit = function () { + if (this.state() !== 'pending') { + data.jqXHR = this.jqXHR = + (that._trigger( + 'submit', + $.Event('submit', {delegatedEvent: e}), + this + ) !== false) && that._onSend(e, this); + } + return this.jqXHR || that._getXHRPromise(); + }; + data.abort = function () { + if (this.jqXHR) { + return this.jqXHR.abort(); + } + this.errorThrown = 'abort'; + that._trigger('fail', null, this); + return that._getXHRPromise(false); + }; + data.state = function () { + if (this.jqXHR) { + return that._getDeferredState(this.jqXHR); + } + if (this._processQueue) { + return that._getDeferredState(this._processQueue); + } + }; + data.processing = function () { + return !this.jqXHR && this._processQueue && that + ._getDeferredState(this._processQueue) === 'pending'; + }; + data.progress = function () { + return this._progress; + }; + data.response = function () { + return this._response; + }; + }, + + // Parses the Range header from the server response + // and returns the uploaded bytes: + _getUploadedBytes: function (jqXHR) { + var range = jqXHR.getResponseHeader('Range'), + parts = range && range.split('-'), + upperBytesPos = parts && parts.length > 1 && + parseInt(parts[1], 10); + return upperBytesPos && upperBytesPos + 1; + }, + + // Uploads a file in multiple, sequential requests + // by splitting the file up in multiple blob chunks. + // If the second parameter is true, only tests if the file + // should be uploaded in chunks, but does not invoke any + // upload requests: + _chunkedUpload: function (options, testOnly) { + options.uploadedBytes = options.uploadedBytes || 0; + var that = this, + file = options.files[0], + fs = file.size, + ub = options.uploadedBytes, + mcs = options.maxChunkSize || fs, + slice = this._blobSlice, + dfd = $.Deferred(), + promise = dfd.promise(), + jqXHR, + upload; + if (!(this._isXHRUpload(options) && slice && (ub || mcs < fs)) || + options.data) { + return false; + } + if (testOnly) { + return true; + } + if (ub >= fs) { + file.error = options.i18n('uploadedBytes'); + return this._getXHRPromise( + false, + options.context, + [null, 'error', file.error] + ); + } + // The chunk upload method: + upload = function () { + // Clone the options object for each chunk upload: + var o = $.extend({}, options), + currentLoaded = o._progress.loaded; + o.blob = slice.call( + file, + ub, + ub + mcs, + file.type + ); + // Store the current chunk size, as the blob itself + // will be dereferenced after data processing: + o.chunkSize = o.blob.size; + // Expose the chunk bytes position range: + o.contentRange = 'bytes ' + ub + '-' + + (ub + o.chunkSize - 1) + '/' + fs; + // Process the upload data (the blob and potential form data): + that._initXHRData(o); + // Add progress listeners for this chunk upload: + that._initProgressListener(o); + jqXHR = ((that._trigger('chunksend', null, o) !== false && $.ajax(o)) || + that._getXHRPromise(false, o.context)) + .done(function (result, textStatus, jqXHR) { + ub = that._getUploadedBytes(jqXHR) || + (ub + o.chunkSize); + // Create a progress event if no final progress event + // with loaded equaling total has been triggered + // for this chunk: + if (currentLoaded + o.chunkSize - o._progress.loaded) { + that._onProgress($.Event('progress', { + lengthComputable: true, + loaded: ub - o.uploadedBytes, + total: ub - o.uploadedBytes + }), o); + } + options.uploadedBytes = o.uploadedBytes = ub; + o.result = result; + o.textStatus = textStatus; + o.jqXHR = jqXHR; + that._trigger('chunkdone', null, o); + that._trigger('chunkalways', null, o); + if (ub < fs) { + // File upload not yet complete, + // continue with the next chunk: + upload(); + } else { + dfd.resolveWith( + o.context, + [result, textStatus, jqXHR] + ); + } + }) + .fail(function (jqXHR, textStatus, errorThrown) { + o.jqXHR = jqXHR; + o.textStatus = textStatus; + o.errorThrown = errorThrown; + that._trigger('chunkfail', null, o); + that._trigger('chunkalways', null, o); + dfd.rejectWith( + o.context, + [jqXHR, textStatus, errorThrown] + ); + }); + }; + this._enhancePromise(promise); + promise.abort = function () { + return jqXHR.abort(); + }; + upload(); + return promise; + }, + + _beforeSend: function (e, data) { + if (this._active === 0) { + // the start callback is triggered when an upload starts + // and no other uploads are currently running, + // equivalent to the global ajaxStart event: + this._trigger('start'); + // Set timer for global bitrate progress calculation: + this._bitrateTimer = new this._BitrateTimer(); + // Reset the global progress values: + this._progress.loaded = this._progress.total = 0; + this._progress.bitrate = 0; + } + // Make sure the container objects for the .response() and + // .progress() methods on the data object are available + // and reset to their initial state: + this._initResponseObject(data); + this._initProgressObject(data); + data._progress.loaded = data.loaded = data.uploadedBytes || 0; + data._progress.total = data.total = this._getTotal(data.files) || 1; + data._progress.bitrate = data.bitrate = 0; + this._active += 1; + // Initialize the global progress values: + this._progress.loaded += data.loaded; + this._progress.total += data.total; + }, + + _onDone: function (result, textStatus, jqXHR, options) { + var total = options._progress.total, + response = options._response; + if (options._progress.loaded < total) { + // Create a progress event if no final progress event + // with loaded equaling total has been triggered: + this._onProgress($.Event('progress', { + lengthComputable: true, + loaded: total, + total: total + }), options); + } + response.result = options.result = result; + response.textStatus = options.textStatus = textStatus; + response.jqXHR = options.jqXHR = jqXHR; + this._trigger('done', null, options); + }, + + _onFail: function (jqXHR, textStatus, errorThrown, options) { + var response = options._response; + if (options.recalculateProgress) { + // Remove the failed (error or abort) file upload from + // the global progress calculation: + this._progress.loaded -= options._progress.loaded; + this._progress.total -= options._progress.total; + } + response.jqXHR = options.jqXHR = jqXHR; + response.textStatus = options.textStatus = textStatus; + response.errorThrown = options.errorThrown = errorThrown; + this._trigger('fail', null, options); + }, + + _onAlways: function (jqXHRorResult, textStatus, jqXHRorError, options) { + // jqXHRorResult, textStatus and jqXHRorError are added to the + // options object via done and fail callbacks + this._trigger('always', null, options); + }, + + _onSend: function (e, data) { + if (!data.submit) { + this._addConvenienceMethods(e, data); + } + var that = this, + jqXHR, + aborted, + slot, + pipe, + options = that._getAJAXSettings(data), + send = function () { + that._sending += 1; + // Set timer for bitrate progress calculation: + options._bitrateTimer = new that._BitrateTimer(); + jqXHR = jqXHR || ( + ((aborted || that._trigger( + 'send', + $.Event('send', {delegatedEvent: e}), + options + ) === false) && + that._getXHRPromise(false, options.context, aborted)) || + that._chunkedUpload(options) || $.ajax(options) + ).done(function (result, textStatus, jqXHR) { + that._onDone(result, textStatus, jqXHR, options); + }).fail(function (jqXHR, textStatus, errorThrown) { + that._onFail(jqXHR, textStatus, errorThrown, options); + }).always(function (jqXHRorResult, textStatus, jqXHRorError) { + that._onAlways( + jqXHRorResult, + textStatus, + jqXHRorError, + options + ); + that._sending -= 1; + that._active -= 1; + if (options.limitConcurrentUploads && + options.limitConcurrentUploads > that._sending) { + // Start the next queued upload, + // that has not been aborted: + var nextSlot = that._slots.shift(); + while (nextSlot) { + if (that._getDeferredState(nextSlot) === 'pending') { + nextSlot.resolve(); + break; + } + nextSlot = that._slots.shift(); + } + } + if (that._active === 0) { + // The stop callback is triggered when all uploads have + // been completed, equivalent to the global ajaxStop event: + that._trigger('stop'); + } + }); + return jqXHR; + }; + this._beforeSend(e, options); + if (this.options.sequentialUploads || + (this.options.limitConcurrentUploads && + this.options.limitConcurrentUploads <= this._sending)) { + if (this.options.limitConcurrentUploads > 1) { + slot = $.Deferred(); + this._slots.push(slot); + pipe = slot.pipe(send); + } else { + this._sequence = this._sequence.pipe(send, send); + pipe = this._sequence; + } + // Return the piped Promise object, enhanced with an abort method, + // which is delegated to the jqXHR object of the current upload, + // and jqXHR callbacks mapped to the equivalent Promise methods: + pipe.abort = function () { + aborted = [undefined, 'abort', 'abort']; + if (!jqXHR) { + if (slot) { + slot.rejectWith(options.context, aborted); + } + return send(); + } + return jqXHR.abort(); + }; + return this._enhancePromise(pipe); + } + return send(); + }, + + _onAdd: function (e, data) { + var that = this, + result = true, + options = $.extend({}, this.options, data), + files = data.files, + filesLength = files.length, + limit = options.limitMultiFileUploads, + limitSize = options.limitMultiFileUploadSize, + overhead = options.limitMultiFileUploadSizeOverhead, + batchSize = 0, + paramName = this._getParamName(options), + paramNameSet, + paramNameSlice, + fileSet, + i, + j = 0; + if (!filesLength) { + return false; + } + if (limitSize && files[0].size === undefined) { + limitSize = undefined; + } + if (!(options.singleFileUploads || limit || limitSize) || + !this._isXHRUpload(options)) { + fileSet = [files]; + paramNameSet = [paramName]; + } else if (!(options.singleFileUploads || limitSize) && limit) { + fileSet = []; + paramNameSet = []; + for (i = 0; i < filesLength; i += limit) { + fileSet.push(files.slice(i, i + limit)); + paramNameSlice = paramName.slice(i, i + limit); + if (!paramNameSlice.length) { + paramNameSlice = paramName; + } + paramNameSet.push(paramNameSlice); + } + } else if (!options.singleFileUploads && limitSize) { + fileSet = []; + paramNameSet = []; + for (i = 0; i < filesLength; i = i + 1) { + batchSize += files[i].size + overhead; + if (i + 1 === filesLength || + ((batchSize + files[i + 1].size + overhead) > limitSize) || + (limit && i + 1 - j >= limit)) { + fileSet.push(files.slice(j, i + 1)); + paramNameSlice = paramName.slice(j, i + 1); + if (!paramNameSlice.length) { + paramNameSlice = paramName; + } + paramNameSet.push(paramNameSlice); + j = i + 1; + batchSize = 0; + } + } + } else { + paramNameSet = paramName; + } + data.originalFiles = files; + $.each(fileSet || files, function (index, element) { + var newData = $.extend({}, data); + newData.files = fileSet ? element : [element]; + newData.paramName = paramNameSet[index]; + that._initResponseObject(newData); + that._initProgressObject(newData); + that._addConvenienceMethods(e, newData); + result = that._trigger( + 'add', + $.Event('add', {delegatedEvent: e}), + newData + ); + return result; + }); + return result; + }, + + _replaceFileInput: function (data) { + var input = data.fileInput, + inputClone = input.clone(true); + // Add a reference for the new cloned file input to the data argument: + data.fileInputClone = inputClone; + $('
    ').append(inputClone)[0].reset(); + // Detaching allows to insert the fileInput on another form + // without loosing the file input value: + input.after(inputClone).detach(); + // Avoid memory leaks with the detached file input: + $.cleanData(input.unbind('remove')); + // Replace the original file input element in the fileInput + // elements set with the clone, which has been copied including + // event handlers: + this.options.fileInput = this.options.fileInput.map(function (i, el) { + if (el === input[0]) { + return inputClone[0]; + } + return el; + }); + // If the widget has been initialized on the file input itself, + // override this.element with the file input clone: + if (input[0] === this.element[0]) { + this.element = inputClone; + } + }, + + _handleFileTreeEntry: function (entry, path) { + var that = this, + dfd = $.Deferred(), + errorHandler = function (e) { + if (e && !e.entry) { + e.entry = entry; + } + // Since $.when returns immediately if one + // Deferred is rejected, we use resolve instead. + // This allows valid files and invalid items + // to be returned together in one set: + dfd.resolve([e]); + }, + successHandler = function (entries) { + that._handleFileTreeEntries( + entries, + path + entry.name + '/' + ).done(function (files) { + dfd.resolve(files); + }).fail(errorHandler); + }, + readEntries = function () { + dirReader.readEntries(function (results) { + if (!results.length) { + successHandler(entries); + } else { + entries = entries.concat(results); + readEntries(); + } + }, errorHandler); + }, + dirReader, entries = []; + path = path || ''; + if (entry.isFile) { + if (entry._file) { + // Workaround for Chrome bug #149735 + entry._file.relativePath = path; + dfd.resolve(entry._file); + } else { + entry.file(function (file) { + file.relativePath = path; + dfd.resolve(file); + }, errorHandler); + } + } else if (entry.isDirectory) { + dirReader = entry.createReader(); + readEntries(); + } else { + // Return an empy list for file system items + // other than files or directories: + dfd.resolve([]); + } + return dfd.promise(); + }, + + _handleFileTreeEntries: function (entries, path) { + var that = this; + return $.when.apply( + $, + $.map(entries, function (entry) { + return that._handleFileTreeEntry(entry, path); + }) + ).pipe(function () { + return Array.prototype.concat.apply( + [], + arguments + ); + }); + }, + + _getDroppedFiles: function (dataTransfer) { + dataTransfer = dataTransfer || {}; + var items = dataTransfer.items; + if (items && items.length && (items[0].webkitGetAsEntry || + items[0].getAsEntry)) { + return this._handleFileTreeEntries( + $.map(items, function (item) { + var entry; + if (item.webkitGetAsEntry) { + entry = item.webkitGetAsEntry(); + if (entry) { + // Workaround for Chrome bug #149735: + entry._file = item.getAsFile(); + } + return entry; + } + return item.getAsEntry(); + }) + ); + } + return $.Deferred().resolve( + $.makeArray(dataTransfer.files) + ).promise(); + }, + + _getSingleFileInputFiles: function (fileInput) { + fileInput = $(fileInput); + var entries = fileInput.prop('webkitEntries') || + fileInput.prop('entries'), + files, + value; + if (entries && entries.length) { + return this._handleFileTreeEntries(entries); + } + files = $.makeArray(fileInput.prop('files')); + if (!files.length) { + value = fileInput.prop('value'); + if (!value) { + return $.Deferred().resolve([]).promise(); + } + // If the files property is not available, the browser does not + // support the File API and we add a pseudo File object with + // the input value as name with path information removed: + files = [{name: value.replace(/^.*\\/, '')}]; + } else if (files[0].name === undefined && files[0].fileName) { + // File normalization for Safari 4 and Firefox 3: + $.each(files, function (index, file) { + file.name = file.fileName; + file.size = file.fileSize; + }); + } + return $.Deferred().resolve(files).promise(); + }, + + _getFileInputFiles: function (fileInput) { + if (!(fileInput instanceof $) || fileInput.length === 1) { + return this._getSingleFileInputFiles(fileInput); + } + return $.when.apply( + $, + $.map(fileInput, this._getSingleFileInputFiles) + ).pipe(function () { + return Array.prototype.concat.apply( + [], + arguments + ); + }); + }, + + _onChange: function (e) { + var that = this, + data = { + fileInput: $(e.target), + form: $(e.target.form) + }; + this._getFileInputFiles(data.fileInput).always(function (files) { + data.files = files; + if (that.options.replaceFileInput) { + that._replaceFileInput(data); + } + if (that._trigger( + 'change', + $.Event('change', {delegatedEvent: e}), + data + ) !== false) { + that._onAdd(e, data); + } + }); + }, + + _onPaste: function (e) { + var items = e.originalEvent && e.originalEvent.clipboardData && + e.originalEvent.clipboardData.items, + data = {files: []}; + if (items && items.length) { + $.each(items, function (index, item) { + var file = item.getAsFile && item.getAsFile(); + if (file) { + data.files.push(file); + } + }); + if (this._trigger( + 'paste', + $.Event('paste', {delegatedEvent: e}), + data + ) !== false) { + this._onAdd(e, data); + } + } + }, + + _onDrop: function (e) { + e.dataTransfer = e.originalEvent && e.originalEvent.dataTransfer; + var that = this, + dataTransfer = e.dataTransfer, + data = {}; + if (dataTransfer && dataTransfer.files && dataTransfer.files.length) { + e.preventDefault(); + this._getDroppedFiles(dataTransfer).always(function (files) { + data.files = files; + if (that._trigger( + 'drop', + $.Event('drop', {delegatedEvent: e}), + data + ) !== false) { + that._onAdd(e, data); + } + }); + } + }, + + _onDragOver: getDragHandler('dragover'), + + _onDragEnter: getDragHandler('dragenter'), + + _onDragLeave: getDragHandler('dragleave'), + + _initEventHandlers: function () { + if (this._isXHRUpload(this.options)) { + this._on(this.options.dropZone, { + dragover: this._onDragOver, + drop: this._onDrop, + // event.preventDefault() on dragenter is required for IE10+: + dragenter: this._onDragEnter, + // dragleave is not required, but added for completeness: + dragleave: this._onDragLeave + }); + this._on(this.options.pasteZone, { + paste: this._onPaste + }); + } + if ($.support.fileInput) { + this._on(this.options.fileInput, { + change: this._onChange + }); + } + }, + + _destroyEventHandlers: function () { + this._off(this.options.dropZone, 'dragenter dragleave dragover drop'); + this._off(this.options.pasteZone, 'paste'); + this._off(this.options.fileInput, 'change'); + }, + + _setOption: function (key, value) { + var reinit = $.inArray(key, this._specialOptions) !== -1; + if (reinit) { + this._destroyEventHandlers(); + } + this._super(key, value); + if (reinit) { + this._initSpecialOptions(); + this._initEventHandlers(); + } + }, + + _initSpecialOptions: function () { + var options = this.options; + if (options.fileInput === undefined) { + options.fileInput = this.element.is('input[type="file"]') ? + this.element : this.element.find('input[type="file"]'); + } else if (!(options.fileInput instanceof $)) { + options.fileInput = $(options.fileInput); + } + if (!(options.dropZone instanceof $)) { + options.dropZone = $(options.dropZone); + } + if (!(options.pasteZone instanceof $)) { + options.pasteZone = $(options.pasteZone); + } + }, + + _getRegExp: function (str) { + var parts = str.split('/'), + modifiers = parts.pop(); + parts.shift(); + return new RegExp(parts.join('/'), modifiers); + }, + + _isRegExpOption: function (key, value) { + return key !== 'url' && $.type(value) === 'string' && + /^\/.*\/[igm]{0,3}$/.test(value); + }, + + _initDataAttributes: function () { + var that = this, + options = this.options, + data = this.element.data(); + // Initialize options set via HTML5 data-attributes: + $.each( + this.element[0].attributes, + function (index, attr) { + var key = attr.name.toLowerCase(), + value; + if (/^data-/.test(key)) { + // Convert hyphen-ated key to camelCase: + key = key.slice(5).replace(/-[a-z]/g, function (str) { + return str.charAt(1).toUpperCase(); + }); + value = data[key]; + if (that._isRegExpOption(key, value)) { + value = that._getRegExp(value); + } + options[key] = value; + } + } + ); + }, + + _create: function () { + this._initDataAttributes(); + this._initSpecialOptions(); + this._slots = []; + this._sequence = this._getXHRPromise(true); + this._sending = this._active = 0; + this._initProgressObject(this); + this._initEventHandlers(); + }, + + // This method is exposed to the widget API and allows to query + // the number of active uploads: + active: function () { + return this._active; + }, + + // This method is exposed to the widget API and allows to query + // the widget upload progress. + // It returns an object with loaded, total and bitrate properties + // for the running uploads: + progress: function () { + return this._progress; + }, + + // This method is exposed to the widget API and allows adding files + // using the fileupload API. The data parameter accepts an object which + // must have a files property and can contain additional options: + // .fileupload('add', {files: filesList}); + add: function (data) { + var that = this; + if (!data || this.options.disabled) { + return; + } + if (data.fileInput && !data.files) { + this._getFileInputFiles(data.fileInput).always(function (files) { + data.files = files; + that._onAdd(null, data); + }); + } else { + data.files = $.makeArray(data.files); + this._onAdd(null, data); + } + }, + + // This method is exposed to the widget API and allows sending files + // using the fileupload API. The data parameter accepts an object which + // must have a files or fileInput property and can contain additional options: + // .fileupload('send', {files: filesList}); + // The method returns a Promise object for the file upload call. + send: function (data) { + if (data && !this.options.disabled) { + if (data.fileInput && !data.files) { + var that = this, + dfd = $.Deferred(), + promise = dfd.promise(), + jqXHR, + aborted; + promise.abort = function () { + aborted = true; + if (jqXHR) { + return jqXHR.abort(); + } + dfd.reject(null, 'abort', 'abort'); + return promise; + }; + this._getFileInputFiles(data.fileInput).always( + function (files) { + if (aborted) { + return; + } + if (!files.length) { + dfd.reject(); + return; + } + data.files = files; + jqXHR = that._onSend(null, data); + jqXHR.then( + function (result, textStatus, jqXHR) { + dfd.resolve(result, textStatus, jqXHR); + }, + function (jqXHR, textStatus, errorThrown) { + dfd.reject(jqXHR, textStatus, errorThrown); + } + ); + } + ); + return this._enhancePromise(promise); + } + data.files = $.makeArray(data.files); + if (data.files.length) { + return this._onSend(null, data); + } + } + return this._getXHRPromise(false, data && data.context); + } + + }); + +})); diff --git a/public/assets/js/jquery.iframe-transport.js b/public/assets/js/jquery.iframe-transport.js new file mode 100755 index 0000000000..b7581f23f4 --- /dev/null +++ b/public/assets/js/jquery.iframe-transport.js @@ -0,0 +1,217 @@ +/* + * jQuery Iframe Transport Plugin 1.8.3 + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2011, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ + +/* global define, require, window, document */ + +(function (factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define(['jquery'], factory); + } else if (typeof exports === 'object') { + // Node/CommonJS: + factory(require('jquery')); + } else { + // Browser globals: + factory(window.jQuery); + } +}(function ($) { + 'use strict'; + + // Helper variable to create unique names for the transport iframes: + var counter = 0; + + // The iframe transport accepts four additional options: + // options.fileInput: a jQuery collection of file input fields + // options.paramName: the parameter name for the file form data, + // overrides the name property of the file input field(s), + // can be a string or an array of strings. + // options.formData: an array of objects with name and value properties, + // equivalent to the return data of .serializeArray(), e.g.: + // [{name: 'a', value: 1}, {name: 'b', value: 2}] + // options.initialIframeSrc: the URL of the initial iframe src, + // by default set to "javascript:false;" + $.ajaxTransport('iframe', function (options) { + if (options.async) { + // javascript:false as initial iframe src + // prevents warning popups on HTTPS in IE6: + /*jshint scripturl: true */ + var initialIframeSrc = options.initialIframeSrc || 'javascript:false;', + /*jshint scripturl: false */ + form, + iframe, + addParamChar; + return { + send: function (_, completeCallback) { + form = $('
    '); + form.attr('accept-charset', options.formAcceptCharset); + addParamChar = /\?/.test(options.url) ? '&' : '?'; + // XDomainRequest only supports GET and POST: + if (options.type === 'DELETE') { + options.url = options.url + addParamChar + '_method=DELETE'; + options.type = 'POST'; + } else if (options.type === 'PUT') { + options.url = options.url + addParamChar + '_method=PUT'; + options.type = 'POST'; + } else if (options.type === 'PATCH') { + options.url = options.url + addParamChar + '_method=PATCH'; + options.type = 'POST'; + } + // IE versions below IE8 cannot set the name property of + // elements that have already been added to the DOM, + // so we set the name along with the iframe HTML markup: + counter += 1; + iframe = $( + '' + ).bind('load', function () { + var fileInputClones, + paramNames = $.isArray(options.paramName) ? + options.paramName : [options.paramName]; + iframe + .unbind('load') + .bind('load', function () { + var response; + // Wrap in a try/catch block to catch exceptions thrown + // when trying to access cross-domain iframe contents: + try { + response = iframe.contents(); + // Google Chrome and Firefox do not throw an + // exception when calling iframe.contents() on + // cross-domain requests, so we unify the response: + if (!response.length || !response[0].firstChild) { + throw new Error(); + } + } catch (e) { + response = undefined; + } + // The complete callback returns the + // iframe content document as response object: + completeCallback( + 200, + 'success', + {'iframe': response} + ); + // Fix for IE endless progress bar activity bug + // (happens on form submits to iframe targets): + $('') + .appendTo(form); + window.setTimeout(function () { + // Removing the form in a setTimeout call + // allows Chrome's developer tools to display + // the response result + form.remove(); + }, 0); + }); + form + .prop('target', iframe.prop('name')) + .prop('action', options.url) + .prop('method', options.type); + if (options.formData) { + $.each(options.formData, function (index, field) { + $('') + .prop('name', field.name) + .val(field.value) + .appendTo(form); + }); + } + if (options.fileInput && options.fileInput.length && + options.type === 'POST') { + fileInputClones = options.fileInput.clone(); + // Insert a clone for each file input field: + options.fileInput.after(function (index) { + return fileInputClones[index]; + }); + if (options.paramName) { + options.fileInput.each(function (index) { + $(this).prop( + 'name', + paramNames[index] || options.paramName + ); + }); + } + // Appending the file input fields to the hidden form + // removes them from their original location: + form + .append(options.fileInput) + .prop('enctype', 'multipart/form-data') + // enctype must be set as encoding for IE: + .prop('encoding', 'multipart/form-data'); + // Remove the HTML5 form attribute from the input(s): + options.fileInput.removeAttr('form'); + } + form.submit(); + // Insert the file input fields at their original location + // by replacing the clones with the originals: + if (fileInputClones && fileInputClones.length) { + options.fileInput.each(function (index, input) { + var clone = $(fileInputClones[index]); + // Restore the original name and form properties: + $(input) + .prop('name', clone.prop('name')) + .attr('form', clone.attr('form')); + clone.replaceWith(input); + }); + } + }); + form.append(iframe).appendTo(document.body); + }, + abort: function () { + if (iframe) { + // javascript:false as iframe src aborts the request + // and prevents warning popups on HTTPS in IE6. + // concat is used to avoid the "Script URL" JSLint error: + iframe + .unbind('load') + .prop('src', initialIframeSrc); + } + if (form) { + form.remove(); + } + } + }; + } + }); + + // The iframe transport returns the iframe content document as response. + // The following adds converters from iframe to text, json, html, xml + // and script. + // Please note that the Content-Type for JSON responses has to be text/plain + // or text/html, if the browser doesn't include application/json in the + // Accept header, else IE will show a download dialog. + // The Content-Type for XML responses on the other hand has to be always + // application/xml or text/xml, so IE properly parses the XML response. + // See also + // https://github.com/blueimp/jQuery-File-Upload/wiki/Setup#content-type-negotiation + $.ajaxSetup({ + converters: { + 'iframe text': function (iframe) { + return iframe && $(iframe[0].body).text(); + }, + 'iframe json': function (iframe) { + return iframe && $.parseJSON($(iframe[0].body).text()); + }, + 'iframe html': function (iframe) { + return iframe && $(iframe[0].body).html(); + }, + 'iframe xml': function (iframe) { + var xmlDoc = iframe && iframe[0]; + return xmlDoc && $.isXMLDoc(xmlDoc) ? xmlDoc : + $.parseXML((xmlDoc.XMLDocument && xmlDoc.XMLDocument.xml) || + $(xmlDoc.body).html()); + }, + 'iframe script': function (iframe) { + return iframe && $.globalEval($(iframe[0].body).text()); + } + } + }); + +})); diff --git a/public/assets/js/jquery.js b/public/assets/js/jquery.js new file mode 100644 index 0000000000..d1608e37ff --- /dev/null +++ b/public/assets/js/jquery.js @@ -0,0 +1,4 @@ +/*! jQuery v1.11.1 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.1",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?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="
    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=/\s*$/g,rb={option:[1,""],legend:[1,"
    ","
    "],area:[1,"",""],param:[1,"",""],thead:[1,"","
    "],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("');return b.join("")})}},fileButton:function(b,a,d){if(!(3>arguments.length)){i.call(this,a);var e=this;a.validate&&(this.validate=a.validate);var c=CKEDITOR.tools.extend({},a),f=c.onClick;c.className=(c.className?c.className+" ":"")+"cke_dialog_ui_button";c.onClick=function(c){var d= +a["for"];if(!f||f.call(this,c)!==false){b.getContentElement(d[0],d[1]).submit();this.disable()}};b.on("load",function(){b.getContentElement(a["for"][0],a["for"][1])._.buttons.push(e)});CKEDITOR.ui.dialog.button.call(this,b,c,d)}},html:function(){var b=/^\s*<[\w:]+\s+([^>]*)?>/,a=/^(\s*<[\w:]+(?:\s+[^>]*)?)((?:.|\r|\n)+)$/,d=/\/$/;return function(e,c,f){if(!(3>arguments.length)){var h=[],g=c.html;"<"!=g.charAt(0)&&(g=""+g+"");var k=c.focus;if(k){var j=this.focus;this.focus=function(){("function"== +typeof k?k:j).call(this);this.fire("focus")};c.isFocusable&&(this.isFocusable=this.isFocusable);this.keyboardFocusable=!0}CKEDITOR.ui.dialog.uiElement.call(this,e,c,h,"span",null,null,"");h=h.join("").match(b);g=g.match(a)||["","",""];d.test(g[1])&&(g[1]=g[1].slice(0,-1),g[2]="/"+g[2]);f.push([g[1]," ",h[1]||"",g[2]].join(""))}}}(),fieldset:function(b,a,d,e,c){var f=c.label;this._={children:a};CKEDITOR.ui.dialog.uiElement.call(this,b,c,e,"fieldset",null,null,function(){var a=[];f&&a.push(""+f+"");for(var b=0;ba.getChildCount()?(new CKEDITOR.dom.text(b,CKEDITOR.document)).appendTo(a):a.getChild(0).$.nodeValue=b;return this},getLabel:function(){var b= +CKEDITOR.document.getById(this._.labelId);return!b||1>b.getChildCount()?"":b.getChild(0).getText()},eventProcessors:o},!0);CKEDITOR.ui.dialog.button.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.uiElement,{click:function(){return!this._.disabled?this.fire("click",{dialog:this._.dialog}):!1},enable:function(){this._.disabled=!1;var b=this.getElement();b&&b.removeClass("cke_disabled")},disable:function(){this._.disabled=!0;this.getElement().addClass("cke_disabled")},isVisible:function(){return this.getElement().getFirst().isVisible()}, +isEnabled:function(){return!this._.disabled},eventProcessors:CKEDITOR.tools.extend({},CKEDITOR.ui.dialog.uiElement.prototype.eventProcessors,{onClick:function(b,a){this.on("click",function(){a.apply(this,arguments)})}},!0),accessKeyUp:function(){this.click()},accessKeyDown:function(){this.focus()},keyboardFocusable:!0},!0);CKEDITOR.ui.dialog.textInput.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.labeledElement,{getInputElement:function(){return CKEDITOR.document.getById(this._.inputId)}, +focus:function(){var b=this.selectParentTab();setTimeout(function(){var a=b.getInputElement();a&&a.$.focus()},0)},select:function(){var b=this.selectParentTab();setTimeout(function(){var a=b.getInputElement();a&&(a.$.focus(),a.$.select())},0)},accessKeyUp:function(){this.select()},setValue:function(b){!b&&(b="");return CKEDITOR.ui.dialog.uiElement.prototype.setValue.apply(this,arguments)},keyboardFocusable:!0},n,!0);CKEDITOR.ui.dialog.textarea.prototype=new CKEDITOR.ui.dialog.textInput;CKEDITOR.ui.dialog.select.prototype= +CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.labeledElement,{getInputElement:function(){return this._.select.getElement()},add:function(b,a,d){var e=new CKEDITOR.dom.element("option",this.getDialog().getParentEditor().document),c=this.getInputElement().$;e.$.text=b;e.$.value=void 0===a||null===a?b:a;void 0===d||null===d?CKEDITOR.env.ie?c.add(e.$):c.add(e.$,null):c.add(e.$,d);return this},remove:function(b){this.getInputElement().$.remove(b);return this},clear:function(){for(var b=this.getInputElement().$;0< +b.length;)b.remove(0);return this},keyboardFocusable:!0},n,!0);CKEDITOR.ui.dialog.checkbox.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.uiElement,{getInputElement:function(){return this._.checkbox.getElement()},setValue:function(b,a){this.getInputElement().$.checked=b;!a&&this.fire("change",{value:b})},getValue:function(){return this.getInputElement().$.checked},accessKeyUp:function(){this.setValue(!this.getValue())},eventProcessors:{onChange:function(b,a){if(!CKEDITOR.env.ie||8','
    + +

    + diff --git a/public/assets/js/plugins/ckeditor/plugins/wsc/dialogs/tmp.html b/public/assets/js/plugins/ckeditor/plugins/wsc/dialogs/tmp.html new file mode 100755 index 0000000000..6e9b012e48 --- /dev/null +++ b/public/assets/js/plugins/ckeditor/plugins/wsc/dialogs/tmp.html @@ -0,0 +1,115 @@ + + + + + iframe + + + + +
    + + + + + + + diff --git a/public/assets/js/plugins/ckeditor/plugins/wsc/dialogs/tmpFrameset.html b/public/assets/js/plugins/ckeditor/plugins/wsc/dialogs/tmpFrameset.html new file mode 100755 index 0000000000..0d675f4d69 --- /dev/null +++ b/public/assets/js/plugins/ckeditor/plugins/wsc/dialogs/tmpFrameset.html @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + diff --git a/public/assets/js/plugins/ckeditor/plugins/wsc/dialogs/wsc.css b/public/assets/js/plugins/ckeditor/plugins/wsc/dialogs/wsc.css new file mode 100755 index 0000000000..9e834f1d09 --- /dev/null +++ b/public/assets/js/plugins/ckeditor/plugins/wsc/dialogs/wsc.css @@ -0,0 +1,82 @@ +/* +Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ + +html, body +{ + background-color: transparent; + margin: 0px; + padding: 0px; +} + +body +{ + padding: 10px; +} + +body, td, input, select, textarea +{ + font-size: 11px; + font-family: 'Microsoft Sans Serif' , Arial, Helvetica, Verdana; +} + +.midtext +{ + padding:0px; + margin:10px; +} + +.midtext p +{ + padding:0px; + margin:10px; +} + +.Button +{ + border: #737357 1px solid; + color: #3b3b1f; + background-color: #c7c78f; +} + +.PopupTabArea +{ + color: #737357; + background-color: #e3e3c7; +} + +.PopupTitleBorder +{ + border-bottom: #d5d59d 1px solid; +} +.PopupTabEmptyArea +{ + padding-left: 10px; + border-bottom: #d5d59d 1px solid; +} + +.PopupTab, .PopupTabSelected +{ + border-right: #d5d59d 1px solid; + border-top: #d5d59d 1px solid; + border-left: #d5d59d 1px solid; + padding: 3px 5px 3px 5px; + color: #737357; +} + +.PopupTab +{ + margin-top: 1px; + border-bottom: #d5d59d 1px solid; + cursor: pointer; +} + +.PopupTabSelected +{ + font-weight: bold; + cursor: default; + padding-top: 4px; + border-bottom: #f1f1e3 1px solid; + background-color: #f1f1e3; +} diff --git a/public/assets/js/plugins/ckeditor/plugins/wsc/dialogs/wsc.js b/public/assets/js/plugins/ckeditor/plugins/wsc/dialogs/wsc.js new file mode 100755 index 0000000000..22410bdb15 --- /dev/null +++ b/public/assets/js/plugins/ckeditor/plugins/wsc/dialogs/wsc.js @@ -0,0 +1,67 @@ +/* + Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +(function(){function w(a){if(!a)throw"Languages-by-groups list are required for construct selectbox";var c=[],d="",f;for(f in a)for(var g in a[f]){var h=a[f][g];"en_US"==h?d=h:c.push(h)}c.sort();d&&c.unshift(d);return{getCurrentLangGroup:function(c){a:{for(var d in a)for(var f in a[d])if(f.toUpperCase()===c.toUpperCase()){c=d;break a}c=""}return c},setLangList:function(){var c={},d;for(d in a)for(var f in a[d])c[a[d][f]]=f;return c}()}}var e=function(){var a=function(a,b,f){var f=f||{},g=f.expires; +if("number"==typeof g&&g){var h=new Date;h.setTime(h.getTime()+1E3*g);g=f.expires=h}g&&g.toUTCString&&(f.expires=g.toUTCString());var b=encodeURIComponent(b),a=a+"="+b,e;for(e in f)b=f[e],a+="; "+e,!0!==b&&(a+="="+b);document.cookie=a};return{postMessage:{init:function(a){document.addEventListener?window.addEventListener("message",a,!1):window.attachEvent("onmessage",a)},send:function(a){var b=a.fn||null,f=a.id||"",g=a.target||window,h=a.message||{id:f};"[object Object]"==Object.prototype.toString.call(a.message)&& +(a.message.id||(a.message.id=f),h=a.message);a=window.JSON.stringify(h,b);g.postMessage(a,"*")}},hash:{create:function(){},parse:function(){}},cookie:{set:a,get:function(a){return(a=document.cookie.match(RegExp("(?:^|; )"+a.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g,"\\$1")+"=([^;]*)")))?decodeURIComponent(a[1]):void 0},remove:function(c){a(c,"",{expires:-1})}}}}(),a=a||{};a.TextAreaNumber=null;a.load=!0;a.cmd={SpellTab:"spell",Thesaurus:"thes",GrammTab:"grammar"};a.dialog=null;a.optionNode=null;a.selectNode= +null;a.grammerSuggest=null;a.textNode={};a.iframeMain=null;a.dataTemp="";a.div_overlay=null;a.textNodeInfo={};a.selectNode={};a.selectNodeResponce={};a.langList=null;a.langSelectbox=null;a.banner="";a.show_grammar=null;a.div_overlay_no_check=null;a.targetFromFrame={};a.onLoadOverlay=null;a.LocalizationComing={};a.OverlayPlace=null;a.LocalizationButton={ChangeTo:{instance:null,text:"Change to"},ChangeAll:{instance:null,text:"Change All"},IgnoreWord:{instance:null,text:"Ignore word"},IgnoreAllWords:{instance:null, +text:"Ignore all words"},Options:{instance:null,text:"Options",optionsDialog:{instance:null}},AddWord:{instance:null,text:"Add word"},FinishChecking:{instance:null,text:"Finish Checking"}};a.LocalizationLabel={ChangeTo:{instance:null,text:"Change to"},Suggestions:{instance:null,text:"Suggestions"}};var x=function(b){for(var c in b)b[c].instance.getElement().setText(a.LocalizationComing[c])},y=function(b){for(var c in b){if(!b[c].instance.setLabel)break;b[c].instance.setLabel(a.LocalizationComing[c])}}, +j,p;a.framesetHtml=function(b){return''};a.setIframe=function(b,c){var d=a.framesetHtml(c);return b.getElement().setHtml(d)};a.setCurrentIframe=function(b){a.setIframe(a.dialog._.contents[b].Content,b)};a.setHeightBannerFrame=function(){var b=a.dialog.getContentElement("SpellTab","banner").getElement(), +c=a.dialog.getContentElement("GrammTab","banner").getElement(),d=a.dialog.getContentElement("Thesaurus","banner").getElement();b.setStyle("height","90px");c.setStyle("height","90px");d.setStyle("height","90px")};a.setHeightFrame=function(){document.getElementById(a.iframeNumber+"_"+a.dialog._.currentTabId).style.height="240px"};a.sendData=function(b){var c=b._.currentTabId,d=b._.contents[c].Content,f,g;a.setIframe(d,c);b.parts.tabs.removeAllListeners();b.parts.tabs.on("click",function(h){h=h||window.event; +h.data.getTarget().is("a")&&c!=b._.currentTabId&&(c=b._.currentTabId,d=b._.contents[c].Content,f=a.iframeNumber+"_"+c,a.div_overlay.setEnable(),d.getElement().getChildCount()?t(a.targetFromFrame[f],a.cmd[c]):(a.setIframe(d,c),g=document.getElementById(f),a.targetFromFrame[f]=g.contentWindow))})};a.buildSelectLang=function(a){var c=new CKEDITOR.dom.element("div"),d=new CKEDITOR.dom.element("select"),a="wscLang"+a;c.addClass("cke_dialog_ui_input_select");c.setAttribute("role","presentation");c.setStyles({height:"auto", +position:"absolute",right:"0",top:"-1px",width:"160px","white-space":"normal"});d.setAttribute("id",a);d.addClass("cke_dialog_ui_input_select");d.setStyles({width:"160px"});c.append(d);return c};a.buildOptionLang=function(b,c){var d=document.getElementById("wscLang"+c),f=document.createDocumentFragment(),g,h,e=[];if(0===d.options.length){for(g in b)e.push([g,b[g]]);e.sort();for(var k=0;k"},{type:"html",id:"Content",label:"spellContent",html:"",setup:function(b){var b=a.iframeNumber+"_"+b._.currentTabId, +c=document.getElementById(b);a.targetFromFrame[b]=c.contentWindow}},{type:"hbox",id:"bottomGroup",style:"width:560px; margin: 0 auto;",widths:["50%","50%"],children:[{type:"hbox",id:"leftCol",align:"left",width:"50%",children:[{type:"vbox",id:"rightCol1",widths:["50%","50%"],children:[{type:"text",id:"text",label:a.LocalizationLabel.ChangeTo.text+":",labelLayout:"horizontal",labelStyle:"font: 12px/25px arial, sans-serif;",width:"140px","default":"",onShow:function(){a.textNode.SpellTab=this;a.LocalizationLabel.ChangeTo.instance= +this},onHide:function(){this.reset()}},{type:"hbox",id:"rightCol",align:"right",width:"30%",children:[{type:"vbox",id:"rightCol_col__left",children:[{type:"text",id:"labelSuggestions",label:a.LocalizationLabel.Suggestions.text+":",onShow:function(){a.LocalizationLabel.Suggestions.instance=this;this.getInputElement().hide()}},{type:"html",id:"logo",html:'WebSpellChecker.net',setup:function(){this.getElement().$.src= +a.logotype;this.getElement().getParent().setStyles({"text-align":"left"})}}]},{type:"select",id:"list_of_suggestions",labelStyle:"font: 12px/25px arial, sans-serif;",size:"6",inputStyle:"width: 140px; height: auto;",items:[["loading..."]],onShow:function(){p=this},onHide:function(){this.clear()},onChange:function(){a.textNode.SpellTab.setValue(this.getValue())}}]}]}]},{type:"hbox",id:"rightCol",align:"right",width:"50%",children:[{type:"vbox",id:"rightCol_col__left",widths:["50%","50%","50%","50%"], +children:[{type:"button",id:"ChangeTo",label:a.LocalizationButton.ChangeTo.text,title:"Change to",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id);a.LocalizationButton.ChangeTo.instance=this},onClick:c},{type:"button",id:"ChangeAll",label:a.LocalizationButton.ChangeAll.text,title:"Change All",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id);a.LocalizationButton.ChangeAll.instance=this},onClick:c},{type:"button",id:"AddWord", +label:a.LocalizationButton.AddWord.text,title:"Add word",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id);a.LocalizationButton.AddWord.instance=this},onClick:c},{type:"button",id:"FinishChecking",label:a.LocalizationButton.FinishChecking.text,title:"Finish Checking",style:"width: 100%;margin-top: 9px;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id);a.LocalizationButton.FinishChecking.instance=this},onClick:c}]},{type:"vbox",id:"rightCol_col__right", +widths:["50%","50%","50%"],children:[{type:"button",id:"IgnoreWord",label:a.LocalizationButton.IgnoreWord.text,title:"Ignore word",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id);a.LocalizationButton.IgnoreWord.instance=this},onClick:c},{type:"button",id:"IgnoreAllWords",label:a.LocalizationButton.IgnoreAllWords.text,title:"Ignore all words",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id);a.LocalizationButton.IgnoreAllWords.instance= +this},onClick:c},{type:"button",id:"option",label:a.LocalizationButton.Options.text,title:"Option",style:"width: 100%;",onLoad:function(){a.LocalizationButton.Options.instance=this;"file:"==document.location.protocol&&this.disable()},onClick:function(){"file:"==document.location.protocol?alert("WSC: Options functionality is disabled when runing from file system"):b.openDialog("options")}}]}]}]},{type:"hbox",id:"BlockFinishChecking",style:"width:560px; margin: 0 auto;",widths:["70%","30%"],onShow:function(){this.getElement().hide()}, +onHide:l,children:[{type:"hbox",id:"leftCol",align:"left",width:"70%",children:[{type:"vbox",id:"rightCol1",setup:function(){this.getChild()[0].getElement().$.src=a.logotype;this.getChild()[0].getElement().getParent().setStyles({"text-align":"center"})},children:[{type:"html",id:"logo",html:'WebSpellChecker.net'}]}]},{type:"hbox",id:"rightCol",align:"right",width:"30%",children:[{type:"vbox", +id:"rightCol_col__left",children:[{type:"button",id:"Option_button",label:a.LocalizationButton.Options.text,title:"Option",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id);"file:"==document.location.protocol&&this.disable()},onClick:function(){"file:"==document.location.protocol?alert("WSC: Options functionality is disabled when runing from file system"):b.openDialog("options")}},{type:"button",id:"FinishChecking",label:a.LocalizationButton.FinishChecking.text, +title:"Finish Checking",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c}]}]}]}]},{id:"GrammTab",label:"Grammar",accessKey:"G",elements:[{type:"html",id:"banner",label:"banner",style:"",html:"
    "},{type:"html",id:"Content",label:"GrammarContent",html:"",setup:function(){var b=a.iframeNumber+"_"+a.dialog._.currentTabId,c=document.getElementById(b);a.targetFromFrame[b]=c.contentWindow}},{type:"vbox",id:"bottomGroup",style:"width:560px; margin: 0 auto;", +children:[{type:"hbox",id:"leftCol",widths:["66%","34%"],children:[{type:"vbox",children:[{type:"text",id:"text",label:"Change to:",labelLayout:"horizontal",labelStyle:"font: 12px/25px arial, sans-serif;",inputStyle:"float: right; width: 200px;","default":"",onShow:function(){a.textNode.GrammTab=this},onHide:function(){this.reset()}},{type:"html",id:"html_text",html:"
    ", +onShow:function(){a.textNodeInfo.GrammTab=this}},{type:"html",id:"radio",html:"",onShow:function(){a.grammerSuggest=this}}]},{type:"vbox",children:[{type:"button",id:"ChangeTo",label:"Change to",title:"Change to",style:"width: 133px; float: right;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c},{type:"button",id:"IgnoreWord",label:"Ignore word",title:"Ignore word",style:"width: 133px; float: right;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)}, +onClick:c},{type:"button",id:"IgnoreAllWords",label:"Ignore Problem",title:"Ignore Problem",style:"width: 133px; float: right;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c},{type:"button",id:"FinishChecking",label:"Finish Checking",title:"Finish Checking",style:"width: 133px; float: right; margin-top: 9px;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c}]}]}]},{type:"hbox",id:"BlockFinishChecking",style:"width:560px; margin: 0 auto;", +widths:["70%","30%"],onShow:function(){this.getElement().hide()},onHide:l,children:[{type:"hbox",id:"leftCol",align:"left",width:"70%",children:[{type:"vbox",id:"rightCol1",children:[{type:"html",id:"logo",html:'WebSpellChecker.net',setup:function(){this.getElement().$.src=a.logotype;this.getElement().getParent().setStyles({"text-align":"center"})}}]}]},{type:"hbox",id:"rightCol",align:"right", +width:"30%",children:[{type:"vbox",id:"rightCol_col__left",children:[{type:"button",id:"FinishChecking",label:"Finish Checking",title:"Finish Checking",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c}]}]}]}]},{id:"Thesaurus",label:"Thesaurus",accessKey:"T",elements:[{type:"html",id:"banner",label:"banner",style:"",html:"
    "},{type:"html",id:"Content",label:"spellContent",html:"",setup:function(){var b=a.iframeNumber+"_"+a.dialog._.currentTabId, +c=document.getElementById(b);a.targetFromFrame[b]=c.contentWindow}},{type:"vbox",id:"bottomGroup",style:"width:560px; margin: -10px auto; overflow: hidden;",children:[{type:"hbox",widths:["75%","25%"],children:[{type:"vbox",children:[{type:"hbox",widths:["65%","35%"],children:[{type:"text",id:"ChangeTo",label:"Change to:",labelLayout:"horizontal",inputStyle:"width: 160px;",labelStyle:"font: 12px/25px arial, sans-serif;","default":"",onShow:function(){a.textNode.Thesaurus=this},onHide:function(){this.reset()}}, +{type:"button",id:"ChangeTo",label:"Change to",title:"Change to",style:"width: 121px; margin-top: 1px;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c}]},{type:"hbox",children:[{type:"select",id:"categories",label:"Categories:",labelStyle:"font: 12px/25px arial, sans-serif;",size:"5",inputStyle:"width: 180px; height: auto;",items:[],onShow:function(){a.selectNode.categories=this},onHide:function(){this.clear()},onChange:function(){a.buildOptionSynonyms(this.getValue())}}, +{type:"select",id:"synonyms",label:"Synonyms:",labelStyle:"font: 12px/25px arial, sans-serif;",size:"5",inputStyle:"width: 180px; height: auto;",items:[],onShow:function(){a.selectNode.synonyms=this;a.textNode.Thesaurus.setValue(this.getValue())},onHide:function(){this.clear()},onChange:function(){a.textNode.Thesaurus.setValue(this.getValue())}}]}]},{type:"vbox",width:"120px",style:"margin-top:46px;",children:[{type:"html",id:"logotype",label:"WebSpellChecker.net",html:'WebSpellChecker.net', +setup:function(){this.getElement().$.src=a.logotype;this.getElement().getParent().setStyles({"text-align":"center"})}},{type:"button",id:"FinishChecking",label:"Finish Checking",title:"Finish Checking",style:"width: 121px; float: right; margin-top: 9px;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c}]}]}]},{type:"hbox",id:"BlockFinishChecking",style:"width:560px; margin: 0 auto;",widths:["70%","30%"],onShow:function(){this.getElement().hide()},children:[{type:"hbox", +id:"leftCol",align:"left",width:"70%",children:[{type:"vbox",id:"rightCol1",children:[{type:"html",id:"logo",html:'WebSpellChecker.net',setup:function(){this.getElement().$.src=a.logotype;this.getElement().getParent().setStyles({"text-align":"center"})}}]}]},{type:"hbox",id:"rightCol",align:"right",width:"30%",children:[{type:"vbox",id:"rightCol_col__left",children:[{type:"button",id:"FinishChecking", +label:"Finish Checking",title:"Finish Checking",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c}]}]}]}]}]}});CKEDITOR.dialog.add("options",function(){var b=null,c={},d={},f=null,g=null;e.cookie.get("udn");e.cookie.get("osp");var h=function(){g=this.getElement().getAttribute("title-cmd");var a=[];a[0]=d.IgnoreAllCapsWords;a[1]=d.IgnoreWordsNumbers;a[2]=d.IgnoreMixedCaseWords;a[3]=d.IgnoreDomainNames;a=a.toString().replace(/,/g,"");e.cookie.set("osp", +a);e.cookie.set("udnCmd",g?g:"ignore");"delete"!=g&&(a="",""!==j.getValue()&&(a=j.getValue()),e.cookie.set("udn",a));e.postMessage.send({id:"options_dic_send"})},i=function(){f.getElement().setHtml(a.LocalizationComing.error);f.getElement().show()};return{title:a.LocalizationComing.Options,minWidth:430,minHeight:130,resizable:CKEDITOR.DIALOG_RESIZE_NONE,contents:[{id:"OptionsTab",label:"Options",accessKey:"O",elements:[{type:"hbox",id:"options_error",children:[{type:"html",style:"display: block;text-align: center;white-space: normal!important; font-size: 12px;color:red", +html:"
    ",onShow:function(){f=this}}]},{type:"vbox",id:"Options_content",children:[{type:"hbox",id:"Options_manager",widths:["52%","48%"],children:[{type:"fieldset",label:"Spell Checking Options",style:"border: none;margin-top: 13px;padding: 10px 0 10px 10px",onShow:function(){this.getInputElement().$.children[0].innerHTML=a.LocalizationComing.SpellCheckingOptions},children:[{type:"vbox",id:"Options_checkbox",children:[{type:"checkbox",id:"IgnoreAllCapsWords",label:"Ignore All-Caps Words", +labelStyle:"margin-left: 5px; font: 12px/16px arial, sans-serif;display: inline-block;white-space: normal;",style:"float:left; min-height: 16px;","default":"",onClick:function(){d[this.id]=!this.getValue()?0:1}},{type:"checkbox",id:"IgnoreWordsNumbers",label:"Ignore Words with Numbers",labelStyle:"margin-left: 5px; font: 12px/16px arial, sans-serif;display: inline-block;white-space: normal;",style:"float:left; min-height: 16px;","default":"",onClick:function(){d[this.id]=!this.getValue()?0:1}},{type:"checkbox", +id:"IgnoreMixedCaseWords",label:"Ignore Mixed-Case Words",labelStyle:"margin-left: 5px; font: 12px/16px arial, sans-serif;display: inline-block;white-space: normal;",style:"float:left; min-height: 16px;","default":"",onClick:function(){d[this.id]=!this.getValue()?0:1}},{type:"checkbox",id:"IgnoreDomainNames",label:"Ignore Domain Names",labelStyle:"margin-left: 5px; font: 12px/16px arial, sans-serif;display: inline-block;white-space: normal;",style:"float:left; min-height: 16px;","default":"",onClick:function(){d[this.id]= +!this.getValue()?0:1}}]}]},{type:"vbox",id:"Options_DictionaryName",children:[{type:"text",id:"DictionaryName",style:"margin-bottom: 10px",label:"Dictionary Name:",labelLayout:"vertical",labelStyle:"font: 12px/25px arial, sans-serif;","default":"",onLoad:function(){j=this;this.setValue(a.userDictionaryName?a.userDictionaryName:(e.cookie.get("udn"),this.getValue()))},onShow:function(){j=this;this.setValue(!e.cookie.get("udn")?this.getValue():e.cookie.get("udn"));this.setLabel(a.LocalizationComing.DictionaryName)}, +onHide:function(){this.reset()}},{type:"hbox",id:"Options_buttons",children:[{type:"vbox",id:"Options_leftCol_col",widths:["50%","50%"],children:[{type:"button",id:"create",label:"Create",title:"Create",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onShow:function(){this.getElement().setText(a.LocalizationComing.Create)},onClick:h},{type:"button",id:"restore",label:"Restore",title:"Restore",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd", +this.id)},onShow:function(){this.getElement().setText(a.LocalizationComing.Restore)},onClick:h}]},{type:"vbox",id:"Options_rightCol_col",widths:["50%","50%"],children:[{type:"button",id:"rename",label:"Rename",title:"Rename",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onShow:function(){this.getElement().setText(a.LocalizationComing.Rename)},onClick:h},{type:"button",id:"delete",label:"Remove",title:"Remove",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd", +this.id)},onShow:function(){this.getElement().setText(a.LocalizationComing.Remove)},onClick:h}]}]}]}]},{type:"hbox",id:"Options_text",children:[{type:"html",style:"text-align: justify;margin-top: 15px;white-space: normal!important; font-size: 12px;color:#777;",html:"
    "+a.LocalizationComing.OptionsTextIntro+"
    ",onShow:function(){this.getElement().setText(a.LocalizationComing.OptionsTextIntro)}}]}]}]}],buttons:[CKEDITOR.dialog.okButton,CKEDITOR.dialog.cancelButton],onOk:function(){var a=[]; +a[0]=d.IgnoreAllCapsWords;a[1]=d.IgnoreWordsNumbers;a[2]=d.IgnoreMixedCaseWords;a[3]=d.IgnoreDomainNames;a=a.toString().replace(/,/g,"");e.cookie.set("osp",a);e.cookie.set("udn",j.getValue());e.postMessage.send({id:"options_checkbox_send"});f.getElement().hide();f.getElement().setHtml(" ")},onLoad:function(){b=this;e.postMessage.init(i);c.IgnoreAllCapsWords=b.getContentElement("OptionsTab","IgnoreAllCapsWords");c.IgnoreWordsNumbers=b.getContentElement("OptionsTab","IgnoreWordsNumbers");c.IgnoreMixedCaseWords= +b.getContentElement("OptionsTab","IgnoreMixedCaseWords");c.IgnoreDomainNames=b.getContentElement("OptionsTab","IgnoreDomainNames")},onShow:function(){var b=e.cookie.get("osp").split("");d.IgnoreAllCapsWords=b[0];d.IgnoreWordsNumbers=b[1];d.IgnoreMixedCaseWords=b[2];d.IgnoreDomainNames=b[3];!parseInt(d.IgnoreAllCapsWords,10)?c.IgnoreAllCapsWords.setValue("",!1):c.IgnoreAllCapsWords.setValue("checked",!1);!parseInt(d.IgnoreWordsNumbers,10)?c.IgnoreWordsNumbers.setValue("",!1):c.IgnoreWordsNumbers.setValue("checked", +!1);!parseInt(d.IgnoreMixedCaseWords,10)?c.IgnoreMixedCaseWords.setValue("",!1):c.IgnoreMixedCaseWords.setValue("checked",!1);!parseInt(d.IgnoreDomainNames,10)?c.IgnoreDomainNames.setValue("",!1):c.IgnoreDomainNames.setValue("checked",!1);d.IgnoreAllCapsWords=!c.IgnoreAllCapsWords.getValue()?0:1;d.IgnoreWordsNumbers=!c.IgnoreWordsNumbers.getValue()?0:1;d.IgnoreMixedCaseWords=!c.IgnoreMixedCaseWords.getValue()?0:1;d.IgnoreDomainNames=!c.IgnoreDomainNames.getValue()?0:1;c.IgnoreAllCapsWords.getElement().$.lastChild.innerHTML= +a.LocalizationComing.IgnoreAllCapsWords;c.IgnoreWordsNumbers.getElement().$.lastChild.innerHTML=a.LocalizationComing.IgnoreWordsWithNumbers;c.IgnoreMixedCaseWords.getElement().$.lastChild.innerHTML=a.LocalizationComing.IgnoreMixedCaseWords;c.IgnoreDomainNames.getElement().$.lastChild.innerHTML=a.LocalizationComing.IgnoreDomainNames}}});CKEDITOR.dialog.on("resize",function(b){var b=b.data,c=b.dialog,d=CKEDITOR.document.getById(a.iframeNumber+"_"+c._.currentTabId);"checkspell"==c._.name&&(a.bnr?d&& +d.setSize("height",b.height-310):d&&d.setSize("height",b.height-220))});CKEDITOR.on("dialogDefinition",function(b){var c=b.data.definition;a.onLoadOverlay=new q({opacity:"1",background:"#fff",target:c.dialog.parts.tabs.getParent().$});a.onLoadOverlay.setEnable();c.dialog.on("show",function(){});c.dialog.on("cancel",function(){c.dialog.getParentEditor().config.wsc_onClose.call(this.document.getWindow().getFrame());a.div_overlay.setDisable();return!1},this,null,-1)})})(); \ No newline at end of file diff --git a/public/assets/js/plugins/ckeditor/plugins/wsc/dialogs/wsc_ie.js b/public/assets/js/plugins/ckeditor/plugins/wsc/dialogs/wsc_ie.js new file mode 100755 index 0000000000..6b39b0060f --- /dev/null +++ b/public/assets/js/plugins/ckeditor/plugins/wsc/dialogs/wsc_ie.js @@ -0,0 +1,11 @@ +/* + Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.dialog.add("checkspell",function(a){function c(a,c){var d=0;return function(){"function"==typeof window.doSpell?("undefined"!=typeof e&&window.clearInterval(e),j(a)):180==d++&&window._cancelOnError(c)}}function j(c){var f=new window._SP_FCK_LangCompare,b=CKEDITOR.getUrl(a.plugins.wsc.path+"dialogs/"),e=b+"tmpFrameset.html";window.gFCKPluginName="wsc";f.setDefaulLangCode(a.config.defaultLanguage);window.doSpell({ctrl:g,lang:a.config.wsc_lang||f.getSPLangCode(a.langCode),intLang:a.config.wsc_uiLang|| +f.getSPLangCode(a.langCode),winType:d,onCancel:function(){c.hide()},onFinish:function(b){a.focus();c.getParentEditor().setData(b.value);c.hide()},staticFrame:e,framesetPath:e,iframePath:b+"ciframe.html",schemaURI:b+"wsc.css",userDictionaryName:a.config.wsc_userDictionaryName,customDictionaryName:a.config.wsc_customDictionaryIds&&a.config.wsc_customDictionaryIds.split(","),domainName:a.config.wsc_domainName});CKEDITOR.document.getById(h).setStyle("display","none");CKEDITOR.document.getById(d).setStyle("display", +"block")}var b=CKEDITOR.tools.getNextNumber(),d="cke_frame_"+b,g="cke_data_"+b,h="cke_error_"+b,e,b=document.location.protocol||"http:",i=a.lang.wsc.notAvailable,k='', +l=a.config.wsc_customLoaderScript||b+"//loader.webspellchecker.net/sproxy_fck/sproxy.php?plugin=fck2&customerid="+a.config.wsc_customerId+"&cmd=script&doc=wsc&schema=22";a.config.wsc_customLoaderScript&&(i+='

    '+a.lang.wsc.errorLoading.replace(/%s/g,a.config.wsc_customLoaderScript)+"

    ");window._cancelOnError=function(c){if("undefined"==typeof window.WSC_Error){CKEDITOR.document.getById(d).setStyle("display", +"none");var b=CKEDITOR.document.getById(h);b.setStyle("display","block");b.setHtml(c||a.lang.wsc.notAvailable)}};return{title:a.config.wsc_dialogTitle||a.lang.wsc.title,minWidth:485,minHeight:380,buttons:[CKEDITOR.dialog.cancelButton],onShow:function(){var b=this.getContentElement("general","content").getElement();b.setHtml(k);b.getChild(2).setStyle("height",this._.contentSize.height+"px");"function"!=typeof window.doSpell&&CKEDITOR.document.getHead().append(CKEDITOR.document.createElement("script", +{attributes:{type:"text/javascript",src:l}}));b=a.getData();CKEDITOR.document.getById(g).setValue(b);e=window.setInterval(c(this,i),250)},onHide:function(){window.ooo=void 0;window.int_framsetLoaded=void 0;window.framesetLoaded=void 0;window.is_window_opened=!1},contents:[{id:"general",label:a.config.wsc_dialogTitle||a.lang.wsc.title,padding:0,elements:[{type:"html",id:"content",html:""}]}]}}); +CKEDITOR.dialog.on("resize",function(a){var a=a.data,c=a.dialog;"checkspell"==c._.name&&((c=(c=c.getContentElement("general","content").getElement())&&c.getChild(2))&&c.setSize("height",a.height),c&&c.setSize("width",a.width))}); \ No newline at end of file diff --git a/public/assets/js/plugins/ckeditor/skins/moono/dialog.css b/public/assets/js/plugins/ckeditor/skins/moono/dialog.css new file mode 100755 index 0000000000..29bbaf9f16 --- /dev/null +++ b/public/assets/js/plugins/ckeditor/skins/moono/dialog.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_browser_gecko19 .cke_dialog_body{position:relative}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:0 0;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:3px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 12px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:20px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:2px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:24px;line-height:24px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:2px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%} \ No newline at end of file diff --git a/public/assets/js/plugins/ckeditor/skins/moono/dialog_ie.css b/public/assets/js/plugins/ckeditor/skins/moono/dialog_ie.css new file mode 100755 index 0000000000..153b05cb51 --- /dev/null +++ b/public/assets/js/plugins/ckeditor/skins/moono/dialog_ie.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_browser_gecko19 .cke_dialog_body{position:relative}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:0 0;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:3px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 12px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:20px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:2px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:24px;line-height:24px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:2px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0} \ No newline at end of file diff --git a/public/assets/js/plugins/ckeditor/skins/moono/dialog_ie7.css b/public/assets/js/plugins/ckeditor/skins/moono/dialog_ie7.css new file mode 100755 index 0000000000..459e72b85b --- /dev/null +++ b/public/assets/js/plugins/ckeditor/skins/moono/dialog_ie7.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_browser_gecko19 .cke_dialog_body{position:relative}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:0 0;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:3px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 12px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:20px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:2px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:24px;line-height:24px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:2px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}.cke_dialog_title{zoom:1}.cke_dialog_footer{border-top:1px solid #bfbfbf}.cke_dialog_footer_buttons{position:static}.cke_dialog_footer_buttons a.cke_dialog_ui_button{vertical-align:top}.cke_dialog .cke_resizer_ltr{padding-left:4px}.cke_dialog .cke_resizer_rtl{padding-right:4px}.cke_dialog_ui_input_text,.cke_dialog_ui_input_password,.cke_dialog_ui_input_textarea,.cke_dialog_ui_input_select{padding:0!important}.cke_dialog_ui_checkbox_input,.cke_dialog_ui_ratio_input,.cke_btn_reset,.cke_btn_locked,.cke_btn_unlocked{border:1px solid transparent!important} \ No newline at end of file diff --git a/public/assets/js/plugins/ckeditor/skins/moono/dialog_ie8.css b/public/assets/js/plugins/ckeditor/skins/moono/dialog_ie8.css new file mode 100755 index 0000000000..74e9fa88e4 --- /dev/null +++ b/public/assets/js/plugins/ckeditor/skins/moono/dialog_ie8.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_browser_gecko19 .cke_dialog_body{position:relative}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:0 0;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:3px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 12px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:20px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:2px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:24px;line-height:24px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:2px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{display:block} \ No newline at end of file diff --git a/public/assets/js/plugins/ckeditor/skins/moono/dialog_iequirks.css b/public/assets/js/plugins/ckeditor/skins/moono/dialog_iequirks.css new file mode 100755 index 0000000000..1c8e055830 --- /dev/null +++ b/public/assets/js/plugins/ckeditor/skins/moono/dialog_iequirks.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_browser_gecko19 .cke_dialog_body{position:relative}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:0 0;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:3px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 12px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:20px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:2px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:24px;line-height:24px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:2px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}.cke_dialog_footer{filter:""} \ No newline at end of file diff --git a/public/assets/js/plugins/ckeditor/skins/moono/dialog_opera.css b/public/assets/js/plugins/ckeditor/skins/moono/dialog_opera.css new file mode 100755 index 0000000000..742ce7315f --- /dev/null +++ b/public/assets/js/plugins/ckeditor/skins/moono/dialog_opera.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_browser_gecko19 .cke_dialog_body{position:relative}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:0 0;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:3px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 12px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:20px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:2px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:24px;line-height:24px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:2px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_dialog_footer{display:block;height:38px}.cke_ltr .cke_dialog_footer>*{float:right}.cke_rtl .cke_dialog_footer>*{float:left} \ No newline at end of file diff --git a/public/assets/js/plugins/ckeditor/skins/moono/editor.css b/public/assets/js/plugins/ckeditor/skins/moono/editor.css new file mode 100755 index 0000000000..2df8482270 --- /dev/null +++ b/public/assets/js/plugins/ckeditor/skins/moono/editor.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup *:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_rtl .cke_toolgroup *:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_on{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -1032px !important;background-size: 16px !important;} \ No newline at end of file diff --git a/public/assets/js/plugins/ckeditor/skins/moono/editor_gecko.css b/public/assets/js/plugins/ckeditor/skins/moono/editor_gecko.css new file mode 100755 index 0000000000..ecb7990afd --- /dev/null +++ b/public/assets/js/plugins/ckeditor/skins/moono/editor_gecko.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup *:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_rtl .cke_toolgroup *:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_on{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}.cke_bottom{padding-bottom:3px}.cke_combo_text{margin-bottom:-1px;margin-top:1px}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -1032px !important;background-size: 16px !important;} \ No newline at end of file diff --git a/public/assets/js/plugins/ckeditor/skins/moono/editor_ie.css b/public/assets/js/plugins/ckeditor/skins/moono/editor_ie.css new file mode 100755 index 0000000000..332d7795b4 --- /dev/null +++ b/public/assets/js/plugins/ckeditor/skins/moono/editor_ie.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup *:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_rtl .cke_toolgroup *:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_on{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -1032px !important;background-size: 16px !important;} \ No newline at end of file diff --git a/public/assets/js/plugins/ckeditor/skins/moono/editor_ie7.css b/public/assets/js/plugins/ckeditor/skins/moono/editor_ie7.css new file mode 100755 index 0000000000..9bfeaa7896 --- /dev/null +++ b/public/assets/js/plugins/ckeditor/skins/moono/editor_ie7.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup *:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_rtl .cke_toolgroup *:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_on{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_button,.cke_rtl .cke_button *,.cke_rtl .cke_combo,.cke_rtl .cke_combo *,.cke_rtl .cke_path_item,.cke_rtl .cke_path_item *,.cke_rtl .cke_path_empty{float:none}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_combo_button,.cke_rtl .cke_combo_button *,.cke_rtl .cke_button,.cke_rtl .cke_button_icon,{display:inline-block;vertical-align:top}.cke_toolbox{display:inline-block;padding-bottom:5px;height:100%}.cke_rtl .cke_toolbox{padding-bottom:0}.cke_toolbar{margin-bottom:5px}.cke_rtl .cke_toolbar{margin-bottom:0}.cke_toolgroup{height:26px}.cke_toolgroup,.cke_combo{position:relative}a.cke_button{float:none;vertical-align:top}.cke_toolbar_separator{display:inline-block;float:none;vertical-align:top;background-color:#c0c0c0}.cke_toolbox_collapser .cke_arrow{margin-top:0}.cke_toolbox_collapser .cke_arrow{border-width:4px}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{border-width:3px}.cke_rtl .cke_button_arrow{padding-top:8px;margin-right:2px}.cke_rtl .cke_combo_inlinelabel{display:table-cell;vertical-align:middle}.cke_menubutton{display:block;height:24px}.cke_menubutton_inner{display:block;position:relative}.cke_menubutton_icon{height:16px;width:16px}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:inline-block}.cke_menubutton_label{width:auto;vertical-align:top;line-height:24px;height:24px;margin:0 10px 0 0}.cke_menuarrow{width:5px;height:6px;padding:0;position:absolute;right:8px;top:10px;background-position:0 0}.cke_rtl .cke_menubutton_icon{position:absolute;right:0;top:0}.cke_rtl .cke_menubutton_label{float:right;clear:both;margin:0 24px 0 10px}.cke_hc .cke_rtl .cke_menubutton_label{margin-right:0}.cke_rtl .cke_menuarrow{left:8px;right:auto;background-position:0 -24px}.cke_hc .cke_menuarrow{top:5px;padding:0 5px}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{position:relative}.cke_wysiwyg_div{padding-top:0!important;padding-bottom:0!important}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -1032px !important;background-size: 16px !important;} \ No newline at end of file diff --git a/public/assets/js/plugins/ckeditor/skins/moono/editor_ie8.css b/public/assets/js/plugins/ckeditor/skins/moono/editor_ie8.css new file mode 100755 index 0000000000..955ec8d278 --- /dev/null +++ b/public/assets/js/plugins/ckeditor/skins/moono/editor_ie8.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup *:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_rtl .cke_toolgroup *:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_on{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_toolbox_collapser .cke_arrow{border-width:4px}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{border-width:3px}.cke_toolbox_collapser .cke_arrow{margin-top:0}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -1032px !important;background-size: 16px !important;} \ No newline at end of file diff --git a/public/assets/js/plugins/ckeditor/skins/moono/editor_iequirks.css b/public/assets/js/plugins/ckeditor/skins/moono/editor_iequirks.css new file mode 100755 index 0000000000..009d08c5d8 --- /dev/null +++ b/public/assets/js/plugins/ckeditor/skins/moono/editor_iequirks.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup *:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_rtl .cke_toolgroup *:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_on{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_top,.cke_contents,.cke_bottom{width:100%}.cke_button_arrow{font-size:0}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_button,.cke_rtl .cke_button *,.cke_rtl .cke_combo,.cke_rtl .cke_combo *,.cke_rtl .cke_path_item,.cke_rtl .cke_path_item *,.cke_rtl .cke_path_empty{float:none}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_combo_button,.cke_rtl .cke_combo_button *,.cke_rtl .cke_button,.cke_rtl .cke_button_icon,{display:inline-block;vertical-align:top}.cke_rtl .cke_button_icon{float:none}.cke_resizer{width:10px}.cke_source{white-space:normal}.cke_bottom{position:static}.cke_colorbox{font-size:0}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -1032px !important;background-size: 16px !important;} \ No newline at end of file diff --git a/public/assets/js/plugins/ckeditor/skins/moono/icons.png b/public/assets/js/plugins/ckeditor/skins/moono/icons.png new file mode 100755 index 0000000000..c71008d700 Binary files /dev/null and b/public/assets/js/plugins/ckeditor/skins/moono/icons.png differ diff --git a/public/assets/js/plugins/ckeditor/skins/moono/icons_hidpi.png b/public/assets/js/plugins/ckeditor/skins/moono/icons_hidpi.png new file mode 100755 index 0000000000..0466c2bcc5 Binary files /dev/null and b/public/assets/js/plugins/ckeditor/skins/moono/icons_hidpi.png differ diff --git a/public/assets/js/plugins/ckeditor/skins/moono/images/arrow.png b/public/assets/js/plugins/ckeditor/skins/moono/images/arrow.png new file mode 100755 index 0000000000..0d1eb39c67 Binary files /dev/null and b/public/assets/js/plugins/ckeditor/skins/moono/images/arrow.png differ diff --git a/public/assets/js/plugins/ckeditor/skins/moono/images/close.png b/public/assets/js/plugins/ckeditor/skins/moono/images/close.png new file mode 100755 index 0000000000..04b9c97dde Binary files /dev/null and b/public/assets/js/plugins/ckeditor/skins/moono/images/close.png differ diff --git a/public/assets/js/plugins/ckeditor/skins/moono/images/hidpi/close.png b/public/assets/js/plugins/ckeditor/skins/moono/images/hidpi/close.png new file mode 100755 index 0000000000..8abca8e972 Binary files /dev/null and b/public/assets/js/plugins/ckeditor/skins/moono/images/hidpi/close.png differ diff --git a/public/assets/js/plugins/ckeditor/skins/moono/images/hidpi/lock-open.png b/public/assets/js/plugins/ckeditor/skins/moono/images/hidpi/lock-open.png new file mode 100755 index 0000000000..aa5e740ee7 Binary files /dev/null and b/public/assets/js/plugins/ckeditor/skins/moono/images/hidpi/lock-open.png differ diff --git a/public/assets/js/plugins/ckeditor/skins/moono/images/hidpi/lock.png b/public/assets/js/plugins/ckeditor/skins/moono/images/hidpi/lock.png new file mode 100755 index 0000000000..5404b063a0 Binary files /dev/null and b/public/assets/js/plugins/ckeditor/skins/moono/images/hidpi/lock.png differ diff --git a/public/assets/js/plugins/ckeditor/skins/moono/images/hidpi/refresh.png b/public/assets/js/plugins/ckeditor/skins/moono/images/hidpi/refresh.png new file mode 100755 index 0000000000..1ebef3440d Binary files /dev/null and b/public/assets/js/plugins/ckeditor/skins/moono/images/hidpi/refresh.png differ diff --git a/public/assets/js/plugins/ckeditor/skins/moono/images/lock-open.png b/public/assets/js/plugins/ckeditor/skins/moono/images/lock-open.png new file mode 100755 index 0000000000..3b256c0636 Binary files /dev/null and b/public/assets/js/plugins/ckeditor/skins/moono/images/lock-open.png differ diff --git a/public/assets/js/plugins/ckeditor/skins/moono/images/lock.png b/public/assets/js/plugins/ckeditor/skins/moono/images/lock.png new file mode 100755 index 0000000000..c127f9ebe7 Binary files /dev/null and b/public/assets/js/plugins/ckeditor/skins/moono/images/lock.png differ diff --git a/public/assets/js/plugins/ckeditor/skins/moono/images/refresh.png b/public/assets/js/plugins/ckeditor/skins/moono/images/refresh.png new file mode 100755 index 0000000000..a1a061c50d Binary files /dev/null and b/public/assets/js/plugins/ckeditor/skins/moono/images/refresh.png differ diff --git a/public/assets/js/plugins/ckeditor/skins/moono/readme.md b/public/assets/js/plugins/ckeditor/skins/moono/readme.md new file mode 100755 index 0000000000..f24ec4f590 --- /dev/null +++ b/public/assets/js/plugins/ckeditor/skins/moono/readme.md @@ -0,0 +1,51 @@ +"Moono" Skin +==================== + +This skin has been chosen for the **default skin** of CKEditor 4.x, elected from the CKEditor +[skin contest](http://ckeditor.com/blog/new_ckeditor_4_skin) and further shaped by +the CKEditor team. "Moono" is maintained by the core developers. + +For more information about skins, please check the [CKEditor Skin SDK](http://docs.cksource.com/CKEditor_4.x/Skin_SDK) +documentation. + +Features +------------------- +"Moono" is a monochromatic skin, which offers a modern look coupled with gradients and transparency. +It comes with the following features: + +- Chameleon feature with brightness, +- high-contrast compatibility, +- graphics source provided in SVG. + +Directory Structure +------------------- + +CSS parts: +- **editor.css**: the main CSS file. It's simply loading several other files, for easier maintenance, +- **mainui.css**: the file contains styles of entire editor outline structures, +- **toolbar.css**: the file contains styles of the editor toolbar space (top), +- **richcombo.css**: the file contains styles of the rich combo ui elements on toolbar, +- **panel.css**: the file contains styles of the rich combo drop-down, it's not loaded +until the first panel open up, +- **elementspath.css**: the file contains styles of the editor elements path bar (bottom), +- **menu.css**: the file contains styles of all editor menus including context menu and button drop-down, +it's not loaded until the first menu open up, +- **dialog.css**: the CSS files for the dialog UI, it's not loaded until the first dialog open, +- **reset.css**: the file defines the basis of style resets among all editor UI spaces, +- **preset.css**: the file defines the default styles of some UI elements reflecting the skin preference, +- **editor_XYZ.css** and **dialog_XYZ.css**: browser specific CSS hacks. + +Other parts: +- **skin.js**: the only JavaScript part of the skin that registers the skin, its browser specific files and its icons and defines the Chameleon feature, +- **icons/**: contains all skin defined icons, +- **images/**: contains a fill general used images, +- **dev/**: contains SVG source of the skin icons. + +License +------- + +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + +Licensed under the terms of any of the following licenses at your choice: [GPL](http://www.gnu.org/licenses/gpl.html), [LGPL](http://www.gnu.org/licenses/lgpl.html) and [MPL](http://www.mozilla.org/MPL/MPL-1.1.html). + +See LICENSE.md for more information. diff --git a/public/assets/js/plugins/ckeditor/styles.js b/public/assets/js/plugins/ckeditor/styles.js new file mode 100755 index 0000000000..b58e0bda2f --- /dev/null +++ b/public/assets/js/plugins/ckeditor/styles.js @@ -0,0 +1,111 @@ +/** + * Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +// This file contains style definitions that can be used by CKEditor plugins. +// +// The most common use for it is the "stylescombo" plugin, which shows a combo +// in the editor toolbar, containing all styles. Other plugins instead, like +// the div plugin, use a subset of the styles on their feature. +// +// If you don't have plugins that depend on this file, you can simply ignore it. +// Otherwise it is strongly recommended to customize this file to match your +// website requirements and design properly. + +CKEDITOR.stylesSet.add( 'default', [ + /* Block Styles */ + + // These styles are already available in the "Format" combo ("format" plugin), + // so they are not needed here by default. You may enable them to avoid + // placing the "Format" combo in the toolbar, maintaining the same features. + /* + { name: 'Paragraph', element: 'p' }, + { name: 'Heading 1', element: 'h1' }, + { name: 'Heading 2', element: 'h2' }, + { name: 'Heading 3', element: 'h3' }, + { name: 'Heading 4', element: 'h4' }, + { name: 'Heading 5', element: 'h5' }, + { name: 'Heading 6', element: 'h6' }, + { name: 'Preformatted Text',element: 'pre' }, + { name: 'Address', element: 'address' }, + */ + + { name: 'Italic Title', element: 'h2', styles: { 'font-style': 'italic' } }, + { name: 'Subtitle', element: 'h3', styles: { 'color': '#aaa', 'font-style': 'italic' } }, + { + name: 'Special Container', + element: 'div', + styles: { + padding: '5px 10px', + background: '#eee', + border: '1px solid #ccc' + } + }, + + /* Inline Styles */ + + // These are core styles available as toolbar buttons. You may opt enabling + // some of them in the Styles combo, removing them from the toolbar. + // (This requires the "stylescombo" plugin) + /* + { name: 'Strong', element: 'strong', overrides: 'b' }, + { name: 'Emphasis', element: 'em' , overrides: 'i' }, + { name: 'Underline', element: 'u' }, + { name: 'Strikethrough', element: 'strike' }, + { name: 'Subscript', element: 'sub' }, + { name: 'Superscript', element: 'sup' }, + */ + + { name: 'Marker', element: 'span', attributes: { 'class': 'marker' } }, + + { name: 'Big', element: 'big' }, + { name: 'Small', element: 'small' }, + { name: 'Typewriter', element: 'tt' }, + + { name: 'Computer Code', element: 'code' }, + { name: 'Keyboard Phrase', element: 'kbd' }, + { name: 'Sample Text', element: 'samp' }, + { name: 'Variable', element: 'var' }, + + { name: 'Deleted Text', element: 'del' }, + { name: 'Inserted Text', element: 'ins' }, + + { name: 'Cited Work', element: 'cite' }, + { name: 'Inline Quotation', element: 'q' }, + + { name: 'Language: RTL', element: 'span', attributes: { 'dir': 'rtl' } }, + { name: 'Language: LTR', element: 'span', attributes: { 'dir': 'ltr' } }, + + /* Object Styles */ + + { + name: 'Styled image (left)', + element: 'img', + attributes: { 'class': 'left' } + }, + + { + name: 'Styled image (right)', + element: 'img', + attributes: { 'class': 'right' } + }, + + { + name: 'Compact table', + element: 'table', + attributes: { + cellpadding: '5', + cellspacing: '0', + border: '1', + bordercolor: '#ccc' + }, + styles: { + 'border-collapse': 'collapse' + } + }, + + { name: 'Borderless Table', element: 'table', styles: { 'border-style': 'hidden', 'background-color': '#E6E6FA' } }, + { name: 'Square Bulleted List', element: 'ul', styles: { 'list-style-type': 'square' } } +]); + diff --git a/public/assets/js/plugins/colorpicker/bootstrap-colorpicker.css b/public/assets/js/plugins/colorpicker/bootstrap-colorpicker.css new file mode 100755 index 0000000000..ba4365e281 --- /dev/null +++ b/public/assets/js/plugins/colorpicker/bootstrap-colorpicker.css @@ -0,0 +1,214 @@ +/*! + * Bootstrap Colorpicker + * http://mjolnic.github.io/bootstrap-colorpicker/ + * + * Originally written by (c) 2012 Stefan Petre + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0.txt + * + */ + +.colorpicker-saturation { + float: left; + width: 100px; + height: 100px; + cursor: crosshair; + background-image: url("img/saturation.png"); +} + +.colorpicker-saturation i { + position: absolute; + top: 0; + left: 0; + display: block; + width: 5px; + height: 5px; + margin: -4px 0 0 -4px; + border: 1px solid #000; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} + +.colorpicker-saturation i b { + display: block; + width: 5px; + height: 5px; + border: 1px solid #fff; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} + +.colorpicker-hue, +.colorpicker-alpha { + float: left; + width: 15px; + height: 100px; + margin-bottom: 4px; + margin-left: 4px; + cursor: row-resize; +} + +.colorpicker-hue i, +.colorpicker-alpha i { + position: absolute; + top: 0; + left: 0; + display: block; + width: 100%; + height: 1px; + margin-top: -1px; + background: #000; + border-top: 1px solid #fff; +} + +.colorpicker-hue { + background-image: url("img/hue.png"); +} + +.colorpicker-alpha { + display: none; + background-image: url("img/alpha.png"); +} + +.colorpicker { + top: 0; + left: 0; + z-index: 2500; + min-width: 130px; + padding: 4px; + margin-top: 1px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + *zoom: 1; +} + +.colorpicker:before, +.colorpicker:after { + display: table; + line-height: 0; + content: ""; +} + +.colorpicker:after { + clear: both; +} + +.colorpicker:before { + position: absolute; + top: -7px; + left: 6px; + display: inline-block; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-left: 7px solid transparent; + border-bottom-color: rgba(0, 0, 0, 0.2); + content: ''; +} + +.colorpicker:after { + position: absolute; + top: -6px; + left: 7px; + display: inline-block; + border-right: 6px solid transparent; + border-bottom: 6px solid #ffffff; + border-left: 6px solid transparent; + content: ''; +} + +.colorpicker div { + position: relative; +} + +.colorpicker.colorpicker-with-alpha { + min-width: 140px; +} + +.colorpicker.colorpicker-with-alpha .colorpicker-alpha { + display: block; +} + +.colorpicker-color { + height: 10px; + margin-top: 5px; + clear: both; + background-image: url("img/alpha.png"); + background-position: 0 100%; +} + +.colorpicker-color div { + height: 10px; +} + +.colorpicker-element .input-group-addon i { + display: block; + width: 16px; + height: 16px; + cursor: pointer; +} + +.colorpicker.colorpicker-inline { + position: relative; + display: inline-block; + float: none; +} + +.colorpicker.colorpicker-horizontal { + width: 110px; + height: auto; + min-width: 110px; +} + +.colorpicker.colorpicker-horizontal .colorpicker-saturation { + margin-bottom: 4px; +} + +.colorpicker.colorpicker-horizontal .colorpicker-color { + width: 100px; +} + +.colorpicker.colorpicker-horizontal .colorpicker-hue, +.colorpicker.colorpicker-horizontal .colorpicker-alpha { + float: left; + width: 100px; + height: 15px; + margin-bottom: 4px; + margin-left: 0; + cursor: col-resize; +} + +.colorpicker.colorpicker-horizontal .colorpicker-hue i, +.colorpicker.colorpicker-horizontal .colorpicker-alpha i { + position: absolute; + top: 0; + left: 0; + display: block; + width: 1px; + height: 15px; + margin-top: 0; + background: #ffffff; + border: none; +} + +.colorpicker.colorpicker-horizontal .colorpicker-hue { + background-image: url("img/hue-horizontal.png"); +} + +.colorpicker.colorpicker-horizontal .colorpicker-alpha { + background-image: url("img/alpha-horizontal.png"); +} + +.colorpicker.colorpicker-hidden { + display: none; +} + +.colorpicker.colorpicker-visible { + display: block; +} + +.colorpicker-inline.colorpicker-visible { + display: inline-block; +} \ No newline at end of file diff --git a/public/assets/js/plugins/colorpicker/bootstrap-colorpicker.js b/public/assets/js/plugins/colorpicker/bootstrap-colorpicker.js new file mode 100755 index 0000000000..2200b0cc97 --- /dev/null +++ b/public/assets/js/plugins/colorpicker/bootstrap-colorpicker.js @@ -0,0 +1,949 @@ +/*! + * Bootstrap Colorpicker + * http://mjolnic.github.io/bootstrap-colorpicker/ + * + * Originally written by (c) 2012 Stefan Petre + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0.txt + * + * @todo Update DOCS + */ +(function($) { + 'use strict'; + + // Color object + var Color = function(val) { + this.value = { + h: 0, + s: 0, + b: 0, + a: 1 + }; + this.origFormat = null; // original string format + if (val) { + if (val.toLowerCase !== undefined) { + this.setColor(val); + } else if (val.h !== undefined) { + this.value = val; + } + } + }; + + Color.prototype = { + constructor: Color, + _sanitizeNumber: function(val) { + if (typeof val === 'number') { + return val; + } + if (isNaN(val) || (val === null) || (val === '') || (val === undefined)) { + return 1; + } + if (val.toLowerCase !== undefined) { + return parseFloat(val); + } + return 1; + }, + //parse a string to HSB + setColor: function(strVal) { + strVal = strVal.toLowerCase(); + this.value = this.stringToHSB(strVal) ||  { + h: 0, + s: 0, + b: 0, + a: 1 + }; + }, + stringToHSB: function(strVal) { + strVal = strVal.toLowerCase(); + var that = this, + result = false; + $.each(this.stringParsers, function(i, parser) { + var match = parser.re.exec(strVal), + values = match && parser.parse.apply(that, [match]), + format = parser.format || 'rgba'; + if (values) { + if (format.match(/hsla?/)) { + result = that.RGBtoHSB.apply(that, that.HSLtoRGB.apply(that, values)); + } else { + result = that.RGBtoHSB.apply(that, values); + } + that.origFormat = format; + return false; + } + return true; + }); + return result; + }, + setHue: function(h) { + this.value.h = 1 - h; + }, + setSaturation: function(s) { + this.value.s = s; + }, + setBrightness: function(b) { + this.value.b = 1 - b; + }, + setAlpha: function(a) { + this.value.a = parseInt((1 - a) * 100, 10) / 100; + }, + toRGB: function(h, s, v, a) { + h = h || this.value.h; + s = s || this.value.s; + v = v || this.value.b; + a = a || this.value.a; + + var r, g, b, i, f, p, q, t; + if (h && s === undefined && v === undefined) { + s = h.s, v = h.v, h = h.h; + } + i = Math.floor(h * 6); + f = h * 6 - i; + p = v * (1 - s); + q = v * (1 - f * s); + t = v * (1 - (1 - f) * s); + switch (i % 6) { + case 0: + r = v, g = t, b = p; + break; + case 1: + r = q, g = v, b = p; + break; + case 2: + r = p, g = v, b = t; + break; + case 3: + r = p, g = q, b = v; + break; + case 4: + r = t, g = p, b = v; + break; + case 5: + r = v, g = p, b = q; + break; + } + return { + r: Math.floor(r * 255), + g: Math.floor(g * 255), + b: Math.floor(b * 255), + a: a + }; + }, + toHex: function(h, s, b, a) { + var rgb = this.toRGB(h, s, b, a); + return '#' + ((1 << 24) | (parseInt(rgb.r) << 16) | (parseInt(rgb.g) << 8) | parseInt(rgb.b)).toString(16).substr(1); + }, + toHSL: function(h, s, b, a) { + h = h || this.value.h; + s = s || this.value.s; + b = b || this.value.b; + a = a || this.value.a; + + var H = h, + L = (2 - s) * b, + S = s * b; + if (L > 0 && L <= 1) { + S /= L; + } else { + S /= 2 - L; + } + L /= 2; + if (S > 1) { + S = 1; + } + return { + h: H, + s: S, + l: L, + a: a + }; + }, + RGBtoHSB: function(r, g, b, a) { + r /= 255; + g /= 255; + b /= 255; + + var H, S, V, C; + V = Math.max(r, g, b); + C = V - Math.min(r, g, b); + H = (C === 0 ? null : + V === r ? (g - b) / C : + V === g ? (b - r) / C + 2 : + (r - g) / C + 4 + ); + H = ((H + 360) % 6) * 60 / 360; + S = C === 0 ? 0 : C / V; + return { + h: this._sanitizeNumber(H), + s: S, + b: V, + a: this._sanitizeNumber(a) + }; + }, + HueToRGB: function(p, q, h) { + if (h < 0) { + h += 1; + } else if (h > 1) { + h -= 1; + } + if ((h * 6) < 1) { + return p + (q - p) * h * 6; + } else if ((h * 2) < 1) { + return q; + } else if ((h * 3) < 2) { + return p + (q - p) * ((2 / 3) - h) * 6; + } else { + return p; + } + }, + HSLtoRGB: function(h, s, l, a) { + if (s < 0) { + s = 0; + } + var q; + if (l <= 0.5) { + q = l * (1 + s); + } else { + q = l + s - (l * s); + } + + var p = 2 * l - q; + + var tr = h + (1 / 3); + var tg = h; + var tb = h - (1 / 3); + + var r = Math.round(this.HueToRGB(p, q, tr) * 255); + var g = Math.round(this.HueToRGB(p, q, tg) * 255); + var b = Math.round(this.HueToRGB(p, q, tb) * 255); + return [r, g, b, this._sanitizeNumber(a)]; + }, + toString: function(format) { + format = format ||  'rgba'; + switch (format) { + case 'rgb': + { + var rgb = this.toRGB(); + return 'rgb(' + rgb.r + ',' + rgb.g + ',' + rgb.b + ')'; + } + break; + case 'rgba': + { + var rgb = this.toRGB(); + return 'rgba(' + rgb.r + ',' + rgb.g + ',' + rgb.b + ',' + rgb.a + ')'; + } + break; + case 'hsl': + { + var hsl = this.toHSL(); + return 'hsl(' + Math.round(hsl.h * 360) + ',' + Math.round(hsl.s * 100) + '%,' + Math.round(hsl.l * 100) + '%)'; + } + break; + case 'hsla': + { + var hsl = this.toHSL(); + return 'hsla(' + Math.round(hsl.h * 360) + ',' + Math.round(hsl.s * 100) + '%,' + Math.round(hsl.l * 100) + '%,' + hsl.a + ')'; + } + break; + case 'hex': + { + return this.toHex(); + } + break; + default: + { + return false; + } + break; + } + }, + // a set of RE's that can match strings and generate color tuples. + // from John Resig color plugin + // https://github.com/jquery/jquery-color/ + stringParsers: [{ + re: /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/, + format: 'hex', + parse: function(execResult) { + return [ + parseInt(execResult[1], 16), + parseInt(execResult[2], 16), + parseInt(execResult[3], 16), + 1 + ]; + } + }, { + re: /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/, + format: 'hex', + parse: function(execResult) { + return [ + parseInt(execResult[1] + execResult[1], 16), + parseInt(execResult[2] + execResult[2], 16), + parseInt(execResult[3] + execResult[3], 16), + 1 + ]; + } + }, { + re: /rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*?\)/, + format: 'rgb', + parse: function(execResult) { + return [ + execResult[1], + execResult[2], + execResult[3], + 1 + ]; + } + }, { + re: /rgb\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*?\)/, + format: 'rgb', + parse: function(execResult) { + return [ + 2.55 * execResult[1], + 2.55 * execResult[2], + 2.55 * execResult[3], + 1 + ]; + } + }, { + re: /rgba\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/, + format: 'rgba', + parse: function(execResult) { + return [ + execResult[1], + execResult[2], + execResult[3], + execResult[4] + ]; + } + }, { + re: /rgba\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/, + format: 'rgba', + parse: function(execResult) { + return [ + 2.55 * execResult[1], + 2.55 * execResult[2], + 2.55 * execResult[3], + execResult[4] + ]; + } + }, { + re: /hsl\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*?\)/, + format: 'hsl', + parse: function(execResult) { + return [ + execResult[1] / 360, + execResult[2] / 100, + execResult[3] / 100, + execResult[4] + ]; + } + }, { + re: /hsla\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/, + format: 'hsla', + parse: function(execResult) { + return [ + execResult[1] / 360, + execResult[2] / 100, + execResult[3] / 100, + execResult[4] + ]; + } + }, { + //predefined color name + re: /^([a-z]{3,})$/, + format: 'alias', + parse: function(execResult) { + var hexval = this.colorNameToHex(execResult[0]) ||  '#000000'; + var match = this.stringParsers[0].re.exec(hexval), + values = match && this.stringParsers[0].parse.apply(this, [match]); + return values; + } + }], + colorNameToHex: function(name) { + // 140 predefined colors from the HTML Colors spec + var colors = { + "aliceblue": "#f0f8ff", + "antiquewhite": "#faebd7", + "aqua": "#00ffff", + "aquamarine": "#7fffd4", + "azure": "#f0ffff", + "beige": "#f5f5dc", + "bisque": "#ffe4c4", + "black": "#000000", + "blanchedalmond": "#ffebcd", + "blue": "#0000ff", + "blueviolet": "#8a2be2", + "brown": "#a52a2a", + "burlywood": "#deb887", + "cadetblue": "#5f9ea0", + "chartreuse": "#7fff00", + "chocolate": "#d2691e", + "coral": "#ff7f50", + "cornflowerblue": "#6495ed", + "cornsilk": "#fff8dc", + "crimson": "#dc143c", + "cyan": "#00ffff", + "darkblue": "#00008b", + "darkcyan": "#008b8b", + "darkgoldenrod": "#b8860b", + "darkgray": "#a9a9a9", + "darkgreen": "#006400", + "darkkhaki": "#bdb76b", + "darkmagenta": "#8b008b", + "darkolivegreen": "#556b2f", + "darkorange": "#ff8c00", + "darkorchid": "#9932cc", + "darkred": "#8b0000", + "darksalmon": "#e9967a", + "darkseagreen": "#8fbc8f", + "darkslateblue": "#483d8b", + "darkslategray": "#2f4f4f", + "darkturquoise": "#00ced1", + "darkviolet": "#9400d3", + "deeppink": "#ff1493", + "deepskyblue": "#00bfff", + "dimgray": "#696969", + "dodgerblue": "#1e90ff", + "firebrick": "#b22222", + "floralwhite": "#fffaf0", + "forestgreen": "#228b22", + "fuchsia": "#ff00ff", + "gainsboro": "#dcdcdc", + "ghostwhite": "#f8f8ff", + "gold": "#ffd700", + "goldenrod": "#daa520", + "gray": "#808080", + "green": "#008000", + "greenyellow": "#adff2f", + "honeydew": "#f0fff0", + "hotpink": "#ff69b4", + "indianred ": "#cd5c5c", + "indigo ": "#4b0082", + "ivory": "#fffff0", + "khaki": "#f0e68c", + "lavender": "#e6e6fa", + "lavenderblush": "#fff0f5", + "lawngreen": "#7cfc00", + "lemonchiffon": "#fffacd", + "lightblue": "#add8e6", + "lightcoral": "#f08080", + "lightcyan": "#e0ffff", + "lightgoldenrodyellow": "#fafad2", + "lightgrey": "#d3d3d3", + "lightgreen": "#90ee90", + "lightpink": "#ffb6c1", + "lightsalmon": "#ffa07a", + "lightseagreen": "#20b2aa", + "lightskyblue": "#87cefa", + "lightslategray": "#778899", + "lightsteelblue": "#b0c4de", + "lightyellow": "#ffffe0", + "lime": "#00ff00", + "limegreen": "#32cd32", + "linen": "#faf0e6", + "magenta": "#ff00ff", + "maroon": "#800000", + "mediumaquamarine": "#66cdaa", + "mediumblue": "#0000cd", + "mediumorchid": "#ba55d3", + "mediumpurple": "#9370d8", + "mediumseagreen": "#3cb371", + "mediumslateblue": "#7b68ee", + "mediumspringgreen": "#00fa9a", + "mediumturquoise": "#48d1cc", + "mediumvioletred": "#c71585", + "midnightblue": "#191970", + "mintcream": "#f5fffa", + "mistyrose": "#ffe4e1", + "moccasin": "#ffe4b5", + "navajowhite": "#ffdead", + "navy": "#000080", + "oldlace": "#fdf5e6", + "olive": "#808000", + "olivedrab": "#6b8e23", + "orange": "#ffa500", + "orangered": "#ff4500", + "orchid": "#da70d6", + "palegoldenrod": "#eee8aa", + "palegreen": "#98fb98", + "paleturquoise": "#afeeee", + "palevioletred": "#d87093", + "papayawhip": "#ffefd5", + "peachpuff": "#ffdab9", + "peru": "#cd853f", + "pink": "#ffc0cb", + "plum": "#dda0dd", + "powderblue": "#b0e0e6", + "purple": "#800080", + "red": "#ff0000", + "rosybrown": "#bc8f8f", + "royalblue": "#4169e1", + "saddlebrown": "#8b4513", + "salmon": "#fa8072", + "sandybrown": "#f4a460", + "seagreen": "#2e8b57", + "seashell": "#fff5ee", + "sienna": "#a0522d", + "silver": "#c0c0c0", + "skyblue": "#87ceeb", + "slateblue": "#6a5acd", + "slategray": "#708090", + "snow": "#fffafa", + "springgreen": "#00ff7f", + "steelblue": "#4682b4", + "tan": "#d2b48c", + "teal": "#008080", + "thistle": "#d8bfd8", + "tomato": "#ff6347", + "turquoise": "#40e0d0", + "violet": "#ee82ee", + "wheat": "#f5deb3", + "white": "#ffffff", + "whitesmoke": "#f5f5f5", + "yellow": "#ffff00", + "yellowgreen": "#9acd32" + }; + + if (typeof colors[name.toLowerCase()] !== 'undefined') { + return colors[name.toLowerCase()]; + } + return false; + } + }; + + + var defaults = { + horizontal: false, // horizontal mode layout ? + inline: false, //forces to show the colorpicker as an inline element + color: false, //forces a color + format: false, //forces a format + input: 'input', // children input selector + container: false, // container selector + component: '.add-on, .input-group-addon', // children component selector + sliders: { + saturation: { + maxLeft: 100, + maxTop: 100, + callLeft: 'setSaturation', + callTop: 'setBrightness' + }, + hue: { + maxLeft: 0, + maxTop: 100, + callLeft: false, + callTop: 'setHue' + }, + alpha: { + maxLeft: 0, + maxTop: 100, + callLeft: false, + callTop: 'setAlpha' + } + }, + slidersHorz: { + saturation: { + maxLeft: 100, + maxTop: 100, + callLeft: 'setSaturation', + callTop: 'setBrightness' + }, + hue: { + maxLeft: 100, + maxTop: 0, + callLeft: 'setHue', + callTop: false + }, + alpha: { + maxLeft: 100, + maxTop: 0, + callLeft: 'setAlpha', + callTop: false + } + }, + template: '
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NamePositionOfficeAgeStart dateSalary
    NamePositionOfficeAgeStart dateSalary
    Tiger NixonSystem ArchitectEdinburgh612011/04/25$320,800
    Garrett WintersAccountantTokyo632011/07/25$170,750
    Ashton CoxJunior Technical AuthorSan Francisco662009/01/12$86,000
    Cedric KellySenior Javascript DeveloperEdinburgh222012/03/29$433,060
    Airi SatouAccountantTokyo332008/11/28$162,700
    Brielle WilliamsonIntegration SpecialistNew York612012/12/02$372,000
    Herrod ChandlerSales AssistantSan Francisco592012/08/06$137,500
    Rhona DavidsonIntegration SpecialistTokyo552010/10/14$327,900
    Colleen HurstJavascript DeveloperSan Francisco392009/09/15$205,500
    Sonya FrostSoftware EngineerEdinburgh232008/12/13$103,600
    Jena GainesOffice ManagerLondon302008/12/19$90,560
    Quinn FlynnSupport LeadEdinburgh222013/03/03$342,000
    Charde MarshallRegional DirectorSan Francisco362008/10/16$470,600
    Haley KennedySenior Marketing DesignerLondon432012/12/18$313,500
    Tatyana FitzpatrickRegional DirectorLondon192010/03/17$385,750
    Michael SilvaMarketing DesignerLondon662012/11/27$198,500
    Paul ByrdChief Financial Officer (CFO)New York642010/06/09$725,000
    Gloria LittleSystems AdministratorNew York592009/04/10$237,500
    Bradley GreerSoftware EngineerLondon412012/10/13$132,000
    Dai RiosPersonnel LeadEdinburgh352012/09/26$217,500
    Jenette CaldwellDevelopment LeadNew York302011/09/03$345,000
    Yuri BerryChief Marketing Officer (CMO)New York402009/06/25$675,000
    Caesar VancePre-Sales SupportNew York212011/12/12$106,450
    Doris WilderSales AssistantSidney232010/09/20$85,600
    Angelica RamosChief Executive Officer (CEO)London472009/10/09$1,200,000
    Gavin JoyceDeveloperEdinburgh422010/12/22$92,575
    Jennifer ChangRegional DirectorSingapore282010/11/14$357,650
    Brenden WagnerSoftware EngineerSan Francisco282011/06/07$206,850
    Fiona GreenChief Operating Officer (COO)San Francisco482010/03/11$850,000
    Shou ItouRegional MarketingTokyo202011/08/14$163,000
    Michelle HouseIntegration SpecialistSidney372011/06/02$95,400
    Suki BurksDeveloperLondon532009/10/22$114,500
    Prescott BartlettTechnical AuthorLondon272011/05/07$145,000
    Gavin CortezTeam LeaderSan Francisco222008/10/26$235,500
    Martena MccrayPost-Sales supportEdinburgh462011/03/09$324,050
    Unity ButlerMarketing DesignerSan Francisco472009/12/09$85,675
    Howard HatfieldOffice ManagerSan Francisco512008/12/16$164,500
    Hope FuentesSecretarySan Francisco412010/02/12$109,850
    Vivian HarrellFinancial ControllerSan Francisco622009/02/14$452,500
    Timothy MooneyOffice ManagerLondon372008/12/11$136,200
    Jackson BradshawDirectorNew York652008/09/26$645,750
    Olivia LiangSupport EngineerSingapore642011/02/03$234,500
    Bruno NashSoftware EngineerLondon382011/05/03$163,500
    Sakura YamamotoSupport EngineerTokyo372009/08/19$139,575
    Thor WaltonDeveloperNew York612013/08/11$98,540
    Finn CamachoSupport EngineerSan Francisco472009/07/07$87,500
    Serge BaldwinData CoordinatorSingapore642012/04/09$138,575
    Zenaida FrankSoftware EngineerNew York632010/01/04$125,250
    Zorita SerranoSoftware EngineerSan Francisco562012/06/01$115,000
    Jennifer AcostaJunior Javascript DeveloperEdinburgh432013/02/01$75,650
    Cara StevensSales AssistantNew York462011/12/06$145,600
    Hermione ButlerRegional DirectorLondon472011/03/21$356,250
    Lael GreerSystems AdministratorLondon212009/02/27$103,500
    Jonas AlexanderDeveloperSan Francisco302010/07/14$86,500
    Shad DeckerRegional DirectorEdinburgh512008/11/13$183,000
    Michael BruceJavascript DeveloperSingapore292011/06/27$183,000
    Donna SniderCustomer SupportNew York272011/01/25$112,000
    + +
      +
    • Javascript
    • +
    • HTML
    • +
    • CSS
    • +
    • Ajax
    • +
    • Server-side script
    • +
    + +
    +
    +

    The Javascript shown below is used to initialise the table shown in this + example:

    $(document).ready(function() { + var table = $('#example').dataTable(); + + new $.fn.dataTable.AutoFill( table, { + "columnDefs": [ + { enable: false, targets: [-1, -2] }, + { increment: false, targets: 3 } + ] + } ); +} ); + +

    In addition to the above code, the following Javascript library files are loaded for use in this + example:

    + + +
    + +
    +

    The HTML shown below is the raw HTML table element, before it has been enhanced by + DataTables:

    +
    + +
    +
    +

    This example uses a little bit of additional CSS beyond what is loaded from the library + files (below), in order to correctly display the table. The additional CSS used is shown + below:

    +
    + +

    The following CSS library files are loaded for use in this example to provide the styling of the + table:

    + + +
    + +
    +

    This table loads data by Ajax. The latest data that has been loaded is shown below. This data + will update automatically as any additional data is loaded.

    +
    + +
    +

    The script used to perform the server-side processing for this table is shown below. Please note + that this is just an example script using PHP. Server-side processing scripts can be written in any + language, using the protocol described in the + DataTables documentation.

    +
    +
    + + + +
    + +
    + + \ No newline at end of file diff --git a/public/assets/js/plugins/datatables/extensions/AutoFill/examples/complete-callback.html b/public/assets/js/plugins/datatables/extensions/AutoFill/examples/complete-callback.html new file mode 100755 index 0000000000..2076d4f20b --- /dev/null +++ b/public/assets/js/plugins/datatables/extensions/AutoFill/examples/complete-callback.html @@ -0,0 +1,652 @@ + + + + + + + + AutoFill example - Complete callback + + + + + + + + + + + + + + +
    +
    +

    AutoFill example Complete callback

    + +
    +

    AutoFill provides a number of customisable callback functions so you can tailor it's actions to + exactly what you need. This example shows the use of the complete callback function which + is executed at the end of an auto-fill drag, providing information about the cells that were + altered.

    + +

    For a complete description of the complete callback, please refer to the AutoFill documentation.

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NamePositionOfficeAgeStart dateSalary
    NamePositionOfficeAgeStart dateSalary
    Tiger NixonSystem ArchitectEdinburgh612011/04/25$320,800
    Garrett WintersAccountantTokyo632011/07/25$170,750
    Ashton CoxJunior Technical AuthorSan Francisco662009/01/12$86,000
    Cedric KellySenior Javascript DeveloperEdinburgh222012/03/29$433,060
    Airi SatouAccountantTokyo332008/11/28$162,700
    Brielle WilliamsonIntegration SpecialistNew York612012/12/02$372,000
    Herrod ChandlerSales AssistantSan Francisco592012/08/06$137,500
    Rhona DavidsonIntegration SpecialistTokyo552010/10/14$327,900
    Colleen HurstJavascript DeveloperSan Francisco392009/09/15$205,500
    Sonya FrostSoftware EngineerEdinburgh232008/12/13$103,600
    Jena GainesOffice ManagerLondon302008/12/19$90,560
    Quinn FlynnSupport LeadEdinburgh222013/03/03$342,000
    Charde MarshallRegional DirectorSan Francisco362008/10/16$470,600
    Haley KennedySenior Marketing DesignerLondon432012/12/18$313,500
    Tatyana FitzpatrickRegional DirectorLondon192010/03/17$385,750
    Michael SilvaMarketing DesignerLondon662012/11/27$198,500
    Paul ByrdChief Financial Officer (CFO)New York642010/06/09$725,000
    Gloria LittleSystems AdministratorNew York592009/04/10$237,500
    Bradley GreerSoftware EngineerLondon412012/10/13$132,000
    Dai RiosPersonnel LeadEdinburgh352012/09/26$217,500
    Jenette CaldwellDevelopment LeadNew York302011/09/03$345,000
    Yuri BerryChief Marketing Officer (CMO)New York402009/06/25$675,000
    Caesar VancePre-Sales SupportNew York212011/12/12$106,450
    Doris WilderSales AssistantSidney232010/09/20$85,600
    Angelica RamosChief Executive Officer (CEO)London472009/10/09$1,200,000
    Gavin JoyceDeveloperEdinburgh422010/12/22$92,575
    Jennifer ChangRegional DirectorSingapore282010/11/14$357,650
    Brenden WagnerSoftware EngineerSan Francisco282011/06/07$206,850
    Fiona GreenChief Operating Officer (COO)San Francisco482010/03/11$850,000
    Shou ItouRegional MarketingTokyo202011/08/14$163,000
    Michelle HouseIntegration SpecialistSidney372011/06/02$95,400
    Suki BurksDeveloperLondon532009/10/22$114,500
    Prescott BartlettTechnical AuthorLondon272011/05/07$145,000
    Gavin CortezTeam LeaderSan Francisco222008/10/26$235,500
    Martena MccrayPost-Sales supportEdinburgh462011/03/09$324,050
    Unity ButlerMarketing DesignerSan Francisco472009/12/09$85,675
    Howard HatfieldOffice ManagerSan Francisco512008/12/16$164,500
    Hope FuentesSecretarySan Francisco412010/02/12$109,850
    Vivian HarrellFinancial ControllerSan Francisco622009/02/14$452,500
    Timothy MooneyOffice ManagerLondon372008/12/11$136,200
    Jackson BradshawDirectorNew York652008/09/26$645,750
    Olivia LiangSupport EngineerSingapore642011/02/03$234,500
    Bruno NashSoftware EngineerLondon382011/05/03$163,500
    Sakura YamamotoSupport EngineerTokyo372009/08/19$139,575
    Thor WaltonDeveloperNew York612013/08/11$98,540
    Finn CamachoSupport EngineerSan Francisco472009/07/07$87,500
    Serge BaldwinData CoordinatorSingapore642012/04/09$138,575
    Zenaida FrankSoftware EngineerNew York632010/01/04$125,250
    Zorita SerranoSoftware EngineerSan Francisco562012/06/01$115,000
    Jennifer AcostaJunior Javascript DeveloperEdinburgh432013/02/01$75,650
    Cara StevensSales AssistantNew York462011/12/06$145,600
    Hermione ButlerRegional DirectorLondon472011/03/21$356,250
    Lael GreerSystems AdministratorLondon212009/02/27$103,500
    Jonas AlexanderDeveloperSan Francisco302010/07/14$86,500
    Shad DeckerRegional DirectorEdinburgh512008/11/13$183,000
    Michael BruceJavascript DeveloperSingapore292011/06/27$183,000
    Donna SniderCustomer SupportNew York272011/01/25$112,000
    + +
      +
    • Javascript
    • +
    • HTML
    • +
    • CSS
    • +
    • Ajax
    • +
    • Server-side script
    • +
    + +
    +
    +

    The Javascript shown below is used to initialise the table shown in this + example:

    $(document).ready(function() { + var table = $('#example').dataTable(); + + new $.fn.dataTable.AutoFill( table, { + complete: function ( altered ) { + var last = altered[ altered.length-1 ]; + alert( + altered.length+' cells were altered in this auto-fill. The '+ + 'value of the last cell altered was: '+last.oldValue+' and is '+ + 'now '+last.newValue + ); + } + } ); +} ); + +

    In addition to the above code, the following Javascript library files are loaded for use in this + example:

    + + +
    + +
    +

    The HTML shown below is the raw HTML table element, before it has been enhanced by + DataTables:

    +
    + +
    +
    +

    This example uses a little bit of additional CSS beyond what is loaded from the library + files (below), in order to correctly display the table. The additional CSS used is shown + below:

    +
    + +

    The following CSS library files are loaded for use in this example to provide the styling of the + table:

    + + +
    + +
    +

    This table loads data by Ajax. The latest data that has been loaded is shown below. This data + will update automatically as any additional data is loaded.

    +
    + +
    +

    The script used to perform the server-side processing for this table is shown below. Please note + that this is just an example script using PHP. Server-side processing scripts can be written in any + language, using the protocol described in the + DataTables documentation.

    +
    +
    +
    +
    + +
    + +
    + + \ No newline at end of file diff --git a/public/assets/js/plugins/datatables/extensions/AutoFill/examples/fill-both.html b/public/assets/js/plugins/datatables/extensions/AutoFill/examples/fill-both.html new file mode 100755 index 0000000000..f65076e198 --- /dev/null +++ b/public/assets/js/plugins/datatables/extensions/AutoFill/examples/fill-both.html @@ -0,0 +1,641 @@ + + + + + + + + AutoFill example - Horizontal and vertical fill + + + + + + + + + + + + + + +
    +
    +

    AutoFill example Horizontal and vertical fill

    + +
    +

    By default AutoFill will allow the fill to operate only on a single column at a time (i.e. + vertically). However, it has the ability to provide the fill either horizontally, over both axis or + limited to just one axis depending on the direction of the drag. This option is provided by the + mode sanitisation option.

    + +

    In this case it is set to both (i.e. both horizontal and vertical axis) to provide the + filler along a row, rather than a column.

    + +

    For the full range of options and syntax for mode please refer to the AutoFill documentation.

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NamePositionOfficeAgeStart dateSalary
    NamePositionOfficeAgeStart dateSalary
    Tiger NixonSystem ArchitectEdinburgh612011/04/25$320,800
    Garrett WintersAccountantTokyo632011/07/25$170,750
    Ashton CoxJunior Technical AuthorSan Francisco662009/01/12$86,000
    Cedric KellySenior Javascript DeveloperEdinburgh222012/03/29$433,060
    Airi SatouAccountantTokyo332008/11/28$162,700
    Brielle WilliamsonIntegration SpecialistNew York612012/12/02$372,000
    Herrod ChandlerSales AssistantSan Francisco592012/08/06$137,500
    Rhona DavidsonIntegration SpecialistTokyo552010/10/14$327,900
    Colleen HurstJavascript DeveloperSan Francisco392009/09/15$205,500
    Sonya FrostSoftware EngineerEdinburgh232008/12/13$103,600
    Jena GainesOffice ManagerLondon302008/12/19$90,560
    Quinn FlynnSupport LeadEdinburgh222013/03/03$342,000
    Charde MarshallRegional DirectorSan Francisco362008/10/16$470,600
    Haley KennedySenior Marketing DesignerLondon432012/12/18$313,500
    Tatyana FitzpatrickRegional DirectorLondon192010/03/17$385,750
    Michael SilvaMarketing DesignerLondon662012/11/27$198,500
    Paul ByrdChief Financial Officer (CFO)New York642010/06/09$725,000
    Gloria LittleSystems AdministratorNew York592009/04/10$237,500
    Bradley GreerSoftware EngineerLondon412012/10/13$132,000
    Dai RiosPersonnel LeadEdinburgh352012/09/26$217,500
    Jenette CaldwellDevelopment LeadNew York302011/09/03$345,000
    Yuri BerryChief Marketing Officer (CMO)New York402009/06/25$675,000
    Caesar VancePre-Sales SupportNew York212011/12/12$106,450
    Doris WilderSales AssistantSidney232010/09/20$85,600
    Angelica RamosChief Executive Officer (CEO)London472009/10/09$1,200,000
    Gavin JoyceDeveloperEdinburgh422010/12/22$92,575
    Jennifer ChangRegional DirectorSingapore282010/11/14$357,650
    Brenden WagnerSoftware EngineerSan Francisco282011/06/07$206,850
    Fiona GreenChief Operating Officer (COO)San Francisco482010/03/11$850,000
    Shou ItouRegional MarketingTokyo202011/08/14$163,000
    Michelle HouseIntegration SpecialistSidney372011/06/02$95,400
    Suki BurksDeveloperLondon532009/10/22$114,500
    Prescott BartlettTechnical AuthorLondon272011/05/07$145,000
    Gavin CortezTeam LeaderSan Francisco222008/10/26$235,500
    Martena MccrayPost-Sales supportEdinburgh462011/03/09$324,050
    Unity ButlerMarketing DesignerSan Francisco472009/12/09$85,675
    Howard HatfieldOffice ManagerSan Francisco512008/12/16$164,500
    Hope FuentesSecretarySan Francisco412010/02/12$109,850
    Vivian HarrellFinancial ControllerSan Francisco622009/02/14$452,500
    Timothy MooneyOffice ManagerLondon372008/12/11$136,200
    Jackson BradshawDirectorNew York652008/09/26$645,750
    Olivia LiangSupport EngineerSingapore642011/02/03$234,500
    Bruno NashSoftware EngineerLondon382011/05/03$163,500
    Sakura YamamotoSupport EngineerTokyo372009/08/19$139,575
    Thor WaltonDeveloperNew York612013/08/11$98,540
    Finn CamachoSupport EngineerSan Francisco472009/07/07$87,500
    Serge BaldwinData CoordinatorSingapore642012/04/09$138,575
    Zenaida FrankSoftware EngineerNew York632010/01/04$125,250
    Zorita SerranoSoftware EngineerSan Francisco562012/06/01$115,000
    Jennifer AcostaJunior Javascript DeveloperEdinburgh432013/02/01$75,650
    Cara StevensSales AssistantNew York462011/12/06$145,600
    Hermione ButlerRegional DirectorLondon472011/03/21$356,250
    Lael GreerSystems AdministratorLondon212009/02/27$103,500
    Jonas AlexanderDeveloperSan Francisco302010/07/14$86,500
    Shad DeckerRegional DirectorEdinburgh512008/11/13$183,000
    Michael BruceJavascript DeveloperSingapore292011/06/27$183,000
    Donna SniderCustomer SupportNew York272011/01/25$112,000
    + +
      +
    • Javascript
    • +
    • HTML
    • +
    • CSS
    • +
    • Ajax
    • +
    • Server-side script
    • +
    + +
    +
    +

    The Javascript shown below is used to initialise the table shown in this + example:

    $(document).ready(function() { + var table = $('#example').DataTable(); + + new $.fn.dataTable.AutoFill( table, { + mode: 'both' + } ); +} ); + +

    In addition to the above code, the following Javascript library files are loaded for use in this + example:

    + + +
    + +
    +

    The HTML shown below is the raw HTML table element, before it has been enhanced by + DataTables:

    +
    + +
    +
    +

    This example uses a little bit of additional CSS beyond what is loaded from the library + files (below), in order to correctly display the table. The additional CSS used is shown + below:

    +
    + +

    The following CSS library files are loaded for use in this example to provide the styling of the + table:

    + + +
    + +
    +

    This table loads data by Ajax. The latest data that has been loaded is shown below. This data + will update automatically as any additional data is loaded.

    +
    + +
    +

    The script used to perform the server-side processing for this table is shown below. Please note + that this is just an example script using PHP. Server-side processing scripts can be written in any + language, using the protocol described in the + DataTables documentation.

    +
    +
    +
    +
    + +
    + +
    + + \ No newline at end of file diff --git a/public/assets/js/plugins/datatables/extensions/AutoFill/examples/fill-horizontal.html b/public/assets/js/plugins/datatables/extensions/AutoFill/examples/fill-horizontal.html new file mode 100755 index 0000000000..13cadac9c6 --- /dev/null +++ b/public/assets/js/plugins/datatables/extensions/AutoFill/examples/fill-horizontal.html @@ -0,0 +1,641 @@ + + + + + + + + AutoFill example - Horizontal fill + + + + + + + + + + + + + + +
    +
    +

    AutoFill example Horizontal fill

    + +
    +

    By default AutoFill will allow the fill to operate only on a single column at a time (i.e. + vertically). However, it has the ability to provide the fill either horizontally, over both axis or + limited to just one axis depending on the direction of the drag. This option is provided by the + mode sanitisation option.

    + +

    In this case it is set to x (i.e. horizontal axis) to provide the filler along a row, + rather than a column.

    + +

    For the full range of options and syntax for mode please refer to the AutoFill documentation.

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NamePositionOfficeAgeStart dateSalary
    NamePositionOfficeAgeStart dateSalary
    Tiger NixonSystem ArchitectEdinburgh612011/04/25$320,800
    Garrett WintersAccountantTokyo632011/07/25$170,750
    Ashton CoxJunior Technical AuthorSan Francisco662009/01/12$86,000
    Cedric KellySenior Javascript DeveloperEdinburgh222012/03/29$433,060
    Airi SatouAccountantTokyo332008/11/28$162,700
    Brielle WilliamsonIntegration SpecialistNew York612012/12/02$372,000
    Herrod ChandlerSales AssistantSan Francisco592012/08/06$137,500
    Rhona DavidsonIntegration SpecialistTokyo552010/10/14$327,900
    Colleen HurstJavascript DeveloperSan Francisco392009/09/15$205,500
    Sonya FrostSoftware EngineerEdinburgh232008/12/13$103,600
    Jena GainesOffice ManagerLondon302008/12/19$90,560
    Quinn FlynnSupport LeadEdinburgh222013/03/03$342,000
    Charde MarshallRegional DirectorSan Francisco362008/10/16$470,600
    Haley KennedySenior Marketing DesignerLondon432012/12/18$313,500
    Tatyana FitzpatrickRegional DirectorLondon192010/03/17$385,750
    Michael SilvaMarketing DesignerLondon662012/11/27$198,500
    Paul ByrdChief Financial Officer (CFO)New York642010/06/09$725,000
    Gloria LittleSystems AdministratorNew York592009/04/10$237,500
    Bradley GreerSoftware EngineerLondon412012/10/13$132,000
    Dai RiosPersonnel LeadEdinburgh352012/09/26$217,500
    Jenette CaldwellDevelopment LeadNew York302011/09/03$345,000
    Yuri BerryChief Marketing Officer (CMO)New York402009/06/25$675,000
    Caesar VancePre-Sales SupportNew York212011/12/12$106,450
    Doris WilderSales AssistantSidney232010/09/20$85,600
    Angelica RamosChief Executive Officer (CEO)London472009/10/09$1,200,000
    Gavin JoyceDeveloperEdinburgh422010/12/22$92,575
    Jennifer ChangRegional DirectorSingapore282010/11/14$357,650
    Brenden WagnerSoftware EngineerSan Francisco282011/06/07$206,850
    Fiona GreenChief Operating Officer (COO)San Francisco482010/03/11$850,000
    Shou ItouRegional MarketingTokyo202011/08/14$163,000
    Michelle HouseIntegration SpecialistSidney372011/06/02$95,400
    Suki BurksDeveloperLondon532009/10/22$114,500
    Prescott BartlettTechnical AuthorLondon272011/05/07$145,000
    Gavin CortezTeam LeaderSan Francisco222008/10/26$235,500
    Martena MccrayPost-Sales supportEdinburgh462011/03/09$324,050
    Unity ButlerMarketing DesignerSan Francisco472009/12/09$85,675
    Howard HatfieldOffice ManagerSan Francisco512008/12/16$164,500
    Hope FuentesSecretarySan Francisco412010/02/12$109,850
    Vivian HarrellFinancial ControllerSan Francisco622009/02/14$452,500
    Timothy MooneyOffice ManagerLondon372008/12/11$136,200
    Jackson BradshawDirectorNew York652008/09/26$645,750
    Olivia LiangSupport EngineerSingapore642011/02/03$234,500
    Bruno NashSoftware EngineerLondon382011/05/03$163,500
    Sakura YamamotoSupport EngineerTokyo372009/08/19$139,575
    Thor WaltonDeveloperNew York612013/08/11$98,540
    Finn CamachoSupport EngineerSan Francisco472009/07/07$87,500
    Serge BaldwinData CoordinatorSingapore642012/04/09$138,575
    Zenaida FrankSoftware EngineerNew York632010/01/04$125,250
    Zorita SerranoSoftware EngineerSan Francisco562012/06/01$115,000
    Jennifer AcostaJunior Javascript DeveloperEdinburgh432013/02/01$75,650
    Cara StevensSales AssistantNew York462011/12/06$145,600
    Hermione ButlerRegional DirectorLondon472011/03/21$356,250
    Lael GreerSystems AdministratorLondon212009/02/27$103,500
    Jonas AlexanderDeveloperSan Francisco302010/07/14$86,500
    Shad DeckerRegional DirectorEdinburgh512008/11/13$183,000
    Michael BruceJavascript DeveloperSingapore292011/06/27$183,000
    Donna SniderCustomer SupportNew York272011/01/25$112,000
    + +
      +
    • Javascript
    • +
    • HTML
    • +
    • CSS
    • +
    • Ajax
    • +
    • Server-side script
    • +
    + +
    +
    +

    The Javascript shown below is used to initialise the table shown in this + example:

    $(document).ready(function() { + var table = $('#example').DataTable(); + + new $.fn.dataTable.AutoFill( table, { + mode: 'x' + } ); +} ); + +

    In addition to the above code, the following Javascript library files are loaded for use in this + example:

    + + +
    + +
    +

    The HTML shown below is the raw HTML table element, before it has been enhanced by + DataTables:

    +
    + +
    +
    +

    This example uses a little bit of additional CSS beyond what is loaded from the library + files (below), in order to correctly display the table. The additional CSS used is shown + below:

    +
    + +

    The following CSS library files are loaded for use in this example to provide the styling of the + table:

    + + +
    + +
    +

    This table loads data by Ajax. The latest data that has been loaded is shown below. This data + will update automatically as any additional data is loaded.

    +
    + +
    +

    The script used to perform the server-side processing for this table is shown below. Please note + that this is just an example script using PHP. Server-side processing scripts can be written in any + language, using the protocol described in the + DataTables documentation.

    +
    +
    +
    +
    + +
    + +
    + + \ No newline at end of file diff --git a/public/assets/js/plugins/datatables/extensions/AutoFill/examples/index.html b/public/assets/js/plugins/datatables/extensions/AutoFill/examples/index.html new file mode 100755 index 0000000000..9cade86c27 --- /dev/null +++ b/public/assets/js/plugins/datatables/extensions/AutoFill/examples/index.html @@ -0,0 +1,66 @@ + + + + + + + + + + + + + AutoFill examples - AutoFill examples + + + +
    +
    +

    AutoFill example AutoFill examples

    + +
    +

    AutoFill gives an Excel like option to a DataTable to click and drag over multiple cells, filling in + information over the selected cells and incrementing numbers as needed.

    + +

    Thanks to Phoniax AS for their sponsorship of this plug-in for + DataTables.

    +
    +
    +
    + +
    + +
    + + \ No newline at end of file diff --git a/public/assets/js/plugins/datatables/extensions/AutoFill/examples/scrolling.html b/public/assets/js/plugins/datatables/extensions/AutoFill/examples/scrolling.html new file mode 100755 index 0000000000..66871ec7f0 --- /dev/null +++ b/public/assets/js/plugins/datatables/extensions/AutoFill/examples/scrolling.html @@ -0,0 +1,638 @@ + + + + + + + + AutoFill example - Scrolling DataTable + + + + + + + + + + + + + + +
    +
    +

    AutoFill example Scrolling DataTable

    + +
    +

    When dragging an AutoFill handle, the table (if DataTables scrolling is enabled) or the window will + be automatically scrolled, as you approach the edge of the scrolling component. The example below shows + the effect with DataTables scrolling (and also window if needed).

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NamePositionOfficeAgeStart dateSalary
    NamePositionOfficeAgeStart dateSalary
    Tiger NixonSystem ArchitectEdinburgh612011/04/25$320,800
    Garrett WintersAccountantTokyo632011/07/25$170,750
    Ashton CoxJunior Technical AuthorSan Francisco662009/01/12$86,000
    Cedric KellySenior Javascript DeveloperEdinburgh222012/03/29$433,060
    Airi SatouAccountantTokyo332008/11/28$162,700
    Brielle WilliamsonIntegration SpecialistNew York612012/12/02$372,000
    Herrod ChandlerSales AssistantSan Francisco592012/08/06$137,500
    Rhona DavidsonIntegration SpecialistTokyo552010/10/14$327,900
    Colleen HurstJavascript DeveloperSan Francisco392009/09/15$205,500
    Sonya FrostSoftware EngineerEdinburgh232008/12/13$103,600
    Jena GainesOffice ManagerLondon302008/12/19$90,560
    Quinn FlynnSupport LeadEdinburgh222013/03/03$342,000
    Charde MarshallRegional DirectorSan Francisco362008/10/16$470,600
    Haley KennedySenior Marketing DesignerLondon432012/12/18$313,500
    Tatyana FitzpatrickRegional DirectorLondon192010/03/17$385,750
    Michael SilvaMarketing DesignerLondon662012/11/27$198,500
    Paul ByrdChief Financial Officer (CFO)New York642010/06/09$725,000
    Gloria LittleSystems AdministratorNew York592009/04/10$237,500
    Bradley GreerSoftware EngineerLondon412012/10/13$132,000
    Dai RiosPersonnel LeadEdinburgh352012/09/26$217,500
    Jenette CaldwellDevelopment LeadNew York302011/09/03$345,000
    Yuri BerryChief Marketing Officer (CMO)New York402009/06/25$675,000
    Caesar VancePre-Sales SupportNew York212011/12/12$106,450
    Doris WilderSales AssistantSidney232010/09/20$85,600
    Angelica RamosChief Executive Officer (CEO)London472009/10/09$1,200,000
    Gavin JoyceDeveloperEdinburgh422010/12/22$92,575
    Jennifer ChangRegional DirectorSingapore282010/11/14$357,650
    Brenden WagnerSoftware EngineerSan Francisco282011/06/07$206,850
    Fiona GreenChief Operating Officer (COO)San Francisco482010/03/11$850,000
    Shou ItouRegional MarketingTokyo202011/08/14$163,000
    Michelle HouseIntegration SpecialistSidney372011/06/02$95,400
    Suki BurksDeveloperLondon532009/10/22$114,500
    Prescott BartlettTechnical AuthorLondon272011/05/07$145,000
    Gavin CortezTeam LeaderSan Francisco222008/10/26$235,500
    Martena MccrayPost-Sales supportEdinburgh462011/03/09$324,050
    Unity ButlerMarketing DesignerSan Francisco472009/12/09$85,675
    Howard HatfieldOffice ManagerSan Francisco512008/12/16$164,500
    Hope FuentesSecretarySan Francisco412010/02/12$109,850
    Vivian HarrellFinancial ControllerSan Francisco622009/02/14$452,500
    Timothy MooneyOffice ManagerLondon372008/12/11$136,200
    Jackson BradshawDirectorNew York652008/09/26$645,750
    Olivia LiangSupport EngineerSingapore642011/02/03$234,500
    Bruno NashSoftware EngineerLondon382011/05/03$163,500
    Sakura YamamotoSupport EngineerTokyo372009/08/19$139,575
    Thor WaltonDeveloperNew York612013/08/11$98,540
    Finn CamachoSupport EngineerSan Francisco472009/07/07$87,500
    Serge BaldwinData CoordinatorSingapore642012/04/09$138,575
    Zenaida FrankSoftware EngineerNew York632010/01/04$125,250
    Zorita SerranoSoftware EngineerSan Francisco562012/06/01$115,000
    Jennifer AcostaJunior Javascript DeveloperEdinburgh432013/02/01$75,650
    Cara StevensSales AssistantNew York462011/12/06$145,600
    Hermione ButlerRegional DirectorLondon472011/03/21$356,250
    Lael GreerSystems AdministratorLondon212009/02/27$103,500
    Jonas AlexanderDeveloperSan Francisco302010/07/14$86,500
    Shad DeckerRegional DirectorEdinburgh512008/11/13$183,000
    Michael BruceJavascript DeveloperSingapore292011/06/27$183,000
    Donna SniderCustomer SupportNew York272011/01/25$112,000
    + +
      +
    • Javascript
    • +
    • HTML
    • +
    • CSS
    • +
    • Ajax
    • +
    • Server-side script
    • +
    + +
    +
    +

    The Javascript shown below is used to initialise the table shown in this + example:

    $(document).ready(function() { + var table = $('#example').dataTable( { + scrollY: 200, + scrollCollapse: false, + paginate: false + } ); + + new $.fn.dataTable.AutoFill( table ); +} ); + +

    In addition to the above code, the following Javascript library files are loaded for use in this + example:

    + + +
    + +
    +

    The HTML shown below is the raw HTML table element, before it has been enhanced by + DataTables:

    +
    + +
    +
    +

    This example uses a little bit of additional CSS beyond what is loaded from the library + files (below), in order to correctly display the table. The additional CSS used is shown + below:

    +
    + +

    The following CSS library files are loaded for use in this example to provide the styling of the + table:

    + + +
    + +
    +

    This table loads data by Ajax. The latest data that has been loaded is shown below. This data + will update automatically as any additional data is loaded.

    +
    + +
    +

    The script used to perform the server-side processing for this table is shown below. Please note + that this is just an example script using PHP. Server-side processing scripts can be written in any + language, using the protocol described in the + DataTables documentation.

    +
    +
    +
    +
    + +
    + +
    + + \ No newline at end of file diff --git a/public/assets/js/plugins/datatables/extensions/AutoFill/examples/simple.html b/public/assets/js/plugins/datatables/extensions/AutoFill/examples/simple.html new file mode 100755 index 0000000000..ea3db498b4 --- /dev/null +++ b/public/assets/js/plugins/datatables/extensions/AutoFill/examples/simple.html @@ -0,0 +1,631 @@ + + + + + + + + AutoFill example - Basic initialisation + + + + + + + + + + + + + + +
    +
    +

    AutoFill example Basic initialisation

    + +
    +

    AutoFill gives an Excel like option to a DataTable to click and drag over multiple cells, filling in + information over the selected cells and incrementing numbers as needed.

    + +

    AutoFill is initialised using the $.fn.dataTable.AutoFill function as shown in the + example below. It requires one parameter, the DataTable instance that AutoFill is to operate on, and + optionally a second configuration parameter, which is shown in the other AutoFill examples.

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NamePositionOfficeAgeStart dateSalary
    NamePositionOfficeAgeStart dateSalary
    Tiger NixonSystem ArchitectEdinburgh612011/04/25$320,800
    Garrett WintersAccountantTokyo632011/07/25$170,750
    Ashton CoxJunior Technical AuthorSan Francisco662009/01/12$86,000
    Cedric KellySenior Javascript DeveloperEdinburgh222012/03/29$433,060
    Airi SatouAccountantTokyo332008/11/28$162,700
    Brielle WilliamsonIntegration SpecialistNew York612012/12/02$372,000
    Herrod ChandlerSales AssistantSan Francisco592012/08/06$137,500
    Rhona DavidsonIntegration SpecialistTokyo552010/10/14$327,900
    Colleen HurstJavascript DeveloperSan Francisco392009/09/15$205,500
    Sonya FrostSoftware EngineerEdinburgh232008/12/13$103,600
    Jena GainesOffice ManagerLondon302008/12/19$90,560
    Quinn FlynnSupport LeadEdinburgh222013/03/03$342,000
    Charde MarshallRegional DirectorSan Francisco362008/10/16$470,600
    Haley KennedySenior Marketing DesignerLondon432012/12/18$313,500
    Tatyana FitzpatrickRegional DirectorLondon192010/03/17$385,750
    Michael SilvaMarketing DesignerLondon662012/11/27$198,500
    Paul ByrdChief Financial Officer (CFO)New York642010/06/09$725,000
    Gloria LittleSystems AdministratorNew York592009/04/10$237,500
    Bradley GreerSoftware EngineerLondon412012/10/13$132,000
    Dai RiosPersonnel LeadEdinburgh352012/09/26$217,500
    Jenette CaldwellDevelopment LeadNew York302011/09/03$345,000
    Yuri BerryChief Marketing Officer (CMO)New York402009/06/25$675,000
    Caesar VancePre-Sales SupportNew York212011/12/12$106,450
    Doris WilderSales AssistantSidney232010/09/20$85,600
    Angelica RamosChief Executive Officer (CEO)London472009/10/09$1,200,000
    Gavin JoyceDeveloperEdinburgh422010/12/22$92,575
    Jennifer ChangRegional DirectorSingapore282010/11/14$357,650
    Brenden WagnerSoftware EngineerSan Francisco282011/06/07$206,850
    Fiona GreenChief Operating Officer (COO)San Francisco482010/03/11$850,000
    Shou ItouRegional MarketingTokyo202011/08/14$163,000
    Michelle HouseIntegration SpecialistSidney372011/06/02$95,400
    Suki BurksDeveloperLondon532009/10/22$114,500
    Prescott BartlettTechnical AuthorLondon272011/05/07$145,000
    Gavin CortezTeam LeaderSan Francisco222008/10/26$235,500
    Martena MccrayPost-Sales supportEdinburgh462011/03/09$324,050
    Unity ButlerMarketing DesignerSan Francisco472009/12/09$85,675
    Howard HatfieldOffice ManagerSan Francisco512008/12/16$164,500
    Hope FuentesSecretarySan Francisco412010/02/12$109,850
    Vivian HarrellFinancial ControllerSan Francisco622009/02/14$452,500
    Timothy MooneyOffice ManagerLondon372008/12/11$136,200
    Jackson BradshawDirectorNew York652008/09/26$645,750
    Olivia LiangSupport EngineerSingapore642011/02/03$234,500
    Bruno NashSoftware EngineerLondon382011/05/03$163,500
    Sakura YamamotoSupport EngineerTokyo372009/08/19$139,575
    Thor WaltonDeveloperNew York612013/08/11$98,540
    Finn CamachoSupport EngineerSan Francisco472009/07/07$87,500
    Serge BaldwinData CoordinatorSingapore642012/04/09$138,575
    Zenaida FrankSoftware EngineerNew York632010/01/04$125,250
    Zorita SerranoSoftware EngineerSan Francisco562012/06/01$115,000
    Jennifer AcostaJunior Javascript DeveloperEdinburgh432013/02/01$75,650
    Cara StevensSales AssistantNew York462011/12/06$145,600
    Hermione ButlerRegional DirectorLondon472011/03/21$356,250
    Lael GreerSystems AdministratorLondon212009/02/27$103,500
    Jonas AlexanderDeveloperSan Francisco302010/07/14$86,500
    Shad DeckerRegional DirectorEdinburgh512008/11/13$183,000
    Michael BruceJavascript DeveloperSingapore292011/06/27$183,000
    Donna SniderCustomer SupportNew York272011/01/25$112,000
    + +
      +
    • Javascript
    • +
    • HTML
    • +
    • CSS
    • +
    • Ajax
    • +
    • Server-side script
    • +
    + +
    +
    +

    The Javascript shown below is used to initialise the table shown in this + example:

    $(document).ready(function() { + var table = $('#example').DataTable(); + new $.fn.dataTable.AutoFill( table ); +} ); + +

    In addition to the above code, the following Javascript library files are loaded for use in this + example:

    + + +
    + +
    +

    The HTML shown below is the raw HTML table element, before it has been enhanced by + DataTables:

    +
    + +
    +
    +

    This example uses a little bit of additional CSS beyond what is loaded from the library + files (below), in order to correctly display the table. The additional CSS used is shown + below:

    +
    + +

    The following CSS library files are loaded for use in this example to provide the styling of the + table:

    + + +
    + +
    +

    This table loads data by Ajax. The latest data that has been loaded is shown below. This data + will update automatically as any additional data is loaded.

    +
    + +
    +

    The script used to perform the server-side processing for this table is shown below. Please note + that this is just an example script using PHP. Server-side processing scripts can be written in any + language, using the protocol described in the + DataTables documentation.

    +
    +
    +
    +
    + +
    + +
    + + \ No newline at end of file diff --git a/public/assets/js/plugins/datatables/extensions/AutoFill/examples/step-callback.html b/public/assets/js/plugins/datatables/extensions/AutoFill/examples/step-callback.html new file mode 100755 index 0000000000..c1255aaa25 --- /dev/null +++ b/public/assets/js/plugins/datatables/extensions/AutoFill/examples/step-callback.html @@ -0,0 +1,660 @@ + + + + + + + + AutoFill example - Step callback + + + + + + + + + + + + + + +
    +
    +

    AutoFill example Step callback

    + +
    +

    By default, AutoFill will increment cells that contain numbers by a single digit for each cell that + is iterated over (try the Age column below for example). This behaviour can be disabled + completely using the increment column option, but it can also be modified to suit your + requirements through use of the step column callback function.

    + +

    The step callback is executed for each cell in the auto-fill set and gives complete + control over how data is incremented. The example below shows the step function being used on the + Salary column to increment by 100, rather than 1 for each cell.

    + +

    For a complete description of the step callback, please refer to the AutoFill documentation.

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NamePositionOfficeAgeStart dateSalary
    NamePositionOfficeAgeStart dateSalary
    Tiger NixonSystem ArchitectEdinburgh612011/04/25$320,800
    Garrett WintersAccountantTokyo632011/07/25$170,750
    Ashton CoxJunior Technical AuthorSan Francisco662009/01/12$86,000
    Cedric KellySenior Javascript DeveloperEdinburgh222012/03/29$433,060
    Airi SatouAccountantTokyo332008/11/28$162,700
    Brielle WilliamsonIntegration SpecialistNew York612012/12/02$372,000
    Herrod ChandlerSales AssistantSan Francisco592012/08/06$137,500
    Rhona DavidsonIntegration SpecialistTokyo552010/10/14$327,900
    Colleen HurstJavascript DeveloperSan Francisco392009/09/15$205,500
    Sonya FrostSoftware EngineerEdinburgh232008/12/13$103,600
    Jena GainesOffice ManagerLondon302008/12/19$90,560
    Quinn FlynnSupport LeadEdinburgh222013/03/03$342,000
    Charde MarshallRegional DirectorSan Francisco362008/10/16$470,600
    Haley KennedySenior Marketing DesignerLondon432012/12/18$313,500
    Tatyana FitzpatrickRegional DirectorLondon192010/03/17$385,750
    Michael SilvaMarketing DesignerLondon662012/11/27$198,500
    Paul ByrdChief Financial Officer (CFO)New York642010/06/09$725,000
    Gloria LittleSystems AdministratorNew York592009/04/10$237,500
    Bradley GreerSoftware EngineerLondon412012/10/13$132,000
    Dai RiosPersonnel LeadEdinburgh352012/09/26$217,500
    Jenette CaldwellDevelopment LeadNew York302011/09/03$345,000
    Yuri BerryChief Marketing Officer (CMO)New York402009/06/25$675,000
    Caesar VancePre-Sales SupportNew York212011/12/12$106,450
    Doris WilderSales AssistantSidney232010/09/20$85,600
    Angelica RamosChief Executive Officer (CEO)London472009/10/09$1,200,000
    Gavin JoyceDeveloperEdinburgh422010/12/22$92,575
    Jennifer ChangRegional DirectorSingapore282010/11/14$357,650
    Brenden WagnerSoftware EngineerSan Francisco282011/06/07$206,850
    Fiona GreenChief Operating Officer (COO)San Francisco482010/03/11$850,000
    Shou ItouRegional MarketingTokyo202011/08/14$163,000
    Michelle HouseIntegration SpecialistSidney372011/06/02$95,400
    Suki BurksDeveloperLondon532009/10/22$114,500
    Prescott BartlettTechnical AuthorLondon272011/05/07$145,000
    Gavin CortezTeam LeaderSan Francisco222008/10/26$235,500
    Martena MccrayPost-Sales supportEdinburgh462011/03/09$324,050
    Unity ButlerMarketing DesignerSan Francisco472009/12/09$85,675
    Howard HatfieldOffice ManagerSan Francisco512008/12/16$164,500
    Hope FuentesSecretarySan Francisco412010/02/12$109,850
    Vivian HarrellFinancial ControllerSan Francisco622009/02/14$452,500
    Timothy MooneyOffice ManagerLondon372008/12/11$136,200
    Jackson BradshawDirectorNew York652008/09/26$645,750
    Olivia LiangSupport EngineerSingapore642011/02/03$234,500
    Bruno NashSoftware EngineerLondon382011/05/03$163,500
    Sakura YamamotoSupport EngineerTokyo372009/08/19$139,575
    Thor WaltonDeveloperNew York612013/08/11$98,540
    Finn CamachoSupport EngineerSan Francisco472009/07/07$87,500
    Serge BaldwinData CoordinatorSingapore642012/04/09$138,575
    Zenaida FrankSoftware EngineerNew York632010/01/04$125,250
    Zorita SerranoSoftware EngineerSan Francisco562012/06/01$115,000
    Jennifer AcostaJunior Javascript DeveloperEdinburgh432013/02/01$75,650
    Cara StevensSales AssistantNew York462011/12/06$145,600
    Hermione ButlerRegional DirectorLondon472011/03/21$356,250
    Lael GreerSystems AdministratorLondon212009/02/27$103,500
    Jonas AlexanderDeveloperSan Francisco302010/07/14$86,500
    Shad DeckerRegional DirectorEdinburgh512008/11/13$183,000
    Michael BruceJavascript DeveloperSingapore292011/06/27$183,000
    Donna SniderCustomer SupportNew York272011/01/25$112,000
    + +
      +
    • Javascript
    • +
    • HTML
    • +
    • CSS
    • +
    • Ajax
    • +
    • Server-side script
    • +
    + +
    +
    +

    The Javascript shown below is used to initialise the table shown in this + example:

    $(document).ready(function() { + var table = $('#example').dataTable(); + + new $.fn.dataTable.AutoFill( table, { + columnDefs: [ { + targets: -1, + step: function ( cell, read, last, i, x, y ) { + var val = parseInt( (last || read).replace(/[$,]/g, ''), 10 ); + val += (x<0 || y<0 ? -100 : 100); // - if going back up, + if going down + + // Format for the currency column + return '$'+val.toString().replace( /\B(?=(\d{3})+(?!\d))/g, ',' ); + } + } ] + } ); +} ); + +

    In addition to the above code, the following Javascript library files are loaded for use in this + example:

    + + +
    + +
    +

    The HTML shown below is the raw HTML table element, before it has been enhanced by + DataTables:

    +
    + +
    +
    +

    This example uses a little bit of additional CSS beyond what is loaded from the library + files (below), in order to correctly display the table. The additional CSS used is shown + below:

    +
    + +

    The following CSS library files are loaded for use in this example to provide the styling of the + table:

    + + +
    + +
    +

    This table loads data by Ajax. The latest data that has been loaded is shown below. This data + will update automatically as any additional data is loaded.

    +
    + +
    +

    The script used to perform the server-side processing for this table is shown below. Please note + that this is just an example script using PHP. Server-side processing scripts can be written in any + language, using the protocol described in the + DataTables documentation.

    +
    +
    +
    +
    + +
    + +
    + + \ No newline at end of file diff --git a/public/assets/js/plugins/datatables/extensions/AutoFill/images/filler.png b/public/assets/js/plugins/datatables/extensions/AutoFill/images/filler.png new file mode 100755 index 0000000000..f2af65d8c3 Binary files /dev/null and b/public/assets/js/plugins/datatables/extensions/AutoFill/images/filler.png differ diff --git a/public/assets/js/plugins/datatables/extensions/AutoFill/js/dataTables.autoFill.js b/public/assets/js/plugins/datatables/extensions/AutoFill/js/dataTables.autoFill.js new file mode 100755 index 0000000000..6bbfa35b93 --- /dev/null +++ b/public/assets/js/plugins/datatables/extensions/AutoFill/js/dataTables.autoFill.js @@ -0,0 +1,855 @@ +/*! AutoFill 1.2.1 + * ©2008-2014 SpryMedia Ltd - datatables.net/license + */ + +/** + * @summary AutoFill + * @description Add Excel like click and drag auto-fill options to DataTables + * @version 1.2.1 + * @file dataTables.autoFill.js + * @author SpryMedia Ltd (www.sprymedia.co.uk) + * @contact www.sprymedia.co.uk/contact + * @copyright Copyright 2010-2014 SpryMedia Ltd. + * + * This source file is free software, available under the following license: + * MIT license - http://datatables.net/license/mit + * + * This source file is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details. + * + * For details please refer to: http://www.datatables.net + */ + +(function( window, document, undefined ) { + +var factory = function( $, DataTable ) { +"use strict"; + +/** + * AutoFill provides Excel like auto-fill features for a DataTable + * + * @class AutoFill + * @constructor + * @param {object} oTD DataTables settings object + * @param {object} oConfig Configuration object for AutoFill + */ +var AutoFill = function( oDT, oConfig ) +{ + /* Sanity check that we are a new instance */ + if ( ! (this instanceof AutoFill) ) { + throw( "Warning: AutoFill must be initialised with the keyword 'new'" ); + } + + if ( ! $.fn.dataTableExt.fnVersionCheck('1.7.0') ) { + throw( "Warning: AutoFill requires DataTables 1.7 or greater"); + } + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Public class variables + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + this.c = {}; + + /** + * @namespace Settings object which contains customisable information for AutoFill instance + */ + this.s = { + /** + * @namespace Cached information about the little dragging icon (the filler) + */ + "filler": { + "height": 0, + "width": 0 + }, + + /** + * @namespace Cached information about the border display + */ + "border": { + "width": 2 + }, + + /** + * @namespace Store for live information for the current drag + */ + "drag": { + "startX": -1, + "startY": -1, + "startTd": null, + "endTd": null, + "dragging": false + }, + + /** + * @namespace Data cache for information that we need for scrolling the screen when we near + * the edges + */ + "screen": { + "interval": null, + "y": 0, + "height": 0, + "scrollTop": 0 + }, + + /** + * @namespace Data cache for the position of the DataTables scrolling element (when scrolling + * is enabled) + */ + "scroller": { + "top": 0, + "bottom": 0 + }, + + /** + * @namespace Information stored for each column. An array of objects + */ + "columns": [] + }; + + + /** + * @namespace Common and useful DOM elements for the class instance + */ + this.dom = { + "table": null, + "filler": null, + "borderTop": null, + "borderRight": null, + "borderBottom": null, + "borderLeft": null, + "currentTarget": null + }; + + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Public class methods + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + /** + * Retreieve the settings object from an instance + * @method fnSettings + * @returns {object} AutoFill settings object + */ + this.fnSettings = function () { + return this.s; + }; + + + /* Constructor logic */ + this._fnInit( oDT, oConfig ); + return this; +}; + + + +AutoFill.prototype = { + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Private methods (they are of course public in JS, but recommended as private) + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + /** + * Initialisation + * @method _fnInit + * @param {object} dt DataTables settings object + * @param {object} config Configuration object for AutoFill + * @returns void + */ + "_fnInit": function ( dt, config ) + { + var + that = this, + i, iLen; + + // Use DataTables API to get the settings allowing selectors, instances + // etc to be used, or for backwards compatibility get from the old + // fnSettings method + this.s.dt = DataTable.Api ? + new DataTable.Api( dt ).settings()[0] : + dt.fnSettings(); + this.s.init = config || {}; + this.dom.table = this.s.dt.nTable; + + $.extend( true, this.c, AutoFill.defaults, config ); + + /* Add and configure the columns */ + this._initColumns(); + + /* Auto Fill click and drag icon */ + var filler = $('
    ', { + 'class': 'AutoFill_filler' + } ) + .appendTo( 'body' ); + this.dom.filler = filler[0]; + + // Get the height / width of the click element + this.s.filler.height = filler.height(); + this.s.filler.width = filler.width(); + filler[0].style.display = "none"; + + /* Border display - one div for each side. We can't just use a single + * one with a border, as we want the events to effectively pass through + * the transparent bit of the box + */ + var border; + var appender = document.body; + if ( that.s.dt.oScroll.sY !== "" ) { + that.s.dt.nTable.parentNode.style.position = "relative"; + appender = that.s.dt.nTable.parentNode; + } + + border = $('
    ', { + "class": "AutoFill_border" + } ); + this.dom.borderTop = border.clone().appendTo( appender )[0]; + this.dom.borderRight = border.clone().appendTo( appender )[0]; + this.dom.borderBottom = border.clone().appendTo( appender )[0]; + this.dom.borderLeft = border.clone().appendTo( appender )[0]; + + /* Events */ + filler.on( 'mousedown.DTAF', function (e) { + this.onselectstart = function() { return false; }; + that._fnFillerDragStart.call( that, e ); + return false; + } ); + + $('tbody', this.dom.table).on( + 'mouseover.DTAF mouseout.DTAF', + '>tr>td, >tr>th', + function (e) { + that._fnFillerDisplay.call( that, e ); + } + ); + + $(this.dom.table).on( 'destroy.dt.DTAF', function () { + filler.off( 'mousedown.DTAF' ).remove(); + $('tbody', this.dom.table).off( 'mouseover.DTAF mouseout.DTAF' ); + } ); + }, + + + _initColumns: function ( ) + { + var that = this; + var i, ien; + var dt = this.s.dt; + var config = this.s.init; + + for ( i=0, ien=dt.aoColumns.length ; i offsetEnd.left) { + x1 = offsetEnd.left - border; + x2 = offsetStart.left + $(nStart).outerWidth(); + width = offsetStart.left + $(nStart).outerWidth() - offsetEnd.left + (2*border); + } + + if ( this.s.dt.oScroll.sY !== "" ) + { + /* The border elements are inside the DT scroller - so position relative to that */ + var + offsetScroll = $(this.s.dt.nTable.parentNode).offset(), + scrollTop = $(this.s.dt.nTable.parentNode).scrollTop(), + scrollLeft = $(this.s.dt.nTable.parentNode).scrollLeft(); + + x1 -= offsetScroll.left - scrollLeft; + x2 -= offsetScroll.left - scrollLeft; + y1 -= offsetScroll.top - scrollTop; + y2 -= offsetScroll.top - scrollTop; + } + + /* Top */ + oStyle = this.dom.borderTop.style; + oStyle.top = y1+"px"; + oStyle.left = x1+"px"; + oStyle.height = this.s.border.width+"px"; + oStyle.width = width+"px"; + + /* Bottom */ + oStyle = this.dom.borderBottom.style; + oStyle.top = y2+"px"; + oStyle.left = x1+"px"; + oStyle.height = this.s.border.width+"px"; + oStyle.width = width+"px"; + + /* Left */ + oStyle = this.dom.borderLeft.style; + oStyle.top = y1+"px"; + oStyle.left = x1+"px"; + oStyle.height = height+"px"; + oStyle.width = this.s.border.width+"px"; + + /* Right */ + oStyle = this.dom.borderRight.style; + oStyle.top = y1+"px"; + oStyle.left = x2+"px"; + oStyle.height = height+"px"; + oStyle.width = this.s.border.width+"px"; + }, + + + /** + * Mouse down event handler for starting a drag + * @method _fnFillerDragStart + * @param {Object} e Event object + * @returns void + */ + "_fnFillerDragStart": function (e) + { + var that = this; + var startingTd = this.dom.currentTarget; + + this.s.drag.dragging = true; + + that.dom.borderTop.style.display = "block"; + that.dom.borderRight.style.display = "block"; + that.dom.borderBottom.style.display = "block"; + that.dom.borderLeft.style.display = "block"; + + var coords = this._fnTargetCoords( startingTd ); + this.s.drag.startX = coords.x; + this.s.drag.startY = coords.y; + + this.s.drag.startTd = startingTd; + this.s.drag.endTd = startingTd; + + this._fnUpdateBorder( startingTd, startingTd ); + + $(document).bind('mousemove.AutoFill', function (e) { + that._fnFillerDragMove.call( that, e ); + } ); + + $(document).bind('mouseup.AutoFill', function (e) { + that._fnFillerFinish.call( that, e ); + } ); + + /* Scrolling information cache */ + this.s.screen.y = e.pageY; + this.s.screen.height = $(window).height(); + this.s.screen.scrollTop = $(document).scrollTop(); + + if ( this.s.dt.oScroll.sY !== "" ) + { + this.s.scroller.top = $(this.s.dt.nTable.parentNode).offset().top; + this.s.scroller.bottom = this.s.scroller.top + $(this.s.dt.nTable.parentNode).height(); + } + + /* Scrolling handler - we set an interval (which is cancelled on mouse up) which will fire + * regularly and see if we need to do any scrolling + */ + this.s.screen.interval = setInterval( function () { + var iScrollTop = $(document).scrollTop(); + var iScrollDelta = iScrollTop - that.s.screen.scrollTop; + that.s.screen.y += iScrollDelta; + + if ( that.s.screen.height - that.s.screen.y + iScrollTop < 50 ) + { + $('html, body').animate( { + "scrollTop": iScrollTop + 50 + }, 240, 'linear' ); + } + else if ( that.s.screen.y - iScrollTop < 50 ) + { + $('html, body').animate( { + "scrollTop": iScrollTop - 50 + }, 240, 'linear' ); + } + + if ( that.s.dt.oScroll.sY !== "" ) + { + if ( that.s.screen.y > that.s.scroller.bottom - 50 ) + { + $(that.s.dt.nTable.parentNode).animate( { + "scrollTop": $(that.s.dt.nTable.parentNode).scrollTop() + 50 + }, 240, 'linear' ); + } + else if ( that.s.screen.y < that.s.scroller.top + 50 ) + { + $(that.s.dt.nTable.parentNode).animate( { + "scrollTop": $(that.s.dt.nTable.parentNode).scrollTop() - 50 + }, 240, 'linear' ); + } + } + }, 250 ); + }, + + + /** + * Mouse move event handler for during a move. See if we want to update the display based on the + * new cursor position + * @method _fnFillerDragMove + * @param {Object} e Event object + * @returns void + */ + "_fnFillerDragMove": function (e) + { + if ( e.target && e.target.nodeName.toUpperCase() == "TD" && + e.target != this.s.drag.endTd ) + { + var coords = this._fnTargetCoords( e.target ); + + if ( this.c.mode == "y" && coords.x != this.s.drag.startX ) + { + e.target = $('tbody>tr:eq('+coords.y+')>td:eq('+this.s.drag.startX+')', this.dom.table)[0]; + } + if ( this.c.mode == "x" && coords.y != this.s.drag.startY ) + { + e.target = $('tbody>tr:eq('+this.s.drag.startY+')>td:eq('+coords.x+')', this.dom.table)[0]; + } + + if ( this.c.mode == "either") + { + if(coords.x != this.s.drag.startX ) + { + e.target = $('tbody>tr:eq('+this.s.drag.startY+')>td:eq('+coords.x+')', this.dom.table)[0]; + } + else if ( coords.y != this.s.drag.startY ) { + e.target = $('tbody>tr:eq('+coords.y+')>td:eq('+this.s.drag.startX+')', this.dom.table)[0]; + } + } + + // update coords + if ( this.c.mode !== "both" ) { + coords = this._fnTargetCoords( e.target ); + } + + var drag = this.s.drag; + drag.endTd = e.target; + + if ( coords.y >= this.s.drag.startY ) { + this._fnUpdateBorder( drag.startTd, drag.endTd ); + } + else { + this._fnUpdateBorder( drag.endTd, drag.startTd ); + } + this._fnFillerPosition( e.target ); + } + + /* Update the screen information so we can perform scrolling */ + this.s.screen.y = e.pageY; + this.s.screen.scrollTop = $(document).scrollTop(); + + if ( this.s.dt.oScroll.sY !== "" ) + { + this.s.scroller.scrollTop = $(this.s.dt.nTable.parentNode).scrollTop(); + this.s.scroller.top = $(this.s.dt.nTable.parentNode).offset().top; + this.s.scroller.bottom = this.s.scroller.top + $(this.s.dt.nTable.parentNode).height(); + } + }, + + + /** + * Mouse release handler - end the drag and take action to update the cells with the needed values + * @method _fnFillerFinish + * @param {Object} e Event object + * @returns void + */ + "_fnFillerFinish": function (e) + { + var that = this, i, iLen, j; + + $(document).unbind('mousemove.AutoFill mouseup.AutoFill'); + + this.dom.borderTop.style.display = "none"; + this.dom.borderRight.style.display = "none"; + this.dom.borderBottom.style.display = "none"; + this.dom.borderLeft.style.display = "none"; + + this.s.drag.dragging = false; + + clearInterval( this.s.screen.interval ); + + var cells = []; + var table = this.dom.table; + var coordsStart = this._fnTargetCoords( this.s.drag.startTd ); + var coordsEnd = this._fnTargetCoords( this.s.drag.endTd ); + var columnIndex = function ( visIdx ) { + return that.s.dt.oApi._fnVisibleToColumnIndex( that.s.dt, visIdx ); + }; + + // xxx - urgh - there must be a way of reducing this... + if ( coordsStart.y <= coordsEnd.y ) { + for ( i=coordsStart.y ; i<=coordsEnd.y ; i++ ) { + if ( coordsStart.x <= coordsEnd.x ) { + for ( j=coordsStart.x ; j<=coordsEnd.x ; j++ ) { + cells.push( { + node: $('tbody>tr:eq('+i+')>td:eq('+j+')', table)[0], + x: j - coordsStart.x, + y: i - coordsStart.y, + colIdx: columnIndex( j ) + } ); + } + } + else { + for ( j=coordsStart.x ; j>=coordsEnd.x ; j-- ) { + cells.push( { + node: $('tbody>tr:eq('+i+')>td:eq('+j+')', table)[0], + x: j - coordsStart.x, + y: i - coordsStart.y, + colIdx: columnIndex( j ) + } ); + } + } + } + } + else { + for ( i=coordsStart.y ; i>=coordsEnd.y ; i-- ) { + if ( coordsStart.x <= coordsEnd.x ) { + for ( j=coordsStart.x ; j<=coordsEnd.x ; j++ ) { + cells.push( { + node: $('tbody>tr:eq('+i+')>td:eq('+j+')', table)[0], + x: j - coordsStart.x, + y: i - coordsStart.y, + colIdx: columnIndex( j ) + } ); + } + } + else { + for ( j=coordsStart.x ; j>=coordsEnd.x ; j-- ) { + cells.push( { + node: $('tbody>tr:eq('+i+')>td:eq('+j+')', table)[0], + x: coordsStart.x - j, + y: coordsStart.y - i, + colIdx: columnIndex( j ) + } ); + } + } + } + } + + // An auto-fill requires 2 or more cells + if ( cells.length <= 1 ) { + return; + } + + var edited = []; + var previous; + + for ( i=0, iLen=cells.length ; i",{"class":"AutoFill_filler"}).appendTo("body");this.dom.filler=e[0];this.s.filler.height=e.height();this.s.filler.width=e.width();e[0].style.display= +"none";var g,f=j.body;""!==a.s.dt.oScroll.sY&&(a.s.dt.nTable.parentNode.style.position="relative",f=a.s.dt.nTable.parentNode);g=c("
    ",{"class":"AutoFill_border"});this.dom.borderTop=g.clone().appendTo(f)[0];this.dom.borderRight=g.clone().appendTo(f)[0];this.dom.borderBottom=g.clone().appendTo(f)[0];this.dom.borderLeft=g.clone().appendTo(f)[0];e.on("mousedown.DTAF",function(b){this.onselectstart=function(){return false};a._fnFillerDragStart.call(a,b);return false});c("tbody",this.dom.table).on("mouseover.DTAF mouseout.DTAF", +">tr>td, >tr>th",function(b){a._fnFillerDisplay.call(a,b)});c(this.dom.table).on("destroy.dt.DTAF",function(){e.off("mousedown.DTAF").remove();c("tbody",this.dom.table).off("mouseover.DTAF mouseout.DTAF")})},_initColumns:function(){var d=this,b,a,e=this.s.dt,g=this.s.init;b=0;for(a=e.aoColumns.length;bg.left&&(f=g.left-a,i=e.left+c(d).outerWidth(),j=e.left+c(d).outerWidth()-g.left+2*a);""!==this.s.dt.oScroll.sY&&(a=c(this.s.dt.nTable.parentNode).offset(),e=c(this.s.dt.nTable.parentNode).scrollTop(), +g=c(this.s.dt.nTable.parentNode).scrollLeft(),f-=a.left-g,i-=a.left-g,n-=a.top-e,h-=a.top-e);a=this.dom.borderTop.style;a.top=n+"px";a.left=f+"px";a.height=this.s.border.width+"px";a.width=j+"px";a=this.dom.borderBottom.style;a.top=h+"px";a.left=f+"px";a.height=this.s.border.width+"px";a.width=j+"px";a=this.dom.borderLeft.style;a.top=n+"px";a.left=f+"px";a.height=k+"px";a.width=this.s.border.width+"px";a=this.dom.borderRight.style;a.top=n+"px";a.left=i+"px";a.height=k+"px";a.width=this.s.border.width+ +"px"},_fnFillerDragStart:function(d){var b=this,a=this.dom.currentTarget;this.s.drag.dragging=!0;b.dom.borderTop.style.display="block";b.dom.borderRight.style.display="block";b.dom.borderBottom.style.display="block";b.dom.borderLeft.style.display="block";var e=this._fnTargetCoords(a);this.s.drag.startX=e.x;this.s.drag.startY=e.y;this.s.drag.startTd=a;this.s.drag.endTd=a;this._fnUpdateBorder(a,a);c(j).bind("mousemove.AutoFill",function(a){b._fnFillerDragMove.call(b,a)});c(j).bind("mouseup.AutoFill", +function(a){b._fnFillerFinish.call(b,a)});this.s.screen.y=d.pageY;this.s.screen.height=c(o).height();this.s.screen.scrollTop=c(j).scrollTop();""!==this.s.dt.oScroll.sY&&(this.s.scroller.top=c(this.s.dt.nTable.parentNode).offset().top,this.s.scroller.bottom=this.s.scroller.top+c(this.s.dt.nTable.parentNode).height());this.s.screen.interval=setInterval(function(){var a=c(j).scrollTop();b.s.screen.y=b.s.screen.y+(a-b.s.screen.scrollTop);b.s.screen.height-b.s.screen.y+a<50?c("html, body").animate({scrollTop:a+ +50},240,"linear"):b.s.screen.y-a<50&&c("html, body").animate({scrollTop:a-50},240,"linear");b.s.dt.oScroll.sY!==""&&(b.s.screen.y>b.s.scroller.bottom-50?c(b.s.dt.nTable.parentNode).animate({scrollTop:c(b.s.dt.nTable.parentNode).scrollTop()+50},240,"linear"):b.s.screen.ytr:eq("+b.y+")>td:eq("+this.s.drag.startX+")",this.dom.table)[0]);"x"==this.c.mode&&b.y!=this.s.drag.startY&&(d.target=c("tbody>tr:eq("+this.s.drag.startY+")>td:eq("+b.x+")",this.dom.table)[0]);"either"==this.c.mode&&(b.x!=this.s.drag.startX?d.target=c("tbody>tr:eq("+this.s.drag.startY+")>td:eq("+b.x+")",this.dom.table)[0]:b.y!=this.s.drag.startY&&(d.target=c("tbody>tr:eq("+b.y+")>td:eq("+this.s.drag.startX+ +")",this.dom.table)[0]));"both"!==this.c.mode&&(b=this._fnTargetCoords(d.target));var a=this.s.drag;a.endTd=d.target;b.y>=this.s.drag.startY?this._fnUpdateBorder(a.startTd,a.endTd):this._fnUpdateBorder(a.endTd,a.startTd);this._fnFillerPosition(d.target)}this.s.screen.y=d.pageY;this.s.screen.scrollTop=c(j).scrollTop();""!==this.s.dt.oScroll.sY&&(this.s.scroller.scrollTop=c(this.s.dt.nTable.parentNode).scrollTop(),this.s.scroller.top=c(this.s.dt.nTable.parentNode).offset().top,this.s.scroller.bottom= +this.s.scroller.top+c(this.s.dt.nTable.parentNode).height())},_fnFillerFinish:function(){var d=this,b,a;c(j).unbind("mousemove.AutoFill mouseup.AutoFill");this.dom.borderTop.style.display="none";this.dom.borderRight.style.display="none";this.dom.borderBottom.style.display="none";this.dom.borderLeft.style.display="none";this.s.drag.dragging=!1;clearInterval(this.s.screen.interval);var e=[],g=this.dom.table,f=this._fnTargetCoords(this.s.drag.startTd),i=this._fnTargetCoords(this.s.drag.endTd),h=function(a){return d.s.dt.oApi._fnVisibleToColumnIndex(d.s.dt, +a)};if(f.y<=i.y)for(b=f.y;b<=i.y;b++)if(f.x<=i.x)for(a=f.x;a<=i.x;a++)e.push({node:c("tbody>tr:eq("+b+")>td:eq("+a+")",g)[0],x:a-f.x,y:b-f.y,colIdx:h(a)});else for(a=f.x;a>=i.x;a--)e.push({node:c("tbody>tr:eq("+b+")>td:eq("+a+")",g)[0],x:a-f.x,y:b-f.y,colIdx:h(a)});else for(b=f.y;b>=i.y;b--)if(f.x<=i.x)for(a=f.x;a<=i.x;a++)e.push({node:c("tbody>tr:eq("+b+")>td:eq("+a+")",g)[0],x:a-f.x,y:b-f.y,colIdx:h(a)});else for(a=f.x;a>=i.x;a--)e.push({node:c("tbody>tr:eq("+b+")>td:eq("+a+")",g)[0],x:f.x-a,y:f.y- +b,colIdx:h(a)});if(!(1>=e.length)){var g=[],m;b=0;for(a=e.length;bg||0>f?-1:1)):a===m?b:a}}};return h};"function"===typeof define&&define.amd? +define(["jquery","datatables"],l):"object"===typeof exports?l(require("jquery"),require("datatables")):jQuery&&!jQuery.fn.dataTable.AutoFill&&l(jQuery,jQuery.fn.dataTable)})(window,document); diff --git a/public/assets/js/plugins/datatables/extensions/ColReorder/License.txt b/public/assets/js/plugins/datatables/extensions/ColReorder/License.txt new file mode 100755 index 0000000000..9ade2f1b64 --- /dev/null +++ b/public/assets/js/plugins/datatables/extensions/ColReorder/License.txt @@ -0,0 +1,20 @@ +Copyright (c) 2010-2015 SpryMedia Limited +http://datatables.net + +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. diff --git a/public/assets/js/plugins/datatables/extensions/ColReorder/Readme.md b/public/assets/js/plugins/datatables/extensions/ColReorder/Readme.md new file mode 100755 index 0000000000..217dd60e2c --- /dev/null +++ b/public/assets/js/plugins/datatables/extensions/ColReorder/Readme.md @@ -0,0 +1,39 @@ +# ColReorder + +ColReorder adds the ability for the end user to click and drag column headers to reorder a table as they see fit, to DataTables. Key features include: + +* Very easy integration with DataTables +* Tight integration with all other DataTables plug-ins +* The ability to exclude the first (or more) column from being movable +* Predefine a column order +* Save staving integration with DataTables + + +# Installation + +To use ColReorder, first download DataTables ( http://datatables.net/download ) and place the unzipped ColReorder package into a `extensions` directory in the DataTables package. This will allow the pages in the examples to operate correctly. To see the examples running, open the `examples` directory in your web-browser. + + +# Basic usage + +ColReorder is initialised using the `$.fn.dataTable.ColReorder` constructor. For example: + +```js +$(document).ready( function () { + $('#example').DataTable(); + + new $.fn.dataTable.ColReorder( table ); +} ); +``` + + +# Documentation / support + +* Documentation: http://datatables.net/extensions/colreorder/ +* DataTables support forums: http://datatables.net/forums + + +# GitHub + +If you fancy getting involved with the development of ColReorder and help make it better, please refer to its GitHub repo: https://github.com/DataTables/ColReorder + diff --git a/public/assets/js/plugins/datatables/extensions/ColReorder/css/dataTables.colReorder.css b/public/assets/js/plugins/datatables/extensions/ColReorder/css/dataTables.colReorder.css new file mode 100755 index 0000000000..bdd6aa0b9a --- /dev/null +++ b/public/assets/js/plugins/datatables/extensions/ColReorder/css/dataTables.colReorder.css @@ -0,0 +1,14 @@ +/* + * Namespace DTCR - "DataTables ColReorder" plug-in + */ + +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; +} \ No newline at end of file diff --git a/public/assets/js/plugins/datatables/extensions/ColReorder/css/dataTables.colReorder.min.css b/public/assets/js/plugins/datatables/extensions/ColReorder/css/dataTables.colReorder.min.css new file mode 100755 index 0000000000..77b230e013 --- /dev/null +++ b/public/assets/js/plugins/datatables/extensions/ColReorder/css/dataTables.colReorder.min.css @@ -0,0 +1 @@ +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} diff --git a/public/assets/js/plugins/datatables/extensions/ColReorder/examples/alt_insert.html b/public/assets/js/plugins/datatables/extensions/ColReorder/examples/alt_insert.html new file mode 100755 index 0000000000..16bedcfee2 --- /dev/null +++ b/public/assets/js/plugins/datatables/extensions/ColReorder/examples/alt_insert.html @@ -0,0 +1,637 @@ + + + + + + + + ColReorder example - Alternative insert styling + + + + + + + + + + + + + + +
    +
    +

    ColReorder example Alternative insert styling

    + +
    +

    Using CSS it is easy to modify the insert bar to suit your web-site. This example shows how an arrow can be used to show the insert point rather than the + straight bar used in the other examples by simply adding an extra CSS rule to include the image.

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NamePositionOfficeAgeStart dateSalary
    NamePositionOfficeAgeStart dateSalary
    Tiger NixonSystem ArchitectEdinburgh612011/04/25$320,800
    Garrett WintersAccountantTokyo632011/07/25$170,750
    Ashton CoxJunior Technical AuthorSan Francisco662009/01/12$86,000
    Cedric KellySenior Javascript DeveloperEdinburgh222012/03/29$433,060
    Airi SatouAccountantTokyo332008/11/28$162,700
    Brielle WilliamsonIntegration SpecialistNew York612012/12/02$372,000
    Herrod ChandlerSales AssistantSan Francisco592012/08/06$137,500
    Rhona DavidsonIntegration SpecialistTokyo552010/10/14$327,900
    Colleen HurstJavascript DeveloperSan Francisco392009/09/15$205,500
    Sonya FrostSoftware EngineerEdinburgh232008/12/13$103,600
    Jena GainesOffice ManagerLondon302008/12/19$90,560
    Quinn FlynnSupport LeadEdinburgh222013/03/03$342,000
    Charde MarshallRegional DirectorSan Francisco362008/10/16$470,600
    Haley KennedySenior Marketing DesignerLondon432012/12/18$313,500
    Tatyana FitzpatrickRegional DirectorLondon192010/03/17$385,750
    Michael SilvaMarketing DesignerLondon662012/11/27$198,500
    Paul ByrdChief Financial Officer (CFO)New York642010/06/09$725,000
    Gloria LittleSystems AdministratorNew York592009/04/10$237,500
    Bradley GreerSoftware EngineerLondon412012/10/13$132,000
    Dai RiosPersonnel LeadEdinburgh352012/09/26$217,500
    Jenette CaldwellDevelopment LeadNew York302011/09/03$345,000
    Yuri BerryChief Marketing Officer (CMO)New York402009/06/25$675,000
    Caesar VancePre-Sales SupportNew York212011/12/12$106,450
    Doris WilderSales AssistantSidney232010/09/20$85,600
    Angelica RamosChief Executive Officer (CEO)London472009/10/09$1,200,000
    Gavin JoyceDeveloperEdinburgh422010/12/22$92,575
    Jennifer ChangRegional DirectorSingapore282010/11/14$357,650
    Brenden WagnerSoftware EngineerSan Francisco282011/06/07$206,850
    Fiona GreenChief Operating Officer (COO)San Francisco482010/03/11$850,000
    Shou ItouRegional MarketingTokyo202011/08/14$163,000
    Michelle HouseIntegration SpecialistSidney372011/06/02$95,400
    Suki BurksDeveloperLondon532009/10/22$114,500
    Prescott BartlettTechnical AuthorLondon272011/05/07$145,000
    Gavin CortezTeam LeaderSan Francisco222008/10/26$235,500
    Martena MccrayPost-Sales supportEdinburgh462011/03/09$324,050
    Unity ButlerMarketing DesignerSan Francisco472009/12/09$85,675
    Howard HatfieldOffice ManagerSan Francisco512008/12/16$164,500
    Hope FuentesSecretarySan Francisco412010/02/12$109,850
    Vivian HarrellFinancial ControllerSan Francisco622009/02/14$452,500
    Timothy MooneyOffice ManagerLondon372008/12/11$136,200
    Jackson BradshawDirectorNew York652008/09/26$645,750
    Olivia LiangSupport EngineerSingapore642011/02/03$234,500
    Bruno NashSoftware EngineerLondon382011/05/03$163,500
    Sakura YamamotoSupport EngineerTokyo372009/08/19$139,575
    Thor WaltonDeveloperNew York612013/08/11$98,540
    Finn CamachoSupport EngineerSan Francisco472009/07/07$87,500
    Serge BaldwinData CoordinatorSingapore642012/04/09$138,575
    Zenaida FrankSoftware EngineerNew York632010/01/04$125,250
    Zorita SerranoSoftware EngineerSan Francisco562012/06/01$115,000
    Jennifer AcostaJunior Javascript DeveloperEdinburgh432013/02/01$75,650
    Cara StevensSales AssistantNew York462011/12/06$145,600
    Hermione ButlerRegional DirectorLondon472011/03/21$356,250
    Lael GreerSystems AdministratorLondon212009/02/27$103,500
    Jonas AlexanderDeveloperSan Francisco302010/07/14$86,500
    Shad DeckerRegional DirectorEdinburgh512008/11/13$183,000
    Michael BruceJavascript DeveloperSingapore292011/06/27$183,000
    Donna SniderCustomer SupportNew York272011/01/25$112,000
    + +
      +
    • Javascript
    • +
    • HTML
    • +
    • CSS
    • +
    • Ajax
    • +
    • Server-side script
    • +
    + +
    +
    +

    The Javascript shown below is used to initialise the table shown in this example:

    $(document).ready(function() { + $('#example').DataTable( { + dom: 'Rlfrtip' + } ); +} ); + +

    In addition to the above code, the following Javascript library files are loaded for use in this example:

    + + +
    + +
    +

    The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

    +
    + +
    +
    +

    This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:

    div.DTCR_pointer { + margin-top: -15px; + margin-left: -9px; + width: 18px; + background: url('../images/insert.png') no-repeat top left; +} +
    + +

    The following CSS library files are loaded for use in this example to provide the styling of the table:

    + + +
    + +
    +

    This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.

    +
    + +
    +

    The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using the protocol described in the DataTables + documentation.

    +
    +
    +
    +
    + +
    + +
    + + \ No newline at end of file diff --git a/public/assets/js/plugins/datatables/extensions/ColReorder/examples/col_filter.html b/public/assets/js/plugins/datatables/extensions/ColReorder/examples/col_filter.html new file mode 100755 index 0000000000..355ff2b58f --- /dev/null +++ b/public/assets/js/plugins/datatables/extensions/ColReorder/examples/col_filter.html @@ -0,0 +1,656 @@ + + + + + + + + ColReorder example - Individual column filtering + + + + + + + + + + + + + + +
    +
    +

    ColReorder example Individual column filtering

    + +
    +

    This example of how to use ColReorder shows how it can with with DataTables' ability to do individual column filtering. The basic example is exactly the same as + the DataTables column filtering example, but with ColReorder also added to the table (through the R option for domDT).

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NamePositionOfficeAgeStart dateSalary
    NamePositionOfficeAgeStart dateSalary
    Tiger NixonSystem ArchitectEdinburgh612011/04/25$320,800
    Garrett WintersAccountantTokyo632011/07/25$170,750
    Ashton CoxJunior Technical AuthorSan Francisco662009/01/12$86,000
    Cedric KellySenior Javascript DeveloperEdinburgh222012/03/29$433,060
    Airi SatouAccountantTokyo332008/11/28$162,700
    Brielle WilliamsonIntegration SpecialistNew York612012/12/02$372,000
    Herrod ChandlerSales AssistantSan Francisco592012/08/06$137,500
    Rhona DavidsonIntegration SpecialistTokyo552010/10/14$327,900
    Colleen HurstJavascript DeveloperSan Francisco392009/09/15$205,500
    Sonya FrostSoftware EngineerEdinburgh232008/12/13$103,600
    Jena GainesOffice ManagerLondon302008/12/19$90,560
    Quinn FlynnSupport LeadEdinburgh222013/03/03$342,000
    Charde MarshallRegional DirectorSan Francisco362008/10/16$470,600
    Haley KennedySenior Marketing DesignerLondon432012/12/18$313,500
    Tatyana FitzpatrickRegional DirectorLondon192010/03/17$385,750
    Michael SilvaMarketing DesignerLondon662012/11/27$198,500
    Paul ByrdChief Financial Officer (CFO)New York642010/06/09$725,000
    Gloria LittleSystems AdministratorNew York592009/04/10$237,500
    Bradley GreerSoftware EngineerLondon412012/10/13$132,000
    Dai RiosPersonnel LeadEdinburgh352012/09/26$217,500
    Jenette CaldwellDevelopment LeadNew York302011/09/03$345,000
    Yuri BerryChief Marketing Officer (CMO)New York402009/06/25$675,000
    Caesar VancePre-Sales SupportNew York212011/12/12$106,450
    Doris WilderSales AssistantSidney232010/09/20$85,600
    Angelica RamosChief Executive Officer (CEO)London472009/10/09$1,200,000
    Gavin JoyceDeveloperEdinburgh422010/12/22$92,575
    Jennifer ChangRegional DirectorSingapore282010/11/14$357,650
    Brenden WagnerSoftware EngineerSan Francisco282011/06/07$206,850
    Fiona GreenChief Operating Officer (COO)San Francisco482010/03/11$850,000
    Shou ItouRegional MarketingTokyo202011/08/14$163,000
    Michelle HouseIntegration SpecialistSidney372011/06/02$95,400
    Suki BurksDeveloperLondon532009/10/22$114,500
    Prescott BartlettTechnical AuthorLondon272011/05/07$145,000
    Gavin CortezTeam LeaderSan Francisco222008/10/26$235,500
    Martena MccrayPost-Sales supportEdinburgh462011/03/09$324,050
    Unity ButlerMarketing DesignerSan Francisco472009/12/09$85,675
    Howard HatfieldOffice ManagerSan Francisco512008/12/16$164,500
    Hope FuentesSecretarySan Francisco412010/02/12$109,850
    Vivian HarrellFinancial ControllerSan Francisco622009/02/14$452,500
    Timothy MooneyOffice ManagerLondon372008/12/11$136,200
    Jackson BradshawDirectorNew York652008/09/26$645,750
    Olivia LiangSupport EngineerSingapore642011/02/03$234,500
    Bruno NashSoftware EngineerLondon382011/05/03$163,500
    Sakura YamamotoSupport EngineerTokyo372009/08/19$139,575
    Thor WaltonDeveloperNew York612013/08/11$98,540
    Finn CamachoSupport EngineerSan Francisco472009/07/07$87,500
    Serge BaldwinData CoordinatorSingapore642012/04/09$138,575
    Zenaida FrankSoftware EngineerNew York632010/01/04$125,250
    Zorita SerranoSoftware EngineerSan Francisco562012/06/01$115,000
    Jennifer AcostaJunior Javascript DeveloperEdinburgh432013/02/01$75,650
    Cara StevensSales AssistantNew York462011/12/06$145,600
    Hermione ButlerRegional DirectorLondon472011/03/21$356,250
    Lael GreerSystems AdministratorLondon212009/02/27$103,500
    Jonas AlexanderDeveloperSan Francisco302010/07/14$86,500
    Shad DeckerRegional DirectorEdinburgh512008/11/13$183,000
    Michael BruceJavascript DeveloperSingapore292011/06/27$183,000
    Donna SniderCustomer SupportNew York272011/01/25$112,000
    + +
      +
    • Javascript
    • +
    • HTML
    • +
    • CSS
    • +
    • Ajax
    • +
    • Server-side script
    • +
    + +
    +
    +

    The Javascript shown below is used to initialise the table shown in this example:

    $(document).ready(function() { + // Setup - add a text input to each footer cell + $('#example tfoot th').each( function () { + var title = $('#example thead th').eq( $(this).index() ).text(); + $(this).html( '<input type="text" placeholder="Search '+title+'" />' ); + } ); + + // DataTable + var table = $('#example').DataTable( { + dom: 'Rlfrtip' + } ); + + // Apply the filter + $("#example tfoot input").on( 'keyup change', function () { + table + .column( $(this).parent().index()+':visible' ) + .search( this.value ) + .draw(); + } ); +} ); + +

    In addition to the above code, the following Javascript library files are loaded for use in this example:

    + + +
    + +
    +

    The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

    +
    + +
    +
    +

    This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:

    +
    + +

    The following CSS library files are loaded for use in this example to provide the styling of the table:

    + + +
    + +
    +

    This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.

    +
    + +
    +

    The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using the protocol described in the DataTables + documentation.

    +
    +
    +
    +
    + +
    + +
    + + \ No newline at end of file diff --git a/public/assets/js/plugins/datatables/extensions/ColReorder/examples/colvis.html b/public/assets/js/plugins/datatables/extensions/ColReorder/examples/colvis.html new file mode 100755 index 0000000000..54c79c2a17 --- /dev/null +++ b/public/assets/js/plugins/datatables/extensions/ColReorder/examples/colvis.html @@ -0,0 +1,635 @@ + + + + + + + + ColReorder example - ColVis integration + + + + + + + + + + + + + + + + +
    +
    +

    ColReorder example ColVis integration

    + +
    +

    ColReorder interfaces with the ColVis extension for DataTables by updating the order of the list of columns + whenever a reorder is done. This is shown in the example below, where one column has been initially hidden to add extra emphasis to ColVis.

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NamePositionOfficeAgeStart dateSalary
    NamePositionOfficeAgeStart dateSalary
    Tiger NixonSystem ArchitectEdinburgh612011/04/25$320,800
    Garrett WintersAccountantTokyo632011/07/25$170,750
    Ashton CoxJunior Technical AuthorSan Francisco662009/01/12$86,000
    Cedric KellySenior Javascript DeveloperEdinburgh222012/03/29$433,060
    Airi SatouAccountantTokyo332008/11/28$162,700
    Brielle WilliamsonIntegration SpecialistNew York612012/12/02$372,000
    Herrod ChandlerSales AssistantSan Francisco592012/08/06$137,500
    Rhona DavidsonIntegration SpecialistTokyo552010/10/14$327,900
    Colleen HurstJavascript DeveloperSan Francisco392009/09/15$205,500
    Sonya FrostSoftware EngineerEdinburgh232008/12/13$103,600
    Jena GainesOffice ManagerLondon302008/12/19$90,560
    Quinn FlynnSupport LeadEdinburgh222013/03/03$342,000
    Charde MarshallRegional DirectorSan Francisco362008/10/16$470,600
    Haley KennedySenior Marketing DesignerLondon432012/12/18$313,500
    Tatyana FitzpatrickRegional DirectorLondon192010/03/17$385,750
    Michael SilvaMarketing DesignerLondon662012/11/27$198,500
    Paul ByrdChief Financial Officer (CFO)New York642010/06/09$725,000
    Gloria LittleSystems AdministratorNew York592009/04/10$237,500
    Bradley GreerSoftware EngineerLondon412012/10/13$132,000
    Dai RiosPersonnel LeadEdinburgh352012/09/26$217,500
    Jenette CaldwellDevelopment LeadNew York302011/09/03$345,000
    Yuri BerryChief Marketing Officer (CMO)New York402009/06/25$675,000
    Caesar VancePre-Sales SupportNew York212011/12/12$106,450
    Doris WilderSales AssistantSidney232010/09/20$85,600
    Angelica RamosChief Executive Officer (CEO)London472009/10/09$1,200,000
    Gavin JoyceDeveloperEdinburgh422010/12/22$92,575
    Jennifer ChangRegional DirectorSingapore282010/11/14$357,650
    Brenden WagnerSoftware EngineerSan Francisco282011/06/07$206,850
    Fiona GreenChief Operating Officer (COO)San Francisco482010/03/11$850,000
    Shou ItouRegional MarketingTokyo202011/08/14$163,000
    Michelle HouseIntegration SpecialistSidney372011/06/02$95,400
    Suki BurksDeveloperLondon532009/10/22$114,500
    Prescott BartlettTechnical AuthorLondon272011/05/07$145,000
    Gavin CortezTeam LeaderSan Francisco222008/10/26$235,500
    Martena MccrayPost-Sales supportEdinburgh462011/03/09$324,050
    Unity ButlerMarketing DesignerSan Francisco472009/12/09$85,675
    Howard HatfieldOffice ManagerSan Francisco512008/12/16$164,500
    Hope FuentesSecretarySan Francisco412010/02/12$109,850
    Vivian HarrellFinancial ControllerSan Francisco622009/02/14$452,500
    Timothy MooneyOffice ManagerLondon372008/12/11$136,200
    Jackson BradshawDirectorNew York652008/09/26$645,750
    Olivia LiangSupport EngineerSingapore642011/02/03$234,500
    Bruno NashSoftware EngineerLondon382011/05/03$163,500
    Sakura YamamotoSupport EngineerTokyo372009/08/19$139,575
    Thor WaltonDeveloperNew York612013/08/11$98,540
    Finn CamachoSupport EngineerSan Francisco472009/07/07$87,500
    Serge BaldwinData CoordinatorSingapore642012/04/09$138,575
    Zenaida FrankSoftware EngineerNew York632010/01/04$125,250
    Zorita SerranoSoftware EngineerSan Francisco562012/06/01$115,000
    Jennifer AcostaJunior Javascript DeveloperEdinburgh432013/02/01$75,650
    Cara StevensSales AssistantNew York462011/12/06$145,600
    Hermione ButlerRegional DirectorLondon472011/03/21$356,250
    Lael GreerSystems AdministratorLondon212009/02/27$103,500
    Jonas AlexanderDeveloperSan Francisco302010/07/14$86,500
    Shad DeckerRegional DirectorEdinburgh512008/11/13$183,000
    Michael BruceJavascript DeveloperSingapore292011/06/27$183,000
    Donna SniderCustomer SupportNew York272011/01/25$112,000
    + +
      +
    • Javascript
    • +
    • HTML
    • +
    • CSS
    • +
    • Ajax
    • +
    • Server-side script
    • +
    + +
    +
    +

    The Javascript shown below is used to initialise the table shown in this example:

    $(document).ready(function() { + var table = $('#example').DataTable( { + dom: 'RC<"clear">lfrtip', + columnDefs: [ + { visible: false, targets: 1 } + ] + } ); +} ); + +

    In addition to the above code, the following Javascript library files are loaded for use in this example:

    + + +
    + +
    +

    The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

    +
    + +
    +
    +

    This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:

    +
    + +

    The following CSS library files are loaded for use in this example to provide the styling of the table:

    + + +
    + +
    +

    This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.

    +
    + +
    +

    The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using the protocol described in the DataTables + documentation.

    +
    +
    +
    +
    + +
    + +
    + + \ No newline at end of file diff --git a/public/assets/js/plugins/datatables/extensions/ColReorder/examples/fixedcolumns.html b/public/assets/js/plugins/datatables/extensions/ColReorder/examples/fixedcolumns.html new file mode 100755 index 0000000000..0599ba48d3 --- /dev/null +++ b/public/assets/js/plugins/datatables/extensions/ColReorder/examples/fixedcolumns.html @@ -0,0 +1,831 @@ + + + + + + + + ColReorder example - FixedColumns integration + + + + + + + + + + + + + + + + +
    +
    +

    ColReorder example FixedColumns integration

    + +
    +

    While ColReorder works with the built-in scrolling options in DataTables (scrollYDT and scrollXDT) and also the FixedColumns + extension.

    + +

    ColReorder provides the fixedColumnsLeft and fixedColumnsRight options which allows you disallow reordering of the fixed columns + (which is required).

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    First nameLast namePositionOfficeAgeStart dateSalaryExtn.E-mail
    TigerNixonSystem ArchitectEdinburgh612011/04/25$320,8005421t.nixon@datatables.net
    GarrettWintersAccountantTokyo632011/07/25$170,7508422g.winters@datatables.net
    AshtonCoxJunior Technical AuthorSan Francisco662009/01/12$86,0001562a.cox@datatables.net
    CedricKellySenior Javascript DeveloperEdinburgh222012/03/29$433,0606224c.kelly@datatables.net
    AiriSatouAccountantTokyo332008/11/28$162,7005407a.satou@datatables.net
    BrielleWilliamsonIntegration SpecialistNew York612012/12/02$372,0004804b.williamson@datatables.net
    HerrodChandlerSales AssistantSan Francisco592012/08/06$137,5009608h.chandler@datatables.net
    RhonaDavidsonIntegration SpecialistTokyo552010/10/14$327,9006200r.davidson@datatables.net
    ColleenHurstJavascript DeveloperSan Francisco392009/09/15$205,5002360c.hurst@datatables.net
    SonyaFrostSoftware EngineerEdinburgh232008/12/13$103,6001667s.frost@datatables.net
    JenaGainesOffice ManagerLondon302008/12/19$90,5603814j.gaines@datatables.net
    QuinnFlynnSupport LeadEdinburgh222013/03/03$342,0009497q.flynn@datatables.net
    ChardeMarshallRegional DirectorSan Francisco362008/10/16$470,6006741c.marshall@datatables.net
    HaleyKennedySenior Marketing DesignerLondon432012/12/18$313,5003597h.kennedy@datatables.net
    TatyanaFitzpatrickRegional DirectorLondon192010/03/17$385,7501965t.fitzpatrick@datatables.net
    MichaelSilvaMarketing DesignerLondon662012/11/27$198,5001581m.silva@datatables.net
    PaulByrdChief Financial Officer (CFO)New York642010/06/09$725,0003059p.byrd@datatables.net
    GloriaLittleSystems AdministratorNew York592009/04/10$237,5001721g.little@datatables.net
    BradleyGreerSoftware EngineerLondon412012/10/13$132,0002558b.greer@datatables.net
    DaiRiosPersonnel LeadEdinburgh352012/09/26$217,5002290d.rios@datatables.net
    JenetteCaldwellDevelopment LeadNew York302011/09/03$345,0001937j.caldwell@datatables.net
    YuriBerryChief Marketing Officer (CMO)New York402009/06/25$675,0006154y.berry@datatables.net
    CaesarVancePre-Sales SupportNew York212011/12/12$106,4508330c.vance@datatables.net
    DorisWilderSales AssistantSidney232010/09/20$85,6003023d.wilder@datatables.net
    AngelicaRamosChief Executive Officer (CEO)London472009/10/09$1,200,0005797a.ramos@datatables.net
    GavinJoyceDeveloperEdinburgh422010/12/22$92,5758822g.joyce@datatables.net
    JenniferChangRegional DirectorSingapore282010/11/14$357,6509239j.chang@datatables.net
    BrendenWagnerSoftware EngineerSan Francisco282011/06/07$206,8501314b.wagner@datatables.net
    FionaGreenChief Operating Officer (COO)San Francisco482010/03/11$850,0002947f.green@datatables.net
    ShouItouRegional MarketingTokyo202011/08/14$163,0008899s.itou@datatables.net
    MichelleHouseIntegration SpecialistSidney372011/06/02$95,4002769m.house@datatables.net
    SukiBurksDeveloperLondon532009/10/22$114,5006832s.burks@datatables.net
    PrescottBartlettTechnical AuthorLondon272011/05/07$145,0003606p.bartlett@datatables.net
    GavinCortezTeam LeaderSan Francisco222008/10/26$235,5002860g.cortez@datatables.net
    MartenaMccrayPost-Sales supportEdinburgh462011/03/09$324,0508240m.mccray@datatables.net
    UnityButlerMarketing DesignerSan Francisco472009/12/09$85,6755384u.butler@datatables.net
    HowardHatfieldOffice ManagerSan Francisco512008/12/16$164,5007031h.hatfield@datatables.net
    HopeFuentesSecretarySan Francisco412010/02/12$109,8506318h.fuentes@datatables.net
    VivianHarrellFinancial ControllerSan Francisco622009/02/14$452,5009422v.harrell@datatables.net
    TimothyMooneyOffice ManagerLondon372008/12/11$136,2007580t.mooney@datatables.net
    JacksonBradshawDirectorNew York652008/09/26$645,7501042j.bradshaw@datatables.net
    OliviaLiangSupport EngineerSingapore642011/02/03$234,5002120o.liang@datatables.net
    BrunoNashSoftware EngineerLondon382011/05/03$163,5006222b.nash@datatables.net
    SakuraYamamotoSupport EngineerTokyo372009/08/19$139,5759383s.yamamoto@datatables.net
    ThorWaltonDeveloperNew York612013/08/11$98,5408327t.walton@datatables.net
    FinnCamachoSupport EngineerSan Francisco472009/07/07$87,5002927f.camacho@datatables.net
    SergeBaldwinData CoordinatorSingapore642012/04/09$138,5758352s.baldwin@datatables.net
    ZenaidaFrankSoftware EngineerNew York632010/01/04$125,2507439z.frank@datatables.net
    ZoritaSerranoSoftware EngineerSan Francisco562012/06/01$115,0004389z.serrano@datatables.net
    JenniferAcostaJunior Javascript DeveloperEdinburgh432013/02/01$75,6503431j.acosta@datatables.net
    CaraStevensSales AssistantNew York462011/12/06$145,6003990c.stevens@datatables.net
    HermioneButlerRegional DirectorLondon472011/03/21$356,2501016h.butler@datatables.net
    LaelGreerSystems AdministratorLondon212009/02/27$103,5006733l.greer@datatables.net
    JonasAlexanderDeveloperSan Francisco302010/07/14$86,5008196j.alexander@datatables.net
    ShadDeckerRegional DirectorEdinburgh512008/11/13$183,0006373s.decker@datatables.net
    MichaelBruceJavascript DeveloperSingapore292011/06/27$183,0005384m.bruce@datatables.net
    DonnaSniderCustomer SupportNew York272011/01/25$112,0004226d.snider@datatables.net
    + +
      +
    • Javascript
    • +
    • HTML
    • +
    • CSS
    • +
    • Ajax
    • +
    • Server-side script
    • +
    + +
    +
    +

    The Javascript shown below is used to initialise the table shown in this example:

    $(document).ready(function() { + window.table = $('#example').DataTable( { + dom: 'Rlfrtip', + scrollX: true, + scrollCollapse: true, + columnDefs: [ + { orderable: false, targets: 0 }, + { orderable: false, targets: -1 } + ], + ordering: [[ 1, 'asc' ]], + colReorder: { + fixedColumnsLeft: 1, + fixedColumnsRight: 1 + } + } ); + + window.fc = new $.fn.dataTable.FixedColumns( table, { + leftColumns: 1, + rightColumns: 1 + } ); +} ); + +

    In addition to the above code, the following Javascript library files are loaded for use in this example:

    + + +
    + +
    +

    The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

    +
    + +
    +
    +

    This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:

    +
    + +

    The following CSS library files are loaded for use in this example to provide the styling of the table:

    + + +
    + +
    +

    This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.

    +
    + +
    +

    The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using the protocol described in the DataTables + documentation.

    +
    +
    +
    +
    + +
    + +
    + + \ No newline at end of file diff --git a/public/assets/js/plugins/datatables/extensions/ColReorder/examples/fixedheader.html b/public/assets/js/plugins/datatables/extensions/ColReorder/examples/fixedheader.html new file mode 100755 index 0000000000..40f05468ff --- /dev/null +++ b/public/assets/js/plugins/datatables/extensions/ColReorder/examples/fixedheader.html @@ -0,0 +1,635 @@ + + + + + + + + ColReorder example - FixedHeader integration + + + + + + + + + + + + + + + + +
    +
    +

    ColReorder example FixedHeader integration

    + +
    +

    FixedHeader is a particularly useful plug-in for DataTables, allowing a table header to float at the top of a scrolling window. ColReorder works well with + FixedHeader, allowing you to reorder columns even using the floating header, as shown in the example below.

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NamePositionOfficeAgeStart dateSalary
    NamePositionOfficeAgeStart dateSalary
    Tiger NixonSystem ArchitectEdinburgh612011/04/25$320,800
    Garrett WintersAccountantTokyo632011/07/25$170,750
    Ashton CoxJunior Technical AuthorSan Francisco662009/01/12$86,000
    Cedric KellySenior Javascript DeveloperEdinburgh222012/03/29$433,060
    Airi SatouAccountantTokyo332008/11/28$162,700
    Brielle WilliamsonIntegration SpecialistNew York612012/12/02$372,000
    Herrod ChandlerSales AssistantSan Francisco592012/08/06$137,500
    Rhona DavidsonIntegration SpecialistTokyo552010/10/14$327,900
    Colleen HurstJavascript DeveloperSan Francisco392009/09/15$205,500
    Sonya FrostSoftware EngineerEdinburgh232008/12/13$103,600
    Jena GainesOffice ManagerLondon302008/12/19$90,560
    Quinn FlynnSupport LeadEdinburgh222013/03/03$342,000
    Charde MarshallRegional DirectorSan Francisco362008/10/16$470,600
    Haley KennedySenior Marketing DesignerLondon432012/12/18$313,500
    Tatyana FitzpatrickRegional DirectorLondon192010/03/17$385,750
    Michael SilvaMarketing DesignerLondon662012/11/27$198,500
    Paul ByrdChief Financial Officer (CFO)New York642010/06/09$725,000
    Gloria LittleSystems AdministratorNew York592009/04/10$237,500
    Bradley GreerSoftware EngineerLondon412012/10/13$132,000
    Dai RiosPersonnel LeadEdinburgh352012/09/26$217,500
    Jenette CaldwellDevelopment LeadNew York302011/09/03$345,000
    Yuri BerryChief Marketing Officer (CMO)New York402009/06/25$675,000
    Caesar VancePre-Sales SupportNew York212011/12/12$106,450
    Doris WilderSales AssistantSidney232010/09/20$85,600
    Angelica RamosChief Executive Officer (CEO)London472009/10/09$1,200,000
    Gavin JoyceDeveloperEdinburgh422010/12/22$92,575
    Jennifer ChangRegional DirectorSingapore282010/11/14$357,650
    Brenden WagnerSoftware EngineerSan Francisco282011/06/07$206,850
    Fiona GreenChief Operating Officer (COO)San Francisco482010/03/11$850,000
    Shou ItouRegional MarketingTokyo202011/08/14$163,000
    Michelle HouseIntegration SpecialistSidney372011/06/02$95,400
    Suki BurksDeveloperLondon532009/10/22$114,500
    Prescott BartlettTechnical AuthorLondon272011/05/07$145,000
    Gavin CortezTeam LeaderSan Francisco222008/10/26$235,500
    Martena MccrayPost-Sales supportEdinburgh462011/03/09$324,050
    Unity ButlerMarketing DesignerSan Francisco472009/12/09$85,675
    Howard HatfieldOffice ManagerSan Francisco512008/12/16$164,500
    Hope FuentesSecretarySan Francisco412010/02/12$109,850
    Vivian HarrellFinancial ControllerSan Francisco622009/02/14$452,500
    Timothy MooneyOffice ManagerLondon372008/12/11$136,200
    Jackson BradshawDirectorNew York652008/09/26$645,750
    Olivia LiangSupport EngineerSingapore642011/02/03$234,500
    Bruno NashSoftware EngineerLondon382011/05/03$163,500
    Sakura YamamotoSupport EngineerTokyo372009/08/19$139,575
    Thor WaltonDeveloperNew York612013/08/11$98,540
    Finn CamachoSupport EngineerSan Francisco472009/07/07$87,500
    Serge BaldwinData CoordinatorSingapore642012/04/09$138,575
    Zenaida FrankSoftware EngineerNew York632010/01/04$125,250
    Zorita SerranoSoftware EngineerSan Francisco562012/06/01$115,000
    Jennifer AcostaJunior Javascript DeveloperEdinburgh432013/02/01$75,650
    Cara StevensSales AssistantNew York462011/12/06$145,600
    Hermione ButlerRegional DirectorLondon472011/03/21$356,250
    Lael GreerSystems AdministratorLondon212009/02/27$103,500
    Jonas AlexanderDeveloperSan Francisco302010/07/14$86,500
    Shad DeckerRegional DirectorEdinburgh512008/11/13$183,000
    Michael BruceJavascript DeveloperSingapore292011/06/27$183,000
    Donna SniderCustomer SupportNew York272011/01/25$112,000
    + +
      +
    • Javascript
    • +
    • HTML
    • +
    • CSS
    • +
    • Ajax
    • +
    • Server-side script
    • +
    + +
    +
    +

    The Javascript shown below is used to initialise the table shown in this example:

    $(document).ready(function() { + var table = $('#example').dataTable( { + dom: 'Rlfrtip' + } ); + + new $.fn.dataTable.fixedHeader( table ); +} ); + +

    In addition to the above code, the following Javascript library files are loaded for use in this example:

    + + +
    + +
    +

    The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

    +
    + +
    +
    +

    This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:

    +
    + +

    The following CSS library files are loaded for use in this example to provide the styling of the table:

    + + +
    + +
    +

    This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.

    +
    + +
    +

    The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using the protocol described in the DataTables + documentation.

    +
    +
    +
    +
    + +
    + +
    + + \ No newline at end of file diff --git a/public/assets/js/plugins/datatables/extensions/ColReorder/examples/index.html b/public/assets/js/plugins/datatables/extensions/ColReorder/examples/index.html new file mode 100755 index 0000000000..65018ab6ff --- /dev/null +++ b/public/assets/js/plugins/datatables/extensions/ColReorder/examples/index.html @@ -0,0 +1,74 @@ + + + + + + + + + + + + + ColReorder examples - ColReorder examples + + + +
    +
    +

    ColReorder example ColReorder examples

    + +
    +

    ColReorder adds the ability for the end user to click and drag column headers to reorder a table as they see fit, to DataTables. Key features include:

    + +
      +
    • Very easy integration with DataTables
    • +
    • Tight integration with all other DataTables plug-ins
    • +
    • The ability to exclude the first (or more) column from being movable
    • +
    • Predefine a column order
    • +
    • Save staving integration with DataTables
    • +
    +
    +
    +
    + +
    + +
    + + \ No newline at end of file diff --git a/public/assets/js/plugins/datatables/extensions/ColReorder/examples/jqueryui.html b/public/assets/js/plugins/datatables/extensions/ColReorder/examples/jqueryui.html new file mode 100755 index 0000000000..8eedf9126e --- /dev/null +++ b/public/assets/js/plugins/datatables/extensions/ColReorder/examples/jqueryui.html @@ -0,0 +1,635 @@ + + + + + + + + ColReorder example - jQuery UI styling + + + + + + + + + + + + + + + + +
    +
    +

    ColReorder example jQuery UI styling

    + +
    +

    This example shows how the jQuery UI ThemeRoller option in DataTables can be used with ColReorder.

    + +

    The important thing to note here is that it is easier to use new $.fn.dataTable.ColReorder() to add ColReorder to the table rather than domDT as the jQuery UI integration + uses a complex expression for domDT.

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NamePositionOfficeAgeStart dateSalary
    NamePositionOfficeAgeStart dateSalary
    Tiger NixonSystem ArchitectEdinburgh612011/04/25$320,800
    Garrett WintersAccountantTokyo632011/07/25$170,750
    Ashton CoxJunior Technical AuthorSan Francisco662009/01/12$86,000
    Cedric KellySenior Javascript DeveloperEdinburgh222012/03/29$433,060
    Airi SatouAccountantTokyo332008/11/28$162,700
    Brielle WilliamsonIntegration SpecialistNew York612012/12/02$372,000
    Herrod ChandlerSales AssistantSan Francisco592012/08/06$137,500
    Rhona DavidsonIntegration SpecialistTokyo552010/10/14$327,900
    Colleen HurstJavascript DeveloperSan Francisco392009/09/15$205,500
    Sonya FrostSoftware EngineerEdinburgh232008/12/13$103,600
    Jena GainesOffice ManagerLondon302008/12/19$90,560
    Quinn FlynnSupport LeadEdinburgh222013/03/03$342,000
    Charde MarshallRegional DirectorSan Francisco362008/10/16$470,600
    Haley KennedySenior Marketing DesignerLondon432012/12/18$313,500
    Tatyana FitzpatrickRegional DirectorLondon192010/03/17$385,750
    Michael SilvaMarketing DesignerLondon662012/11/27$198,500
    Paul ByrdChief Financial Officer (CFO)New York642010/06/09$725,000
    Gloria LittleSystems AdministratorNew York592009/04/10$237,500
    Bradley GreerSoftware EngineerLondon412012/10/13$132,000
    Dai RiosPersonnel LeadEdinburgh352012/09/26$217,500
    Jenette CaldwellDevelopment LeadNew York302011/09/03$345,000
    Yuri BerryChief Marketing Officer (CMO)New York402009/06/25$675,000
    Caesar VancePre-Sales SupportNew York212011/12/12$106,450
    Doris WilderSales AssistantSidney232010/09/20$85,600
    Angelica RamosChief Executive Officer (CEO)London472009/10/09$1,200,000
    Gavin JoyceDeveloperEdinburgh422010/12/22$92,575
    Jennifer ChangRegional DirectorSingapore282010/11/14$357,650
    Brenden WagnerSoftware EngineerSan Francisco282011/06/07$206,850
    Fiona GreenChief Operating Officer (COO)San Francisco482010/03/11$850,000
    Shou ItouRegional MarketingTokyo202011/08/14$163,000
    Michelle HouseIntegration SpecialistSidney372011/06/02$95,400
    Suki BurksDeveloperLondon532009/10/22$114,500
    Prescott BartlettTechnical AuthorLondon272011/05/07$145,000
    Gavin CortezTeam LeaderSan Francisco222008/10/26$235,500
    Martena MccrayPost-Sales supportEdinburgh462011/03/09$324,050
    Unity ButlerMarketing DesignerSan Francisco472009/12/09$85,675
    Howard HatfieldOffice ManagerSan Francisco512008/12/16$164,500
    Hope FuentesSecretarySan Francisco412010/02/12$109,850
    Vivian HarrellFinancial ControllerSan Francisco622009/02/14$452,500
    Timothy MooneyOffice ManagerLondon372008/12/11$136,200
    Jackson BradshawDirectorNew York652008/09/26$645,750
    Olivia LiangSupport EngineerSingapore642011/02/03$234,500
    Bruno NashSoftware EngineerLondon382011/05/03$163,500
    Sakura YamamotoSupport EngineerTokyo372009/08/19$139,575
    Thor WaltonDeveloperNew York612013/08/11$98,540
    Finn CamachoSupport EngineerSan Francisco472009/07/07$87,500
    Serge BaldwinData CoordinatorSingapore642012/04/09$138,575
    Zenaida FrankSoftware EngineerNew York632010/01/04$125,250
    Zorita SerranoSoftware EngineerSan Francisco562012/06/01$115,000
    Jennifer AcostaJunior Javascript DeveloperEdinburgh432013/02/01$75,650
    Cara StevensSales AssistantNew York462011/12/06$145,600
    Hermione ButlerRegional DirectorLondon472011/03/21$356,250
    Lael GreerSystems AdministratorLondon212009/02/27$103,500
    Jonas AlexanderDeveloperSan Francisco302010/07/14$86,500
    Shad DeckerRegional DirectorEdinburgh512008/11/13$183,000
    Michael BruceJavascript DeveloperSingapore292011/06/27$183,000
    Donna SniderCustomer SupportNew York272011/01/25$112,000
    + +
      +
    • Javascript
    • +
    • HTML
    • +
    • CSS
    • +
    • Ajax
    • +
    • Server-side script
    • +
    + +
    +
    +

    The Javascript shown below is used to initialise the table shown in this example:

    $(document).ready(function() { + var table = $('#example').dataTable(); + + new $.fn.dataTable.ColReorder( table ); +} ); + +

    In addition to the above code, the following Javascript library files are loaded for use in this example:

    + + +
    + +
    +

    The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

    +
    + +
    +
    +

    This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:

    +
    + +

    The following CSS library files are loaded for use in this example to provide the styling of the table:

    + + +
    + +
    +

    This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.

    +
    + +
    +

    The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using the protocol described in the DataTables + documentation.

    +
    +
    +
    +
    + +
    + +
    + + \ No newline at end of file diff --git a/public/assets/js/plugins/datatables/extensions/ColReorder/examples/new_init.html b/public/assets/js/plugins/datatables/extensions/ColReorder/examples/new_init.html new file mode 100755 index 0000000000..01ab2aacde --- /dev/null +++ b/public/assets/js/plugins/datatables/extensions/ColReorder/examples/new_init.html @@ -0,0 +1,626 @@ + + + + + + + + ColReorder example - Initialisation using `new` + + + + + + + + + + + + + + +
    +
    +

    ColReorder example Initialisation using `new`

    + +
    +

    As well as providing the option to be initialised through the R option of domDT, ColReorder can also be added to a DataTable using direct initialisation - new + $.fn.dataTable.ColReorder(); as shown in this example.

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NamePositionOfficeAgeStart dateSalary
    NamePositionOfficeAgeStart dateSalary
    Tiger NixonSystem ArchitectEdinburgh612011/04/25$320,800
    Garrett WintersAccountantTokyo632011/07/25$170,750
    Ashton CoxJunior Technical AuthorSan Francisco662009/01/12$86,000
    Cedric KellySenior Javascript DeveloperEdinburgh222012/03/29$433,060
    Airi SatouAccountantTokyo332008/11/28$162,700
    Brielle WilliamsonIntegration SpecialistNew York612012/12/02$372,000
    Herrod ChandlerSales AssistantSan Francisco592012/08/06$137,500
    Rhona DavidsonIntegration SpecialistTokyo552010/10/14$327,900
    Colleen HurstJavascript DeveloperSan Francisco392009/09/15$205,500
    Sonya FrostSoftware EngineerEdinburgh232008/12/13$103,600
    Jena GainesOffice ManagerLondon302008/12/19$90,560
    Quinn FlynnSupport LeadEdinburgh222013/03/03$342,000
    Charde MarshallRegional DirectorSan Francisco362008/10/16$470,600
    Haley KennedySenior Marketing DesignerLondon432012/12/18$313,500
    Tatyana FitzpatrickRegional DirectorLondon192010/03/17$385,750
    Michael SilvaMarketing DesignerLondon662012/11/27$198,500
    Paul ByrdChief Financial Officer (CFO)New York642010/06/09$725,000
    Gloria LittleSystems AdministratorNew York592009/04/10$237,500
    Bradley GreerSoftware EngineerLondon412012/10/13$132,000
    Dai RiosPersonnel LeadEdinburgh352012/09/26$217,500
    Jenette CaldwellDevelopment LeadNew York302011/09/03$345,000
    Yuri BerryChief Marketing Officer (CMO)New York402009/06/25$675,000
    Caesar VancePre-Sales SupportNew York212011/12/12$106,450
    Doris WilderSales AssistantSidney232010/09/20$85,600
    Angelica RamosChief Executive Officer (CEO)London472009/10/09$1,200,000
    Gavin JoyceDeveloperEdinburgh422010/12/22$92,575
    Jennifer ChangRegional DirectorSingapore282010/11/14$357,650
    Brenden WagnerSoftware EngineerSan Francisco282011/06/07$206,850
    Fiona GreenChief Operating Officer (COO)San Francisco482010/03/11$850,000
    Shou ItouRegional MarketingTokyo202011/08/14$163,000
    Michelle HouseIntegration SpecialistSidney372011/06/02$95,400
    Suki BurksDeveloperLondon532009/10/22$114,500
    Prescott BartlettTechnical AuthorLondon272011/05/07$145,000
    Gavin CortezTeam LeaderSan Francisco222008/10/26$235,500
    Martena MccrayPost-Sales supportEdinburgh462011/03/09$324,050
    Unity ButlerMarketing DesignerSan Francisco472009/12/09$85,675
    Howard HatfieldOffice ManagerSan Francisco512008/12/16$164,500
    Hope FuentesSecretarySan Francisco412010/02/12$109,850
    Vivian HarrellFinancial ControllerSan Francisco622009/02/14$452,500
    Timothy MooneyOffice ManagerLondon372008/12/11$136,200
    Jackson BradshawDirectorNew York652008/09/26$645,750
    Olivia LiangSupport EngineerSingapore642011/02/03$234,500
    Bruno NashSoftware EngineerLondon382011/05/03$163,500
    Sakura YamamotoSupport EngineerTokyo372009/08/19$139,575
    Thor WaltonDeveloperNew York612013/08/11$98,540
    Finn CamachoSupport EngineerSan Francisco472009/07/07$87,500
    Serge BaldwinData CoordinatorSingapore642012/04/09$138,575
    Zenaida FrankSoftware EngineerNew York632010/01/04$125,250
    Zorita SerranoSoftware EngineerSan Francisco562012/06/01$115,000
    Jennifer AcostaJunior Javascript DeveloperEdinburgh432013/02/01$75,650
    Cara StevensSales AssistantNew York462011/12/06$145,600
    Hermione ButlerRegional DirectorLondon472011/03/21$356,250
    Lael GreerSystems AdministratorLondon212009/02/27$103,500
    Jonas AlexanderDeveloperSan Francisco302010/07/14$86,500
    Shad DeckerRegional DirectorEdinburgh512008/11/13$183,000
    Michael BruceJavascript DeveloperSingapore292011/06/27$183,000
    Donna SniderCustomer SupportNew York272011/01/25$112,000
    + +
      +
    • Javascript
    • +
    • HTML
    • +
    • CSS
    • +
    • Ajax
    • +
    • Server-side script
    • +
    + +
    +
    +

    The Javascript shown below is used to initialise the table shown in this example:

    $(document).ready(function() { + var table = $('#example').DataTable(); + + new $.fn.dataTable.ColReorder( table ); +} ); + +

    In addition to the above code, the following Javascript library files are loaded for use in this example:

    + + +
    + +
    +

    The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

    +
    + +
    +
    +

    This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:

    +
    + +

    The following CSS library files are loaded for use in this example to provide the styling of the table:

    + + +
    + +
    +

    This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.

    +
    + +
    +

    The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using the protocol described in the DataTables + documentation.

    +
    +
    +
    +
    + +
    + +
    + + \ No newline at end of file diff --git a/public/assets/js/plugins/datatables/extensions/ColReorder/examples/predefined.html b/public/assets/js/plugins/datatables/extensions/ColReorder/examples/predefined.html new file mode 100755 index 0000000000..3cbb166397 --- /dev/null +++ b/public/assets/js/plugins/datatables/extensions/ColReorder/examples/predefined.html @@ -0,0 +1,636 @@ + + + + + + + + ColReorder example - Predefined column ordering + + + + + + + + + + + + + + +
    +
    +

    ColReorder example Predefined column ordering

    + +
    +

    ColReorder provides the ability to specify a column ordering which is not that of the HTML (which typically you will want) through the parameter + colReorder.order. This is an array of integers with the column ordering you want.

    + +

    For full information about the ColReorder options, please refer to the ColReorder options + documentation.

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NamePositionOfficeAgeStart dateSalary
    NamePositionOfficeAgeStart dateSalary
    Tiger NixonSystem ArchitectEdinburgh612011/04/25$320,800
    Garrett WintersAccountantTokyo632011/07/25$170,750
    Ashton CoxJunior Technical AuthorSan Francisco662009/01/12$86,000
    Cedric KellySenior Javascript DeveloperEdinburgh222012/03/29$433,060
    Airi SatouAccountantTokyo332008/11/28$162,700
    Brielle WilliamsonIntegration SpecialistNew York612012/12/02$372,000
    Herrod ChandlerSales AssistantSan Francisco592012/08/06$137,500
    Rhona DavidsonIntegration SpecialistTokyo552010/10/14$327,900
    Colleen HurstJavascript DeveloperSan Francisco392009/09/15$205,500
    Sonya FrostSoftware EngineerEdinburgh232008/12/13$103,600
    Jena GainesOffice ManagerLondon302008/12/19$90,560
    Quinn FlynnSupport LeadEdinburgh222013/03/03$342,000
    Charde MarshallRegional DirectorSan Francisco362008/10/16$470,600
    Haley KennedySenior Marketing DesignerLondon432012/12/18$313,500
    Tatyana FitzpatrickRegional DirectorLondon192010/03/17$385,750
    Michael SilvaMarketing DesignerLondon662012/11/27$198,500
    Paul ByrdChief Financial Officer (CFO)New York642010/06/09$725,000
    Gloria LittleSystems AdministratorNew York592009/04/10$237,500
    Bradley GreerSoftware EngineerLondon412012/10/13$132,000
    Dai RiosPersonnel LeadEdinburgh352012/09/26$217,500
    Jenette CaldwellDevelopment LeadNew York302011/09/03$345,000
    Yuri BerryChief Marketing Officer (CMO)New York402009/06/25$675,000
    Caesar VancePre-Sales SupportNew York212011/12/12$106,450
    Doris WilderSales AssistantSidney232010/09/20$85,600
    Angelica RamosChief Executive Officer (CEO)London472009/10/09$1,200,000
    Gavin JoyceDeveloperEdinburgh422010/12/22$92,575
    Jennifer ChangRegional DirectorSingapore282010/11/14$357,650
    Brenden WagnerSoftware EngineerSan Francisco282011/06/07$206,850
    Fiona GreenChief Operating Officer (COO)San Francisco482010/03/11$850,000
    Shou ItouRegional MarketingTokyo202011/08/14$163,000
    Michelle HouseIntegration SpecialistSidney372011/06/02$95,400
    Suki BurksDeveloperLondon532009/10/22$114,500
    Prescott BartlettTechnical AuthorLondon272011/05/07$145,000
    Gavin CortezTeam LeaderSan Francisco222008/10/26$235,500
    Martena MccrayPost-Sales supportEdinburgh462011/03/09$324,050
    Unity ButlerMarketing DesignerSan Francisco472009/12/09$85,675
    Howard HatfieldOffice ManagerSan Francisco512008/12/16$164,500
    Hope FuentesSecretarySan Francisco412010/02/12$109,850
    Vivian HarrellFinancial ControllerSan Francisco622009/02/14$452,500
    Timothy MooneyOffice ManagerLondon372008/12/11$136,200
    Jackson BradshawDirectorNew York652008/09/26$645,750
    Olivia LiangSupport EngineerSingapore642011/02/03$234,500
    Bruno NashSoftware EngineerLondon382011/05/03$163,500
    Sakura YamamotoSupport EngineerTokyo372009/08/19$139,575
    Thor WaltonDeveloperNew York612013/08/11$98,540
    Finn CamachoSupport EngineerSan Francisco472009/07/07$87,500
    Serge BaldwinData CoordinatorSingapore642012/04/09$138,575
    Zenaida FrankSoftware EngineerNew York632010/01/04$125,250
    Zorita SerranoSoftware EngineerSan Francisco562012/06/01$115,000
    Jennifer AcostaJunior Javascript DeveloperEdinburgh432013/02/01$75,650
    Cara StevensSales AssistantNew York462011/12/06$145,600
    Hermione ButlerRegional DirectorLondon472011/03/21$356,250
    Lael GreerSystems AdministratorLondon212009/02/27$103,500
    Jonas AlexanderDeveloperSan Francisco302010/07/14$86,500
    Shad DeckerRegional DirectorEdinburgh512008/11/13$183,000
    Michael BruceJavascript DeveloperSingapore292011/06/27$183,000
    Donna SniderCustomer SupportNew York272011/01/25$112,000
    + +
      +
    • Javascript
    • +
    • HTML
    • +
    • CSS
    • +
    • Ajax
    • +
    • Server-side script
    • +
    + +
    +
    +

    The Javascript shown below is used to initialise the table shown in this example:

    $(document).ready(function() { + $('#example').dataTable( { + dom: 'Rlfrtip', + colReorder: { + order: [ 4, 3, 2, 1, 0, 5 ] + } + } ); +} ); + +

    In addition to the above code, the following Javascript library files are loaded for use in this example:

    + + +
    + +
    +

    The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

    +
    + +
    +
    +

    This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:

    +
    + +

    The following CSS library files are loaded for use in this example to provide the styling of the table:

    + + +
    + +
    +

    This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.

    +
    + +
    +

    The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using the protocol described in the DataTables + documentation.

    +
    +
    +
    +
    + +
    + +
    + + \ No newline at end of file diff --git a/public/assets/js/plugins/datatables/extensions/ColReorder/examples/realtime.html b/public/assets/js/plugins/datatables/extensions/ColReorder/examples/realtime.html new file mode 100755 index 0000000000..c759409aa8 --- /dev/null +++ b/public/assets/js/plugins/datatables/extensions/ColReorder/examples/realtime.html @@ -0,0 +1,637 @@ + + + + + + + + ColReorder example - Realtime updating + + + + + + + + + + + + + + +
    +
    +

    ColReorder example Realtime updating

    + +
    +

    While the ColReorder insertion point indicator can be styled, another option to show the end user what the column will look like when the table has been + reordered is to actually do the reordering while the mouse is still dragging the column header. This is shown in this example and is controlled by the + realtime parameter.

    + +

    For full information about the ColReorder options, please refer to the ColReorder options + documentation.

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NamePositionOfficeAgeStart dateSalary
    NamePositionOfficeAgeStart dateSalary
    Tiger NixonSystem ArchitectEdinburgh612011/04/25$320,800
    Garrett WintersAccountantTokyo632011/07/25$170,750
    Ashton CoxJunior Technical AuthorSan Francisco662009/01/12$86,000
    Cedric KellySenior Javascript DeveloperEdinburgh222012/03/29$433,060
    Airi SatouAccountantTokyo332008/11/28$162,700
    Brielle WilliamsonIntegration SpecialistNew York612012/12/02$372,000
    Herrod ChandlerSales AssistantSan Francisco592012/08/06$137,500
    Rhona DavidsonIntegration SpecialistTokyo552010/10/14$327,900
    Colleen HurstJavascript DeveloperSan Francisco392009/09/15$205,500
    Sonya FrostSoftware EngineerEdinburgh232008/12/13$103,600
    Jena GainesOffice ManagerLondon302008/12/19$90,560
    Quinn FlynnSupport LeadEdinburgh222013/03/03$342,000
    Charde MarshallRegional DirectorSan Francisco362008/10/16$470,600
    Haley KennedySenior Marketing DesignerLondon432012/12/18$313,500
    Tatyana FitzpatrickRegional DirectorLondon192010/03/17$385,750
    Michael SilvaMarketing DesignerLondon662012/11/27$198,500
    Paul ByrdChief Financial Officer (CFO)New York642010/06/09$725,000
    Gloria LittleSystems AdministratorNew York592009/04/10$237,500
    Bradley GreerSoftware EngineerLondon412012/10/13$132,000
    Dai RiosPersonnel LeadEdinburgh352012/09/26$217,500
    Jenette CaldwellDevelopment LeadNew York302011/09/03$345,000
    Yuri BerryChief Marketing Officer (CMO)New York402009/06/25$675,000
    Caesar VancePre-Sales SupportNew York212011/12/12$106,450
    Doris WilderSales AssistantSidney232010/09/20$85,600
    Angelica RamosChief Executive Officer (CEO)London472009/10/09$1,200,000
    Gavin JoyceDeveloperEdinburgh422010/12/22$92,575
    Jennifer ChangRegional DirectorSingapore282010/11/14$357,650
    Brenden WagnerSoftware EngineerSan Francisco282011/06/07$206,850
    Fiona GreenChief Operating Officer (COO)San Francisco482010/03/11$850,000
    Shou ItouRegional MarketingTokyo202011/08/14$163,000
    Michelle HouseIntegration SpecialistSidney372011/06/02$95,400
    Suki BurksDeveloperLondon532009/10/22$114,500
    Prescott BartlettTechnical AuthorLondon272011/05/07$145,000
    Gavin CortezTeam LeaderSan Francisco222008/10/26$235,500
    Martena MccrayPost-Sales supportEdinburgh462011/03/09$324,050
    Unity ButlerMarketing DesignerSan Francisco472009/12/09$85,675
    Howard HatfieldOffice ManagerSan Francisco512008/12/16$164,500
    Hope FuentesSecretarySan Francisco412010/02/12$109,850
    Vivian HarrellFinancial ControllerSan Francisco622009/02/14$452,500
    Timothy MooneyOffice ManagerLondon372008/12/11$136,200
    Jackson BradshawDirectorNew York652008/09/26$645,750
    Olivia LiangSupport EngineerSingapore642011/02/03$234,500
    Bruno NashSoftware EngineerLondon382011/05/03$163,500
    Sakura YamamotoSupport EngineerTokyo372009/08/19$139,575
    Thor WaltonDeveloperNew York612013/08/11$98,540
    Finn CamachoSupport EngineerSan Francisco472009/07/07$87,500
    Serge BaldwinData CoordinatorSingapore642012/04/09$138,575
    Zenaida FrankSoftware EngineerNew York632010/01/04$125,250
    Zorita SerranoSoftware EngineerSan Francisco562012/06/01$115,000
    Jennifer AcostaJunior Javascript DeveloperEdinburgh432013/02/01$75,650
    Cara StevensSales AssistantNew York462011/12/06$145,600
    Hermione ButlerRegional DirectorLondon472011/03/21$356,250
    Lael GreerSystems AdministratorLondon212009/02/27$103,500
    Jonas AlexanderDeveloperSan Francisco302010/07/14$86,500
    Shad DeckerRegional DirectorEdinburgh512008/11/13$183,000
    Michael BruceJavascript DeveloperSingapore292011/06/27$183,000
    Donna SniderCustomer SupportNew York272011/01/25$112,000
    + +
      +
    • Javascript
    • +
    • HTML
    • +
    • CSS
    • +
    • Ajax
    • +
    • Server-side script
    • +
    + +
    +
    +

    The Javascript shown below is used to initialise the table shown in this example:

    $(document).ready(function() { + $('#example').dataTable( { + dom: 'Rlfrtip', + colReorder: { + realtime: true + } + } ); +} ); + +

    In addition to the above code, the following Javascript library files are loaded for use in this example:

    + + +
    + +
    +

    The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

    +
    + +
    +
    +

    This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:

    +
    + +

    The following CSS library files are loaded for use in this example to provide the styling of the table:

    + + +
    + +
    +

    This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.

    +
    + +
    +

    The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using the protocol described in the DataTables + documentation.

    +
    +
    +
    +
    + +
    + +
    + + \ No newline at end of file diff --git a/public/assets/js/plugins/datatables/extensions/ColReorder/examples/reset.html b/public/assets/js/plugins/datatables/extensions/ColReorder/examples/reset.html new file mode 100755 index 0000000000..b2e1fc08ff --- /dev/null +++ b/public/assets/js/plugins/datatables/extensions/ColReorder/examples/reset.html @@ -0,0 +1,649 @@ + + + + + + + + ColReorder example - Reset ordering API + + + + + + + + + + + + + + +
    +
    +

    ColReorder example Reset ordering API

    + +
    +

    One useful control option to present the end user when using ColReorder is the ability to reset the column ordering to that which was found in the HTML. This + can be done by calling the reset API function. While ColReorder does not provide a visual element for this itself (in order to provide maximum + flexibility) it is easy to hook to an event handler, as shown in this example.

    + +

    For full information about the ColReorder API, please refer to the ColReorder API documentation.

    +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NamePositionOfficeAgeStart dateSalary
    NamePositionOfficeAgeStart dateSalary
    Tiger NixonSystem ArchitectEdinburgh612011/04/25$320,800
    Garrett WintersAccountantTokyo632011/07/25$170,750
    Ashton CoxJunior Technical AuthorSan Francisco662009/01/12$86,000
    Cedric KellySenior Javascript DeveloperEdinburgh222012/03/29$433,060
    Airi SatouAccountantTokyo332008/11/28$162,700
    Brielle WilliamsonIntegration SpecialistNew York612012/12/02$372,000
    Herrod ChandlerSales AssistantSan Francisco592012/08/06$137,500
    Rhona DavidsonIntegration SpecialistTokyo552010/10/14$327,900
    Colleen HurstJavascript DeveloperSan Francisco392009/09/15$205,500
    Sonya FrostSoftware EngineerEdinburgh232008/12/13$103,600
    Jena GainesOffice ManagerLondon302008/12/19$90,560
    Quinn FlynnSupport LeadEdinburgh222013/03/03$342,000
    Charde MarshallRegional DirectorSan Francisco362008/10/16$470,600
    Haley KennedySenior Marketing DesignerLondon432012/12/18$313,500
    Tatyana FitzpatrickRegional DirectorLondon192010/03/17$385,750
    Michael SilvaMarketing DesignerLondon662012/11/27$198,500
    Paul ByrdChief Financial Officer (CFO)New York642010/06/09$725,000
    Gloria LittleSystems AdministratorNew York592009/04/10$237,500
    Bradley GreerSoftware EngineerLondon412012/10/13$132,000
    Dai RiosPersonnel LeadEdinburgh352012/09/26$217,500
    Jenette CaldwellDevelopment LeadNew York302011/09/03$345,000
    Yuri BerryChief Marketing Officer (CMO)New York402009/06/25$675,000
    Caesar VancePre-Sales SupportNew York212011/12/12$106,450
    Doris WilderSales AssistantSidney232010/09/20$85,600
    Angelica RamosChief Executive Officer (CEO)London472009/10/09$1,200,000
    Gavin JoyceDeveloperEdinburgh422010/12/22$92,575
    Jennifer ChangRegional DirectorSingapore282010/11/14$357,650
    Brenden WagnerSoftware EngineerSan Francisco282011/06/07$206,850
    Fiona GreenChief Operating Officer (COO)San Francisco482010/03/11$850,000
    Shou ItouRegional MarketingTokyo202011/08/14$163,000
    Michelle HouseIntegration SpecialistSidney372011/06/02$95,400
    Suki BurksDeveloperLondon532009/10/22$114,500
    Prescott BartlettTechnical AuthorLondon272011/05/07$145,000
    Gavin CortezTeam LeaderSan Francisco222008/10/26$235,500
    Martena MccrayPost-Sales supportEdinburgh462011/03/09$324,050
    Unity ButlerMarketing DesignerSan Francisco472009/12/09$85,675
    Howard HatfieldOffice ManagerSan Francisco512008/12/16$164,500
    Hope FuentesSecretarySan Francisco412010/02/12$109,850
    Vivian HarrellFinancial ControllerSan Francisco622009/02/14$452,500
    Timothy MooneyOffice ManagerLondon372008/12/11$136,200
    Jackson BradshawDirectorNew York652008/09/26$645,750
    Olivia LiangSupport EngineerSingapore642011/02/03$234,500
    Bruno NashSoftware EngineerLondon382011/05/03$163,500
    Sakura YamamotoSupport EngineerTokyo372009/08/19$139,575
    Thor WaltonDeveloperNew York612013/08/11$98,540
    Finn CamachoSupport EngineerSan Francisco472009/07/07$87,500
    Serge BaldwinData CoordinatorSingapore642012/04/09$138,575
    Zenaida FrankSoftware EngineerNew York632010/01/04$125,250
    Zorita SerranoSoftware EngineerSan Francisco562012/06/01$115,000
    Jennifer AcostaJunior Javascript DeveloperEdinburgh432013/02/01$75,650
    Cara StevensSales AssistantNew York462011/12/06$145,600
    Hermione ButlerRegional DirectorLondon472011/03/21$356,250
    Lael GreerSystems AdministratorLondon212009/02/27$103,500
    Jonas AlexanderDeveloperSan Francisco302010/07/14$86,500
    Shad DeckerRegional DirectorEdinburgh512008/11/13$183,000
    Michael BruceJavascript DeveloperSingapore292011/06/27$183,000
    Donna SniderCustomer SupportNew York272011/01/25$112,000
    + +
      +
    • Javascript
    • +
    • HTML
    • +
    • CSS
    • +
    • Ajax
    • +
    • Server-side script
    • +
    + +
    +
    +

    The Javascript shown below is used to initialise the table shown in this example:

    $(document).ready(function() { + var table = $('#example').DataTable( { + dom: 'Rlfrtip', + colReorder: { + order: [ 4, 3, 2, 1, 0 ] + } + } ); + + $('#reset').click( function (e) { + e.preventDefault(); + + table.colReorder.reset(); + } ); +} ); + +

    In addition to the above code, the following Javascript library files are loaded for use in this example:

    + + +
    + +
    +

    The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

    +
    + +
    +
    +

    This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:

    +
    + +

    The following CSS library files are loaded for use in this example to provide the styling of the table:

    + + +
    + +
    +

    This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.

    +
    + +
    +

    The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using the protocol described in the DataTables + documentation.

    +
    +
    +
    +
    + +
    + +
    + + \ No newline at end of file diff --git a/public/assets/js/plugins/datatables/extensions/ColReorder/examples/scrolling.html b/public/assets/js/plugins/datatables/extensions/ColReorder/examples/scrolling.html new file mode 100755 index 0000000000..860e665584 --- /dev/null +++ b/public/assets/js/plugins/datatables/extensions/ColReorder/examples/scrolling.html @@ -0,0 +1,632 @@ + + + + + + + + ColReorder example - Scrolling table + + + + + + + + + + + + + + +
    +
    +

    ColReorder example Scrolling table

    + +
    +

    This is a simple example to show ColReorder working with DataTables scrolling (scrollYDT and scrollXDT).

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NamePositionOfficeAgeStart dateSalary
    NamePositionOfficeAgeStart dateSalary
    Tiger NixonSystem ArchitectEdinburgh612011/04/25$320,800
    Garrett WintersAccountantTokyo632011/07/25$170,750
    Ashton CoxJunior Technical AuthorSan Francisco662009/01/12$86,000
    Cedric KellySenior Javascript DeveloperEdinburgh222012/03/29$433,060
    Airi SatouAccountantTokyo332008/11/28$162,700
    Brielle WilliamsonIntegration SpecialistNew York612012/12/02$372,000
    Herrod ChandlerSales AssistantSan Francisco592012/08/06$137,500
    Rhona DavidsonIntegration SpecialistTokyo552010/10/14$327,900
    Colleen HurstJavascript DeveloperSan Francisco392009/09/15$205,500
    Sonya FrostSoftware EngineerEdinburgh232008/12/13$103,600
    Jena GainesOffice ManagerLondon302008/12/19$90,560
    Quinn FlynnSupport LeadEdinburgh222013/03/03$342,000
    Charde MarshallRegional DirectorSan Francisco362008/10/16$470,600
    Haley KennedySenior Marketing DesignerLondon432012/12/18$313,500
    Tatyana FitzpatrickRegional DirectorLondon192010/03/17$385,750
    Michael SilvaMarketing DesignerLondon662012/11/27$198,500
    Paul ByrdChief Financial Officer (CFO)New York642010/06/09$725,000
    Gloria LittleSystems AdministratorNew York592009/04/10$237,500
    Bradley GreerSoftware EngineerLondon412012/10/13$132,000
    Dai RiosPersonnel LeadEdinburgh352012/09/26$217,500
    Jenette CaldwellDevelopment LeadNew York302011/09/03$345,000
    Yuri BerryChief Marketing Officer (CMO)New York402009/06/25$675,000
    Caesar VancePre-Sales SupportNew York212011/12/12$106,450
    Doris WilderSales AssistantSidney232010/09/20$85,600
    Angelica RamosChief Executive Officer (CEO)London472009/10/09$1,200,000
    Gavin JoyceDeveloperEdinburgh422010/12/22$92,575
    Jennifer ChangRegional DirectorSingapore282010/11/14$357,650
    Brenden WagnerSoftware EngineerSan Francisco282011/06/07$206,850
    Fiona GreenChief Operating Officer (COO)San Francisco482010/03/11$850,000
    Shou ItouRegional MarketingTokyo202011/08/14$163,000
    Michelle HouseIntegration SpecialistSidney372011/06/02$95,400
    Suki BurksDeveloperLondon532009/10/22$114,500
    Prescott BartlettTechnical AuthorLondon272011/05/07$145,000
    Gavin CortezTeam LeaderSan Francisco222008/10/26$235,500
    Martena MccrayPost-Sales supportEdinburgh462011/03/09$324,050
    Unity ButlerMarketing DesignerSan Francisco472009/12/09$85,675
    Howard HatfieldOffice ManagerSan Francisco512008/12/16$164,500
    Hope FuentesSecretarySan Francisco412010/02/12$109,850
    Vivian HarrellFinancial ControllerSan Francisco622009/02/14$452,500
    Timothy MooneyOffice ManagerLondon372008/12/11$136,200
    Jackson BradshawDirectorNew York652008/09/26$645,750
    Olivia LiangSupport EngineerSingapore642011/02/03$234,500
    Bruno NashSoftware EngineerLondon382011/05/03$163,500
    Sakura YamamotoSupport EngineerTokyo372009/08/19$139,575
    Thor WaltonDeveloperNew York612013/08/11$98,540
    Finn CamachoSupport EngineerSan Francisco472009/07/07$87,500
    Serge BaldwinData CoordinatorSingapore642012/04/09$138,575
    Zenaida FrankSoftware EngineerNew York632010/01/04$125,250
    Zorita SerranoSoftware EngineerSan Francisco562012/06/01$115,000
    Jennifer AcostaJunior Javascript DeveloperEdinburgh432013/02/01$75,650
    Cara StevensSales AssistantNew York462011/12/06$145,600
    Hermione ButlerRegional DirectorLondon472011/03/21$356,250
    Lael GreerSystems AdministratorLondon212009/02/27$103,500
    Jonas AlexanderDeveloperSan Francisco302010/07/14$86,500
    Shad DeckerRegional DirectorEdinburgh512008/11/13$183,000
    Michael BruceJavascript DeveloperSingapore292011/06/27$183,000
    Donna SniderCustomer SupportNew York272011/01/25$112,000
    + +
      +
    • Javascript
    • +
    • HTML
    • +
    • CSS
    • +
    • Ajax
    • +
    • Server-side script
    • +
    + +
    +
    +

    The Javascript shown below is used to initialise the table shown in this example:

    $(document).ready(function() { + $('#example').dataTable( { + dom: 'Rlfrtip', + scrollY: '200px', + paging: false + } ); +} ); + +

    In addition to the above code, the following Javascript library files are loaded for use in this example:

    + + +
    + +
    +

    The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

    +
    + +
    +
    +

    This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:

    +
    + +

    The following CSS library files are loaded for use in this example to provide the styling of the table:

    + + +
    + +
    +

    This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.

    +
    + +
    +

    The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using the protocol described in the DataTables + documentation.

    +
    +
    +
    +
    + +
    + +
    + + \ No newline at end of file diff --git a/public/assets/js/plugins/datatables/extensions/ColReorder/examples/server_side.html b/public/assets/js/plugins/datatables/extensions/ColReorder/examples/server_side.html new file mode 100755 index 0000000000..f682b7ab52 --- /dev/null +++ b/public/assets/js/plugins/datatables/extensions/ColReorder/examples/server_side.html @@ -0,0 +1,192 @@ + + + + + + + + ColReorder example - Server-side processing + + + + + + + + + + + + + + +
    +
    +

    ColReorder example Server-side processing

    + +
    +

    Server-side processing can be exceptionally useful in DataTables when dealing with massive data sets, and ColReorder works with this as would be expected.

    + +

    It is recommend that you use object based data with server-side processing and ColReorder, as this provides easily understandable mapping between the the + columns and the data relation on the server, otherwise you need to work out array indexes on each call!

    +
    + + + + + + + + + + + + + + + + + + + + + + + +
    NamePositionOfficeExtn.Start dateSalary
    NamePositionOfficeExtn.Start dateSalary
    + +
      +
    • Javascript
    • +
    • HTML
    • +
    • CSS
    • +
    • Ajax
    • +
    • Server-side script
    • +
    + +
    +
    +

    The Javascript shown below is used to initialise the table shown in this example:

    $(document).ready(function() { + $('#example').dataTable( { + dom: 'Rlfrtip', + processing: true, + serverSide: true, + ajax: "../../../examples/server_side/scripts/objects.php", + columns: [ + { data: "first_name" }, + { data: "last_name" }, + { data: "position" }, + { data: "office" }, + { data: "start_date" }, + { data: "salary" } + ] + } ); +} ); + +

    In addition to the above code, the following Javascript library files are loaded for use in this example:

    + + +
    + +
    +

    The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

    +
    + +
    +
    +

    This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:

    +
    + +

    The following CSS library files are loaded for use in this example to provide the styling of the table:

    + + +
    + +
    +

    This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.

    +
    + +
    +

    The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using the protocol described in the DataTables + documentation.

    +
    +
    +
    +
    + +
    + +
    + + \ No newline at end of file diff --git a/public/assets/js/plugins/datatables/extensions/ColReorder/examples/simple.html b/public/assets/js/plugins/datatables/extensions/ColReorder/examples/simple.html new file mode 100755 index 0000000000..92cffee792 --- /dev/null +++ b/public/assets/js/plugins/datatables/extensions/ColReorder/examples/simple.html @@ -0,0 +1,630 @@ + + + + + + + + ColReorder example - Basic initialisation + + + + + + + + + + + + + + +
    +
    +

    ColReorder example Basic initialisation

    + +
    +

    This example shows the basic use case of the ColReorder plug-in. With ColReorder enabled for a table, the user has the ability to click and drag any table + header cell, and drop it where they wish the column to be inserted. The insert point is shown visually, and the column reordering is done as soon as the mouse + button is released.

    + +

    ColReorder is added to a DataTable through the R character that it adds to DataTables feature plug-ins. This means that you simply add the + character R to the domDT parameter for your table to add ColReorder - as shown in the example below.

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NamePositionOfficeAgeStart dateSalary
    NamePositionOfficeAgeStart dateSalary
    Tiger NixonSystem ArchitectEdinburgh612011/04/25$320,800
    Garrett WintersAccountantTokyo632011/07/25$170,750
    Ashton CoxJunior Technical AuthorSan Francisco662009/01/12$86,000
    Cedric KellySenior Javascript DeveloperEdinburgh222012/03/29$433,060
    Airi SatouAccountantTokyo332008/11/28$162,700
    Brielle WilliamsonIntegration SpecialistNew York612012/12/02$372,000
    Herrod ChandlerSales AssistantSan Francisco592012/08/06$137,500
    Rhona DavidsonIntegration SpecialistTokyo552010/10/14$327,900
    Colleen HurstJavascript DeveloperSan Francisco392009/09/15$205,500
    Sonya FrostSoftware EngineerEdinburgh232008/12/13$103,600
    Jena GainesOffice ManagerLondon302008/12/19$90,560
    Quinn FlynnSupport LeadEdinburgh222013/03/03$342,000
    Charde MarshallRegional DirectorSan Francisco362008/10/16$470,600
    Haley KennedySenior Marketing DesignerLondon432012/12/18$313,500
    Tatyana FitzpatrickRegional DirectorLondon192010/03/17$385,750
    Michael SilvaMarketing DesignerLondon662012/11/27$198,500
    Paul ByrdChief Financial Officer (CFO)New York642010/06/09$725,000
    Gloria LittleSystems AdministratorNew York592009/04/10$237,500
    Bradley GreerSoftware EngineerLondon412012/10/13$132,000
    Dai RiosPersonnel LeadEdinburgh352012/09/26$217,500
    Jenette CaldwellDevelopment LeadNew York302011/09/03$345,000
    Yuri BerryChief Marketing Officer (CMO)New York402009/06/25$675,000
    Caesar VancePre-Sales SupportNew York212011/12/12$106,450
    Doris WilderSales AssistantSidney232010/09/20$85,600
    Angelica RamosChief Executive Officer (CEO)London472009/10/09$1,200,000
    Gavin JoyceDeveloperEdinburgh422010/12/22$92,575
    Jennifer ChangRegional DirectorSingapore282010/11/14$357,650
    Brenden WagnerSoftware EngineerSan Francisco282011/06/07$206,850
    Fiona GreenChief Operating Officer (COO)San Francisco482010/03/11$850,000
    Shou ItouRegional MarketingTokyo202011/08/14$163,000
    Michelle HouseIntegration SpecialistSidney372011/06/02$95,400
    Suki BurksDeveloperLondon532009/10/22$114,500
    Prescott BartlettTechnical AuthorLondon272011/05/07$145,000
    Gavin CortezTeam LeaderSan Francisco222008/10/26$235,500
    Martena MccrayPost-Sales supportEdinburgh462011/03/09$324,050
    Unity ButlerMarketing DesignerSan Francisco472009/12/09$85,675
    Howard HatfieldOffice ManagerSan Francisco512008/12/16$164,500
    Hope FuentesSecretarySan Francisco412010/02/12$109,850
    Vivian HarrellFinancial ControllerSan Francisco622009/02/14$452,500
    Timothy MooneyOffice ManagerLondon372008/12/11$136,200
    Jackson BradshawDirectorNew York652008/09/26$645,750
    Olivia LiangSupport EngineerSingapore642011/02/03$234,500
    Bruno NashSoftware EngineerLondon382011/05/03$163,500
    Sakura YamamotoSupport EngineerTokyo372009/08/19$139,575
    Thor WaltonDeveloperNew York612013/08/11$98,540
    Finn CamachoSupport EngineerSan Francisco472009/07/07$87,500
    Serge BaldwinData CoordinatorSingapore642012/04/09$138,575
    Zenaida FrankSoftware EngineerNew York632010/01/04$125,250
    Zorita SerranoSoftware EngineerSan Francisco562012/06/01$115,000
    Jennifer AcostaJunior Javascript DeveloperEdinburgh432013/02/01$75,650
    Cara StevensSales AssistantNew York462011/12/06$145,600
    Hermione ButlerRegional DirectorLondon472011/03/21$356,250
    Lael GreerSystems AdministratorLondon212009/02/27$103,500
    Jonas AlexanderDeveloperSan Francisco302010/07/14$86,500
    Shad DeckerRegional DirectorEdinburgh512008/11/13$183,000
    Michael BruceJavascript DeveloperSingapore292011/06/27$183,000
    Donna SniderCustomer SupportNew York272011/01/25$112,000
    + +
      +
    • Javascript
    • +
    • HTML
    • +
    • CSS
    • +
    • Ajax
    • +
    • Server-side script
    • +
    + +
    +
    +

    The Javascript shown below is used to initialise the table shown in this example:

    $(document).ready(function() { + $('#example').DataTable( { + dom: 'Rlfrtip' + } ); +} ); + +

    In addition to the above code, the following Javascript library files are loaded for use in this example:

    + + +
    + +
    +

    The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

    +
    + +
    +
    +

    This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:

    +
    + +

    The following CSS library files are loaded for use in this example to provide the styling of the table:

    + + +
    + +
    +

    This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.

    +
    + +
    +

    The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using the protocol described in the DataTables + documentation.

    +
    +
    +
    +
    + +
    + +
    + + \ No newline at end of file diff --git a/public/assets/js/plugins/datatables/extensions/ColReorder/examples/state_save.html b/public/assets/js/plugins/datatables/extensions/ColReorder/examples/state_save.html new file mode 100755 index 0000000000..6e4e2e9eec --- /dev/null +++ b/public/assets/js/plugins/datatables/extensions/ColReorder/examples/state_save.html @@ -0,0 +1,631 @@ + + + + + + + + ColReorder example - State saving + + + + + + + + + + + + + + +
    +
    +

    ColReorder example State saving

    + +
    +

    A useful interaction pattern to use in DataTables is state saving, so when the end user reloads or revisits a page its previous state is retained. ColReorder + works seamlessly with state saving in DataTables (stateSaveDT), remembering and restoring the column positions, as well as everything else such as sorting + and filtering.

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NamePositionOfficeAgeStart dateSalary
    NamePositionOfficeAgeStart dateSalary
    Tiger NixonSystem ArchitectEdinburgh612011/04/25$320,800
    Garrett WintersAccountantTokyo632011/07/25$170,750
    Ashton CoxJunior Technical AuthorSan Francisco662009/01/12$86,000
    Cedric KellySenior Javascript DeveloperEdinburgh222012/03/29$433,060
    Airi SatouAccountantTokyo332008/11/28$162,700
    Brielle WilliamsonIntegration SpecialistNew York612012/12/02$372,000
    Herrod ChandlerSales AssistantSan Francisco592012/08/06$137,500
    Rhona DavidsonIntegration SpecialistTokyo552010/10/14$327,900
    Colleen HurstJavascript DeveloperSan Francisco392009/09/15$205,500
    Sonya FrostSoftware EngineerEdinburgh232008/12/13$103,600
    Jena GainesOffice ManagerLondon302008/12/19$90,560
    Quinn FlynnSupport LeadEdinburgh222013/03/03$342,000
    Charde MarshallRegional DirectorSan Francisco362008/10/16$470,600
    Haley KennedySenior Marketing DesignerLondon432012/12/18$313,500
    Tatyana FitzpatrickRegional DirectorLondon192010/03/17$385,750
    Michael SilvaMarketing DesignerLondon662012/11/27$198,500
    Paul ByrdChief Financial Officer (CFO)New York642010/06/09$725,000
    Gloria LittleSystems AdministratorNew York592009/04/10$237,500
    Bradley GreerSoftware EngineerLondon412012/10/13$132,000
    Dai RiosPersonnel LeadEdinburgh352012/09/26$217,500
    Jenette CaldwellDevelopment LeadNew York302011/09/03$345,000
    Yuri BerryChief Marketing Officer (CMO)New York402009/06/25$675,000
    Caesar VancePre-Sales SupportNew York212011/12/12$106,450
    Doris WilderSales AssistantSidney232010/09/20$85,600
    Angelica RamosChief Executive Officer (CEO)London472009/10/09$1,200,000
    Gavin JoyceDeveloperEdinburgh422010/12/22$92,575
    Jennifer ChangRegional DirectorSingapore282010/11/14$357,650
    Brenden WagnerSoftware EngineerSan Francisco282011/06/07$206,850
    Fiona GreenChief Operating Officer (COO)San Francisco482010/03/11$850,000
    Shou ItouRegional MarketingTokyo202011/08/14$163,000
    Michelle HouseIntegration SpecialistSidney372011/06/02$95,400
    Suki BurksDeveloperLondon532009/10/22$114,500
    Prescott BartlettTechnical AuthorLondon272011/05/07$145,000
    Gavin CortezTeam LeaderSan Francisco222008/10/26$235,500
    Martena MccrayPost-Sales supportEdinburgh462011/03/09$324,050
    Unity ButlerMarketing DesignerSan Francisco472009/12/09$85,675
    Howard HatfieldOffice ManagerSan Francisco512008/12/16$164,500
    Hope FuentesSecretarySan Francisco412010/02/12$109,850
    Vivian HarrellFinancial ControllerSan Francisco622009/02/14$452,500
    Timothy MooneyOffice ManagerLondon372008/12/11$136,200
    Jackson BradshawDirectorNew York652008/09/26$645,750
    Olivia LiangSupport EngineerSingapore642011/02/03$234,500
    Bruno NashSoftware EngineerLondon382011/05/03$163,500
    Sakura YamamotoSupport EngineerTokyo372009/08/19$139,575
    Thor WaltonDeveloperNew York612013/08/11$98,540
    Finn CamachoSupport EngineerSan Francisco472009/07/07$87,500
    Serge BaldwinData CoordinatorSingapore642012/04/09$138,575
    Zenaida FrankSoftware EngineerNew York632010/01/04$125,250
    Zorita SerranoSoftware EngineerSan Francisco562012/06/01$115,000
    Jennifer AcostaJunior Javascript DeveloperEdinburgh432013/02/01$75,650
    Cara StevensSales AssistantNew York462011/12/06$145,600
    Hermione ButlerRegional DirectorLondon472011/03/21$356,250
    Lael GreerSystems AdministratorLondon212009/02/27$103,500
    Jonas AlexanderDeveloperSan Francisco302010/07/14$86,500
    Shad DeckerRegional DirectorEdinburgh512008/11/13$183,000
    Michael BruceJavascript DeveloperSingapore292011/06/27$183,000
    Donna SniderCustomer SupportNew York272011/01/25$112,000
    + +
      +
    • Javascript
    • +
    • HTML
    • +
    • CSS
    • +
    • Ajax
    • +
    • Server-side script
    • +
    + +
    +
    +

    The Javascript shown below is used to initialise the table shown in this example:

    $(document).ready(function() { + $('#example').dataTable( { + dom: 'Rlfrtip', + stateSave: true + } ); +} ); + +

    In addition to the above code, the following Javascript library files are loaded for use in this example:

    + + +
    + +
    +

    The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

    +
    + +
    +
    +

    This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:

    +
    + +

    The following CSS library files are loaded for use in this example to provide the styling of the table:

    + + +
    + +
    +

    This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.

    +
    + +
    +

    The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using the protocol described in the DataTables + documentation.

    +
    +
    +
    +
    + +
    + +
    + + \ No newline at end of file diff --git a/public/assets/js/plugins/datatables/extensions/ColReorder/images/insert.png b/public/assets/js/plugins/datatables/extensions/ColReorder/images/insert.png new file mode 100755 index 0000000000..15d5522da6 Binary files /dev/null and b/public/assets/js/plugins/datatables/extensions/ColReorder/images/insert.png differ diff --git a/public/assets/js/plugins/datatables/extensions/ColReorder/js/dataTables.colReorder.js b/public/assets/js/plugins/datatables/extensions/ColReorder/js/dataTables.colReorder.js new file mode 100755 index 0000000000..c3b2f1e2ad --- /dev/null +++ b/public/assets/js/plugins/datatables/extensions/ColReorder/js/dataTables.colReorder.js @@ -0,0 +1,1372 @@ +/*! ColReorder 1.1.3 + * ©2010-2014 SpryMedia Ltd - datatables.net/license + */ + +/** + * @summary ColReorder + * @description Provide the ability to reorder columns in a DataTable + * @version 1.1.3 + * @file dataTables.colReorder.js + * @author SpryMedia Ltd (www.sprymedia.co.uk) + * @contact www.sprymedia.co.uk/contact + * @copyright Copyright 2010-2014 SpryMedia Ltd. + * + * This source file is free software, available under the following license: + * MIT license - http://datatables.net/license/mit + * + * This source file is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details. + * + * For details please refer to: http://www.datatables.net + */ + +(function(window, document, undefined) { + + +/** + * Switch the key value pairing of an index array to be value key (i.e. the old value is now the + * key). For example consider [ 2, 0, 1 ] this would be returned as [ 1, 2, 0 ]. + * @method fnInvertKeyValues + * @param array aIn Array to switch around + * @returns array + */ +function fnInvertKeyValues( aIn ) +{ + var aRet=[]; + for ( var i=0, iLen=aIn.length ; i= iCols ) + { + this.oApi._fnLog( oSettings, 1, "ColReorder 'from' index is out of bounds: "+iFrom ); + return; + } + + if ( iTo < 0 || iTo >= iCols ) + { + this.oApi._fnLog( oSettings, 1, "ColReorder 'to' index is out of bounds: "+iTo ); + return; + } + + /* + * Calculate the new column array index, so we have a mapping between the old and new + */ + var aiMapping = []; + for ( i=0, iLen=iCols ; i this.s.fixed-1 && i < iLen - this.s.fixedRight ) + { + this._fnMouseListener( i, this.s.dt.aoColumns[i].nTh ); + } + + /* Mark the original column order for later reference */ + this.s.dt.aoColumns[i]._ColReorder_iOrigCol = i; + } + + /* State saving */ + this.s.dt.oApi._fnCallbackReg( this.s.dt, 'aoStateSaveParams', function (oS, oData) { + that._fnStateSave.call( that, oData ); + }, "ColReorder_State" ); + + /* An initial column order has been specified */ + var aiOrder = null; + if ( this.s.init.aiOrder ) + { + aiOrder = this.s.init.aiOrder.slice(); + } + + /* State loading, overrides the column order given */ + if ( this.s.dt.oLoadedState && typeof this.s.dt.oLoadedState.ColReorder != 'undefined' && + this.s.dt.oLoadedState.ColReorder.length == this.s.dt.aoColumns.length ) + { + aiOrder = this.s.dt.oLoadedState.ColReorder; + } + + /* If we have an order to apply - do so */ + if ( aiOrder ) + { + /* We might be called during or after the DataTables initialisation. If before, then we need + * to wait until the draw is done, if after, then do what we need to do right away + */ + if ( !that.s.dt._bInitComplete ) + { + var bDone = false; + this.s.dt.aoDrawCallback.push( { + "fn": function () { + if ( !that.s.dt._bInitComplete && !bDone ) + { + bDone = true; + var resort = fnInvertKeyValues( aiOrder ); + that._fnOrderColumns.call( that, resort ); + } + }, + "sName": "ColReorder_Pre" + } ); + } + else + { + var resort = fnInvertKeyValues( aiOrder ); + that._fnOrderColumns.call( that, resort ); + } + } + else { + this._fnSetColumnIndexes(); + } + }, + + + /** + * Set the column order from an array + * @method _fnOrderColumns + * @param array a An array of integers which dictate the column order that should be applied + * @returns void + * @private + */ + "_fnOrderColumns": function ( a ) + { + if ( a.length != this.s.dt.aoColumns.length ) + { + this.s.dt.oInstance.oApi._fnLog( this.s.dt, 1, "ColReorder - array reorder does not "+ + "match known number of columns. Skipping." ); + return; + } + + for ( var i=0, iLen=a.length ; i
    ') + .addClass( 'DTCR_pointer' ) + .css( { + position: 'absolute', + top: scrolling ? + $('div.dataTables_scroll', this.s.dt.nTableWrapper).offset().top : + $(this.s.dt.nTable).offset().top, + height : scrolling ? + $('div.dataTables_scroll', this.s.dt.nTableWrapper).height() : + $(this.s.dt.nTable).height() + } ) + .appendTo( 'body' ); + }, + + /** + * Clean up ColReorder memory references and event handlers + * @method _fnDestroy + * @returns void + * @private + */ + "_fnDestroy": function () + { + var i, iLen; + + for ( i=0, iLen=this.s.dt.aoDrawCallback.length ; ib||b>=n)this.oApi._fnLog(a,1,"ColReorder 'from' index is out of bounds: "+b);else if(0>e||e>=n)this.oApi._fnLog(a,1,"ColReorder 'to' index is out of bounds: "+e);else{f=[];c=0;for(g=n;cthis.s.fixed-1&&eMath.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 b=!1,e=this.s.mouse.toIndex,d=1,c=this.s.aoTargets.length;d
    ").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")},_fnDestroy:function(){var a,b;a=0;for(b=this.s.dt.aoDrawCallback.length;a
  • ' + ) + .click( function (e) { + for ( var i=0, iLen=that.s.abOriginal.length ; i'+ + str+ + '' + ) + .click( function (e) { + for ( var i=0, iLen=that.s.abOriginal.length ; i'+ + ''+ + '' + ) + .click( function (e) { + var showHide = !$('input', this).is(":checked"); + if ( e.target.nodeName.toLowerCase() !== "li" ) + { + showHide = ! showHide; + } + + for ( var j=0 ; j < oGroup.aiColumns.length ; j++ ) + { + that.s.dt.oInstance.fnSetColumnVis( oGroup.aiColumns[j], showHide ); + } + } )[0]; + }, + + + /** + * Create the DOM for a show / hide button + * @method _fnDomColumnButton + * @param {int} i Column in question + * @returns {Node} Created button + * @private + */ + "_fnDomColumnButton": function ( i ) + { + var + that = this, + column = this.s.dt.aoColumns[i], + dt = this.s.dt; + + var title = this.s.fnLabel===null ? + column.sTitle : + this.s.fnLabel( i, column.sTitle, column.nTh ); + + return $( + '
  • '+ + ''+ + '
  • ' + ) + .click( function (e) { + var showHide = !$('input', this).is(":checked"); + if ( e.target.nodeName.toLowerCase() !== "li" ) + { + if ( e.target.nodeName.toLowerCase() == "input" || that.s.fnStateChange === null ) + { + showHide = ! showHide; + } + } + + /* Need to consider the case where the initialiser created more than one table - change the + * API index that DataTables is using + */ + var oldIndex = $.fn.dataTableExt.iApiIndex; + $.fn.dataTableExt.iApiIndex = that._fnDataTablesApiIndex.call(that); + + // Optimisation for server-side processing when scrolling - don't do a full redraw + if ( dt.oFeatures.bServerSide ) + { + that.s.dt.oInstance.fnSetColumnVis( i, showHide, false ); + that.s.dt.oInstance.fnAdjustColumnSizing( false ); + if (dt.oScroll.sX !== "" || dt.oScroll.sY !== "" ) + { + that.s.dt.oInstance.oApi._fnScrollDraw( that.s.dt ); + } + that._fnDrawCallback(); + } + else + { + that.s.dt.oInstance.fnSetColumnVis( i, showHide ); + } + + $.fn.dataTableExt.iApiIndex = oldIndex; /* Restore */ + + if ( that.s.fnStateChange !== null ) + { + if ( e.target.nodeName.toLowerCase() == "span" ) + { + e.preventDefault(); + } + that.s.fnStateChange.call( that, i, showHide ); + } + } )[0]; + }, + + + /** + * Get the position in the DataTables instance array of the table for this + * instance of ColVis + * @method _fnDataTablesApiIndex + * @returns {int} Index + * @private + */ + "_fnDataTablesApiIndex": function () + { + for ( var i=0, iLen=this.s.dt.oInstance.length ; i