diff --git a/.travis.yml b/.travis.yml index 0bcf953af..1eb24f950 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,5 @@ # N.B. Ubuntu Precise available on Travis until March 2018 dist: precise -sudo: required language: php before_install: - mysql -e 'CREATE DATABASE doctrine;' @@ -18,11 +17,9 @@ env: matrix: include: - dist: trusty - sudo: false env: DB=mysql php: '5.4' - dist: trusty - sudo: false env: DB=mysql php: '5.5' allow_failures: diff --git a/.travis/run_tests.sh b/.travis/run_tests.sh index 05b35f983..b2216bc04 100755 --- a/.travis/run_tests.sh +++ b/.travis/run_tests.sh @@ -4,7 +4,7 @@ if [[ $TRAVIS ]]; then cd "$TRAVIS_BUILD_DIR" || exit 2 # Check modified PHP files with PHP's internal syntax checker - git diff --name-only HEAD^ | grep '\.php$' | xargs -r -n 1 php -l || exit 1 + git diff --name-only --diff-filter=ACMRTUXB HEAD^ | grep '\.php$' | xargs -r -n 1 php -l || exit 1 # Run test suite vendor/bin/phpunit tests/DoctrineTestSuite1.php diff --git a/INSTALL.md b/INSTALL.md index e5aa6baaf..ab4140a82 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -10,19 +10,22 @@ This file is best viewed using a browser-plugin for markdown `.md` files. ## Prerequisites +* [GOCDB website content](#gocdb-website-content-) + * 'Git-cloned' or by archive from https://github.com/GOCDB/gocdb + * [PHP](#php) * v5.3.3 (newer versions should be fine, but are untested) * If using Oracle: PHP oci8 extension (needs to be compiled using the Oracle Instant client v10 or higher downloadable from Oracle website, see "Compiling OCI8" section below). - * libxml2 and DOM support for PHP (Note: On RHEL, PHP requires the PHP XML RPM to be installed for this component to function). + * libxml2 and DOM support for PHP (Note: On RHEL, PHP requires the php-xml RPM to be installed for this component to function). * OpenSSL Extension for PHP -* [Apache Http](#apache) - * Version 2.2 or higher +* [Apache Http](#apache-and-x509-host-cert) + * Version 2.2 or higher with `mod_ssl` module * X509 host certificate. -* [Database server](#rdbms) - * Oracle 11g+ or MySQL +* [Database server](#database-server) + * Oracle 11g+ or MariaDB/MySQL * (note: the free Oracle 11g XE Express Editions which comes with a free license is perfectly suitable) * [Doctrine and DBAL](#doctrine) @@ -30,11 +33,18 @@ This file is best viewed using a browser-plugin for markdown `.md` files. * Note, for doctine 2.3.3 and older there is a bug in the paging code, which affects the GetDowntime API result. The fix is detailed [below](#doctrineFix) * dbal 2.5.4 - a DB abstraction layer that doctine depends on (newer versions should be fine but are untested) -* PhpUnit and PDO driver for selected DB (optional, required for running DBUnit tests only, see `tests/INSTALL.md` for more info) +* PhpUnit and PDO driver for selected DB (optional, required for running DBUnit tests only, see `tests/README.md` for more info) +### GOCDB website content +GOCDB web content and configuration - html,css,php etc. and configuration samples should be downloaded from [Github](https://github.com/GOCDB/gocdb) either by 'git-cloning' or from a downloaded archive. The standard location is under /usr/share/gocdb e.g.- -### PHP +```bash +cd /usr/share +git-clone https://github.com/GOCDB/gocdb.git +``` + +### PHP Php needs to be installed and configured to run under apache and on the command line. A sample configuration is copied below: @@ -92,61 +102,89 @@ update your php.ini by adding `extension=[php_]timezonedb.so|dll` (note, Win pre * If you are planning to use Oracle, you need the php oci8 extension, which must be compiled. ([php oci8](http://php.net/manual/en/book.oci8.php)) * Do not forget to configure your timezone settings correctly. -### Apache and x509 Host cert +### Apache and x509 Host cert + +A sample Apache config file is provided `config/gocdbssl.conf`. This file +defines a sample apache virtual host for serving your GocDB portal, including URL mappings/aliases and SSL settings. +For GocDB, three URL alias/directory-mappings are needed, one for the portal GUI page-controller, one for the public REST endpoints and one for the private REST endpoints. See the sample config file for details. -* A sample Apache config file is provided `config/gocdbssl.conf`. This file -defines a sample apache virtual host for serving your GocDB portal, including -URL mappings/aliases and SSL settings. -For GocDB, three URL alias/directory-mappings are needed, one for the portal GUI -page-controller, one for the public REST endpoints and one for the private REST -endpoints. See the sample config file for details. +Note that, depending on Apache/httpd version, the "Require all granted" statements in gocdbssl.conf may cause an HTTP Error "500 - Invalid configuration..." and can be commented out. -### Database Server -GOCDB uses a DB abstraction layer (Doctrine) and with some configuration should be deployable on different RDBMS platforms that are supported for Doctrine. Instructions are provided here for Oracle (the free Oracle 11g is perfectly suitable) and MySQL/MariaDB comming soon. +### Database Server +GOCDB uses a DB abstraction layer (Doctrine) and with some configuration should be deployable on different RDBMS platforms that are supported for Doctrine. Instructions are provided here for Oracle (the free Oracle 11g is perfectly suitable) and MySQL/MariaDB. #### Oracle 11g The free to use XE/11g Oracle DB can be used to host run GOCDB on Win/nix. To use Oracle on nix systems, the OCI8 extension/driver needs to be compiled and installed. ##### Compiling/Installing OCI8 The OCI8 extension/driver for php needs to be installed, see: http://php.net/oci8 -This can be most easily installed with the free Oracle Instant Client libs which can be installed in a number of ways (http://php.net/manual/en/oci8.installation.php), but the most easy is via PECL as descibed below: +This can be most easily installed with the free Oracle Instant Client libs which can be installed in a number of ways (http://php.net/manual/en/oci8.installation.php), but the most easy is via PECL as descibed below: -Install the basic and devel instantclient rpms from Oracle (http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html) and install GCC, PHP dev and pear packages: +Install the basic, devel and sqlplus instantclient rpms from Oracle (http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html) and install GCC, PHP dev and pear packages: ```bash rpm -i oracle-instanclient* yum install gcc php-pear php-devel ``` -Set the pear http proxy if necessary, and the install the oci8 module using pecl: +Optionally, set the pear http proxy if necessary: ```bash pear config-set http_proxy http://pro.xy:port -pecl install oci8-2.0.10 ``` +Install the oci8 module using pecl: + +```bash +pecl install oci8-2.0.10 +``` This will download and compile the module, and place it in your php extension dir. -Add the ```extension=oci8.so``` line to your php.ini. Confirm it is working with ```php -i | grep -i oci8``` +Add the ```extension=oci8.so``` line to your php.ini or create a configuration file: + +```bash +echo 'extension=oci8.so' > /etc/php.d/oci8.ini +``` + +Confirm it is working with ```php -i | grep -i oci8``` + +#### MariaDB/MySQL +The following instructions are to set up a local MariaDB/MySQL database for GOCDB. They have not been tested in a production enviroment and are currently intended for test instances. + +First you will need to install the MariaDB/MySQL server and client. Then start the 'mariadb'/'mysqld' service. + +1. Access the CLI for MariaDB/MySQL + + ``` + $ mysql + ``` +1. Create a database to use + ```` + CREATE DATABASE gocdb DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_bin; + ```` + +1. Create a user to access it and give that user a password + + ```` + CREATE USER 'gocdbuser'@'localhost' IDENTIFIED BY 'PASSWORD_GOES_HERE'; + ```` + +1. Grant the user permissions over the database. Note: these permissions are wider than is strictly required and deployment into a production environment would first require revising these permissions more in line with those given for Oracle in the set up instructions. + + ```` + GRANT ALL PRIVILEGES ON gocdb.* TO 'gocdbuser'@'localhost'; + FLUSH PRIVILEGES; + ```` + +You are now good to continue the installation. ### Doctrine Install Doctrine ORM and DBAL using one of the methods below and make sure doctrine is available on the command line. Note, Doctrine can be installed either globally using PEAR or as a project -specific dependency using composer. Either way, ensure your `$PATH` environment -variable is updated to run the doctrine command line client: - -```bash -$ export PATH=$PATH:/home/djm76/programming/php/gocdb5_mep/gocdb/vendor/bin -$ cd lib/Doctrine -$ doctrine --version -Doctrine Command Line Interface version 2.4.8 -$ doctrine-dbal --version -Doctrine Command Line Interface version 2.5.4 -``` -Note: you will need to run `$doctrine --version` from within the `gocDBSrcHome/lib/Doctrine` directory. +specific dependency using composer. #### Install Doctrine Via Composer (Recommended) @@ -209,11 +247,26 @@ see: [pear installation](http://pear.php.net/manual/en/installation.getting.php) $ $ echo 'to list packages installed in a particular channel:' $ pear list -c pear.doctrine-project.org - $ + $ $ echo 'to uninstall a package' $ pear uninstall pear.doctrine-project.org/DoctrineORM ``` +#### Check Doctrine installation + + Whichever way you installed Doctrine, ensure that your `$PATH` environment variable is updated to run the doctrine command line client. + + Note: you need to run `$doctrine --version` from within the `gocDBSrcHome/lib/Doctrine` directory. + + ```bash + $ export PATH=$PATH:/home/djm76/programming/php/gocdb5_mep/gocdb/vendor/bin + $ cd lib/Doctrine + $ doctrine --version + Doctrine Command Line Interface version 2.4.8 + $ doctrine-dbal --version + Doctrine Command Line Interface version 2.5.4 + ``` + #### Paginator fix When using doctrine 2.3.3 on an oracle database, returning an ordered list of results using the Paginator will not honour the specified ordering. e.g. instead of returning the 100 most recent downtimes when using `orderby START_TIME descending`, it will return the first hundred downtimes in the table, which have then been ordered by start_time descending. See https://github.com/doctrine/doctrine2/issues/2456 for more details. @@ -238,6 +291,8 @@ deployment of your GOCDB instance: ### Create DB User/Account #### Oracle +If you intend to populate the database from a dump of an existing GOCDB5 instance you do NOT need to create the GOCDB5 user. Simply deploy the data as described at ["Deploy and existing DB"](#deploy-existing-dump) below remembering that you might want to ALTER the password for the GOCDB5 user after the import. + We advise that you create a dedicated GOCDB5 user. For Oracle, you can create the user with the following script (substitute GOCDB5 for your username and a sensible password). Run this script as the Oracle admin/system user: @@ -245,14 +300,13 @@ a sensible password). Run this script as the Oracle admin/system user: ``` -- Manage GOCDB5 user if already exists (optional) -- drop user gocdb5 cascade; -ALTER USER gocdb5 IDENTIFIED BY new_password; -- CREATE USER SQL CREATE USER GOCDB5 IDENTIFIED BY DEFAULT TABLESPACE "USERS" +QUOTA UNLIMITED ON "USERS" TEMPORARY TABLESPACE "TEMP"; --- ROLES -GRANT "RESOURCE" TO GOCDB5 ; +-- ROLES - GRANT "RESOURCE" TO GOCDB5 -- SYSTEM PRIVILEGES GRANT CREATE TRIGGER TO GOCDB5 ; GRANT CREATE SEQUENCE TO GOCDB5 ; @@ -263,6 +317,12 @@ GRANT CREATE TYPE TO GOCDB5 ; GRANT CREATE SESSION TO GOCDB5 ; ``` +If you are using sqlplus to connect to the database remotely you will need also - + +``` +GRANT CONNECT TO GOCDB5; +``` + By default, Oracle 11g will expire a password in 180 days. In previous versions of Oracle, the default policy was UNLIMITED, so please be aware of this change! As a system user, you can see your password expiry settings by looking at the @@ -296,7 +356,7 @@ The database schema is deployed to your database using Doctrine. * Locate the provided template file: `bootstrap_doctrine_TEMPLATE.php`. In this file you will find three blocks of code commented out, once for each of the supported database, SQLite, Oracle and MySQL. -* Copy this file to `bootstrap_doctrine.php` in the same dir and modify to +* Copy this file to `bootstrap_doctrine.php` in the same dir and modify (including commenting out the "die" statement at the top of the file) to specify your chosen DB connection details (see file for more details, including how to compile Doctrine proxy objects for better performance for production usage). * Check that doctrine can connect to the DB running the following (still in the /lib/Doctrine directory): @@ -361,7 +421,7 @@ $ cd lib/Doctrine $ php deploy/DeploySampleDataRunner.php sampleData ``` -### Deploy an existing DB .dmp file to populate your DB +### Deploy an existing DB .dmp file to populate your DB You may want to deploy an existing dump/backup of the DB rather than deploying the DDL and seeding the empty DB with required data and sample data. Oracle provides the @@ -373,10 +433,7 @@ This directory object defines the directory where the .dmp file is loaded from. ``` sqlplus system - SQL> create or replace DIRECTORY 'dmpdir' AS ''; - SQL> grant read,write on directory dmpdir to ; - SQL> SELECT owner, directory_name, directory_path FROM all_directories; - SQL> select directory_path from dba_directories where upper(directory_name) = 'DMPDIR'; + SQL> create or replace DIRECTORY dmpdir AS ''; SQL> exit ``` diff --git a/config/local_info.xml b/config/local_info.xml index 7d8985bff..99054487a 100755 --- a/config/local_info.xml +++ b/config/local_info.xml @@ -41,11 +41,8 @@ EGI - - - - true - + + true +

Acceptable Use Policy and Conditions of Use

+

Your use of the Grid Operations Centre Database is governed by the EGI Acceptable Use Policy and Conditions of Use (Version 2) reproduced below and available from https://documents.egi.eu/document/2623.

+

This policy is effective from 10/10/2016 and replaces an earlier version of this document [R1]. This policy is one of a set of documents that together define the Security Policy [R2]. This individual document must be considered in conjunction with all the policy documents in the set.

+

By registering as a user you declare that you have read, understood and will abide by the following conditions of use:

+
    +
  1. You shall only use the resources/services to perform work, or transmit or store data consistent with the stated goals, policies and conditions of use as defined by the body or bodies granting you access.

  2. +
  3. You shall provide appropriate acknowledgement of support or citation for your use of the resources/services provided as required by the body or bodies granting you access.

  4. +
  5. You shall not use the resources/services for any purpose that is unlawful and not (attempt to) breach or circumvent any administrative or security controls.

  6. +
  7. You shall respect intellectual property and confidentiality agreements.

  8. +
  9. You shall protect your access credentials (e.g. private keys or passwords).

  10. +
  11. You shall keep all your registered information correct and up to date.

  12. +
  13. You shall immediately report any known or suspected security breach or misuse of the resources/services or access credentials to the specified incident reporting locations and to the relevant credential issuing authorities.

  14. +
  15. You use the resources/services at your own risk. There is no guarantee that the resources/services will be available at any time or that their integrity or confidentiality will be preserved or that they will suit any purpose.

  16. +
  17. You agree that logged information, including personal data provided by you for registration purposes, may be used for administrative, operational, accounting, monitoring and security purposes. You agree that this logged information may be disclosed to other authorised participants via secured mechanisms, only for the same purposes and only as far as necessary to provide the services.

  18. +
  19. You agree that the body or bodies granting you access and resource/service providers are entitled to regulate, suspend or terminate your access without prior notice and without compensation, within their domain of authority, and you shall immediately comply with their instructions.

  20. +
  21. You are liable for the consequences of your violation of any of these conditions of use, which may include but are not limited to the reporting of your violation to your home institute and, if the activities are thought to be illegal, to appropriate law enforcement agencies.

  22. +
+

References

+ + + + + + + + + + + + + +
R 1(Old version) Grid Acceptable Use Policy: https://documents.egi.eu/document/74
R 2Approved EGI Security Policies: https://wiki.egi.eu/wiki/SPG:Documents
+

Document Information

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Document identifierEGI-SPG-AUP-V2
Document Linkhttps://documents.egi.eu/document/2623
Last Modified15/10/2016
Version2
Policy Group AcronymSPG
Policy Group NameSecurity Policy Group
Contact PersonDavid Kelsey / STFC
Document TypeSecurity Policy
Document StatusApproved
Approved byEGI Foundation Executive Board
Approved Date10/10/2016
+ + +
+ Return to GOCDB homepage. +
+ + + + \ No newline at end of file diff --git a/htdocs/landing/background2.jpg b/htdocs/landing/background2.jpg deleted file mode 100644 index bb8b79285..000000000 Binary files a/htdocs/landing/background2.jpg and /dev/null differ diff --git a/htdocs/landing/contentBackground.jpg b/htdocs/landing/contentBackground.jpg deleted file mode 100644 index f6a45b878..000000000 Binary files a/htdocs/landing/contentBackground.jpg and /dev/null differ diff --git a/htdocs/landing/egi_logo.jpg b/htdocs/landing/egi_logo.jpg deleted file mode 100644 index 003949e37..000000000 Binary files a/htdocs/landing/egi_logo.jpg and /dev/null differ diff --git a/htdocs/landing/egi_logo_no_background_150.png b/htdocs/landing/egi_logo_no_background_150.png new file mode 100644 index 000000000..b2b3736e3 Binary files /dev/null and b/htdocs/landing/egi_logo_no_background_150.png differ diff --git a/htdocs/landing/eosc-hub-v-web.png b/htdocs/landing/eosc-hub-v-web.png new file mode 100644 index 000000000..1a6181f55 Binary files /dev/null and b/htdocs/landing/eosc-hub-v-web.png differ diff --git a/htdocs/landing/eosc-hub-v-web_150.png b/htdocs/landing/eosc-hub-v-web_150.png new file mode 100644 index 000000000..cb01764c0 Binary files /dev/null and b/htdocs/landing/eosc-hub-v-web_150.png differ diff --git a/htdocs/landing/eu.jpg b/htdocs/landing/eu.jpg deleted file mode 100644 index 3986ab0ce..000000000 Binary files a/htdocs/landing/eu.jpg and /dev/null differ diff --git a/htdocs/landing/eu_flag_yellow_low_150.png b/htdocs/landing/eu_flag_yellow_low_150.png new file mode 100644 index 000000000..aed408669 Binary files /dev/null and b/htdocs/landing/eu_flag_yellow_low_150.png differ diff --git a/htdocs/landing/home.css b/htdocs/landing/home.css index bf0e552db..5bacc569e 100644 --- a/htdocs/landing/home.css +++ b/htdocs/landing/home.css @@ -1,622 +1,143 @@ body { - background-image: url('background2.jpg'); - background-repeat: no-repeat; - background-color: #b3cfff; - color: #272A4B; - font-family: "VAGRoundedLtRegular",Tahoma, "museo-sans-1", "museo-sans-2", "Helvetica Neue", Geneva,sans-serif; - font-size: 0.8em; - text-align: center; - text-align: left; -} - -a img { - border: none; -} - -h1,th,h2,h3,h4 { - color: #00ac00; - text-decoration: none; - font-weight:normal; - margin-top: 0em; - margin-bottom: 0.2em; + background: linear-gradient(to bottom left,#F7F9FE, #DEE9FB, #D0DFF9); + background-repeat: no-repeat; + color: #272A4B; + font-family: 'PT Sans', sans-serif; + font-size: 0.8em; + text-align: center; + text-align: left; + background-attachment: fixed; + margin: 0; + height: 100%; +} + +.button { + background: #48D249; /* backstop for (IE) compatibility mode view setting */ + background: linear-gradient(#48D249, #B0EBB1); + color: white; + text-align: center; + display: block; + font-size: 2.3em; + border-radius: 0.4em; + padding: 0.4em 1em; + width: 50%; + margin-left: auto; + margin-right: auto; + margin-top: 4%; + margin-bottom: 4%; } -h1, h2, h3 { - color: #00c100; - text-shadow: 1px 1px 1px #d5ddd5; +html { + height: 100%; } -a { - color: #103C7A; - text-decoration: none; +h1,h2,h3 { + color: #00AC00; + text-decoration: none; + font-weight:normal; margin-top: 0em; - margin-bottom: 0em; -} - -h4 { - margin-top: 0.5em; - margin-bottom: 0.5em; -} - -h3 { - /*border-top: 1px solid #505050;*/ - /*border-bottom: 1px solid #505050;*/ - /*margin-bottom: 0.25em;*/ - padding-bottom: 1em; - font-size: 1.5em; - /*font-weight: normal;*/ - margin-top: 0em; - border-top: 0em; - padding-top: 0em; -} - -h4 { - padding-bottom: 1em; - font-size: 1em; - /*font-weight: normal;*/ - margin-top: 0em; - border-top: 0em; - padding-top: 0em; - font-weight: normal; -} - -h3.Standard_Padding { - margin: 0em; -} - -h1 { + margin-bottom: 0.2em; + text-shadow: 1px 1px 1px #D5DDD5; font-size: 2.5em; } - -/* - * Containing DIV's - * Page Container is the whole page - * Left Box is the menu - * Right Box is the smaller page contents - */ -.page_container { - position: relative; - margin-left: auto; - margin-right: auto; - width: 50em; - min-width: 45em; - overflow: hidden; - /* border: 1px solid black; */ - z-index: 1; - background-color: transparent; -} - -/* Credit for this section of CSS goes to Matt Lira of STFC, 2009 */ -.left_box_menu { - float: left; - margin: 0.5em 0.5em 0.5em 0.5em; - padding: 0.5em 0.5em 0.5em 0.5em; - border: 1px solid grey; - width: 11.5em; - box-shadow: 2px 2px 1px 0px #8da4c9; - background-color: white; - border-radius: 0.4em; -} - -div.Left_Search_Box { - clear: left; - margin-top: 0em; -} - -input.Search { - width: 85%; - margin-left: 1em; - margin-bottom: 0.5em; -} - -input.Search_Button { - margin-left: 1em; - margin-bottom: 0.5em; -} - -div.Left_User_Status_Box { - clear: left; - margin-top: 0em; -} - -div.Left_Logo_Box { - float: left; - clear: left; -} - -div.Indented { - margin-left: 1em; -} - -.right_box { - position: relative; - padding: 0.5em 1em 0.0em 1em; - /* border: 1px solid #505050; */ -} - -.empty { - clear: both; -} - -.Logo_Text { - display: inline; -} - -.logo_image { - display: inline; - height: 3em; - text-align: center; -} - -h3.Small_Bottom_Margin { - margin-bottom: 0.25em; - padding-bottom: 0.25em; -} -h4.menu_title { - margin-bottom: 0.25em; - padding-bottom: 0.25em; - padding-left: 0.5em; -} - -/* Input Form Configuration */ -.inputForm { - display: inline; -} - -.input_button { - margin-top: 0.5em; - font-size: 0.7em; -} - -.input_name { - display: block; - /*width: 20em;*/ - font-size: 0.9em; -} - -.input_syntax { - display: inline; - /*width: 20em;*/ - color: #909090; - font-style: italic; - font-size: 0.9em; -} - -span.menu_link { - display: inline; - font-size: 1em; - margin-bottom: 0.5em; - color: #103C7A; - border: 0.1em solid #FFFFFF; -} - -span.menu_link:hover { - border: 0.1em solid #00C100; -} - -hr.Menu_Spacer { - position: relative; - width: 11em; - left: -1.5em; -} - -ul.Smaller_Top_Margin { - margin-top: 0em; -} - -ul.Smaller_Left_Padding { - padding-left: 2em; - margin-bottom: 0.5em; -} - -li { - color: #3E6397; - list-style-type: circle; - /* border: 0.1em solid; */ - margin-left: -0.4em; - margin-bottom: 0.3em; -} - -.input_input_text { - width: 90%; - margin-bottom: 1em; - margin-left: 2em; -} - -.input_input_date { - width: 30%; - margin-bottom: 1em; - margin-left: 2em; -} - -.table_row_1,.table_header { - background-color: #d3d3d3; -} +/* h2-4 are only used in the Privacy and AUP policy notices */ -.site_table_row_1 { - background-color: #d0e1f7; +h2 { + font-size: 2.0em; } -.site_table_row_2 { - background-color: #f5f5f5; +h3 { + font-size: 1.5em; + line-height: 1; } -td.site_table { - padding-left: 1em; - padding-top: 0.5em; - padding-bottom: 0.5em; +h4 { + line-height: 1; } -th.site_table { - padding-left: 1em; - padding-top: 0.5em; - padding-bottom: 0.5em; - color: black; - font-weight: bold; +a { + color: #103C7A; + text-decoration: none; + margin-top: 1.5em; + margin-bottom: 0em; } -.start_page_body { - line-height: 1.5em; +.page_container,.wide_page_container { + position: relative; + margin-left: auto; + margin-right: auto; + width: 50em; + min-width: 45em; + overflow: hidden; + z-index: 1; + background-color: transparent; } -td { - padding: 0.2em; -} +/* wide_page_container is only used in Privacy and AUP policy */ -span.action { - margin-left: auto; - margin-right: auto; - padding: 0em 0.25em 0em 0.25em; - text-align: center; +.wide_page_container { + width: 70em; } -h3.spacer { - display: inline; - width: 4em; +.centre_box { + position: relative; + padding: 0.5em 1em 0.0em 1em; } div.Copyright_Text { - font-size: 0.8em; -} - -a.Licence_Link { - font-family: serif; -} - -span.Developed_By_Text { - font-family: serif; -} - -.add_edit_form { - margin-left: 2em; - margin-bottom: 1em; - width: 90%; -} - -span.Error { - position: relative; - left: -1.5em; -} - -span.New_Service_Endpoint { - padding-bottom: 1em; - display: block; -} - -/* border: medium double rgb(250,0,255);*/ -option.sectionTitle { - background-color: #000000; - font-weight: bold; - font-size: 12px; - color: white; - text-align: center; -} - -/* ################## CALENDAR CSS DIVS ###################### */ - /* calendar icon */ -img.tcalIcon { - cursor: pointer; - margin-left: 1px; - vertical-align: middle; -} - -/* calendar container element */ -div#tcal { - position: absolute; - visibility: hidden; - z-index: 100; - width: 158px; - padding: 2px 0 0 0; -} - -/* all tables in calendar */ -div#tcal table { - width: 100%; - border: 1px solid silver; - border-collapse: collapse; - background-color: white; -} - -/* navigation table */ -div#tcal table.ctrl { - border-bottom: 0; -} - -/* navigation buttons */ -div#tcal table.ctrl td { - width: 15px; - height: 20px; -} - -/* month year header */ -div#tcal table.ctrl th { - background-color: white; - color: black; - border: 0; -} - -/* week days header */ -div#tcal th { - border: 1px solid silver; - border-collapse: collapse; - text-align: center; - padding: 3px 0; - font-family: tahoma, verdana, arial; - font-size: 10px; - background-color: gray; - color: white; -} - -/* date cells */ -div#tcal td { - border: 0; - border-collapse: collapse; - text-align: center; - padding: 2px 0; - font-family: tahoma, verdana, arial; - font-size: 11px; - width: 22px; - cursor: pointer; -} - -/* date highlight - in case of conflicting settings order here determines the priority from least to most important */ -div#tcal td.othermonth { - color: silver; -} - -div#tcal td.weekend { - background-color: #ACD6F5; -} - -div#tcal td.today { - border: 1px solid red; -} - -div#tcal td.selected { - background-color: #FFB3BE; -} - -/* iframe element used to suppress windowed controls in IE5/6 */ -iframe#tcalIF { - position: absolute; - visibility: hidden; - z-index: 98; - border: 0; -} - -/* transparent shadow */ -div#tcalShade { - position: absolute; - visibility: hidden; - z-index: 99; -} - -div#tcalShade table { - border: 0; - border-collapse: collapse; - width: 100%; -} - -div#tcalShade table td { - border: 0; - border-collapse: collapse; - padding: 0; -} - -select.Downtime_Select { - margin-left: 2em; -} - -.header { - color: #009000; -} - -div.listContainer { - width: 99.5%; - float: left; - border: 1px solid grey; - margin-right: 10px; - margin-top: 1.6em; - box-shadow: 2px 2px 1px 0px #8da4c9; - border-radius: 0.4em; -} - -span.listHeader { - vertical-align: middle; - float: left; - padding-top: 0.9em; - padding-left: 1em; -} - -.leftFloat { - float: left; -} - -span.vSiteDescription { - clear: both; - float: left; - padding-bottom: 0.4em; -} - -span.vSitesMoreInfo { - clear: both; - float: left; -} - -img.decoration { - float: right; - padding-right: 1em; - padding-top: 0.5em; - padding-bottom: 0.5em; - height: 25px; -} - -input.vSiteSearch { - color: grey; - float: left; - margin-left: 1em; - margin-top: 0.5em; - margin-bottom: 0.5em; - width: 95%; - clear: left; -} - -input.vSiteSearchButton { - float: left; - margin-left: 1em; - margin-bottom: 1em; -} - -div.vSiteSearchResultContainer { - overflow: auto; - max-height: 20em; - float: left; - width: 100%; - display: none; - border-top: 1px grey solid -} - -span.vSite1emBottomMargin { - padding-bottom: 1em; -} - -table.vSiteResults { - clear: both; - width: 100%; -} - -/* Top page logo */ -img.pageLogo { - height: 60px; - margin-right: 1.5em; -} - -div.rightPageHolder { - overflow: hidden; + font-size: 0.8em; + text-align: center; margin-top: 1em; + margin-bottom: 1em; } -span.vSiteNotice { - clear: both; - display: block; - margin-top: 2em; - float: left; +a.docLink { + color: #00AC00; } -img.centered { - display: block; - margin-left: auto; - margin-right: auto; +a:hover { + text-decoration: underline; } -span.topMargin { - margin-top: 1em; -} - -span.block { - display: block; +img.Sponsor_Logo { + max-height: 100%; + border: none; /* for IE(11) */ } -form.inline { - display: inline; +h1.Landing_Welcome { + display: inline-block; } -div.topMargin { - padding-top: 1em; -} +/* The GOCDB cloverleaf */ -div.topMargin2 { - margin-top: 2em; +img.Landing_Logo { + display: inline-block; + vertical-align:top; + margin-right: 1em; } -div.siteContainer { +.leftFloat { float: left; - clear: both; - border: 1px solid grey; - margin-right: 0px; - margin-top: 1.3em; - padding: 1em; - box-shadow: 1px 1px 1px 0px #8da4c9; - border-radius: 0.4em; -} - -div.clearLeft { - clear: left; -} - -div.siteFilter { - margin-left: 1em; -} - -.leftMargin { - margin-left: 1em; -} - -.middleAlign { - vertical-align: middle; + margin-right:auto; } -/* NGI logo (usually a flag) */ -img.flag { - height: 25px; - width: 38px; -} - -.middle { - vertical-align: middle; -} - -img.nav { - height: 30px; - width: 30px; -} - -div.rightPageContainer { - background: white; - background-image: url('contentBackground.jpg'); - background-position: top right; - background-repeat: no-repeat; - overflow: hidden; - margin-bottom: 3em; +div.centrePageContainer { + background: white; + background-image: url('contentBackground.jpg'); + background-position: top right; + background-repeat: no-repeat; + overflow: hidden; + margin-bottom: 3em; border: 1px solid grey; padding: 1em; - box-shadow: 2px 2px 1px 0px #8da4c9; border-radius: 0.4em; - } -div.tableContainer { - box-shadow: 2px 2px 1px 0px #8da4c9; - border-radius: 0.4em; +div.policyText { + margin-right: 5%; + margin-left: 5%; + margin-top: 3em; + margin-bottom: auto; + text-align: justify; } - -.rounded { - border-radius: 0.5em; -} - -.copyright { - float: left; - margin-left: 0.5em; -} \ No newline at end of file diff --git a/htdocs/landing/index.html b/htdocs/landing/index.html index 62be200f2..24d33cabb 100644 --- a/htdocs/landing/index.html +++ b/htdocs/landing/index.html @@ -1,59 +1,41 @@ - - - - GOCDB - - - - - -
-
-
-
-
- -

Welcome to GOCDB

-
-
- - - -
- + + + + GOCDB + + + + + + +
+
+
+
+
+ +

Welcome to GOCDB

- -
- - - -    - - - -    - - - - - -
- +
+ - - diff --git a/htdocs/landing/privacy.html b/htdocs/landing/privacy.html new file mode 100644 index 000000000..bf4701b5f --- /dev/null +++ b/htdocs/landing/privacy.html @@ -0,0 +1,86 @@ + + + + + GOCDB Privacy Notice + + + + +
+
+
+
+ +

Grid Operations Centre Database Privacy Notice

+

Grid Operations Centre Database (GOCDB) is a central registry to record information about the topology of the EGI e-Infrastructure. This includes information describing operations and resource centres, the type, network connection endpoint and downtimes of services, and the roles and contact information of users.

+

The Science and Technology Facilities Council (STFC) provides the GOCDB service on behalf of EGI.eu. This Privacy Notice describes what personal data is collected from you when you use GOCDB, why it is collected and how this data is used.

+

STFC is part of UK Research and Innovation (UKRI). For more information visit stfc.ukri.org. UKRI and STFC comply with the requirements of the European General Data Protection Regulation with regard to the collection, storage, processing and disclosure of personal information and are committed to upholding the GDPR's core data protection principles. A full notice of UKRI's position with regards to Freedom of Information and the GDPR (EU) (2016/679) can be found at: www.ukri.org/freedom-of-information

+

What personal data is collected from you and why

+

1. Each time you access GOCDB the following information is collected -

+
    +
  • the Distinguished Name (DN) from your personal certificate loaded in your web browser or

  • +
  • an identifier received from the EGI CheckIn service.

  • +
+

This data is necessary for security purposes to uniquely identify and authenticate you when creating and subsequently accessing your GOCDB account.

+

2. You can opt to register the following information to enable creation of a GOCDB account -

+
    +
  • title, first name, last name, email address and (optional) telephone number.

  • +
+

This data is necessary for account management purposes (e.g. to contact you to inform you of changes to the service or for security purposes), and for the reasons given in the paragraph below.

+

3. You may optionally request that the following information be associated with your GOCDB account -

+
    +
  • a GOCDB site and/or other administrative entity (e.g. Project) and

  • +
  • one or more GOCDB roles you are authorised to hold (e.g. Site Administrator) at that entity.

  • +
+

This data is necessary to allow other authorised GOCDB users, or automated services acting on their behalf1, to recognise and contact you in a reliable manner.

+

4. Log records of your access to and actions on GOCDB are retained. These records contain -

+
    +
  • your unique identifier (as in 1 above) and

  • +
  • the network (IP) address from which you access GOCDB and

  • +
  • the time and date of access and

  • +
  • details of actions you perform.

  • +
+

This data is necessary to ensure that the GOCDB service is reliable and secure, such as for assisting in the analysis of reported problems, contacting you if a problem is identified with your account and responding to security incidents.

+

Who your personal data is disclosed to

+

Your personal data will be disclosed only to other authorised users of GOCDB and only for the reasons stated above. All authorised GOCDB users, on registration for a GOCDB account, and at least annually thereafter, have agreed to abide by the conditions of the EGI Policy on the Processing of Personal Data2.

+

Recipients of your personal data, as defined above, may be located in a country outside of the European Economic Area or in a country without an adequate level of data protection pursuant to Article 45.1 of the GDPR or in an International Organisation. In all cases, the conditions as stated in the paragraph above will apply.

+

How to access, rectify and delete your personal data and object to its processing

+

Access the “View Details” page, when logged in to your GOCDB account, to -

+
    +
  • view or edit the personal data held or

  • +
  • delete your account, which will remove your data from the service and terminate its further processing (see also data retention section below).

  • +
+

To rectify details of the unique identifier associated with your account contact, as appropriate, the EGI CheckIn service managers or your certificate’s issuing authority (CA). Please note that changing these details may result in your GOCDB account becoming inaccessible.

+

For all other issues, contact the GOCDB Service Managers at the address given below.

+

How long your personal data will be retained

+

Records of your use of GOCDB, collected for reasons of security (described in 4 above) will be deleted, at latest, 24 months after your last use of the service.

+

Other personal data can be deleted immediately or on request as described above.

+

How your personal data is protected

+

Your personal data is kept safe and protected against unauthorised disclosure according to the requirements of the EGI Policy on the Processing of Personal Data2.

+

Contact information

+

If you have any questions about this Privacy Notice, or to raise concerns or report problems with the GOCDB, please in the first instance contact the GOCDB Service Managers at the address below.

+

Service managers: gocdb-admins@mailman.egi.eu

+

Additional information -

+

Data controller: Science and Technology Facilities Council, part of UK Research and Innovation.

+

Data protection officer: STFCInformationManagement@stfc.ac.uk

+

Supervisory authority: The UK Information Commissioner’s Office (https://ico.org.uk)

+

Jurisdiction: United Kingdom of Great Britain and Northern Ireland (GB-UKM)

+

Further details on how to raise concerns or report problems exercising your rights regarding your personal data can be found here: https://ico.org.uk/for-the-public/raising-concerns

+

This is Version 1.0 of the GOCDB Privacy Notice; the latest version can be obtained from https://goc.egi.eu/privacy.html.

+
+
+
    +
  1. To enable unattended, automated access to GOCDB, an authorised user may associate with their account one or more non-personal identifiers, such as robot or host certificates. Automated access, including the downloading of personal data, is deemed to be by the associated authorised GOCDB user.

  2. +
  3. The “EGI Policy on the Processing of Personal Data” is available here: https://documents.egi.eu/public/RetrieveFile?docid=2732&extension=pdf

  4. +
+
+ +
+
+ Return to GOCDB homepage. +
+
+
+
+ diff --git a/htdocs/web_portal/GOCDB_monitor/index.php b/htdocs/web_portal/GOCDB_monitor/index.php index 6712c42d5..771f78457 100644 --- a/htdocs/web_portal/GOCDB_monitor/index.php +++ b/htdocs/web_portal/GOCDB_monitor/index.php @@ -1,12 +1,14 @@ -

GOCDB MONITOR


"); +
+

GOCDB MONITOR

+
+"; -echo "PI URL is: ".PI_URL ."
"; -echo "Portal URl is: ".PORTAL_URL."
"; -echo "Server Base URL is: ".SERVER_BASE_URL."
"; + +echo "

URLs as defined by local_info.xml

"; +echo "

PI URL is: ".PI_URL."

"; +echo "

Portal URl is: ".PORTAL_URL."

"; +echo "

Server Base URL is: ".SERVER_BASE_URL."

"; // GOCDB5 DB connection $res = test_db_connection(); @@ -23,33 +25,43 @@ $test_statuses["GOCDB5 central portal availability"] = $res["status"]; $test_messages["GOCDB5 central portal availability"] = $res["message"]; - // DISPLAY RESULTS -echo("

Service status overview

"); -echo(""); -echo(""); - -foreach ($test_statuses as $test => $status){ - echo("" - .$disp[$status].""); -} -echo("
TestStatusDetailsDoc/help
- $test". - $test_messages[$test]."". - $test_doc[$test]."
"); +?> -echo("


"); +

Service status overview

+ + + + + + + + + + + $status) { + echo(""); + echo(""); + echo($disp[$status]); + echo(""); + echo(""); + echo(""); +} +?> + +
TestStatusDetailsDoc/help
$test{$test_messages[$test]}{$test_doc[$test]}
-echo("

Other tests and check pages

"); -echo("
    "); -echo("
  • GOCDB server ganglia page - Useful to see if there are memory or CPU problems
  • "); -echo("
  • Status check - non vebose check of GOCDB service status. Just returns 'OK' if all the tests in \"service status overview\" are fine, 'WARNING' or 'ERROR' otherwise. Used for automatic tests
  • "); -echo("
"); +
-echo("

Further documentation

"); -echo(""); +

Other tests and check pages

+
    +
  • GOCDB server ganglia page - Useful to see if there are memory or CPU problems
  • +
  • Status check - non vebose check of GOCDB service status. Just returns 'OK' if all the tests in \"service status overview\" are fine, 'WARNING' or 'ERROR' otherwise. Used for automatic tests
  • +
-?> +

Further documentation

+ diff --git a/htdocs/web_portal/components/Draw_Components/draw_page_components.php b/htdocs/web_portal/components/Draw_Components/draw_page_components.php index 82bdfcef6..4c1af9a12 100644 --- a/htdocs/web_portal/components/Draw_Components/draw_page_components.php +++ b/htdocs/web_portal/components/Draw_Components/draw_page_components.php @@ -122,13 +122,17 @@ function Get_bottom_logos_Box_HTML() { $HTML = ""; $HTML .= '
'; - $HTML .= '
  '; - $HTML .= '  '; - //$HTML .= '
'; - $HTML .= ''; + $HTML .= '
'; + $HTML .= 'The logo of the Science and Technology Facilities Council'; + $HTML .= 'The logo of the European Union  '; + $HTML .= 'The logo of the E G I Foundation'; + $HTML .= 'The logo of the EOSC-hub Horizon 20 20 project'; $HTML .= '
'; - $HTML .= '
'; - $HTML .= 'GOCDB is an EGI service provided by STFC co-funded by EGI.eu and EGI-Engage'; + $HTML .= 'GOCDB is provided by STFC for EGI, co-funded by EGI.eu and EOSC-hub.'; + $HTML .= '
- '; + $HTML .= 'Privacy Notice.'; + $HTML .= '
- '; + $HTML .= 'Acceptable Use Policy.'; $HTML .= '
'; return $HTML; @@ -146,4 +150,4 @@ function Get_File_Contents($Filename) { return $File_Contents; } -?> \ No newline at end of file +?> diff --git a/htdocs/web_portal/components/Draw_Components/menu.php b/htdocs/web_portal/components/Draw_Components/menu.php index 152658900..b865c40b4 100644 --- a/htdocs/web_portal/components/Draw_Components/menu.php +++ b/htdocs/web_portal/components/Draw_Components/menu.php @@ -100,10 +100,10 @@ function add_menu_item($menu_item) } if ($show == "all" or ($show=="write_enabled" and (!$portalIsReadOnly or $userisadmin)) or (($show == "admin") and ($userisadmin))){ $html .= "
  • ". - "". - $name."
  • "; + "". + htmlspecialchars($name).""; } return $html; } -?> \ No newline at end of file +?> diff --git a/htdocs/web_portal/controllers/sitesForGoogleMapXML.php b/htdocs/web_portal/controllers/sitesForMapXML.php similarity index 83% rename from htdocs/web_portal/controllers/sitesForGoogleMapXML.php rename to htdocs/web_portal/controllers/sitesForMapXML.php index 2faf69d81..3f1b25d3e 100644 --- a/htdocs/web_portal/controllers/sitesForGoogleMapXML.php +++ b/htdocs/web_portal/controllers/sitesForMapXML.php @@ -1,9 +1,9 @@ getGoogleMapXMLString(); + $xml = Factory::getSiteService()->getMapXMLString(); } catch(Exception $e){ show_view('error.php', $e->getMessage(), "Error"); @@ -33,5 +33,5 @@ function show_xml(){ $params['XML']=$xml; - show_view('sitesForGoogleMapXML.php', $params, null, true); -} \ No newline at end of file + show_view('sitesForMapXML.php', $params, null, true); +} diff --git a/htdocs/web_portal/controllers/start_page.php b/htdocs/web_portal/controllers/start_page.php index 609414469..fe72e7fae 100644 --- a/htdocs/web_portal/controllers/start_page.php +++ b/htdocs/web_portal/controllers/start_page.php @@ -30,10 +30,8 @@ function startPage() { $configServ = \Factory::getConfigService(); $showMap = $configServ->getShowMapOnStartPage(); - $apiKey = $configServ->getGoogleAPIKey(); $params = array('roles' => $roles, - 'googleAPIKey'=>$apiKey, 'showMap'=>$showMap); $title = "GOCDB"; show_view('start_page.php', $params, $title, null); diff --git a/htdocs/web_portal/css/web_portal.css b/htdocs/web_portal/css/web_portal.css index efef68e50..4b43d69ad 100644 --- a/htdocs/web_portal/css/web_portal.css +++ b/htdocs/web_portal/css/web_portal.css @@ -1,109 +1,103 @@ /* table.sorter plugin, http://tablesorter.com/docs/ */ table.tablesorter { - font-family:arial; - background-color: #CDCDCD; - margin:10px 0pt 15px; - /*font-size: 8pt;*/ - width: 100%; - text-align: left; + background-color: #CDCDCD; + margin:10px 0pt 15px; + width: 100%; + text-align: left; } table.tablesorter thead tr th, table.tablesorter tfoot tr th { - background-color: #e6EEEE; - border: 1px solid #FFF; - /*font-size: 8pt;*/ - padding: 4px; + background-color: #E6EEEE; + border: 1px solid #FFF; + padding: 4px; } table.tablesorter thead tr .header { - background-image: url(../img/bg.gif); - background-repeat: no-repeat; - background-position: center right; - cursor: pointer; + background-image: url(../img/bg.gif); + background-repeat: no-repeat; + background-position: center right; + cursor: pointer; } table.tablesorter tbody td { - color: #3D3D3D; - padding: 4px; - background-color: #FFF; - vertical-align: top; + color: #3D3D3D; + padding: 4px; + background-color: #FFF; + vertical-align: top; } table.tablesorter tbody tr.odd td { - background-color:#F0F0F6; + background-color:#F0F0F6; } table.tablesorter thead tr .headerSortUp { - background-image: url(../img/asc.gif); + background-image: url(../img/asc.gif); } table.tablesorter thead tr .headerSortDown { - background-image: url(../img/desc.gif); + background-image: url(../img/desc.gif); } table.tablesorter thead tr .headerSortDown, table.tablesorter thead tr .headerSortUp { -background-color: #8dbdd8; + background-color: #8DBDD8; } -body { - background-image: url('../img/background3.png'); - background-repeat: no-repeat; - background-color: #d0dff9; - color: #272A4B; - font-family: "VAGRoundedLtRegular",Tahoma, "museo-sans-1", "museo-sans-2", "Helvetica Neue", Geneva,sans-serif; - font-size: 1.3em; - text-align: center; - text-align: left; +body { + background: linear-gradient(to bottom left,#F7F9FE, #DEE9FB, #D0DFF9); + color: #272A4B; + font-family: 'PT Sans', sans-serif; + font-size: 10pt; + text-align: center; + text-align: left; + height: 100%; + margin: 0; + background-repeat: no-repeat; + background-attachment: fixed; } -a img { - border: none; +html { + height: 100%; } -h1,th,h2,h3,h4 { - color: #00ac00; - text-decoration: none; - font-weight:normal; - margin-top: 0em; - margin-bottom: 0.2em; +a img { + border: none; } -h1, h2, h3 { - color: #00c100; - text-shadow: 1px 1px 1px #d5ddd5; +h1,th,h2,h3,h4 { + color: #00AC00; + text-decoration: none; + font-weight:normal; + margin-top: 0em; + margin-bottom: 0.2em; + font-family: 'PT Sans', sans-serif; } a { - color: #103C7A; - text-decoration: none; + color: #103C7A; + text-decoration: none; margin-top: 0em; margin-bottom: 0em; } h4 { - margin-top: 0.5em; - margin-bottom: 0.5em; + margin-top: 0.5em; + margin-bottom: 0.5em; } h3 { - /*border-top: 1px solid #505050;*/ - /*border-bottom: 1px solid #505050;*/ - /*margin-bottom: 0.25em;*/ - padding-bottom: 1em; - font-size: 1.5em; - /*font-weight: normal;*/ - margin-top: 0em; - border-top: 0em; - padding-top: 0em; + padding-bottom: 1em; + font-size: 1.5em; + margin-top: 0em; + border-top: 0em; + padding-top: 0em; } h4 { - padding-bottom: 1em; - font-size: 1em; - /*font-weight: normal;*/ - margin-top: 0em; - border-top: 0em; - padding-top: 0em; - font-weight: normal; + padding-bottom: 1em; + font-size: 1em; + margin-top: 0em; + border-top: 0em; + padding-top: 0em; + font-weight: normal; } h3.Standard_Padding { - margin: 0em; + margin: 0em; } h1 { @@ -119,445 +113,435 @@ h1 { * Right Box is the smaller page contents */ .page_container { - position: relative; - margin-left: auto; - margin-right: auto; - width: 83em; - min-width: 45em; - overflow: hidden; - /* border: 1px solid black; */ - z-index: 1; - background-color: transparent; + position: relative; + margin-left: auto; + margin-right: auto; + width: 83em; + min-width: 45em; + overflow: hidden; + z-index: 1; + background-color: transparent; } /* Credit for this section of CSS goes to Matt Lira of STFC, 2009 */ .left_box_menu { - float: left; - margin: 0.5em 0.5em 0.5em 0.5em; - padding: 0.5em 0.5em 0.5em 0.5em; - border: 1px solid #b4b4b4; - width: 13em; - box-shadow: 2px 2px 1px 0px #c5d0e3; - - background-color: #fcfcfc; - border-radius: 0.4em; + float: left; + margin: 0.5em 0.5em 0.5em 0.5em; + padding: 0.5em 0.5em 0.5em 0.5em; + border: 1px solid #B4B4B4; + width: 13em; + background-color: #FCFCFC; + border-radius: 0.4em; } div.Left_Search_Box { - clear: left; - margin-top: 0em; + clear: left; + margin-top: 0em; } input.Search { - width: 85%; - margin-left: 1em; - margin-bottom: 0.5em; + width: 85%; + margin-left: 1em; + margin-bottom: 0.5em; } input.Search_Button { - margin-left: 1em; - margin-bottom: 0.5em; + margin-left: 1em; + margin-bottom: 0.5em; } div.Left_User_Status_Box { - clear: left; - margin-top: 0em; + clear: left; + margin-top: 0em; } div.Left_Logo_Box { - float: left; - clear: left; + float: left; + clear: left; +} + +div.Left_Logo_Row { + height: 25px; + text-align: center; + margin-bottom: 5px; +} + +img.Left_Logo_Image { + max-height: 100%; } div.Indented { - margin-left: 1em; + margin-left: 1em; } .right_box { - position: relative; - margin: 0.0em 0.0em 0.0em 13em; - padding: 0.5em 1em 0.0em 1em; - /* border: 1px solid #505050; */ + position: relative; + margin: 0.0em 0.0em 0.0em 13em; + padding: 0.5em 1em 0.0em 1em; } .empty { - clear: both; + clear: both; } .Logo_Text { - display: inline; -} + display: inline; +} .logo_image { - display: inline; - height: 3em; - text-align: center; + display: inline; + height: 3em; + text-align: center; } h3.Small_Bottom_Margin { - margin-bottom: 0.25em; - padding-bottom: 0.25em; + margin-bottom: 0.25em; + padding-bottom: 0.25em; } h4.menu_title { - margin-bottom: 0.25em; - padding-bottom: 0.25em; - padding-left: 0.5em; + margin-bottom: 0.25em; + padding-bottom: 0.25em; + padding-left: 0.5em; } /* Input Form Configuration */ .inputForm { - display: inline; + display: inline; } .input_button { - margin-top: 0.5em; - font-size: 0.7em; + margin-top: 0.5em; + font-size: 0.7em; } .input_name { - display: block; - /*width: 20em;*/ - font-size: 0.9em; + display: block; + font-size: 0.9em; } .input_syntax { - display: inline; - /*width: 20em;*/ - color: #909090; - font-style: italic; - font-size: 0.9em; + display: inline; + color: #909090; + font-style: italic; + font-size: 0.9em; } span.menu_link { - display: inline; - font-size: 1em; - margin-bottom: 0.5em; - color: #103C7A; - border: 0.1em solid #FFFFFF; + display: inline; + font-size: 1em; + margin-bottom: 0.5em; + color: #103C7A; + border: 0.1em solid #FFFFFF; } -span.menu_link:hover { - border: 0.1em solid #00C100; -} hr.Menu_Spacer { - position: relative; - width: 11em; - left: -1.5em; + position: relative; + width: 11em; + left: -1.5em; } ul.Smaller_Top_Margin { - margin-top: 0em; + margin-top: 0em; } ul.Smaller_Left_Padding { - padding-left: 2em; - margin-bottom: 0.5em; + padding-left: 2em; + margin-bottom: 0.5em; } li { - color: #3E6397; - list-style-type: circle; - /* border: 0.1em solid; */ + color: #3E6397; + list-style-type: circle; margin-left: -0.4em; margin-bottom: 0.3em; } .input_input_text { - width: 90%; - margin-bottom: 1em; - margin-left: 2em; + width: 90%; + margin-bottom: 1em; + margin-left: 2em; } .input_input_date { - width: 30%; - margin-bottom: 1em; - margin-left: 2em; + width: 30%; + margin-bottom: 1em; + margin-left: 2em; } .table_row_1,.table_header { - background-color: #d3d3d3; + background-color: #D3D3D3; } .site_table_row_1 { - background-color: #d0e1f7; + background-color: #D0E1F7; } .site_table_row_2 { - background-color: #f5f5f5; + background-color: #F5F5F5; } td.site_table { - padding-left: 1em; - padding-top: 0.5em; - padding-bottom: 0.5em; + padding-left: 1em; + padding-top: 0.5em; + padding-bottom: 0.5em; } th.site_table { - padding-left: 1em; - padding-top: 0.5em; - padding-bottom: 0.5em; - color: black; - font-weight: bold; + padding-left: 1em; + padding-top: 0.5em; + padding-bottom: 0.5em; + color: black; + font-weight: bold; } .start_page_body { - line-height: 1.5em; + line-height: 1.5em; } td { - padding: 0.2em; + padding: 0.2em; } span.action { - margin-left: auto; - margin-right: auto; - padding: 0em 0.25em 0em 0.25em; - text-align: center; + margin-left: auto; + margin-right: auto; + padding: 0em 0.25em 0em 0.25em; + text-align: center; } h3.spacer { - display: inline; - width: 4em; + display: inline; + width: 4em; } div.Copyright_Text { - margin-top: 2em; - font-size: 0.8em; - margin-left: -2em; -} - -a.Licence_Link { - font-family: serif; + margin-top: 2em; + font-size: 0.8em; + margin-left: -2em; } -span.Developed_By_Text { - font-family: serif; -} .add_edit_form { - margin-left: 2em; - margin-bottom: 1em; - width: 90%; + margin-left: 2em; + margin-bottom: 1em; + width: 90%; } span.Error { - position: relative; - left: -1.5em; + position: relative; + left: -1.5em; } span.New_Service_Endpoint { - padding-bottom: 1em; - display: block; + padding-bottom: 1em; + display: block; } -/* border: medium double rgb(250,0,255);*/ option.sectionTitle { - background-color: #000000; - font-weight: bold; - font-size: 12px; - color: white; - text-align: center; + background-color: #000000; + font-weight: bold; + font-size: 12px; + color: white; + text-align: center; } /* ################## CALENDAR CSS DIVS ###################### */ /* calendar icon */ img.tcalIcon { - cursor: pointer; - margin-left: 1px; - vertical-align: middle; + cursor: pointer; + margin-left: 1px; + vertical-align: middle; } /* calendar container element */ div#tcal { - position: absolute; - visibility: hidden; - z-index: 100; - width: 158px; - padding: 2px 0 0 0; + position: absolute; + visibility: hidden; + z-index: 100; + width: 158px; + padding: 2px 0 0 0; } /* all tables in calendar */ div#tcal table { - width: 100%; - border: 1px solid silver; - border-collapse: collapse; - background-color: white; + width: 100%; + border: 1px solid silver; + border-collapse: collapse; + background-color: white; } /* navigation table */ div#tcal table.ctrl { - border-bottom: 0; + border-bottom: 0; } /* navigation buttons */ div#tcal table.ctrl td { - width: 15px; - height: 20px; + width: 15px; + height: 20px; } /* month year header */ div#tcal table.ctrl th { - background-color: white; - color: black; - border: 0; + background-color: white; + color: black; + border: 0; } /* week days header */ div#tcal th { - border: 1px solid silver; - border-collapse: collapse; - text-align: center; - padding: 3px 0; - font-family: tahoma, verdana, arial; - font-size: 10px; - background-color: gray; - color: white; + border: 1px solid silver; + border-collapse: collapse; + text-align: center; + padding: 3px 0; + font-size: 10px; + background-color: gray; + color: white; } /* date cells */ div#tcal td { - border: 0; - border-collapse: collapse; - text-align: center; - padding: 2px 0; - font-family: tahoma, verdana, arial; - font-size: 11px; - width: 22px; - cursor: pointer; + border: 0; + border-collapse: collapse; + text-align: center; + padding: 2px 0; + font-size: 11px; + width: 22px; + cursor: pointer; } /* date highlight in case of conflicting settings order here determines the priority from least to most important */ div#tcal td.othermonth { - color: silver; + color: silver; } div#tcal td.weekend { - background-color: #ACD6F5; + background-color: #ACD6F5; } div#tcal td.today { - border: 1px solid red; + border: 1px solid red; } div#tcal td.selected { - background-color: #FFB3BE; + background-color: #FFB3BE; } /* iframe element used to suppress windowed controls in IE5/6 */ iframe#tcalIF { - position: absolute; - visibility: hidden; - z-index: 98; - border: 0; + position: absolute; + visibility: hidden; + z-index: 98; + border: 0; } /* transparent shadow */ div#tcalShade { - position: absolute; - visibility: hidden; - z-index: 99; + position: absolute; + visibility: hidden; + z-index: 99; } div#tcalShade table { - border: 0; - border-collapse: collapse; - width: 100%; + border: 0; + border-collapse: collapse; + width: 100%; } div#tcalShade table td { - border: 0; - border-collapse: collapse; - padding: 0; + border: 0; + border-collapse: collapse; + padding: 0; } select.Downtime_Select { - margin-left: 2em; + margin-left: 2em; } .header { - color: #009000; - padding:0.9em; + color: #009000; + padding:0.9em; } div.listContainer { - width: 99.5%; - float: left; - border: 1px solid #b4b4b4; - margin-right: 10px; - margin-top: 1.6em; - box-shadow: 2px 2px 1px 0px #c5d0e3; - border-radius: 0.4em; + width: 99.5%; + float: left; + border: 1px solid #B4B4B4; + margin-right: 10px; + margin-top: 1.6em; + box-shadow: 2px 2px 1px 0px #C5D0E3; + border-radius: 0.4em; } span.listHeader { - vertical-align: middle; - float: left; - padding-top: 0.9em; - padding-left: 1em; + vertical-align: middle; + float: left; + padding-top: 0.9em; + padding-left: 1em; } .leftFloat { - float: left; + float: left; } span.vSiteDescription { - clear: both; - float: left; - padding-bottom: 0.4em; + clear: both; + float: left; + padding-bottom: 0.4em; } span.vSitesMoreInfo { - clear: both; - float: left; + clear: both; + float: left; } img.decoration { - float: right; - margin:1% 1% 1% 0%; - height: 25px; + float: right; + margin:1% 1% 1% 0%; + height: 25px; } img.titleIcon{ - height:25px; - float: right; - margin:2% 1% 1% 0%; + height:25px; + float: right; + margin:2% 1% 1% 0%; } input.vSiteSearch { - color: grey; - float: left; - margin-left: 1em; - margin-top: 0.5em; - margin-bottom: 0.5em; - width: 95%; - clear: left; + color: grey; + float: left; + margin-left: 1em; + margin-top: 0.5em; + margin-bottom: 0.5em; + width: 95%; + clear: left; } input.vSiteSearchButton { - float: left; - margin-left: 1em; - margin-bottom: 1em; + float: left; + margin-left: 1em; + margin-bottom: 1em; } div.vSiteSearchResultContainer { - overflow: auto; - max-height: 20em; - float: left; - width: 100%; - display: none; - border-top: 1px grey solid + overflow: auto; + max-height: 20em; + float: left; + width: 100%; + display: none; + border-top: 1px grey solid } span.vSite1emBottomMargin { - padding-bottom: 1em; + padding-bottom: 1em; } table.vSiteResults { - clear: both; - width: 100%; + clear: both; + width: 100%; } /* Top page logo */ @@ -597,7 +581,7 @@ form.inline { } div.topMargin { - padding-top: 1em; + padding-top: 1em; } div.topMargin2 { @@ -605,14 +589,14 @@ div.topMargin2 { } div.siteContainer { - width:99.5%; + width:99.5%; float: left; clear: both; - border: 1px solid #b4b4b4; + border: 1px solid #B4B4B4; margin-right: 0px; margin-top: 1.3em; padding: 1em; - box-shadow: 1px 1px 1px 0px #c5d0e3; + box-shadow: 1px 1px 1px 0px #C5D0E3; border-radius: 0.4em; } @@ -621,11 +605,11 @@ div.clearLeft { } div.siteFilter { - margin-left: 1em; + margin-left: 1em; } .leftMargin { - margin-left: 1em; + margin-left: 1em; } .middleAlign { @@ -648,22 +632,21 @@ img.nav { } div.rightPageContainer { - background: #fcfcfc; - background-image: url('../img/contentBackground2.png'); - background-position: top right; - background-repeat: no-repeat; - overflow: hidden; - margin-bottom: 3em; - border: 1px solid #b4b4b4; + background: #FCFCFC; + background-image: url('../img/contentBackground2.png'); + background-position: top right; + background-repeat: no-repeat; + overflow: hidden; + margin-bottom: 3em; + border: 1px solid #B4B4B4; padding: 1em; - box-shadow: 2px 2px 1px 0px #c5d0e3; border-radius: 0.4em; } div.tableContainer { - box-shadow: 2px 2px 1px 0px #c5d0e3; - border: 1px solid #b4b4b4; + box-shadow: 2px 2px 1px 0px #C5D0E3; + border: 1px solid #B4B4B4; border-radius: 0.4em; } @@ -672,36 +655,40 @@ div.tableContainer { } .datePicker{ - width:30%; - float:left; - margin-right:5% + width:30%; + float:left; + margin-right:5% } .timePicker{ - width:30%; - float:left; + width:30%; + float:left; } .smallLabelText{ - margin-left:8px; - font-size:11px; - font-weight: normal; - font-style:italic; - display:inline-block; + margin-left:8px; + font-size:11px; + font-weight: normal; + font-style:italic; + display:inline-block; } label.error { - font-weight: bold; - color: red; - padding: 2px 8px; - margin-top: 2px; + font-weight: bold; + color: red; + padding: 2px 8px; + margin-top: 2px; } .selectService{ -background-color: #D5D5D5; + background-color: #D5D5D5; } .selectEndpoint{ } +/* Registration page */ +img.new_window{ + height: 0.75em; +} diff --git a/htdocs/web_portal/img/EGI-logo_small.png b/htdocs/web_portal/img/EGI-logo_small.png deleted file mode 100644 index 066330f9a..000000000 Binary files a/htdocs/web_portal/img/EGI-logo_small.png and /dev/null differ diff --git a/htdocs/web_portal/img/Logo-1.4.png b/htdocs/web_portal/img/Logo-1.4.png deleted file mode 100644 index 5e2bcdfca..000000000 Binary files a/htdocs/web_portal/img/Logo-1.4.png and /dev/null differ diff --git a/htdocs/web_portal/img/Logo-1.5.png b/htdocs/web_portal/img/Logo-1.5.png deleted file mode 100644 index c2f36afda..000000000 Binary files a/htdocs/web_portal/img/Logo-1.5.png and /dev/null differ diff --git a/htdocs/web_portal/img/Platypus_Original.png b/htdocs/web_portal/img/Platypus_Original.png deleted file mode 100644 index 16872e9be..000000000 Binary files a/htdocs/web_portal/img/Platypus_Original.png and /dev/null differ diff --git a/htdocs/web_portal/img/STFC.jpg b/htdocs/web_portal/img/STFC.jpg deleted file mode 100644 index e1e34107a..000000000 Binary files a/htdocs/web_portal/img/STFC.jpg and /dev/null differ diff --git a/htdocs/web_portal/img/STFCMediumColourTrans_crop.png b/htdocs/web_portal/img/STFCMediumColourTrans_crop.png new file mode 100644 index 000000000..001833034 Binary files /dev/null and b/htdocs/web_portal/img/STFCMediumColourTrans_crop.png differ diff --git a/htdocs/web_portal/img/background.png b/htdocs/web_portal/img/background.png deleted file mode 100644 index 67df8c4c4..000000000 Binary files a/htdocs/web_portal/img/background.png and /dev/null differ diff --git a/htdocs/web_portal/img/background3.png b/htdocs/web_portal/img/background3.png deleted file mode 100644 index ba6685e9c..000000000 Binary files a/htdocs/web_portal/img/background3.png and /dev/null differ diff --git a/htdocs/web_portal/img/egi.gif b/htdocs/web_portal/img/egi.gif deleted file mode 100644 index ac9f47995..000000000 Binary files a/htdocs/web_portal/img/egi.gif and /dev/null differ diff --git a/htdocs/web_portal/img/egi_logo.png b/htdocs/web_portal/img/egi_logo.png deleted file mode 100644 index 0aa8de946..000000000 Binary files a/htdocs/web_portal/img/egi_logo.png and /dev/null differ diff --git a/htdocs/web_portal/img/egi_logo_large.jpg b/htdocs/web_portal/img/egi_logo_large.jpg deleted file mode 100644 index 4078c14b1..000000000 Binary files a/htdocs/web_portal/img/egi_logo_large.jpg and /dev/null differ diff --git a/htdocs/web_portal/img/egi_logo_no_background_150.png b/htdocs/web_portal/img/egi_logo_no_background_150.png new file mode 100644 index 000000000..b2b3736e3 Binary files /dev/null and b/htdocs/web_portal/img/egi_logo_no_background_150.png differ diff --git a/htdocs/web_portal/img/eosc-hub-v-web_150.png b/htdocs/web_portal/img/eosc-hub-v-web_150.png new file mode 100644 index 000000000..cb01764c0 Binary files /dev/null and b/htdocs/web_portal/img/eosc-hub-v-web_150.png differ diff --git a/htdocs/web_portal/img/eu.jpg b/htdocs/web_portal/img/eu.jpg deleted file mode 100644 index 3986ab0ce..000000000 Binary files a/htdocs/web_portal/img/eu.jpg and /dev/null differ diff --git a/htdocs/web_portal/img/eu_flag_yellow_low_150.png b/htdocs/web_portal/img/eu_flag_yellow_low_150.png new file mode 100644 index 000000000..aed408669 Binary files /dev/null and b/htdocs/web_portal/img/eu_flag_yellow_low_150.png differ diff --git a/htdocs/web_portal/img/europe_background.jpg b/htdocs/web_portal/img/europe_background.jpg deleted file mode 100644 index eb031c0b6..000000000 Binary files a/htdocs/web_portal/img/europe_background.jpg and /dev/null differ diff --git a/htdocs/web_portal/img/keypair.png b/htdocs/web_portal/img/keypair.png deleted file mode 100644 index ea1c80c73..000000000 Binary files a/htdocs/web_portal/img/keypair.png and /dev/null differ diff --git a/htdocs/web_portal/img/kudos_icons/Add.png b/htdocs/web_portal/img/kudos_icons/Add.png deleted file mode 100644 index 3725833b6..000000000 Binary files a/htdocs/web_portal/img/kudos_icons/Add.png and /dev/null differ diff --git a/htdocs/web_portal/img/kudos_icons/Adress Book.png b/htdocs/web_portal/img/kudos_icons/Adress Book.png deleted file mode 100644 index 260d4638a..000000000 Binary files a/htdocs/web_portal/img/kudos_icons/Adress Book.png and /dev/null differ diff --git a/htdocs/web_portal/img/kudos_icons/Alert.png b/htdocs/web_portal/img/kudos_icons/Alert.png deleted file mode 100644 index f5ace74d5..000000000 Binary files a/htdocs/web_portal/img/kudos_icons/Alert.png and /dev/null differ diff --git a/htdocs/web_portal/img/kudos_icons/Battery.png b/htdocs/web_portal/img/kudos_icons/Battery.png deleted file mode 100644 index 88a797cd1..000000000 Binary files a/htdocs/web_portal/img/kudos_icons/Battery.png and /dev/null differ diff --git a/htdocs/web_portal/img/kudos_icons/Book.png b/htdocs/web_portal/img/kudos_icons/Book.png deleted file mode 100644 index 84d3db89a..000000000 Binary files a/htdocs/web_portal/img/kudos_icons/Book.png and /dev/null differ diff --git a/htdocs/web_portal/img/kudos_icons/Briefcase.png b/htdocs/web_portal/img/kudos_icons/Briefcase.png deleted file mode 100644 index 6a7cf1e2a..000000000 Binary files a/htdocs/web_portal/img/kudos_icons/Briefcase.png and /dev/null differ diff --git a/htdocs/web_portal/img/kudos_icons/Calculator.png b/htdocs/web_portal/img/kudos_icons/Calculator.png deleted file mode 100644 index 815cf07c4..000000000 Binary files a/htdocs/web_portal/img/kudos_icons/Calculator.png and /dev/null differ diff --git a/htdocs/web_portal/img/kudos_icons/Calendar.png b/htdocs/web_portal/img/kudos_icons/Calendar.png deleted file mode 100644 index 70576e0a0..000000000 Binary files a/htdocs/web_portal/img/kudos_icons/Calendar.png and /dev/null differ diff --git a/htdocs/web_portal/img/kudos_icons/Clapperboard.png b/htdocs/web_portal/img/kudos_icons/Clapperboard.png deleted file mode 100644 index 1a210e2e8..000000000 Binary files a/htdocs/web_portal/img/kudos_icons/Clapperboard.png and /dev/null differ diff --git a/htdocs/web_portal/img/kudos_icons/Clipboard.png b/htdocs/web_portal/img/kudos_icons/Clipboard.png deleted file mode 100644 index 92db919a0..000000000 Binary files a/htdocs/web_portal/img/kudos_icons/Clipboard.png and /dev/null differ diff --git a/htdocs/web_portal/img/kudos_icons/Computer.png b/htdocs/web_portal/img/kudos_icons/Computer.png deleted file mode 100644 index 62311f2bd..000000000 Binary files a/htdocs/web_portal/img/kudos_icons/Computer.png and /dev/null differ diff --git a/htdocs/web_portal/img/kudos_icons/Dashboard.png b/htdocs/web_portal/img/kudos_icons/Dashboard.png deleted file mode 100644 index 935d2bb09..000000000 Binary files a/htdocs/web_portal/img/kudos_icons/Dashboard.png and /dev/null differ diff --git a/htdocs/web_portal/img/kudos_icons/Database.png b/htdocs/web_portal/img/kudos_icons/Database.png deleted file mode 100644 index a00cc0565..000000000 Binary files a/htdocs/web_portal/img/kudos_icons/Database.png and /dev/null differ diff --git a/htdocs/web_portal/img/kudos_icons/Dictionary.png b/htdocs/web_portal/img/kudos_icons/Dictionary.png deleted file mode 100644 index 9aa562058..000000000 Binary files a/htdocs/web_portal/img/kudos_icons/Dictionary.png and /dev/null differ diff --git a/htdocs/web_portal/img/kudos_icons/Document.png b/htdocs/web_portal/img/kudos_icons/Document.png deleted file mode 100644 index 62de879a2..000000000 Binary files a/htdocs/web_portal/img/kudos_icons/Document.png and /dev/null differ diff --git a/htdocs/web_portal/img/kudos_icons/Done.png b/htdocs/web_portal/img/kudos_icons/Done.png deleted file mode 100644 index af263a69e..000000000 Binary files a/htdocs/web_portal/img/kudos_icons/Done.png and /dev/null differ diff --git a/htdocs/web_portal/img/kudos_icons/Down.png b/htdocs/web_portal/img/kudos_icons/Down.png deleted file mode 100644 index 50980b687..000000000 Binary files a/htdocs/web_portal/img/kudos_icons/Down.png and /dev/null differ diff --git a/htdocs/web_portal/img/kudos_icons/Download Crate.png b/htdocs/web_portal/img/kudos_icons/Download Crate.png deleted file mode 100644 index 23d2c24c2..000000000 Binary files a/htdocs/web_portal/img/kudos_icons/Download Crate.png and /dev/null differ diff --git a/htdocs/web_portal/img/kudos_icons/Drawer.png b/htdocs/web_portal/img/kudos_icons/Drawer.png deleted file mode 100644 index dd3eaa92b..000000000 Binary files a/htdocs/web_portal/img/kudos_icons/Drawer.png and /dev/null differ diff --git a/htdocs/web_portal/img/kudos_icons/Facebook.png b/htdocs/web_portal/img/kudos_icons/Facebook.png deleted file mode 100644 index ab9f2957e..000000000 Binary files a/htdocs/web_portal/img/kudos_icons/Facebook.png and /dev/null differ diff --git a/htdocs/web_portal/img/kudos_icons/Fav.png b/htdocs/web_portal/img/kudos_icons/Fav.png deleted file mode 100644 index 6ee048d97..000000000 Binary files a/htdocs/web_portal/img/kudos_icons/Fav.png and /dev/null differ diff --git a/htdocs/web_portal/img/kudos_icons/Floppy.png b/htdocs/web_portal/img/kudos_icons/Floppy.png deleted file mode 100644 index 3a696bb8e..000000000 Binary files a/htdocs/web_portal/img/kudos_icons/Floppy.png and /dev/null differ diff --git a/htdocs/web_portal/img/kudos_icons/Folder.png b/htdocs/web_portal/img/kudos_icons/Folder.png deleted file mode 100644 index 0ce860330..000000000 Binary files a/htdocs/web_portal/img/kudos_icons/Folder.png and /dev/null differ diff --git a/htdocs/web_portal/img/kudos_icons/HDD.png b/htdocs/web_portal/img/kudos_icons/HDD.png deleted file mode 100644 index fe95c1fc1..000000000 Binary files a/htdocs/web_portal/img/kudos_icons/HDD.png and /dev/null differ diff --git a/htdocs/web_portal/img/kudos_icons/Heart.png b/htdocs/web_portal/img/kudos_icons/Heart.png deleted file mode 100644 index e6464cff6..000000000 Binary files a/htdocs/web_portal/img/kudos_icons/Heart.png and /dev/null differ diff --git a/htdocs/web_portal/img/kudos_icons/Help.png b/htdocs/web_portal/img/kudos_icons/Help.png deleted file mode 100644 index 94a5ea2aa..000000000 Binary files a/htdocs/web_portal/img/kudos_icons/Help.png and /dev/null differ diff --git a/htdocs/web_portal/img/kudos_icons/Home.png b/htdocs/web_portal/img/kudos_icons/Home.png deleted file mode 100644 index 170c44d4f..000000000 Binary files a/htdocs/web_portal/img/kudos_icons/Home.png and /dev/null differ diff --git a/htdocs/web_portal/img/kudos_icons/Inbox.png b/htdocs/web_portal/img/kudos_icons/Inbox.png deleted file mode 100644 index 72cd8c18d..000000000 Binary files a/htdocs/web_portal/img/kudos_icons/Inbox.png and /dev/null differ diff --git a/htdocs/web_portal/img/kudos_icons/Info.png b/htdocs/web_portal/img/kudos_icons/Info.png deleted file mode 100644 index 2420782b5..000000000 Binary files a/htdocs/web_portal/img/kudos_icons/Info.png and /dev/null differ diff --git a/htdocs/web_portal/img/kudos_icons/Key.png b/htdocs/web_portal/img/kudos_icons/Key.png deleted file mode 100644 index 35116216f..000000000 Binary files a/htdocs/web_portal/img/kudos_icons/Key.png and /dev/null differ diff --git a/htdocs/web_portal/img/kudos_icons/Left.png b/htdocs/web_portal/img/kudos_icons/Left.png deleted file mode 100644 index f828c29ea..000000000 Binary files a/htdocs/web_portal/img/kudos_icons/Left.png and /dev/null differ diff --git a/htdocs/web_portal/img/kudos_icons/Lifebuoy.png b/htdocs/web_portal/img/kudos_icons/Lifebuoy.png deleted file mode 100644 index 421fd0d3c..000000000 Binary files a/htdocs/web_portal/img/kudos_icons/Lifebuoy.png and /dev/null differ diff --git a/htdocs/web_portal/img/kudos_icons/Lock.png b/htdocs/web_portal/img/kudos_icons/Lock.png deleted file mode 100644 index a8ce0a613..000000000 Binary files a/htdocs/web_portal/img/kudos_icons/Lock.png and /dev/null differ diff --git a/htdocs/web_portal/img/kudos_icons/Magic Wand.png b/htdocs/web_portal/img/kudos_icons/Magic Wand.png deleted file mode 100644 index d460a64ae..000000000 Binary files a/htdocs/web_portal/img/kudos_icons/Magic Wand.png and /dev/null differ diff --git a/htdocs/web_portal/img/kudos_icons/Mail.png b/htdocs/web_portal/img/kudos_icons/Mail.png deleted file mode 100644 index 3348d4b4b..000000000 Binary files a/htdocs/web_portal/img/kudos_icons/Mail.png and /dev/null differ diff --git a/htdocs/web_portal/img/kudos_icons/Note.png b/htdocs/web_portal/img/kudos_icons/Note.png deleted file mode 100644 index c86d3bd62..000000000 Binary files a/htdocs/web_portal/img/kudos_icons/Note.png and /dev/null differ diff --git a/htdocs/web_portal/img/kudos_icons/Pencil and Ruler.png b/htdocs/web_portal/img/kudos_icons/Pencil and Ruler.png deleted file mode 100644 index e8513f1f7..000000000 Binary files a/htdocs/web_portal/img/kudos_icons/Pencil and Ruler.png and /dev/null differ diff --git a/htdocs/web_portal/img/kudos_icons/Pencil.png b/htdocs/web_portal/img/kudos_icons/Pencil.png deleted file mode 100644 index 48cd4783e..000000000 Binary files a/htdocs/web_portal/img/kudos_icons/Pencil.png and /dev/null differ diff --git a/htdocs/web_portal/img/kudos_icons/Preferneces.png b/htdocs/web_portal/img/kudos_icons/Preferneces.png deleted file mode 100644 index ace62a496..000000000 Binary files a/htdocs/web_portal/img/kudos_icons/Preferneces.png and /dev/null differ diff --git a/htdocs/web_portal/img/kudos_icons/Preview.png b/htdocs/web_portal/img/kudos_icons/Preview.png deleted file mode 100644 index 31985cf01..000000000 Binary files a/htdocs/web_portal/img/kudos_icons/Preview.png and /dev/null differ diff --git a/htdocs/web_portal/img/kudos_icons/Printer.png b/htdocs/web_portal/img/kudos_icons/Printer.png deleted file mode 100644 index 53ccf9729..000000000 Binary files a/htdocs/web_portal/img/kudos_icons/Printer.png and /dev/null differ diff --git a/htdocs/web_portal/img/kudos_icons/RSS.png b/htdocs/web_portal/img/kudos_icons/RSS.png deleted file mode 100644 index 46eb3a1e6..000000000 Binary files a/htdocs/web_portal/img/kudos_icons/RSS.png and /dev/null differ diff --git a/htdocs/web_portal/img/kudos_icons/Remove.png b/htdocs/web_portal/img/kudos_icons/Remove.png deleted file mode 100644 index 67d0c473a..000000000 Binary files a/htdocs/web_portal/img/kudos_icons/Remove.png and /dev/null differ diff --git a/htdocs/web_portal/img/kudos_icons/Right.png b/htdocs/web_portal/img/kudos_icons/Right.png deleted file mode 100644 index 91839d446..000000000 Binary files a/htdocs/web_portal/img/kudos_icons/Right.png and /dev/null differ diff --git a/htdocs/web_portal/img/kudos_icons/Ruler.png b/htdocs/web_portal/img/kudos_icons/Ruler.png deleted file mode 100644 index bbe7e2ec8..000000000 Binary files a/htdocs/web_portal/img/kudos_icons/Ruler.png and /dev/null differ diff --git a/htdocs/web_portal/img/kudos_icons/Status.png b/htdocs/web_portal/img/kudos_icons/Status.png deleted file mode 100644 index 0f7b6b029..000000000 Binary files a/htdocs/web_portal/img/kudos_icons/Status.png and /dev/null differ diff --git a/htdocs/web_portal/img/kudos_icons/Twitter.png b/htdocs/web_portal/img/kudos_icons/Twitter.png deleted file mode 100644 index 4b21aa84b..000000000 Binary files a/htdocs/web_portal/img/kudos_icons/Twitter.png and /dev/null differ diff --git a/htdocs/web_portal/img/kudos_icons/Unlocked.png b/htdocs/web_portal/img/kudos_icons/Unlocked.png deleted file mode 100644 index cef3191c1..000000000 Binary files a/htdocs/web_portal/img/kudos_icons/Unlocked.png and /dev/null differ diff --git a/htdocs/web_portal/img/kudos_icons/Up.png b/htdocs/web_portal/img/kudos_icons/Up.png deleted file mode 100644 index acfd256ef..000000000 Binary files a/htdocs/web_portal/img/kudos_icons/Up.png and /dev/null differ diff --git a/htdocs/web_portal/img/kudos_icons/Wallet-Money.png b/htdocs/web_portal/img/kudos_icons/Wallet-Money.png deleted file mode 100644 index 1355823d0..000000000 Binary files a/htdocs/web_portal/img/kudos_icons/Wallet-Money.png and /dev/null differ diff --git a/htdocs/web_portal/img/kudos_icons/Wallet.png b/htdocs/web_portal/img/kudos_icons/Wallet.png deleted file mode 100644 index e16485f3d..000000000 Binary files a/htdocs/web_portal/img/kudos_icons/Wallet.png and /dev/null differ diff --git a/htdocs/web_portal/img/menuBackground.jpg b/htdocs/web_portal/img/menuBackground.jpg deleted file mode 100644 index 6f9540ebe..000000000 Binary files a/htdocs/web_portal/img/menuBackground.jpg and /dev/null differ diff --git a/htdocs/web_portal/img/menuBackground2.png b/htdocs/web_portal/img/menuBackground2.png deleted file mode 100644 index e8d29c9e1..000000000 Binary files a/htdocs/web_portal/img/menuBackground2.png and /dev/null differ diff --git a/htdocs/web_portal/img/new_window.png b/htdocs/web_portal/img/new_window.png new file mode 100644 index 000000000..7068a65cd Binary files /dev/null and b/htdocs/web_portal/img/new_window.png differ diff --git a/htdocs/web_portal/index.php b/htdocs/web_portal/index.php index 0acd1b298..2ea5bc08a 100644 --- a/htdocs/web_portal/index.php +++ b/htdocs/web_portal/index.php @@ -64,7 +64,7 @@ function rejectIfNotAuthenticated($message = null){ if(empty($authPrincipleStr)){ // prob better to do a re-direct here to error page. if($message == null){ - die('Access Denined, authentication failed - A valid user certificate was not found'); + die('Access Denied, authentication failed - A valid user certificate was not found'); //or your EGI SSO user account is not associated with a valid certificate.'); } else { die($message); @@ -183,7 +183,7 @@ function Draw_Page($Page_Type) { break; case "Site_Geo_xml" : //rejectIfNotAuthenticated(); - require_once __DIR__ . '/controllers/sitesForGoogleMapXML.php'; + require_once __DIR__ . '/controllers/sitesForMapXML.php'; show_xml (); break; case "Error_Redirect": diff --git a/htdocs/web_portal/javascript/googleMapClusterer.js b/htdocs/web_portal/javascript/googleMapClusterer.js deleted file mode 100644 index edc6d2d35..000000000 --- a/htdocs/web_portal/javascript/googleMapClusterer.js +++ /dev/null @@ -1,1313 +0,0 @@ - -//original source: https://google-maps-utility-library-v3.googlecode.com/svn/trunk/markerclusterer/ -//Modified to make image paths local. - -// // ==ClosureCompiler== -// @compilation_level ADVANCED_OPTIMIZATIONS -// @externs_url http://closure-compiler.googlecode.com/svn/trunk/contrib/externs/maps/google_maps_api_v3_3.js -// ==/ClosureCompiler== - -/** - * @name MarkerClusterer for Google Maps v3 - * @version version 1.0.1 - * @author Luke Mahe - * @fileoverview - * The library creates and manages per-zoom-level clusters for large amounts of - * markers. - *
    - * This is a v3 implementation of the - * v2 MarkerClusterer. - */ - -/** - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -/** - * A Marker Clusterer that clusters markers. - * - * @param {google.maps.Map} map The Google map to attach to. - * @param {Array.=} opt_markers Optional markers to add to - * the cluster. - * @param {Object=} opt_options support the following options: - * 'gridSize': (number) The grid size of a cluster in pixels. - * 'maxZoom': (number) The maximum zoom level that a marker can be part of a - * cluster. - * 'zoomOnClick': (boolean) Whether the default behaviour of clicking on a - * cluster is to zoom into it. - * 'averageCenter': (boolean) Wether the center of each cluster should be - * the average of all markers in the cluster. - * 'minimumClusterSize': (number) The minimum number of markers to be in a - * cluster before the markers are hidden and a count - * is shown. - * 'styles': (object) An object that has style properties: - * 'url': (string) The image url. - * 'height': (number) The image height. - * 'width': (number) The image width. - * 'anchor': (Array) The anchor position of the label text. - * 'textColor': (string) The text color. - * 'textSize': (number) The text size. - * 'backgroundPosition': (string) The position of the backgound x, y. - * @constructor - * @extends google.maps.OverlayView - */ -function MarkerClusterer(map, opt_markers, opt_options) { - // MarkerClusterer implements google.maps.OverlayView interface. We use the - // extend function to extend MarkerClusterer with google.maps.OverlayView - // because it might not always be available when the code is defined so we - // look for it at the last possible moment. If it doesn't exist now then - // there is no point going ahead :) - this.extend(MarkerClusterer, google.maps.OverlayView); - this.map_ = map; - - /** - * @type {Array.} - * @private - */ - this.markers_ = []; - - /** - * @type {Array.} - */ - this.clusters_ = []; - - this.sizes = [53, 56, 66, 78, 90]; - - /** - * @private - */ - this.styles_ = []; - - /** - * @type {boolean} - * @private - */ - this.ready_ = false; - - var options = opt_options || {}; - - /** - * @type {number} - * @private - */ - this.gridSize_ = options['gridSize'] || 60; - - /** - * @private - */ - this.minClusterSize_ = options['minimumClusterSize'] || 2; - - - /** - * @type {?number} - * @private - */ - this.maxZoom_ = options['maxZoom'] || null; - - this.styles_ = options['styles'] || []; - - /** - * @type {string} - * @private - */ - this.imagePath_ = options['imagePath'] || - this.MARKER_CLUSTER_IMAGE_PATH_; - - /** - * @type {string} - * @private - */ - this.imageExtension_ = options['imageExtension'] || - this.MARKER_CLUSTER_IMAGE_EXTENSION_; - - /** - * @type {boolean} - * @private - */ - this.zoomOnClick_ = true; - - if (options['zoomOnClick'] != undefined) { - this.zoomOnClick_ = options['zoomOnClick']; - } - - /** - * @type {boolean} - * @private - */ - this.averageCenter_ = false; - - if (options['averageCenter'] != undefined) { - this.averageCenter_ = options['averageCenter']; - } - - this.setupStyles_(); - - this.setMap(map); - - /** - * @type {number} - * @private - */ - this.prevZoom_ = this.map_.getZoom(); - - // Add the map event listeners - var that = this; - google.maps.event.addListener(this.map_, 'zoom_changed', function() { - // Determines map type and prevent illegal zoom levels - var zoom = that.map_.getZoom(); - var minZoom = that.map_.minZoom || 0; - var maxZoom = Math.min(that.map_.maxZoom || 100, - that.map_.mapTypes[that.map_.getMapTypeId()].maxZoom); - zoom = Math.min(Math.max(zoom,minZoom),maxZoom); - - if (that.prevZoom_ != zoom) { - that.prevZoom_ = zoom; - that.resetViewport(); - } - }); - - google.maps.event.addListener(this.map_, 'idle', function() { - that.redraw(); - }); - - // Finally, add the markers - if (opt_markers && (opt_markers.length || Object.keys(opt_markers).length)) { - this.addMarkers(opt_markers, false); - } -} - - -/** - * The marker cluster image path. - * - * @type {string} - * @private - */ -MarkerClusterer.prototype.MARKER_CLUSTER_IMAGE_PATH_ = - 'img/mapClusterer/' + 'm'; //Changed from original script - - -/** - * The marker cluster image path. - * - * @type {string} - * @private - */ -MarkerClusterer.prototype.MARKER_CLUSTER_IMAGE_EXTENSION_ = 'png'; - - -/** - * Extends a objects prototype by anothers. - * - * @param {Object} obj1 The object to be extended. - * @param {Object} obj2 The object to extend with. - * @return {Object} The new extended object. - * @ignore - */ -MarkerClusterer.prototype.extend = function(obj1, obj2) { - return (function(object) { - for (var property in object.prototype) { - this.prototype[property] = object.prototype[property]; - } - return this; - }).apply(obj1, [obj2]); -}; - - -/** - * Implementaion of the interface method. - * @ignore - */ -MarkerClusterer.prototype.onAdd = function() { - this.setReady_(true); -}; - -/** - * Implementaion of the interface method. - * @ignore - */ -MarkerClusterer.prototype.draw = function() {}; - -/** - * Sets up the styles object. - * - * @private - */ -MarkerClusterer.prototype.setupStyles_ = function() { - if (this.styles_.length) { - return; - } - - for (var i = 0, size; size = this.sizes[i]; i++) { - this.styles_.push({ - url: this.imagePath_ + (i + 1) + '.' + this.imageExtension_, - height: size, - width: size - }); - } -}; - -/** - * Fit the map to the bounds of the markers in the clusterer. - */ -MarkerClusterer.prototype.fitMapToMarkers = function() { - var markers = this.getMarkers(); - var bounds = new google.maps.LatLngBounds(); - for (var i = 0, marker; marker = markers[i]; i++) { - bounds.extend(marker.getPosition()); - } - - this.map_.fitBounds(bounds); -}; - - -/** - * Sets the styles. - * - * @param {Object} styles The style to set. - */ -MarkerClusterer.prototype.setStyles = function(styles) { - this.styles_ = styles; -}; - - -/** - * Gets the styles. - * - * @return {Object} The styles object. - */ -MarkerClusterer.prototype.getStyles = function() { - return this.styles_; -}; - - -/** - * Whether zoom on click is set. - * - * @return {boolean} True if zoomOnClick_ is set. - */ -MarkerClusterer.prototype.isZoomOnClick = function() { - return this.zoomOnClick_; -}; - -/** - * Whether average center is set. - * - * @return {boolean} True if averageCenter_ is set. - */ -MarkerClusterer.prototype.isAverageCenter = function() { - return this.averageCenter_; -}; - - -/** - * Returns the array of markers in the clusterer. - * - * @return {Array.} The markers. - */ -MarkerClusterer.prototype.getMarkers = function() { - return this.markers_; -}; - - -/** - * Returns the number of markers in the clusterer - * - * @return {Number} The number of markers. - */ -MarkerClusterer.prototype.getTotalMarkers = function() { - return this.markers_.length; -}; - - -/** - * Sets the max zoom for the clusterer. - * - * @param {number} maxZoom The max zoom level. - */ -MarkerClusterer.prototype.setMaxZoom = function(maxZoom) { - this.maxZoom_ = maxZoom; -}; - - -/** - * Gets the max zoom for the clusterer. - * - * @return {number} The max zoom level. - */ -MarkerClusterer.prototype.getMaxZoom = function() { - return this.maxZoom_; -}; - - -/** - * The function for calculating the cluster icon image. - * - * @param {Array.} markers The markers in the clusterer. - * @param {number} numStyles The number of styles available. - * @return {Object} A object properties: 'text' (string) and 'index' (number). - * @private - */ -MarkerClusterer.prototype.calculator_ = function(markers, numStyles) { - var index = 0; - var count = markers.length; - var dv = count; - while (dv !== 0) { - dv = parseInt(dv / 10, 10); - index++; - } - - index = Math.min(index, numStyles); - return { - text: count, - index: index - }; -}; - - -/** - * Set the calculator function. - * - * @param {function(Array, number)} calculator The function to set as the - * calculator. The function should return a object properties: - * 'text' (string) and 'index' (number). - * - */ -MarkerClusterer.prototype.setCalculator = function(calculator) { - this.calculator_ = calculator; -}; - - -/** - * Get the calculator function. - * - * @return {function(Array, number)} the calculator function. - */ -MarkerClusterer.prototype.getCalculator = function() { - return this.calculator_; -}; - - -/** - * Add an array of markers to the clusterer. - * - * @param {Array.} markers The markers to add. - * @param {boolean=} opt_nodraw Whether to redraw the clusters. - */ -MarkerClusterer.prototype.addMarkers = function(markers, opt_nodraw) { - if (markers.length) { - for (var i = 0, marker; marker = markers[i]; i++) { - this.pushMarkerTo_(marker); - } - } else if (Object.keys(markers).length) { - for (var marker in markers) { - this.pushMarkerTo_(markers[marker]); - } - } - if (!opt_nodraw) { - this.redraw(); - } -}; - - -/** - * Pushes a marker to the clusterer. - * - * @param {google.maps.Marker} marker The marker to add. - * @private - */ -MarkerClusterer.prototype.pushMarkerTo_ = function(marker) { - marker.isAdded = false; - if (marker['draggable']) { - // If the marker is draggable add a listener so we update the clusters on - // the drag end. - var that = this; - google.maps.event.addListener(marker, 'dragend', function() { - marker.isAdded = false; - that.repaint(); - }); - } - this.markers_.push(marker); -}; - - -/** - * Adds a marker to the clusterer and redraws if needed. - * - * @param {google.maps.Marker} marker The marker to add. - * @param {boolean=} opt_nodraw Whether to redraw the clusters. - */ -MarkerClusterer.prototype.addMarker = function(marker, opt_nodraw) { - this.pushMarkerTo_(marker); - if (!opt_nodraw) { - this.redraw(); - } -}; - - -/** - * Removes a marker and returns true if removed, false if not - * - * @param {google.maps.Marker} marker The marker to remove - * @return {boolean} Whether the marker was removed or not - * @private - */ -MarkerClusterer.prototype.removeMarker_ = function(marker) { - var index = -1; - if (this.markers_.indexOf) { - index = this.markers_.indexOf(marker); - } else { - for (var i = 0, m; m = this.markers_[i]; i++) { - if (m == marker) { - index = i; - break; - } - } - } - - if (index == -1) { - // Marker is not in our list of markers. - return false; - } - - marker.setMap(null); - - this.markers_.splice(index, 1); - - return true; -}; - - -/** - * Remove a marker from the cluster. - * - * @param {google.maps.Marker} marker The marker to remove. - * @param {boolean=} opt_nodraw Optional boolean to force no redraw. - * @return {boolean} True if the marker was removed. - */ -MarkerClusterer.prototype.removeMarker = function(marker, opt_nodraw) { - var removed = this.removeMarker_(marker); - - if (!opt_nodraw && removed) { - this.resetViewport(); - this.redraw(); - return true; - } else { - return false; - } -}; - - -/** - * Removes an array of markers from the cluster. - * - * @param {Array.} markers The markers to remove. - * @param {boolean=} opt_nodraw Optional boolean to force no redraw. - */ -MarkerClusterer.prototype.removeMarkers = function(markers, opt_nodraw) { - var removed = false; - - for (var i = 0, marker; marker = markers[i]; i++) { - var r = this.removeMarker_(marker); - removed = removed || r; - } - - if (!opt_nodraw && removed) { - this.resetViewport(); - this.redraw(); - return true; - } -}; - - -/** - * Sets the clusterer's ready state. - * - * @param {boolean} ready The state. - * @private - */ -MarkerClusterer.prototype.setReady_ = function(ready) { - if (!this.ready_) { - this.ready_ = ready; - this.createClusters_(); - } -}; - - -/** - * Returns the number of clusters in the clusterer. - * - * @return {number} The number of clusters. - */ -MarkerClusterer.prototype.getTotalClusters = function() { - return this.clusters_.length; -}; - - -/** - * Returns the google map that the clusterer is associated with. - * - * @return {google.maps.Map} The map. - */ -MarkerClusterer.prototype.getMap = function() { - return this.map_; -}; - - -/** - * Sets the google map that the clusterer is associated with. - * - * @param {google.maps.Map} map The map. - */ -MarkerClusterer.prototype.setMap = function(map) { - this.map_ = map; -}; - - -/** - * Returns the size of the grid. - * - * @return {number} The grid size. - */ -MarkerClusterer.prototype.getGridSize = function() { - return this.gridSize_; -}; - - -/** - * Sets the size of the grid. - * - * @param {number} size The grid size. - */ -MarkerClusterer.prototype.setGridSize = function(size) { - this.gridSize_ = size; -}; - - -/** - * Returns the min cluster size. - * - * @return {number} The grid size. - */ -MarkerClusterer.prototype.getMinClusterSize = function() { - return this.minClusterSize_; -}; - -/** - * Sets the min cluster size. - * - * @param {number} size The grid size. - */ -MarkerClusterer.prototype.setMinClusterSize = function(size) { - this.minClusterSize_ = size; -}; - - -/** - * Extends a bounds object by the grid size. - * - * @param {google.maps.LatLngBounds} bounds The bounds to extend. - * @return {google.maps.LatLngBounds} The extended bounds. - */ -MarkerClusterer.prototype.getExtendedBounds = function(bounds) { - var projection = this.getProjection(); - - // Turn the bounds into latlng. - var tr = new google.maps.LatLng(bounds.getNorthEast().lat(), - bounds.getNorthEast().lng()); - var bl = new google.maps.LatLng(bounds.getSouthWest().lat(), - bounds.getSouthWest().lng()); - - // Convert the points to pixels and the extend out by the grid size. - var trPix = projection.fromLatLngToDivPixel(tr); - trPix.x += this.gridSize_; - trPix.y -= this.gridSize_; - - var blPix = projection.fromLatLngToDivPixel(bl); - blPix.x -= this.gridSize_; - blPix.y += this.gridSize_; - - // Convert the pixel points back to LatLng - var ne = projection.fromDivPixelToLatLng(trPix); - var sw = projection.fromDivPixelToLatLng(blPix); - - // Extend the bounds to contain the new bounds. - bounds.extend(ne); - bounds.extend(sw); - - return bounds; -}; - - -/** - * Determins if a marker is contained in a bounds. - * - * @param {google.maps.Marker} marker The marker to check. - * @param {google.maps.LatLngBounds} bounds The bounds to check against. - * @return {boolean} True if the marker is in the bounds. - * @private - */ -MarkerClusterer.prototype.isMarkerInBounds_ = function(marker, bounds) { - return bounds.contains(marker.getPosition()); -}; - - -/** - * Clears all clusters and markers from the clusterer. - */ -MarkerClusterer.prototype.clearMarkers = function() { - this.resetViewport(true); - - // Set the markers a empty array. - this.markers_ = []; -}; - - -/** - * Clears all existing clusters and recreates them. - * @param {boolean} opt_hide To also hide the marker. - */ -MarkerClusterer.prototype.resetViewport = function(opt_hide) { - // Remove all the clusters - for (var i = 0, cluster; cluster = this.clusters_[i]; i++) { - cluster.remove(); - } - - // Reset the markers to not be added and to be invisible. - for (var i = 0, marker; marker = this.markers_[i]; i++) { - marker.isAdded = false; - if (opt_hide) { - marker.setMap(null); - } - } - - this.clusters_ = []; -}; - -/** - * - */ -MarkerClusterer.prototype.repaint = function() { - var oldClusters = this.clusters_.slice(); - this.clusters_.length = 0; - this.resetViewport(); - this.redraw(); - - // Remove the old clusters. - // Do it in a timeout so the other clusters have been drawn first. - window.setTimeout(function() { - for (var i = 0, cluster; cluster = oldClusters[i]; i++) { - cluster.remove(); - } - }, 0); -}; - - -/** - * Redraws the clusters. - */ -MarkerClusterer.prototype.redraw = function() { - this.createClusters_(); -}; - - -/** - * Calculates the distance between two latlng locations in km. - * @see http://www.movable-type.co.uk/scripts/latlong.html - * - * @param {google.maps.LatLng} p1 The first lat lng point. - * @param {google.maps.LatLng} p2 The second lat lng point. - * @return {number} The distance between the two points in km. - * @private -*/ -MarkerClusterer.prototype.distanceBetweenPoints_ = function(p1, p2) { - if (!p1 || !p2) { - return 0; - } - - var R = 6371; // Radius of the Earth in km - var dLat = (p2.lat() - p1.lat()) * Math.PI / 180; - var dLon = (p2.lng() - p1.lng()) * Math.PI / 180; - var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + - Math.cos(p1.lat() * Math.PI / 180) * Math.cos(p2.lat() * Math.PI / 180) * - Math.sin(dLon / 2) * Math.sin(dLon / 2); - var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); - var d = R * c; - return d; -}; - - -/** - * Add a marker to a cluster, or creates a new cluster. - * - * @param {google.maps.Marker} marker The marker to add. - * @private - */ -MarkerClusterer.prototype.addToClosestCluster_ = function(marker) { - var distance = 40000; // Some large number - var clusterToAddTo = null; - var pos = marker.getPosition(); - for (var i = 0, cluster; cluster = this.clusters_[i]; i++) { - var center = cluster.getCenter(); - if (center) { - var d = this.distanceBetweenPoints_(center, marker.getPosition()); - if (d < distance) { - distance = d; - clusterToAddTo = cluster; - } - } - } - - if (clusterToAddTo && clusterToAddTo.isMarkerInClusterBounds(marker)) { - clusterToAddTo.addMarker(marker); - } else { - var cluster = new Cluster(this); - cluster.addMarker(marker); - this.clusters_.push(cluster); - } -}; - - -/** - * Creates the clusters. - * - * @private - */ -MarkerClusterer.prototype.createClusters_ = function() { - if (!this.ready_) { - return; - } - - // Get our current map view bounds. - // Create a new bounds object so we don't affect the map. - var mapBounds = new google.maps.LatLngBounds(this.map_.getBounds().getSouthWest(), - this.map_.getBounds().getNorthEast()); - var bounds = this.getExtendedBounds(mapBounds); - - for (var i = 0, marker; marker = this.markers_[i]; i++) { - if (!marker.isAdded && this.isMarkerInBounds_(marker, bounds)) { - this.addToClosestCluster_(marker); - } - } -}; - - -/** - * A cluster that contains markers. - * - * @param {MarkerClusterer} markerClusterer The markerclusterer that this - * cluster is associated with. - * @constructor - * @ignore - */ -function Cluster(markerClusterer) { - this.markerClusterer_ = markerClusterer; - this.map_ = markerClusterer.getMap(); - this.gridSize_ = markerClusterer.getGridSize(); - this.minClusterSize_ = markerClusterer.getMinClusterSize(); - this.averageCenter_ = markerClusterer.isAverageCenter(); - this.center_ = null; - this.markers_ = []; - this.bounds_ = null; - this.clusterIcon_ = new ClusterIcon(this, markerClusterer.getStyles(), - markerClusterer.getGridSize()); -} - -/** - * Determins if a marker is already added to the cluster. - * - * @param {google.maps.Marker} marker The marker to check. - * @return {boolean} True if the marker is already added. - */ -Cluster.prototype.isMarkerAlreadyAdded = function(marker) { - if (this.markers_.indexOf) { - return this.markers_.indexOf(marker) != -1; - } else { - for (var i = 0, m; m = this.markers_[i]; i++) { - if (m == marker) { - return true; - } - } - } - return false; -}; - - -/** - * Add a marker the cluster. - * - * @param {google.maps.Marker} marker The marker to add. - * @return {boolean} True if the marker was added. - */ -Cluster.prototype.addMarker = function(marker) { - if (this.isMarkerAlreadyAdded(marker)) { - return false; - } - - if (!this.center_) { - this.center_ = marker.getPosition(); - this.calculateBounds_(); - } else { - if (this.averageCenter_) { - var l = this.markers_.length + 1; - var lat = (this.center_.lat() * (l-1) + marker.getPosition().lat()) / l; - var lng = (this.center_.lng() * (l-1) + marker.getPosition().lng()) / l; - this.center_ = new google.maps.LatLng(lat, lng); - this.calculateBounds_(); - } - } - - marker.isAdded = true; - this.markers_.push(marker); - - var len = this.markers_.length; - if (len < this.minClusterSize_ && marker.getMap() != this.map_) { - // Min cluster size not reached so show the marker. - marker.setMap(this.map_); - } - - if (len == this.minClusterSize_) { - // Hide the markers that were showing. - for (var i = 0; i < len; i++) { - this.markers_[i].setMap(null); - } - } - - if (len >= this.minClusterSize_) { - marker.setMap(null); - } - - this.updateIcon(); - return true; -}; - - -/** - * Returns the marker clusterer that the cluster is associated with. - * - * @return {MarkerClusterer} The associated marker clusterer. - */ -Cluster.prototype.getMarkerClusterer = function() { - return this.markerClusterer_; -}; - - -/** - * Returns the bounds of the cluster. - * - * @return {google.maps.LatLngBounds} the cluster bounds. - */ -Cluster.prototype.getBounds = function() { - var bounds = new google.maps.LatLngBounds(this.center_, this.center_); - var markers = this.getMarkers(); - for (var i = 0, marker; marker = markers[i]; i++) { - bounds.extend(marker.getPosition()); - } - return bounds; -}; - - -/** - * Removes the cluster - */ -Cluster.prototype.remove = function() { - this.clusterIcon_.remove(); - this.markers_.length = 0; - delete this.markers_; -}; - - -/** - * Returns the center of the cluster. - * - * @return {number} The cluster center. - */ -Cluster.prototype.getSize = function() { - return this.markers_.length; -}; - - -/** - * Returns the center of the cluster. - * - * @return {Array.} The cluster center. - */ -Cluster.prototype.getMarkers = function() { - return this.markers_; -}; - - -/** - * Returns the center of the cluster. - * - * @return {google.maps.LatLng} The cluster center. - */ -Cluster.prototype.getCenter = function() { - return this.center_; -}; - - -/** - * Calculated the extended bounds of the cluster with the grid. - * - * @private - */ -Cluster.prototype.calculateBounds_ = function() { - var bounds = new google.maps.LatLngBounds(this.center_, this.center_); - this.bounds_ = this.markerClusterer_.getExtendedBounds(bounds); -}; - - -/** - * Determines if a marker lies in the clusters bounds. - * - * @param {google.maps.Marker} marker The marker to check. - * @return {boolean} True if the marker lies in the bounds. - */ -Cluster.prototype.isMarkerInClusterBounds = function(marker) { - return this.bounds_.contains(marker.getPosition()); -}; - - -/** - * Returns the map that the cluster is associated with. - * - * @return {google.maps.Map} The map. - */ -Cluster.prototype.getMap = function() { - return this.map_; -}; - - -/** - * Updates the cluster icon - */ -Cluster.prototype.updateIcon = function() { - var zoom = this.map_.getZoom(); - var mz = this.markerClusterer_.getMaxZoom(); - - if (mz && zoom > mz) { - // The zoom is greater than our max zoom so show all the markers in cluster. - for (var i = 0, marker; marker = this.markers_[i]; i++) { - marker.setMap(this.map_); - } - return; - } - - if (this.markers_.length < this.minClusterSize_) { - // Min cluster size not yet reached. - this.clusterIcon_.hide(); - return; - } - - var numStyles = this.markerClusterer_.getStyles().length; - var sums = this.markerClusterer_.getCalculator()(this.markers_, numStyles); - this.clusterIcon_.setCenter(this.center_); - this.clusterIcon_.setSums(sums); - this.clusterIcon_.show(); -}; - - -/** - * A cluster icon - * - * @param {Cluster} cluster The cluster to be associated with. - * @param {Object} styles An object that has style properties: - * 'url': (string) The image url. - * 'height': (number) The image height. - * 'width': (number) The image width. - * 'anchor': (Array) The anchor position of the label text. - * 'textColor': (string) The text color. - * 'textSize': (number) The text size. - * 'backgroundPosition: (string) The background postition x, y. - * @param {number=} opt_padding Optional padding to apply to the cluster icon. - * @constructor - * @extends google.maps.OverlayView - * @ignore - */ -function ClusterIcon(cluster, styles, opt_padding) { - cluster.getMarkerClusterer().extend(ClusterIcon, google.maps.OverlayView); - - this.styles_ = styles; - this.padding_ = opt_padding || 0; - this.cluster_ = cluster; - this.center_ = null; - this.map_ = cluster.getMap(); - this.div_ = null; - this.sums_ = null; - this.visible_ = false; - - this.setMap(this.map_); -} - - -/** - * Triggers the clusterclick event and zoom's if the option is set. - */ -ClusterIcon.prototype.triggerClusterClick = function() { - var markerClusterer = this.cluster_.getMarkerClusterer(); - - // Trigger the clusterclick event. - google.maps.event.trigger(markerClusterer, 'clusterclick', this.cluster_); - - if (markerClusterer.isZoomOnClick()) { - // Zoom into the cluster. - this.map_.fitBounds(this.cluster_.getBounds()); - } -}; - - -/** - * Adding the cluster icon to the dom. - * @ignore - */ -ClusterIcon.prototype.onAdd = function() { - this.div_ = document.createElement('DIV'); - if (this.visible_) { - var pos = this.getPosFromLatLng_(this.center_); - this.div_.style.cssText = this.createCss(pos); - this.div_.innerHTML = this.sums_.text; - } - - var panes = this.getPanes(); - panes.overlayMouseTarget.appendChild(this.div_); - - var that = this; - google.maps.event.addDomListener(this.div_, 'click', function() { - that.triggerClusterClick(); - }); -}; - - -/** - * Returns the position to place the div dending on the latlng. - * - * @param {google.maps.LatLng} latlng The position in latlng. - * @return {google.maps.Point} The position in pixels. - * @private - */ -ClusterIcon.prototype.getPosFromLatLng_ = function(latlng) { - var pos = this.getProjection().fromLatLngToDivPixel(latlng); - pos.x -= parseInt(this.width_ / 2, 10); - pos.y -= parseInt(this.height_ / 2, 10); - return pos; -}; - - -/** - * Draw the icon. - * @ignore - */ -ClusterIcon.prototype.draw = function() { - if (this.visible_) { - var pos = this.getPosFromLatLng_(this.center_); - this.div_.style.top = pos.y + 'px'; - this.div_.style.left = pos.x + 'px'; - } -}; - - -/** - * Hide the icon. - */ -ClusterIcon.prototype.hide = function() { - if (this.div_) { - this.div_.style.display = 'none'; - } - this.visible_ = false; -}; - - -/** - * Position and show the icon. - */ -ClusterIcon.prototype.show = function() { - if (this.div_) { - var pos = this.getPosFromLatLng_(this.center_); - this.div_.style.cssText = this.createCss(pos); - this.div_.style.display = ''; - } - this.visible_ = true; -}; - - -/** - * Remove the icon from the map - */ -ClusterIcon.prototype.remove = function() { - this.setMap(null); -}; - - -/** - * Implementation of the onRemove interface. - * @ignore - */ -ClusterIcon.prototype.onRemove = function() { - if (this.div_ && this.div_.parentNode) { - this.hide(); - this.div_.parentNode.removeChild(this.div_); - this.div_ = null; - } -}; - - -/** - * Set the sums of the icon. - * - * @param {Object} sums The sums containing: - * 'text': (string) The text to display in the icon. - * 'index': (number) The style index of the icon. - */ -ClusterIcon.prototype.setSums = function(sums) { - this.sums_ = sums; - this.text_ = sums.text; - this.index_ = sums.index; - if (this.div_) { - this.div_.innerHTML = sums.text; - } - - this.useStyle(); -}; - - -/** - * Sets the icon to the the styles. - */ -ClusterIcon.prototype.useStyle = function() { - var index = Math.max(0, this.sums_.index - 1); - index = Math.min(this.styles_.length - 1, index); - var style = this.styles_[index]; - this.url_ = style['url']; - this.height_ = style['height']; - this.width_ = style['width']; - this.textColor_ = style['textColor']; - this.anchor_ = style['anchor']; - this.textSize_ = style['textSize']; - this.backgroundPosition_ = style['backgroundPosition']; -}; - - -/** - * Sets the center of the icon. - * - * @param {google.maps.LatLng} center The latlng to set as the center. - */ -ClusterIcon.prototype.setCenter = function(center) { - this.center_ = center; -}; - - -/** - * Create the css text based on the position of the icon. - * - * @param {google.maps.Point} pos The position. - * @return {string} The css style text. - */ -ClusterIcon.prototype.createCss = function(pos) { - var style = []; - style.push('background-image:url(' + this.url_ + ');'); - var backgroundPosition = this.backgroundPosition_ ? this.backgroundPosition_ : '0 0'; - style.push('background-position:' + backgroundPosition + ';'); - - if (typeof this.anchor_ === 'object') { - if (typeof this.anchor_[0] === 'number' && this.anchor_[0] > 0 && - this.anchor_[0] < this.height_) { - style.push('height:' + (this.height_ - this.anchor_[0]) + - 'px; padding-top:' + this.anchor_[0] + 'px;'); - } else { - style.push('height:' + this.height_ + 'px; line-height:' + this.height_ + - 'px;'); - } - if (typeof this.anchor_[1] === 'number' && this.anchor_[1] > 0 && - this.anchor_[1] < this.width_) { - style.push('width:' + (this.width_ - this.anchor_[1]) + - 'px; padding-left:' + this.anchor_[1] + 'px;'); - } else { - style.push('width:' + this.width_ + 'px; text-align:center;'); - } - } else { - style.push('height:' + this.height_ + 'px; line-height:' + - this.height_ + 'px; width:' + this.width_ + 'px; text-align:center;'); - } - - var txtColor = this.textColor_ ? this.textColor_ : 'black'; - var txtSize = this.textSize_ ? this.textSize_ : 11; - - style.push('cursor:pointer; top:' + pos.y + 'px; left:' + - pos.x + 'px; color:' + txtColor + '; position:absolute; font-size:' + - txtSize + 'px; font-family:Arial,sans-serif; font-weight:bold'); - return style.join(''); -}; - - -// Export Symbols for Closure -// If you are not going to compile with closure then you can remove the -// code below. -window['MarkerClusterer'] = MarkerClusterer; -MarkerClusterer.prototype['addMarker'] = MarkerClusterer.prototype.addMarker; -MarkerClusterer.prototype['addMarkers'] = MarkerClusterer.prototype.addMarkers; -MarkerClusterer.prototype['clearMarkers'] = - MarkerClusterer.prototype.clearMarkers; -MarkerClusterer.prototype['fitMapToMarkers'] = - MarkerClusterer.prototype.fitMapToMarkers; -MarkerClusterer.prototype['getCalculator'] = - MarkerClusterer.prototype.getCalculator; -MarkerClusterer.prototype['getGridSize'] = - MarkerClusterer.prototype.getGridSize; -MarkerClusterer.prototype['getExtendedBounds'] = - MarkerClusterer.prototype.getExtendedBounds; -MarkerClusterer.prototype['getMap'] = MarkerClusterer.prototype.getMap; -MarkerClusterer.prototype['getMarkers'] = MarkerClusterer.prototype.getMarkers; -MarkerClusterer.prototype['getMaxZoom'] = MarkerClusterer.prototype.getMaxZoom; -MarkerClusterer.prototype['getStyles'] = MarkerClusterer.prototype.getStyles; -MarkerClusterer.prototype['getTotalClusters'] = - MarkerClusterer.prototype.getTotalClusters; -MarkerClusterer.prototype['getTotalMarkers'] = - MarkerClusterer.prototype.getTotalMarkers; -MarkerClusterer.prototype['redraw'] = MarkerClusterer.prototype.redraw; -MarkerClusterer.prototype['removeMarker'] = - MarkerClusterer.prototype.removeMarker; -MarkerClusterer.prototype['removeMarkers'] = - MarkerClusterer.prototype.removeMarkers; -MarkerClusterer.prototype['resetViewport'] = - MarkerClusterer.prototype.resetViewport; -MarkerClusterer.prototype['repaint'] = - MarkerClusterer.prototype.repaint; -MarkerClusterer.prototype['setCalculator'] = - MarkerClusterer.prototype.setCalculator; -MarkerClusterer.prototype['setGridSize'] = - MarkerClusterer.prototype.setGridSize; -MarkerClusterer.prototype['setMaxZoom'] = - MarkerClusterer.prototype.setMaxZoom; -MarkerClusterer.prototype['onAdd'] = MarkerClusterer.prototype.onAdd; -MarkerClusterer.prototype['draw'] = MarkerClusterer.prototype.draw; - -Cluster.prototype['getCenter'] = Cluster.prototype.getCenter; -Cluster.prototype['getSize'] = Cluster.prototype.getSize; -Cluster.prototype['getMarkers'] = Cluster.prototype.getMarkers; - -ClusterIcon.prototype['onAdd'] = ClusterIcon.prototype.onAdd; -ClusterIcon.prototype['draw'] = ClusterIcon.prototype.draw; -ClusterIcon.prototype['onRemove'] = ClusterIcon.prototype.onRemove; - -Object.keys = Object.keys || function(o) { - var result = []; - for(var name in o) { - if (o.hasOwnProperty(name)) - result.push(name); - } - return result; -}; diff --git a/htdocs/web_portal/javascript/jquery/jquery-1.10.min.js b/htdocs/web_portal/javascript/jquery/jquery-1.10.min.js index f30ebe061..ca635bba0 100644 --- a/htdocs/web_portal/javascript/jquery/jquery-1.10.min.js +++ b/htdocs/web_portal/javascript/jquery/jquery-1.10.min.js @@ -1,5 +1,5 @@ /*! jQuery v1.10.2 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license -//@ sourceMappingURL=jquery-latest.min.map +//# sourceMappingURL=jquery-latest.min.map */ (function(e,t){var n,r,i=typeof t,o=e.location,a=e.document,s=a.documentElement,l=e.jQuery,u=e.$,c={},p=[],f="1.10.2",d=p.concat,h=p.push,g=p.slice,m=p.indexOf,y=c.toString,v=c.hasOwnProperty,b=f.trim,x=function(e,t){return new x.fn.init(e,t,r)},w=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=/\S+/g,C=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,k=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,E=/^[\],:{}\s]*$/,S=/(?:^|:|,)(?:\s*\[)+/g,A=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,j=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,D=/^-ms-/,L=/-([\da-z])/gi,H=function(e,t){return t.toUpperCase()},q=function(e){(a.addEventListener||"load"===e.type||"complete"===a.readyState)&&(_(),x.ready())},_=function(){a.addEventListener?(a.removeEventListener("DOMContentLoaded",q,!1),e.removeEventListener("load",q,!1)):(a.detachEvent("onreadystatechange",q),e.detachEvent("onload",q))};x.fn=x.prototype={jquery:f,constructor:x,init:function(e,n,r){var i,o;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof x?n[0]:n,x.merge(this,x.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:a,!0)),k.test(i[1])&&x.isPlainObject(n))for(i in n)x.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(o=a.getElementById(i[2]),o&&o.parentNode){if(o.id!==i[2])return r.find(e);this.length=1,this[0]=o}return this.context=a,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return g.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(g.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},l=2),"object"==typeof s||x.isFunction(s)||(s={}),u===l&&(s=this,--l);u>l;l++)if(null!=(o=arguments[l]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(x.isPlainObject(r)||(n=x.isArray(r)))?(n?(n=!1,a=e&&x.isArray(e)?e:[]):a=e&&x.isPlainObject(e)?e:{},s[i]=x.extend(c,a,r)):r!==t&&(s[i]=r));return s},x.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=l),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){if(e===!0?!--x.readyWait:!x.isReady){if(!a.body)return setTimeout(x.ready);x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(a,[x]),x.fn.trigger&&x(a).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray||function(e){return"array"===x.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?c[y.call(e)]||"object":typeof e},isPlainObject:function(e){var n;if(!e||"object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!v.call(e,"constructor")&&!v.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(r){return!1}if(x.support.ownLast)for(n in e)return v.call(e,n);for(n in e);return n===t||v.call(e,n)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||a;var r=k.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=x.trim(n),n&&E.test(n.replace(A,"@").replace(j,"]").replace(S,"")))?Function("return "+n)():(x.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||x.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&x.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(D,"ms-").replace(L,H)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:b&&!b.call("\ufeff\u00a0")?function(e){return null==e?"":b.call(e)}:function(e){return null==e?"":(e+"").replace(C,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(m)return m.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return d.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),x.isFunction(e)?(r=g.call(arguments,2),i=function(){return e.apply(n||this,r.concat(g.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):t},access:function(e,n,r,i,o,a,s){var l=0,u=e.length,c=null==r;if("object"===x.type(r)){o=!0;for(l in r)x.access(e,n,l,r[l],!0,a,s)}else if(i!==t&&(o=!0,x.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(x(e),n)})),n))for(;u>l;l++)n(e[l],r,s?i:i.call(e[l],l,n(e[l],r)));return o?e:c?n.call(e):u?n(e[0],r):a},now:function(){return(new Date).getTime()},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),x.ready.promise=function(t){if(!n)if(n=x.Deferred(),"complete"===a.readyState)setTimeout(x.ready);else if(a.addEventListener)a.addEventListener("DOMContentLoaded",q,!1),e.addEventListener("load",q,!1);else{a.attachEvent("onreadystatechange",q),e.attachEvent("onload",q);var r=!1;try{r=null==e.frameElement&&a.documentElement}catch(i){}r&&r.doScroll&&function o(){if(!x.isReady){try{r.doScroll("left")}catch(e){return setTimeout(o,50)}_(),x.ready()}}()}return n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){c["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=x(a),function(e,t){var n,r,i,o,a,s,l,u,c,p,f,d,h,g,m,y,v,b="sizzle"+-new Date,w=e.document,T=0,C=0,N=st(),k=st(),E=st(),S=!1,A=function(e,t){return e===t?(S=!0,0):0},j=typeof t,D=1<<31,L={}.hasOwnProperty,H=[],q=H.pop,_=H.push,M=H.push,O=H.slice,F=H.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},B="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",P="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",W=R.replace("w","w#"),$="\\["+P+"*("+R+")"+P+"*(?:([*^$|!~]?=)"+P+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+W+")|)|)"+P+"*\\]",I=":("+R+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+$.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+P+"+|((?:^|[^\\\\])(?:\\\\.)*)"+P+"+$","g"),X=RegExp("^"+P+"*,"+P+"*"),U=RegExp("^"+P+"*([>+~]|"+P+")"+P+"*"),V=RegExp(P+"*[+~]"),Y=RegExp("="+P+"*([^\\]'\"]*)"+P+"*\\]","g"),J=RegExp(I),G=RegExp("^"+W+"$"),Q={ID:RegExp("^#("+R+")"),CLASS:RegExp("^\\.("+R+")"),TAG:RegExp("^("+R.replace("w","w*")+")"),ATTR:RegExp("^"+$),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+P+"*(even|odd|(([+-]|)(\\d*)n|)"+P+"*(?:([+-]|)"+P+"*(\\d+)|))"+P+"*\\)|)","i"),bool:RegExp("^(?:"+B+")$","i"),needsContext:RegExp("^"+P+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+P+"*((?:-\\d)?\\d*)"+P+"*\\)|)(?=[^-]|$)","i")},K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,et=/^(?:input|select|textarea|button)$/i,tt=/^h\d$/i,nt=/'|\\/g,rt=RegExp("\\\\([\\da-f]{1,6}"+P+"?|("+P+")|.)","ig"),it=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{M.apply(H=O.call(w.childNodes),w.childNodes),H[w.childNodes.length].nodeType}catch(ot){M={apply:H.length?function(e,t){_.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function at(e,t,n,i){var o,a,s,l,u,c,d,m,y,x;if((t?t.ownerDocument||t:w)!==f&&p(t),t=t||f,n=n||[],!e||"string"!=typeof e)return n;if(1!==(l=t.nodeType)&&9!==l)return[];if(h&&!i){if(o=Z.exec(e))if(s=o[1]){if(9===l){if(a=t.getElementById(s),!a||!a.parentNode)return n;if(a.id===s)return n.push(a),n}else if(t.ownerDocument&&(a=t.ownerDocument.getElementById(s))&&v(t,a)&&a.id===s)return n.push(a),n}else{if(o[2])return M.apply(n,t.getElementsByTagName(e)),n;if((s=o[3])&&r.getElementsByClassName&&t.getElementsByClassName)return M.apply(n,t.getElementsByClassName(s)),n}if(r.qsa&&(!g||!g.test(e))){if(m=d=b,y=t,x=9===l&&e,1===l&&"object"!==t.nodeName.toLowerCase()){c=mt(e),(d=t.getAttribute("id"))?m=d.replace(nt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",u=c.length;while(u--)c[u]=m+yt(c[u]);y=V.test(e)&&t.parentNode||t,x=c.join(",")}if(x)try{return M.apply(n,y.querySelectorAll(x)),n}catch(T){}finally{d||t.removeAttribute("id")}}}return kt(e.replace(z,"$1"),t,n,i)}function st(){var e=[];function t(n,r){return e.push(n+=" ")>o.cacheLength&&delete t[e.shift()],t[n]=r}return t}function lt(e){return e[b]=!0,e}function ut(e){var t=f.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function ct(e,t){var n=e.split("|"),r=e.length;while(r--)o.attrHandle[n[r]]=t}function pt(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function ft(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function dt(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ht(e){return lt(function(t){return t=+t,lt(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}s=at.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},r=at.support={},p=at.setDocument=function(e){var n=e?e.ownerDocument||e:w,i=n.defaultView;return n!==f&&9===n.nodeType&&n.documentElement?(f=n,d=n.documentElement,h=!s(n),i&&i.attachEvent&&i!==i.top&&i.attachEvent("onbeforeunload",function(){p()}),r.attributes=ut(function(e){return e.className="i",!e.getAttribute("className")}),r.getElementsByTagName=ut(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),r.getElementsByClassName=ut(function(e){return e.innerHTML="
    ",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),r.getById=ut(function(e){return d.appendChild(e).id=b,!n.getElementsByName||!n.getElementsByName(b).length}),r.getById?(o.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){return e.getAttribute("id")===t}}):(delete o.find.ID,o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),o.find.TAG=r.getElementsByTagName?function(e,n){return typeof n.getElementsByTagName!==j?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},o.find.CLASS=r.getElementsByClassName&&function(e,n){return typeof n.getElementsByClassName!==j&&h?n.getElementsByClassName(e):t},m=[],g=[],(r.qsa=K.test(n.querySelectorAll))&&(ut(function(e){e.innerHTML="",e.querySelectorAll("[selected]").length||g.push("\\["+P+"*(?:value|"+B+")"),e.querySelectorAll(":checked").length||g.push(":checked")}),ut(function(e){var t=n.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&g.push("[*^$]="+P+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||g.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),g.push(",.*:")})),(r.matchesSelector=K.test(y=d.webkitMatchesSelector||d.mozMatchesSelector||d.oMatchesSelector||d.msMatchesSelector))&&ut(function(e){r.disconnectedMatch=y.call(e,"div"),y.call(e,"[s!='']:x"),m.push("!=",I)}),g=g.length&&RegExp(g.join("|")),m=m.length&&RegExp(m.join("|")),v=K.test(d.contains)||d.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},A=d.compareDocumentPosition?function(e,t){if(e===t)return S=!0,0;var i=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t);return i?1&i||!r.sortDetached&&t.compareDocumentPosition(e)===i?e===n||v(w,e)?-1:t===n||v(w,t)?1:c?F.call(c,e)-F.call(c,t):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return S=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:c?F.call(c,e)-F.call(c,t):0;if(o===a)return pt(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?pt(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},n):f},at.matches=function(e,t){return at(e,null,null,t)},at.matchesSelector=function(e,t){if((e.ownerDocument||e)!==f&&p(e),t=t.replace(Y,"='$1']"),!(!r.matchesSelector||!h||m&&m.test(t)||g&&g.test(t)))try{var n=y.call(e,t);if(n||r.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(i){}return at(t,f,null,[e]).length>0},at.contains=function(e,t){return(e.ownerDocument||e)!==f&&p(e),v(e,t)},at.attr=function(e,n){(e.ownerDocument||e)!==f&&p(e);var i=o.attrHandle[n.toLowerCase()],a=i&&L.call(o.attrHandle,n.toLowerCase())?i(e,n,!h):t;return a===t?r.attributes||!h?e.getAttribute(n):(a=e.getAttributeNode(n))&&a.specified?a.value:null:a},at.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},at.uniqueSort=function(e){var t,n=[],i=0,o=0;if(S=!r.detectDuplicates,c=!r.sortStable&&e.slice(0),e.sort(A),S){while(t=e[o++])t===e[o]&&(i=n.push(o));while(i--)e.splice(n[i],1)}return e},a=at.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=a(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=a(t);return n},o=at.selectors={cacheLength:50,createPseudo:lt,match:Q,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(rt,it),e[3]=(e[4]||e[5]||"").replace(rt,it),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||at.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&at.error(e[0]),e},PSEUDO:function(e){var n,r=!e[5]&&e[2];return Q.CHILD.test(e[0])?null:(e[3]&&e[4]!==t?e[2]=e[4]:r&&J.test(r)&&(n=mt(r,!0))&&(n=r.indexOf(")",r.length-n)-r.length)&&(e[0]=e[0].slice(0,n),e[2]=r.slice(0,n)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(rt,it).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=N[e+" "];return t||(t=RegExp("(^|"+P+")"+e+"("+P+"|$)"))&&N(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=at.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var u,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!l&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[b]||(m[b]={}),u=c[e]||[],d=u[0]===T&&u[1],f=u[0]===T&&u[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[T,d,f];break}}else if(v&&(u=(t[b]||(t[b]={}))[e])&&u[0]===T)f=u[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[b]||(p[b]={}))[e]=[T,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=o.pseudos[e]||o.setFilters[e.toLowerCase()]||at.error("unsupported pseudo: "+e);return r[b]?r(t):r.length>1?(n=[e,e,"",t],o.setFilters.hasOwnProperty(e.toLowerCase())?lt(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=F.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:lt(function(e){var t=[],n=[],r=l(e.replace(z,"$1"));return r[b]?lt(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:lt(function(e){return function(t){return at(e,t).length>0}}),contains:lt(function(e){return function(t){return(t.textContent||t.innerText||a(t)).indexOf(e)>-1}}),lang:lt(function(e){return G.test(e||"")||at.error("unsupported lang: "+e),e=e.replace(rt,it).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===d},focus:function(e){return e===f.activeElement&&(!f.hasFocus||f.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!o.pseudos.empty(e)},header:function(e){return tt.test(e.nodeName)},input:function(e){return et.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:ht(function(){return[0]}),last:ht(function(e,t){return[t-1]}),eq:ht(function(e,t,n){return[0>n?n+t:n]}),even:ht(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:ht(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:ht(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:ht(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}},o.pseudos.nth=o.pseudos.eq;for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})o.pseudos[n]=ft(n);for(n in{submit:!0,reset:!0})o.pseudos[n]=dt(n);function gt(){}gt.prototype=o.filters=o.pseudos,o.setFilters=new gt;function mt(e,t){var n,r,i,a,s,l,u,c=k[e+" "];if(c)return t?0:c.slice(0);s=e,l=[],u=o.preFilter;while(s){(!n||(r=X.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),l.push(i=[])),n=!1,(r=U.exec(s))&&(n=r.shift(),i.push({value:n,type:r[0].replace(z," ")}),s=s.slice(n.length));for(a in o.filter)!(r=Q[a].exec(s))||u[a]&&!(r=u[a](r))||(n=r.shift(),i.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?at.error(e):k(e,l).slice(0)}function yt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function vt(e,t,n){var r=t.dir,o=n&&"parentNode"===r,a=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||o)return e(t,n,i)}:function(t,n,s){var l,u,c,p=T+" "+a;if(s){while(t=t[r])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[r])if(1===t.nodeType||o)if(c=t[b]||(t[b]={}),(u=c[r])&&u[0]===p){if((l=u[1])===!0||l===i)return l===!0}else if(u=c[r]=[p],u[1]=e(t,n,s)||i,u[1]===!0)return!0}}function bt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xt(e,t,n,r,i){var o,a=[],s=0,l=e.length,u=null!=t;for(;l>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),u&&t.push(s));return a}function wt(e,t,n,r,i,o){return r&&!r[b]&&(r=wt(r)),i&&!i[b]&&(i=wt(i,o)),lt(function(o,a,s,l){var u,c,p,f=[],d=[],h=a.length,g=o||Nt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:xt(g,f,e,s,l),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,l),r){u=xt(y,d),r(u,[],s,l),c=u.length;while(c--)(p=u[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){u=[],c=y.length;while(c--)(p=y[c])&&u.push(m[c]=p);i(null,y=[],u,l)}c=y.length;while(c--)(p=y[c])&&(u=i?F.call(o,p):f[c])>-1&&(o[u]=!(a[u]=p))}}else y=xt(y===a?y.splice(h,y.length):y),i?i(null,a,y,l):M.apply(a,y)})}function Tt(e){var t,n,r,i=e.length,a=o.relative[e[0].type],s=a||o.relative[" "],l=a?1:0,c=vt(function(e){return e===t},s,!0),p=vt(function(e){return F.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;i>l;l++)if(n=o.relative[e[l].type])f=[vt(bt(f),n)];else{if(n=o.filter[e[l].type].apply(null,e[l].matches),n[b]){for(r=++l;i>r;r++)if(o.relative[e[r].type])break;return wt(l>1&&bt(f),l>1&&yt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&Tt(e.slice(l,r)),i>r&&Tt(e=e.slice(r)),i>r&&yt(e))}f.push(n)}return bt(f)}function Ct(e,t){var n=0,r=t.length>0,a=e.length>0,s=function(s,l,c,p,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,C=u,N=s||a&&o.find.TAG("*",d&&l.parentNode||l),k=T+=null==C?1:Math.random()||.1;for(w&&(u=l!==f&&l,i=n);null!=(h=N[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,l,c)){p.push(h);break}w&&(T=k,i=++n)}r&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,r&&b!==v){g=0;while(m=t[g++])m(x,y,l,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=q.call(p));y=xt(y)}M.apply(p,y),w&&!s&&y.length>0&&v+t.length>1&&at.uniqueSort(p)}return w&&(T=k,u=C),x};return r?lt(s):s}l=at.compile=function(e,t){var n,r=[],i=[],o=E[e+" "];if(!o){t||(t=mt(e)),n=t.length;while(n--)o=Tt(t[n]),o[b]?r.push(o):i.push(o);o=E(e,Ct(i,r))}return o};function Nt(e,t,n){var r=0,i=t.length;for(;i>r;r++)at(e,t[r],n);return n}function kt(e,t,n,i){var a,s,u,c,p,f=mt(e);if(!i&&1===f.length){if(s=f[0]=f[0].slice(0),s.length>2&&"ID"===(u=s[0]).type&&r.getById&&9===t.nodeType&&h&&o.relative[s[1].type]){if(t=(o.find.ID(u.matches[0].replace(rt,it),t)||[])[0],!t)return n;e=e.slice(s.shift().value.length)}a=Q.needsContext.test(e)?0:s.length;while(a--){if(u=s[a],o.relative[c=u.type])break;if((p=o.find[c])&&(i=p(u.matches[0].replace(rt,it),V.test(s[0].type)&&t.parentNode||t))){if(s.splice(a,1),e=i.length&&yt(s),!e)return M.apply(n,i),n;break}}}return l(e,f)(i,t,!h,n,V.test(e)),n}r.sortStable=b.split("").sort(A).join("")===b,r.detectDuplicates=S,p(),r.sortDetached=ut(function(e){return 1&e.compareDocumentPosition(f.createElement("div"))}),ut(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||ct("type|href|height|width",function(e,n,r){return r?t:e.getAttribute(n,"type"===n.toLowerCase()?1:2)}),r.attributes&&ut(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||ct("value",function(e,n,r){return r||"input"!==e.nodeName.toLowerCase()?t:e.defaultValue}),ut(function(e){return null==e.getAttribute("disabled")})||ct(B,function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&i.specified?i.value:e[n]===!0?n.toLowerCase():null}),x.find=at,x.expr=at.selectors,x.expr[":"]=x.expr.pseudos,x.unique=at.uniqueSort,x.text=at.getText,x.isXMLDoc=at.isXML,x.contains=at.contains}(e);var O={};function F(e){var t=O[e]={};return x.each(e.match(T)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?O[e]||F(e):x.extend({},e);var n,r,i,o,a,s,l=[],u=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=l.length,n=!0;l&&o>a;a++)if(l[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,l&&(u?u.length&&c(u.shift()):r?l=[]:p.disable())},p={add:function(){if(l){var t=l.length;(function i(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&p.has(n)||l.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=l.length:r&&(s=t,c(r))}return this},remove:function(){return l&&x.each(arguments,function(e,t){var r;while((r=x.inArray(t,l,r))>-1)l.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?x.inArray(e,l)>-1:!(!l||!l.length)},empty:function(){return l=[],o=0,this},disable:function(){return l=u=r=t,this},disabled:function(){return!l},lock:function(){return u=t,r||p.disable(),this},locked:function(){return!u},fireWith:function(e,t){return!l||i&&!u||(t=t||[],t=[e,t.slice?t.slice():t],n?u.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var a=o[0],s=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=g.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?g.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,l,u;if(r>1)for(s=Array(r),l=Array(r),u=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(a(t,u,n)).fail(o.reject).progress(a(t,l,s)):--i;return i||o.resolveWith(u,n),o.promise()}}),x.support=function(t){var n,r,o,s,l,u,c,p,f,d=a.createElement("div");if(d.setAttribute("className","t"),d.innerHTML="
    a",n=d.getElementsByTagName("*")||[],r=d.getElementsByTagName("a")[0],!r||!r.style||!n.length)return t;s=a.createElement("select"),u=s.appendChild(a.createElement("option")),o=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t.getSetAttribute="t"!==d.className,t.leadingWhitespace=3===d.firstChild.nodeType,t.tbody=!d.getElementsByTagName("tbody").length,t.htmlSerialize=!!d.getElementsByTagName("link").length,t.style=/top/.test(r.getAttribute("style")),t.hrefNormalized="/a"===r.getAttribute("href"),t.opacity=/^0.5/.test(r.style.opacity),t.cssFloat=!!r.style.cssFloat,t.checkOn=!!o.value,t.optSelected=u.selected,t.enctype=!!a.createElement("form").enctype,t.html5Clone="<:nav>"!==a.createElement("nav").cloneNode(!0).outerHTML,t.inlineBlockNeedsLayout=!1,t.shrinkWrapBlocks=!1,t.pixelPosition=!1,t.deleteExpando=!0,t.noCloneEvent=!0,t.reliableMarginRight=!0,t.boxSizingReliable=!0,o.checked=!0,t.noCloneChecked=o.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!u.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}o=a.createElement("input"),o.setAttribute("value",""),t.input=""===o.getAttribute("value"),o.value="t",o.setAttribute("type","radio"),t.radioValue="t"===o.value,o.setAttribute("checked","t"),o.setAttribute("name","t"),l=a.createDocumentFragment(),l.appendChild(o),t.appendChecked=o.checked,t.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip;for(f in x(t))break;return t.ownLast="0"!==f,x(function(){var n,r,o,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",l=a.getElementsByTagName("body")[0];l&&(n=a.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",l.appendChild(n).appendChild(d),d.innerHTML="
    t
    ",o=d.getElementsByTagName("td"),o[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===o[0].offsetHeight,o[0].style.display="",o[1].style.display="none",t.reliableHiddenOffsets=p&&0===o[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",x.swap(l,null!=l.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===d.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(a.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="
    ",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(l.style.zoom=1)),l.removeChild(n),n=d=o=r=null)}),n=s=l=u=r=o=null,t }({});var B=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;function R(e,n,r,i){if(x.acceptData(e)){var o,a,s=x.expando,l=e.nodeType,u=l?x.cache:e,c=l?e[s]:e[s]&&s;if(c&&u[c]&&(i||u[c].data)||r!==t||"string"!=typeof n)return c||(c=l?e[s]=p.pop()||x.guid++:s),u[c]||(u[c]=l?{}:{toJSON:x.noop}),("object"==typeof n||"function"==typeof n)&&(i?u[c]=x.extend(u[c],n):u[c].data=x.extend(u[c].data,n)),a=u[c],i||(a.data||(a.data={}),a=a.data),r!==t&&(a[x.camelCase(n)]=r),"string"==typeof n?(o=a[n],null==o&&(o=a[x.camelCase(n)])):o=a,o}}function W(e,t,n){if(x.acceptData(e)){var r,i,o=e.nodeType,a=o?x.cache:e,s=o?e[x.expando]:x.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){x.isArray(t)?t=t.concat(x.map(t,x.camelCase)):t in r?t=[t]:(t=x.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;while(i--)delete r[t[i]];if(n?!I(r):!x.isEmptyObject(r))return}(n||(delete a[s].data,I(a[s])))&&(o?x.cleanData([e],!0):x.support.deleteExpando||a!=a.window?delete a[s]:a[s]=null)}}}x.extend({cache:{},noData:{applet:!0,embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?x.cache[e[x.expando]]:e[x.expando],!!e&&!I(e)},data:function(e,t,n){return R(e,t,n)},removeData:function(e,t){return W(e,t)},_data:function(e,t,n){return R(e,t,n,!0)},_removeData:function(e,t){return W(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&x.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),x.fn.extend({data:function(e,n){var r,i,o=null,a=0,s=this[0];if(e===t){if(this.length&&(o=x.data(s),1===s.nodeType&&!x._data(s,"parsedAttrs"))){for(r=s.attributes;r.length>a;a++)i=r[a].name,0===i.indexOf("data-")&&(i=x.camelCase(i.slice(5)),$(s,i,o[i]));x._data(s,"parsedAttrs",!0)}return o}return"object"==typeof e?this.each(function(){x.data(this,e)}):arguments.length>1?this.each(function(){x.data(this,e,n)}):s?$(s,e,x.data(s,e)):null},removeData:function(e){return this.each(function(){x.removeData(this,e)})}});function $(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(P,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:B.test(r)?x.parseJSON(r):r}catch(o){}x.data(e,n,r)}else r=t}return r}function I(e){var t;for(t in e)if(("data"!==t||!x.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}x.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=x._data(e,n),r&&(!i||x.isArray(r)?i=x._data(e,n,x.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),a=function(){x.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return x._data(e,n)||x._data(e,n,{empty:x.Callbacks("once memory").add(function(){x._removeData(e,t+"queue"),x._removeData(e,n)})})}}),x.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?x.queue(this[0],e):n===t?this:this.each(function(){var t=x.queue(this,e,n);x._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=x.Deferred(),a=this,s=this.length,l=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=x._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(l));return l(),o.promise(n)}});var z,X,U=/[\t\r\n\f]/g,V=/\r/g,Y=/^(?:input|select|textarea|button|object)$/i,J=/^(?:a|area)$/i,G=/^(?:checked|selected)$/i,Q=x.support.getSetAttribute,K=x.support.input;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return e=x.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,l="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,l=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var t,r=0,o=x(this),a=e.match(T)||[];while(t=a[r++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else(n===i||"boolean"===n)&&(this.className&&x._data(this,"__className__",this.className),this.className=this.className||e===!1?"":x._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(U," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=x.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=i?e.call(this,n,x(this).val()):e,null==o?o="":"number"==typeof o?o+="":x.isArray(o)&&(o=x.map(o,function(e){return null==e?"":e+""})),r=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(V,""):null==n?"":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=x.find.attr(e,"value");return null!=t?t:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,l=0>i?s:o?i:0;for(;s>l;l++)if(n=r[l],!(!n.selected&&l!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),a=i.length;while(a--)r=i[a],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,n,r){var o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===i?x.prop(e,n,r):(1===s&&x.isXMLDoc(e)||(n=n.toLowerCase(),o=x.attrHooks[n]||(x.expr.match.bool.test(n)?X:z)),r===t?o&&"get"in o&&null!==(a=o.get(e,n))?a:(a=x.find.attr(e,n),null==a?t:a):null!==r?o&&"set"in o&&(a=o.set(e,r,n))!==t?a:(e.setAttribute(n,r+""),r):(x.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(T);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)?K&&Q||!G.test(n)?e[r]=!1:e[x.camelCase("default-"+n)]=e[r]=!1:x.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!x.isXMLDoc(e),a&&(n=x.propFix[n]||n,o=x.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var t=x.find.attr(e,"tabindex");return t?parseInt(t,10):Y.test(e.nodeName)||J.test(e.nodeName)&&e.href?0:-1}}}}),X={set:function(e,t,n){return t===!1?x.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&x.propFix[n]||n,n):e[x.camelCase("default-"+n)]=e[n]=!0,n}},x.each(x.expr.match.bool.source.match(/\w+/g),function(e,n){var r=x.expr.attrHandle[n]||x.find.attr;x.expr.attrHandle[n]=K&&Q||!G.test(n)?function(e,n,i){var o=x.expr.attrHandle[n],a=i?t:(x.expr.attrHandle[n]=t)!=r(e,n,i)?n.toLowerCase():null;return x.expr.attrHandle[n]=o,a}:function(e,n,r){return r?t:e[x.camelCase("default-"+n)]?n.toLowerCase():null}}),K&&Q||(x.attrHooks.value={set:function(e,n,r){return x.nodeName(e,"input")?(e.defaultValue=n,t):z&&z.set(e,n,r)}}),Q||(z={set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},x.expr.attrHandle.id=x.expr.attrHandle.name=x.expr.attrHandle.coords=function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&""!==i.value?i.value:null},x.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&r.specified?r.value:t},set:z.set},x.attrHooks.contenteditable={set:function(e,t,n){z.set(e,""===t?!1:t,n)}},x.each(["width","height"],function(e,n){x.attrHooks[n]={set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}}})),x.support.hrefNormalized||x.each(["href","src"],function(e,t){x.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),x.support.style||(x.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.support.enctype||(x.propFix.enctype="encoding"),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,n){return x.isArray(n)?e.checked=x.inArray(x(e).val(),n)>=0:t}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}function at(){try{return a.activeElement}catch(e){}}x.event={global:{},add:function(e,n,r,o,a){var s,l,u,c,p,f,d,h,g,m,y,v=x._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=x.guid++),(l=v.events)||(l=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof x===i||e&&x.event.triggered===e.type?t:x.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(T)||[""],u=n.length;while(u--)s=rt.exec(n[u])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),g&&(p=x.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=x.event.special[g]||{},d=x.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&x.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=l[g])||(h=l[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),x.event.global[g]=!0);e=null}},remove:function(e,t,n,r,i){var o,a,s,l,u,c,p,f,d,h,g,m=x.hasData(e)&&x._data(e);if(m&&(c=m.events)){t=(t||"").match(T)||[""],u=t.length;while(u--)if(s=rt.exec(t[u])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=x.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),l=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));l&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||x.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)x.event.remove(e,d+t[u],n,r,!0);x.isEmptyObject(c)&&(delete m.handle,x._removeData(e,"events"))}},trigger:function(n,r,i,o){var s,l,u,c,p,f,d,h=[i||a],g=v.call(n,"type")?n.type:n,m=v.call(n,"namespace")?n.namespace.split("."):[];if(u=f=i=i||a,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+x.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),l=0>g.indexOf(":")&&"on"+g,n=n[x.expando]?n:new x.Event(g,"object"==typeof n&&n),n.isTrigger=o?2:3,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:x.makeArray(r,[n]),p=x.event.special[g]||{},o||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!o&&!p.noBubble&&!x.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(u=u.parentNode);u;u=u.parentNode)h.push(u),f=u;f===(i.ownerDocument||a)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((u=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(x._data(u,"events")||{})[n.type]&&x._data(u,"handle"),s&&s.apply(u,r),s=l&&u[l],s&&x.acceptData(u)&&s.apply&&s.apply(u,r)===!1&&n.preventDefault();if(n.type=g,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(h.pop(),r)===!1)&&x.acceptData(i)&&l&&i[g]&&!x.isWindow(i)){f=i[l],f&&(i[l]=null),x.event.triggered=g;try{i[g]()}catch(y){}x.event.triggered=t,f&&(i[l]=f)}return n.result}},dispatch:function(e){e=x.event.fix(e);var n,r,i,o,a,s=[],l=g.call(arguments),u=(x._data(this,"events")||{})[e.type]||[],c=x.event.special[e.type]||{};if(l[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((x.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,l),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],l=n.delegateCount,u=e.target;if(l&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(o=[],a=0;l>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?x(r,this).index(u)>=0:x.find(r,this,null,[u]).length),o[r]&&o.push(i);o.length&&s.push({elem:u,handlers:o})}return n.length>l&&s.push({elem:this,handlers:n.slice(l)}),s},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,o=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new x.Event(o),t=r.length;while(t--)n=r[t],e[n]=o[n];return e.target||(e.target=o.srcElement||a),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,o):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,o,s=n.button,l=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||a,o=i.documentElement,r=i.body,e.pageX=n.clientX+(o&&o.scrollLeft||r&&r.scrollLeft||0)-(o&&o.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(o&&o.scrollTop||r&&r.scrollTop||0)-(o&&o.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&l&&(e.relatedTarget=l===e.target?n.toElement:l),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==at()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===at()&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},click:{trigger:function(){return x.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t},_default:function(e){return x.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=a.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},x.Event=function(e,n){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&x.extend(this,n),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,t):new x.Event(e,n)},x.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.submitBubbles||(x.event.special.submit={setup:function(){return x.nodeName(this,"form")?!1:(x.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=x.nodeName(n,"input")||x.nodeName(n,"button")?n.form:t;r&&!x._data(r,"submitBubbles")&&(x.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),x._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&x.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return x.nodeName(this,"form")?!1:(x.event.remove(this,"._submit"),t)}}),x.support.changeBubbles||(x.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(x.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),x.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),x.event.simulate("change",this,e,!0)})),!1):(x.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!x._data(t,"changeBubbles")&&(x.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||x.event.simulate("change",this.parentNode,e,!0)}),x._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return x.event.remove(this,"._change"),!Z.test(this.nodeName)}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&a.addEventListener(e,r,!0)},teardown:function(){0===--n&&a.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return x().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=x.guid++)),this.each(function(){x.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,x(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){x.event.remove(this,e,r,n)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?x.event.trigger(e,n,r,!0):t}});var st=/^.[^:#\[\.,]*$/,lt=/^(?:parents|prev(?:Until|All))/,ut=x.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},has:function(e){var t,n=x(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(x.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e||[],!0))},filter:function(e){return this.pushStack(ft(this,e||[],!1))},is:function(e){return!!ft(this,"string"==typeof e&&ut.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],a=ut.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(a?a.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?x.inArray(this[0],x(e)):x.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return x.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(ct[e]||(i=x.unique(i)),lt.test(e)&&(i=i.reverse())),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!x(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(st.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return x.inArray(e,t)>=0!==n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/\s*$/g,At={option:[1,""],legend:[1,"
    ","
    "],area:[1,"",""],param:[1,"",""],thead:[1,"","
    "],tr:[2,"","
    "],col:[2,"","
    "],td:[3,"","
    "],_default:x.support.htmlSerialize?[0,"",""]:[1,"X
    ","
    "]},jt=dt(a),Dt=jt.appendChild(a.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===t?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||a).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(Ft(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&_t(Ft(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&x.cleanData(Ft(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&x.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!x.support.htmlSerialize&&mt.test(e)||!x.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(x.cleanData(Ft(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=d.apply([],e);var r,i,o,a,s,l,u=0,c=this.length,p=this,f=c-1,h=e[0],g=x.isFunction(h);if(g||!(1>=c||"string"!=typeof h||x.support.checkClone)&&Nt.test(h))return this.each(function(r){var i=p.eq(r);g&&(e[0]=h.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(l=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),r=l.firstChild,1===l.childNodes.length&&(l=r),r)){for(a=x.map(Ft(l,"script"),Ht),o=a.length;c>u;u++)i=l,u!==f&&(i=x.clone(i,!0,!0),o&&x.merge(a,Ft(i,"script"))),t.call(this[u],i,u);if(o)for(s=a[a.length-1].ownerDocument,x.map(a,qt),u=0;o>u;u++)i=a[u],kt.test(i.type||"")&&!x._data(i,"globalEval")&&x.contains(s,i)&&(i.src?x._evalUrl(i.src):x.globalEval((i.text||i.textContent||i.innerHTML||"").replace(St,"")));l=r=null}return this}});function Lt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function Ht(e){return e.type=(null!==x.find.attr(e,"type"))+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function _t(e,t){var n,r=0;for(;null!=(n=e[r]);r++)x._data(n,"globalEval",!t||x._data(t[r],"globalEval"))}function Mt(e,t){if(1===t.nodeType&&x.hasData(e)){var n,r,i,o=x._data(e),a=x._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)x.event.add(t,n,s[n][r])}a.data&&(a.data=x.extend({},a.data))}}function Ot(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!x.support.noCloneEvent&&t[x.expando]){i=x._data(t);for(r in i.events)x.removeEvent(t,r,i.handle);t.removeAttribute(x.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),x.support.html5Clone&&e.innerHTML&&!x.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Ct.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=0,i=[],o=x(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),x(o[r])[t](n),h.apply(i,n.get());return this.pushStack(i)}});function Ft(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||x.nodeName(o,n)?s.push(o):x.merge(s,Ft(o,n));return n===t||n&&x.nodeName(e,n)?x.merge([e],s):s}function Bt(e){Ct.test(e.type)&&(e.defaultChecked=e.checked)}x.extend({clone:function(e,t,n){var r,i,o,a,s,l=x.contains(e.ownerDocument,e);if(x.support.html5Clone||x.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(x.support.noCloneEvent&&x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(r=Ft(o),s=Ft(e),a=0;null!=(i=s[a]);++a)r[a]&&Ot(i,r[a]);if(t)if(n)for(s=s||Ft(e),r=r||Ft(o),a=0;null!=(i=s[a]);a++)Mt(i,r[a]);else Mt(e,o);return r=Ft(o,"script"),r.length>0&&_t(r,!l&&Ft(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,l,u,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===x.type(o))x.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),l=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[l]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!x.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!x.support.tbody){o="table"!==l||xt.test(o)?""!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)x.nodeName(u=o.childNodes[i],"tbody")&&!u.childNodes.length&&o.removeChild(u)}x.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),x.support.appendChecked||x.grep(Ft(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===x.inArray(o,r))&&(a=x.contains(o.ownerDocument,o),s=Ft(f.appendChild(o),"script"),a&&_t(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,l=x.expando,u=x.cache,c=x.support.deleteExpando,f=x.event.special;for(;null!=(n=e[s]);s++)if((t||x.acceptData(n))&&(o=n[l],a=o&&u[o])){if(a.events)for(r in a.events)f[r]?x.event.remove(n,r):x.removeEvent(n,r,a.handle); diff --git a/htdocs/web_portal/javascript/googleSiteMap.js b/htdocs/web_portal/javascript/leafletembed.js similarity index 59% rename from htdocs/web_portal/javascript/googleSiteMap.js rename to htdocs/web_portal/javascript/leafletembed.js index 7e11cbba0..fa32dec09 100644 --- a/htdocs/web_portal/javascript/googleSiteMap.js +++ b/htdocs/web_portal/javascript/leafletembed.js @@ -1,46 +1,37 @@ -//function to display google map. Adapted by George Ryall from the following tutorials: -// * https://developers.google.com/maps/articles/phpsqlajax_v3 -// * https://developers.google.com/maps/documentation/javascript/tutorial -// * http://www.w3schools.com/googleAPI/ -// * The example code here : http://gmaps-samples-v3.googlecode.com/svn/trunk/xmlparsing/ +// javascript file to display a leaflet map. +// Based on https://leafletjs.com/examples/quick-start/ and +// https://switch2osm.org/using-tiles/getting-started-with-leaflet/ -google.maps.event.addDomListener(window, 'load', initialize); - -var infowindow; var map; -function initialize() { - var mapProp = { - //Starting position of map - center:new google.maps.LatLng(30,0), - zoom:2, - //Enable zoom control, but move it to the left and make it small - zoomControl:true, - zoomControlOptions: { - style:google.maps.ZoomControlStyle.SMALL, - position:google.maps.ControlPosition.RIGHT_TOP - }, - //Allow map type choiuce, but move to bottom left - mapTypeControl:true, - mapTypeControlOptions: { - position:google.maps.ControlPosition.TOP_RIGHT - }, - //Turn off pan control - it clutters map and users can drag if needed - panControl:false, - //turn of street view controller - streetViewControl:false, - //Options:ROADMAP/SATELLITE/HYBRID/TERRAIN - mapTypeId:google.maps.MapTypeId.ROADMAP - }; +// Function to display a leaflet map with markers from GOCDB Site data. +function initmap() { + // set up the map + map = new L.Map('map'); + + // create the tile layer with correct attribution. + var osmUrl='https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png'; + var osmAttrib='Map data © OpenStreetMap contributors'; + var osm = new L.TileLayer(osmUrl, { + attribution: osmAttrib, + // A min zoom of 2 gives you a view of most of the world. Any further out starts to look "bad". + minZoom: 2, + // A max zoom of 20 or more doesn't have any map tiles. + maxZoom: 19, + }); - map = new google.maps.Map(document.getElementById("GoogleMap"), mapProp); + // Centre the view so that most sites can be viewed at level 2. + map.setView(new L.LatLng(30, 10), 2); + map.addLayer(osm); downloadUrl("index.php?Page_Type=Site_Geo_xml", function(data) { var markers = []; var xmlMarkers = data.documentElement.getElementsByTagName("Site"); for (var i = 0; i < xmlMarkers.length; i++) { - var latlng = new google.maps.LatLng(parseFloat(xmlMarkers[i].getAttribute("Latitude")), - parseFloat(xmlMarkers[i].getAttribute("Longitude"))); + var latlng = [ + parseFloat(xmlMarkers[i].getAttribute("Latitude")), + parseFloat(xmlMarkers[i].getAttribute("Longitude")) + ]; var shortName = xmlMarkers[i].getAttribute("ShortName"); var officialName = xmlMarkers[i].getAttribute("OfficialName"); var url = xmlMarkers[i].getAttribute("PortalURL"); @@ -50,24 +41,13 @@ function initialize() { description += "
    "; } var info = "" + shortName + " ("+ officialName + ")
    " + description + "View site"; - var marker = createMarker(info, latlng); - markers.push(marker); + + var marker = L.marker(latlng).addTo(map); + marker.bindPopup(info) } - var markerCluster = new MarkerClusterer(map, markers); }); } -function createMarker(description, latlng) { - var marker = new google.maps.Marker({position: latlng, map: map}); - google.maps.event.addListener(marker, "click", function() { - if (infowindow) infowindow.close(); - infowindow = new google.maps.InfoWindow({content: description}); - infowindow.open(map, marker); - }); - - return marker; -} - /** * Returns an XMLHttp instance to use for asynchronous * downloading. This method will never throw an exception, but will diff --git a/htdocs/web_portal/static_html/EGI_Scope.html b/htdocs/web_portal/static_html/EGI_Scope.html index 72119c003..01e49f51d 100644 --- a/htdocs/web_portal/static_html/EGI_Scope.html +++ b/htdocs/web_portal/static_html/EGI_Scope.html @@ -44,19 +44,19 @@

    More Information on Scope Tags

    1. -
      ?method=get_site&scope=EGI
      +
      ?method=get_site&scope=EGI
      (Fetch all sites tagged as 'EGI')
    2. -
      ?method=get_site&scope=EGI,ProjX&scope_match=all
      +
      ?method=get_site&scope=EGI,ProjX&scope_match=all
      (Fetch all sites tagged with both 'EGI' and ProjX)
    3. -
      ?method=get_site&scope=EGI,ProjX&scope_match=any
      +
      ?method=get_site&scope=EGI,ProjX&scope_match=any
      (Fetch all sites tagged with either 'EGI' or ProjX)
    4. -
      ?method=get_site&scope=
      +
      ?method=get_site&scope=
      (Fetch all sites regardless of scope tags)
    @@ -96,4 +96,4 @@

    More Information on Scope Tags

    - \ No newline at end of file + diff --git a/htdocs/web_portal/static_html/goc5_logo.html b/htdocs/web_portal/static_html/goc5_logo.html index d2b866af2..d25cddec4 100644 --- a/htdocs/web_portal/static_html/goc5_logo.html +++ b/htdocs/web_portal/static_html/goc5_logo.html @@ -1,10 +1,10 @@
    - +

    - GOCDB 5.7.2 + GOCDB 5.7.3

    diff --git a/htdocs/web_portal/static_php/standard_header.php b/htdocs/web_portal/static_php/standard_header.php index 337458fcc..1ee3a890a 100644 --- a/htdocs/web_portal/static_php/standard_header.php +++ b/htdocs/web_portal/static_php/standard_header.php @@ -25,9 +25,10 @@ function get_standard_header($title = null) { + '; return $header; -} \ No newline at end of file +} diff --git a/htdocs/web_portal/views/admin/added_ngi.php b/htdocs/web_portal/views/admin/added_ngi.php index b076dd2c3..1b1c94b1a 100644 --- a/htdocs/web_portal/views/admin/added_ngi.php +++ b/htdocs/web_portal/views/admin/added_ngi.php @@ -1,7 +1,7 @@

    Success



    - + has been successfully added as a new NGI.
    diff --git a/htdocs/web_portal/views/admin/added_project.php b/htdocs/web_portal/views/admin/added_project.php index 1439e5464..8e8743e81 100644 --- a/htdocs/web_portal/views/admin/added_project.php +++ b/htdocs/web_portal/views/admin/added_project.php @@ -4,7 +4,7 @@ has been successfully added as a new project.

    - + Click here to view the project and add NGIs to it. diff --git a/htdocs/web_portal/views/admin/added_scope.php b/htdocs/web_portal/views/admin/added_scope.php index 5b04e7ffe..26e71b84d 100644 --- a/htdocs/web_portal/views/admin/added_scope.php +++ b/htdocs/web_portal/views/admin/added_scope.php @@ -4,7 +4,7 @@ has been successfully added as a new scope.

    - + Click here to view the scope. diff --git a/htdocs/web_portal/views/admin/added_service_type.php b/htdocs/web_portal/views/admin/added_service_type.php index 31650f7e1..e38caf4b3 100644 --- a/htdocs/web_portal/views/admin/added_service_type.php +++ b/htdocs/web_portal/views/admin/added_service_type.php @@ -5,7 +5,7 @@ type with the following description: "".

    - + Click here to view the service type. diff --git a/htdocs/web_portal/views/admin/delete_ngi.php b/htdocs/web_portal/views/admin/delete_ngi.php index ca82387a9..491979ad2 100644 --- a/htdocs/web_portal/views/admin/delete_ngi.php +++ b/htdocs/web_portal/views/admin/delete_ngi.php @@ -10,7 +10,7 @@

    Delete ?


    Are you sure you want to delete the NGI ' - + '? Deleting NGIs is a functionality reserved for GOCDB administrators and should. be undertaken with caution. @@ -20,7 +20,7 @@ " - . "getId() ."\">" + . "getId() ."\">" . xssafe($site->getName()) . " "; } @@ -31,7 +31,7 @@ " - . "getId() ."\">" + . "getId() ."\">" . xssafe($service->getHostName()) . " (" . xssafe($service->getServiceType()->getName()) . ")" . " "; } diff --git a/htdocs/web_portal/views/admin/delete_scope_denied.php b/htdocs/web_portal/views/admin/delete_scope_denied.php index ee9fd288b..1b2744814 100644 --- a/htdocs/web_portal/views/admin/delete_scope_denied.php +++ b/htdocs/web_portal/views/admin/delete_scope_denied.php @@ -7,7 +7,7 @@

    Scope In Use


    The scope ' - + ' is currently in use. If you are absolutely sure you still want to delete it, @@ -18,7 +18,7 @@ " - . "getId() ."\">" + . "getId() ."\">" . xssafe($ngi->getName()) . " "; } @@ -29,7 +29,7 @@ " - . "getId() ."\">" + . "getId() ."\">" . xssafe($site->getShortName()) . " "; } @@ -40,7 +40,7 @@ " - . "getId() ."\">" + . "getId() ."\">" . xssafe($sGroup->getName()) . " "; } @@ -51,7 +51,7 @@ " - . "getId() ."\">" + . "getId() ."\">" . xssafe($sEndpoint->getHostName()) . " "; } diff --git a/htdocs/web_portal/views/admin/delete_service_type_denied.php b/htdocs/web_portal/views/admin/delete_service_type_denied.php index 32e33a3f0..cde534411 100644 --- a/htdocs/web_portal/views/admin/delete_service_type_denied.php +++ b/htdocs/web_portal/views/admin/delete_service_type_denied.php @@ -3,14 +3,14 @@

    Deletion Failed


    The service type ' - + getName());?> ' can not be deleted as the following services are still of this type: " - . "getId() ."\">" + . "getId() ."\">" . xssafe($sep->getHostName()) . " "; } diff --git a/htdocs/web_portal/views/admin/edited_scope.php b/htdocs/web_portal/views/admin/edited_scope.php index f3107b834..944e7631d 100644 --- a/htdocs/web_portal/views/admin/edited_scope.php +++ b/htdocs/web_portal/views/admin/edited_scope.php @@ -1,7 +1,7 @@

    Success


    - + has been successfully edited as follows:

    @@ -11,7 +11,7 @@ Description:

    - + Click here to edit the scope again.

    diff --git a/htdocs/web_portal/views/admin/edited_service_type.php b/htdocs/web_portal/views/admin/edited_service_type.php index dacac7fbf..30733251c 100644 --- a/htdocs/web_portal/views/admin/edited_service_type.php +++ b/htdocs/web_portal/views/admin/edited_service_type.php @@ -1,7 +1,7 @@

    Success


    - has been successfully edited as follows: + has been successfully edited as follows:

    Name: @@ -9,7 +9,7 @@ Description:

    - + Click here to edit the service type again.

    diff --git a/htdocs/web_portal/views/admin/edited_user_dn.php b/htdocs/web_portal/views/admin/edited_user_dn.php index a08e92faa..4e3050f9e 100644 --- a/htdocs/web_portal/views/admin/edited_user_dn.php +++ b/htdocs/web_portal/views/admin/edited_user_dn.php @@ -2,7 +2,7 @@

    Success


    The certificate DN for - + has been successfully updated.
    diff --git a/htdocs/web_portal/views/admin/edited_user_isadmin.php b/htdocs/web_portal/views/admin/edited_user_isadmin.php index e6345a9d9..7d31bb805 100644 --- a/htdocs/web_portal/views/admin/edited_user_isadmin.php +++ b/htdocs/web_portal/views/admin/edited_user_isadmin.php @@ -1,7 +1,7 @@

    Success


    - + is diff --git a/htdocs/web_portal/views/admin/moved_service_end_point.php b/htdocs/web_portal/views/admin/moved_service_end_point.php index 42d116c73..d1a799006 100644 --- a/htdocs/web_portal/views/admin/moved_service_end_point.php +++ b/htdocs/web_portal/views/admin/moved_service_end_point.php @@ -2,13 +2,13 @@

    Success


    The following services have been moved to - + getShortName());?> : " - . "getId() ."\">" + . "getId() ."\">" . xssafe($sep->getHostName()) . " "; } diff --git a/htdocs/web_portal/views/admin/moved_site.php b/htdocs/web_portal/views/admin/moved_site.php index 0195cc56f..1374f4be5 100644 --- a/htdocs/web_portal/views/admin/moved_site.php +++ b/htdocs/web_portal/views/admin/moved_site.php @@ -2,13 +2,13 @@

    Success


    The following sites have been moved to - + getName());?> : " - . "getId() ."\">" + . "getId() ."\">" . xssafe($site->getShortName()) . " "; } diff --git a/htdocs/web_portal/views/admin/scope.php b/htdocs/web_portal/views/admin/scope.php index 889e690db..6193a7b64 100644 --- a/htdocs/web_portal/views/admin/scope.php +++ b/htdocs/web_portal/views/admin/scope.php @@ -40,7 +40,7 @@
    - - - - - - - - - + + + + + + + + +
    - +   getName()); ?> @@ -127,7 +127,7 @@
    - +   getShortName()); ?> @@ -168,7 +168,7 @@
    - + getName()); ?> @@ -198,7 +198,7 @@ diff --git a/htdocs/web_portal/views/admin/scopes.php b/htdocs/web_portal/views/admin/scopes.php index 00c6674ae..ca92a659e 100644 --- a/htdocs/web_portal/views/admin/scopes.php +++ b/htdocs/web_portal/views/admin/scopes.php @@ -42,7 +42,7 @@ '; $sID = $se->getParentSite()->getId(); - echo $td1 . ''.xssafe($se->getParentSite()->getName()).''.$td2; - echo $td1 . ''.xssafe($se->getHostName()).''.$td2; + echo $td1 . ''.xssafe($se->getParentSite()->getName()).''.$td2; + echo $td1 . ''.xssafe($se->getHostName()).''.$td2; echo $td1 . (($se->getProduction()) ? 'Yes' : 'No') . $td2; echo $td1 . (($se->getMonitored()) ? 'Yes' : 'No') . $td2; echo ''; @@ -150,7 +150,7 @@ $affectedEPs = count($affectedServices); $parentSite = $affectedServices->first()->getParentSite(); $siteTotalEPs = count($parentSite->getServices()); - echo $td1 . ''.$dt->getId().''.$td2; + echo $td1 . ''.$dt->getId().''.$td2; //find affected sites for the site column echo $td1; @@ -162,7 +162,7 @@ $siteIDArrayUnique = array_unique($siteIDArray, SORT_REGULAR); //print the array foreach($siteIDArrayUnique as $i=>$site){ - echo ''.$site[1].''; + echo ''.$site[1].''; if ($i+1 < count($siteIDArrayUnique)) echo ', '; } @@ -189,8 +189,8 @@ foreach($dt->getServices() as $se){ echo ''; $sID = $se->getParentSite()->getId(); - echo $td1 . ''.xssafe($se->getParentSite()->getName()).''.$td2; - echo $td1 . ''.xssafe($se->getHostName()).''.$td2; + echo $td1 . ''.xssafe($se->getParentSite()->getName()).''.$td2; + echo $td1 . ''.xssafe($se->getHostName()).''.$td2; echo $td1 . (($se->getProduction()) ? 'Yes' : 'No') . $td2; echo $td1 . (($se->getMonitored()) ? 'Yes' : 'No') . $td2; echo ''; diff --git a/htdocs/web_portal/views/downtime/edited_downtime.php b/htdocs/web_portal/views/downtime/edited_downtime.php index 1a74aad1a..befc0212d 100644 --- a/htdocs/web_portal/views/downtime/edited_downtime.php +++ b/htdocs/web_portal/views/downtime/edited_downtime.php @@ -1,6 +1,6 @@

    Success

    Downtime updated.
    - + View downtime
    \ No newline at end of file diff --git a/htdocs/web_portal/views/downtime/ended_downtime.php b/htdocs/web_portal/views/downtime/ended_downtime.php index 21aedf573..32932746b 100644 --- a/htdocs/web_portal/views/downtime/ended_downtime.php +++ b/htdocs/web_portal/views/downtime/ended_downtime.php @@ -1,6 +1,6 @@

    Success


    Downtime will end within the next 60 seconds.
    - + View downtime
    \ No newline at end of file diff --git a/htdocs/web_portal/views/downtime/view_downtime.php b/htdocs/web_portal/views/downtime/view_downtime.php index 37f568d74..f776173aa 100644 --- a/htdocs/web_portal/views/downtime/view_downtime.php +++ b/htdocs/web_portal/views/downtime/view_downtime.php @@ -22,7 +22,7 @@ '; if(in_array($el, $dt->getEndpointLocations()->toArray())){ - echo ''; + echo ''; echo ''; echo ''; } else { - echo ''; + echo ''; echo "'; echo "'; } diff --git a/htdocs/web_portal/views/fragments/addPropertiesConfirmation.php b/htdocs/web_portal/views/fragments/addPropertiesConfirmation.php index ef5481c70..b3c4986d1 100644 --- a/htdocs/web_portal/views/fragments/addPropertiesConfirmation.php +++ b/htdocs/web_portal/views/fragments/addPropertiesConfirmation.php @@ -4,36 +4,33 @@
    - + View Services
    - + getName()); ?> diff --git a/htdocs/web_portal/views/admin/users.php b/htdocs/web_portal/views/admin/users.php index 403990623..426c22393 100644 --- a/htdocs/web_portal/views/admin/users.php +++ b/htdocs/web_portal/views/admin/users.php @@ -93,7 +93,7 @@
    - + getCertificateDn()); ?> @@ -111,7 +111,7 @@
    - + isAdmin()) { case true: @@ -146,4 +146,4 @@ - \ No newline at end of file + diff --git a/htdocs/web_portal/views/admin/view_service_type.php b/htdocs/web_portal/views/admin/view_service_type.php index eb3eeeeae..b8920807f 100644 --- a/htdocs/web_portal/views/admin/view_service_type.php +++ b/htdocs/web_portal/views/admin/view_service_type.php @@ -21,7 +21,7 @@
    - +

    @@ -71,7 +71,7 @@
    - + getHostname());?> (getServiceType()->getName());?>) diff --git a/htdocs/web_portal/views/admin/view_service_types.php b/htdocs/web_portal/views/admin/view_service_types.php index 27a43b95f..c7100d962 100644 --- a/htdocs/web_portal/views/admin/view_service_types.php +++ b/htdocs/web_portal/views/admin/view_service_types.php @@ -41,7 +41,7 @@
    - + getName()); ?> diff --git a/htdocs/web_portal/views/downtime/add_downtime.php b/htdocs/web_portal/views/downtime/add_downtime.php index d0f5b393b..35508c0d2 100644 --- a/htdocs/web_portal/views/downtime/add_downtime.php +++ b/htdocs/web_portal/views/downtime/add_downtime.php @@ -215,6 +215,7 @@ class="form-control" id="Select_Sites" name="select_sites" size="10" // Add the jQuery form change event handlers $("#addDTForm").find(":input").change(function(){ + updateStartEndTimesInUtc(); validate(); }); diff --git a/htdocs/web_portal/views/downtime/added_downtime.php b/htdocs/web_portal/views/downtime/added_downtime.php index 8ee3ce9a4..563515a0c 100644 --- a/htdocs/web_portal/views/downtime/added_downtime.php +++ b/htdocs/web_portal/views/downtime/added_downtime.php @@ -1,5 +1,5 @@

    Success


    New Downtime successfully created.
    - View new downtime + View new downtime
    \ No newline at end of file diff --git a/htdocs/web_portal/views/downtime/downtimes_overview.php b/htdocs/web_portal/views/downtime/downtimes_overview.php index 46b20cc1f..7bda9b71e 100644 --- a/htdocs/web_portal/views/downtime/downtimes_overview.php +++ b/htdocs/web_portal/views/downtime/downtimes_overview.php @@ -56,7 +56,7 @@ $affectedEPs = count($affectedServices); $parentSite = $affectedServices->first()->getParentSite(); $siteTotalEPs = count($parentSite->getServices()); - echo $td1 . ''.$dt->getId().''.$td2; + echo $td1 . ''.$dt->getId().''.$td2; //find affected sites for the site column echo $td1; @@ -68,7 +68,7 @@ $siteIDArrayUnique = array_unique($siteIDArray, SORT_REGULAR); //print the array foreach($siteIDArrayUnique as $i=>$site){ - echo ''.$site[1].''; + echo ''.$site[1].''; if ($i+1 < count($siteIDArrayUnique)) echo ', '; } @@ -95,8 +95,8 @@ foreach($dt->getServices() as $se){ echo '
    - + getHostname()) . " (" . xssafe($se->getServiceType()->getName()) . ")";?> @@ -196,11 +196,11 @@ function submitform() foreach($se->getEndpointLocations() as $el){ echo '
    '.xssafe($el->getName()).''.xssafe($el->getName()).''.xssafe($el->getUrl()).''.xssafe($el->getInterfaceName()).''.xssafe($el->getName()).''.xssafe($el->getName()).'".xssafe($el->getUrl()).'".xssafe($el->getInterfaceName()).'
    - - - - - + + + + + - - $prop) { + $prop) { ?> - - - - - - + + + + + + } + ?>
    NameValue Add?
    NameValue Add?
    - - - -
    + + + +
    -
    diff --git a/htdocs/web_portal/views/fragments/propertiesTable.php b/htdocs/web_portal/views/fragments/propertiesTable.php index 33c0b6987..c643bc792 100644 --- a/htdocs/web_portal/views/fragments/propertiesTable.php +++ b/htdocs/web_portal/views/fragments/propertiesTable.php @@ -1,22 +1,20 @@ - - - - + + + + - - - - - - - + + + + + } + ?>
    NameValue
    NameValue
    getKeyName()); ?>getKeyValue()); ?>
    getKeyName()); ?>getKeyValue()); ?>
    diff --git a/htdocs/web_portal/views/fragments/viewPropertiesTable.php b/htdocs/web_portal/views/fragments/viewPropertiesTable.php index 2a8405354..a2dfd597f 100644 --- a/htdocs/web_portal/views/fragments/viewPropertiesTable.php +++ b/htdocs/web_portal/views/fragments/viewPropertiesTable.php @@ -2,45 +2,49 @@
    - getRoleTypeName()); ?> - - - getRoleUserPrinciple()); ?> - - - getActionDate()->format('Y-m-d H:i:s')); ?> - - getRolePreStatus()); ?> - - getRoleNewStatus()); ?> - - - getUpdatedByUserPrinciple()); ?> - -
    + getRoleTypeName()); ?> + + + getRoleUserPrinciple()); ?> + + + getActionDate()->format('Y-m-d H:i:s')); ?> + + getRolePreStatus()); ?> + + getRoleNewStatus()); ?> + + + getUpdatedByUserPrinciple()); ?> + +
    diff --git a/htdocs/web_portal/views/my_sites.php b/htdocs/web_portal/views/my_sites.php index bc67bcad3..36428d88f 100644 --- a/htdocs/web_portal/views/my_sites.php +++ b/htdocs/web_portal/views/my_sites.php @@ -23,7 +23,7 @@ foreach($params['sites_from_roles'] as $site) { ?> - getShortName()) ?> + getShortName()) ?> @@ -42,7 +42,7 @@ foreach($params['ngis_from_roles'] as $ngi) { ?> - getName())?> + getName())?> @@ -64,7 +64,7 @@ foreach($params['sgroups_from_roles'] as $sg) { ?> - getName())?> + getName())?> @@ -83,7 +83,7 @@ foreach($params['projects_from_roles'] as $project) { ?> - getName())?> + getName())?> diff --git a/htdocs/web_portal/views/ngi/ngi_updated.php b/htdocs/web_portal/views/ngi/ngi_updated.php index 25513a84a..5a4062123 100644 --- a/htdocs/web_portal/views/ngi/ngi_updated.php +++ b/htdocs/web_portal/views/ngi/ngi_updated.php @@ -1,6 +1,6 @@

    Success

    NGI updated.
    - + View NGI
    \ No newline at end of file diff --git a/htdocs/web_portal/views/ngi/view_ngi.php b/htdocs/web_portal/views/ngi/view_ngi.php index 91e08bf23..8d9c9c13e 100644 --- a/htdocs/web_portal/views/ngi/view_ngi.php +++ b/htdocs/web_portal/views/ngi/view_ngi.php @@ -21,7 +21,7 @@
    + href="index.php?Page_Type=Admin_Delete_NGI&id=getId() ?>">
    Admin
    Delete
    @@ -30,7 +30,7 @@
    - +

    @@ -104,7 +104,7 @@ foreach($params['Projects'] as $project) { ?> -
    getName())?> + getName())?> @@ -141,68 +141,55 @@ - - - - - - - - - - - - getSites()) > 0) { + + + + + + + + + + - - - - - - - - - - + $scopes = $siteAndScopes['Scopes']; + ?> + + + + + + - + } // End of the foreach loop iterating over SitesAndScopes + ?> +
    NameCertification StatusProduction StatusScope(s)
    NameCertification StatusProduction StatusScope(s)
    - - getShortName()); ?> - - - getCertificationStatus()->getName()) ?> - - getInfrastructure()->getName()) ?> - - $sharedWithParent) { - if ($sharedWithParent) { - $scopeString .= $scopeName; - } else { - $scopeString .= $scopeName . '(x)'; - } - if (++$count != $numScopes) { - $scopeString .= ", "; - } - } ?> - -
    + + getShortName()); ?> + + + getCertificationStatus()->getName()) ?> + + getInfrastructure()->getName()) ?> + + $sharedWithParent) { + if ($sharedWithParent) { + $scopeString .= $scopeName; + } else { + $scopeString .= $scopeName . '(x)'; + } + if (++$count != $numScopes) { + $scopeString .= ", "; + } + } + ?> + +
    @@ -212,46 +199,51 @@ Users (Click on name to manage roles) - - - - - - - - - 0) { + + + + + + + + - - + + - - + + - + } // End of the foreach loop iterating over sites + ?> +
    NameRole
    NameRole
    - - - getUser()->getFullName())/*.' ['.$role->getUser()->getId().']' */?> - - -
    + + + getUser()->getFullName()) ?> + + + - - getRoleType()->getName())?> - -
    + getRoleType()->getName()); + } else { + echo 'PROTECTED'; + } + ?> +

      @@ -121,4 +116,4 @@ placeholder: "NGI Scopes" }); }); - \ No newline at end of file + diff --git a/htdocs/web_portal/views/political_role/view_requests.php b/htdocs/web_portal/views/political_role/view_requests.php index 20cc11cb9..e441595cc 100644 --- a/htdocs/web_portal/views/political_role/view_requests.php +++ b/htdocs/web_portal/views/political_role/view_requests.php @@ -96,7 +96,7 @@ } elseif($request->getOwnedEntity() instanceof \Project){ $entityViewLinkName = 'Project'; } - echo "
    $entityName [$entityViewLinkName]"; + echo " $entityName [$entityViewLinkName]"; ?> @@ -104,7 +104,7 @@ - + @@ -154,7 +154,7 @@ $requestingUserId = $requestingUser->getId(); $surname = xssafe($requestingUser->getSurname()); $forename = xssafe($requestingUser->getForename()); - echo "$forename $surname"; + echo "$forename $surname"; ?> @@ -176,7 +176,7 @@ } elseif($request->getOwnedEntity() instanceof \Project){ $entityClassName = 'Project'; } - echo " $entityName [$entityClassName]"; + echo " $entityName [$entityClassName]"; ?> diff --git a/htdocs/web_portal/views/political_role/view_role_action_mappings.php b/htdocs/web_portal/views/political_role/view_role_action_mappings.php index 71d8baa4d..c327a7b82 100644 --- a/htdocs/web_portal/views/political_role/view_role_action_mappings.php +++ b/htdocs/web_portal/views/political_role/view_role_action_mappings.php @@ -48,50 +48,44 @@ */ ?>
    -
    - - $roleActionTargetArray) { - ++$inc; - ?> -

    Roles

    - - - - - - - - - - - - - - - +
    + $roleActionTargetArray) { + ++$inc; + ?> +

    Roles

    +
    RoleTypeActionOn (Target of Action)
    + + + + + + + + + + + + + + + + +
    RoleTypeActionOn (Target of Action)
    - - - - +
    - -
    -
    - - diff --git a/htdocs/web_portal/views/project/add_ngis.php b/htdocs/web_portal/views/project/add_ngis.php index 51ba33613..e787e3bde 100644 --- a/htdocs/web_portal/views/project/add_ngis.php +++ b/htdocs/web_portal/views/project/add_ngis.php @@ -34,7 +34,7 @@

    Return to - +
    diff --git a/htdocs/web_portal/views/project/added_ngis.php b/htdocs/web_portal/views/project/added_ngis.php index 0eacdb23c..25c7eb159 100644 --- a/htdocs/web_portal/views/project/added_ngis.php +++ b/htdocs/web_portal/views/project/added_ngis.php @@ -1,13 +1,13 @@

    Success


    The following NGIs have been successfully added to the - + project: " - . "getId() ."\">" + . "getId() ."\">" . $ngi->getName() . " "; } diff --git a/htdocs/web_portal/views/project/edited_project.php b/htdocs/web_portal/views/project/edited_project.php index b4f471cf2..9057a631d 100644 --- a/htdocs/web_portal/views/project/edited_project.php +++ b/htdocs/web_portal/views/project/edited_project.php @@ -1,7 +1,7 @@

    Success


    - The + The project has been successfully edited as follows:

    @@ -10,7 +10,7 @@ Description:

    - + Click here to edit the project again.

    diff --git a/htdocs/web_portal/views/project/remove_ngis.php b/htdocs/web_portal/views/project/remove_ngis.php index ed12c7ab8..9e99d869c 100644 --- a/htdocs/web_portal/views/project/remove_ngis.php +++ b/htdocs/web_portal/views/project/remove_ngis.php @@ -29,7 +29,7 @@

    Return to - +
    diff --git a/htdocs/web_portal/views/project/removed_ngis.php b/htdocs/web_portal/views/project/removed_ngis.php index 43463eba1..fa5518ef9 100644 --- a/htdocs/web_portal/views/project/removed_ngis.php +++ b/htdocs/web_portal/views/project/removed_ngis.php @@ -1,7 +1,7 @@

    Success


    The selected NGIs have been successfully removed from the - + project
    \ No newline at end of file diff --git a/htdocs/web_portal/views/project/view_all.php b/htdocs/web_portal/views/project/view_all.php index 76eda2492..3bbd44b4a 100644 --- a/htdocs/web_portal/views/project/view_all.php +++ b/htdocs/web_portal/views/project/view_all.php @@ -23,34 +23,31 @@ Project - - - - - - - - - - - - - - - + + + + + + + + + + + + + +
    NameDescription
    - - getName()); ?> - - - getDescription()); ?> -
    NameDescription
    + + getName()); ?> + + + getDescription()); ?> +
    diff --git a/htdocs/web_portal/views/project/view_project.php b/htdocs/web_portal/views/project/view_project.php index 889bb9411..30c4618bc 100644 --- a/htdocs/web_portal/views/project/view_project.php +++ b/htdocs/web_portal/views/project/view_project.php @@ -18,7 +18,7 @@
    - +

    @@ -50,34 +50,32 @@ - - - - - - + + + + + + - - - - - - - - - + + + + + + + + +
    NameDescription
    NameDescription
    - - - - getName()); ?> - - getDescription()) ?>
    + + + getName()); ?> + + getDescription()) ?> +

       "; endif; ?> @@ -85,7 +83,7 @@ -
    + Add NGIs @@ -96,7 +94,7 @@ 0): ?> - + Remove NGIs @@ -117,43 +115,46 @@ 0): ?> - - - - - - - - - + + + + + + + + - - - - - - - + ?> + + + + + + +
    NameRole
    NameRole
    - - - - - getUser()->getFullName()?> - - - - getRoleType()->getName()); } else {echo('PROTECTED'); } ?> -
    + + + + + getUser()->getFullName()?> + + + + getRoleType()->getName()); } else {echo('PROTECTED'); } ?> +

        There are currently no users with roles over this project
    "; endif; ?> -
    + Request Role @@ -169,47 +170,46 @@ Site - 0): ?> - + 0) { ?> - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + +
    NameCertification StatusNGIProduction Status
    - - getShortName()); ?> - - - getCertificationStatus()->getName()) ?> - - - getNGI()->getName()) ?> - - - getInfrastructure()->getName()) ?> -
    NameCertification StatusNGIProduction Status
    + + getShortName()); ?> + + + getCertificationStatus()->getName()) ?> + + + getNGI()->getName()) ?> + + + getInfrastructure()->getName()) ?> +
    - + \ No newline at end of file + diff --git a/htdocs/web_portal/views/scope_help.php b/htdocs/web_portal/views/scope_help.php index 3d0cb4653..c56c32cec 100644 --- a/htdocs/web_portal/views/scope_help.php +++ b/htdocs/web_portal/views/scope_help.php @@ -44,26 +44,26 @@ from all the child Services - a Service can't have a reserved tag that is not supported by its parent Site.
  • For NGIs: If a Reserved tag is removed from an NGI, then the same tag is NOT - removed from all the child Sites - this is intentionally different from the Site->Service relationship.
  • + removed from all the child Sites - this is intentionally different from the Site→Service relationship.

    How are scope tags used in the API?

    The following are some examples of scope tags in use in PI queries:
    • -
      ?method=get_site&scope=EGI
      +
      ?method=get_site&scope=EGI
      (Fetch all sites tagged as 'EGI')
    • -
      ?method=get_site&scope=EGI,ProjX&scope_match=all
      +
      ?method=get_site&scope=EGI,ProjX&scope_match=all
      (Fetch all sites tagged with both 'EGI' and ProjX)
    • -
      ?method=get_site&scope=EGI,ProjX&scope_match=any
      +
      ?method=get_site&scope=EGI,ProjX&scope_match=any
      (Fetch all sites tagged with either 'EGI' or ProjX)
    • -
      ?method=get_site&scope=
      +
      ?method=get_site&scope=
      (Fetch all sites regardless of scope tags)
    @@ -80,23 +80,22 @@ Reserved? - - - - getName());?> - getDescription()); ?> - ✗ - - - - - - getName());?> - getDescription()); ?> - ✓ - - - + + + + getName());?> + getDescription()); ?> + ✗ + + + + + getName());?> + getDescription()); ?> + ✓ + + +
    @@ -129,4 +128,4 @@
    -
    \ No newline at end of file + diff --git a/htdocs/web_portal/views/search_results.php b/htdocs/web_portal/views/search_results.php index bbc854ed8..1aae23bcd 100644 --- a/htdocs/web_portal/views/search_results.php +++ b/htdocs/web_portal/views/search_results.php @@ -23,36 +23,33 @@ NGIs - - - - - - - - - - - - - - - - + + + + + + + + + + + + + +
    NameDescription
    - - -    getName()); ?> - - - getDescription()); ?> -
    NameDescription
    + + +    getName()); ?> + + + getDescription()); ?> +
    0"?> @@ -66,37 +63,31 @@ Sites - - - - - - - - - 0)) { - foreach($params['siteResults'] as $site) { - ?> - - - - - - - + + + + + + + + + + + + + +
    Short NameOfficial Name
    - - getShortName()); ?> - - - getOfficialName()); ?> -
    Short NameOfficial Name
    + + getShortName()); ?> + + + getOfficialName()); ?> +
    0"?> @@ -111,38 +102,34 @@ - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + +
    HostnameService TypeDescription
    - - getHostName()); ?> - - - getServiceType()->getName()); ?> - - getDescription()); ?> -
    HostnameService TypeDescription
    + + getHostName()); ?> + + + getServiceType()->getName()); ?> + + getDescription()); ?> +
    0"?> @@ -158,37 +145,41 @@ - - - - - - - - - - - - - - - + + + + + + + + + + + + + +
    NameE-Mail
    - - getFullName()); ?> - - - getEmail()); } else {echo 'PROTECTED - Authentication required'; } ?> -
    NameE-Mail
    + + getFullName()); ?> + + + getEmail()); + } else { + echo 'PROTECTED - Authentication required'; + } + ?> +
    - + - 0"?> + 0"?>
    @@ -206,4 +197,3 @@ $("#usersTable").tablesorter(); }); - diff --git a/htdocs/web_portal/views/service/add_service_endpoint.php b/htdocs/web_portal/views/service/add_service_endpoint.php index 7498223d2..17f78394b 100644 --- a/htdocs/web_portal/views/service/add_service_endpoint.php +++ b/htdocs/web_portal/views/service/add_service_endpoint.php @@ -8,7 +8,7 @@ id="Add_Service_Endpoint" name="Add_Service_Endpoint">

    Add Endpoint

    -
    + ←View Parent Service

    diff --git a/htdocs/web_portal/views/service/added_endpoint_properties.php b/htdocs/web_portal/views/service/added_endpoint_properties.php index 60566c894..74b93f9b5 100644 --- a/htdocs/web_portal/views/service/added_endpoint_properties.php +++ b/htdocs/web_portal/views/service/added_endpoint_properties.php @@ -8,6 +8,6 @@ new endpoint property(s) added to getName() ?>.
    - + View endpoint
    \ No newline at end of file diff --git a/htdocs/web_portal/views/service/added_service_endpoint.php b/htdocs/web_portal/views/service/added_service_endpoint.php index d33a9b7e1..006a89bff 100644 --- a/htdocs/web_portal/views/service/added_service_endpoint.php +++ b/htdocs/web_portal/views/service/added_service_endpoint.php @@ -1,9 +1,9 @@

    Success

    New endpoint successfully added.
    - + View Endpoint
    - + View Service
    diff --git a/htdocs/web_portal/views/service/added_service_properties.php b/htdocs/web_portal/views/service/added_service_properties.php index 9f25f4623..a62361886 100644 --- a/htdocs/web_portal/views/service/added_service_properties.php +++ b/htdocs/web_portal/views/service/added_service_properties.php @@ -8,6 +8,6 @@ new service property(s) added to getHostName() ?>.
    - + View service \ No newline at end of file diff --git a/htdocs/web_portal/views/service/deleted_endpoint_properties.php b/htdocs/web_portal/views/service/deleted_endpoint_properties.php index 2e19d9bf4..11517b36e 100644 --- a/htdocs/web_portal/views/service/deleted_endpoint_properties.php +++ b/htdocs/web_portal/views/service/deleted_endpoint_properties.php @@ -14,7 +14,7 @@

    - View endpoint + View endpoint

    \ No newline at end of file diff --git a/htdocs/web_portal/views/service/deleted_service_endpoint.php b/htdocs/web_portal/views/service/deleted_service_endpoint.php index 7eabc9ea7..ff5ba8d37 100644 --- a/htdocs/web_portal/views/service/deleted_service_endpoint.php +++ b/htdocs/web_portal/views/service/deleted_service_endpoint.php @@ -11,7 +11,7 @@

    Has been successfully removed from service getHostName());?>
    - + View service

    diff --git a/htdocs/web_portal/views/service/deleted_service_properties.php b/htdocs/web_portal/views/service/deleted_service_properties.php index b46ad9300..93a6623e7 100644 --- a/htdocs/web_portal/views/service/deleted_service_properties.php +++ b/htdocs/web_portal/views/service/deleted_service_properties.php @@ -14,7 +14,7 @@

    - View service + View service

    \ No newline at end of file diff --git a/htdocs/web_portal/views/service/edit_service_endpoint.php b/htdocs/web_portal/views/service/edit_service_endpoint.php index 680e0f5cd..aa7f1aba9 100644 --- a/htdocs/web_portal/views/service/edit_service_endpoint.php +++ b/htdocs/web_portal/views/service/edit_service_endpoint.php @@ -11,10 +11,10 @@ id="Edit_Service_Endpoint" name="Edit_Service_Endpoint">

    Edit Endpoint

    - + ←View Parent Service
    - + ←View Endpoint

    diff --git a/htdocs/web_portal/views/service/endpoint_property_updated.php b/htdocs/web_portal/views/service/endpoint_property_updated.php index 7b145c0e5..af8920e57 100644 --- a/htdocs/web_portal/views/service/endpoint_property_updated.php +++ b/htdocs/web_portal/views/service/endpoint_property_updated.php @@ -1,6 +1,6 @@

    Success

    Endpoint Property updated.
    - + View endpoint
    \ No newline at end of file diff --git a/htdocs/web_portal/views/service/se_downtimes.php b/htdocs/web_portal/views/service/se_downtimes.php index 3491c75e0..a758dc443 100644 --- a/htdocs/web_portal/views/service/se_downtimes.php +++ b/htdocs/web_portal/views/service/se_downtimes.php @@ -17,30 +17,34 @@ All Downtimes (Year-Month-Day Time in UTC) - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + +
    DescriptionFromTo
    - - getDescription() ?> - - getStartDate()->format('Y-m-d H:i'/*$downtime::DATE_FORMAT*/); ?>getEndDate()->format('Y-m-d H:i'/*$downtime::DATE_FORMAT*/); ?>
    DescriptionFromTo
    + + getDescription() ?> + + + getStartDate()->format('Y-m-d H:i'/*$downtime::DATE_FORMAT*/); ?> + + getEndDate()->format('Y-m-d H:i'/*$downtime::DATE_FORMAT*/); ?> +
    diff --git a/htdocs/web_portal/views/service/service_endpoint_updated.php b/htdocs/web_portal/views/service/service_endpoint_updated.php index 0b3fe7ccc..38e14d4b6 100644 --- a/htdocs/web_portal/views/service/service_endpoint_updated.php +++ b/htdocs/web_portal/views/service/service_endpoint_updated.php @@ -1,9 +1,9 @@

    Success

    Endpoint updated.
    - + View Endpoint
    - + View Service
    \ No newline at end of file diff --git a/htdocs/web_portal/views/service/service_property_updated.php b/htdocs/web_portal/views/service/service_property_updated.php index 15113c476..e960f5c4f 100644 --- a/htdocs/web_portal/views/service/service_property_updated.php +++ b/htdocs/web_portal/views/service/service_property_updated.php @@ -1,6 +1,6 @@

    Success

    Service Property updated.
    - + View service
    \ No newline at end of file diff --git a/htdocs/web_portal/views/service/service_updated.php b/htdocs/web_portal/views/service/service_updated.php index b29e82a04..2dbf7753e 100644 --- a/htdocs/web_portal/views/service/service_updated.php +++ b/htdocs/web_portal/views/service/service_updated.php @@ -1,6 +1,6 @@

    Success

    Service updated.
    - + View service
    \ No newline at end of file diff --git a/htdocs/web_portal/views/service/submit_add_service.php b/htdocs/web_portal/views/service/submit_add_service.php index 9a25fc29d..674eb6cb8 100644 --- a/htdocs/web_portal/views/service/submit_add_service.php +++ b/htdocs/web_portal/views/service/submit_add_service.php @@ -1,6 +1,6 @@

    Success

    New Service successfully created.
    - + View new service
    \ No newline at end of file diff --git a/htdocs/web_portal/views/service/view_all.php b/htdocs/web_portal/views/service/view_all.php index 2c7b97ef8..d3725bdfe 100644 --- a/htdocs/web_portal/views/service/view_all.php +++ b/htdocs/web_portal/views/service/view_all.php @@ -162,61 +162,59 @@ - - - - - - - - + + + + + + + + - 0) { - foreach ($params['services'] as $se) { + 0) { + foreach ($params['services'] as $se) { ?> - - - - - - - - - - - - + + + + + + + + + - + } // end of foreach iterating over services + } // end of if + ?>
    HostnameService TypeProductionMonitoredHost SiteScope(s)
    HostnameService TypeProductionMonitoredHost SiteScope(s)
    - - getHostName()); ?> - - - getServiceType()->getName()); ?> - - getProduction() == true) { ?> - - - - - - getMonitored() == true) { ?> - - - - - - - getParentSite()->getShortName()); ?> - - - -
    + + getHostName()); ?> + + + getServiceType()->getName()); ?> + + getProduction() == true) { ?> + + + + + + getMonitored() == true) { ?> + + + + + + + getParentSite()->getShortName()); ?> + + + +
    @@ -285,4 +283,3 @@ // }); }); - diff --git a/htdocs/web_portal/views/service/view_service.php b/htdocs/web_portal/views/service/view_service.php index d428831b5..6bd775ab8 100644 --- a/htdocs/web_portal/views/service/view_service.php +++ b/htdocs/web_portal/views/service/view_service.php @@ -22,7 +22,7 @@
    - +

    @@ -129,7 +129,7 @@ Parent Site -
    + getParentSite()->getShortName()); ?> @@ -247,7 +247,7 @@ ?> - + getName()) ?> @@ -287,7 +287,7 @@ - + getName()) ?> @@ -295,12 +295,12 @@ getInterfaceName()); ?> - + - + @@ -315,7 +315,7 @@ - + Add Endpoint @@ -339,43 +339,40 @@
    Recent Downtimes - (View all Downtimes) + (View all Downtimes) - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + +
    DescriptionFromTo
    - - getDescription()) ?> - - getStartDate()->format('Y-m-d H:i'/*$d::DATE_FORMAT*/) ?>getEndDate()->format('Y-m-d H:i'/*$d::DATE_FORMAT*/) ?>
    DescriptionFromTo
    + + getDescription()) ?> + + getStartDate()->format('Y-m-d H:i'/*$d::DATE_FORMAT*/) ?>getEndDate()->format('Y-m-d H:i'/*$d::DATE_FORMAT*/) ?>
    - + Add Downtime diff --git a/htdocs/web_portal/views/service/view_service_endpoint.php b/htdocs/web_portal/views/service/view_service_endpoint.php index abb047e4e..b29ae8658 100644 --- a/htdocs/web_portal/views/service/view_service_endpoint.php +++ b/htdocs/web_portal/views/service/view_service_endpoint.php @@ -24,7 +24,7 @@
    - +

    @@ -34,7 +34,7 @@
    + href="index.php?Page_Type=Delete_Service_Endpoint&endpointid=getId(); ?>&serviceid=">

    @@ -53,7 +53,7 @@ diff --git a/htdocs/web_portal/views/service_group/add_ses.php b/htdocs/web_portal/views/service_group/add_ses.php index 18076a2f5..d78130b1e 100644 --- a/htdocs/web_portal/views/service_group/add_ses.php +++ b/htdocs/web_portal/views/service_group/add_ses.php @@ -25,7 +25,7 @@ \ No newline at end of file diff --git a/htdocs/web_portal/views/service_group/deleted_service_group_properties.php b/htdocs/web_portal/views/service_group/deleted_service_group_properties.php index 2d1777dd5..287dfff32 100644 --- a/htdocs/web_portal/views/service_group/deleted_service_group_properties.php +++ b/htdocs/web_portal/views/service_group/deleted_service_group_properties.php @@ -14,7 +14,7 @@

    - View service group + View service group

    \ No newline at end of file diff --git a/htdocs/web_portal/views/service_group/remove_ses.php b/htdocs/web_portal/views/service_group/remove_ses.php index 371cfb242..edcf71dd6 100644 --- a/htdocs/web_portal/views/service_group/remove_ses.php +++ b/htdocs/web_portal/views/service_group/remove_ses.php @@ -62,7 +62,7 @@ @@ -89,7 +89,7 @@ Return to - + getName()) ?> diff --git a/htdocs/web_portal/views/service_group/service_group_property_updated.php b/htdocs/web_portal/views/service_group/service_group_property_updated.php index af300e55f..ec462f00e 100644 --- a/htdocs/web_portal/views/service_group/service_group_property_updated.php +++ b/htdocs/web_portal/views/service_group/service_group_property_updated.php @@ -1,6 +1,6 @@

    Success

    Service Group Property updated.
    - + View service group
    \ No newline at end of file diff --git a/htdocs/web_portal/views/service_group/submit_add_new_se_to_service_group.php b/htdocs/web_portal/views/service_group/submit_add_new_se_to_service_group.php index 6571b7be7..9bf9d0d7a 100644 --- a/htdocs/web_portal/views/service_group/submit_add_new_se_to_service_group.php +++ b/htdocs/web_portal/views/service_group/submit_add_new_se_to_service_group.php @@ -1,6 +1,6 @@

    Success

    New Service successfully created and added to service group .
    - + View service group
    \ No newline at end of file diff --git a/htdocs/web_portal/views/service_group/submit_add_service_group.php b/htdocs/web_portal/views/service_group/submit_add_service_group.php index 12f54bbfd..0607b00f8 100644 --- a/htdocs/web_portal/views/service_group/submit_add_service_group.php +++ b/htdocs/web_portal/views/service_group/submit_add_service_group.php @@ -1,6 +1,6 @@

    Success

    New Service group getName()) ?> successfully created.
    - + View getName()) ?>
    \ No newline at end of file diff --git a/htdocs/web_portal/views/service_group/submit_edited_service_group.php b/htdocs/web_portal/views/service_group/submit_edited_service_group.php index 336122582..2276b3f11 100644 --- a/htdocs/web_portal/views/service_group/submit_edited_service_group.php +++ b/htdocs/web_portal/views/service_group/submit_edited_service_group.php @@ -1,6 +1,6 @@

    Success


    Service group getName()) ?> successfully edited.
    - + View getName()) ?>
    \ No newline at end of file diff --git a/htdocs/web_portal/views/service_group/submit_service_group_ses.php b/htdocs/web_portal/views/service_group/submit_service_group_ses.php index 9befbb426..c5bce2704 100644 --- a/htdocs/web_portal/views/service_group/submit_service_group_ses.php +++ b/htdocs/web_portal/views/service_group/submit_service_group_ses.php @@ -1,6 +1,6 @@

    Success

    Services successfully added to service group.
    - + View service group
    \ No newline at end of file diff --git a/htdocs/web_portal/views/service_group/view_all.php b/htdocs/web_portal/views/service_group/view_all.php index c34ee32a9..0ea2a8d61 100644 --- a/htdocs/web_portal/views/service_group/view_all.php +++ b/htdocs/web_portal/views/service_group/view_all.php @@ -70,38 +70,36 @@
    Name - + getHostname() . " (" . $se->getServiceType()->getName() . ")"); ?> - + getParentSite()->getShortName()) ?>
    - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + +
    NameDescriptionScope(s)
    - - getName()); ?> - - - getDescription()); ?> - - -
    NameDescriptionScope(s)
    + + getName()); ?> + + + getDescription()); ?> + + +

      @@ -126,4 +124,4 @@ placeholder: "SG Scopes" }); }); - \ No newline at end of file + diff --git a/htdocs/web_portal/views/service_group/view_sgroup.php b/htdocs/web_portal/views/service_group/view_sgroup.php index caf99ce47..a672930e3 100644 --- a/htdocs/web_portal/views/service_group/view_sgroup.php +++ b/htdocs/web_portal/views/service_group/view_sgroup.php @@ -20,7 +20,7 @@
    - +

    @@ -119,7 +119,7 @@
    - + getHostname() . " (" . $se->getServiceType()->getName() . ")");?> @@ -156,14 +156,14 @@ - + Add Services - + Remove Services @@ -212,7 +212,7 @@ - + Request Role @@ -234,7 +234,7 @@
    Recent Downtimes - (View all Downtimes) + (View all Downtimes) diff --git a/htdocs/web_portal/views/service_group/view_sgroup_downtimes.php b/htdocs/web_portal/views/service_group/view_sgroup_downtimes.php index 9f7aad98d..04c8a967b 100644 --- a/htdocs/web_portal/views/service_group/view_sgroup_downtimes.php +++ b/htdocs/web_portal/views/service_group/view_sgroup_downtimes.php @@ -15,33 +15,34 @@ All Downtimes (Year-Month-Day Time in UTC)
    - - - - - - - - - + + + + + + + + - - - - - - - - + ?> + + + + + + +
    DescriptionFromTo
    DescriptionFromTo
    - - getDescription()) ?> - - getStartDate()->format('Y-m-d H:i'/*$d::DATE_FORMAT*/); ?>getStartDate()->format('Y-m-d H:i'/*$d::DATE_FORMAT*/); ?>
    + + getDescription()) ?> + + + getStartDate()->format('Y-m-d H:i'/*$d::DATE_FORMAT*/); ?> + + getStartDate()->format('Y-m-d H:i'/*$d::DATE_FORMAT*/); ?> +
    @@ -53,4 +54,4 @@ $("#allSgDowntimesTable").tablesorter(); } ); - \ No newline at end of file + diff --git a/htdocs/web_portal/views/site/added_api_auth.php b/htdocs/web_portal/views/site/added_api_auth.php index 5993007f4..b5d7ba162 100644 --- a/htdocs/web_portal/views/site/added_api_auth.php +++ b/htdocs/web_portal/views/site/added_api_auth.php @@ -2,6 +2,6 @@

    Success


    The new getType()) ?> credential with identifier getIdentifier() ?> was successfully added.
    - + View site
    diff --git a/htdocs/web_portal/views/site/added_site_properties.php b/htdocs/web_portal/views/site/added_site_properties.php index f33dc7618..bdf7af744 100644 --- a/htdocs/web_portal/views/site/added_site_properties.php +++ b/htdocs/web_portal/views/site/added_site_properties.php @@ -8,6 +8,6 @@ new site property(s) added to getName() ?>.
    - + View site
    \ No newline at end of file diff --git a/htdocs/web_portal/views/site/added_site_property.php b/htdocs/web_portal/views/site/added_site_property.php index ba04e2494..ef1bda414 100644 --- a/htdocs/web_portal/views/site/added_site_property.php +++ b/htdocs/web_portal/views/site/added_site_property.php @@ -1,6 +1,6 @@

    Success


    New site property successfully created.
    - + View site
    \ No newline at end of file diff --git a/htdocs/web_portal/views/site/cert_status_edited.php b/htdocs/web_portal/views/site/cert_status_edited.php index 3b0c35c50..545826e7f 100644 --- a/htdocs/web_portal/views/site/cert_status_edited.php +++ b/htdocs/web_portal/views/site/cert_status_edited.php @@ -1,6 +1,6 @@

    Success

    Certification status updated.
    - + View site
    \ No newline at end of file diff --git a/htdocs/web_portal/views/site/delete_site.php b/htdocs/web_portal/views/site/delete_site.php index 7cc9f7927..0c4f2d75f 100644 --- a/htdocs/web_portal/views/site/delete_site.php +++ b/htdocs/web_portal/views/site/delete_site.php @@ -9,7 +9,7 @@

    Delete ?


    Are you sure you want to delete the site ' - + '? Deleting sites is a functionality reserved for GOCDB administrators.

    @@ -18,7 +18,7 @@ " - . "getId() ."\">" + . "getId() ."\">" . $service->getHostName() . " (" . $service->getServiceType()->getName() . ")" . " "; } diff --git a/htdocs/web_portal/views/site/deleted_api_auth.php b/htdocs/web_portal/views/site/deleted_api_auth.php index 9d703b6a8..5c12a76a7 100644 --- a/htdocs/web_portal/views/site/deleted_api_auth.php +++ b/htdocs/web_portal/views/site/deleted_api_auth.php @@ -2,6 +2,6 @@

    Success


    The credential with identifier was successfully removed.
    - + View site
    diff --git a/htdocs/web_portal/views/site/deleted_site_properties.php b/htdocs/web_portal/views/site/deleted_site_properties.php index 964c1903b..8f68172f6 100644 --- a/htdocs/web_portal/views/site/deleted_site_properties.php +++ b/htdocs/web_portal/views/site/deleted_site_properties.php @@ -14,7 +14,7 @@

    - View Site + View Site

    \ No newline at end of file diff --git a/htdocs/web_portal/views/site/edited_api_auth.php b/htdocs/web_portal/views/site/edited_api_auth.php index 1991dff72..7e84ef18d 100644 --- a/htdocs/web_portal/views/site/edited_api_auth.php +++ b/htdocs/web_portal/views/site/edited_api_auth.php @@ -2,6 +2,6 @@

    Success


    The API authenication credential has now been updated. Type:getType()) ?>, identifier: getIdentifier()) ?>.
    - + View site
    diff --git a/htdocs/web_portal/views/site/site_downtimes.php b/htdocs/web_portal/views/site/site_downtimes.php index ce6d63f7c..72b5fd648 100644 --- a/htdocs/web_portal/views/site/site_downtimes.php +++ b/htdocs/web_portal/views/site/site_downtimes.php @@ -19,37 +19,30 @@ All Downtimes (Year-Month-Day Time in UTC) - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + +
    DescriptionFromTo
    - - getDescription()) ?> - - getStartDate()->format('Y-m-d H:i'/* $dt::DATE_FORMAT */); ?>getEndDate()->format('Y-m-d H:i'/* $dt::DATE_FORMAT */) ?>
    DescriptionFromTo
    + + getDescription()) ?> + + getStartDate()->format('Y-m-d H:i'/* $dt::DATE_FORMAT */); ?>getEndDate()->format('Y-m-d H:i'/* $dt::DATE_FORMAT */) ?>
    @@ -61,4 +54,4 @@ $("#allSiteDowntimesTable").tablesorter(); } ); - \ No newline at end of file + diff --git a/htdocs/web_portal/views/site/site_property_updated.php b/htdocs/web_portal/views/site/site_property_updated.php index 6ecbbb010..1d2511eee 100644 --- a/htdocs/web_portal/views/site/site_property_updated.php +++ b/htdocs/web_portal/views/site/site_property_updated.php @@ -1,6 +1,6 @@

    Success

    Site Property updated.
    - + View site
    \ No newline at end of file diff --git a/htdocs/web_portal/views/site/site_updated.php b/htdocs/web_portal/views/site/site_updated.php index 144eeaf5b..c597f8166 100644 --- a/htdocs/web_portal/views/site/site_updated.php +++ b/htdocs/web_portal/views/site/site_updated.php @@ -1,6 +1,6 @@

    Success

    Site updated.
    - + View site
    \ No newline at end of file diff --git a/htdocs/web_portal/views/site/submit_new_site.php b/htdocs/web_portal/views/site/submit_new_site.php index 291addf16..9cdf4062f 100644 --- a/htdocs/web_portal/views/site/submit_new_site.php +++ b/htdocs/web_portal/views/site/submit_new_site.php @@ -1,6 +1,6 @@

    Success

    New Site successfully created.
    - + View new site
    \ No newline at end of file diff --git a/htdocs/web_portal/views/site/view_all.php b/htdocs/web_portal/views/site/view_all.php index 933d41eaa..a762e6028 100644 --- a/htdocs/web_portal/views/site/view_all.php +++ b/htdocs/web_portal/views/site/view_all.php @@ -119,63 +119,43 @@ - - - - - - - - - - - 0)) { - foreach ($params['sites'] as $site) { - -// $scopeC = count($site->getScopes()); -// $style = ""; //Set no style as the default -// if ($scopeC != 0) { -// if ($site->getScopes()->first()->getName() == "Local") { -// $style = " style=\"background-color: #A3D7A3;\""; -// } -// } - ?> - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + +
    NameNGIInfrastructureCertification StatusScope(s)
    - - getShortName(); ?> - - - getNGI()->getName()); ?> - - getInfrastructure()->getName()); ?> - - getCertificationStatus()->getName()); ?> - - -
    NameNGIInfrastructureCertification StatusScope(s)
    + + getShortName(); ?> + + + getNGI()->getName()); ?> + + getInfrastructure()->getName()); ?> + + getCertificationStatus()->getName()); ?> + + +

      diff --git a/htdocs/web_portal/views/site/view_site.php b/htdocs/web_portal/views/site/view_site.php index ef0f06cbf..82a4f86e0 100644 --- a/htdocs/web_portal/views/site/view_site.php +++ b/htdocs/web_portal/views/site/view_site.php @@ -33,7 +33,7 @@
    - +

    @@ -136,7 +136,7 @@ @@ -152,7 +152,7 @@   - Change + Change @@ -342,91 +342,87 @@ - + - - - - - - - - getProduction()) { - case true: - ?> - - - - - - - + + + + + + - - - - - - - +
    NGI/ROC - + getNgi()->getName()) ?> URL Production Monitored - Scope Tags - Scope Tags
    - - getHostname() . " (" . $se->getServiceType()->getName() . ")"); ?> - - +
    - getMonitored()) { - case true: - ?> - +
    + + getHostname() . " (" . $se->getServiceType()->getName() . ")"); ?> + + + + + getProduction()) { + case true: + ?> + + + + + + getMonitored()) { + case true: + ?> + + + + + + $sharedWithParent) { + if ($sharedWithParent) { + $scopeString .= $scopeName; + } else { + $scopeString .= $scopeName . '(x)'; + } + if (++$count != $numScopes) { + $scopeString .= ", "; + } + } + ?> + +
    - $sharedWithParent) { - if ($sharedWithParent) { - $scopeString .= $scopeName; - } else { - $scopeString .= $scopeName . '(x)'; - } - if (++$count != $numScopes) { - $scopeString .= ", "; - } - } - ?> - -
    - + Add Service @@ -442,54 +438,51 @@ - - - - - - - - - - - + + + + + + + + + + + - - - - - - +
    NameRole
    -
    NameRole
    + + + getRoleType()->getName()); + } else { + echo 'PROTECTED'; + } + ?> +
    - getRoleType()->getName()); - } else { - echo 'PROTECTED'; - } - ?> -
    - + Request Role @@ -502,43 +495,40 @@ +
    + 0) { ?>
    Notification: You have pending role requests - Manage Roles @@ -34,15 +35,10 @@ - - - - -
    -
    -
    + + + + +
    -
    \ No newline at end of file +
    diff --git a/htdocs/web_portal/views/user/register.php b/htdocs/web_portal/views/user/register.php index 61ed2c088..e6d063267 100644 --- a/htdocs/web_portal/views/user/register.php +++ b/htdocs/web_portal/views/user/register.php @@ -1,6 +1,6 @@
    + onsubmit="return confirm('Click OK to confirm your agreement to the terms and conditions of GOCDB account registration.');">

    Register


    Register Unique Identity: @@ -11,25 +11,19 @@
    - Authentication Attributes: + Please provide the following data for your account.
    $val) { @@ -85,4 +79,4 @@
    -
    \ No newline at end of file +
    diff --git a/htdocs/web_portal/views/user/user_updated.php b/htdocs/web_portal/views/user/user_updated.php index 9f75e1514..5da2449be 100644 --- a/htdocs/web_portal/views/user/user_updated.php +++ b/htdocs/web_portal/views/user/user_updated.php @@ -1,6 +1,6 @@

    Success

    User updated.
    - + View user
    \ No newline at end of file diff --git a/htdocs/web_portal/views/user/view_user.php b/htdocs/web_portal/views/user/view_user.php index b2fdfb74a..14c0cf299 100644 --- a/htdocs/web_portal/views/user/view_user.php +++ b/htdocs/web_portal/views/user/view_user.php @@ -18,7 +18,7 @@
    - +

    @@ -44,18 +44,8 @@
    @@ -105,7 +95,7 @@ Home Site - + getHomeSite()->getShortName()) ?> @@ -142,7 +132,7 @@
    Roles in Project - + [] diff --git a/lib/Authentication/MyConfig1.php b/lib/Authentication/MyConfig1.php index fea5dfdcd..7a1f2ecf3 100644 --- a/lib/Authentication/MyConfig1.php +++ b/lib/Authentication/MyConfig1.php @@ -35,7 +35,7 @@ function __construct() { $this->tokenClassList = array(); $this->tokenClassList[] = 'org\gocdb\security\authentication\X509AuthenticationToken'; - //$this->tokenClassList[] = 'org\gocdb\security\authentication\ShibAuthToken'; + $this->tokenClassList[] = 'org\gocdb\security\authentication\ShibAuthToken'; //$this->tokenClassList[] = 'org\gocdb\security\authentication\SimpleSamlPhpAuthToken'; //$this->tokenClassList[] = 'org\gocdb\security\authentication\UsernamePasswordAuthenticationToken'; } diff --git a/lib/Doctrine/bootstrap_doctrine_TEMPLATE.php b/lib/Doctrine/bootstrap_doctrine_TEMPLATE.php index 9fb44b2f6..d73e76b50 100644 --- a/lib/Doctrine/bootstrap_doctrine_TEMPLATE.php +++ b/lib/Doctrine/bootstrap_doctrine_TEMPLATE.php @@ -24,6 +24,7 @@ +$evm = new EventManager(); // Create a simple "default" Doctrine ORM configuration for XML Mapping $isDevMode = true; //$config = Setup::createXMLMetadataConfiguration(array(__DIR__."/config/xml"), $isDevMode); @@ -65,9 +66,9 @@ // 'dbname' => 'XE', // 'charset' => 'AL32UTF8' // ); - // // Need to explicitly set the Oracle session date format [1] - // $evm = new EventManager(); - // $evm->addEventSubscriber(new OracleSessionInit(array('NLS_TIME_FORMAT' => 'HH24:MI:SS'))); + // + // ** For Oracle installations uncomment the following line: + // $evm->addEventSubscriber(new OracleSessionInit(array('NLS_TIME_FORMAT' => 'HH24:MI:SS'))); ///////////////////////////////////////////////////////////////////////////////////////////// @@ -82,7 +83,5 @@ ///////////////////////////////////////////////////////////////////////////////////////////// - - // obtaining the entity manager $entityManager = \Doctrine\ORM\EntityManager::create($conn, $config, $evm); diff --git a/lib/Gocdb_Services/Config.php b/lib/Gocdb_Services/Config.php index ddbb491d6..5d34a2ebb 100644 --- a/lib/Gocdb_Services/Config.php +++ b/lib/Gocdb_Services/Config.php @@ -214,7 +214,7 @@ public function getReservedScopeList() { } public function getShowMapOnStartPage(){ - $showMapString = $this->GetLocalInfoXML()->local_info->google->show_map_on_start_page; + $showMapString = $this->GetLocalInfoXML()->local_info->show_map_on_start_page; if(empty($showMapString)){ $showMap = false; @@ -229,16 +229,6 @@ public function getShowMapOnStartPage(){ return $showMap; } - public function getGoogleAPIKey(){ - $apiKey = $this->GetLocalInfoXML()->local_info->google->google_API_key; - - if(empty($apiKey)){ - $apiKey = ''; - } - - return $apiKey; - } - public function getExtensionsLimit(){ return $this->GetLocalInfoXML()->local_info->extensions->max; } diff --git a/lib/Gocdb_Services/Site.php b/lib/Gocdb_Services/Site.php index 6a6ae4dae..1d8178877 100644 --- a/lib/Gocdb_Services/Site.php +++ b/lib/Gocdb_Services/Site.php @@ -1380,9 +1380,9 @@ public function getSitesWithGeoInfo() { } /* - * @return string xml string containing information required by google maps js + * @return string xml string containing information required by the front map */ - public function getGoogleMapXMLString(){ + public function getMapXMLString(){ $sites = $this->getSitesWithGeoInfo(); $portalUrl = $this->configService->GetPortalURL(); diff --git a/tests/unit/resources/sample_local_info1.xml b/tests/unit/resources/sample_local_info1.xml index 6dc87870c..9f07ebcd2 100644 --- a/tests/unit/resources/sample_local_info1.xml +++ b/tests/unit/resources/sample_local_info1.xml @@ -40,11 +40,8 @@ Scope0 - - - - true - + + true