diff --git a/README.md b/README.md index c029e40d3a4..0d0dfb29a60 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,4 @@ +[![Build Status](https://travis-ci.org/vufind-org/vufind.svg?branch=master)](https://travis-ci.org/vufind-org/vufind) VuFind ====== diff --git a/build.xml b/build.xml index e1d324548eb..5fb120c3602 100644 --- a/build.xml +++ b/build.xml @@ -23,7 +23,7 @@ - + @@ -90,10 +90,10 @@ - + - + @@ -169,14 +169,14 @@ - + - + - + diff --git a/composer.json b/composer.json index 22a8a2b5c6e..91b984b96a0 100644 --- a/composer.json +++ b/composer.json @@ -61,13 +61,13 @@ "symfony/yaml": "*", "vufind-org/vufindcode": "*", "vufind-org/vufindhttp": "*", - "zendframework/zendframework": "2.3.7", + "zendframework/zendframework": "2.4.6", "zendframework/zendrest": "2.*", "zendframework/zendservice-amazon": "2.*", "zf-commons/zfc-rbac": "~2.4" }, "require-dev": { - "behat/mink": "1.6.*", + "behat/mink": "1.7.*", "behat/mink-zombie-driver": "*" } } diff --git a/composer.lock b/composer.lock index b40b3097792..b7c4a4a59da 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "17e060af5c8424a9e99315284a8a3632", + "hash": "9b1e17327dcdad44d8172432e9ba45f1", "packages": [ { "name": "aferrandini/phpqrcode", @@ -197,16 +197,16 @@ }, { "name": "ocramius/proxy-manager", - "version": "1.0.0", + "version": "1.0.2", "source": { "type": "git", "url": "https://github.com/Ocramius/ProxyManager.git", - "reference": "a80a39fac4fbd771aea7d3871929933a3a1bbf3e" + "reference": "57e9272ec0e8deccf09421596e0e2252df440e11" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Ocramius/ProxyManager/zipball/a80a39fac4fbd771aea7d3871929933a3a1bbf3e", - "reference": "a80a39fac4fbd771aea7d3871929933a3a1bbf3e", + "url": "https://api.github.com/repos/Ocramius/ProxyManager/zipball/57e9272ec0e8deccf09421596e0e2252df440e11", + "reference": "57e9272ec0e8deccf09421596e0e2252df440e11", "shasum": "" }, "require": { @@ -256,24 +256,24 @@ "proxy pattern", "service proxies" ], - "time": "2014-12-12 10:59:05" + "time": "2015-08-09 04:28:19" }, { "name": "oyejorge/less.php", - "version": "v1.7.0.4", + "version": "v1.7.0.9", "source": { "type": "git", "url": "https://github.com/oyejorge/less.php.git", - "reference": "fc971e6d3eb54dff3d3eba4734ff207d37cb4e0e" + "reference": "fb64e2f6ef647a229c50e9fa0f2076240a3484c6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/oyejorge/less.php/zipball/fc971e6d3eb54dff3d3eba4734ff207d37cb4e0e", - "reference": "fc971e6d3eb54dff3d3eba4734ff207d37cb4e0e", + "url": "https://api.github.com/repos/oyejorge/less.php/zipball/fb64e2f6ef647a229c50e9fa0f2076240a3484c6", + "reference": "fb64e2f6ef647a229c50e9fa0f2076240a3484c6", "shasum": "" }, "require": { - "php": ">=5.2" + "php": ">=5.3" }, "bin": [ "bin/lessc" @@ -315,22 +315,22 @@ "php", "stylesheet" ], - "time": "2015-05-27 17:50:32" + "time": "2015-09-28 01:11:47" }, { "name": "pear-pear.php.net/Archive_Tar", - "version": "1.3.16", + "version": "1.4.0", "dist": { "type": "file", - "url": "http://pear.php.net/get/Archive_Tar-1.3.16.tgz", + "url": "http://pear.php.net/get/Archive_Tar-1.4.0.tgz", "reference": null, "shasum": null }, "require": { - "php": ">=4.3.0.0" + "php": ">=5.2.0.0" }, "replace": { - "pear-pear/archive_tar": "== 1.3.16.0" + "pear-pear/archive_tar": "== 1.4.0.0" }, "type": "pear-library", "autoload": { @@ -342,16 +342,16 @@ "/" ], "license": [ - "New BSD\n License" + "New BSD License" ], "description": "This class provides handling of tar files in PHP.\nIt supports creating, listing, extracting and adding to tar files.\nGzip support is available if PHP has the zlib extension built-in or\nloaded. Bz2 compression is also supported with the bz2 extension loaded." }, { "name": "pear-pear.php.net/Console_Getopt", - "version": "1.4.0", + "version": "1.4.1", "dist": { "type": "file", - "url": "http://pear.php.net/get/Console_Getopt-1.4.0.tgz", + "url": "http://pear.php.net/get/Console_Getopt-1.4.1.tgz", "reference": null, "shasum": null }, @@ -359,7 +359,7 @@ "php": ">=5.4.0.0" }, "replace": { - "pear-pear/console_getopt": "== 1.4.0.0" + "pear-pear/console_getopt": "== 1.4.1.0" }, "type": "pear-library", "autoload": { @@ -371,16 +371,16 @@ "/" ], "license": [ - "PHP License" + "BSD-2-Clause" ], - "description": "This is a PHP implementation of "getopt" supporting both\nshort and long options." + "description": "This is a PHP implementation of \"getopt\" supporting both\nshort and long options." }, { "name": "pear-pear.php.net/File_MARC", - "version": "1.1.1", + "version": "1.1.2", "dist": { "type": "file", - "url": "http://pear.php.net/get/File_MARC-1.1.1.tgz", + "url": "http://pear.php.net/get/File_MARC-1.1.2.tgz", "reference": null, "shasum": null }, @@ -388,7 +388,7 @@ "php": ">=5.3.0.0" }, "replace": { - "pear-pear/file_marc": "== 1.1.1.0" + "pear-pear/file_marc": "== 1.1.2.0" }, "type": "pear-library", "autoload": { @@ -445,10 +445,10 @@ }, { "name": "pear-pear.php.net/Structures_Graph", - "version": "1.1.0", + "version": "1.1.1", "dist": { "type": "file", - "url": "http://pear.php.net/get/Structures_Graph-1.1.0.tgz", + "url": "http://pear.php.net/get/Structures_Graph-1.1.1.tgz", "reference": null, "shasum": null }, @@ -456,7 +456,7 @@ "php": ">=5.3.0.0" }, "replace": { - "pear-pear/structures_graph": "== 1.1.0.0" + "pear-pear/structures_graph": "== 1.1.1.0" }, "type": "pear-library", "autoload": { @@ -468,7 +468,7 @@ "/" ], "license": [ - "LGPL License" + "LGPL-3.0+" ], "description": "Structures_Graph is a package for creating and manipulating graph datastructures. It allows building of directed\nand undirected graphs, with data and metadata stored in nodes. The library provides functions for graph traversing\nas well as for characteristic extraction from the graph topology." }, @@ -596,16 +596,16 @@ }, { "name": "symfony/yaml", - "version": "v2.7.1", + "version": "v2.7.5", "source": { "type": "git", - "url": "https://github.com/symfony/Yaml.git", - "reference": "9808e75c609a14f6db02f70fccf4ca4aab53c160" + "url": "https://github.com/symfony/yaml.git", + "reference": "31cb2ad0155c95b88ee55fe12bc7ff92232c1770" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Yaml/zipball/9808e75c609a14f6db02f70fccf4ca4aab53c160", - "reference": "9808e75c609a14f6db02f70fccf4ca4aab53c160", + "url": "https://api.github.com/repos/symfony/yaml/zipball/31cb2ad0155c95b88ee55fe12bc7ff92232c1770", + "reference": "31cb2ad0155c95b88ee55fe12bc7ff92232c1770", "shasum": "" }, "require": { @@ -641,7 +641,7 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2015-06-10 15:30:22" + "time": "2015-09-14 14:14:09" }, { "name": "vufind-org/vufindcode", @@ -681,16 +681,16 @@ }, { "name": "vufind-org/vufindhttp", - "version": "v1.0.4", + "version": "v2.0.0", "source": { "type": "git", "url": "https://github.com/vufind-org/vufindhttp.git", - "reference": "1b03d31c914faa6e50b6fe811fe609328d1d287b" + "reference": "781a14b4daccbf699eefaa22311de0b6307c20bd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vufind-org/vufindhttp/zipball/1b03d31c914faa6e50b6fe811fe609328d1d287b", - "reference": "1b03d31c914faa6e50b6fe811fe609328d1d287b", + "url": "https://api.github.com/repos/vufind-org/vufindhttp/zipball/781a14b4daccbf699eefaa22311de0b6307c20bd", + "reference": "781a14b4daccbf699eefaa22311de0b6307c20bd", "shasum": "" }, "require": { @@ -723,25 +723,25 @@ ], "description": "VuFind 2.x HTTP service library", "homepage": "http://vufind.org/", - "time": "2015-03-10 16:22:47" + "time": "2015-08-28 14:44:20" }, { "name": "zendframework/zendframework", - "version": "2.3.7", + "version": "2.4.6", "source": { "type": "git", "url": "https://github.com/zendframework/zf2.git", - "reference": "a1aae5fdd27a422beb32c56ddf5a197654a0f94a" + "reference": "828119961c68fa50bf42baa60d63c3c06a0b58e7" }, "dist": { "type": "zip", - "url": "https://packages.zendframework.com/composer/zendframework-zendframework-a1aae5fdd27a422beb32c56ddf5a197654a0f94a-zip-06d4c7.zip", - "reference": "a1aae5fdd27a422beb32c56ddf5a197654a0f94a", - "shasum": "7033dd58d94b0c75fae8a00001f8a7275c218209" + "url": "https://packages.zendframework.com/composer/zendframework-zendframework-2.4.6-61d420.zip", + "reference": "828119961c68fa50bf42baa60d63c3c06a0b58e7", + "shasum": "0585b917cb419511e073f9b0771a7e6dd08c315b" }, "require": { "php": ">=5.3.23", - "zendframework/zendxml": "~1.0-dev" + "zendframework/zendxml": "^1.0.1" }, "replace": { "zendframework/zend-authentication": "self.version", @@ -797,14 +797,13 @@ "zendframework/zend-xmlrpc": "self.version" }, "require-dev": { - "doctrine/annotations": ">=1.0", - "fabpot/php-cs-fixer": "1.*", - "ircmaxell/random-lib": "dev-master", - "ircmaxell/security-lib": "dev-master", - "mikey179/vfsstream": "1.2.*", - "phpunit/phpunit": "3.7.*", - "satooshi/php-coveralls": "dev-master", - "sebastianbergmann/phpcov": "1.1.0" + "doctrine/annotations": "~1.0", + "fabpot/php-cs-fixer": "~1.0", + "ircmaxell/random-lib": "~1.1", + "mikey179/vfsstream": "~1.2", + "phpunit/phpcov": "~2.0", + "phpunit/phpunit": "~4.6", + "satooshi/php-coveralls": "dev-master" }, "suggest": { "doctrine/annotations": "Doctrine Annotations >=1.0 for annotation features", @@ -822,13 +821,13 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.3-dev", - "dev-develop": "2.4-dev" + "dev-master": "2.4-dev", + "dev-develop": "2.5-dev" } }, "autoload": { - "psr-0": { - "Zend\\": "library/" + "psr-4": { + "Zend\\": "library/Zend/" } }, "autoload-dev": { @@ -845,11 +844,7 @@ "framework", "zf2" ], - "support": { - "source": "https://github.com/zendframework/zf2/tree/release-2.3.7", - "issues": "https://github.com/zendframework/zf2/issues" - }, - "time": "2015-03-12 16:55:53" + "time": "2015-08-03 15:03:22" }, { "name": "zendframework/zendrest", @@ -955,24 +950,24 @@ }, { "name": "zendframework/zendxml", - "version": "1.0.0", + "version": "1.0.1", "source": { "type": "git", "url": "https://github.com/zendframework/ZendXml.git", - "reference": "559b34f426d33a11c3db118e00ce14bb8dc64e5f" + "reference": "d8b34286c7c0f3a19fbad05ceec82ceb9dcb8257" }, "dist": { "type": "zip", - "url": "https://packages.zendframework.com/composer/zendframework-zendxml-559b34f426d33a11c3db118e00ce14bb8dc64e5f-zip-6cf7a2.zip", - "reference": "559b34f426d33a11c3db118e00ce14bb8dc64e5f", - "shasum": "39abc614b5c26bcbf8102e203c52dee73c4460a8" + "url": "https://packages.zendframework.com/composer/zendframework-zendxml-1.0.1-88b0f5.zip", + "reference": "d8b34286c7c0f3a19fbad05ceec82ceb9dcb8257", + "shasum": "f532a500c86c8d811f1a2e0ee43022685367e15a" }, "require": { "php": ">=5.3.3" }, "require-dev": { - "fabpot/php-cs-fixer": "*@dev", - "phpunit/phpunit": "~3.7" + "phpunit/phpunit": "~3.7", + "squizlabs/php_codesniffer": "~1.5" }, "type": "library", "extra": { @@ -982,7 +977,12 @@ }, "autoload": { "psr-0": { - "ZendXml": "library/" + "ZendXml\\": "library/" + } + }, + "autoload-dev": { + "psr-4": { + "ZendTest\\Xml\\": "tests/ZendXmlTest/" } }, "license": [ @@ -995,11 +995,7 @@ "xml", "zf2" ], - "support": { - "source": "https://github.com/zendframework/ZendXml/tree/master", - "issues": "https://github.com/zendframework/ZendXml/issues" - }, - "time": "2014-03-05 22:25:44" + "time": "2015-08-03 14:50:10" }, { "name": "zf-commons/zfc-rbac", @@ -1131,21 +1127,24 @@ "packages-dev": [ { "name": "behat/mink", - "version": "v1.6.1", + "version": "v1.7.0", "source": { "type": "git", "url": "https://github.com/minkphp/Mink.git", - "reference": "8b68523a339ec991bcd638b39dc8f04f808da88a" + "reference": "6c129030ec2cc029905cf969a56ca8f087b2dfdf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/minkphp/Mink/zipball/8b68523a339ec991bcd638b39dc8f04f808da88a", - "reference": "8b68523a339ec991bcd638b39dc8f04f808da88a", + "url": "https://api.github.com/repos/minkphp/Mink/zipball/6c129030ec2cc029905cf969a56ca8f087b2dfdf", + "reference": "6c129030ec2cc029905cf969a56ca8f087b2dfdf", "shasum": "" }, "require": { "php": ">=5.3.1", - "symfony/css-selector": "~2.0" + "symfony/css-selector": "~2.1" + }, + "require-dev": { + "symfony/phpunit-bridge": "~2.7" }, "suggest": { "behat/mink-browserkit-driver": "extremely fast headless driver for Symfony\\Kernel-based apps (Sf2, Silex)", @@ -1156,7 +1155,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.6.x-dev" + "dev-master": "1.7.x-dev" } }, "autoload": { @@ -1182,36 +1181,40 @@ "testing", "web" ], - "time": "2015-02-04 17:02:06" + "time": "2015-09-20 20:24:03" }, { "name": "behat/mink-zombie-driver", - "version": "v1.2.0", + "version": "v1.3.0", "source": { "type": "git", "url": "https://github.com/minkphp/MinkZombieDriver.git", - "reference": "cf15a3a0cc4865bb55253cd033a03a20cee6d2d1" + "reference": "257a2d46ffdc8cba28d107c2f1368fc1e5637d1b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/minkphp/MinkZombieDriver/zipball/cf15a3a0cc4865bb55253cd033a03a20cee6d2d1", - "reference": "cf15a3a0cc4865bb55253cd033a03a20cee6d2d1", + "url": "https://api.github.com/repos/minkphp/MinkZombieDriver/zipball/257a2d46ffdc8cba28d107c2f1368fc1e5637d1b", + "reference": "257a2d46ffdc8cba28d107c2f1368fc1e5637d1b", "shasum": "" }, "require": { - "behat/mink": "~1.6@dev", + "behat/mink": "~1.7@dev", + "ext-sockets": "*", "php": ">=5.3.1", "symfony/process": "~2.1" }, + "require-dev": { + "symfony/phpunit-bridge": "~2.7" + }, "type": "mink-driver", "extra": { "branch-alias": { - "dev-master": "1.2.x-dev" + "dev-master": "1.3.x-dev" } }, "autoload": { - "psr-0": { - "Behat\\Mink\\Driver": "src/" + "psr-4": { + "Behat\\Mink\\Driver\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1240,20 +1243,20 @@ "testing", "zombie" ], - "time": "2014-09-26 12:26:25" + "time": "2015-09-21 21:07:53" }, { "name": "symfony/css-selector", - "version": "v2.7.1", + "version": "v2.7.5", "source": { "type": "git", - "url": "https://github.com/symfony/CssSelector.git", - "reference": "0b5c07b516226b7dd32afbbc82fe547a469c5092" + "url": "https://github.com/symfony/css-selector.git", + "reference": "abe19cc0429a06be0c133056d1f9859854860970" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/CssSelector/zipball/0b5c07b516226b7dd32afbbc82fe547a469c5092", - "reference": "0b5c07b516226b7dd32afbbc82fe547a469c5092", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/abe19cc0429a06be0c133056d1f9859854860970", + "reference": "abe19cc0429a06be0c133056d1f9859854860970", "shasum": "" }, "require": { @@ -1293,20 +1296,20 @@ ], "description": "Symfony CssSelector Component", "homepage": "https://symfony.com", - "time": "2015-05-15 13:33:16" + "time": "2015-09-22 13:49:29" }, { "name": "symfony/process", - "version": "v2.7.1", + "version": "v2.7.5", "source": { "type": "git", - "url": "https://github.com/symfony/Process.git", - "reference": "552d8efdc80980cbcca50b28d626ac8e36e3cdd1" + "url": "https://github.com/symfony/process.git", + "reference": "b27c8e317922cd3cdd3600850273cf6b82b2e8e9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Process/zipball/552d8efdc80980cbcca50b28d626ac8e36e3cdd1", - "reference": "552d8efdc80980cbcca50b28d626ac8e36e3cdd1", + "url": "https://api.github.com/repos/symfony/process/zipball/b27c8e317922cd3cdd3600850273cf6b82b2e8e9", + "reference": "b27c8e317922cd3cdd3600850273cf6b82b2e8e9", "shasum": "" }, "require": { @@ -1342,7 +1345,7 @@ ], "description": "Symfony Process Component", "homepage": "https://symfony.com", - "time": "2015-06-08 09:37:21" + "time": "2015-09-19 19:59:23" } ], "aliases": [], diff --git a/config/vufind/DAIA.ini b/config/vufind/DAIA.ini index 20861f3794f..b4e5c56e6f4 100644 --- a/config/vufind/DAIA.ini +++ b/config/vufind/DAIA.ini @@ -2,16 +2,7 @@ ; http://gbv.github.io/daiaspec/daia.html#query-api ; ; The settings in the [DAIA] section will be used for all DAIA requests. -; The name of this section got refactored with VuFind 2.4, although the old -; configuration using the [Global] section still works, it should be replaced -; with the new [DAIA] section. -; Note: Settings for daiaResponseFormat and daiaIdPrefix are not supported if -; a pre VuFind 2.4 configuration with the [Global] section is used. -; i.e.: -; [Global] -; baseUrl = [your DAIA server base url] -; daiaIdPrefix = [this setting will have no effect] -; daiaResponseFormat = [this setting will have no effect] +; The name of this section got refactored with VuFind 2.4. ; ; A default DAIA call looks like this: ; https://daia.myuniversity.edu/?id=ppn:12345678&format=json @@ -38,4 +29,18 @@ baseUrl = [your DAIA server base url] ; Set multiQuery to true if your DAIA webservice supports queries with multiple ; ids (cf. http://gbv.github.io/daiaspec/daia.html#query-api). ; Default is false. -;multiQuery = false \ No newline at end of file +;multiQuery = false + +; If daiaContentTypes are set, the DAIA driver checks the Content-Type +; line in the DAIA response HTTP header for the configured values. If +; daiaContentTypes is not set, Content-Type HTTP header is NOT checked. +; +; expected Content-Types for DAIA XML format: +; (separate multiple values by commas, for example: +; daiaContentTypes['xml'] = "application/xml, text/xml" +daiaContentTypes['xml'] = "application/xml" + +; expected Content-Types for DAIA JSON format: +; (separate multiple values by commas, for example: +; daiaContentTypes['json'] = "application/json, application/javascript" +daiaContentTypes['json'] = "application/json" diff --git a/config/vufind/EDS.ini b/config/vufind/EDS.ini index 45c640fcf02..12a28071db1 100644 --- a/config/vufind/EDS.ini +++ b/config/vufind/EDS.ini @@ -132,9 +132,11 @@ facet_limit = 100 ; how many values should we show for each facet? orFacets = * ; Any facets named in the list below will have their values run through the -; translation code; unlisted facets will displayed as-is without translation. For +; translation code; unlisted facets will displayed as-is without translation. For ; translated facets, be sure that all of the necessary strings are included in the -; language files found in the web/lang directory. By default, no facets are +; language files found in the languages directory. You may add a colon and the +; name of a text domain after the field name to specify translations in a specific +; text domain (subdirectory of the languages folder). By default, no facets are ; translated -- uncomment or add lines below to turn on this feature. ;translated_facets[] = SourceType diff --git a/config/vufind/PICA.ini b/config/vufind/PICA.ini deleted file mode 100644 index 3b4e9532692..00000000000 --- a/config/vufind/PICA.ini +++ /dev/null @@ -1,7 +0,0 @@ -[Global] -baseUrl = [your DAIA server base url] - -[Catalog] -Host = "[your OPC Host]" -DB = 1 ; You may need to change this to the ID of your OPC DB -renewalsScript = "[URI of the script to get the number of renewals. This must be on the PICA catalog host]" \ No newline at end of file diff --git a/config/vufind/Primo.ini b/config/vufind/Primo.ini index afd0d6dfa2c..b99a3566ed1 100644 --- a/config/vufind/Primo.ini +++ b/config/vufind/Primo.ini @@ -88,6 +88,12 @@ domain = Source ; Top facets (not used by default) [FacetsTop] +; Checkbox facets are facets, which are getting displayed as checkboxes +; pcAvailability is a special facet. It's used to show all records found in +; PrimoCentral without checking the local availability against a holdingsfile. +[CheckboxFacets] +;pcAvailability = "add_other_libraries" ; pcAvailability is special; see above + ; Facet display settings [Results_Settings] ; Rows and columns for table used by top facets @@ -109,9 +115,11 @@ facet_limit = 30 ; how many values should we show for each facet? special_facets = daterange ; Any facets named in the list below will have their values run through the -; translation code; unlisted facets will displayed as-is without translation. For +; translation code; unlisted facets will displayed as-is without translation. For ; translated facets, be sure that all of the necessary strings are included in the -; language files found in the web/lang directory. By default, no facets are +; language files found in the languages directory. You may add a colon and the +; name of a text domain after the field name to specify translations in a specific +; text domain (subdirectory of the languages folder). By default, no facets are ; translated -- uncomment or add lines below to turn on this feature. translated_facets[] = tlevel diff --git a/config/vufind/Summon.ini b/config/vufind/Summon.ini index 9dc2c7bbc36..43dae0de7bc 100644 --- a/config/vufind/Summon.ini +++ b/config/vufind/Summon.ini @@ -196,10 +196,12 @@ special_facets = "daterange,checkboxes:Summon" ; to false or omit to disable ORed facets. orFacets = * -; Any facets named in the list below will have their values run through the -; translation code; unlisted facets will displayed as-is without translation. For +; Any facets named in the list below will have their values run through the +; translation code; unlisted facets will displayed as-is without translation. For ; translated facets, be sure that all of the necessary strings are included in the -; language files found in the web/lang directory. By default, no facets are +; language files found in the languages directory. You may add a colon and the +; name of a text domain after the field name to specify translations in a specific +; text domain (subdirectory of the languages folder). By default, no facets are ; translated -- uncomment or add lines below to turn on this feature. ;translated_facets[] = ContentType diff --git a/config/vufind/Virtua.ini b/config/vufind/Virtua.ini index d5ec6a38dfd..6af4bdca538 100644 --- a/config/vufind/Virtua.ini +++ b/config/vufind/Virtua.ini @@ -3,6 +3,10 @@ host = virtuadb.your.library.server ; Your iportal server webhost = virtuaweb.your.library.server +; Your iportal cgi token string +; Example, from "http://webvirtua.libexample.edu/cgi-bin/gw/chameleon" +; you get "cgi-bin/gw", default is "cgi-bin" +cgi_token = "cgi-bin" ; The iportal host string host_string = virtuaweb.your.library.server+9002+DEFAULT ; The iportal patron string @@ -14,3 +18,5 @@ service = VTLS01 ; Login details user = username password = password +; System language (en -> English, pt -> Portuguese, fr -> French; default = en) +language = en \ No newline at end of file diff --git a/config/vufind/VoyagerRestful.ini b/config/vufind/VoyagerRestful.ini index d1e6f322f2e..261246515ee 100644 --- a/config/vufind/VoyagerRestful.ini +++ b/config/vufind/VoyagerRestful.ini @@ -107,6 +107,11 @@ extraHoldFields = comments:requiredByDate:pickUpLocation ; 3) a value within the Location IDs returned by getPickUpLocations() defaultPickUpLocation = "" +; By default the pick up location list is sorted alphabetically. This setting can be +; used to manually set the order by entering location IDs as a colon-separated list. +; You can also disable sorting by setting this to false. +;pickUpLocationOrder = 158:155 + ; The maximum number of holding items to generate request links for. The process of ; checking the API for a valid hold is intensive. Any hold items above this this ; limit will have their hold status checked via ajax or when a user clicks on the diff --git a/config/vufind/config.ini b/config/vufind/config.ini index 07a0805418a..5b2973bb4f9 100644 --- a/config/vufind/config.ini +++ b/config/vufind/config.ini @@ -13,6 +13,10 @@ available = true debug = false ; This setting should be set to false after auto-configuration is complete autoConfigure = true +; This setting specifies a health check file location. If a health check file exists, +; the getServerStatus AJAX call will return an error regardless of actual status +; allowing the server to be disabled from a load-balancer. +;healthCheckFile = /tmp/disable_vufind ; This section will need to be customized for your installation [Site] @@ -23,10 +27,10 @@ email = support@myuniversity.edu title = "Library Catalog" ; This is the default theme for non-mobile devices (or all devices if mobile_theme ; is disabled below). Available standard themes: -; blueprint = XHTML theme using Blueprint + jQuery libraries [deprecated] ; bootstrap3 = HTML5 theme using Bootstrap 3 + jQuery libraries, with minimal ; styling -; bootprint3 = bootstrap3 theme styled to resemble old blueprint theme +; bootprint3 = bootstrap3 theme with more attractive default styling applied +; (named after the earlier, now-deprecated blueprint theme) theme = bootprint3 ; Uncomment the following line to use a different default theme for mobile devices. ; You may not wish to use this setting if you are using one of the Bootstrap-based @@ -82,6 +86,8 @@ defaultAccountPage = Favorites admin_enabled = false ; Show sidebar on the left side instead of right sidebarOnLeft = false +; Invert the sidebarOnLeft setting for right-to-left languages? +mirrorSidebarInRTL = true ; Handle menu as an offcanvas slider at mobile sizes (in bootstrap3-based themes) offcanvas = false ; Show (true) / Hide (false) Book Bag - Default is Hide. @@ -91,7 +97,7 @@ bookBagMaxSize = 100 ; Display bulk items (export, save, etc.) and checkboxes on search result screens? showBulkOptions = false ; Generator value to display in an HTML header tag: -generator = "VuFind 2.4.1" +generator = "VuFind 2.5" ; This section allows you to configure the mechanism used for storing user ; sessions. Available types: File, Memcache, Database. @@ -341,6 +347,9 @@ recordsBySource = false ; This section defines the location/behavior of the Solr index and requires no ; changes for most installations [Index] +; url can also be an array of servers. If so, VuFind will try the servers one by one +; until one can be reached. This is only useful for advanced fault-tolerant Solr +; installations. url = http://localhost:8080/solr default_core = biblio ; This setting needs to match the setting in your solrconfig.xml @@ -742,9 +751,18 @@ window_settings = "toolbar=no,location=no,directories=no,buttons=no,status=no,me ; If you want to display a graphical link to your link resolver, uncomment the ; settings below. graphic should be a URL; graphic_width and graphic_height ; should be sizes in pixels. -; graphic = "http://myuniversity.edu/images/findIt.gif" -; graphic_width = 50 -; graphic_height = 20 +;graphic = "http://myuniversity.edu/images/findIt.gif" +;graphic_width = 50 +;graphic_height = 20 + +; If your link resolver can render an image in response to an OpenURL, you can +; specify the base URL for image generation here: +;dynamic_graphic = "http://my-link-resolver/image" + +; If dynamic_graphic is set above, the dynamic image can be used instead of the +; standard text or static-image-based OpenURL link (true), it can be disabled +; (false), or it can be displayed in addition to the regular link ("both"). +;image_based_linking_mode = both ; The following settings control where OpenURL links are displayed: show_in_results = true ; include in search results @@ -823,12 +841,17 @@ url = https://www.myendnoteweb.com/EndNoteWeb.html ;host = your.proxy.server ;port = 8000 +; Uncomment following line to set proxy type to SOCKS 5 +;type = socks5 + ; Default HTTP settings can be loaded here. These values will be passed to ; the \Zend\Http\Client's setOptions method. [Http] ;sslcapath = "/etc/ssl/certs" ; e.g. for Debian systems ;sslcafile = "/etc/pki/tls/cert.pem" ; e.g. for CentOS systems +;timeout = 30 ; default timeout if not overridden by more specific code/settings + ; Using a curl Adapter instead of the the defaultAdapter (Socket) ; adapter = 'Zend\Http\Client\Adapter\Curl' @@ -953,6 +976,11 @@ da = "Danish" sl = "Slovene" ar = "Arabic" +; This section contains special cases for languages such as right-to-left support +[LanguageSettings] +; Comma-separated list of languages to display in right-to-left mode +rtl_langs = "ar,he" + ; This section controls the behavior of the Browse module. The result_limit ; setting controls the maximum number of results that may display in any given ; result box on the Browse screen. You can set to -1 for no limit; however, @@ -975,26 +1003,35 @@ era = true ; allow browsing of era subdivisions ; most popular entries -- it only affects display order. ;alphabetical_order = true -; This section controls which record export methods are displayed on the Record -; view screen. Note that some options may be disabled for records that do not -; support them, regardless of the setting chosen here. You can edit the separate -; export.ini file to add new export formats and change the behavior of existing ones. +; This section controls the availability of export methods. +; +; Each entry may be a comma-separated list of contexts in which the export +; option will be presented. Valid options: +; +; bulk - Included in batch export contexts +; record - Included in single-record export contexts +; +; If you simply set a field to true, only "record" mode will be enabled. +; If you set a field to false, all export contexts will be disabled. +; +; Note that some options may be disabled for records that do not support them, +; regardless of the setting chosen here. You can edit the separate export.ini +; file to add new export formats and change the behavior of existing ones. [Export] -RefWorks = true -EndNote = true -EndNoteWeb = true +RefWorks = "record,bulk" +EndNote = "record,bulk" +EndNoteWeb = "record,bulk" MARC = false MARCXML = false RDF = false BibTeX = false RIS = false -; This section controls whether or not display the bulk export options and which -; options to display. Valid methods are EndNote and MARC - The method must also -; be enabled in Export (above) or it will not be displayed. [BulkExport] -enabled = true -options = MARC:MARCXML:EndNote:EndNoteWeb:RefWorks:BibTeX:RIS +; Export behavior to use when no bulkExportType setting is found in the matching +; format section of export.ini; default is 'link' if not overridden below. See +; export.ini for more details on available options. +;defaultType = download ;AddThis is optional. It uses the Add This tool available from www.addthis.com ; and requires the username generated when an analytics account is registered. @@ -1107,7 +1144,10 @@ HMACkey = mySuperSecretValue ;ttl = 0 ; This setting can be used to force caching in a specific location other than the ; default location inside the local settings directory. This directory must exist -; and be writable by the web server. +; and be writable by the web server. Do not share this directory between multiple +; instances of VuFind or you may encounter unexpected side effects -- while this +; directory may be outside of the local settings directory, there should be exactly +; one separate cache location per local settings directory. ;cache_dir = "local/cache/" ; Override umask for cache directories and files. ;umask = 022 diff --git a/config/vufind/export.ini b/config/vufind/export.ini index 6866fa07358..04a4702aac5 100644 --- a/config/vufind/export.ini +++ b/config/vufind/export.ini @@ -25,6 +25,12 @@ ; {config...} setting above, except result will be URL-encoded. ; requiredMethods[] - a repeatable field indicating methods which must be available ; on the record driver object in order to allow export in this format. +; bulkExportType - [ "link" | "download" ] - link renders a download link in the UI, +; download offers to save the export-file directly; overrides the defaultType +; setting found in the [BulkExport] section of config.ini. This distinction +; currently only affects users with Javascript enabled; the 'download' option +; cannot be implemented in a user-friendly way when Javascript is disabled. + [RefWorks] requiredMethods[] = getTitle redirectUrl = "{config|RefWorks|url|http://www.refworks.com}/express/expressimport.asp?vendor={encodedConfig|RefWorks|vendor|VuFind}&filter=RefWorks%20Tagged%20Format&url={encodedCallback}" diff --git a/config/vufind/facets.ini b/config/vufind/facets.ini index a25bf67a45c..cb7db4278fa 100644 --- a/config/vufind/facets.ini +++ b/config/vufind/facets.ini @@ -141,9 +141,11 @@ orFacets = * special_facets = "illustrated,daterange" ; Any facets named in the list below will have their values run through the -; translation code; unlisted facets will displayed as-is without translation. For +; translation code; unlisted facets will displayed as-is without translation. For ; translated facets, be sure that all of the necessary strings are included in the -; language files found in the web/lang directory. By default, no facets are +; language files found in the languages directory. You may add a colon and the +; name of a text domain after the field name to specify translations in a specific +; text domain (subdirectory of the languages folder). By default, no facets are ; translated -- uncomment or add lines below to turn on this feature. ;translated_facets[] = institution ;translated_facets[] = building diff --git a/config/vufind/permissions.ini b/config/vufind/permissions.ini index b7e68bdf34f..04f20ea0d22 100644 --- a/config/vufind/permissions.ini +++ b/config/vufind/permissions.ini @@ -20,7 +20,9 @@ ; ; ipRange - Grant the permission to the single IP adresse or to the range. ; Accepts a single IP adresse or a range with a minus character without -; blanks as seperator. +; blanks as separator. Also partial addresses can be used (e.g. 192.168 +; denotes 192.168.0.0-192.168.255.255) and IPv6 addresses are also +; supported (unless PHP is compiled with IPv6 disabled). ; ipRegEx - Grant the permission to IP addresses matching the provided regular ; expression(s). Accepts a string or an array; if an array is passed, ; permission will be granted if ANY one of the expressions matches. diff --git a/config/vufind/searches.ini b/config/vufind/searches.ini index edd90ee5f4c..98ea375c46f 100644 --- a/config/vufind/searches.ini +++ b/config/vufind/searches.ini @@ -56,7 +56,7 @@ default_top_recommend[] = SpellingSuggestions ;default_top_recommend[] = VisualFacets:Visual_Settings default_side_recommend[] = SideFacets:Results:CheckboxFacets default_noresults_recommend[] = SwitchType -default_noresults_recommend[] = SwitchQuery +default_noresults_recommend[] = SwitchQuery:::fuzzy default_noresults_recommend[] = SpellingSuggestions ; Set this to true in order to highlight keywords from the search query when they @@ -351,14 +351,16 @@ CallNumber = callnumber-sort ; ; AlphaBrowseLink:index ; Use the query to generate a link to the specified alphabrowse index -; SwitchQuery:[backend]:[checks to skip]:[transforms to add] +; SwitchQuery:[backend]:[opt-out checks to skip]:[opt-in checks to add] ; This module analyzes the user's query and offers suggestions for ways to ; improve it. [backend] is the name of the search backend currently in use, -; which will help with accurate analysis (default = Solr). [checks to skip] -; is a comma-separated list of checks to disable; see the check*() methods -; in the module's code for a complete list of available checks. -; [transforms to add] is a comma-separated list of transforms to enable; -; currently there is only one: truncatechar +; which will help with accurate analysis (default = Solr). [opt-out checks +; to skip] is a comma-separated list of checks which are on by default but +; which you wish to disable. [opt-in checks to add] is a comma-separated +; list of transforms that are off by default but which you wish to enable. +; See the check*() methods in the module's code for a complete list of +; available checks. The $optInMethods property specifies which checks are +; turned off by default. ; SwitchType:[field]:[field description] ; If the current search type is not the same as [field], display a link ; suggesting that the user try switching to [field]. [field description] diff --git a/import/browse-indexing.jar b/import/browse-indexing.jar index 5a4c3492fb9..bd3d047060a 100644 Binary files a/import/browse-indexing.jar and b/import/browse-indexing.jar differ diff --git a/import/translation_maps/language_map.properties b/import/translation_maps/language_map.properties index 7c2c3cbaf26..1d20a51b236 100644 --- a/import/translation_maps/language_map.properties +++ b/import/translation_maps/language_map.properties @@ -1,5 +1,4 @@ aar = Afar -aar = Afar abk = Abkhazian ace = Achinese ach = Acoli diff --git a/languages/ar.ini b/languages/ar.ini index c98b7e4445c..f5d28142548 100644 --- a/languages/ar.ini +++ b/languages/ar.ini @@ -7,6 +7,7 @@ Access URL = "URL الوصول" Accession Number = "رقم الأكسشن" Account = "حساب" Add = "إضافة" +Add a Library Card = "أضف بطاقة مكتبة" Add a Note = "إضافة ملاحظة" Add Tag = "إضافة وسم" Add Tags = "إضافة وسوم" @@ -46,17 +47,20 @@ Advanced Search = "بحث متقدم" advSearchError_noRights = "عذراً، لكنك لا تملك صلاحية تحرير هذا البحث. ربما انتهت جلسة متصفحك ؟" advSearchError_notAdvanced = "البحث الذي طلبت تحريره ليس بحثا متقدماً." advSearchError_notFound = "لم يتم العثور على البحث الذي طلبته." +ajaxview_label_information = "نعلومات" +ajaxview_label_tools = "أدوات" All = "الكل" All Fields = "كل الحقول" All Pages Loaded = "تم تحميل كل الصفحات" All Text = "كل النص" alphabrowse_matches = "النتائج" +alphabrowselink_html = "استعرض المداخل حسب %%index%% ابتداءً بـ %%from%%." An error has occurred = "لقد حدث خطأ" An error occurred during execution; please try again later. = "لقد حدث خطأ أثناء التنفيذ؛ يرجى إعادة المحاولة لاحقا." AND = "و" anonymous_tags = "وسوم مجهولة" APA Citation = "APA استشهاد" -Article = "المقال" +Article = "مقال" Ask a Librarian = "إسأل أخصائي مكتبات" Audience = "جمهور" Audio = "سمعي" @@ -70,7 +74,7 @@ authentication_error_technical = "لا يمكننا تسجيل دخولك في Author = "المؤلف" Author Browse = "استعراض المؤلف" Author Notes = "ملاحظات المؤلف" -Author Results for = "نتائج المؤلف لـ" +Author Results for = "نتائج البحث عن المؤلف" Author Search Results = "نتائج بحث المؤلف" Authors = "المؤلفون" Authors Related to Your Search = "المؤلفون المتعلقون ببحثك" @@ -167,7 +171,7 @@ Change Password = "تغيير كلمة المرور" Check Hold = "تحديد الحجز" Check Recall = "تحديد الاستدعاء" Checked Out = "معار" -Checked Out Items = "المواد المعارة" +Checked Out Items = "مواد معارة" Checkedout = "معار" Chicago Citation = "استشهاد بنمط شيكاغو" child_record_count = "%%count%% تسجيلات" @@ -182,6 +186,7 @@ citation_singlepage_abbrev = "صفحة" citation_volume_abbrev = "المجلد" Cite this = "استشهد بهذا" City = "المدينة" +Clear = "مسح" clear_tag_filter = "مسح المرشح" close = "إغلاق" Code = "الرمز" @@ -199,6 +204,8 @@ Company/Entity = "الشركة/الكيان" Configuration = "التهيئة" confirm_delete = "هل أنت متأكد من انك تريد حذف هذا؟" confirm_delete_brief = "حذف المادة؟" +confirm_delete_library_card_brief = "أحذف بطاقة المكتبة؟" +confirm_delete_library_card_text = "هل انت متأكد من حذف بطاقة المكتبة هذه؟" confirm_delete_list_brief = "حذف القائمة؟" confirm_delete_list_text = "هل أنت متأكد من أنك ترغب في حذف هذه القائمة؟" confirm_delete_tags_brief = "حذف الوسوم" @@ -262,6 +269,7 @@ Due Date = "تاريخ الاستحقاق" DVD = "قرص فيديو رقمي" eBook = "كتاب الكتروني" Edit = "تحرير" +Edit Library Card = "حرّر بطاةق المكتبة" Edit this Advanced Search = "تحرير هذا البحث المتقدم" edit_list = "تحرير القائمة" edit_list_fail = "عذرا، ليس لديك صلاحية تحرير هذه القائمة" @@ -351,10 +359,10 @@ File Description = "وصف الملف" Filter = "المرشح" filter_tags = "ترشيح الوسوم" filter_wildcard = "أي" -Find = "أبحث" -Find More = "أبحث عن المزيد" -Find New Items = "أبحث عن مواد جديدة" -Finding Aid = "أبحث عن Aid" +Find = "ابحث" +Find More = "ابحث عن المزيد" +Find New Items = "ابحث عن مواد جديدة" +Finding Aid = "ابحث عن Aid" Fine = "غرامة" fine_limit_patron = "لقد وصلت للحد الأقصى للغرامات ولا يمكن تجديد المواد" Fines = "الغرامات" @@ -373,8 +381,8 @@ fulltext_limit = "قصر على المقالات ذات النص الكامل م Genre = "نوع المادة" Geographic Terms = "مصطلحات جغرافية" Geography = "المنطقة" -Get full text = "النص الكامل" -Get RSS Feed = "الحصول على تغذية RSS" +Get full text = "احصل على النص الكامل" +Get RSS Feed = "أحصل على تغذية RSS" Globe = "عالم" Go = "اذهب" Go to Standard View = "اذهب إلى العرض القياسي" @@ -383,7 +391,7 @@ google_map_cluster_points = "نقاط التجمع" Grid = "شبكة" Group = "مجموعة" group_AND = "كل المجموعات" -group_OR = "أي مجموعات" +group_OR = "أي مجموعة" Has Illustrations = "به رسومات توضيحية" Help = "المساعدة" Help with Advanced Search = "إرشادات حول البحث المتقدم" @@ -510,6 +518,7 @@ Journal Info = "بيانات الدورية" Journal Title = "عنوان الدورية" Journals = "الدوريات" Jump to = "انتقل إلى" +just_cataloged = "تمت الفهرسة على التو" Keyword = "كلمة مفتاحية" Keyword Filter = "مرشح الكلمة المفتاحية" Kit = "عدة" @@ -519,7 +528,19 @@ Last = "آخر" Last Modified = "آخر تعديل" Last Name = "الاسم الأخير" less = "أقل" +libphonenumber_invalid = "رقم التلفون غير صحيح" +libphonenumber_invalidcountry = "رمز البلد في المكالمة غير صحيح" +libphonenumber_invalidregion = "رقم المنطقة غير صحيح:" +libphonenumber_notanumber = "رقم التلفون الذي تم تزويده لا يبدو انه صحيح" +libphonenumber_toolong = "رقم التلفون الذي تم تزويده يبدو انه أطول من المتوقع" +libphonenumber_tooshort = "رقم التلفون الذي تم تزويده يبدو أنه أقصر من المتوقع" +libphonenumber_tooshortidd = "رقم التلفون أقصر من المتوقع بعد IDD" Library = "المكتبة" +Library Card = "كرت المكتبة" +Library Card Deleted = "تم حذف بطاقة المكتبة" +Library Card Name = "اسم بطاقة المكتبة" +Library Cards = "بطاقات المكتبة" +Library Cards Disabled = "تم تعطيل بطاقات المكتبة" Library Catalog Password = "كلمة مرور فهرس المكتبة" Library Catalog Profile = "ملف فهرس المكتبة" Library Catalog Record = "تسجيلة فهرس المكتبة" @@ -595,7 +616,7 @@ No Cover Image = "لا توجد صورة غلاف" No dependency problems found = "لم يتم العثور على مشكلات تبعية" No excerpts were found for this record. = " لم يتم العثور على مقتطفات لهذه التسجيلة." No library account = "لا يوجد حساب مكتبي" -No new item information is currently available. = "لا تتوافر معلومات عن مادة جديدة حاليا" +No new item information is currently available. = "لا تتوفر معلومات حول مواد جديدة حالياً" No Preference = "لا يوجد تفضيل" No reviews were found for this record = "لم يتم العثور على مراجعات لهذه التسجيلة" No Tags = "لا توجد وسوم" @@ -611,7 +632,7 @@ nohit_suffix = "لم يطابق أي من المصادر." nohit_suggest = "يمكنك مراجعة عبارة بحثك عن طريق حذف بعض الكلمات أو مراجعة الهجاء." NOT = "غير" Not Illustrated = "غير موضح" -Not On Reserve = "ليس في الاحتياطي" +Not On Reserve = "ليس في الحجز" not_applicable = "غير معروف" Note = "ملاحظة" note_760 = "السلسة الرئيسية" @@ -649,9 +670,9 @@ number_thousands_separator = "," OAI Server = "OAI خادم" of = "من" old_password = "كلمة المرور القديمة" -On Reserve = "في الاحتياطي" -On Reserve - Ask at Circulation Desk = "في الاحتياطي - اسأل في مكتب الإعارة" -on_reserve = "الاحتياطي - اسأل في الإعارة" +On Reserve = "في الحجز" +On Reserve - Ask at Circulation Desk = "في الحجز - اسأل في مكتب الإعارة" +on_reserve = "الحجز - اسأل في الإعارة" on_topic = "%%count%% مواد حول الموضوع" Online Access = "الوصول للمادة أونلاين" online_resources = "نص كامل" @@ -668,6 +689,7 @@ Page not found. = "لم يتم العثور على الصفحة." Password = "كلمة المرور" Password Again = "كلمة المرور مرة أخرى" Password cannot be blank = "لا يمكن أن تكون كلمة المرور خالية" +password_error_invalid = "كلمة المرور الجديدة غير صحيحة (يبدو تحوي على حروف غير مقبولة)" password_error_not_unique = "لم يتم تغيير كلمة المرور" password_maximum_length = "الحد الأقصى لطول كلمة المرور هو %%maxlength%% أحرف" password_minimum_length = "الحد الأدنى لطول كلمة المرور هو%%minlength%% أحرف" @@ -712,7 +734,7 @@ Publication Type = "نوع المنشور" Publication Year = "سنة النشر" Publication_Place = "مكان النشر" Published = "منشور في" -Published in = "حاوية النشر" +Published in = "الحاوية / القاعدة" Publisher = "الناشر" Publisher Information = "بيانات النشر" Publisher Permissions = "تصاريح الناشر" @@ -724,7 +746,7 @@ random_recommendation_title = "مواد عشوائية من نتائجك" Range = "نطاق" Range slider = "تمرير النطاق" Read the full review online... = "قراءة المراجعة الكاملة أونلاين..." -Recall This = "تذكر هذا" +Recall This = "إستدعي هذه النسخة" recaptcha_not_passed = "CAPTCHA لم تمر" Record Citations = "استشهادات التسجيلة" Record Count = "عد التسجيلة" @@ -768,9 +790,9 @@ Request full text = "نص الطلب الكامل" request_place_text = "وضع طلب" request_submit_text = "تقديم طلب" Requests = "طلبات" -Reserves = "احتياطي" -Reserves Search = "بحث الاحتياطي" -Reserves Search Results = "نتائج بحث الاحتياطي" +Reserves = "الحجز الأكاديمي" +Reserves Search = "لحث الحجز الأكاديمي" +Reserves Search Results = "نتائج البحث في الحجز الأكاديمي" Results = "نتائج" results = "نتائج" Results for = "نتائج لـ" @@ -787,21 +809,21 @@ scholarly_limit = "تحديد إلى المقالات من الدوريات ال Scroll to Load More = "تمرير لتحميل المزيد" Search = "بحث عن" Search For = "بحث عن" -Search For Items on Reserve = "بحث عن الموتد في الاحتياطي" +Search For Items on Reserve = "بحث عن المواد في الحجز الأكاديمي" Search History = "سجل البحث" Search Home = "صفحة البحث الرئيسية" Search Mode = "طريقة البحث" Search Options = "خيارات البحث" Search Results = "نتائج البحث" search results of = "نتائج البجث لـ" -Search Tips = "إرشادات البحث" +Search Tips = "إرشادات حول معاملات البحث" Search Tools = "أدوات البحث" Search Type = "نوع البحث" search_AND = "كل المصطلحات" search_groups = "مجموعات البحث" search_match = "مطابقة" search_NOT = "لا توجد مصطلحات" -search_OR = "أي مصطلحات" +search_OR = "أي مصطلح" search_save_success = "تم حفظ البحث بنجاح." search_unsave_success = "تم حذف البحث المحفوظ بنجاح." seconds_abbrev = "s" @@ -964,6 +986,7 @@ Use instead = "استخدم بدلا من" User Account = "حساب المستخدم" Username = "اسم المستخدم" Username cannot be blank = "لا يمكن أن يكون اسم المستخدم خاليا" +Username is already in use in another library card = "الاسم مستخدم في بطاقة مكتبة أخرى" VHS = "VHS" Video = "الفيديو" Video Clips = "مقاطع الفيديو" @@ -972,7 +995,7 @@ view already selected = "عرض المحدد بالفعل" View Book Bag = "عرض سلة الكتب" View Full Collection = "عرض المجموعة كاملة" View Full Record = "عرض التسجيلة الكاملة" -View in EDS = "عرض في EDS" +View in EDS = "أعرض في EDS" View online: Full view Book Preview from the Hathi Trust = "عرض على أونلاين أونلاين: معاينة كاملة لعرض الكتاب من Hathi Trust" View Record = "عرض التسجيلة" View Records = "عرض التسجيلات" @@ -1001,6 +1024,7 @@ You do not have any fines = "لا توجد لديك أي غرامات" You do not have any holds or recalls placed = "لا يوجد لديك أي حجوزات أو استدعاءات" You do not have any interlibrary loan requests placed = "لا توجد لديك أي طلبات استعارة ما بين المكتبات" You do not have any items checked out = "لا توجد لديك أي مواد معارة" +You do not have any library cards = "ليس لديك أي بطاقة مكتبة" You do not have any saved resources = "لا توجد لديك أي مصادر محفوظة. قم بإجراء بحث واستخدام زر أضف إلى المفضلة لحفظ المواد." You do not have any storage retrieval requests placed = "لا يوجد لديك أي طلبات استعادة تخزين " You must be logged in first = "يجب تسجيل دخولك أولا" @@ -1017,4 +1041,4 @@ Your search terms = "مصطلحات بحثك" Your Tags = "وسومك" your_match_would_be_here = "قد تكون مضاهاتك هنا." Zip = "الرمز البريدي" -zoom = "تقريب" \ No newline at end of file +zoom = "تقريب" diff --git a/languages/ca.ini b/languages/ca.ini index c285cefc18e..f5b366bec94 100644 --- a/languages/ca.ini +++ b/languages/ca.ini @@ -14,8 +14,11 @@ ;Portuguese = "Portuguès" Abstract = "Resum" Access = "Accés" +Access URL = "URL d'accés" +Accession Number = "Número de registre" Account = "Compte" Add = "Afegir" +Add a Library Card = "Afegir un nou carnet" Add a Note = "Afegir una nota" Add Tag = "Afegir etiqueta" Add Tags = "Afegir etiquetes" @@ -55,11 +58,14 @@ Advanced Search = "Cerca avançada" advSearchError_noRights = "Ho sentim, no teniu permisos per editar aquesta cerca. Potser la vostra sessió del navegador ha caducat?" advSearchError_notAdvanced = "La cerca que voleu editar no és una cerca avançada." advSearchError_notFound = "La cerca sol·licitada no s’ha trobat." +ajaxview_label_information = "Informació" +ajaxview_label_tools = "Utilitats" All = "All" All Fields = "Tots els camps" All Pages Loaded = "S'han carregat totes les pàgines" All Text = "Tot el text" alphabrowse_matches = "Resultats" +alphabrowselink_html = "Revisar registres per %%index%% desde fins %%from%%." An error has occurred = "S'ha produït un error" An error occurred during execution; please try again later. = "S'ha produït un error durant el procés; si us plau espera una estona i torna a provar-ho." AND = "i" @@ -87,6 +93,7 @@ Auto configuration is currently disabled = "Auto configuració deactivate" auto_configure_description = "Si aquesta es una instalació nova, pot corregir les incidències amb el Vufins's Auto Configure tool." auto_configure_disabled = "Autoconfiguració desactivada." auto_configure_title = "Autoconfigurar" +Availability = "Disponibilitat" Available = "Disponible" Available Functionality = "Funcionalitat disposable" Awards = "Compensacions" @@ -207,6 +214,8 @@ Company/Entity = "Societat/Institutció" Configuration = "Configuració" confirm_delete = "Esteu segurs que el voleu eliminar?" confirm_delete_brief = "Borrar exemplar?" +confirm_delete_library_card_brief = "Esborrar carnet?" +confirm_delete_library_card_text = "Estàs segur de que vols esborrar el carnet?" confirm_delete_list_brief = "Borrar llista?" confirm_delete_list_text = "Esteu segurs que voleu eliminar aquesta llista?" confirm_delete_tags_brief = "Esborrar etiquetes" @@ -221,9 +230,11 @@ confirm_storage_retrieval_request_cancel_all_text = "Vols cancelar les teves pet confirm_storage_retrieval_request_cancel_selected_text = "Vols canceler la teva selecció de peticions?" conjunction_or = "O" Contents = "Continguts" +Contributing Source = "Contributing Source" Contributors = "Col·laboradors" Copies = "Còpies" Copy = "Còpia" +Copyright = "Copyright" Corporate Author = "Autor corporatiu" Country = "Pais" Course = "Curs" @@ -261,12 +272,14 @@ Detailed View = "Vista completa" Details = "Visualització interna" Displaying the top = "Visualitzant la part superior" Document Inspector = "Document Inspector" +Document Type = "Tipus de document" DOI = "DOI" Due = "Venciment" Due Date = "Data de venciment" DVD = "DVD" eBook = "eBook" Edit = "Editar" +Edit Library Card = "Editar el carnet de la biblioteca" Edit this Advanced Search = "Editar aquesta cerca avançada" edit_list = "Editar llista" edit_list_fail = "Disculpeu, no podeu editar aquesta llista" @@ -352,6 +365,7 @@ Fee = "Quota" Feedback = "Feedback" Feedback Email = "Correu de suggerències" feedback_name = "Nom" +File Description = "Descripció del fitxer" Filter = "Filtre" filter_tags = "Filtre d'etiquetes" filter_wildcard = "Qualsevol" @@ -484,6 +498,7 @@ in = "a" In This Collection = "En aquesta col·lecció" in_collection_label = "En la col·lecció:" include_synonyms = "Ampliar resultats amb sinònims" +Index Terms = "Indexs" Indexes = "Indexos" information = "Informació" Institution = "Institution" @@ -509,9 +524,11 @@ items_added_to_bookbag = "ítem(s) afegit a la cistella de llibres" items_already_in_bookbag = "ítem(s) ja estan a la vostra cistella de llibres o no es poden afegir" Journal = "Revista" Journal Articles = "Articles de revista" +Journal Info = "Informació de la publicació" Journal Title = "Títol de la revista" Journals = "Revistes" Jump to = "Anar a" +just_cataloged = "Nou registre afegit" Keyword = "Paraula clau" Keyword Filter = "Keyword Filter" Kit = "Paquet" @@ -521,7 +538,19 @@ Last = "Últim" Last Modified = "Última modicació" Last Name = "Cognom" less = "menys" +libphonenumber_invalid = "Telèfon invàlid" +libphonenumber_invalidcountry = "Prefixe de país invàlid" +libphonenumber_invalidregion = "Codi de regió invàlid:" +libphonenumber_notanumber = "El text no sembla un número de telèfon" +libphonenumber_toolong = "El text es massa llarg per a ser un número de telèfon" +libphonenumber_tooshort = "El text es massa curt per a ser un número de telèfon" +libphonenumber_tooshortidd = "Número de telèfon massa curt després del IDD" Library = "Biblioteca" +Library Card = "Carnet de la biblioteca" +Library Card Deleted = "Carnet de la biblioteca esborrat" +Library Card Name = "Nom del carnet de la biblioteca" +Library Cards = "Carnets de la biblioteca" +Library Cards Disabled = "Carnet de la biblioteca deshabilitat" Library Catalog Password = "Contrasenya del Catàleg de la Biblioteca" Library Catalog Profile = "Perfil del Catàleg de la Biblioteca" Library Catalog Record = "Registre del Catàleg de la Biblioteca" @@ -557,6 +586,7 @@ map_results_label = "En aquesta localització:" Maps = "Mapes" Media Format = "Format Media" medium = "Mig" +MeSH Terms = "Terms MeSH" Message = "Missatge" Message From Sender = "Missatge del remitent" Metadata Prefix = "Metadata Prefix" @@ -669,6 +699,7 @@ Page not found. = "Pàgina no trobada." Password = "Contrasenya" Password Again = "Contrasenya un altre cop" Password cannot be blank = "La contrasenya no pot estar en blanc" +password_error_invalid = "Nova contrassenya no vàlida (ex. conté caracters no vàlids)" password_error_not_unique = "La constrasenya no s'ha canviat" password_maximum_length = "Longitut màxima de la contrasenya %%maxlength%% caracters" password_minimum_length = "El password ha tenor almenys %%minlength%% caracters" @@ -706,13 +737,17 @@ pronounced = "pronunciat" Provider = "Proveïdor" Public = "Públic" Publication = "Publicació" +Publication Date = "Data de publicació" Publication Frequency = "Periodicitat de publicació" Publication Information = "Informació de la publicació" Publication Type = "Tipologia de la publicació" +Publication Year = "Any de publicacio" Publication_Place = "Lloc de publicació" Published = "Publicat" Published in = "Publicat a" Publisher = "Editor" +Publisher Information = "Informació de l'editor" +Publisher Permissions = "Permisos dels editors" QR Code = "Codi QR" qrcode_hide = "Amagar codi QR" qrcode_show = "Mostrar codi QR" @@ -841,6 +876,7 @@ sort_title = "Títol" sort_year = "Data Descendent" sort_year asc = "Data Ascendent" Source = "Font" +Source Title = "Títol font" spell_expand_alt = "Ampliar cerca" spell_suggest = "Alternatives de cerca" Staff View = "Visualització del personal" @@ -850,20 +886,29 @@ Start Page = "Pàgina d’inici" starting from = "començant des de" Status = "Estat" status_unknown_message = "Comprovació en temps real no disponible" +Storage Retrieval Requests = "Peticions al magatzem" storage_retrieval_request_available = "Disponible per recollir" +storage_retrieval_request_cancel = "Cancelar peticions al magatzem" +storage_retrieval_request_cancel_all = "Cancelar totes les peticions al magatzem" storage_retrieval_request_cancel_fail = "La petició no es pot cancel·lar. Si us plau, contacteu amb el taulell de préstec." +storage_retrieval_request_cancel_selected = "Cancelar les peticions seleccionades al magatzem" storage_retrieval_request_cancel_success = "La vostra petició s’ha cancel·lat correctament" storage_retrieval_request_cancel_success_items = "petició(ns) s’han cancel·lat correctament" storage_retrieval_request_canceled = "Cancelat" +storage_retrieval_request_check_text = "Comprovar peticions al magatzem" storage_retrieval_request_comments = "Comentaris" storage_retrieval_request_date_invalid = "Introduïu una data vàlida" storage_retrieval_request_date_past = "Introduïu una data futura" +storage_retrieval_request_empty_selection = "No s' han seleccionat peticions al magatzem" +storage_retrieval_request_error_blocked = "No tens permís per demanar aquest exemplar al magatzem" storage_retrieval_request_error_fail = "Ha fallat la vostra petició. Contacteu amb el taulell de préstec per sol·licitar ajuda" storage_retrieval_request_invalid_pickup = "Heu introduït una localització de recollida no vàlida. Torneu-ho a intentar" storage_retrieval_request_issue = "Data" storage_retrieval_request_place_fail_missing = "Ha fallat la vostra petició. Algunes dades s’han perdut. Contacteu amb el taulell de circulació per sol·licitar ajuda." storage_retrieval_request_place_success = "Petició correcta" +storage_retrieval_request_place_text = "Solicitar una petició al magatzem" storage_retrieval_request_processed = "Processat" +storage_retrieval_request_profile_html = "Per fer una petició al magatzem, demani el carnet de la biblioteca." storage_retrieval_request_reference = "Referència" storage_retrieval_request_selected_item = "Registres seleccionas" storage_retrieval_request_submit_text = "Solicitar lloc" @@ -872,6 +917,7 @@ storage_retrieval_request_year = "Any" Subcollection = "Subcol·lecció" Subject = "Matèria" Subject Area = "Àrea temàtica" +Subject Geographic = "Matèria geogràfica" Subject Recommendations = "Recomanacions de matèria" Subject Terms = "Matèria" Subject(s) = "Matèria(es)" @@ -936,6 +982,7 @@ total_resources = "Recursos total" total_saved_items = "Registres total guardats" total_tags = "Etiquetes totals" total_users = "Usuaris totals" +Transliterated Title = "Títol transliterat" tree_search_limit_reached_html = "La seva cerca ha retornat massa registres per veure'ls a l'arbre de col·leccions. Veure els primers %%limit%% exemplars. Per una cerca completa cliqueu aquí." unique_tags = "Etiquetes úniques" University Library = "Biblioteca universitària" @@ -949,6 +996,7 @@ Use instead = "Utilitzeu enlloc de" User Account = "Compte de l’usuari" Username = "Nom d’usuari" Username cannot be blank = "El nom d’usuari no pot estar en blanc" +Username is already in use in another library card = "L' usuari ja està en ús." VHS = "VHS" Video = "Video" Video Clips = "Video Clips" @@ -986,6 +1034,7 @@ You do not have any fines = "No teniu cap sanció" You do not have any holds or recalls placed = "No teniu cap reserva o reclamació" You do not have any interlibrary loan requests placed = "No has fet cap petició de prèstec interbibliotecari" You do not have any items checked out = "No teniu cap exemplar prestat" +You do not have any library cards = "No té carnet de la biblioteca" You do not have any saved resources = "No teniu cap recurs guardat" You do not have any storage retrieval requests placed = "You do not have any storage retrieval requests placed" You must be logged in first = "Abans heu d’iniciar sessió" @@ -1002,4 +1051,4 @@ Your search terms = "Termes de cerca" Your Tags = "Etiquetes" your_match_would_be_here = "La teva cerca hauria d'estar aquí." Zip = "Zip" -zoom = "Ampliar" \ No newline at end of file +zoom = "Ampliar" diff --git a/languages/cs.ini b/languages/cs.ini index cd5b258c1e3..3a48f5478eb 100644 --- a/languages/cs.ini +++ b/languages/cs.ini @@ -1,8 +1,11 @@ ; Translation: opensource.knihovna.cz, Michal Denár, Josef Moravec, last updated 18.12.2012 Abstract = "Abstrakt" Access = "Přístup" +Access URL = "Pøístupová URL adresa" +Accession Number = "Pøístupové èíslo" Account = "Účet" Add = "Přidat" +Add a Library Card = "Pøipojit další úèet" Add a Note = "Přidat poznámku" Add Tag = "Přidat tag" Add Tags = "Přidat tagy" @@ -42,11 +45,14 @@ Advanced Search = "Pokročilé vyhledávání" advSearchError_noRights = "Bohužel nemáte oprávnění upravovat toto vyhledávání. Možná došlo k automatickému odhlášení po delší nečinnosti." advSearchError_notAdvanced = "Vyhledávání, které chcete upravit, není pokročilé vyhledávání." advSearchError_notFound = "Požadované vyhledávání nebylo nalezeno." +ajaxview_label_information = "Informace" +ajaxview_label_tools = "Nástroje" All = "Vše" All Fields = "Vše" All Pages Loaded = "Všechny stránky nahrány" All Text = "Vše" alphabrowse_matches = "Výsledky" +alphabrowselink_html = "Procházet záznamy podle %%index%% od %%from%%." An error has occurred = "Došlo k chybě" An error occurred during execution; please try again later. = "Vyskytla se chyba, zkuste to znovu později." AND = "AND" @@ -74,6 +80,7 @@ Auto configuration is currently disabled = "Automatická konfigurace je nyní vy auto_configure_description = "Pokud je toto nová instalace, můžete se pokusit odstranit tento problém použitím automatické konfigurace VuFindu." auto_configure_disabled = "Automatická konfigurace je vypnutá." auto_configure_title = "Automatická konfigurace" +Availability = "Dostupnost" Available = "Dostupné" Available Functionality = "Dostupné funkce" Awards = "Ocenění" @@ -194,11 +201,13 @@ Company/Entity = "Korporace" Configuration = "Nastavení" confirm_delete = "Chcete je smazat?" confirm_delete_brief = "Smazat položku?" +confirm_delete_library_card_brief = "Odpojit úèet?" +confirm_delete_library_card_text = "Opravdu chcete odpojit tento úèet?" confirm_delete_list_brief = "Smazat seznam?" confirm_delete_list_text = "Opravdu chcete smazat tento seznam?" confirm_delete_tags_brief = "Odstranit tagy" -confirm_dialog_no = "Zrušit" -confirm_dialog_yes = "Potvrdit" +confirm_dialog_no = "Ne" +confirm_dialog_yes = "Ano" confirm_hold_cancel_all_text = "Chcete zrušit všechny vaše požadavky?" confirm_hold_cancel_selected_text = "Chcete zrušit vybrané požadavky?" confirm_ill_request_cancel_all_text = "Opravdu chcete zrušit všechny požadavky na meziknihovní výpůjčky?" @@ -208,9 +217,11 @@ confirm_storage_retrieval_request_cancel_all_text = "Opravdu chcete zrušit vše confirm_storage_retrieval_request_cancel_selected_text = "Opravdu chcete zrušit vybrané požadavky na dokumenty ze skladu?" conjunction_or = "nebo" Contents = "Obsah" +Contributing Source = "Pøispívající zdroj" Contributors = "Přispěvatelé" Copies = "Jednotky" Copy = "Jednotka" +Copyright = "Copyright" Corporate Author = "Korporativní autor" Country = "Země" Course = "Kurz" @@ -248,12 +259,14 @@ Detailed View = "Podrobnosti" Details = "Detaily" Displaying the top = "Zobrazuji nejrelevantnější výsledky" Document Inspector = "Inspekce dokumentu" +Document Type = "Druh dokumentu" DOI = "DOI" Due = "do" Due Date = "Půjčeno do" DVD = "DVD" eBook = "E-kniha" Edit = "Upravit" +Edit Library Card = "Úpravit úèet" Edit this Advanced Search = "Upravit toto pokročilé vyhledávání" edit_list = "Upravit seznam" edit_list_fail = "Nemáte oprávnění upravovat seznam." @@ -339,6 +352,7 @@ Fee = "Poplatek" Feedback = "Váš názor" Feedback Email = "E-mail" feedback_name = "Jméno" +File Description = "Popis souboru" Filter = "Filtr" filter_tags = "Filtrovat tagy" filter_wildcard = "Libovolný" @@ -471,6 +485,7 @@ in = "v poli" In This Collection = "Zúžit v rámci této sbírky" in_collection_label = "Sbírka:" include_synonyms = "Rozšířit výsledky pomocí synonym" +Index Terms = "Témata" Indexes = "Rejstříky" information = "Informace" Institution = "Instituce" @@ -496,9 +511,11 @@ items_added_to_bookbag = "položek vloženo do košíku" items_already_in_bookbag = "položka(y) již máte v košíku nebo je nelze z nějakého jiného důvodu vložit." Journal = "Časopis" Journal Articles = "Články z časopisů" +Journal Info = "Info o èasopise" Journal Title = "Název časopisu" Journals = "Časopisy" Jump to = "Přejít na" +just_cataloged = "Novì pøidané" Keyword = "Klíčové slovo" Keyword Filter = "Upřesnit podle" Kit = "Souprava" @@ -508,7 +525,19 @@ Last = "Poslední" Last Modified = "Naposledy změněno" Last Name = "Příjmení" less = "méně" +libphonenumber_invalid = "Telefonní èíslo je zadáno chybnì" +libphonenumber_invalidcountry = "Chybné pøedèíslí zemì" +libphonenumber_invalidregion = "Chybný kód oblasti:" +libphonenumber_notanumber = "Vložený øetìzec nemá podobu telefonního èísla" +libphonenumber_toolong = "Vložený øetìzec je pøíliš dlouhý na telefonní èíslo" +libphonenumber_tooshort = "Vložený øetìzec je pøíliš krátky na telefonní èíslo" +libphonenumber_tooshortidd = "Telefonní èíslo je pøíliš krátké" Library = "Knihovna" +Library Card = "Ètenáøský úèet" +Library Card Deleted = "Propojení bylo odstranìno" +Library Card Name = "Název úètu" +Library Cards = "Ètenáøské úèty" +Library Cards Disabled = "Propojování více ètenáøských úètù není povoleno" Library Catalog Password = "Heslo pro katalog knihovny" Library Catalog Profile = "Profil v katalogu knihovny" Library Catalog Record = "Záznam z katalogu" @@ -544,6 +573,7 @@ map_results_label = "Zde:" Maps = "Mapy" Media Format = "Formát média" medium = "Médium" +MeSH Terms = "Výrazy ze slovníku MeSH" Message = "Zpráva" Message From Sender = "Zpráva od odesílatele" Metadata Prefix = "Prefix metadat" @@ -563,9 +593,9 @@ Multiple Call Numbers = "Více signatur" Multiple Locations = "Více umístění" Musical Score = "Hodnocení" My Favorites = "Oblíbené" -My Fines = "Vaše upomínky" -My Holds = "Vaše rezervace" -My Profile = "Váš profil" +My Fines = "Poplatky" +My Holds = "Rezervace" +My Profile = "Profil" Narrow Search = "Upřesnit hledání" navigate_back = "Zpět" Need Help? = "Hledáte pomoc?" @@ -656,6 +686,7 @@ Page not found. = "Stránka nenalezena" Password = "Heslo" Password Again = "Heslo (pro kontrolu)" Password cannot be blank = "Heslo nesmí být prázdné" +password_error_invalid = "Nové heslo není platné (napø. obsahuje nepovolené znaky)" password_error_not_unique = "Heslo nebylo změněno" password_maximum_length = "Heslo může být dlouhé maximálně %%maxlength%% znaků" password_minimum_length = "Heslo musí být dlouhé alespoň %%minlength%% znaků" @@ -693,13 +724,17 @@ pronounced = "výslovnost:" Provider = "Poskytovatel" Public = "Veřejný" Publication = "Publikace" +Publication Date = "Datum vydání" Publication Frequency = "Četnost vydávání" Publication Information = "Informace o vydání" Publication Type = "Způsob vydávání" +Publication Year = "Rok vydání" Publication_Place = "Místo vydání" Published = "Vydáno" Published in = "Vydáno v" Publisher = "Vydavatel" +Publisher Information = "Informace o vydavateli" +Publisher Permissions = "Vydavatelská práva" QR Code = "QR kód" qrcode_hide = "Skrýt QR kód" qrcode_show = "Zobrazit QR kód" @@ -828,6 +863,7 @@ sort_title = "Název" sort_year = "Podle data sestupně" sort_year asc = "Podle data vzestupně" Source = "Zdroj" +Source Title = "Název zdroje" spell_expand_alt = "Rozšířit vyhledávání" spell_suggest = "Alternativní vyhledávání" Staff View = "UNIMARC/MARC" @@ -868,6 +904,7 @@ storage_retrieval_request_year = "Rok" Subcollection = "Část sbírky" Subject = "Téma" Subject Area = "Předmětová oblast" +Subject Geographic = "Geografické téma" Subject Recommendations = "Doporučená témata" Subject Terms = "Témata" Subject(s) = "Témata" @@ -932,6 +969,7 @@ total_resources = "Celkem zdrojů" total_saved_items = "Celkem uložených položek" total_tags = "Celkem tagů" total_users = "Celkem uživatelů" +Transliterated Title = "Transliterovaný název" tree_search_limit_reached_html = "Na váš dotaz bylo nalezeno příliš mnoho výsledků, proto je nebylo možné všechny zobrazit ve stromové struktuře. Bylo zobrazeno pouze prvních %%limit%% položek. Pro zobrazení všech výsledků klikněte zde." unique_tags = "Unikátní tagy" University Library = "Univerzitní knihovna" @@ -945,6 +983,7 @@ Use instead = "Použít místo" User Account = "Uživatelský účet" Username = "Uživatelské jméno" Username cannot be blank = "Uživatelské jméno musí být vyplněno" +Username is already in use in another library card = "Uživatelské jméno již je použito u jiného ètenáøského úètu" VHS = "VHS" Video = "Video" Video Clips = "Video klipy" @@ -982,6 +1021,7 @@ You do not have any fines = "Nemáte žádné upomínky" You do not have any holds or recalls placed = "Nemáte žádné rezervace ani objednávky" You do not have any interlibrary loan requests placed = "Nemáte žádné nevyřízené požadavky na meziknihovní výpůjčky" You do not have any items checked out = "Nemáte žádné výpůjčky" +You do not have any library cards = "Nemáte žádné propojené ètenáøské úèty" You do not have any saved resources = "Nemáte uloženy žádné zdroje." You do not have any storage retrieval requests placed = "Nemáte žádné nevyřízené požadavky na vyzvednutí ze skladu" You must be logged in first = "Nejprve se musíte přihlásit." @@ -998,4 +1038,4 @@ Your search terms = "Vyhledávané termíny" Your Tags = "Vaše tagy" your_match_would_be_here = "Zadaný výraz by se nacházel zde, pokud by v databázi existoval." Zip = "PSČ" -zoom = "Přiblížit" \ No newline at end of file +zoom = "Přiblížit" diff --git a/languages/cy.ini b/languages/cy.ini index fcc1fa02665..916aea09b87 100644 --- a/languages/cy.ini +++ b/languages/cy.ini @@ -3,8 +3,11 @@ ;Welsh = "Cymraeg" Abstract = "Crynodeb" Access = "Mynediad" +Access URL = "URL mynediad" +Accession Number = "Cyfeirnod" Account = "Cyfrif" Add = "Ychwanegu" +Add a Library Card = "Ychwanegu Cerdyn Llyfrgell" Add a Note = "Ychwanegu Nodyn" Add Tag = "Ychwanegu Tag" Add Tags = "Ychwanegu Tagiau" @@ -44,11 +47,14 @@ Advanced Search = "Chwiliad Uwch" advSearchError_noRights = "Mae'n ddrwg gennym, ond nid oes hawl gennych olygu'r chwiliad hwnnw. Efallai bod eich sesiwn pori wedi dod i ben?" advSearchError_notAdvanced = "Nid yw'r chwiliad yr ydych wedi ceisio ei olygu'n chwiliad uwch" advSearchError_notFound = "Ni ddaethpwyd o hyd i'r chwiliad a geisiwyd" +ajaxview_label_information = "Gwybodaeth" +ajaxview_label_tools = "Offer" All = "Popeth" All Fields = "Pob Maes" All Pages Loaded = "Llwythwyd yr holl dudalennau" All Text = "Yr holl destun" alphabrowse_matches = "Canlyniadau" +alphabrowselink_html = "Pori cofnodion ar sail %%index%% gan ddechrau o" An error has occurred = "Mae gwall wedi digwydd" An error occurred during execution; please try again later. = "Bu gwall wrth gyflawni'r weithred; ceisiwch eto nes ymlaen." AND = "AND" @@ -76,6 +82,7 @@ Auto configuration is currently disabled = "Ar hyn o bryd, mae awto-osod wedi'i auto_configure_description = "Os yw hyn newydd ei osod, mae'n bosibl y byddwch yn gallu trwsio'r broblem trwy ddefnyddio arf Awto-osod VuFind" auto_configure_disabled = "Mae awto-osod wedi'i analluogi" auto_configure_title = "Awto-osod" +Availability = "Argaeledd" Available = "Ar gael" Available Functionality = "Swyddogaethau sydd ar Gael" Awards = "Dyfarniadau" @@ -196,6 +203,8 @@ Company/Entity = "Cwmni/Endid" Configuration = "Gosodiadau" confirm_delete = "Ydych chi'n siŵr eich bod am ddileu hwn?" confirm_delete_brief = "Dileu Eitem?" +confirm_delete_library_card_brief = "Dileu Cerdyn Llyfrgell?" +confirm_delete_library_card_text = "Ydych chi'n sicr eich bod am ddileu'r cerdyn llyfrgell hwn?" confirm_delete_list_brief = "Dileu Rhestr?" confirm_delete_list_text = "Ydych chi'n siŵr eich bod am ddileu hwn?" confirm_delete_tags_brief = "Dileu Tagiau" @@ -210,9 +219,11 @@ confirm_storage_retrieval_request_cancel_all_text = "Ydych chi'n dymuno canslo'c confirm_storage_retrieval_request_cancel_selected_text = "Ydych chi'n dymuno canslo'r ceisiadau ar gyfer tynnu eitemau o'r storfa sydd wedi'u dewis?" conjunction_or = "neu" Contents = "Cynnwys" +Contributing Source = "Ffynhonnell" Contributors = "Cyfranwyr" Copies = "Copïau" Copy = "Copi" +Copyright = "Hawlfraint" Corporate Author = "Awdur Corfforaethol" Country = "Gwlad" Course = "Cwrs" @@ -250,12 +261,14 @@ Detailed View = "Golwg Fanwl" Details = "Golygfa Marc" Displaying the top = "Arddangos y brig" Document Inspector = "Archwilydd Dogfen" +Document Type = "Math o Ddogfen" DOI = "DOI" Due = "Erbyn" Due Date = "Dyddiad Cau" DVD = "DVD" eBook = "eLyfr" Edit = "Golygu" +Edit Library Card = "Golygu Cerdyn Llyfrgell" Edit this Advanced Search = "Golygu'r Chwiliad Uwch hwn" edit_list = "Golygu'r Rhestr" edit_list_fail = "Mae'n ddrwg gennym, nid oes hawl gennych olygu'r rhestr hon" @@ -341,6 +354,7 @@ Fee = "Fee" Feedback = "Adborth" Feedback Email = "E-bost Adborth" feedback_name = "Enw" +File Description = "Disgrifiad Ffeil" Filter = "Hidlo" filter_tags = "Hidlo Tagiau" filter_wildcard = "Unrhyw Un" @@ -473,6 +487,7 @@ in = "mewn" In This Collection = "Yn y Casgliad Hwn" in_collection_label = "Yng Nghasgliad:" include_synonyms = "Ehangu'r canlyniadau gan ddefnyddio cyfystyron" +Index Terms = "Termau Mynegeio" Indexes = "Mynegeion" information = "Gwybodaeth" Institution = "Sefydliad" @@ -498,9 +513,11 @@ items_added_to_bookbag = "eitem(au) wedi ei/eu hychwanegu i'ch Bag Llyfrau" items_already_in_bookbag = "Eitem(au) naill ai yn eich Bag Llyfrau yn barod neu ni fedrwyd ei/eu hychwanegu" Journal = "Cylchgrawn" Journal Articles = "Erthyglau Cylchgrawn" +Journal Info = "Gwybodaeth am Gyfnodolyn" Journal Title = "Teitl y Cylchgrawn" Journals = "Cylchgronau" Jump to = "Ewch i" +just_cataloged = "Newdd ei gatalogeiddio" Keyword = "Allweddair" Keyword Filter = "Hidlwr Allweddair" Kit = "Cit" @@ -510,7 +527,19 @@ Last = "Olaf" Last Modified = "Dyddiad y Newid Diwethaf" Last Name = "Cyfenw" less = "llai" +libphonenumber_invalid = "Rhif ffôn annilys" +libphonenumber_invalidcountry = "Côd deialu gwlad annilys" +libphonenumber_invalidregion = "Côd rhanbarth annilys" +libphonenumber_notanumber = "Nid yw'n ymddangos bod y llinyn a nodwyd yn rhif ffôn" +libphonenumber_toolong = "Mae'r llinyn a nodwyd yn rhy hir i fod yn rhif ffôn" +libphonenumber_tooshort = "Mae'r llinyn a nodwyd yn rhy fyr i fod yn rhif ffôn" +libphonenumber_tooshortidd = "Mae'r rhif ffôn ar ôl y rhif deialu rhyngwladol yn rhy fyr" Library = "Llyfrgell" +Library Card = "Cerdyn Llyfrgell" +Library Card Deleted = "Cerdyn Llyfrgell Wedi'i Ddileu" +Library Card Name = "Enw ar y Cerdyn Llyfrgell" +Library Cards = "Cardiau Llyfrgell" +Library Cards Disabled = "Cardiau Llyfrgell Wedi'u Hanalluogi" Library Catalog Password = "Cyfrinair Catalog y Llyfrgell" Library Catalog Profile = "Proffil Catalog y Llyfrgell" Library Catalog Record = "Cofnod Catalog y Llyfrgell" @@ -546,6 +575,7 @@ map_results_label = "Yn y lleoliad hwn:" Maps = "Mapiau" Media Format = "Fformat y Cyfrwng" medium = "Canolig" +MeSH Terms = "Termau MeSH" Message = "Neges" Message From Sender = "Neges gan yr Anfonwr" Metadata Prefix = "Rhagddodiad Metadata" @@ -658,6 +688,7 @@ Page not found. = "Ni ellir dod o hyd i'r dudalen." Password = "Cyfrinair" Password Again = "Cyfrinair Eto" Password cannot be blank = "Ni all y cyfrinair fod yn wag" +password_error_invalid = "Mae'r cyfrinair newydd yn annilys (e.e. mae'n cynnwys nodau annilys)" password_error_not_unique = "Ni newidiwyd y cyfrinair" password_maximum_length = "Ni all y cyfrinair fod yn hirach na %%maxlength%% nod" password_minimum_length = "Rhaid i'r cyfrinair gynnwys o leiaf %%minlength%% nod" @@ -695,13 +726,17 @@ pronounced = "ynganiad" Provider = "Darparwr" Public = "Cyhoeddus" Publication = "Cyhoeddiad" +Publication Date = "Dyddiad Cyhoeddi" Publication Frequency = "Publication Frequency" Publication Information = "Gwybodaeth cyhoeddi" Publication Type = "Math o gyhoeddiad" +Publication Year = "Blwyddyn Cyhoeddi" Publication_Place = "Man cyhoeddi" Published = "Cyhoeddwyd" Published in = "Cyhoeddwyd yn" Publisher = "Cyhoeddwr" +Publisher Information = "Gwybodaeth am y Cyhoeddwr" +Publisher Permissions = "Caniatâd y Cyhoeddwr" QR Code = "Côd QR" qrcode_hide = "Cuddio Cod QR" qrcode_show = "Dangos Cod QR" @@ -830,6 +865,7 @@ sort_title = "Teitl" sort_year = "Dyddiad Trefn Ddisgynnol" sort_year asc = "Dyddiad Trefn Esgynnol" Source = "Ffynhonnell" +Source Title = "Teitl y Ffynhonnell" spell_expand_alt = "Ehangu'r Chwiliad" spell_suggest = "Chwilio eraill" Staff View = "Dangos Staff" @@ -870,6 +906,7 @@ storage_retrieval_request_year = "Blwyddyn" Subcollection = "Is-gasgliad" Subject = "Pwnc" Subject Area = "Maes Pwnc" +Subject Geographic = "Pwnc Daearyddol" Subject Recommendations = "Awgrymiadau Pwnc" Subject Terms = "Termau Pwnc" Subject(s) = "Pwnc / Pynciau" @@ -934,6 +971,7 @@ total_resources = "Cyfanswm Adnoddau" total_saved_items = "Cyfanswm Eitemau wedi'u Cadw" total_tags = "Cyfanswm Tagiau" total_users = "Cyfanswm Defnyddwyr" +Transliterated Title = "Teitl Wedi'i Drawslythrennu" tree_search_limit_reached_html = "Roedd gormod o ganlyniadau i'w dangos yn y goeden. Ond yn dangos y %%limit%% eitem gyntaf. I chwilio'r cyfan, cliciwch yma."" unique_tags = "Tagiau Unigryw" University Library = "Llyfrgell y Brifysgol" @@ -947,6 +985,7 @@ Use instead = "Defnyddio yn lle" User Account = "Cyfrif Defnyddiwr" Username = "Enw Defnyddiwr" Username cannot be blank = "Ni all Enw Defnyddiwr fod yn wag" +Username is already in use in another library card = "Mae cerdyn llyfrgell arall eisoes yn defnyddio'r enw defnyddiwr hwnnw" VHS = "VHS" Video = "Fideo" Video Clips = "Clipiau Fideo" @@ -984,6 +1023,7 @@ You do not have any fines = "Nid oes gennych unrhyw ddirwyon" You do not have any holds or recalls placed = "Nid ydych wedi gosod unrhyw ddaliadau neu adalwadau" You do not have any interlibrary loan requests placed = "Nid oes gennych yr un cais am Fenthyciad Rhwnglyfrgellol" You do not have any items checked out = "Nid oes gennych unrhyw eitemau ar fenthyg" +You do not have any library cards = "Nid oes gennych unrhyw gardiau llyfrgell" You do not have any saved resources = "Nid oes gennych unrhyw adnoddau wedi'u cadw" You do not have any storage retrieval requests placed = "Nid oes gennych yr un cais am Dynnu Eitem o'r Storfa" You must be logged in first = "Rhaid i chi fewngofnodi yn gyntaf" @@ -1000,4 +1040,4 @@ Your search terms = "Fy Eitemau Chwilio" Your Tags = "Tagiau" your_match_would_be_here = "Byddai'r gair yma." Zip = "Zip" -zoom = "Chwyddo" \ No newline at end of file +zoom = "Chwyddo" diff --git a/languages/da.ini b/languages/da.ini index 7ba3bcd0b52..00e6d462af5 100644 --- a/languages/da.ini +++ b/languages/da.ini @@ -678,4 +678,4 @@ Your Lists = "Dine lister" Your Profile = "Din profil" Your search terms = "Dine søgeord" Your Tags = "Dine Tags" -Zip = "Zip ø" \ No newline at end of file +Zip = "Zip ø" diff --git a/languages/de.ini b/languages/de.ini index f3d54509217..e53ebbf1ee4 100644 --- a/languages/de.ini +++ b/languages/de.ini @@ -2,8 +2,11 @@ ;German = Deutsch Abstract = "Abstract" Access = "Zugangseinschränkungen" +Access URL = "Zugangs-URL" +Accession Number = "Dokumentencode" Account = "Konto" Add = "Hinzufügen" +Add a Library Card = "Bibliotheksausweis hinzufügen" Add a Note = "Bemerkung hinzufügen" Add Tag = "Tag hinzufügen" Add Tags = "Tags hinzufügen" @@ -19,7 +22,7 @@ add_favorite_suffix = "zu den Favoriten hinzufügen" add_list_fail = "Fehler: Liste wurde nicht erstellt" add_other_libraries = "Datensätze anderer Bibliotheken berücksichtigen" add_search = "Suchfeld hinzufügen" -add_search_group = "Suchkriterium hinzufügen" +add_search_group = "Suchgruppe hinzufügen" add_tag_error = "Fehler: Tags wurden nicht gespeichert" add_tag_note = "Leerschläge bewirken einen neuen Tag. Verwenden Sie Anführungszeichen für Begriffe mit mehreren Wörtern." add_tag_success = "Tags gespeichert" @@ -43,11 +46,14 @@ Advanced Search = "Erweiterte Suche" advSearchError_noRights = "Tut mir Leid, aber Sie dürfen die Suche nicht ändern. Vielleicht ist Ihre Sitzung abgelaufen?" advSearchError_notAdvanced = "Die angeforderte Suche ist keine erweiterte Suche und kann nicht editiert werden." advSearchError_notFound = "Die angeforderte Suche wurde nicht gefunden." +ajaxview_label_information = "Information" +ajaxview_label_tools = "Werkzeuge" All = "Alles" All Fields = "Alle Felder" All Pages Loaded = "Alle Seiten geladen" All Text = "Alle Textfelder und Volltext" alphabrowse_matches = "Ergebnis" +alphabrowselink_html = "Einträge nach %%index%% ansehen ab %%from%%." An error has occurred = "Es ist ein Fehler aufgetreten" An error occurred during execution; please try again later. = "Ein Fehler ist aufgetreten. Bitte versuchen Sie es später noch einmal." AND = "UND" @@ -75,6 +81,7 @@ Auto configuration is currently disabled = "Autokonfiguration ist momentan nicht auto_configure_description = "Falls das eine Neuinstallation ist, können Sie den Fehler ev. beheben indem Sie das Autokonfigurations-Tool von VuFind benutzen." auto_configure_disabled = "Autokonfiguration ist deaktiviert." auto_configure_title = "Autokonfiguration" +Availability = "Verfügbarkeit" Available = "Verfügbar" Available Functionality = "Verfügbare Operationen" Awards = "Auszeichnungen" @@ -195,6 +202,8 @@ Company/Entity = "Firma/Körperschaft" Configuration = "Konfiguration" confirm_delete = "Wollen Sie wirklich löschen?" confirm_delete_brief = "Löschen?" +confirm_delete_library_card_brief = "Bibliotheksausweis löschen?" +confirm_delete_library_card_text = "Wollen Sie den Bibliotheksausweis wirklich löschen?" confirm_delete_list_brief = "Liste löschen?" confirm_delete_list_text = "Wollen Sie diese Liste wirklich löschen?" confirm_delete_tags_brief = "Tags löschen" @@ -209,9 +218,11 @@ confirm_storage_retrieval_request_cancel_all_text = "Möchten Sie alle ihre Maga confirm_storage_retrieval_request_cancel_selected_text = "Möchten Sie die ausgewählten Magazinbestellungen widerrufen?" conjunction_or = "oder" Contents = "Inhalte" +Contributing Source = "Originalquelle" Contributors = "Weitere Verfasser" Copies = "Exemplare" Copy = "Exemplar" +Copyright = "Copyright" Corporate Author = "Körperschaft" Country = "Land" Course = "Semester" @@ -231,7 +242,7 @@ date_to = "Bis" date_year_placeholder = "J" Days = "Tagen" Debug Information = "Debug Information" -del_search = "Suchkriterium entfernen" +del_search = "Suchgruppe entfernen" Delete = "Löschen" delete_all = "Alles löschen" delete_comment_failure = "Der Kommentar konnte nicht gelöscht werden." @@ -249,12 +260,14 @@ Detailed View = "Detailansicht" Details = "Details" Displaying the top = "Angezeigt werden die ersten" Document Inspector = "Dokumentprüfer" +Document Type = "Publikationsart" DOI = "DOI" Due = "Rückgabe bis" Due Date = "Rückgabedatum" DVD = "DVD" eBook = "E-Book" Edit = "Bearbeiten" +Edit Library Card = "Bibliotheksausweis bearbeiten" Edit this Advanced Search = "Erweiterte Suche bearbeiten" edit_list = "Liste bearbeiten" edit_list_fail = "Sie sind leider nicht berechtigt, diese Liste zu bearbeiten" @@ -340,6 +353,7 @@ Fee = "Gebühr" Feedback = "Feedback" Feedback Email = "E-Mail Feedback" feedback_name = "Name" +File Description = "Dateibeschreibung" Filter = "Filter" filter_tags = "Tags filtern" filter_wildcard = "alles" @@ -472,6 +486,7 @@ in = "in" In This Collection = "In diesem Bestand" in_collection_label = "In Bestand:" include_synonyms = "Ergebnisse erweitern mittels Synonymen" +Index Terms = "Index Begriffe" Indexes = "Inhaltsverzeichnis" information = "Information" Institution = "Institution" @@ -497,9 +512,11 @@ items_added_to_bookbag = "Datensatz/Datensätze der Zwischenablage hinzugefügt" items_already_in_bookbag = "Datensatz/Datensätze bereits in der Zwischenablage vorhanden und/oder konnte(n) nicht hinzugefügt werden" Journal = "Zeitschrift" Journal Articles = "Zeitschriftenartikel" +Journal Info = "Info zur Zeitschrift" Journal Title = "Zeitschriftentitel" Journals = "Zeitschriften" Jump to = "Springe nach" +just_cataloged = "Soeben neu katalogisiert" Keyword = "Stichwort" Keyword Filter = "Stichwortfilter" Kit = "Paket" @@ -509,7 +526,19 @@ Last = "Letzte" Last Modified = "Letzte Änderung" Last Name = "Nachname" less = "weniger" +libphonenumber_invalid = "Ungültige Telefonnummer" +libphonenumber_invalidcountry = "Ungültige Landesvorwahl" +libphonenumber_invalidregion = "Ungültige Vorwahl:" +libphonenumber_notanumber = "Die Eingabe scheint keine Telefonnummer zu sein" +libphonenumber_toolong = "Die Eingabe ist zu lang für eine Telefonnummer" +libphonenumber_tooshort = "Die Eingabe ist zu kurz für eine Telefonnumer" +libphonenumber_tooshortidd = "Die Telefonnumer nach der internationalen Direktwahl ist zu kurz" Library = "Bibliothek" +Library Card = "Bibliotheksausweis" +Library Card Deleted = "Bibliotheksausweis gelöscht" +Library Card Name = "Name des Bibliotheksausweises" +Library Cards = "Bibliotheksausweise" +Library Cards Disabled = "Bibliotheksausweis inaktiviert" Library Catalog Password = "Passwort Bibliothekskatalog" Library Catalog Profile = "Benutzerangaben Bibliothekskatalog" Library Catalog Record = "Datensatz Bibliothekskatalog" @@ -545,6 +574,7 @@ map_results_label = "An diesem Standort:" Maps = "Karten2" Media Format = "Medienformat" medium = "Medium" +MeSH Terms = "MeSH Schlagworte" Message = "Nachricht" Message From Sender = "Nachricht vom Sender" Metadata Prefix = "Metadaten Präfix" @@ -657,6 +687,7 @@ Page not found. = "Seite nicht gefunden." Password = "Passwort" Password Again = "Passwort wiederholen" Password cannot be blank = "Das Passwort darf nicht leer sein" +password_error_invalid = "Ungültiges neues Passwort (enthält z.B. ungültige Zeichen)" password_error_not_unique = "Das Passwort wurde nicht geändert" password_maximum_length = "Die maximale Länge des Passowrts beträgt %%maxlength%% Zeichen" password_minimum_length = "Die minimale Länge des Passowrts beträgt %%minlength%% Zeichen" @@ -694,13 +725,17 @@ pronounced = "Aussprache" Provider = "Provider" Public = "Öffentlich" Publication = "Verlag" +Publication Date = "Publikationsdatum" Publication Frequency = "Erscheinungshäufigkeit" Publication Information = "Publikationsangaben" Publication Type = "Publikationsart" +Publication Year = "Publikationsjahr" Publication_Place = "Erscheinungsort" Published = "Veröffentlicht" Published in = "Veröffentlicht in" Publisher = "Verlag" +Publisher Information = "Verlagsinformationen" +Publisher Permissions = "Verlagsgenehmigungen" QR Code = "QR-Code" qrcode_hide = "QR-Code ausblenden" qrcode_show = "QR-Code einblenden" @@ -783,7 +818,7 @@ Search Tips = "Suchtipps" Search Tools = "Suchwerkzeuge" Search Type = "Suchmodus" search_AND = "Mit ALLEN Wörtern" -search_groups = "Suchkriterium" +search_groups = "Suchgruppe" search_match = "Suchbedingung" search_NOT = "OHNE die Wörter" search_OR = "Mit IRGENDEINEM der Wörter" @@ -829,6 +864,7 @@ sort_title = "Titel" sort_year = "Nach Datum, absteigend" sort_year asc = "Nach Datum, aufsteigend" Source = "Quelle" +Source Title = "Name der Quelle" spell_expand_alt = "Erweiterte Suche" spell_suggest = "Andere Suchmöglichkeiten" Staff View = "Internformat" @@ -869,6 +905,7 @@ storage_retrieval_request_year = "Jahr" Subcollection = "Teilbestand" Subject = "Schlagwort" Subject Area = "Schlagwortumfeld" +Subject Geographic = "Geographisches Schlagwort" Subject Recommendations = "Schlagwortempfehlung" Subject Terms = "Schlagwörter" Subject(s) = "Schlagwörter" @@ -933,6 +970,7 @@ total_resources = "Total Datensätze" total_saved_items = "Total gespeicherter Objekte" total_tags = "Total Tags" total_users = "Total Benutzer" +Transliterated Title = "Transliterierter Titel" tree_search_limit_reached_html = "Ihr Suche ergab zuviele Treffer, um die gesamte Hierarchie anzeigen zu können. Es werden nur the ersten %%limit%% Treffer angezeigt. Für eine vollständige Suche klicken Sie hier." unique_tags = "Einmalige Tags" University Library = "Universitätsbibliothek" @@ -946,6 +984,7 @@ Use instead = "Siehe unter" User Account = "Persönliches Konto" Username = "Benutzername" Username cannot be blank = "Der Benutzername darf nicht leer sein" +Username is already in use in another library card = "Der Benutzername ist bereits für einen anderen Bibliotheksausweis vergeben" VHS = "VHS" Video = "Video" Video Clips = "Videoclips" @@ -983,6 +1022,7 @@ You do not have any fines = "Es sind keine Gebühren auf Ihrem Bibliothekskonto" You do not have any holds or recalls placed = "Es liegen keine Vormerkungen oder Bestellungen vor" You do not have any interlibrary loan requests placed = "Sie haben keine offenen Fernleihanfragen" You do not have any items checked out = "Sie haben nichts von uns ausgeliehen" +You do not have any library cards = "Sie haben keine Bibliotheksausweise" You do not have any saved resources = "Sie haben noch keine Daten gespeichert" You do not have any storage retrieval requests placed = "Sie haben keine offenen Magazinbestellungen" You must be logged in first = "Bitte loggen Sie sich zuerst ein" @@ -999,4 +1039,4 @@ Your search terms = "Ihre Suchbegriffe" Your Tags = "Ihre Tags" your_match_would_be_here = "Ihr Treffer würde hier aufgelistet." Zip = "PLZ, Ort" -zoom = "Zoom" \ No newline at end of file +zoom = "Zoom" diff --git a/languages/el.ini b/languages/el.ini index 9dd0dbadf2a..c785c4f14da 100644 --- a/languages/el.ini +++ b/languages/el.ini @@ -3,8 +3,11 @@ ;note_785_7 = "Συγχωνευμένο με" ; incomplete translation (en.ini was later revised) Abstract = "Περίληψη" Access = "Πρόσβαση" +Access URL = "Σύνδεσμος πρόσβασης" +Accession Number = "Αριθμός Καταχώρησης" Account = "Λογαριασμός" Add = "Προσθήκη" +Add a Library Card = "Προσθήκη κάρτας βιβλιοθήκης" Add a Note = "Προσθήκη σημείωσης" Add Tag = "Προσθήκη ετικέτας" Add Tags = "Προσθήκη ετικετών" @@ -44,11 +47,14 @@ Advanced Search = "Σύνθετη αναζήτηση" advSearchError_noRights = "Δεν μπορείτε να τροποποιήσετε την αναζήτηση (υπέρβαση χρόνου αναμονής;)" advSearchError_notAdvanced = "Η αναζήτηση που προσπαθείτε να τροποποιήσετε δεν είναι σύνθετη" advSearchError_notFound = "Δεν βρέθηκαν αποτελέσματα για την αναζήτησή σας" +ajaxview_label_information = "Πληροφορίες" +ajaxview_label_tools = "Εργαλεία" All = "Όλα" All Fields = "Όλα τα πεδία" All Pages Loaded = "Η φόρτωση σελίδων ολοκληρώθηκε" All Text = "Οπουδήποτε στο κείμενο" alphabrowse_matches = "Αποτελέσματα" +alphabrowselink_html = "Περιήγηση σε %%index%% ξεκινώντας από %%from%%." An error has occurred = "Παρουσιάστηκε σφάλμα" An error occurred during execution; please try again later. = "Παρουσιάστηκε σφάλμα κατά την εκτέλεση. Ξαναδοκιμάστε αργότερα." AND = "AND" @@ -76,6 +82,7 @@ Auto configuration is currently disabled = "Η αυτόματη παραμετρ auto_configure_description = "Αν πρόκειται για νέα εγκατάσταση, ίσως μπορέστε να διορθώσετε αυτό το σφάλμα χρησιμοποιώντας το εργαλείο της αυτόματης παραμετροποίησης του VuFind." auto_configure_disabled = "Η αυτόματη παραμετροποίηση απενεργοποιήθηκε." auto_configure_title = "Αυτόματη παραμετροποίηση" +Availability = "Διαθεσιμότητα" Available = "Στη βιβλιοθήκη" Available Functionality = "Διαθέσιμη λειτουργικότητα" Awards = "Βραβεία" @@ -196,6 +203,8 @@ Company/Entity = "Εταιρία/Οντότητα" Configuration = "Παραμετροποίηση" confirm_delete = "Σίγουρα θέλετε να διαγράψετε;" confirm_delete_brief = "Να διαγραφεί το τεκμήριο;" +confirm_delete_library_card_brief = "Διαγραφή κάρτας βιβλιοθήκης;" +confirm_delete_library_card_text = "Θέλετε σίγουρα να διαγράψετε αυτή την κάρτα βιβλιοθήκης;" confirm_delete_list_brief = "Να διαγραφεί η λίστα;" confirm_delete_list_text = "Σίγουρα θέλετε να διαγράψετε αυτή τη λίστα;" confirm_delete_tags_brief = "Διαγραφή ετικετών" @@ -210,9 +219,11 @@ confirm_storage_retrieval_request_cancel_all_text = "Θέλετε να ακυρ confirm_storage_retrieval_request_cancel_selected_text = "Θέλετε να ακυρώσετε τα επιλεγμένα τρέχοντα αιτήματα ανάκτησης από αποθήκη;" conjunction_or = "ή" Contents = "Περιεχόμενα" +Contributing Source = "Πηγή συνεισφοράς" Contributors = "Συνεισφορές" Copies = "Αντίγραφα" Copy = "Αντίγραφο" +Copyright = "Copyright" Corporate Author = "Corporate συγγραφέας" Country = "Χώρα" Course = "Μάθημα" @@ -250,12 +261,14 @@ Detailed View = "Λεπτομερής προβολή" Details = "Λεπτομέρειες" Displaying the top = "Εμφανίζονται τα πρώτα" Document Inspector = "Επισκόπηση εγγράφου" +Document Type = "Τύπος εγγράφου" DOI = "DOI" Due = "Επιστροφή" Due Date = "Ημερομηνία επιστροφής" DVD = "DVD" eBook = "Ηλ. βιβλίο" Edit = "Επεξεργασία" +Edit Library Card = "Επεξεργασία κάρτας βιβλιοθήκης" Edit this Advanced Search = "Τροποποίηση σύνθετης αναζήτησης" edit_list = "Επεξεργασία λίστας" edit_list_fail = "Δεν έχετε δικαίωμα να τροποποιήσετε τη λίστα" @@ -341,6 +354,7 @@ Fee = "Χρέωση" Feedback = "σχόλιά" Feedback Email = "Email" feedback_name = "Όνομα" +File Description = "Περιγραφή αρχείου" Filter = "Φίλτρο" filter_tags = "Φιλτράρισμα ετικετών" filter_wildcard = "Οτιδήποτε" @@ -473,6 +487,7 @@ in = "σε" In This Collection = "Σε αυτή τη συλλογή" in_collection_label = "Στη συλλογή:" include_synonyms = "Συμπερίληψη αποτελεσμάτων από συνώνυμα" +Index Terms = "Όροι ευρετηρίου" Indexes = "Ευρετήρια" information = "Πληροφορίες" Institution = "Πηγή" @@ -498,9 +513,11 @@ items_added_to_bookbag = "τεκμήρια προστέθηκαν στο καλ items_already_in_bookbag = "τεκμήρια ήδη περιέχονται στο καλάθι σας ή δεν είναι δυνατό να προστεθούν" Journal = "Επιστημονικό περιοδικό" Journal Articles = "Άρθρα περιοδικού" +Journal Info = "Στοιχεία περιοδικού" Journal Title = "Τίτλος περιοδικού" Journals = "Επιστημονικά περιοδικά" Jump to = "Μετάβαση σε" +just_cataloged = "Μόλις καταλογογραφήθηκε" Keyword = " λέξη-κλειδί " Keyword Filter = "Περιορισμός με λέξη-κλειδί" Kit = "Κιτ" @@ -510,7 +527,19 @@ Last = "Τελευταία" Last Modified = "Τελευταία τροποποίηση" Last Name = "Επώνυμο" less = "λιγότερα" +libphonenumber_invalid = "Άκυρος τηλφεωνικός αριθμός" +libphonenumber_invalidcountry = "Άκυρο πρόθεμα χώρας" +libphonenumber_invalidregion = "Άκυρο πρόθεμα περιοχής" +libphonenumber_notanumber = "Τηλεφωνικός αριθμός με ακατάλληλους χαρακτήρες" +libphonenumber_toolong = "Τηλεφωνικός αριθμός με πάρα πολλά ψηφία" +libphonenumber_tooshort = "Τηλεφωνικός αριθμός με πολύ λίγα ψηφία" +libphonenumber_tooshortidd = "Τηλεφωνικός αριθμός με πολύ λίγα ψηφία μετά το πρόθεμα χώρας" Library = "Βιβλιοθήκη" +Library Card = "Κάρτα βιβλιοθήκης" +Library Card Deleted = "Η κάρτα βιβλιοθήκης διαγράφηκε" +Library Card Name = "Όνομα κάρτας βιβλιοθήκης" +Library Cards = "Κάρτες βιβλιοθήκης" +Library Cards Disabled = "Οι κάρτες βιβλιοθήκης απενεργοποιήθηκαν" Library Catalog Password = "Κωδικός καταλόγου βιβλιοθήκης" Library Catalog Profile = "Λογαριασμός καταλόγου βιβλιοθήκης" Library Catalog Record = "Εγγραφή καταλόγου βιβλιοθήκης" @@ -546,6 +575,7 @@ map_results_label = "Σε αυτή την τοποθεσία:" Maps = "Χάρτες" Media Format = "Μορφή μέσου" medium = " Μέτριο μέγεθος " +MeSH Terms = "Ιατρικοί όροι (MeSH)" Message = "Μήνυμα" Message From Sender = "Μήνυμα από αποστολέα" Metadata Prefix = "Πρόθεμα μεταδεδομένων" @@ -658,6 +688,7 @@ Page not found. = "Η σελίδα δεν βρέθηκε." Password = "Κωδικός" Password Again = "Κωδικός ξανά" Password cannot be blank = "Ο κωδικός δεν μπορεί να είναι κενός" +password_error_invalid = "Ο νέος κωδικός πρόσβασης δεν είναι έγκυρος (πχ περιέχει μή έγκυρους χαρακτήρες)" password_error_not_unique = "Ο κωδικός δεν άλλαξε" password_maximum_length = "Ο μέγιστος αριθμός χαρακτήρων για τον κωδικό είναι %%maxlength%%" password_minimum_length = "Ο ελάχιστος αριθμός χαρακτήρων για τον κωδικό είναι %%minlength%%" @@ -695,13 +726,17 @@ pronounced = "προφέρεται" Provider = "Πάροχος" Public = "Δημόσιο" Publication = "Δημοσίευση" +Publication Date = "Ημερομηνία έκδοσης" Publication Frequency = "Συχνότητα δημοσίευσης" Publication Information = "Πληροφορίες έκδοσης" Publication Type = "Τύπος έκδοσης" +Publication Year = "Έτος έκδοσης" Publication_Place = "Τόπος έκδοσης" Published = "Έκδοση" Published in = "Τόπος έκδοσης" Publisher = "εκδότη" +Publisher Information = "Στοιχεία εκδότη" +Publisher Permissions = "Άδειες εκδότη" QR Code = "Κώδικας QR" qrcode_hide = "Απόκρυψη κώδικα QR" qrcode_show = "Εμφάνιση κώδικα QR" @@ -830,6 +865,7 @@ sort_title = "Με τίτλο" sort_year = "Με ημερομηνία (φθ.)" sort_year asc = "Με ημερομηνία (αυξ.)" Source = "Πηγή" +Source Title = "Τίτλος πηγής" spell_expand_alt = "Επέκταση αναζήτησης" spell_suggest = "Εναλλακτικές αναζητήσεις" Staff View = "Λεπτομερής προβολή" @@ -870,6 +906,7 @@ storage_retrieval_request_year = "Έτος" Subcollection = "Υποομάδα Συλλογής" Subject = "Θέμα" Subject Area = "Περιοχή θεμάτων" +Subject Geographic = "Θέμα γεωγραφικό" Subject Recommendations = "Προτάσεις θεμάτων" Subject Terms = "Θεματικοί όροι" Subject(s) = "Θέμα(τα)" @@ -934,6 +971,7 @@ total_resources = "Σύνολο στοιχείων" total_saved_items = "Σύνολο αποθηκευμένων" total_tags = "Σύνολο ετικετών" total_users = "Σύνολο χρηστών" +Transliterated Title = "Μεταγραφείς τίτλος" tree_search_limit_reached_html = "Η αναζήτηση επέστρεψε πάρα πολλά αποτελέσματα. Εμφανίζονται μόνο τα πρώτα %%limit%%. Δείτε όλα τα αποτελέσματα Library Catalogue Profile." too_many_favorites = "This list is too large to display all at once. Try rearranging your favourites into more lists or limiting using tags." You do not have any saved resources = "You do not have any saved resources. Perform a search and use the Add to Favourites button to save items." -Your Favorites = "Your Favourites" \ No newline at end of file +Your Favorites = "Your Favourites" diff --git a/languages/en.ini b/languages/en.ini index dcea85e54d6..942426857bf 100644 --- a/languages/en.ini +++ b/languages/en.ini @@ -46,6 +46,8 @@ Advanced Search = "Advanced Search" advSearchError_noRights = "I'm sorry, but you don't have permission to edit that search. Perhaps your browser session has expired?" advSearchError_notAdvanced = "The search you have requested to edit is not an advanced search." advSearchError_notFound = "The search you have requested was not found." +ajaxview_label_information = "Information" +ajaxview_label_tools = "Tools" All = "All" All Fields = "All Fields" All Pages Loaded = "All Pages Loaded" @@ -183,6 +185,7 @@ citation_singlepage_abbrev = "p." citation_volume_abbrev = "Vol." Cite this = "Cite this" City = "City" +Clear = "Clear" clear_tag_filter = "Clear Filter" close = "close" Code = "Code" @@ -572,7 +575,7 @@ map_results_label = "At this location:" Maps = "Maps" Media Format = "Media Format" medium = "Medium" -MeSH Terms = "MeSH TermsH" +MeSH Terms = "MeSH Terms" Message = "Message" Message From Sender = "Message From Sender" Metadata Prefix = "Metadata Prefix" @@ -917,6 +920,7 @@ summon_database_recommendations = "You may find additional resources here:" Supplements = "Supplements" Supplied by Amazon = "Supplied by Amazon" Switch view to = "Switch view to" +switchquery_fuzzy = "Performing a fuzzy search may retrieve terms with similar spellings" switchquery_intro = "You may be able to get more results by adjusting your search query." switchquery_lowercasebools = "If you are trying to use Boolean operators, they must be ALL CAPS" switchquery_truncatechar = "Shorten your search query to broaden your results" @@ -1037,4 +1041,4 @@ Your search terms = "Your search terms" Your Tags = "Your Tags" your_match_would_be_here = "Your match would be here." Zip = "Zip" -zoom = "Zoom" \ No newline at end of file +zoom = "Zoom" diff --git a/languages/es.ini b/languages/es.ini index d5563bf7552..6d2246e30dd 100644 --- a/languages/es.ini +++ b/languages/es.ini @@ -3,8 +3,11 @@ ;Spanish = Español Abstract = "Resumen" Access = "Acceso" +Access URL = "URL de Acceso" +Accession Number = "Número de Acceso" Account = "Cuenta" Add = "Agregar" +Add a Library Card = "Agregar una Tarjeta de la Biblioteca" Add a Note = "Agregar Nota" Add Tag = "Agregar Etiqueta" Add Tags = "Agregar Etiquetas" @@ -44,11 +47,14 @@ Advanced Search = "Búsqueda Avanzada" advSearchError_noRights = "Lo sentimos, no tiene permisos para editar la búsqueda. Tal vez ha expirado la sesión en su navegador." advSearchError_notAdvanced = "La búsqueda solicitada para editar no es Avanzada." advSearchError_notFound = "No se ha encontrado la búsqueda solicitada." +ajaxview_label_information = "Información" +ajaxview_label_tools = "Herramientas" All = "Todo" All Fields = "Todos los Campos" All Pages Loaded = "Todas las páginas cargadas" All Text = "Todo el Texto" alphabrowse_matches = "Resultados" +alphabrowselink_html = "Navegar por las entradas %%index%% iniciando desde %%from%%." An error has occurred = "Ha ocurrido un error" An error occurred during execution; please try again later. = "Un error ha ocurrido durante la ejecución; por favor intente más tarde" AND = "Y" @@ -76,6 +82,7 @@ Auto configuration is currently disabled = "Configuración automática deshabili auto_configure_description = "Si es una nueva instalación, utilice Configuración Automática de VuFind para resolver el error." auto_configure_disabled = "Configuración Automática deshabilitada." auto_configure_title = "Configuración Automática" +Availability = "Disponibilidad" Available = "Disponible" Available Functionality = "Funcionalidad disponible" Awards = "Premios" @@ -179,6 +186,7 @@ citation_singlepage_abbrev = "p." citation_volume_abbrev = "Vol." Cite this = "Citar" City = "Ciudad" +Clear = "Limpiar" clear_tag_filter = "Limpiar filtro" close = "cerrar" Code = "Código" @@ -196,6 +204,8 @@ Company/Entity = "Empresa/Entidad" Configuration = "Configuración" confirm_delete = "¿Seguro que desea borrar esto?" confirm_delete_brief = "¿Borrar elemento?" +confirm_delete_library_card_brief = "Borrar la Tarjeta de la Biblioteca?" +confirm_delete_library_card_text = "Está seguro de querer borrar ésta tarjeta de la biblioteca?" confirm_delete_list_brief = "¿Borrar lista?" confirm_delete_list_text = "¿Seguro que desea borrar esta lista?" confirm_delete_tags_brief = "Borrar Etiquetas" @@ -210,9 +220,11 @@ confirm_storage_retrieval_request_cancel_all_text = "¿Desea cancelar todas sus confirm_storage_retrieval_request_cancel_selected_text = "¿Desea cancelar sus solicitudes de recuperación de almacenamiento seleccionado?" conjunction_or = "o" Contents = "Contenido" +Contributing Source = "Fuente de Contibución" Contributors = "Colaboradores" Copies = "Copias" Copy = "Copia" +Copyright = "Derechos de autor" Corporate Author = "Autor Corporativo" Country = "País" Course = "Curso" @@ -250,12 +262,14 @@ Detailed View = "Vista Detallada" Details = "Vista Staff" Displaying the top = "Mostrando la parte superior" Document Inspector = "Inspector de documentos" +Document Type = "Tipo de Documento" DOI = "DOI" Due = "Vencimiento" Due Date = "Fecha de Vencimiento" DVD = "DVD" eBook = "eBook" Edit = "Editar" +Edit Library Card = "Editar Tarjeta de la Biblioteca" Edit this Advanced Search = "Editar esta Búsqueda Avanzada" edit_list = "Editar Lista" edit_list_fail = "Lo sentimos, no está autorizado para editar esta lista" @@ -341,6 +355,7 @@ Fee = "Cuota" Feedback = "Comentarios" Feedback Email = "Correo Electrónico" feedback_name = "Nombre" +File Description = "Descripción del Archivo" Filter = "Filtro" filter_tags = "Filtro de Etiquetas" filter_wildcard = "Cualquier" @@ -473,6 +488,7 @@ in = "en" In This Collection = "En esta colección" in_collection_label = "En colección:" include_synonyms = "Expandir resultados usando sinónimos" +Index Terms = "Términos del Indice" Indexes = "Indexados" information = "Información" Institution = "Institución" @@ -498,9 +514,11 @@ items_added_to_bookbag = "Elementos agregados a su Mochila" items_already_in_bookbag = "Elementos están en su Mochila o podrían no estar añadidos." Journal = "Revista" Journal Articles = "Artículos de Revistas" +Journal Info = "Información de la Revista" Journal Title = "Título de Revista" Journals = "Revistas" Jump to = "pasar a" +just_cataloged = "Recién Catalogado" Keyword = "Palabra clave" Keyword Filter = "Filtro de palabra clave" Kit = "Conjunto" @@ -510,7 +528,19 @@ Last = "Ultimo" Last Modified = "Ultima modificación" Last Name = "Apellido" less = "menos" +libphonenumber_invalid = "Número de teléfono no válido" +libphonenumber_invalidcountry = "Código de país no válido" +libphonenumber_invalidregion = "Código de región no válido" +libphonenumber_notanumber = "La numeración suministrada no parece ser un número de teléfono" +libphonenumber_toolong = "La numeración suministrada es demasiado larga para ser un número de teléfono" +libphonenumber_tooshort = "La numeración suministrada es demasiada corta para ser un número de teléfono" +libphonenumber_tooshortidd = "Número de teléfono demasiado corto después del Marcado Directo Internacional" Library = "Biblioteca" +Library Card = "Tarjeta de la Biblioteca" +Library Card Deleted = "Tarjeta de la Biblioteca eliminada" +Library Card Name = "Nombre de la Tarjeta de la Biblioteca" +Library Cards = "Tarjetas de Biblioteca" +Library Cards Disabled = "Tarjetas de la Biblioteca Desabilitadas" Library Catalog Password = "Contraseña del Catálogo de la Biblioteca" Library Catalog Profile = "Perfíl del Catálogo de la Biblioteca" Library Catalog Record = "Registro del Catálogo de la Biblioteca" @@ -546,6 +576,7 @@ map_results_label = "En esta ubicación:" Maps = "Mapas" Media Format = "Formato del medio" medium = "Medio" +MeSH Terms = "Términos MeSH" Message = "Mensaje" Message From Sender = "Mensaje del Remitente" Metadata Prefix = "Prefijo de metadatos" @@ -658,6 +689,7 @@ Page not found. = "Página no encontrada" Password = "Contraseña" Password Again = "Nuevamente contraseña" Password cannot be blank = "La contraseña no puede quedar en blanco" +password_error_invalid = "Nueva contraseña es inválida (p.e. contiene caracteres no válidos)" password_error_not_unique = "La contraseña no se ha cambiado" password_maximum_length = "Longitud máxima de la contraeña son %%maxlength%% caracteres" password_minimum_length = "Longitud mínima de la contraeña son %%minlength%% caracteres" @@ -695,13 +727,17 @@ pronounced = "pronunciado" Provider = "Proveedor" Public = "Público" Publication = "Publicación" +Publication Date = "Fecha de Publicación" Publication Frequency = "Frecuencia de Publicación" Publication Information = "Información de Publicación" Publication Type = "Tipo de publicación" +Publication Year = "Año de Publicación" Publication_Place = "Lugar de publicación" Published = "Publicado" Published in = "Publicado en" Publisher = "Editor" +Publisher Information = "Información del Publicador" +Publisher Permissions = "Permisos del Publicador" QR Code = "Código QR" qrcode_hide = "Ocultar Código QR" qrcode_show = "Mostrar Código QR" @@ -830,6 +866,7 @@ sort_title = "Título" sort_year = "Fecha Descendente" sort_year asc = "Fecha Ascendente" Source = "Fuente" +Source Title = "Fuente del Título" spell_expand_alt = "Expander búsqueda" spell_suggest = "Buscar alternativas" Staff View = "Vista Equipo" @@ -870,6 +907,7 @@ storage_retrieval_request_year = "Año" Subcollection = "Subcolección" Subject = "Materia" Subject Area = "Areas Temáticas" +Subject Geographic = "Materia Geográfica" Subject Recommendations = "Temas recomendados" Subject Terms = "Términos de Temas" Subject(s) = "Tema(s)" @@ -934,6 +972,7 @@ total_resources = "total de Recursos" total_saved_items = "Total de elementos guardados" total_tags = "Total de etiquetas" total_users = "Total de usuarios" +Transliterated Title = "Título Transliterado" tree_search_limit_reached_html = "Su búsqueda tiene muchos resultados para desplegar en el árbol. Mostrando solo los primeros %%limit%% elementos. Para una búsqueda completa clic aquí." unique_tags = "Etiquetas únicas" University Library = "Biblioteca Universitaria" @@ -947,6 +986,7 @@ Use instead = "Usar en vez" User Account = "Cuenta de usuario" Username = "Usuario" Username cannot be blank = "Nombre de usuario no puede estar vacío" +Username is already in use in another library card = "El nombre de usuario ya está usado por otra trajeta de la biblioteca" VHS = "VHS" Video = "Video" Video Clips = "Video Clips" @@ -984,6 +1024,7 @@ You do not have any fines = "Usted no tiene multas" You do not have any holds or recalls placed = "No tiene reservas ni reclamos" You do not have any interlibrary loan requests placed = "No tiene ninguna solicitud de préstamo interbibliotecario colocada" You do not have any items checked out = "No tiene copias en préstamo" +You do not have any library cards = "Usted no tiene ninguna tarjeta de la biblioteca" You do not have any saved resources = "No ha guardado ningún recurso" You do not have any storage retrieval requests placed = "No tiene ninguna solicitud de almacenamiento y recuperación colocada" You must be logged in first = "Primero debe ingresar al sistema" @@ -1000,4 +1041,4 @@ Your search terms = "Sus términos de búsqueda" Your Tags = "Sus Etiquetas" your_match_would_be_here = "Su coincidencia estaría aquí" Zip = "Código Postal" -zoom = "Enfocar" \ No newline at end of file +zoom = "Enfocar" diff --git a/languages/eu.ini b/languages/eu.ini index 2463fdcad7e..5660bc6d8f8 100644 --- a/languages/eu.ini +++ b/languages/eu.ini @@ -1588,4 +1588,4 @@ Your Profile = "Zure profila" Your search terms = "Bilatu dituzun hitzak" Your Tags = "Zure etiketak" Zip = "Posta kodea" -zoom = "Zoom" \ No newline at end of file +zoom = "Zoom" diff --git a/languages/fi.ini b/languages/fi.ini index 4373ef939a6..8d79caae227 100644 --- a/languages/fi.ini +++ b/languages/fi.ini @@ -1,6 +1,8 @@ ;note_785_7 = "Yhdistynyt julkaisuun" ; incomplete translation (en.ini was later revised) Abstract = "Abstrakti" Access = "Pääsy" +Access URL = "Linkki aineistoon" +Accession Number = "Hankintanumero" Account = "Tili" Add = "Lisää" Add a Library Card = "Lisää kirjastokortti" @@ -43,11 +45,14 @@ Advanced Search = "Tarkennettu haku" advSearchError_noRights = "Haun muokkaus epäonnistui. Epäonnistuminen voi johtua vanhentuneesta selainistunnosta." advSearchError_notAdvanced = "Muokkaamasi haku ei ole tarkennettu haku." advSearchError_notFound = "Hakua ei löydy." +ajaxview_label_information = "Tietoa" +ajaxview_label_tools = "Työkalut" All = "Kaikki" All Fields = "Kaikki kentät" All Pages Loaded = "Kaikki sivut ladattu" All Text = "Kaikki teksti" alphabrowse_matches = "Tulokset" +alphabrowselink_html = "Selaa %%index%%-indeksiä alkaen kohdasta %%from%%." An error has occurred = "Tapahtui virhe" An error occurred during execution; please try again later. = "Virhe toimintoa suoritettaessa. Yritä myöhemmin uudelleen." AND = "JA" @@ -75,12 +80,13 @@ Auto configuration is currently disabled = "Automaattinen asennus on pois pääl auto_configure_description = "If this is a new installation, you may be able to fix the error using VuFind's Auto Configure tool." auto_configure_disabled = "Auto configuration is disabled." auto_configure_title = "Auto Configure" +Availability = "Saatavuus" Available = "Saatavissa" Available Functionality = "Käytettävissä oleva toiminnallisuus" Awards = "Palkinnot" Back to Record = "Takaisin tietueeseen" Back to Search Results = "Takaisin hakutuloksiin" -Backtrace = "Paluupolku" +Backtrace = "Kutsupino" Bag = "Kori" Balance = "Maksettavaa" basic_search_keep_filters = "Säilytä käytössä oleva rajaus" @@ -211,9 +217,11 @@ confirm_storage_retrieval_request_cancel_all_text = "Haluatko perua kaikki tilau confirm_storage_retrieval_request_cancel_selected_text = "Haluatko perua valitsemasi tilaukset?" conjunction_or = "tai" Contents = "Sisältö" +Contributing Source = "Osallistuva lähde" Contributors = "Muut tekijät" Copies = "Niteet" Copy = "Nide" +Copyright = "Copyright" Corporate Author = "Yhteisötekijä" Country = "Maa" Course = "Kurssi" @@ -251,6 +259,7 @@ Detailed View = "Tarkat tiedot" Details = "Henkilökuntanäyttö" Displaying the top = "Näytetään ensimmäiset" Document Inspector = "Dokumentin tutkija" +Document Type = "Dokumentin tyyppi" DOI = "DOI" Due = "Eräpäivä" Due Date = "Eräpäivä" @@ -343,6 +352,7 @@ Fee = "Maksu" Feedback = "Palaute" Feedback Email = "Sähköpostiosoite palautteelle" feedback_name = "Nimi" +File Description = "Tiedoston kuvaus" Filter = "Suodatin" filter_tags = "Suodata tageja" filter_wildcard = "Mikä tahansa" @@ -475,6 +485,7 @@ in = "kentästä" In This Collection = "Tässä kokoelmassa" in_collection_label = "Kokoelmassa:" include_synonyms = "Lisää tuloksia synonyymien avulla" +Index Terms = "Indeksitermit" Indexes = "Hakemistot" information = "Tietoa" Institution = "Organisaatio" @@ -500,9 +511,11 @@ items_added_to_bookbag = "tietue(et) lisätty kirjakoriin" items_already_in_bookbag = "tietue(et) ovat jo kirjakorissa tai lisäys koriin epäonnistui" Journal = "Aikakauslehti" Journal Articles = "Lehtiartikkelit" +Journal Info = "Lehden tiedot" Journal Title = "Lehden nimi" Journals = "Aikakauslehdet" Jump to = "Siirry kohtaan" +just_cataloged = "Juuri luetteloitu" Keyword = "Sanahaku" Keyword Filter = "Asiasanarajaus" Kit = "Kokoelma" @@ -512,6 +525,13 @@ Last = "Viimeinen" Last Modified = "Viimeksi muokattu" Last Name = "Sukunimi" less = "vähemmän" +libphonenumber_invalid = "Virheellinen puhelinnumero" +libphonenumber_invalidcountry = "Virheellinen maakoodi" +libphonenumber_invalidregion = "Virheellinen aluekoodi:" +libphonenumber_notanumber = "Annettu arvo ei näyttänyt puhelinnumerolta" +libphonenumber_toolong = "Annettu arvo on liian pitkä ollakseen puhelinnumero" +libphonenumber_tooshort = "Annettu arvo on liian lyhyt ollakseen puhelinnumero" +libphonenumber_tooshortidd = "Liian lyhyt puhelinnumero maakoodin jälkeen" Library = "Kirjasto" Library Card = "Kirjastokortti" Library Card Deleted = "Kirjastokortti poistettu" @@ -553,6 +573,7 @@ map_results_label = "Tässä paikassa:" Maps = "Kartat" Media Format = "Median formaatti" medium = "Keskikokoinen" +MeSH Terms = "MeSH-termit" Message = "Viesti" Message From Sender = "Viesti lähettäjältä" Metadata Prefix = "Metadatan etuliite" @@ -703,13 +724,17 @@ pronounced = "äännetään" Provider = "Tuottaja" Public = "Julkinen" Publication = "Julkaisu" +Publication Date = "Julkaisupäivä" Publication Frequency = "Julkaisutiheys" Publication Information = "Julkaisutiedot" Publication Type = "Julkaisutyyppi" +Publication Year = "Julkaisuvuosi" Publication_Place = "Julkaisupaikka" Published = "Julkaistu" Published in = "Julkaisussa" Publisher = "Julkaisija" +Publisher Information = "Julkaisutiedot" +Publisher Permissions = "Julkaisuoikeudet" QR Code = "QR-koodi" qrcode_hide = "Piilota QR-koodi" qrcode_show = "Näytä QR-koodi" @@ -838,6 +863,7 @@ sort_title = "Nimeke" sort_year = "Aika (uusimmat ensin)" sort_year asc = "Aika (vanhimmat ensin)" Source = "Lähde" +Source Title = "Lähdenimeke" spell_expand_alt = "Laajenna hakua" spell_suggest = "Tarkoititko" Staff View = "Henkilökuntanäyttö" @@ -878,6 +904,7 @@ storage_retrieval_request_year = "Vuosi" Subcollection = "Alakokoelma" Subject = "Aihe" Subject Area = "Aihealue" +Subject Geographic = "Maantieteellinen aihe" Subject Recommendations = "Aihe-ehdotuksia" Subject Terms = "Asiasanat" Subject(s) = "Aihe(et)" @@ -942,6 +969,7 @@ total_resources = "Resursseja yhteensä" total_saved_items = "Tallennettuja tietueita yhteensä" total_tags = "Tageja yhteensä" total_users = "Käyttäjiä yhteensä" +Transliterated Title = "Translitteroitu nimeke" tree_search_limit_reached_html = "Hakusi tuotti liikaa tuloksia puussa näytettäväksi. Näytetään vain ensimmäiset %%limit%% kohdetta. Klikkaa tästä nähdäksesi koko hakutuloksen." unique_tags = "Yksilöllisiä tageja yhteensä" University Library = "Yliopiston kirjasto" @@ -1010,4 +1038,4 @@ Your search terms = "Hakuehdot" Your Tags = "Tagit" your_match_would_be_here = "Osuma olisi tässä." Zip = "Postitoimipaikka" -zoom = "Zoomaa" \ No newline at end of file +zoom = "Zoomaa" diff --git a/languages/fr.ini b/languages/fr.ini index 231e5e31c31..01c6a00e86c 100644 --- a/languages/fr.ini +++ b/languages/fr.ini @@ -999,4 +999,4 @@ Your search terms = "Vos termes de recherche" Your Tags = "Vos tags" your_match_would_be_here = "Votre correspondance devrait être ici." Zip = "Zip" -zoom = "Zoom" \ No newline at end of file +zoom = "Zoom" diff --git a/languages/ga.ini b/languages/ga.ini index 97c21ba6c3f..baf218ce44d 100644 --- a/languages/ga.ini +++ b/languages/ga.ini @@ -665,4 +665,4 @@ Your Lists = "Do Liostaí" Your Profile = "Do Phróifíl" Your search terms = "Do Théarmaí Cuardaigh" Your Tags = "Do Chlibeanna" -Zip = "Cód Post" \ No newline at end of file +Zip = "Cód Post" diff --git a/languages/he.ini b/languages/he.ini index f00daa285ed..054280b6f0e 100644 --- a/languages/he.ini +++ b/languages/he.ini @@ -777,4 +777,4 @@ Your Profile = "הפרופיל שלך" Your search terms = "מילות החיפוש שלך" Your Tags = "התגים שלך" Zip = "מיקוד" -zoom = "זום" \ No newline at end of file +zoom = "זום" diff --git a/languages/it.ini b/languages/it.ini index 5f66a4e140b..a4aa27af74d 100644 --- a/languages/it.ini +++ b/languages/it.ini @@ -2,14 +2,17 @@ ;Italian = Italiano Abstract = "Abstract" Access = "Accesso" +Access URL = "URL di accesso" +Accession Number = "Accession Number" Account = "Account" Add = "Aggiungi" +Add a Library Card = "Aggiungi una tessera di biblioteca" Add a Note = "Aggiungi una nota" Add Tag = "Aggiungi Tag" Add Tags = "Aggiungi Tag" Add to another list = "Aggiungi a un'altra lista" Add to Book Bag = "Aggiungi al carrello" -Add to favorites = "Aggiungi ai preferiti" +Add to favorites = "Aggiungi alla lista" Add your comment = "Aggiungi un commento" add_comment_fail_blank = "Un commento non può essere vuoto." add_comment_success = "Commento aggiunto." @@ -43,11 +46,14 @@ Advanced Search = "Ricerca avanzata" advSearchError_noRights = "Mi spiace ma non hai il permesso di modificare la ricerca. Forse è terminata la tua sessione?" advSearchError_notAdvanced = "La ricerca che hai chiesto di modificare non è una ricerca avnzata." advSearchError_notFound = "La ricerca richiesta non è stata trovata." +ajaxview_label_information = "Informazioni" +ajaxview_label_tools = "Strumenti" All = "All" All Fields = "Tutti i Campi" All Pages Loaded = "Tutte le pagine caricate" All Text = "Tutto il testo" alphabrowse_matches = "Risultati" +alphabrowselink_html = "Naviga il catalogo per %%index%% partendo da %%from%%." An error has occurred = "Si è verificato un errore" An error occurred during execution; please try again later. = "Errore durante l'esecuzione; riprova più tardi." AND = "AND" @@ -75,6 +81,7 @@ Auto configuration is currently disabled = "L'auto-configurazione attualmente è auto_configure_description = "Se questa è una nuova installazione, puoi correggere gli errorim usando lo strumento di auto-configuazione di VuFind." auto_configure_disabled = "L'auto-configurazione non è abilitatata." auto_configure_title = "Auto-configurazione" +Availability = "Disponibilità" Available = "Disponibile" Available Functionality = "Funzionalità disponibile" Awards = "Premi" @@ -195,11 +202,13 @@ Company/Entity = "Società/Entità" Configuration = "Configurazione" confirm_delete = "Sei sicuro di voler procedere con l'eliminazione?" confirm_delete_brief = "Cancellare questo elemento?" +confirm_delete_library_card_brief = "Cancellare la tessera della biblioteca?" +confirm_delete_library_card_text = "Sei sicuro di cancellare questa tessera della biblioteca?" confirm_delete_list_brief = "Cancellare la lista?" confirm_delete_list_text = "Sei sicuro di voler eliminare questa lista?" confirm_delete_tags_brief = "Cancella i tag" -confirm_dialog_no = "Cancella" -confirm_dialog_yes = "Conferma" +confirm_dialog_no = "No" +confirm_dialog_yes = "Si" confirm_hold_cancel_all_text = "Vuoi cancellare tutte le tue prenotazioni?" confirm_hold_cancel_selected_text = "Vuoi cancellare le prenotazioni selezionate?" confirm_ill_request_cancel_all_text = "Vuoi cancellare tutte le tue richieste di prestito interbibliotecario?" @@ -209,9 +218,11 @@ confirm_storage_retrieval_request_cancel_all_text = "Vuoi cancellare tutte le tu confirm_storage_retrieval_request_cancel_selected_text = "Vuoi cancellare le richiestte di volumi da magazzino selezionate?" conjunction_or = "o" Contents = "Contenuti" +Contributing Source = "Fonte del contributo" Contributors = "Nomi associati" Copies = "Copie" Copy = "Copia" +Copyright = "Copyright" Corporate Author = "Ente Autore" Country = "Stato" Course = "Corso" @@ -249,12 +260,14 @@ Detailed View = "Visualizzazione analitica" Details = "Dettagli" Displaying the top = "Displaying the top" Document Inspector = "Analizzatore documentale" +Document Type = "Tipo di documento" DOI = "DOI" Due = "Scadere" Due Date = "Data di scadenza" DVD = "DVD" eBook = "eBook" Edit = "Modifica" +Edit Library Card = "Modifica la tessera della biblioteca" Edit this Advanced Search = "Modifica questa ricerca avanzata" edit_list = "Modifica la lista" edit_list_fail = "Ops, non sei autorizzato a modificare questa lista" @@ -335,11 +348,12 @@ fav_export = "Esporta i preferiti" fav_list_delete = "la lista dei tuoi preferiti è stata eliminata" fav_list_delete_cancel = "Questa lista non è stata eliminata" fav_list_delete_fail = "Ops, si è verificato un errore. La tua lista non è stata eliminata." -Favorites = "Preferiti" +Favorites = "Elementi salvati" Fee = "Tariffa" Feedback = "Feedback" Feedback Email = "Email" feedback_name = "Nome" +File Description = "Descrizione del file" Filter = "Filtra" filter_tags = "Filtra i tag" filter_wildcard = "Qualsiasi" @@ -393,11 +407,11 @@ history_empty_search = "Nessun risultato (campo ricerca vuoto)" history_limits = "Limita" history_no_searches = "Attualmente non ci sono ricerche nella tua history." history_purge = "Cancella le ricerche non salvate" -history_recent_searches = "Le tue ultime ricerche" +history_recent_searches = "Ultime ricerche" history_results = "Risultati" history_save = "Salva" history_save_link = "Salva" -history_saved_searches = "Le tue ricerche" +history_saved_searches = "Ricerche salvate" history_search = "Ricerca" history_time = "Tempo" hold_available = "Pronto per il ritiro" @@ -472,6 +486,7 @@ in = "in" In This Collection = "In questa collezione" in_collection_label = "Nella collezione:" include_synonyms = "Espandi i risultati usando i sinonimi" +Index Terms = "Termini di indice" Indexes = "Indici" information = "Informazione" Institution = "Istituzione" @@ -497,9 +512,11 @@ items_added_to_bookbag = "oggetto(i) aggiunto(i) al carrello" items_already_in_bookbag = "oggetto(i) già nel carrello o che non può essere aggiunto" Journal = "Periodico" Journal Articles = "Articoli del periodico" +Journal Info = "Informazioni sulla rivista" Journal Title = "Titolo del periodico" Journals = "Periodici" Jump to = "Salta a" +just_cataloged = "Appena catalogato" Keyword = "Keyword" Keyword Filter = "Filtra Keyword" Kit = "Multimedia" @@ -509,7 +526,19 @@ Last = "Ultimo" Last Modified = "Ultima modifica" Last Name = "Cognome" less = "riduci" +libphonenumber_invalid = "Numero di telefono non valido" +libphonenumber_invalidcountry = "Prefisso internazionale non valido" +libphonenumber_invalidregion = "Prefisso non valido:" +libphonenumber_notanumber = "I caratteri immessi non sembrano essere un numero di telefono" +libphonenumber_toolong = "I caratteri immessi sono troppi per essere un numero di telefono" +libphonenumber_tooshort = "I caratteri immessi sono troppo pochi per essere un numero di telefono" +libphonenumber_tooshortidd = "Numero di telefono troppo breve dopo il prefisso internazionale" Library = "Biblioteca" +Library Card = "Tessera della biblioteca" +Library Card Deleted = "Tessera della biblioteca cancellata" +Library Card Name = "Nome della tessera della biblioteca" +Library Cards = "Tessere della biblioteca" +Library Cards Disabled = "Tessera della disabilitata" Library Catalog Password = "Password utente nel catalgo di biblioteca" Library Catalog Profile = "Profilo utente nel catalogo di biblioteca" Library Catalog Record = "Record del catalogo di biblioteca" @@ -545,6 +574,7 @@ map_results_label = "In questo luogo:" Maps = "Mappe" Media Format = "Formato" medium = "Medium" +MeSH Terms = "Termini MeSH" Message = "Messaggio" Message From Sender = "Messaggio: " Metadata Prefix = "Metadata Prefix" @@ -563,10 +593,10 @@ Most Recent Received Issues = "Ultimi fascicoli ricevuti" Multiple Call Numbers = "È presente più di una copia" Multiple Locations = "Localizzazioni multiple" Musical Score = "Musica a stampa" -My Favorites = "I miei preferiti" -My Fines = "Le mie multe" -My Holds = "Le mie prenotazioni" -My Profile = "Il mio profilo" +My Favorites = "Preferiti" +My Fines = "Multe" +My Holds = "Prenotazioni" +My Profile = "Profilo" Narrow Search = "Restringi la ricerca" navigate_back = "Indietro" Need Help? = "Serve aiuto?" @@ -657,6 +687,7 @@ Page not found. = "Pagina non trovata." Password = "Password" Password Again = "Ripeti password" Password cannot be blank = "Il campo password non può essere vuoto" +password_error_invalid = "La nuova password non è valida (contiene caratteri non validi)" password_error_not_unique = "La password non è stata cambiata" password_maximum_length = "La lunghezza massima della password è di %%maxlength%% caratteri" password_minimum_length = "La lunghezza minima della password è di %%maxlength%% caratteri" @@ -694,13 +725,17 @@ pronounced = "pronuncia" Provider = "Provider" Public = "Pubblico" Publication = "Pubblicazione" +Publication Date = "Data di pubblicazione" Publication Frequency = "Periodicità" Publication Information = "Informazioni sulla pubblicazione" Publication Type = "Tipo di pubblicazione" +Publication Year = "Anno di pubblicazione" Publication_Place = "Luogo di pubblicazione" Published = "Pubblicazione" Published in = "Pubblicato in" Publisher = "Editore" +Publisher Information = "Informazioni sull'editore" +Publisher Permissions = "Autorizzazioni dell'editore" QR Code = "Codice QR" qrcode_hide = "Nascondi Codice QR" qrcode_show = "Mostra Codice QR" @@ -829,6 +864,7 @@ sort_title = "Titolo" sort_year = "Data (discendente)" sort_year asc = "Data (ascendente)" Source = "Fonte" +Source Title = "Titolo della fonte" spell_expand_alt = "Espandi la ricerca" spell_suggest = "Cerca anche" Staff View = "MARC21" @@ -869,6 +905,7 @@ storage_retrieval_request_year = "Anno" Subcollection = "Sottocollezione" Subject = "Soggetto" Subject Area = "Area del soggetto" +Subject Geographic = "Soggetto geografico" Subject Recommendations = "Suggerimenti (Soggetto)" Subject Terms = "Soggetti" Subject(s) = "Soggetto(i)" @@ -933,6 +970,7 @@ total_resources = "Totale risorse" total_saved_items = "Totale oggetti salvati" total_tags = "Totale tag" total_users = "Totale utenti" +Transliterated Title = "Titolo translitterato" tree_search_limit_reached_html = "La tua ricerca restituisce troppi risultati per permetterti di visualizzarne l'albero. Questi sono i primi %%limit%% risultati. Per una ricerca completa clicca qui." unique_tags = "Tag unici" University Library = "Biblioteca Universitaria" @@ -946,6 +984,7 @@ Use instead = "Usa invece" User Account = "Account utente" Username = "Username" Username cannot be blank = "Il campo username non può essere lasciato vuoto" +Username is already in use in another library card = "Il nome utente è già usato in un'altra tessera della biblioteca" VHS = "VHS" Video = "Video" Video Clips = "Video" @@ -983,6 +1022,7 @@ You do not have any fines = "Non hai alcuna sanzione" You do not have any holds or recalls placed = "Non hai prenotazioni o richieste in atto" You do not have any interlibrary loan requests placed = "Non hai alcuna richiesta di prestito interbibliotecario in corso" You do not have any items checked out = "Non hai documenti in presito" +You do not have any library cards = "Non hai ancora una tessera della biblioteca" You do not have any saved resources = "Non hai nessuna risorsa salvata" You do not have any storage retrieval requests placed = "Non hai alcuna richiesta di volumi da magazzino in corso" You must be logged in first = "Entra" @@ -990,7 +1030,7 @@ Your Account = "Il tuo account" Your book bag is empty = "Il tuo carrello è vuoto" Your Checked Out Items = "I tuoi documenti in prestito" Your Comment = "Il tuo commento" -Your Favorites = "I tuoi preferiti" +Your Favorites = "Elementi salvati" Your Fines = "Le tue multe" Your Holds and Recalls = "Le tue prenotazioni e richieste" Your Lists = "Le tue liste" @@ -999,4 +1039,4 @@ Your search terms = "I tuoi termini di ricerca" Your Tags = "I tuoi tag" your_match_would_be_here = "L'oggetto della tua ricerca starebbe qui." Zip = "CAP" -zoom = "Zoom" \ No newline at end of file +zoom = "Zoom" diff --git a/languages/ja.ini b/languages/ja.ini index bfea27bf93e..071d1a3082c 100644 --- a/languages/ja.ini +++ b/languages/ja.ini @@ -3,8 +3,11 @@ ;note_785_7 = "吸収前誌" ; incomplete translation (en.ini was later revised) Abstract = "抄録" Access = "アクセス" +Access URL = "アクセスURL" +Accession Number = "受入番号" Account = "アカウント" Add = "追加" +Add a Library Card = "図書館カードの追加" Add a Note = "注記追加" Add Tag = "タグ追加" Add Tags = "タグ追加" @@ -44,11 +47,14 @@ Advanced Search = "詳細検索" advSearchError_noRights = "この検索を編集する権限がありません。セッションが切れていませんか。" advSearchError_notAdvanced = "編集指定した検索は詳細検索ではありません。" advSearchError_notFound = "指定した検索はありません。" +ajaxview_label_information = "情報" +ajaxview_label_tools = "ツール" All = "すべて" All Fields = "全フィールド" All Pages Loaded = "全ページロードされました" All Text = "すべてのテキスト" alphabrowse_matches = "結果" +alphabrowselink_html = "%%index%%を%%from%%からブラウズ" An error has occurred = "エラーが発生しました" An error occurred during execution; please try again later. = "処理中にエラーが発生しました。時間をおいて再度実行してください。" AND = "AND" @@ -76,6 +82,7 @@ Auto configuration is currently disabled = "自動設定機能は無効です" auto_configure_description = "新規インストールの場合は、VuFindの自動設定ツールを使うことによりエラーを修正出来る場合があります。" auto_configure_disabled = "自動設定機能が無効です。" auto_configure_title = "自動設定機能" +Availability = "利用の可否" Available = "利用可" Available Functionality = "利用可能な機能" Awards = "賞" @@ -196,11 +203,13 @@ Company/Entity = "会社/法人" Configuration = "設定" confirm_delete = "これを本当に削除しても良いですか?" confirm_delete_brief = "アイテムを削除しますか?" +confirm_delete_library_card_brief = "図書館カードを削除しますか?" +confirm_delete_library_card_text = "この図書館カードを本当に削除してもよろしいですか?" confirm_delete_list_brief = "リストを削除しますか?" confirm_delete_list_text = "このリストを本当に削除しても良いですか?" confirm_delete_tags_brief = "タグの削除" -confirm_dialog_no = "キャンセル" -confirm_dialog_yes = "確認" +confirm_dialog_no = "いいえ" +confirm_dialog_yes = "はい" confirm_hold_cancel_all_text = "すべての資料の予約をキャンセルしても良いですか?" confirm_hold_cancel_selected_text = "選択した資料の予約をキャンセルしても良いですか?" confirm_ill_request_cancel_all_text = "すべてのILLリクエストをキャンセルしますか?" @@ -210,9 +219,11 @@ confirm_storage_retrieval_request_cancel_all_text = "すべての所蔵検索リ confirm_storage_retrieval_request_cancel_selected_text = "選択した所蔵検索リクエストをキャンセルしますか?" conjunction_or = "OR" Contents = "コンテンツ" +Contributing Source = "貢献者情報源" Contributors = "貢献者" Copies = "部数" Copy = "所蔵" +Copyright = "著作権" Corporate Author = "団体著者" Country = "国" Course = "講義" @@ -250,12 +261,14 @@ Detailed View = "詳細表示" Details = "MARC表示" Displaying the top = "先頭に表示" Document Inspector = "ドキュメント検査機能" +Document Type = "文書タイプ" DOI = "DOI" Due = "返却日" Due Date = "返却日" DVD = "DVD" eBook = "eBook" Edit = "編集" +Edit Library Card = "図書館カードの編集" Edit this Advanced Search = "詳細検索を編集" edit_list = "リストの編集" edit_list_fail = "このリストを編集する権限がありません" @@ -341,6 +354,7 @@ Fee = "料金" Feedback = "ご意見" Feedback Email = "メールアドレス" feedback_name = "お名前" +File Description = "ファイル記述" Filter = "フィルター" filter_tags = "タグのフィルタリング" filter_wildcard = "任意" @@ -473,6 +487,7 @@ in = ":" In This Collection = "このコレクション" in_collection_label = "コレクション:" include_synonyms = "類義語を使って対象を広げる" +Index Terms = "索引語" Indexes = "索引" information = "情報" Institution = "機関" @@ -498,9 +513,11 @@ items_added_to_bookbag = "図書バッグに追加した資料" items_already_in_bookbag = "指定した資料は既に図書バッグにあるか、追加できませんでした。" Journal = "雑誌" Journal Articles = "雑誌論文" +Journal Info = "雑誌情報" Journal Title = "雑誌名" Journals = "雑誌" Jump to = "移動" +just_cataloged = "目録済" Keyword = "キーワード" Keyword Filter = "キーワードフィルター" Kit = "キット" @@ -510,7 +527,19 @@ Last = "最後" Last Modified = "最終更新日" Last Name = "姓" less = "隠す" +libphonenumber_invalid = "不正な電話番号" +libphonenumber_invalidcountry = "不正な国番号" +libphonenumber_invalidregion = "不正な局番:" +libphonenumber_notanumber = "指定された文字列は電話番号ではありません" +libphonenumber_toolong = "指定された文字列は電話番号としては長すぎます" +libphonenumber_tooshort = "指定された文字列は電話番号としては短すぎます" +libphonenumber_tooshortidd = "IDD後の電話番号が短すぎます" Library = "図書館" +Library Card = "図書館カード" +Library Card Deleted = "図書館カードは削除されました" +Library Card Name = "図書館カード名" +Library Cards = "マルチ図書館カード" +Library Cards Disabled = "マルチ図書館カード機能は無効です" Library Catalog Password = "パスワード" Library Catalog Profile = "図書館目録システムのプロフィール" Library Catalog Record = "レコードID" @@ -546,6 +575,7 @@ map_results_label = "この場所で:" Maps = "地図" Media Format = "メディアフォーマット" medium = "中" +MeSH Terms = "MeSH用語" Message = "メッセージ" Message From Sender = "送信者からのメッセージ" Metadata Prefix = "メタデータプリフィクス" @@ -564,10 +594,10 @@ Most Recent Received Issues = "最新受領資料" Multiple Call Numbers = "請求記号" Multiple Locations = "配置場所" Musical Score = "楽譜" -My Favorites = "私のお気に入り" -My Fines = "私の延滞金" -My Holds = "私の予約" -My Profile = "私のプロフィール" +My Favorites = "お気に入り" +My Fines = "延滞金" +My Holds = "予約" +My Profile = "プロフィール" Narrow Search = "絞込み検索" navigate_back = "戻る" Need Help? = "ヘルプ" @@ -658,6 +688,7 @@ Page not found. = "ページが存在しません。" Password = "パスワード" Password Again = "もう一度パスワード" Password cannot be blank = "パスワードを入力してください" +password_error_invalid = "新パスワードは不正です(不正な文字が含まれているなど)" password_error_not_unique = "パスワードは変更されませんでした" password_maximum_length = "パスワードは最大%%maxlength%%文字までです。" password_minimum_length = "パスワードは最低%%minlength%%文字必要です。" @@ -695,13 +726,17 @@ pronounced = "発音" Provider = "プロバイダ" Public = "パブリック" Publication = "出版者" +Publication Date = "出版日付" Publication Frequency = "出版頻度" Publication Information = "出版情報" Publication Type = "出版種別" +Publication Year = "出版年" Publication_Place = "出版地" Published = "出版事項" Published in = "出版年" Publisher = "出版者" +Publisher Information = "出版者情報" +Publisher Permissions = "出版者の許可" QR Code = "QRコード" qrcode_hide = "QRコードを隠す" qrcode_show = "QRコードを表示する" @@ -830,6 +865,7 @@ sort_title = "タイトル順" sort_year = "出版年降順" sort_year asc = "出版年昇順" Source = "ソース" +Source Title = "情報源タイトル" spell_expand_alt = "検索語の拡大" spell_suggest = "提案スペルによる検索" Staff View = "MARC表示" @@ -870,6 +906,7 @@ storage_retrieval_request_year = "年" Subcollection = "サブコレクション" Subject = "主題" Subject Area = "主題分野" +Subject Geographic = "地理件名" Subject Recommendations = "お勧めの主題" Subject Terms = "件名" Subject(s) = "件名" @@ -934,6 +971,7 @@ total_resources = "リソース総数" total_saved_items = "保存アイテム総数" total_tags = "タグ総数" total_users = "利用者総数" +Transliterated Title = "翻字タイトル" tree_search_limit_reached_html = "検索結果が表示可能件数を超過しました。最初の%%limit%%件を表示しています。検索結果を絞り込むには、詳細検索をご利用ください。" unique_tags = "ユニークタグ" University Library = "大学図書館" @@ -947,6 +985,7 @@ Use instead = "を見よ" User Account = "アカウント" Username = "ユーザ名" Username cannot be blank = "ユーザ名を入力してください" +Username is already in use in another library card = "このユーザ名は別の図書カードで使用されています" VHS = "VHS" Video = "ビデオ" Video Clips = "ビデオクリップ" @@ -984,6 +1023,7 @@ You do not have any fines = "延滞金はありません" You do not have any holds or recalls placed = "予約または返却請求された資料はありません" You do not have any interlibrary loan requests placed = "ILLリクエストはありません。" You do not have any items checked out = "貸出中の資料はありません" +You do not have any library cards = "図書館カードを1枚も持っていません" You do not have any saved resources = "保存した事項はありません" You do not have any storage retrieval requests placed = "所蔵検索リクエストはありませn。" You must be logged in first = "この操作にはログインが必要です" @@ -1000,4 +1040,4 @@ Your search terms = "指定した検索語" Your Tags = "指定タグ" your_match_would_be_here = "指定した語はこの位置にマッチします" Zip = "郵便番号" -zoom = "ズーム" \ No newline at end of file +zoom = "ズーム" diff --git a/languages/native.ini b/languages/native.ini index 45d014c8bb1..bd4aba0e23c 100644 --- a/languages/native.ini +++ b/languages/native.ini @@ -24,4 +24,4 @@ Slovene = "slovenščina" Spanish = "Español" Swedish = "Svenska" Turkish = "Türkçe" -Welsh = "Cymraeg" \ No newline at end of file +Welsh = "Cymraeg" diff --git a/languages/nl.ini b/languages/nl.ini index 5aeb54e8f73..82dbd69af8a 100644 --- a/languages/nl.ini +++ b/languages/nl.ini @@ -3,6 +3,8 @@ ;note_785_7 = "Samengegaan met" ; incomplete translation (en.ini was later revised) Abstract = "Samenvatting" Access = "Toegang" +Access URL = "URL naar item" +Accession Number = "Archiefnummer" Account = "Account" Add = "Toevoegen" Add a Library Card = "Voeg een bibliotheekkaart toe" @@ -45,6 +47,8 @@ Advanced Search = "Uitgebreid zoeken" advSearchError_noRights = "Helaas, je hebt geen toestemming om die zoekopdracht te veranderen. Misschien is je browser sessie afgelopen?" advSearchError_notAdvanced = "De zoekopdracht die je wil aanpassen is geen uitgebreide zoekopdracht." advSearchError_notFound = "De zoekopdracht die je vraagt, werd niet gevonden." +ajaxview_label_information = "Informatie" +ajaxview_label_tools = "Tools" All = "Alle" All Fields = "Alle velden" All Pages Loaded = "Alle pagina's zijn ingeladen" @@ -78,6 +82,7 @@ Auto configuration is currently disabled = "Automatische configuratie is momente auto_configure_description = "Als dit een nieuwe installatie is, kan het gebruik van VuFind's Auto Configure Tool het probleem misschien oplossen" auto_configure_disabled = "Automatische configuratie is uitgeschakeld." auto_configure_title = "Automatische configuratie" +Availability = "Beschikbaarheid" Available = "Beschikbaar" Available Functionality = "Beschikbare functionaliteit" Awards = "Prijzen" @@ -156,13 +161,13 @@ Cannot find record = "Record niet gevonden" Cannot find similar records = "Geen gelijkaardige records gevonden" Cassette = "Cassette" cat_establish_account = "Geef alsjeblieft de volgende gegevens in om je profiel aan te maken your account profile:" -cat_password_abbrev = "Catalogus Paswoord" +cat_password_abbrev = "Catalogus Wachtwoord" cat_username_abbrev = "Catalogus Gebruikersnaam" Catalog Login = "Catalogus aanmelding" Catalog Results = "Resultaten in de catalogus" catalog_login_desc = "Voer je bibliotheekcatalogusgegevens in" CD = "CD" -Change Password = "Verander je paswoord" +Change Password = "Verander je wachtwoord" Check Hold = "Controleer de reservering" Check Recall = "Controleer de terugroeping" Checked Out = "Uitgeleend" @@ -181,6 +186,7 @@ citation_singlepage_abbrev = "p." citation_volume_abbrev = "Vol." Cite this = "Citeren" City = "Stad" +Clear = "Wissen" clear_tag_filter = "Wis Filter" close = "Sluiten" Code = "Code" @@ -209,14 +215,16 @@ confirm_hold_cancel_all_text = "Wil je al je huidige reserveringen annuleren?" confirm_hold_cancel_selected_text = "Wil je alle geselecteerde reserveringen annuleren?" confirm_ill_request_cancel_all_text = "Wil je al je huidige IBL aanvragen ongedaan maken?" confirm_ill_request_cancel_selected_text = "Wil je al de geselecteerde IBL aanvragen ongedaan maken?" -confirm_new_password = "Bevestig Nieuw Paswoord" +confirm_new_password = "Bevestig Nieuw wachtwoord" confirm_storage_retrieval_request_cancel_all_text = "Wil je zeker al je aanvragen annuleren?" confirm_storage_retrieval_request_cancel_selected_text = "Wil je zeker je geselecteerde aanvragen annuleren?" conjunction_or = "of" Contents = "Inhoud" +Contributing Source = "Meewerkende bron" Contributors = "Medewerkers" Copies = "Kopieën" Copy = "Kopie" +Copyright = "Auteursrecht" Corporate Author = "Corporatie" Country = "Land" Course = "College" @@ -225,7 +233,7 @@ course_reserves_empty_list = "Er werden geen corresponderende Collegereservering Cover Image = "Beeld op de omslag" Create a List = "Maak een lijst" Create New Account = "Maak een nieuw account aan" -Create New Password = "Maak Nieuw Paswoord Aan" +Create New Password = "Maak Nieuw Wachtwoord Aan" Created = "Aangemaakt" Database = "Databank" Date = "Datum" @@ -254,6 +262,7 @@ Detailed View = "Gedetailleerde beschrijving" Details = "[Versie] voor personeel" Displaying the top = "De bovenkant wordt afgebeeld" Document Inspector = "Document Controleur" +Document Type = "Document Type" DOI = "DOI" Due = "Inleverdatum" Due Date = "Inleverdatum" @@ -346,6 +355,7 @@ Fee = "Bijdrage" Feedback = "Feedback" Feedback Email = "Feedback e-mail" feedback_name = "Naam" +File Description = "Bestandsbeschrijving" Filter = "Filter" filter_tags = "Filter tags" filter_wildcard = "Welke ook" @@ -360,7 +370,7 @@ First = "Eerst(e)" First Name = "Voornaam" fix_metadata = "Ja, repareer de metadata, ik wacht wel" for search = "Voor zoekopdracht" -Forgot Password = "Paswoord vergeten" +Forgot Password = "Wachtwoord vergeten" Form Submitted! = "Formulier ingediend!" Format = "Formaat" found = "gevonden" @@ -478,11 +488,12 @@ in = "in" In This Collection = "In deze collectie" in_collection_label = "In de collectie:" include_synonyms = "Verbreed de resultaten d.m.v. synoniemen" +Index Terms = "Index Termen" Indexes = "Indexen" information = "Informatie" Institution = "Instelling" Institutional Login = "Institutionele login" -institutional_login_desc = "Vul je Gebruikersnaam en Paswoord in." +institutional_login_desc = "Vul je Gebruikersnaam en Wachtwoord in." Instructor = "Instructeur" Interlibrary Loan Requests = "IBL aanvraag" Internet = "Internet" @@ -503,6 +514,7 @@ items_added_to_bookbag = "Item(s) in je boekentas gestopt" items_already_in_bookbag = "Item(s) zat(en) al in je boekentas of kon(den) niet toegevoegd worden" Journal = "Tijdschrift" Journal Articles = "Tijdschriftenartikels" +Journal Info = "Info Tijdschrift" Journal Title = "Titel tijdschrift" Journals = "Tijdschriften" Jump to = "Spring naar" @@ -529,7 +541,7 @@ Library Card Deleted = "Bibliotheekkaart Verwijderd" Library Card Name = "Bibliotheekkaart Naam" Library Cards = "Bibliotheekkaarten" Library Cards Disabled = "Bibliotheekkaarten Onbruikbaar" -Library Catalog Password = "Paswoord voor de catalogus" +Library Catalog Password = "Wachtwoord voor de catalogus" Library Catalog Profile = "Profiel van de catalogus" Library Catalog Record = "Record van de catalogus" Library Catalog Search = "Zoekopdracht catalogus" @@ -545,7 +557,7 @@ list_edit_name_required = "Lijstnaam moet worden ingegeven." load_tag_error = "Foutmelding: de Tags konden niet worden niet opgehaald" Loading = "Wordt geladen" Local Login = "Plaatselijke login" -local_login_desc = "voer je gebruikersnaam en paswoord voor deze site in." +local_login_desc = "voer je gebruikersnaam en wachtwoord voor deze site in." Located = "Locatie" Location = "Plaats" Log Out = "Uitloggen" @@ -563,6 +575,8 @@ Map View = "Kaart" map_results_label = "Op deze locatie:" Maps = "Kaarten" Media Format = "Materiaal omschrijving" +medium = "Drager" +MeSH Terms = "MeSH Termen" Message = "Bericht" Message From Sender = "Bericht van zender" Metadata Prefix = "Metadata Prefix" @@ -593,8 +607,8 @@ New Item Search = "Zoeken naar nieuw item" New Item Search Results = "Resultaten voor nieuwe items" New Items = "Nieuwe items" New Title = "Nieuwe titel" -new_password = "Nieuw paswoord" -new_password_success = "Succes! Je paswoord is aangepast." +new_password = "Nieuw wachtwoord" +new_password_success = "Succes! Je wachtwoord is aangepast." Newspaper = "Dagblad" Next = "Volgende" No citations are available for this record = "Er zijn geen citaties beschikbaar voor dit record." @@ -655,7 +669,7 @@ number_decimal_point = "," number_thousands_separator = "." OAI Server = "OAI Server" of = "van" -old_password = "Oude paswoord" +old_password = "Oude wachtwoord" On Reserve = "Gereserveerd" On Reserve - Ask at Circulation Desk = "Gereserveerd - Vraag aan de uitleenbalie" on_reserve = "Vraag aan de uitleenbalie" @@ -673,12 +687,13 @@ Other Libraries = "Andere bibliotheken" Other Sources = "Andere bronnen" Page not found. = "De pagina werd niet gevonden" Password = "Wachtwoord" -Password Again = "Nog eens je paswoord" -Password cannot be blank = "paswoord kan niet blanco zijn" -password_error_not_unique = "Het paswoord werd niet aangepast" -password_maximum_length = "Het paswoord bevat maximaal %%maxlength%% karakters" -password_minimum_length = "Het paswoord bevat minimaal %%minlength%% karakters" -Passwords do not match = "Paswoorden komen niet overeen" +Password Again = "Nog eens je wachtwoord" +Password cannot be blank = "Wachtwoord kan niet blanco zijn" +password_error_invalid = "Het wachtwoord is ongeldig (bv. bevat ongeldige karakters)" +password_error_not_unique = "Het wachtwoord werd niet aangepast" +password_maximum_length = "Het wachtwoord bevat maximaal %%maxlength%% karakters" +password_minimum_length = "Het wachtwoord bevat minimaal %%minlength%% karakters" +Passwords do not match = "Wachtwoorden komen niet overeen" Past = "Vorige" PDF Full Text = "PDF Full text" peer_reviewed = "peer reviewed" @@ -712,13 +727,17 @@ pronounced = "Uitgesproken" Provider = "Leverancier" Public = "Publiek" Publication = "Publicatie" +Publication Date = "Publicatiedatum" Publication Frequency = "Periodiciteit" Publication Information = "Publicatie info" Publication Type = "Publicatie type" +Publication Year = "Publicatiejaar" Publication_Place = "Plaats van publicatie" Published = "Gepubliceerd in" Published in = "Gepubliceerd in" Publisher = "Uitgever" +Publisher Information = "Uitgeversinformatie" +Publisher Permissions = "Uitgever Machtigingen" QR Code = "QR code" qrcode_hide = "Verberg QR code" qrcode_show = "Toon QR code" @@ -734,15 +753,15 @@ Record Count = "Aantal records" Recover Account = "Herstel je account" recovery_by_email = "Herstel met behulp van je e-mail" recovery_by_username = "Herstel met behulp van je gebruikersnaam" -recovery_disabled = "Paswoord herstellen niet geactiveerd" -recovery_email_notification = "Er werd zonet verzocht het paswoord voor account van %%bibliotheek%% te herstellen." -recovery_email_sent = "Instructies voor het herstellen van het paswoord voor deze account werden verzonden." +recovery_disabled = "Wachtwoord herstellen niet geactiveerd" +recovery_email_notification = "Er werd zonet verzocht het wachtwoord voor account van %%bibliotheek%% te herstellen." +recovery_email_sent = "Instructies voor het herstellen van het wachtwoord voor deze account werden verzonden." recovery_email_subject = "VuFind Account Herstel" -recovery_email_url_pretext = "Je kan je paswoord herstellen via deze URL: %%url%%" +recovery_email_url_pretext = "Je kan je wachtwoord herstellen via deze URL: %%url%%" recovery_expired_hash = "Deze herstellink is verlopen" recovery_invalid_hash = "Herstelling niet herkend" -recovery_new_disabled = "Je kan je paswoord op dit ogenblik niet wijzigen" -recovery_title = "Paswoord herstellen" +recovery_new_disabled = "Je kan je wachtwoord op dit ogenblik niet wijzigen" +recovery_title = "Wachtwoord herstellen" recovery_too_soon = "Teveel herstelvragen werden verzonden, probeer later opnieuw" recovery_user_not_found = "We vinden je account niet" Refine Results = "Verfijn je resultaten" @@ -847,6 +866,7 @@ sort_title = "Titel" sort_year = "Datum Aflopend" sort_year asc = "Datum Oplopend" Source = "Bron" +Source Title = "Bron Titel" spell_expand_alt = "Zoekopdracht uitbreiden" spell_suggest = "Alternatieven" Staff View = "Personeel" @@ -887,6 +907,7 @@ storage_retrieval_request_year = "Jaar" Subcollection = "Subcollectie" Subject = "Onderwerp" Subject Area = "Vakgebied" +Subject Geographic = "Onderwerpslocatie" Subject Recommendations = "Onderwerp aanbevelingen" Subject Terms = "Onderwerpstermen" Subject(s) = "Onderwerp(en)" @@ -951,6 +972,7 @@ total_resources = "Totaal aantal middelen" total_saved_items = "Totaal aantal bewaarde items" total_tags = "Totaal want. Tags" total_users = "Totaal aant. gebruikers" +Transliterated Title = "Omgezette Titel" tree_search_limit_reached_html = "Je zoekopdracht leverde teveel resultaten op om weer te geven in de boomstructuur. De eerste %%limit%% items worden getoond. Voor de volledige lijst klik hier." unique_tags = "Unieke tags" University Library = "Universiteitsbibliotheek" @@ -1019,4 +1041,4 @@ Your search terms = "Jouw zoektermen" Your Tags = "Jouw tags" your_match_would_be_here = "Hier zou je resultaat gestaan hebben." Zip = "Zip" -zoom = "Zoom" \ No newline at end of file +zoom = "Zoom" diff --git a/languages/pl.ini b/languages/pl.ini index 30153d2ec22..36cea31202d 100644 --- a/languages/pl.ini +++ b/languages/pl.ini @@ -16,7 +16,7 @@ ;Change Profile Email Text = "Następujący czytelnik zaktualizował dane osobowe" ;Change Profile Heading = "Zaktualizuj swoje dane osobowe" ;Change Profile Text = "Sprawdź dane osobowe i zaktualizuj tylko zmienione pozycje." -;Change Profile Your Data = "Twoje dotychczasowe dane osobowe" +;Change Profile Your Data = "Dotychczasowe dane osobowe" ;Change Profile Your New Data = "Zaktualizowane dane osobowe" ;Changed Profile = "Nowe dane osobowe" ;Deadline = "Termin zwrotu" @@ -27,14 +27,14 @@ ;feedback_duplicate = "Podwójny feedback. Spróbuj jeszcze raz." ;feedback_duplicate_issue = "Feedback z tym tytułem już istnieje" ;feedback_email_title = "Feedback dostarczony" -;feedback_error = "Wystąpił błąd przy wysyłaniu Twojego feedbacku. Spróbuj ponownie." +;feedback_error = "Wystąpił błąd przy wysyłaniu feedbacku. Spróbuj ponownie." ;feedback_missing = "Wypełnij wszystkie pola." -;feedback_thanks = "Dziekujemy za Twój feedback." -;feedback_update_error = "Wystąpił błąd przy wysyłaniu Twojego feedbacku." +;feedback_thanks = "Dziekujemy za feedback." +;feedback_update_error = "Wystąpił błąd przy wysyłaniu feedbacku." ;feedback_update_success = "Feedback został zaktualizowany." ;feedback_url = "Feedback URL" ;In process = "w opracowaniu" -;In transit to sublibrary= "Transfer do filii" +;In transit to sublibrary= "Transfer do filiali" ;Name = Nazwisko ;New Data = "Nowe dane osobiste czytelnika" ;no_feedback = "Nie ma feedbacku" @@ -64,8 +64,11 @@ ;note_785_7 = "Połączone z" ; incomplete translation (en.ini was later revised) Abstract = "Streszczenie" Access = "Ograniczenie dostępu" +Access URL = "URL dostępu" +Accession Number = "Numer dostępu" Account = "Konto czytelnika" Add = "Dołączyć" +Add a Library Card = "Dołącz kartę biblioteczną" Add a Note = "Dodaj adnotację" Add Tag = "Dodaj etykietę" Add Tags = "Dodaj etykiety" @@ -102,14 +105,17 @@ adv_search_toc = "Streszczenie" adv_search_year = "Rok wydania" Advanced = "Wyszukiwanie zaawansowane" Advanced Search = "Wyszukiwanie zaawansowane" -advSearchError_noRights = "Nie możesz zmienić wyszukiwania, skończyła się twoja sesja." +advSearchError_noRights = "Nie możesz zmienić wyszukiwania, skończyła się sesja." advSearchError_notAdvanced = "Nie możesz edytować wyszukiwania. Nie używasz wyszukiwania zaawansowanego." advSearchError_notFound = "Nie znaleziono żądanego wyszukiwania." +ajaxview_label_information = "Informacja" +ajaxview_label_tools = "Narzędzia" All = "wszystko" All Fields = "Wszystkie pola" All Pages Loaded = "Wszystkie strony są załadowane." All Text = "Cały tekst" alphabrowse_matches = "Rezultat" +alphabrowselink_html = "Przeglądaj zapisy według %%index%% zaczynając od %%from%%." An error has occurred = "Wystąpił błąd." An error occurred during execution; please try again later. = "Wystąpił błąd. Spróbuj później." AND = "I" @@ -132,11 +138,12 @@ Author Notes = "Dane autora" Author Results for = "Znalezieni autorzy" Author Search Results = "Rezultaty wyszukiwania według autorów" Authors = "Autorzy" -Authors Related to Your Search = "Autorzy zrelacjonowani z twoim wyszukiwaniem." +Authors Related to Your Search = "Autorzy zrelacjonowani z wyszukiwaniem." Auto configuration is currently disabled = "Autokonfiguracja jest nieaktywna." auto_configure_description = "W razie świeżej instalacji, możesz użyć narzędzie autokonfiguracji aby usunąć ten błąd." auto_configure_disabled = "Autokonfiguracja jest nieaktywna." auto_configure_title = "Autokonfiguracja" +Availability = "Dostępność" Available = "Dostępne" Available Functionality = "Operacje dostępne" Awards = "Nagrody" @@ -162,8 +169,8 @@ bookbag_email_selected = "Wyślij zaznaczone książki e-mailem" bookbag_export = "Eksportuj zaznaczone książki z listy podręcznej" bookbag_export_selected = "Eksportuj zaznaczone książki" bookbag_full = "Pełny" -bookbag_full_msg = "Twoja lista podręczna jest pełna" -bookbag_is_empty = "Twoja lista podręczna jest pusta" +bookbag_full_msg = "Lista podręczna jest pełna" +bookbag_is_empty = "Lista podręczna jest pusta" bookbag_print_selected = "Drukuj zaznaczone książki" bookbag_save = "Zapisz zaznaczone książki z listy podręcznej" bookbag_save_selected = "Zapisz zaznaczone książki" @@ -192,8 +199,8 @@ bulk_error_missing = "Brak danych. Wyszukiwanie nieudane." bulk_export_not_supported = "Zaznaczone zapisy nie stosują się do eksportu masowego." bulk_fail = "Błąd: Spróbuj jeszcze raz." bulk_noitems_advice = "Nic nie wybrałeś. Naciśnij przycisk wyboru obok zapisu i spróbuj jeszcze raz." -bulk_save_error = "Brak danych. Nie udało się zapisać Twojego wyboru." -bulk_save_success = "Twój wybór został zapisany." +bulk_save_error = "Brak danych. Nie udało się zapisać wyboru." +bulk_save_success = "Wybór został zapisany." By = "od" by = "od" By Alphabetical = "Alfabetycznie" @@ -257,6 +264,8 @@ Company/Entity = "Firma/jednostka" Configuration = "Konfiguracja" confirm_delete = "Czy chcesz to naprawdę usunąć?" confirm_delete_brief = "Usunąć?" +confirm_delete_library_card_brief = "Czy chcesz usunąć kartę biblioteczną?" +confirm_delete_library_card_text = "Czy naprawdę chcesz usunąć kartę biblioteczną?" confirm_delete_list_brief = "Usunąć listę?" confirm_delete_list_text = "Czy chcesz usunąć tę listę?" confirm_delete_tags_brief = "Usuń etykiety" @@ -271,9 +280,11 @@ confirm_storage_retrieval_request_cancel_all_text = "Czy chcesz usunąć wszystk confirm_storage_retrieval_request_cancel_selected_text = "Czy chcesz usunąć zaznaczone zamówienia magazynowe?" conjunction_or = "albo" Contents = "Treść" +Contributing Source = "Źródło przyczyniające" Contributors = "Kolejni autorzy" Copies = "Egzemplarze" Copy = "Egzemplarz" +Copyright = "Prawo autorskie" Corporate Author = "Korporacja" Country = "Kraj" Course = "Semestr" @@ -296,7 +307,7 @@ Debug Information = "Informacje Debug" del_search = "Usunąć wyszukiwanie" Delete = "Usuń" delete_all = "Usuń wszystko" -delete_comment_failure = "Błąd: Nie udało się usunąć Twojego kommentarza." +delete_comment_failure = "Błąd: Nie udało się usunąć kommentarza." delete_comment_success = "Kommentarz został usunięty." delete_list = "Usunąć listę" delete_page = "Usuń strone" @@ -311,12 +322,14 @@ Detailed View = "Szczegółowy widok" Details = "Szczegóły" Displaying the top = "Widoczne są pierwsze rezultaty" Document Inspector = "Kontroler dokumentów" +Document Type = "Typ dokumentu" DOI = "DOI" Due = "do" Due Date = "Termin zwrotu" DVD = "DVD" eBook = "E-book" Edit = "Edytuj" +Edit Library Card = "Edytuj kartę biblioteczną" Edit this Advanced Search = "Edytuj wyszukiwanie zaawansowane" edit_list = "Opracuj listę" edit_list_fail = "Nie masz odpowiednich uprawnień do opracowania tej listy." @@ -402,6 +415,7 @@ Fee = "Opłata" Feedback = "Feedback" Feedback Email = "E-mail nadawcy" feedback_name = "Nazwisko" +File Description = "Opis pliku" Filter = "filtr" filter_tags = "Filtruj etykiety" filter_wildcard = "wszystko" @@ -455,7 +469,7 @@ history_empty_search = "Cokolwiek (puste wyszukiwanie)" history_limits = "Filtry" history_no_searches = "Historia wyszukiwania jest pusta." history_purge = "Usuń wyszukiwania, które nie są zapisane." -history_recent_searches = "Twoje aktualne wyszukiwania" +history_recent_searches = "Aktualne wyszukiwania" history_results = "Rezultat" history_save = "Zapisać?" history_save_link = "Zapisz" @@ -479,7 +493,7 @@ hold_invalid_request_group = "Została podana nieważna grupa zamówienia. Spró hold_login = "Dla informacji o zamówieniu / rezerwacji" hold_place = "Zamów / zarezerwuj" hold_place_fail_missing = "Błąd: Brak danych - skontaktuj się z biblioteką." -hold_place_success_html = "Zamówienie / rezerwacja została wykonana. Twoje zamówienia." +hold_place_success_html = "Zamówienie / rezerwacja została wykonana. Zamówienia." hold_profile_html = "Aby zamówić lub rezerwować książkę, utwórz konto czytelnika." hold_queue_position = "Pozycja w kolejce" hold_request_group = "Rezerwacja z" @@ -534,11 +548,12 @@ in = "w" In This Collection = "w tej kolekcji" in_collection_label = "w kolekcji:" include_synonyms = "Rozszerz wyniki stosując synonimy" +Index Terms = "Hasło indexu" Indexes = "Indeksy" information = "Informacja" Institution = "Instytucja" Institutional Login = "Logowanie instytutycjonalne" -institutional_login_desc = "Podaj twoją nazwę użytkownika i hasło." +institutional_login_desc = "Podaj nazwę użytkownika i hasło." Instructor = "Wykładowca" Interlibrary Loan Requests = "Zamówienia międzybiblioteczne" Internet = "Internet" @@ -559,9 +574,11 @@ items_added_to_bookbag = "Zaznaczone książki zostały dołączone do listy pod items_already_in_bookbag = "Zaznaczone książki już są w liście podręcznej" Journal = "Czasopismo" Journal Articles = "Artykuł" +Journal Info = "Opis czasopisma" Journal Title = "Tytuł czasopisma" Journals = "Czasopisma" Jump to = "Skocz do" +just_cataloged = "Zapis świeżo skatalogowany" Keyword = "Słowo kluczowe" Keyword Filter = "Filtr słowa kluczowego" Kit = "Różne nośniki" @@ -571,7 +588,19 @@ Last = "Ostatnia" Last Modified = "Ostatnia zmiana" Last Name = "Nazwisko" less = "Mniej" +libphonenumber_invalid = "Numer telefonu nieważny" +libphonenumber_invalidcountry = "Numer kierunkowy kraju nieważny" +libphonenumber_invalidregion = "Numer kierunkowy nieważny" +libphonenumber_notanumber = "Podany ciąg znaków nie wydaje się numerem telefonu" +libphonenumber_toolong = "Podany ciąg znaków jest za długi aby być numerem telefonu" +libphonenumber_tooshort = "Podany ciąg znaków jest za krótki aby być numerem telefonu" +libphonenumber_tooshortidd = "Numer telefonu za kierunkowym kraju jest za krótki" Library = "Biblioteka" +Library Card = "Karta biblioteczna" +Library Card Deleted = "Karta biblioteczna została usunięta" +Library Card Name = "Nazwa karty bibliotecznej" +Library Cards = "Karty biblioteczne" +Library Cards Disabled = "Karty biblioteczne zostały wyłączone" Library Catalog Password = "Hasło" Library Catalog Profile = "Dane użytkownika" Library Catalog Record = "Rekord" @@ -607,6 +636,7 @@ map_results_label = "w tej filii:" Maps = "Mapy" Media Format = "Format medium" medium = "Książka" +MeSH Terms = "Hasło MeSH" Message = "Wiadomość" Message From Sender = "Wiadomość od nadajnika" Metadata Prefix = "Prefiks opisu" @@ -625,10 +655,10 @@ Most Recent Received Issues = "Najnowsze wydania" Multiple Call Numbers = "Sygnatury złożone" Multiple Locations = "Lokalizacje złożone" Musical Score = "Partytura" -My Favorites = "Moje listy ulubionych" -My Fines = "Moje opłaty" -My Holds = "Moje zamówienia i rezerwacje" -My Profile = "Mój profil" +My Favorites = "Listy ulubionych" +My Fines = "Opłaty" +My Holds = "Zamówienia i rezerwacje" +My Profile = "Profil" Narrow Search = "Redukuj rezultaty" navigate_back = "z powrotem" Need Help? = "Pomoc" @@ -638,7 +668,7 @@ New Item Search Results = "Rezultaty nowych nabytków" New Items = "Nowe nabytki" New Title = "Nowy tytuł" new_password = "Nowe hasło" -new_password_success = "Twoje hasło zostało zmienione" +new_password_success = "Hasło zostało zmienione" Newspaper = "Gazeta" Next = "Następna" No citations are available for this record = "Dla tego zapisu nie można stworzyć cytatu." @@ -656,7 +686,7 @@ nohit_filters = "Zastosowane filtry" nohit_heading = "Nie ma rezultatów!" nohit_no_filters = "W tym wyszukiwaniu nie zastosowałeś filtrów." nohit_parse_error = "Wystąpił problem przy wyszukiwaniu - sprawdź składnię. Jeśli nie używasz kompleksowej składni wyszukiwania, napisz parametry w cudzysłowie." -nohit_prefix = "Dla twojego wyszukiwania" +nohit_prefix = "Dla wyszukiwania" nohit_spelling = "Spróbuj zastosować inną pisownię." nohit_suffix = "Nie znaleziono tożsamości." nohit_suggest = "Możesz polepszyć wyszukiwanie usuwając słowa oraz sprawdzając ortografię." @@ -719,6 +749,7 @@ Page not found. = "Strona nie istnieje." Password = "Hasło" Password Again = "Powtórz hasło" Password cannot be blank = "Hasło nie może być spacją" +password_error_invalid = "Nowe hasło jest nieważne (n.p. zawiera nieprawidłowe znaki)" password_error_not_unique = "Hasło nie zostało zmienione" password_maximum_length = "Maksymalna długość hasła to %%maxlength%% znaków" password_minimum_length = "Minimalna długość hasła to %%minlength%% znaków" @@ -751,18 +782,22 @@ print_selected = "Drukuj zaznaczone elementy" Private = "Prywatne" Production Credits = "Dane produkcji" Profile = "Profil" -profile_update = "Twoje dane osobiste zostały zmienione" +profile_update = "Dane osobiste zostały zmienione" pronounced = "Wymówiono" Provider = "Dostawca" Public = "Publiczne" Publication = "Wydawnictwo" +Publication Date = "Data wydania" Publication Frequency = "Sposób wydania" Publication Information = "Informacje bibliograficzne" Publication Type = "Typ publikacji" +Publication Year = "Rok wydania" Publication_Place = "Miejsce wydania" Published = "Wydane" Published in = "Wydane w" Publisher = "Wydawnictwo" +Publisher Information = "Informacje o wydawnictwie" +Publisher Permissions = "Pozwolenia wydawnictwa" QR Code = "kod QR" qrcode_hide = "schowaj kod QR" qrcode_show = "pokaż kod QR" @@ -788,7 +823,7 @@ recovery_invalid_hash = "Link do odzyskania hasła nie został rozpoznany" recovery_new_disabled = "Nie możesz zmienić hasła w tym momencie" recovery_title = "Odzyskanie hasła" recovery_too_soon = "Wysłano za dużo żądań odzyskania. Spróbuj później" -recovery_user_not_found = "Nie znaleźliśmy twojego konta" +recovery_user_not_found = "Nie znaleźliśmy takiego konta" Refine Results = "Redukuj rezultaty" Region = "Region" Related Author = "Podobni autorzy" @@ -861,7 +896,7 @@ select_pickup_location = "Wybierz miejsce odebrania" select_request_group = "Wybierz grupę zamówienia" Selected = "Wybrane" Send = "wyślij" -Send us your feedback! = "Wyślij nam Twój feedback!" +Send us your feedback! = "Wyślij nam feedback!" send_an_email_copy = "Wyślij kopię na ten adres" send_email_copy_to_me = "Wyślij kopię do mnie" Sensor Image = "Czujnik obrazu" @@ -891,6 +926,7 @@ sort_title = "Tytuł" sort_year = "Według najnowszych" sort_year asc = "Według najstarszych" Source = "Źródło" +Source Title = "Tytuł źródła" spell_expand_alt = "Wyszukiwanie zaawansowane" spell_suggest = "Inne możliwości wyszukiwania" Staff View = "Wersja MARC" @@ -931,6 +967,7 @@ storage_retrieval_request_year = "Rok" Subcollection = "Część zbioru" Subject = "Hasło przedmiotowe" Subject Area = "Pole hasła przedmiotowego" +Subject Geographic = "Hasło geograficzne" Subject Recommendations = "Rekomendacja hasła przedmiotowego" Subject Terms = "Hasła" Subject(s) = "Hasło Subject(s)" @@ -964,10 +1001,10 @@ test_fail = "Test się nie udał." test_fix = "naprawione" test_ok = "OK" Text this = "Wyślij wiadomość" -Thank you for your feedback. = "Dziękujemy za Twój feedback." +Thank you for your feedback. = "Dziękujemy za feedback." That email address is already used = "Ten e-Mail już jest w bazie" That username is already taken = "Podana nazwa użytkownika jest już zajęta" -The record you selected is not part of any of your lists. = "Wybrany zapis nie znajduje się na żadnej z twoich list." +The record you selected is not part of any of your lists. = "Wybrany zapis nie znajduje się na żadnej liście." The record you selected is not part of the selected list. = "Wybrany zapis nie znajduje się na tej liście." The system is currently unavailable due to system maintenance = "Z powodu przeglądu technicznego system jest niedostępny." Theme = "Layout" @@ -995,19 +1032,21 @@ total_resources = "Suma zasobów" total_saved_items = "Suma zapisanych pozycji" total_tags = "Suma etykiet" total_users = "Suma użytkowników" -tree_search_limit_reached_html = "Twoje wyszukiwanie wykazało za dużo rezultatów aby pokazać całą hierarchię. Widoczne jest %%limit%% rezultatów. Aby zobaczyć wszystkie wyniki, kliknij tutaj." +Transliterated Title = "Tytuł transliterowany" +tree_search_limit_reached_html = "Wyszukiwanie wykazało za dużo rezultatów aby pokazać całą hierarchię. Widoczne jest %%limit%% rezultatów. Aby zobaczyć wszystkie wyniki, kliknij tutaj." unique_tags = "Niepowtarzalne etykiety" University Library = "Biblioteka Uniwersytecka" Unknown = "Nieznany" unrecognized_facet_label = "inne" Upgrade VuFind = "Aktualizacja oprogramowania Vufind" -upgrade_description = "Za pomocą tego narzędzia możesz utrzymać twoje ustawienia przy aktualizacji z wcześniejszej wersji Vufind." +upgrade_description = "Za pomocą tego narzędzia możesz utrzymać ustawienia przy aktualizacji z wcześniejszej wersji Vufind." URL = "URL" Use for = "Użyj do" Use instead = "Użyj zamiast" User Account = "Konto czytelnika" Username = "Nazwa użytkownika" Username cannot be blank = "Nazwa użytkownika nie może być spacją" +Username is already in use in another library card = "Nazwa użytkownika już istnieje" VHS = "VHS" Video = "Wideo" Video Clips = "Wideoclips" @@ -1045,20 +1084,21 @@ You do not have any fines = "Nie masz opłat na twoim koncie" You do not have any holds or recalls placed = "Nie masz zamówień" You do not have any interlibrary loan requests placed = "Nie masz zamówień międzybibliotecznych" You do not have any items checked out = "Nie masz wypożyczonych książek" +You do not have any library cards = "Nie posiadasz karty bibliotecznej" You do not have any saved resources = "Nie masz zapisanych książek" You do not have any storage retrieval requests placed = "Nie masz zamówień magazynowych" You must be logged in first = "Najpierw się zaloguj" -Your Account = "Twoje konto czytelnika" -Your book bag is empty = "Twoja lista podręczna jest pusta" -Your Checked Out Items = "Twoje wypożyczone książki" -Your Comment = "Twoje komentarze" -Your Favorites = "Twoje ulubione książki" -Your Fines = "Twoje opłaty" -Your Holds and Recalls = "Twoje zamówienia" -Your Lists = "Twoje listy" -Your Profile = "Twoje dane osobiste" +Your Account = "Konto czytelnika" +Your book bag is empty = "Lista podręczna jest pusta" +Your Checked Out Items = "Wypożyczone książki" +Your Comment = "Komentarze" +Your Favorites = "Ulubione książki" +Your Fines = "Opłaty" +Your Holds and Recalls = "Zamówienia" +Your Lists = "Listy" +Your Profile = "Dane osobiste" Your search terms = "Twoje hasła" Your Tags = "Twoje etykiety" -your_match_would_be_here = "Twoja tożsamość byłaby tutaj." +your_match_would_be_here = "Tożsamość byłaby tutaj." Zip = "Kod pocztowy" -zoom = "Powiększ" \ No newline at end of file +zoom = "Powiększ" diff --git a/languages/pt-br.ini b/languages/pt-br.ini index 9400f502210..e05ab05a7c0 100644 --- a/languages/pt-br.ini +++ b/languages/pt-br.ini @@ -1,20 +1,22 @@ ; For future reference: ;Brazilian Portugese = "Português (Brasil)" -;note_785_7 = "Juntado com" ; incomplete translation (en.ini was later revised) Abstract = "Resumo" Access = "Acesso" +Access URL = "Acessar a URL" +Accession Number = "Número de chamada" Account = "Conta" Add = "Adicionar" +Add a Library Card = "Adicionar Cartão de Biblioteca" Add a Note = "Adicionar uma nota" Add Tag = "Adicionar Tag" Add Tags = "Adicionar Tags" Add to another list = "Adicionar a outra lista" Add to Book Bag = "Adicionar à cesta" -Add to favorites = "Adic. favoritos" +Add to favorites = "Salvar na lista" Add your comment = "Adicionar comentário" -add_comment_fail_blank = "O Comentário não pode estar em branco." +add_comment_fail_blank = "O comentário não pode estar em branco." add_comment_success = "Comentário adicionado." -add_favorite_fail = "Erro: Registro não foi salvo" +add_favorite_fail = "Erro: registro não foi salvo" add_favorite_prefix = "Adicionar" add_favorite_suffix = "aos favoritos" add_list_fail = "Erro: Lista não criada" @@ -22,7 +24,7 @@ add_other_libraries = "Inclua artigos em outras bibliotecas" add_search = "Adicionar campo de busca" add_search_group = "Adicionar Grupo de Busca" add_tag_error = "Erro: Não foi possível salvar as Tags" -add_tag_note = "Tags separadas por espaço. Use aspas para tags com várias palavras"." +add_tag_note = "Tags separadas por espaço. Use aspas para tags com várias palavras." add_tag_success = "Tags guardadas" Address = "Endereço" adv_search_all = "Todos os campos" @@ -44,13 +46,16 @@ Advanced Search = "Busca Avançada" advSearchError_noRights = "Desculpe, você não tem permissão para editar a busca. Talvez a sua sessão tenha expirado?" advSearchError_notAdvanced = "A busca que solicitou a edição não é uma busca avançada." advSearchError_notFound = "A busca que solicitou não foi encontrada." +ajaxview_label_information = "Informação" +ajaxview_label_tools = "Ferramentas" All = "Todos" All Fields = "Todos os campos" All Pages Loaded = "Todas as páginas carregadas" All Text = "TODO Texto" -alphabrowse_matches = "Títulos" +alphabrowse_matches = "Resultados" +alphabrowselink_html = "Visualizar entradas pelo %%index%% iniciando com %%from%%." An error has occurred = "Erro na aplicação" -An error occurred during execution; please try again later. = "Um erro ocorreu durante a execução: por favor, tente mais tarde." +An error occurred during execution; please try again later. = "Ocorreu um erro durante a execução; por favor, tente novamente mais tarde." AND = "E" anonymous_tags = "Tags anônimas" APA Citation = "Citação norma APA" @@ -73,19 +78,20 @@ Author Search Results = "Resultados da busca por Autor" Authors = "Autores" Authors Related to Your Search = "Autores relacionados com a sua busca" Auto configuration is currently disabled = "A configuração automática está desativada" -auto_configure_description = "Se esta é uma nova instalação, pode-se corrigir o erro usando a ferramenta de auto-configuração do VuFind" +auto_configure_description = "Se esta é uma nova instalação, pode-se corrigir o erro usando a ferramenta de auto-configuração do VuFind." auto_configure_disabled = "Configuração automática desativada." auto_configure_title = "Auto-configuração" +Availability = "Disponibilidade" Available = "Disponível" Available Functionality = "Funcionalidade disponível" Awards = "Prémios" Back to Record = "Voltar ao registro" Back to Search Results = "Voltar à lista de resultados" Backtrace = "Caminho" -Bag = "Cesta" +Bag = "Cesto" Balance = "Balanço" basic_search_keep_filters = "Restringir a busca atual / manter filtros" -Be the first to leave a comment = "Seja o primeiro a compartilhar um comentário" +Be the first to leave a comment = "Seja o primeiro a deixar um comentário" Be the first to tag this record = "seja o primeiro a adicionar uma tag" Bibliographic Details = "Detalhes bibliográficos" Bibliography = "Bibliografia" @@ -106,9 +112,9 @@ bookbag_is_empty = "a sua cesta está vazia" bookbag_print_selected = "Imprimir os selecionados" bookbag_save = "Gravar os registros da sua cesta numa lista de favoritos" bookbag_save_selected = "Gravar os registros selecionados" -Bookmark = "Salvar/Compartilhar" +Bookmark = "Salvar/Partilhar" Books = "Livros" -Borrowing Location = "Local de Emprestimo" +Borrowing Location = "Local Empréstimo" Braille = "Braille" Brief View = "Visão Breve" Browse = "Navegar" @@ -120,7 +126,7 @@ Browse the Collection = "Navegar a coleção" Browse the Collection Alphabetically = "Navegar a coleção por ordem alfabética" browse_author = "Autor" browse_dewey = "CDU (Dewey)" -browse_format = "Grau" +browse_format = "Formato" browse_lcc = "Call Number (LC)" browse_publishDate = "Ano de Publicação" browse_title = "Título" @@ -134,7 +140,7 @@ bulk_noitems_advice = "Nenhum item foi selecionado. Por favor, clique na caixa d bulk_save_error = "Alguns dados estavam faltando. Os seus registros não foram salvos." bulk_save_success = "O(s) registro(s) foram salvos com sucesso" By = "Por" -by = "Por" +by = "por" By Alphabetical = "Por ordem alfabética" By Author = "Autores" By Call Number = "Por Área" @@ -180,7 +186,7 @@ citation_volume_abbrev = "Vol." Cite this = "Citar" City = "Cidade" clear_tag_filter = "Limpar filtro" -close = "Fechar" +close = "fechar" Code = "Código" Collection = "Coleção" Collection Browse = "Navegar na Coleção" @@ -196,11 +202,13 @@ Company/Entity = "Companhia/Entidade" Configuration = "Configuração" confirm_delete = "Tem certeza que quer apagar este usuário?" confirm_delete_brief = "Apagar registro?" +confirm_delete_library_card_brief = "Remover Cartão de Biblioteca Library Card?" +confirm_delete_library_card_text = "Tem certeza que deseja remover este cartão de biblioteca?" confirm_delete_list_brief = "Apagar a Lista?" confirm_delete_list_text = "Tem certeza que quer apagar esta lista?" confirm_delete_tags_brief = "Deletar tags" -confirm_dialog_no = "Cancelar" -confirm_dialog_yes = "Confirmar" +confirm_dialog_no = "Não" +confirm_dialog_yes = "Sim" confirm_hold_cancel_all_text = "Deseja cancelar todas as suas reservas?" confirm_hold_cancel_selected_text = "Deseja cancelar as reservas selecionadas?" confirm_ill_request_cancel_all_text = "Deseja cancelar todas as requisições de débitos interbibliotecas?" @@ -210,9 +218,11 @@ confirm_storage_retrieval_request_cancel_all_text = "Deseja cancelar toda as req confirm_storage_retrieval_request_cancel_selected_text = "Deseja cancelar as requisições de recuperação armazenadas selecionadas?" conjunction_or = "ou" Contents = "Conteúdos" +Contributing Source = "Fonte contribuidora" Contributors = "Colaboradores" Copies = "Cópias" -Copy = "Cód. Barras:" +Copy = "Cópia" +Copyright = "Copyright" Corporate Author = "Autor Corporativo" Country = "País" Course = "Curso" @@ -250,12 +260,14 @@ Detailed View = "Visão Detalhada" Details = "Registro fonte" Displaying the top = "Primeiros resultados" Document Inspector = "Inspetor de documentos" +Document Type = "Tipo de documento" DOI = "DOI" Due = "Fim do empréstimo" Due Date = "Data fim do empréstimo" DVD = "DVD" -eBook = "livro electrônico" +eBook = "livro eletrônico" Edit = "Editar" +Edit Library Card = "Editar Cartão de Biblioteca" Edit this Advanced Search = "Editar a Busca Avançada" edit_list = "Editar a Lista" edit_list_fail = "Desculpe, você não tem permissão para editar esta lista" @@ -271,7 +283,7 @@ eds_limiter_FT = "Texto Completo" eds_limiter_FT1 = "Disponível no Catálogo da Biblioteca" eds_limiter_RV = "Revisado pelos Pares" eds_mode_all = "Encontrar todos os termos buscados" -eds_mode_any = "Encontrat algum dos termos" +eds_mode_any = "Encontrar algum dos termos" eds_mode_bool = "Booleano/frase" eds_mode_smart = "Busca com algorítmo SmartText" eds_modes_and_expanders = "Modos de Busca e expansores" @@ -293,12 +305,12 @@ email_subject = "Assunto" email_success = "Mensagem Enviada" Empty = "Esvaziar" Empty Book Bag = "Esvaziar a cesta" -Enable Auto Config = "Ativar Auto Config" +Enable Auto Config = "Activar Auto Config" End Page = "Última página" Era = "Período" -error_inconsistent_parameters = "Desculpe, ocorreu um erro. Identificamos alguns parâmetros inconsistentes." +error_inconsistent_parameters = "Desculpe, ocorreu um erro. Detectados alguns parâmetros inconsistentes." error_page_parameter_list_heading = "Parâmetros de pedido" -Exception = "Exceção" +Exception = "Excepção" Excerpt = "Excerto" exclude_facet = "[excluir]" exclude_newspapers = "Excluir os artigos de jornal" @@ -324,10 +336,10 @@ export_success = "Exportação concluída" export_unsupported_format = "Formato de exportação não suportado" FAQs = "FAQs" fav_delete = "Apagar os Favoritos selecionados" -fav_delete_deleting = "Os Favoritos selecionados serão apagados"." +fav_delete_deleting = "Os Favoritos selecionados serão apagados." fav_delete_fail = "Desculpe, ocorreu um erro. Os seu(s) favorito(s) não foram apagados." fav_delete_missing = "Alguns dados foram perdidos. Os seu(s) favorito(s) não foram apagados." -fav_delete_success = "Favorito)s) apagado(s)." +fav_delete_success = "Favorito(s) apagado(s)." fav_delete_warn = "Você está prestes a apagar os favoritos a partir de todas as suas listas - Se você quiser apagar favoritos a partir de uma lista específica, selecione a lista antes de clicar em apagar." fav_email_fail = "Desculpe, ocorreu um erro. Favorito (s) não enviado(s) por e-mail." fav_email_missing = "Alguns dados foram perdidos. Favorito (s) não enviado(s) por e-mail." @@ -336,11 +348,12 @@ fav_export = "Exportar Favoritos" fav_list_delete = "Lista de favoritos apagada" fav_list_delete_cancel = "Lista não apagada" fav_list_delete_fail = "Desculpe, ocorreu um erro. Lista não eliminada." -Favorites = "Favoritos" +Favorites = "Itens Guardados" Fee = "Multas" Feedback = "Comentário" Feedback Email = "E-mail" feedback_name = "Nome" +File Description = "Descrição de arquivo" Filter = "Filtro" filter_tags = "Tags de filtro" filter_wildcard = "Qualquer" @@ -355,8 +368,8 @@ First = "Primeiro" First Name = "Primeiro nome" fix_metadata = "Sim, corrigir os metadados, eu espero" for search = "para a busca" -Forgot Password = "Esqueci a Senha" -Form Submitted! = "Comentário enviada!" +Forgot Password = "Esqueceu sua senha" +Form Submitted! = "Comentário enviado!" Format = "Formato" found = "Encontrado" From = "De" @@ -381,7 +394,7 @@ Has Illustrations = "Possui ilustrações" Help = "Ajuda" Help with Advanced Search = "Ajuda com a Busca Avançada" Help with Search Operators = "Ajuda com Operadores de busca" -help_page_missing = "A página de ajuda requerinda não existe." +help_page_missing = "A página de ajuda solicitada não existe." hierarchy_hide_tree = "Ocultar toda a hierarquia" hierarchy_show_tree = "Mostrar a Hierarquia completa" hierarchy_tree = "Contexto" @@ -405,7 +418,7 @@ hold_available = "Disponível para levantamento" hold_cancel = "Cancelar a reserva" hold_cancel_all = "Cancelar todas as reservas" hold_cancel_fail = "A sua reserva não foi cancelada; por favor, contate o Balcão de Atendimento para ajuda adicional" -hold_cancel_selected = "Cancelar as reservas selecionadas " +hold_cancel_selected = "Cancelar as reservas selecionadas" hold_cancel_success = "A sua reserva foi cancelada com sucesso" hold_cancel_success_items = "reserva(s) foram canceladas com sucesso" hold_date_invalid = "Por favor, introduza uma data válida" @@ -419,7 +432,7 @@ hold_login = "para informação da reserva e levantamento" hold_place = "Reservar" hold_place_fail_missing = "O seu pedido não foi bem sucedido: é necessário introduzir mais dados; por favor, contate o Balcão de Atendimento para ajuda adicional" hold_place_success_html = "O seu pedido foi salvo com sucesso. As suas Reservas e Pedidos." -hold_profile_html = "Para reservas e devoluções, por favor estabelecer sua Perfil no Catálogo da Biblioteca." hold_queue_position = "Posição na fila" hold_request_group = "Pedido de" hold_requested_group = "Requisitado por" @@ -444,8 +457,8 @@ ill_request_cancel_success_items = "reserva(s) foram canceladas com sucesso" ill_request_canceled = "Cancelado" ill_request_check_text = "Checar Pedido de Débito Interbiblioteca" ill_request_comments = "Comentários" -ill_request_date_invalid = "Por favor, introduza uma data válida" -ill_request_date_past = "Por favor, introduza uma data no futuro" +ill_request_date_invalid = "Por favor, insira uma data válida" +ill_request_date_past = "Por favor, insira uma data no futuro" ill_request_empty_selection = "Nenhum pedido de débito interbiblioteca foi selecionado" ill_request_error_blocked = "Não possui privilégios suficiente para colocar um pedido de débito interbiblioteca para este item" ill_request_error_fail = "O seu pedido não foi bem sucedido; por favor, contate o Balcão de Atendimento para ajuda adicional" @@ -464,15 +477,16 @@ ill_request_submit_text = "Colocar Pedido" Illustrated = "Ilustrado" ils_offline_holdings_message = "A informação da disponibilidade do(s) exemplar(es) não está disponível de momento; por favor, aceite as nossas desculpas por qualquer inconveniente que isso possa causar e contate-nos para obter ajuda:" ils_offline_home_message = "Os dados da sua conta e informação em tempo real de existências dos itens não estão disponíveis de momento; por favor, aceite as nossas desculpas por qualquer inconveniente que isso possa causar e contate-nos para obter assistência:" -ils_offline_login_message = "Os dados da sua conta estarão indisponíveis durante este tempo Por favor, aceitem nossas desculpas por qualquer inconveniente que isso possa causar e contate-nos para obter assistência:." +ils_offline_login_message = "Os dados da sua conta estarão indisponíveis durante este tempo Por favor, aceitem nossas desculpas por qualquer inconveniente que isso possa causar e contate-nos para obter assistência:" ils_offline_status = "O sistema está em manutenção." ils_offline_title = "Sistema em Manutenção" Import Record = "Importar Registro" Import to = "Importar para" -in = "Em" +in = "em" In This Collection = "Nesta coleção" in_collection_label = "Na coleção:" include_synonyms = "Expandir resultados utilizando sinônimos" +Index Terms = "Indexar termos" Indexes = "Índices" information = "Informações" Institution = "Recursos" @@ -498,9 +512,11 @@ items_added_to_bookbag = "registro(s) adicionado(s) à cesta" items_already_in_bookbag = "registro(s) já estava(m) na cesta" Journal = "Periódico" Journal Articles = "Artigos de Periódicos" +Journal Info = "Informação de periódico" Journal Title = "Título do Periódico" Journals = "Periódicos" Jump to = "Ir para" +just_cataloged = "Já Catalogado" Keyword = "Palavra-chave" Keyword Filter = "Filtrar por palavras-chave" Kit = "Kit" @@ -510,7 +526,19 @@ Last = "Último" Last Modified = "Última modificação" Last Name = "Sobrenome" less = "menos" +libphonenumber_invalid = "Número de telefone inválido" +libphonenumber_invalidcountry = "Código telefônico de país inválido" +libphonenumber_invalidregion = "Código de região inválido (DDD):" +libphonenumber_notanumber = "A informação fornecida não se assemelha a um número telefônico" +libphonenumber_toolong = "A informação fornecida é muito longa para ser um número telefônico" +libphonenumber_tooshort = "A informação fornecida é muito curta para ser um número telefônico" +libphonenumber_tooshortidd = "O número telefônico é muito curto depois do DDI" Library = "Fonte" +Library Card = "Cartão de Biblioteca" +Library Card Deleted = "Cartão de Biblioteca Removido" +Library Card Name = "Nome do Cartão de BibliotecaLibrary Card Name" +Library Cards = "Cartões de Biblioteca" +Library Cards Disabled = "Cartão de Biblioteca desativado" Library Catalog Password = "Senha do Catálogo da Biblioteca" Library Catalog Profile = "Perfil no Catálogo da Biblioteca" Library Catalog Record = "Registro no Catálogo da Biblioteca" @@ -528,7 +556,7 @@ load_tag_error = "Erro: não foi possível carregar as Tags" Loading = "Carregando" Local Login = "Login local" local_login_desc = "Entre com o usuário e senha criado neste site." -Located = "Localização" +Located = "Localizado" Location = "Localização" Log Out = "Sair" Login = "Entrar" @@ -546,6 +574,7 @@ map_results_label = "Neste local:" Maps = "Mapas" Media Format = "Formato da Mídia" medium = "Médio" +MeSH Terms = "Termos DeCS" Message = "Mensagem" Message From Sender = "Remetente" Metadata Prefix = "Prefixo de Metadados" @@ -564,10 +593,10 @@ Most Recent Received Issues = "Números recebidos recentemente" Multiple Call Numbers = "Vários números de telefone" Multiple Locations = "Múltiplos locais" Musical Score = "Partitura" -My Favorites = "Os meus favoritos" -My Fines = "As minha multas" -My Holds = "As minhas reservas" -My Profile = "O meu perfil" +My Favorites = "Favoritos" +My Fines = "Multas" +My Holds = "Reservas" +My Profile = "Perfil" Narrow Search = "Refinar a Busca" navigate_back = "Voltar" Need Help? = "Precisa de ajuda?" @@ -585,7 +614,7 @@ No Cover Image = "Imagem de Sem Capa" No dependency problems found = "Não há problemas de dependência" No excerpts were found for this record. = "Não foram encontrados excertos para este registro." No library account = "Sem conta na Biblioteca" -No new item information is currently available. = "Informação de novos registros não disponível de momento"." +No new item information is currently available. = "Informação de novos registros não disponível de momento." No Preference = "Sem preferência" No reviews were found for this record = "Este registro não tem comentários inseridos" No Tags = "Sem tags" @@ -634,8 +663,8 @@ note_785_7 = "Mesclado com / Formulário" note_785_8 = "Mudou de volta ao" Notes = "Observações" Number = "Número" -number_decimal_point = "," -number_thousands_separator = "." +number_decimal_point = "." +number_thousands_separator = "," OAI Server = "Servidor OAI" of = "de" old_password = "Senha Antiga" @@ -654,13 +683,14 @@ Other Authors = "Outros Autores" Other Editions = "Outras Edições" Other Libraries = "Outras Bibliotecas" Other Sources = "Outras Fontes" -Page not found. = "Págian não encontrada." +Page not found. = "Página não encontrada." Password = "Senha" Password Again = "Senha, novamente" Password cannot be blank = "A senha não pode estar em branco" +password_error_invalid = "Nova senha é inválida (ex: contêm caracteres inválidos)" password_error_not_unique = "Senha não foi alterada" -password_maximum_length = "O tamnaho máximo da senha é de %%maxlength%% caracteres" -password_minimum_length = "O tamanho mínomo da senha é de %%minlength%% caracteres" +password_maximum_length = "O tamanho máximo da senha é %%maxlength%% caracteres" +password_minimum_length = "O tamanho mínimo da senha é %%minlength%% caracteres" Passwords do not match = "As senhas não coincidem." Past = "Últimos" PDF Full Text = "Texto Completo em Formato PDF" @@ -669,7 +699,7 @@ peer_reviewed_limit = "Limitar a artigos de revistas e jornais" Phone Number = "Número do Telefone" Photo = "Foto" Physical Description = "Descrição Física" -Physical Object = "Objecto físico" +Physical Object = "Objeto físico" pick_up_location = "Local de levantamento" Place a Hold = "Localização" Playing Time = "Duração" @@ -677,7 +707,7 @@ Please check back soon = "Por favor, volte em breve" Please contact the Library Reference Department for assistance = "Por favor contate o Serviço de Referência da Biblioteca para mais ajuda" Please enable JavaScript. = "Por favor ative o JavaScript no seu browser." Please upgrade your browser. = "Por favor atualize seu browser." -Posted by = "Compartilhado por" +Posted by = "Postado por" posted_on = "em" Preferences = "Preferências" Preferred Library = "Biblioteca Preferedida" @@ -691,17 +721,21 @@ Private = "Privada" Production Credits = "Créditos de produção" Profile = "Descrição" profile_update = "O seu perfil foi atualizado" -pronounced = "declarado" +pronounced = "pronunciado" Provider = "Fornecedor" Public = "Pública" Publication = "Publicação" +Publication Date = "Data de Publicação" Publication Frequency = "Regularidade de publicação" Publication Information = "Informação da Publicação" Publication Type = "Tipo de Publicação" +Publication Year = "Ano de Publicação" Publication_Place = "Place of Publication" Published = "Publicado em" Published in = "Publicado no" Publisher = "Editor" +Publisher Information = "Informação da Editora" +Publisher Permissions = "Permissão de Edição" QR Code = "Código QR (código de barras bidimensional)" qrcode_hide = "Esconder o código QR" qrcode_show = "Mostrar o código QR" @@ -714,7 +748,7 @@ Recall This = "Reservar" recaptcha_not_passed = "Código CAPTCHA não coincidiu" Record Citations = "Citações do registro" Record Count = "Número de Registros" -Recover Account = "Recuperar conta" +Recover Account = "Recuperar Conta" recovery_by_email = "Recuperar por email" recovery_by_username = "Recuperar pela identificação do usuário" recovery_disabled = "Recuperação de senha não disponível" @@ -788,7 +822,7 @@ search_groups = "Grupos de Busca" search_match = "correspondência da busca" search_NOT = "NENHUM termo" search_OR = "QUALQUER Termo" -search_save_success = "Busca gurdada com sucesso." +search_save_success = "Busca guardada com sucesso." search_unsave_success = "Busca guardada apagada com sucesso." seconds_abbrev = "s" see all = "Ver todos" @@ -809,8 +843,8 @@ Series = "coleção" Set = "Definir" Showing = "A mostrar" Similar Items = "Registros relacionados" -Skip to content = "Pular conteúdo" -skip_confirm = "Tem certeza de que quer saltar esta etapa?" +Skip to content = "Pular para o conteúdo" +skip_confirm = "Tem certeza de que quer pular esta etapa?" skip_fix_metadata = "Não corrigir os metadados no momento." skip_step = "Saltar esta etapa" Slide = "Slides" @@ -830,6 +864,7 @@ sort_title = "Título" sort_year = "Data Descendente" sort_year asc = "Data Ascendente" Source = "Fonte" +Source Title = "Título Fonte" spell_expand_alt = "Expandir a Busca" spell_suggest = "Buscas alternativas" Staff View = "Registro fonte" @@ -850,10 +885,10 @@ storage_retrieval_request_cancel_success_items = "reserva(s) foram canceladas co storage_retrieval_request_canceled = "Cancelado" storage_retrieval_request_check_text = "Checar Pedido de Recuperação Armazenado" storage_retrieval_request_comments = "Comentários" -storage_retrieval_request_date_invalid = "Por favor, introduza uma data válida" -storage_retrieval_request_date_past = "Por favor, introduza uma data no futuro" +storage_retrieval_request_date_invalid = "Por favor, insira uma data válida" +storage_retrieval_request_date_past = "Por favor, insira uma data no futuro" storage_retrieval_request_empty_selection = "Nenhum pedido de recuperação armazenado foi selecionado" -storage_retrieval_request_error_blocked = "Não possui privilégios suficientes para colocar um pedido de recuperação armazenada neste item" +storage_retrieval_request_error_blocked = "Não possui privilégios suficientes para colocar um pedido de recuperação armazenamento neste item" storage_retrieval_request_error_fail = "O seu pedido não foi bem sucedido; por favor, contate o Balcão de Atendimento para ajuda adicional" storage_retrieval_request_invalid_pickup = "Não introduziu um local de levantamento válido; por favor, tente novamente" storage_retrieval_request_issue = "Data" @@ -870,6 +905,7 @@ storage_retrieval_request_year = "Ano" Subcollection = "Subcoleção" Subject = "Assunto" Subject Area = "Área / Assunto" +Subject Geographic = "Informações Geograficas" Subject Recommendations = "Recomendações de Assuntos" Subject Terms = "Termos do Assunto" Subject(s) = "Assunto(s)" @@ -885,8 +921,8 @@ Supplied by Amazon = "Fornecido pela Amazon" Switch view to = "Alterar a visualização para" switchquery_intro = "Você pode obter mais resultados ajustando o argumento de busca." switchquery_lowercasebools = "Caso esteja tentando utilizar os operadores booleanos, deve escrevê-los em Letras MAIÚSCULAS" -switchquery_truncatechar = "Restinja sua busca para obter maiores resultados" -switchquery_unwantedbools = "As palavras AND, OR e NOT pode ocasionar problemas na busca; tente utilizar as aspas" +switchquery_truncatechar = "Reduza sua consulta de pesquisa para ampliar seus resultados" +switchquery_unwantedbools = "As palabras AND, OR e NOT pode ocasionar problemas na busca; tente utilizar as aspas" switchquery_unwantedquotes = "Remover as aspas pode possibilitar buscas mais amplas" switchquery_wildcard = "Adicionar um caractere curinga pode recuperar variações da palavra buscada" System Unavailable = "Sistema indisponível" @@ -934,7 +970,8 @@ total_resources = "Total Resources" total_saved_items = "Total de itens salvados" total_tags = "Total de tags" total_users = "Total de Usuários" -tree_search_limit_reached_html = "A sua busca devolveu muitos resultados para mostrar em árvore. Mostrando apenas o primeiro %%limit%% registros. Para uma busca completa clique aqui." unique_tags = "Tags únicas" University Library = "Biblioteca Universitária" Unknown = "online" @@ -947,6 +984,7 @@ Use instead = "Use" User Account = "conta do usuário" Username = "Login" Username cannot be blank = "O login não pode estar em branco" +Username is already in use in another library card = "Identificação já utilizada em outro cartão de biblioteca" VHS = "VHS" Video = "Vídeo" Video Clips = "Video Clipes" @@ -956,7 +994,7 @@ View Book Bag = "Ver cesta" View Full Collection = "Ver Coleção Completa" View Full Record = "Ver Registro Completo" View in EDS = "Visualizar em EDS" -View online: Full view Book Preview from the Hathi Trust = "Ver online: Full vista Reserve visualização da confiança Hathi" +View online: Full view Book Preview from the Hathi Trust = "Veja online: Visualização completa livro prévia confiança Hathi" View Record = "Ver Registro" View Records = "Ver Registros" View this record in EBSCOhost = "Visualizar este registro na base de dados BSCOhost" @@ -974,7 +1012,7 @@ wcterms_exact = "Assuntos relacionados" wcterms_narrower = "Assuntos mais específicos" Web = "Web" What am I looking at = "O que eu estou olhando?" -widen_prefix = "Tente alargar a sua busca a" +widen_prefix = "Tente ampliar a sua busca a" wiki_link = "Fornecido pela Wikipedia" with filters = "com os filtros" with_selected = "selecionados" @@ -982,8 +1020,9 @@ Year of Publication = "Ano de Publicação" Yesterday = "Ontem" You do not have any fines = "Você não tem quaisquer multas" You do not have any holds or recalls placed = "Você não tem qualquer reserva ou pedidos colocados" -You do not have any interlibrary loan requests placed = "Você não tem quaisquer pedidos de empréstimo entre bibliotecas colocados" +You do not have any interlibrary loan requests placed = "Você não tem quaisquer pedidos de empréstimo entre interbibliotecas" You do not have any items checked out = "Você não tem nenhum exemplar emprestado" +You do not have any library cards = "Você não tem nenhum cartão de biblioteca" You do not have any saved resources = "Você não possui recursos salvos" You do not have any storage retrieval requests placed = "Você não tem quaisquer pedidos de recuperação armazenamento colocados" You must be logged in first = "Deve entrar primeiro no seu login" @@ -991,7 +1030,7 @@ Your Account = "A sua conta" Your book bag is empty = "a sua cesta de livros está vazia" Your Checked Out Items = "Empréstimos ativos" Your Comment = "O seu comentário" -Your Favorites = "Todos os Favoritos" +Your Favorites = "Itens Guardados" Your Fines = "As suas Multas" Your Holds and Recalls = "As suas Reservas e Pedidos" Your Lists = "As suas Listas" @@ -1000,4 +1039,4 @@ Your search terms = "Termos de busca" Your Tags = "As suas Tags" your_match_would_be_here = "Sua correspondência pode estar aqui." Zip = "Cód. Postal" -zoom = "Ampliar" \ No newline at end of file +zoom = "Ampliar" diff --git a/languages/pt.ini b/languages/pt.ini index cbee5ce7bf1..cc75e8c2729 100644 --- a/languages/pt.ini +++ b/languages/pt.ini @@ -1000,4 +1000,4 @@ Your search terms = "Termos de pesquisa" Your Tags = "As suas Tags" your_match_would_be_here = "Os resultados encontrados estariam aqui." Zip = "Cód. Postal" -zoom = "Ampliar" \ No newline at end of file +zoom = "Ampliar" diff --git a/languages/ru.ini b/languages/ru.ini index f705a3f03af..5a57310d4da 100644 --- a/languages/ru.ini +++ b/languages/ru.ini @@ -19,8 +19,11 @@ ;Welsh = "Уэльский" Abstract = "Краткий обзор" Access = "Доступ" +Access URL = "Доступ через URL" +Accession Number = "Номер доступа" Account = "Акаунт" Add = "Добавить" +Add a Library Card = "Добавить карту библиотеки" Add a Note = "Добавить примечание" Add Tag = "Добавить метку" Add Tags = "Добавить метки" @@ -60,11 +63,14 @@ Advanced Search = "Расширенный поиск" advSearchError_noRights = "Извините,но у Вас нет разрешений на редактирование этого поиска. Возможно, исчерпано время сеанса Вашего браузера?" advSearchError_notAdvanced = "Запрошеный поиск для редактирования - не расширенный поиск." advSearchError_notFound = "Не найден запрошенный поиск." +ajaxview_label_information = "Информация" +ajaxview_label_tools = "Инструменты" All = "Все" All Fields = "Все поля" All Pages Loaded = "Загружены все страницы" All Text = "Весь текст" alphabrowse_matches = "Результаты" +alphabrowselink_html = "Просмотр записей по индексу %%index%%, начиная с %%from%%." An error has occurred = "Ошибка" An error occurred during execution; please try again later. = "Ошибка при выполнении; повторите попытку позже." AND = "И" @@ -92,6 +98,7 @@ Auto configuration is currently disabled = "Сейчас выключена ав auto_configure_description = "Если это - новая инсталляция, то можно исправлять ошибки с помощью инструмента VuFind's Auto Configure." auto_configure_disabled = "Невозможна автоконфигурация." auto_configure_title = "Автоконфигурация" +Availability = "Доступность" Available = "Доступно" Available Functionality = "Доступная функциональность" Awards = "Премия" @@ -212,6 +219,8 @@ Company/Entity = "Компания/Сущность" Configuration = "Конфигурация" confirm_delete = "Нужно ли удалить это?" confirm_delete_brief = "Удалить документ?" +confirm_delete_library_card_brief = "Удалить карту библиотеки?" +confirm_delete_library_card_text = "Нужно ли удалить эту карту библиотеки?" confirm_delete_list_brief = "Удалить список?" confirm_delete_list_text = "Нужно ли удалить этот список?" confirm_delete_tags_brief = "Удалить метки" @@ -226,9 +235,11 @@ confirm_storage_retrieval_request_cancel_all_text = "Нужно ли отмен confirm_storage_retrieval_request_cancel_selected_text = "Нужно ли отменить все Ваши выбранные запросы по выборке из хранилища?" conjunction_or = "или" Contents = "Контенты" +Contributing Source = "Источник поступления" Contributors = "Спонсоры" Copies = "Копии" Copy = "Копировать" +Copyright = "Copyright" Corporate Author = "Соавтор" Country = "Страна" Course = "Курс" @@ -266,12 +277,14 @@ Detailed View = "Подробный просмотр" Details = "Просмотр MARC-записи" Displaying the top = "Просмотр верхней части" Document Inspector = "Инспектор документов" +Document Type = "Тип документа" DOI = "DOI" Due = "В течение" Due Date = "Срок" DVD = "DVD" eBook = "eКнига" Edit = "Редактировать" +Edit Library Card = "Редактировать карту библиотеки" Edit this Advanced Search = "Редактировать расширенный поиск" edit_list = "Редактировать список" edit_list_fail = "Вы не имеете права на редактирование этого файла" @@ -357,6 +370,7 @@ Fee = "взнос" Feedback = "обратной связи" Feedback Email = "Email-обратной связи" feedback_name = "Имя" +File Description = "Описание файла" Filter = "Фильтр" filter_tags = "Метки фильтра" filter_wildcard = "Любой" @@ -489,6 +503,7 @@ in = "в" In This Collection = "В этой коллекции" in_collection_label = "В коллекции:" include_synonyms = "Увеличить результаты, используя синонимы" +Index Terms = "Термы индекса" Indexes = "Индексы" information = "Информация" Institution = "Институт" @@ -514,9 +529,11 @@ items_added_to_bookbag = "документы добавлены в книжну items_already_in_bookbag = "документы либо в книжной сумке, либо их невозможно добавить" Journal = "Журнал" Journal Articles = "Статьи журнала" +Journal Info = "Информация журнала" Journal Title = "Заглавие журнала" Journals = "Журналы" Jump to = "Переход на" +just_cataloged = "Только что скаталогицирован" Keyword = "Ключевое слово" Keyword Filter = "Фильтр ключевых слов" Kit = "Набор" @@ -526,7 +543,19 @@ Last = "Последний" Last Modified = "Последняя модификация" Last Name = "Фамилия" less = "меньше" +libphonenumber_invalid = "Неверный номер телефона" +libphonenumber_invalidcountry = "Неверная страна вызывающего кода" +libphonenumber_invalidregion = "Неверный код региона:" +libphonenumber_notanumber = "Похоже, что поставленная строка не является номером телефона" +libphonenumber_toolong = "Похоже, что поставленная строка слишком длинная и не является номером телефона" +libphonenumber_tooshort = "Похоже, что поставленная строка слишком короткая и не является номером телефона" +libphonenumber_tooshortidd = "Номер телефона слишком короток после IDD" Library = "Библиотека" +Library Card = "Карта библиотеки" +Library Card Deleted = "Карта библиотеки удалена" +Library Card Name = "Имя карты библиотеки" +Library Cards = "Карты библиотек" +Library Cards Disabled = "Карты библиотек выключены" Library Catalog Password = "Пароль каталога библиотеки" Library Catalog Profile = "Профиль каталога библиотеки" Library Catalog Record = "Запись каталога библиотеки" @@ -562,6 +591,7 @@ map_results_label = "В этом месте:" Maps = "Карты" Media Format = "Media-формат" medium = "Средний" +MeSH Terms = "MeSH-термы" Message = "Сообщение" Message From Sender = "Сообщение от отправителя" Metadata Prefix = "Префикс метаданных" @@ -674,6 +704,7 @@ Page not found. = "Не найдена страница." Password = "Пароль" Password Again = "Повторите пароль" Password cannot be blank = "Пароль пуст" +password_error_invalid = "Неверен новый пароль (т.е. содержит неверные символы)" password_error_not_unique = "Не был изменен пародь" password_maximum_length = "Максимальная длина пароля - %%maxlength%% символов" password_minimum_length = "Минимальная длина пароля - %%minlength%% символов" @@ -711,13 +742,17 @@ pronounced = "определен" Provider = "Провайдер" Public = "Публичный" Publication = "Публикация" +Publication Date = "Дата публикации" Publication Frequency = "Частота публикаций" Publication Information = "Информация публикации" Publication Type = "Тип публикации" +Publication Year = "Год публикации" Publication_Place = "Поместить публикацию" Published = "Опубликовано" Published in = "Опубликовано в: " Publisher = "Издатель" +Publisher Information = "Издатель" +Publisher Permissions = "Права издателя" QR Code = "QR Code (код быстрого отклика)" qrcode_hide = "Скрыть QR Code (код быстрого отклика)" qrcode_show = "Показать QR Code (код быстрого отклика)" @@ -846,6 +881,7 @@ sort_title = "Заглавие" sort_year = "Нижняя дата" sort_year asc = "Верхняя дата" Source = "Источник" +Source Title = "Заголовок источника" spell_expand_alt = "Расширить поиск" spell_suggest = "Альтернативы поиска" Staff View = "Marc-запись" @@ -886,6 +922,7 @@ storage_retrieval_request_year = "Год" Subcollection = "Подколлекция" Subject = "Предмет" Subject Area = "Предметная область" +Subject Geographic = "Тема география" Subject Recommendations = "Рекомендации по предметам" Subject Terms = "Термины предметов" Subject(s) = "Предметы" @@ -950,6 +987,7 @@ total_resources = "Всего ресурсов" total_saved_items = "Всего сохраненных предпочтительных записей" total_tags = "Всего меток" total_users = "Всего пользователей" +Transliterated Title = "Транслитеральный заголовок" tree_search_limit_reached_html = "Поиск выдал слишком много данных для отображения в дереве. Показ только первых %%limit%% документов. Для полного поиска нажмите здесь." unique_tags = "Уникальные метки" University Library = "Университетская библиотека" @@ -963,6 +1001,7 @@ Use instead = "Использовать вместо" User Account = "Логин пользователя" Username = "Имя пользователя" Username cannot be blank = "Недопустимо пустое имя пользователя" +Username is already in use in another library card = "Имя подьзователя уже используется другой биьлиотечной картой" VHS = "VHS" Video = "Видеозапись" Video Clips = "Видеоклипы" @@ -1000,6 +1039,7 @@ You do not have any fines = "У Вас нет штафов" You do not have any holds or recalls placed = "У пользователя не должно быть никаких задолженностей или напоминаний" You do not have any interlibrary loan requests placed = "Вы не задали ни один межбиблиотечный запрос" You do not have any items checked out = "У пользователя не должно быть никаких недоступных документов." +You do not have any library cards = "У вас нет никакой библиотечной карты" You do not have any saved resources = "У пользователя не должно быть никаких сохраненных ресурсов." You do not have any storage retrieval requests placed = "Вы не задали ни один запрос по выборке из хранилища" You must be logged in first = "Сначала войдите в систему" @@ -1016,4 +1056,4 @@ Your search terms = "Термины Вашего поиска" Your Tags = "Ваши метки" your_match_would_be_here = "Ваше соответствие было бы здесь." Zip = "Zip" -zoom = "Масштаб изображения" \ No newline at end of file +zoom = "Масштаб изображения" diff --git a/languages/sl.ini b/languages/sl.ini index 2ac47f8e024..06f77f87ad6 100644 --- a/languages/sl.ini +++ b/languages/sl.ini @@ -835,4 +835,4 @@ Your Profile = "Vaš profil" Your search terms = "Vaši iskalni izrazi" Your Tags = "Vaše oznake" Zip = "Zip" -zoom = "Povečaj" \ No newline at end of file +zoom = "Povečaj" diff --git a/languages/sv.ini b/languages/sv.ini index 0a4786eb531..d99808985a6 100644 --- a/languages/sv.ini +++ b/languages/sv.ini @@ -1,6 +1,8 @@ ;note_785_7 = "Fortsättes efter sammanslagning med" ; incomplete translation (en.ini was later revised) Abstract = "Abstrakt" Access = "Tillgång" +Access URL = "Länk till materialet" +Accession Number = "Accessionsnummer" Account = "Användarkonto" Add = "Lägg till" Add a Library Card = "Anslut bibliotekskort till mitt konto" @@ -43,11 +45,14 @@ Advanced Search = "Utökad sökning" advSearchError_noRights = "Sökningen kunde inte bearbetas. Orsaken kan vara att sessionen avbröts." advSearchError_notAdvanced = "Sökningen, som du bearbetade, är inte en utökad sökning." advSearchError_notFound = "Sökningen hittas inte." +ajaxview_label_information = "Information" +ajaxview_label_tools = "Verktyg" All = "Alla" All Fields = "Alla fält" All Pages Loaded = "All Pages Loaded" All Text = "All text" alphabrowse_matches = "Resultat" +alphabrowselink_html = "Bläddra efter %%index%% från %%from%%." An error has occurred = "Det har uppstått ett fel" An error occurred during execution; please try again later. = "Utförandet misslyckades. Försök på nytt efter en stund." AND = "OCH" @@ -75,12 +80,13 @@ Auto configuration is currently disabled = "Auto configuration is currently disa auto_configure_description = "If this is a new installation, you may be able to fix the error using VuFind's Auto Configure tool." auto_configure_disabled = "Auto configuration is disabled." auto_configure_title = "Auto Configure" +Availability = "Tillgänglighet" Available = "Tillgänglig" Available Functionality = "Available Functionality" Awards = "Priser" Back to Record = "Tillbaka till posten" Back to Search Results = "Tillbaka till sökresultaten" -Backtrace = "Sökväg" +Backtrace = "Anropsstacken" Bag = "Kundvagn" Balance = "Saldo" basic_search_keep_filters = "Spara filtreringen i bruk" @@ -211,9 +217,11 @@ confirm_storage_retrieval_request_cancel_all_text = "Är du säker du vill åter confirm_storage_retrieval_request_cancel_selected_text = "Är du säker du vill återkalla utvalda beställningar?" conjunction_or = "eller" Contents = "Innehåll" +Contributing Source = "Bidragande källa" Contributors = "Medarbetare" Copies = "Exemplar" Copy = "Exemplar" +Copyright = "Copyright" Corporate Author = "Institutionell upphovsman" Country = "Land" Course = "Kurs" @@ -251,6 +259,7 @@ Detailed View = "Detaljerad vy" Details = "Detaljer" Displaying the top = "Visar de första" Document Inspector = "Document Inspector" +Document Type = "Dokument typ" DOI = "DOI" Due = "Förfaller" Due Date = "Förfallodag" @@ -343,6 +352,7 @@ Fee = "Avgift" Feedback = "Feedback" Feedback Email = "Feedback Email" feedback_name = "Ditt namn" +File Description = "Filbeskrivning" Filter = "Filter" filter_tags = "Filtrera taggar" filter_wildcard = "Any" @@ -475,6 +485,7 @@ in = "i fältet" In This Collection = "I denna samling" in_collection_label = "I samling:" include_synonyms = "Expandera resultat med hjälp av synonymer" +Index Terms = "Indextermer" Indexes = "Förteckningar" information = "Information" Institution = "Organisation" @@ -500,9 +511,11 @@ items_added_to_bookbag = "posten/erna har lagts till i kundvagnen" items_already_in_bookbag = "posten/erna finns redan i kundvagnen; eller tilläggning misslyckades" Journal = "Tidskrift" Journal Articles = "Tidskriftsartiklar" +Journal Info = "Tidskrift info" Journal Title = "Tidskriftstitel" Journals = "Tidskrifter" Jump to = "Jump to" +just_cataloged = "Sist katalogiserade" Keyword = "Keyword" Keyword Filter = "Nyckelord filter" Kit = "Materialpaket" @@ -512,6 +525,13 @@ Last = "Sista" Last Modified = "Last Modified" Last Name = "Efternamn" less = "färre" +libphonenumber_invalid = "Telefonnummer ogiltigt" +libphonenumber_invalidcountry = "Ogiltig landkod" +libphonenumber_invalidregion = "Ogiltig regionskod:" +libphonenumber_notanumber = "Indatan verkar inte vara ett telefonnummer" +libphonenumber_toolong = "Indatan för lång för att vara ett telefonnummer" +libphonenumber_tooshort = "Indatan för kort för att vara ett telefonnummer" +libphonenumber_tooshortidd = "Telefonnumer för kort efter landkoden" Library = "Bibliotek" Library Card = "Bibliotekskort" Library Card Deleted = "Bibliotekskortet har raderats" @@ -553,6 +573,7 @@ map_results_label = "I denna belägenhet:" Maps = "Kartor" Media Format = "Mediaformat" medium = "Medium" +MeSH Terms = "MeSH-termer" Message = "Meddelande" Message From Sender = "Meddelande från" Metadata Prefix = "Metadata Prefix" @@ -703,13 +724,17 @@ pronounced = "uttalas" Provider = "Leverantör" Public = "Allmän" Publication = "Publikation" +Publication Date = "Utgivningstid" Publication Frequency = "Utgivningstäthet" Publication Information = "Utgivningsinformation" Publication Type = "Utgivningstyp" +Publication Year = "Utgivningsår" Publication_Place = "Utgivningsort" Published = "Publicerad" Published in = "I publikationen" Publisher = "Utgivare" +Publisher Information = "Information om utgivare" +Publisher Permissions = "Behörigheter av utgivaren" QR Code = "QR-kod" qrcode_hide = "Gömma QR-koden" qrcode_show = "Visa QR-koden" @@ -838,6 +863,7 @@ sort_title = "Titel" sort_year = "Tid (nyaste först)" sort_year asc = "Tid (äldsta först)" Source = "Källa" +Source Title = "Källa titel" spell_expand_alt = "Vidga sökningen" spell_suggest = "Menade du" Staff View = "Personalens vy" @@ -878,6 +904,7 @@ storage_retrieval_request_year = "År" Subcollection = "Delsamling" Subject = "Ämne" Subject Area = "Ämnesområde" +Subject Geographic = "Geografiskt ämne" Subject Recommendations = "Rekommenderade ämnen" Subject Terms = "Ämnestermer" Subject(s) = "Ämne(n)" @@ -942,6 +969,7 @@ total_resources = "Totalantal resurser" total_saved_items = "Totalantal sparade resurser" total_tags = "Totalantal taggar" total_users = "Totalantar användare" +Transliterated Title = "Translittererad titel" tree_search_limit_reached_html = "Din sökning gav för många resultat att visa i trädet. Visar de första %%limit%% resultat. Klicka här för att se alla resultat." unique_tags = "Unika taggar" University Library = "Universitetsbibliotek" @@ -1010,4 +1038,4 @@ Your search terms = "Sökvillkor" Your Tags = "Taggar" your_match_would_be_here = "Din träff skulle vara här." Zip = "Postanstalt" -zoom = "Zooma" \ No newline at end of file +zoom = "Zooma" diff --git a/languages/tr.ini b/languages/tr.ini index 3c22a6835ae..b6a153f0ec1 100644 --- a/languages/tr.ini +++ b/languages/tr.ini @@ -13,8 +13,11 @@ ;Your Borroweds = "Ödünç Aldıklarım" Abstract = "Özet" Access = "Erişim" +Access URL = "Erişim Adresi URL" +Accession Number = "Aksesiyon No" Account = "Hesap" Add = "Ekle" +Add a Library Card = "Kütüphane Kartı Ekle" Add a Note = "Not Ekle" Add Tag = "Etiketle" Add Tags = "Etiket Ekle" @@ -54,11 +57,14 @@ Advanced Search = "Gelişmiş Tarama" advSearchError_noRights = "Bu taramayı değiştirmeye yetkiniz yoktur. Muhtemelen tarayıcınız sonlanmış olabilir?" advSearchError_notAdvanced = "Düzeltmek için istemiş olduğunuz tarama, gelişmiş taramada mevcut değildir." advSearchError_notFound = "İstemiş olduğunuz tarama bulunamadı." +ajaxview_label_information = "Bilgi" +ajaxview_label_tools = "Araçlar" All = "Tümü" All Fields = "Tüm Alanlar" All Pages Loaded = "Bütün Sayfalar Yüklendi" All Text = "Tüm Metin" alphabrowse_matches = "Sonuçlar" +alphabrowselink_html = "%%from%% başlayarak %%index%% tarafından oluşturulan girişleri listeleyin." An error has occurred = "Bir Hata Oldu" An error occurred during execution; please try again later. = "Yürütme sırasında bir hata oluştu; lütfen tekrar deneyin." AND = "VE" @@ -86,6 +92,7 @@ Auto configuration is currently disabled = "Otomatik yapılandırma şu anda dev auto_configure_description = "Bu yeni bir kurulum ise, VuFind otomatik yapılandırma aracını kullanarak hatayı düzeltmek mümkün olabilir." auto_configure_disabled = "Otomatik yapılandırma iptal edildi." auto_configure_title = "Otomatik Yapılandırma" +Availability = "Erişilebilirlik" Available = "Kütüphanede" Available Functionality = "Geçerli İşlevsellik" Awards = "Ödüller" @@ -206,6 +213,8 @@ Company/Entity = "Şirket/Varlık" Configuration = "Konfigürasyon" confirm_delete = "Bunu silmek istediğinizden emin misiniz?" confirm_delete_brief = "Kayıt Silinsin mi?" +confirm_delete_library_card_brief = "Kütüphane Kartını Sil?" +confirm_delete_library_card_text = "Bu kütüphane kartını silmek istediğinizden emin misiniz?" confirm_delete_list_brief = "Liste Silinsin mi?" confirm_delete_list_text = "Listeyi silmek istediğinizden emin misiniz?" confirm_delete_tags_brief = "Etiketleri Sil" @@ -220,9 +229,11 @@ confirm_storage_retrieval_request_cancel_all_text = "Tüm güncel depo alma iste confirm_storage_retrieval_request_cancel_selected_text = "Seçmiş olduğunuz depo alam isteklerini iptal etmek istiyor musunuz?" conjunction_or = "Veya" Contents = "İçindekiler" +Contributing Source = "Katkıda Bulunan Kaynak" Contributors = "Diğer Yazarlar" Copies = "Kopyalar" Copy = "Kopya Bilgisi" +Copyright = "Telif Hakkı" Corporate Author = "Müşterek Yazar" Country = "Ülke" Course = "Kurs" @@ -260,12 +271,14 @@ Detailed View = "Detaylı Görünüm" Details = "Detaylı" Displaying the top = "Üst gösteriliyor" Document Inspector = "Doküman Denetcisi" +Document Type = "Doküman Türü" DOI = "DOI" Due = "İade Tarihi" Due Date = "İade tarihi" DVD = "DVD" eBook = "Ekitap" Edit = "Düzenle" +Edit Library Card = "Kütüphane Kartını Düzenle" Edit this Advanced Search = "Bu Sorguyu Düzenle" edit_list = "Listeyi düzenle" edit_list_fail = "Bu listeyi düzenlemeye yetkiniz yoktur" @@ -351,6 +364,7 @@ Fee = "Gecikme Cezası" Feedback = "Görüsleriniz" Feedback Email = "Görüsleriniz" feedback_name = "Adiniz" +File Description = "Dosya tanımı" Filter = "Filtre" filter_tags = "Etiketleri Flitrele" filter_wildcard = "Herhangi" @@ -483,6 +497,7 @@ in = "ile" In This Collection = "Bu Koleksiyonda" in_collection_label = "Koleksiyonda:" include_synonyms = "Eþ anlamlýlarý kullanarak sonuçlarýnýzý geniþletin" +Index Terms = "İndeks Terimleri" Indexes = "İndeksler" information = "Bilgi" Institution = "Kurum" @@ -508,9 +523,11 @@ items_added_to_bookbag = "Kayıt(lar) kitap sepetinize eklendi" items_already_in_bookbag = "Kayıt(lar) zaten kitap sepetinizde veya eklenemedi." Journal = "Dergi" Journal Articles = "Dergi Makalesi" +Journal Info = "Süreli Yayın Bilgisi" Journal Title = "Dergi Başlığı" Journals = "Dergiler" Jump to = "Atla" +just_cataloged = "Sadece Kataloglanan" Keyword = "Anahtar Kelime" Keyword Filter = "Anahtar Kelime" Kit = "Set" @@ -520,7 +537,19 @@ Last = "Son" Last Modified = "Son Değişiklik" Last Name = "Soyad" less = "daha az" +libphonenumber_invalid = "Telefon numarası hatalı" +libphonenumber_invalidcountry = "Ülke kodu hatalı" +libphonenumber_invalidregion = "Bölge kodu hatalı:" +libphonenumber_notanumber = "Girilen numara bir telefon numarası olarak görünmüyor" +libphonenumber_toolong = "Girilen numara bir telefon numarası olmak için çok uzun" +libphonenumber_tooshort = "Girilen numara bir telefon numarası olmak için çok kısa" +libphonenumber_tooshortidd = "Uluslararası Doğrudan Çevirme(IDD) den sonra gelen telefon numarası çok kısa" Library = "Kütüphane" +Library Card = "Kütüphane Kartı" +Library Card Deleted = "Kütüphane Kartı Silindi" +Library Card Name = "Kütüphane Kart Adı" +Library Cards = "Kütüphane Kartları" +Library Cards Disabled = "Kütüphane kartları iptal edildi" Library Catalog Password = "Kütüphane Katalog Şifresi" Library Catalog Profile = "Kütüphane Katalog Profili" Library Catalog Record = "Kütüphane Katalog Kaydı" @@ -556,6 +585,7 @@ map_results_label = "Bu Yerde:" Maps = "Harita" Media Format = "Medya Formatı" medium = "Orta" +MeSH Terms = "MeSH Terimleri" Message = "Mesaj" Message From Sender = "Gönderenin Mesajı" Metadata Prefix = "Metadata Öneki" @@ -668,6 +698,7 @@ Page not found. = "Sayfa bulunamadı." Password = "Parola" Password Again = "Şifrenizi tekrar girin" Password cannot be blank = "Şifre boş olamaz" +password_error_invalid = "Yeni Şifre geçersizi (geçersiz karakterler içeriyor olabilir)" password_error_not_unique = "Şifre değişmedi" password_maximum_length = "Maksimum şifre uzunluğu %%maxlength%% karakter" password_minimum_length = "Minimum şifre uzunluğu %%minlength%% karakter" @@ -705,13 +736,17 @@ pronounced = "belirgin" Provider = "Tedarikçi" Public = "Kamusal" Publication = "Yayın" +Publication Date = "Yayın Tarihi" Publication Frequency = "Yayın Sıklığı" Publication Information = "Yayın Bilgileri" Publication Type = "Yayın Türü" +Publication Year = "Yayın Yılı" Publication_Place = "Yayın Yeri" Published = "Baskı/Yayın Bilgisi" Published in = "Yayımlandı" Publisher = "Yayınevi" +Publisher Information = "Yayıncı Bilgileri" +Publisher Permissions = "Yayıncı İzinleri" QR Code = "QR Kod" qrcode_hide = "QR Kodu Sakla" qrcode_show = "QR Kodu Göster" @@ -840,6 +875,7 @@ sort_title = "Materyal Adı" sort_year = "Tarih-Azalan" sort_year asc = "Tarih-Artan" Source = "Kaynak" +Source Title = "Kaynak Başlığı" spell_expand_alt = "Aramayı Genişlet" spell_suggest = "Şunu mu demek istediniz" Staff View = "MARC Görünümü" @@ -880,6 +916,7 @@ storage_retrieval_request_year = "Yıl" Subcollection = "Alt Koleksiyon" Subject = "Konu" Subject Area = "Konu Alanı" +Subject Geographic = "Coğrafi Konu" Subject Recommendations = "Tavsiye Edilen Konular" Subject Terms = "Konu Terimleri" Subject(s) = "Konu(lar)" @@ -944,6 +981,7 @@ total_resources = "Toplam Kaynaklar" total_saved_items = "Toplam Kayýtlý Öðeler" total_tags = "Toplam Etiketler" total_users = "Toplam Kullanýcalr" +Transliterated Title = "Çeviri Başlığı" tree_search_limit_reached_html = "Taramanız çok fazla sonuç verdi. Bu yapıda gösterilemiyor. Sadece ilk %%limit%% kayıt gösteriliyor. Tüm tarama için 'e tıklayın." unique_tags = "Benzersiz Etiketler" University Library = "Üniversite Kütüphanesi" @@ -957,6 +995,7 @@ Use instead = "Yerine kullanın" User Account = "Kullanıcı Hesabı" Username = "Kullanıcı" Username cannot be blank = "Kullanıcı adı boş olamaz" +Username is already in use in another library card = "Kullanıcı adı başka kütüphane kartında zaten kullanılıyor" VHS = "VHS" Video = "Video" Video Clips = "Video Klibi" @@ -994,6 +1033,7 @@ You do not have any fines = "Geçikme cezanız yoktur" You do not have any holds or recalls placed = "Rezerve etiğiniz kayıt bulunmamaktadır" You do not have any interlibrary loan requests placed = "Herhangi bir kütüphaneler arası istekte bulunmadınız" You do not have any items checked out = "Ödünç Aldığınız materyal yoktur" +You do not have any library cards = "Herhangi bir kütüphane kartı yok" You do not have any saved resources = "Kaydedilmiş bir materyaliniz bulunmamaktadır." You do not have any storage retrieval requests placed = "YHerhangi bir depolama alma isteğinde bulunmadınız" You must be logged in first = "İlk önce giriş yapmalısınız" @@ -1010,4 +1050,4 @@ Your search terms = "Tarama Terimlerim" Your Tags = "Etiketlerim" your_match_would_be_here = "Eşleşmeleriniz burada olacak." Zip = "Posta Kodu" -zoom = "Yakınlaştır" \ No newline at end of file +zoom = "Yakınlaştır" diff --git a/languages/zh-cn.ini b/languages/zh-cn.ini index 62dee64aadf..c872f309948 100644 --- a/languages/zh-cn.ini +++ b/languages/zh-cn.ini @@ -665,4 +665,4 @@ Your Lists = "我的清单" Your Profile = "您的个人资料" Your search terms = "您的搜索字词" Your Tags = "您的标签" -Zip = "邮编" \ No newline at end of file +Zip = "邮编" diff --git a/languages/zh.ini b/languages/zh.ini index 493fae19c9e..dd7eaf22b78 100644 --- a/languages/zh.ini +++ b/languages/zh.ini @@ -665,4 +665,4 @@ Your Lists = "我的清單" Your Profile = "您的個人資料" Your search terms = "您的搜索字詞" Your Tags = "您的標簽" -Zip = "郵編" \ No newline at end of file +Zip = "郵編" diff --git a/module/VuFind/config/module.config.php b/module/VuFind/config/module.config.php index 113ab49fb91..d048bd0ce0a 100644 --- a/module/VuFind/config/module.config.php +++ b/module/VuFind/config/module.config.php @@ -160,6 +160,7 @@ 'VuFind\ILSTitleHoldLogic' => 'VuFind\Service\Factory::getILSTitleHoldLogic', 'VuFind\Logger' => 'VuFind\Service\Factory::getLogger', 'VuFind\Mailer' => 'VuFind\Mailer\Factory', + 'VuFind\ProxyConfig' => 'VuFind\Service\Factory::getProxyConfig', 'VuFind\Recaptcha' => 'VuFind\Service\Factory::getRecaptcha', 'VuFind\RecommendPluginManager' => 'VuFind\Service\Factory::getRecommendPluginManager', 'VuFind\RecordDriverPluginManager' => 'VuFind\Service\Factory::getRecordDriverPluginManager', @@ -186,9 +187,10 @@ 'VuFind\WorldCatUtils' => 'VuFind\Service\Factory::getWorldCatUtils', ], 'invokables' => [ + 'VuFind\HierarchicalFacetHelper' => 'VuFind\Search\Solr\HierarchicalFacetHelper', + 'VuFind\IpAddressUtils' => 'VuFind\Net\IpAddressUtils', 'VuFind\Search' => 'VuFindSearch\Service', 'VuFind\Search\Memory' => 'VuFind\Search\Memory', - 'VuFind\HierarchicalFacetHelper' => 'VuFind\Search\Solr\HierarchicalFacetHelper' ], 'initializers' => [ 'VuFind\ServiceManager\Initializer::initInstance', @@ -374,6 +376,7 @@ 'abstract_factories' => ['VuFind\ILS\Driver\PluginFactory'], 'factories' => [ 'aleph' => 'VuFind\ILS\Driver\Factory::getAleph', + 'daia' => 'VuFind\ILS\Driver\Factory::getDAIA', 'demo' => 'VuFind\ILS\Driver\Factory::getDemo', 'horizon' => 'VuFind\ILS\Driver\Factory::getHorizon', 'horizonxmlapi' => 'VuFind\ILS\Driver\Factory::getHorizonXMLAPI', @@ -386,13 +389,11 @@ 'invokables' => [ 'amicus' => 'VuFind\ILS\Driver\Amicus', 'claviussql' => 'VuFind\ILS\Driver\ClaviusSQL', - 'daia' => 'VuFind\ILS\Driver\DAIA', 'evergreen' => 'VuFind\ILS\Driver\Evergreen', 'innovative' => 'VuFind\ILS\Driver\Innovative', 'koha' => 'VuFind\ILS\Driver\Koha', 'lbs4' => 'VuFind\ILS\Driver\LBS4', 'newgenlib' => 'VuFind\ILS\Driver\NewGenLib', - 'pica' => 'VuFind\ILS\Driver\PICA', 'polaris' => 'VuFind\ILS\Driver\Polaris', 'sample' => 'VuFind\ILS\Driver\Sample', 'sierra' => 'VuFind\ILS\Driver\Sierra', diff --git a/module/VuFind/src/VuFind/Auth/Factory.php b/module/VuFind/src/VuFind/Auth/Factory.php index 3c0d1df9300..c3ac636c136 100644 --- a/module/VuFind/src/VuFind/Auth/Factory.php +++ b/module/VuFind/src/VuFind/Auth/Factory.php @@ -79,7 +79,8 @@ public static function getILSAuthenticator(ServiceManager $sm) // Indicate that initialization is complete to avoid reinitialization: $proxy->setProxyInitializer(null); }; - $factory = new \ProxyManager\Factory\LazyLoadingValueHolderFactory(); + $cfg = $sm->get('VuFind\ProxyConfig'); + $factory = new \ProxyManager\Factory\LazyLoadingValueHolderFactory($cfg); return $factory->createProxy('VuFind\Auth\ILSAuthenticator', $callback); } diff --git a/module/VuFind/src/VuFind/Bootstrapper.php b/module/VuFind/src/VuFind/Bootstrapper.php index 4c80683c42c..261c1ef3596 100644 --- a/module/VuFind/src/VuFind/Bootstrapper.php +++ b/module/VuFind/src/VuFind/Bootstrapper.php @@ -289,6 +289,30 @@ public function detectBrowserLanguage() return false; } + /** + * Support method for initLanguage() -- look up all text domains. + * + * @return array + */ + protected function getTextDomains() + { + $base = APPLICATION_PATH; + $local = LOCAL_OVERRIDE_DIR; + $languagePathParts = ["$base/languages"]; + if (!empty($local)) { + $languagePathParts[] = "$local/languages"; + } + $languagePathParts[] = "$base/themes/*/languages"; + + $domains = []; + foreach ($languagePathParts as $current) { + $places = glob($current . '/*', GLOB_ONLYDIR | GLOB_NOSORT); + $domains = array_merge($domains, array_map('basename', $places)); + } + + return array_unique($domains); + } + /** * Set up language handling. * @@ -325,11 +349,18 @@ protected function initLanguage() if (!in_array($language, array_keys($config->Languages->toArray()))) { $language = $config->Site->language; } - try { - $sm->get('VuFind\Translator') - ->addTranslationFile('ExtendedIni', null, 'default', $language) - ->setLocale($language); + $translator = $sm->get('VuFind\Translator'); + $translator->setLocale($language) + ->addTranslationFile('ExtendedIni', null, 'default', $language); + foreach ($this->getTextDomains() as $domain) { + // Set up text domains using the domain name as the filename; + // this will help the ExtendedIni loader dynamically locate + // the appropriate files. + $translator->addTranslationFile( + 'ExtendedIni', $domain, $domain, $language + ); + } } catch (\Zend\Mvc\Exception\BadMethodCallException $e) { if (!extension_loaded('intl')) { throw new \Exception( @@ -342,6 +373,11 @@ protected function initLanguage() $viewModel = $sm->get('viewmanager')->getViewModel(); $viewModel->setVariable('userLang', $language); $viewModel->setVariable('allLangs', $config->Languages); + $rtlLangs = isset($config->LanguageSettings->rtl_langs) + ? array_map( + 'trim', explode(',', $config->LanguageSettings->rtl_langs) + ) : []; + $viewModel->setVariable('rtl', in_array($language, $rtlLangs)); }; $this->events->attach('dispatch.error', $callback, 10000); $this->events->attach('dispatch', $callback, 10000); @@ -464,4 +500,4 @@ protected function initRenderErrorEvent() }; $this->events->attach('render.error', $callback, 10000); } -} \ No newline at end of file +} diff --git a/module/VuFind/src/VuFind/Config/Upgrade.php b/module/VuFind/src/VuFind/Config/Upgrade.php index 32be637994f..558e1b37c1e 100644 --- a/module/VuFind/src/VuFind/Config/Upgrade.php +++ b/module/VuFind/src/VuFind/Config/Upgrade.php @@ -407,12 +407,14 @@ protected function saveUnmodifiedConfig($filename) // Compare the source file against the raw file; if they happen to be the // same, we don't need to copy anything! - if (md5(file_get_contents($src)) == md5(file_get_contents($raw))) { + if (file_exists($src) && file_exists($raw) + && md5(file_get_contents($src)) == md5(file_get_contents($raw)) + ) { return; } // If we got this far, we need to copy the user's file into place: - if (!copy($src, $dest)) { + if (file_exists($src) && !copy($src, $dest)) { throw new FileAccessException( "Error: Could not copy {$src} to {$dest}." ); @@ -525,11 +527,19 @@ protected function upgradeConfig() // Set up reference for convenience (and shorter lines): $newConfig = & $this->newConfigs['config.ini']; - // If the [BulkExport] options setting is an old default, update it to - // reflect the fact that we now support more options. - if ($this->isDefaultBulkExportOptions($newConfig['BulkExport']['options'])) { - $newConfig['BulkExport']['options'] - = 'MARC:MARCXML:EndNote:EndNoteWeb:RefWorks:BibTeX:RIS'; + // If the [BulkExport] options setting is present and non-default, warn + // the user about its deprecation. + if (isset($newConfig['BulkExport']['options'])) { + $default = $this->isDefaultBulkExportOptions( + $newConfig['BulkExport']['options'] + ); + if (!$default) { + $this->addWarning( + 'The [BulkExport] options setting is deprecated; please ' + . 'customize the [Export] section instead.' + ); + } + unset($newConfig['BulkExport']['options']); } // Warn the user about Amazon configuration issues: @@ -959,7 +969,7 @@ protected function upgradeSummonPermissions() unset($permissions['access.SummonExtendedResults']); } - // Remove any old settings remaining in config.ini: + // Remove any old settings remaining in Summon.ini: unset($config['Auth']); } } diff --git a/module/VuFind/src/VuFind/Config/Version.php b/module/VuFind/src/VuFind/Config/Version.php new file mode 100644 index 00000000000..fb55b0b09fa --- /dev/null +++ b/module/VuFind/src/VuFind/Config/Version.php @@ -0,0 +1,73 @@ + + * @author Ere Maijala + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @link http://vufind.org Main Site + */ +namespace VuFind\Config; + +/** + * Version check utility + * + * @category VuFind2 + * @package Controller + * @author Demian Katz + * @author Ere Maijala + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @link http://vufind.org Main Site + */ +class Version +{ + /** + * Extract version number from the build.xml file of the running instance or + * another instance pointed to by $dir + * + * @param string $dir Optional directory containing build.xml + * + * @throws \Exception + * @return string + */ + public static function getBuildVersion($dir = '') + { + static $cachedVersions = []; + + if ($dir === '') { + $dir = realpath(APPLICATION_PATH); + } + + if (!isset($cachedVersions[$dir])) { + $file = $dir . '/build.xml'; + $xml = file_exists($file) ? simplexml_load_file($file) : false; + if (!$xml) { + throw new \Exception('Cannot load ' . $file . '.'); + } + $parts = $xml->xpath('/project/property[@name="version"]/@value'); + $cachedVersions[$dir] = (string)$parts[0]; + } + + return $cachedVersions[$dir]; + } +} diff --git a/module/VuFind/src/VuFind/Config/Writer.php b/module/VuFind/src/VuFind/Config/Writer.php index ea14c831886..769d9bb965f 100644 --- a/module/VuFind/src/VuFind/Config/Writer.php +++ b/module/VuFind/src/VuFind/Config/Writer.php @@ -207,11 +207,11 @@ protected function buildContentLine($key, $value, $tab = 17) { // Build a tab string so the equals signs line up attractively: $tabStr = ''; - for ($i = strlen($key); $i < $tab; $i++) { + for ($i = strlen($key) + 1; $i < $tab; $i++) { $tabStr .= ' '; } - return $key . $tabStr . "= " . $this->buildContentValue($value); + return $key . $tabStr . " = " . $this->buildContentValue($value); } /** diff --git a/module/VuFind/src/VuFind/Controller/AbstractBase.php b/module/VuFind/src/VuFind/Controller/AbstractBase.php index db3c3733d45..f5afe675596 100644 --- a/module/VuFind/src/VuFind/Controller/AbstractBase.php +++ b/module/VuFind/src/VuFind/Controller/AbstractBase.php @@ -385,7 +385,7 @@ protected function forceLogin($msg = null, $extras = [], $forward = true) $this->followup()->store($extras, $url); } if (!empty($msg)) { - $this->flashMessenger()->setNamespace('error')->addMessage($msg); + $this->flashMessenger()->addMessage($msg, 'error'); } // Set a flag indicating that we are forcing login: @@ -426,8 +426,7 @@ protected function catalogLogin() // If login failed, store a warning message: if (!$patron) { - $this->flashMessenger()->setNamespace('error') - ->addMessage('Invalid Patron Login'); + $this->flashMessenger()->addMessage('Invalid Patron Login', 'error'); } } else { // If no credentials were provided, try the stored values: diff --git a/module/VuFind/src/VuFind/Controller/AbstractRecord.php b/module/VuFind/src/VuFind/Controller/AbstractRecord.php index f3cd99935d3..9954136bb8d 100644 --- a/module/VuFind/src/VuFind/Controller/AbstractRecord.php +++ b/module/VuFind/src/VuFind/Controller/AbstractRecord.php @@ -131,11 +131,9 @@ public function addcommentAction() $driver->getUniqueId(), $driver->getResourceSource(), true, $driver ); $resource->addComment($comment, $user); - $this->flashMessenger()->setNamespace('success') - ->addMessage('add_comment_success'); + $this->flashMessenger()->addMessage('add_comment_success', 'success'); } else { - $this->flashMessenger()->setNamespace('error') - ->addMessage('add_comment_fail_blank'); + $this->flashMessenger()->addMessage('add_comment_fail_blank', 'error'); } return $this->redirectToRecord('', 'UserComments'); @@ -155,11 +153,9 @@ public function deletecommentAction() $id = $this->params()->fromQuery('delete'); $table = $this->getTable('Comments'); if (!is_null($id) && $table->deleteIfOwnedByUser($id, $user)) { - $this->flashMessenger()->setNamespace('success') - ->addMessage('delete_comment_success'); + $this->flashMessenger()->addMessage('delete_comment_success', 'success'); } else { - $this->flashMessenger()->setNamespace('error') - ->addMessage('delete_comment_failure'); + $this->flashMessenger()->addMessage('delete_comment_failure', 'error'); } return $this->redirectToRecord('', 'UserComments'); } @@ -188,8 +184,8 @@ public function addtagAction() if ($tags = $this->params()->fromPost('tag')) { $tagParser = $this->getServiceLocator()->get('VuFind\Tags'); $driver->addTags($user, $tagParser->parse($tags)); - $this->flashMessenger()->setNamespace('success') - ->addMessage(['msg' => 'add_tag_success']); + $this->flashMessenger() + ->addMessage(['msg' => 'add_tag_success'], 'success'); return $this->redirectToRecord(); } @@ -222,13 +218,12 @@ public function deletetagAction() // Save tags, if any: if ($tag = $this->params()->fromPost('tag')) { $driver->deleteTags($user, [$tag]); - $this->flashMessenger()->setNamespace('success') - ->addMessage( - [ - 'msg' => 'tags_deleted', - 'tokens' => ['%count%' => 1] - ] - ); + $this->flashMessenger()->addMessage( + [ + 'msg' => 'tags_deleted', + 'tokens' => ['%count%' => 1] + ], 'success' + ); } return $this->redirectToRecord(); @@ -286,8 +281,7 @@ protected function processSave() $driver->saveToFavorites($post, $user); // Display a success status message: - $this->flashMessenger()->setNamespace('success') - ->addMessage('bulk_save_success'); + $this->flashMessenger()->addMessage('bulk_save_success', 'success'); // redirect to followup url saved in saveAction if ($url = $this->getFollowupUrl()) { @@ -412,12 +406,10 @@ public function emailAction() $view->to, $view->from, $view->message, $driver, $this->getViewRenderer(), $view->subject, $cc ); - $this->flashMessenger()->setNamespace('success') - ->addMessage('email_success'); + $this->flashMessenger()->addMessage('email_success', 'success'); return $this->redirectToRecord(); } catch (MailException $e) { - $this->flashMessenger()->setNamespace('error') - ->addMessage($e->getMessage()); + $this->flashMessenger()->addMessage($e->getMessage(), 'error'); } } @@ -456,12 +448,10 @@ public function smsAction() ['driver' => $driver, 'to' => $view->to] ); $sms->text($view->provider, $view->to, null, $body); - $this->flashMessenger()->setNamespace('success') - ->addMessage('sms_success'); + $this->flashMessenger()->addMessage('sms_success', 'success'); return $this->redirectToRecord(); } catch (MailException $e) { - $this->flashMessenger()->setNamespace('error') - ->addMessage($e->getMessage()); + $this->flashMessenger()->addMessage($e->getMessage(), 'error'); } } @@ -497,8 +487,8 @@ public function exportAction() $export = $this->getServiceLocator()->get('VuFind\Export'); if (empty($format) || !$export->recordSupportsFormat($driver, $format)) { if (!empty($format)) { - $this->flashMessenger()->setNamespace('error') - ->addMessage('export_invalid_format'); + $this->flashMessenger() + ->addMessage('export_invalid_format', 'error'); } $view->setTemplate('record/export-menu'); return $view; @@ -597,35 +587,6 @@ protected function getTabConfiguration() return $cfg['vufind']['recorddriver_tabs']; } - /** - * Get a default tab by looking up the provided record driver in the tab - * configuration array. - * - * @param AbstractRecordDriver $driver Record driver - * - * @return string - */ - protected function getDefaultTabForRecord(AbstractRecordDriver $driver) - { - // Load configuration: - $config = $this->getTabConfiguration(); - - // Get the current record driver's class name, then start a loop - // in case we need to use a parent class' name to find the appropriate - // setting. - $className = get_class($driver); - while (true) { - if (isset($config[$className]['defaultTab'])) { - return $config[$className]['defaultTab']; - } - $className = get_parent_class($className); - if (empty($className)) { - // No setting found... - return null; - } - } - } - /** * Get default tab for a given driver * @@ -637,7 +598,9 @@ protected function getDefaultTab() if (null === $this->defaultTab) { // Load record driver tab configuration: $driver = $this->loadRecord(); - $this->defaultTab = $this->getDefaultTabForRecord($driver); + $this->defaultTab = $this->getServiceLocator() + ->get('VuFind\RecordTabPluginManager') + ->getDefaultTabForRecord($driver, $this->getTabConfiguration()); // Missing/invalid record driver configuration? Fall back to configured // default: diff --git a/module/VuFind/src/VuFind/Controller/AbstractSearch.php b/module/VuFind/src/VuFind/Controller/AbstractSearch.php index 955150fe9bb..85d166f3b7d 100644 --- a/module/VuFind/src/VuFind/Controller/AbstractSearch.php +++ b/module/VuFind/src/VuFind/Controller/AbstractSearch.php @@ -385,8 +385,7 @@ protected function restoreAdvancedSearch($searchId) $searchTable = $this->getTable('Search'); $search = $searchTable->select(['id' => $searchId])->current(); if (empty($search)) { - $this->flashMessenger()->setNamespace('error') - ->addMessage('advSearchError_notFound'); + $this->flashMessenger()->addMessage('advSearchError_notFound', 'error'); return false; } @@ -394,8 +393,7 @@ protected function restoreAdvancedSearch($searchId) $user = $this->getUser(); $sessId = $this->getServiceLocator()->get('VuFind\SessionManager')->getId(); if ($search->session_id != $sessId && $search->user_id != $user->id) { - $this->flashMessenger()->setNamespace('error') - ->addMessage('advSearchError_noRights'); + $this->flashMessenger()->addMessage('advSearchError_noRights', 'error'); return false; } @@ -408,8 +406,8 @@ protected function restoreAdvancedSearch($searchId) try { $savedSearch->getParams()->convertToAdvancedSearch(); } catch (\Exception $ex) { - $this->flashMessenger()->setNamespace('error') - ->addMessage('advSearchError_notAdvanced'); + $this->flashMessenger() + ->addMessage('advSearchError_notAdvanced', 'error'); return false; } } diff --git a/module/VuFind/src/VuFind/Controller/AjaxController.php b/module/VuFind/src/VuFind/Controller/AjaxController.php index 7089d8e119c..d8ccc7db0f6 100644 --- a/module/VuFind/src/VuFind/Controller/AjaxController.php +++ b/module/VuFind/src/VuFind/Controller/AjaxController.php @@ -512,31 +512,34 @@ protected function getSaveStatusesAjax() /** * Send output data and exit. * - * @param mixed $data The response data - * @param string $status Status of the request + * @param mixed $data The response data + * @param string $status Status of the request + * @param int $httpCode A custom HTTP Status Code * * @return \Zend\Http\Response + * @throws \Exception */ - protected function output($data, $status) + protected function output($data, $status, $httpCode = null) { + $response = $this->getResponse(); + $headers = $response->getHeaders(); + $headers->addHeaderLine('Cache-Control', 'no-cache, must-revalidate'); + $headers->addHeaderLine('Expires', 'Mon, 26 Jul 1997 05:00:00 GMT'); + if ($httpCode !== null) { + $response->setStatusCode($httpCode); + } if ($this->outputMode == 'json') { - $response = $this->getResponse(); - $headers = $response->getHeaders(); - $headers->addHeaderLine( - 'Content-type', 'application/javascript' - ); - $headers->addHeaderLine( - 'Cache-Control', 'no-cache, must-revalidate' - ); - $headers->addHeaderLine( - 'Expires', 'Mon, 26 Jul 1997 05:00:00 GMT' - ); - $output = ['data' => $data,'status' => $status]; + $headers->addHeaderLine('Content-type', 'application/javascript'); + $output = ['data' => $data, 'status' => $status]; if ('development' == APPLICATION_ENV && count(self::$php_errors) > 0) { $output['php_errors'] = self::$php_errors; } $response->setContent(json_encode($output)); return $response; + } else if ($this->outputMode == 'plaintext') { + $headers->addHeaderLine('Content-type', 'text/plain'); + $response->setContent($data ? $status . " $data" : $status); + return $response; } else { throw new \Exception('Unsupported output mode: ' . $this->outputMode); } @@ -854,108 +857,6 @@ protected function processFacetValues($fields, $results) return $retVal; } - /** - * Save a record to a list. - * - * @return \Zend\Http\Response - */ - protected function saveRecordAjax() - { - $user = $this->getUser(); - if (!$user) { - return $this->output( - $this->translate('You must be logged in first'), - self::STATUS_NEED_AUTH - ); - } - - $driver = $this->getRecordLoader()->load( - $this->params()->fromPost('id'), - $this->params()->fromPost('source', 'VuFind') - ); - $post = $this->getRequest()->getPost()->toArray(); - $tagParser = $this->getServiceLocator()->get('VuFind\Tags'); - $post['mytags'] = $tagParser->parse($post['mytags']); - $driver->saveToFavorites($post, $user); - return $this->output('Done', self::STATUS_OK); - } - - /** - * Saves records to a User's favorites - * - * @return \Zend\Http\Response - */ - protected function bulkSaveAjax() - { - // Without IDs, we can't continue - $ids = $this->params()->fromPost('ids', []); - if (empty($ids)) { - return $this->output( - ['result' => $this->translate('bulk_error_missing')], - self::STATUS_ERROR - ); - } - - $user = $this->getUser(); - if (!$user) { - return $this->output( - $this->translate('You must be logged in first'), - self::STATUS_NEED_AUTH - ); - } - - try { - $this->favorites()->saveBulk( - $this->getRequest()->getPost()->toArray(), $user - ); - return $this->output( - [ - 'result' => ['list' => $this->params()->fromPost('list')], - 'info' => $this->translate("bulk_save_success") - ], self::STATUS_OK - ); - } catch (\Exception $e) { - return $this->output( - ['info' => $this->translate('bulk_save_error')], - self::STATUS_ERROR - ); - } - } - - /** - * Add a list. - * - * @return \Zend\Http\Response - */ - protected function addListAjax() - { - $user = $this->getUser(); - - try { - $table = $this->getTable('UserList'); - $list = $table->getNew($user); - $id = $list->updateFromRequest($user, $this->getRequest()->getPost()); - } catch (\Exception $e) { - switch(get_class($e)) { - case 'VuFind\Exception\LoginRequired': - return $this->output( - $this->translate('You must be logged in first'), - self::STATUS_NEED_AUTH - ); - break; - case 'VuFind\Exception\ListPermission': - case 'VuFind\Exception\MissingField': - return $this->output( - $this->translate($e->getMessage()), self::STATUS_ERROR - ); - default: - throw $e; - } - } - - return $this->output(['id' => $id], self::STATUS_OK); - } - /** * Get Autocomplete suggestions. * @@ -972,159 +873,6 @@ protected function getACSuggestionsAjax() ); } - /** - * Text a record. - * - * @return \Zend\Http\Response - */ - protected function smsRecordAjax() - { - $this->writeSession(); // avoid session write timing bug - // Attempt to send the email: - try { - // Check captcha - $this->recaptcha()->setErrorMode('throw'); - $useRecaptcha = $this->recaptcha()->active('sms'); - // Process form submission: - if (!$this->formWasSubmitted('id', $useRecaptcha)) { - throw new \Exception('recaptcha_not_passed'); - } - $record = $this->getRecordLoader()->load( - $this->params()->fromPost('id'), - $this->params()->fromPost('source', 'VuFind') - ); - $to = $this->params()->fromPost('to'); - $body = $this->getViewRenderer()->partial( - 'Email/record-sms.phtml', ['driver' => $record, 'to' => $to] - ); - $this->getServiceLocator()->get('VuFind\SMS')->text( - $this->params()->fromPost('provider'), $to, null, $body - ); - return $this->output( - $this->translate('sms_success'), self::STATUS_OK - ); - } catch (\Exception $e) { - return $this->output( - $this->translate($e->getMessage()), self::STATUS_ERROR - ); - } - } - - /** - * Email a record. - * - * @return \Zend\Http\Response - */ - protected function emailRecordAjax() - { - $this->writeSession(); // avoid session write timing bug - - // Force login if necessary: - $config = $this->getConfig(); - if ((!isset($config->Mail->require_login) || $config->Mail->require_login) - && !$this->getUser() - ) { - return $this->output( - $this->translate('You must be logged in first'), - self::STATUS_NEED_AUTH - ); - } - - // Attempt to send the email: - try { - // Check captcha - $this->recaptcha()->setErrorMode('throw'); - $useRecaptcha = $this->recaptcha()->active('email'); - // Process form submission: - if (!$this->formWasSubmitted('id', $useRecaptcha)) { - throw new \Exception('recaptcha_not_passed'); - } - - $record = $this->getRecordLoader()->load( - $this->params()->fromPost('id'), - $this->params()->fromPost('source', 'VuFind') - ); - $mailer = $this->getServiceLocator()->get('VuFind\Mailer'); - $view = $this->createEmailViewModel( - null, $mailer->getDefaultRecordSubject($record) - ); - $mailer->setMaxRecipients($view->maxRecipients); - $cc = $this->params()->fromPost('ccself') && $view->from != $view->to - ? $view->from : null; - $mailer->sendRecord( - $view->to, $view->from, $view->message, $record, - $this->getViewRenderer(), $view->subject, $cc - ); - return $this->output( - $this->translate('email_success'), self::STATUS_OK - ); - } catch (\Exception $e) { - return $this->output( - $this->translate($e->getMessage()), self::STATUS_ERROR - ); - } - } - - /** - * Email a search. - * - * @return \Zend\Http\Response - */ - protected function emailSearchAjax() - { - $this->writeSession(); // avoid session write timing bug - - // Force login if necessary: - $config = $this->getConfig(); - if ((!isset($config->Mail->require_login) || $config->Mail->require_login) - && !$this->getUser() - ) { - return $this->output( - $this->translate('You must be logged in first'), - self::STATUS_NEED_AUTH - ); - } - - // Make sure URL is properly formatted -- if no protocol is specified, run it - // through the serverurl helper: - $url = $this->params()->fromPost('url'); - if (substr($url, 0, 4) != 'http') { - $urlHelper = $this->getViewRenderer()->plugin('serverurl'); - $url = $urlHelper($url); - } - - // Attempt to send the email: - try { - // Check captcha - $this->recaptcha()->setErrorMode('throw'); - $useRecaptcha = $this->recaptcha()->active('email'); - // Process form submission: - if (!$this->formWasSubmitted('url', $useRecaptcha)) { - throw new \Exception('recaptcha_not_passed'); - } - - $mailer = $this->getServiceLocator()->get('VuFind\Mailer'); - $defaultSubject = $this->params()->fromQuery('cart') - ? $this->translate('bulk_email_title') - : $mailer->getDefaultLinkSubject(); - $view = $this->createEmailViewModel(null, $defaultSubject); - $mailer->setMaxRecipients($view->maxRecipients); - $cc = $this->params()->fromPost('ccself') && $view->from != $view->to - ? $view->from : null; - $mailer->sendLink( - $view->to, $view->from, $view->message, $url, - $this->getViewRenderer(), $view->subject, $cc - ); - return $this->output( - $this->translate('email_success'), self::STATUS_OK - ); - } catch (\Exception $e) { - return $this->output( - $this->translate($e->getMessage()), self::STATUS_ERROR - ); - } - } - /** * Check Request is Valid * @@ -1278,57 +1026,6 @@ protected function getRecordCommentsAsHTMLAjax() return $this->output($html, self::STATUS_OK); } - /** - * Delete multiple items from favorites or a list. - * - * @return \Zend\Http\Response - */ - protected function deleteFavoritesAjax() - { - $user = $this->getUser(); - if ($user === false) { - return $this->output( - $this->translate('You must be logged in first'), - self::STATUS_NEED_AUTH - ); - } - - $listID = $this->params()->fromPost('listID'); - $ids = $this->params()->fromPost('ids'); - - if (!is_array($ids)) { - return $this->output( - $this->translate('delete_missing'), - self::STATUS_ERROR - ); - } - - $this->favorites()->delete($ids, $listID, $user); - return $this->output( - ['result' => $this->translate('fav_delete_success')], - self::STATUS_OK - ); - } - - /** - * Delete records from a User's cart - * - * @return \Zend\Http\Response - */ - protected function removeItemsCartAjax() - { - // Without IDs, we can't continue - $ids = $this->params()->fromPost('ids'); - if (empty($ids)) { - return $this->output( - ['result' => $this->translate('bulk_error_missing')], - self::STATUS_ERROR - ); - } - $this->getServiceLocator()->get('VuFind\Cart')->removeItems($ids); - return $this->output(['delete' => true], self::STATUS_OK); - } - /** * Process an export request * @@ -1351,6 +1048,7 @@ protected function exportFavoritesAjax() 'result' => $this->translate('Done'), 'result_additional' => $html, 'needs_redirect' => $export->needsRedirect($format), + 'export_type' => $export->getBulkExportType($format), 'result_url' => $url ], self::STATUS_OK ); @@ -1597,6 +1295,55 @@ protected function getFacetDataAjax() ); } + /** + * Check status and return a status message for e.g. a load balancer. + * + * A simple OK as text/plain is returned if everything works properly. + * + * @return \Zend\Http\Response + */ + protected function systemStatusAction() + { + $this->outputMode = 'plaintext'; + + // Check system status + $config = $this->getConfig(); + if (!empty($config->System->healthCheckFile) + && file_exists($config->System->healthCheckFile) + ) { + return $this->output( + 'Health check file exists', self::STATUS_ERROR, 503 + ); + } + + // Test search index + try { + $results = $this->getResultsManager()->get('Solr'); + $params = $results->getParams(); + $params->setQueryIDs(['healthcheck']); + $results->performAndProcessSearch(); + } catch (\Exception $e) { + return $this->output( + 'Search index error: ' . $e->getMessage(), self::STATUS_ERROR, 500 + ); + } + + // Test database connection + try { + $sessionTable = $this->getTable('Session'); + $sessionTable->getBySessionId('healthcheck', false); + } catch (\Exception $e) { + return $this->output( + 'Database error: ' . $e->getMessage(), self::STATUS_ERROR, 500 + ); + } + + // This may be called frequently, don't leave sessions dangling + $this->getServiceLocator()->get('VuFind\SessionManager')->destroy(); + + return $this->output('', self::STATUS_OK); + } + /** * Convenience method for accessing results * diff --git a/module/VuFind/src/VuFind/Controller/CartController.php b/module/VuFind/src/VuFind/Controller/CartController.php index 5a6d9f653b1..a4b48af277a 100644 --- a/module/VuFind/src/VuFind/Controller/CartController.php +++ b/module/VuFind/src/VuFind/Controller/CartController.php @@ -128,8 +128,7 @@ public function cartAction() $msg = $this->translate('bookbag_full_msg') . ". " . $addItems['notAdded'] . " " . $this->translate('items_already_in_bookbag') . "."; - $this->flashMessenger()->setNamespace('info') - ->addMessage($msg); + $this->flashMessenger()->addMessage($msg, 'info'); } } } @@ -229,8 +228,7 @@ public function emailAction() ); return $this->redirectToSource('success', 'email_success'); } catch (MailException $e) { - $this->flashMessenger()->setNamespace('error') - ->addMessage($e->getMessage()); + $this->flashMessenger()->addMessage($e->getMessage(), 'error'); } } @@ -312,8 +310,8 @@ public function exportAction() // No legal export options? Display a warning: if (empty($view->exportOptions)) { - $this->flashMessenger()->setNamespace('error') - ->addMessage('bulk_export_not_supported'); + $this->flashMessenger() + ->addMessage('bulk_export_not_supported', 'error'); } return $view; } @@ -387,8 +385,7 @@ public function saveAction() if ($this->formWasSubmitted('submit')) { $this->favorites() ->saveBulk($this->getRequest()->getPost()->toArray(), $user); - $this->flashMessenger()->setNamespace('success') - ->addMessage('bulk_save_success'); + $this->flashMessenger()->addMessage('bulk_save_success', 'success'); $list = $this->params()->fromPost('list'); if (!empty($list)) { return $this->redirect()->toRoute('userList', ['id' => $list]); @@ -418,9 +415,8 @@ public function saveAction() public function redirectToSource($flashNamespace = null, $flashMsg = null) { // Set flash message if requested: - if (!is_null($flashNamespace) && !empty($flashMsg)) { - $this->flashMessenger()->setNamespace($flashNamespace) - ->addMessage($flashMsg); + if (null !== $flashNamespace && !empty($flashMsg)) { + $this->flashMessenger()->addMessage($flashMsg, $flashNamespace); } // If we entered the controller in the expected way (i.e. via the diff --git a/module/VuFind/src/VuFind/Controller/ConfirmController.php b/module/VuFind/src/VuFind/Controller/ConfirmController.php index c6b09e0c27a..4e856675f89 100644 --- a/module/VuFind/src/VuFind/Controller/ConfirmController.php +++ b/module/VuFind/src/VuFind/Controller/ConfirmController.php @@ -53,8 +53,6 @@ public function confirmAction() // Assign Flash Messages if (isset($data['messages'])) { - $this->flashMessenger()->setNamespace('info'); - foreach ($data['messages'] as $message) { $flash = (true === is_array($message)) ? [ @@ -62,7 +60,7 @@ public function confirmAction() 'tokens' => $message['tokens'] ] : $message; - $this->flashMessenger()->addMessage($flash); + $this->flashMessenger()->addMessage($flash, 'info'); } } diff --git a/module/VuFind/src/VuFind/Controller/HoldsTrait.php b/module/VuFind/src/VuFind/Controller/HoldsTrait.php index c48610e1719..f1cd573568e 100644 --- a/module/VuFind/src/VuFind/Controller/HoldsTrait.php +++ b/module/VuFind/src/VuFind/Controller/HoldsTrait.php @@ -45,8 +45,7 @@ trait HoldsTrait */ public function blockedholdAction() { - $this->flashMessenger()->setNamespace('error') - ->addMessage('hold_error_blocked'); + $this->flashMessenger()->addMessage('hold_error_blocked', 'error'); return $this->redirectToRecord('#top'); } @@ -107,13 +106,12 @@ public function holdAction() $gatheredDetails, $extraHoldFields, $requestGroups ); if (!$valid) { - $this->flashMessenger()->setNamespace('error') - ->addMessage('hold_invalid_request_group'); + $this->flashMessenger() + ->addMessage('hold_invalid_request_group', 'error'); } elseif (!$this->holds()->validatePickUpInput( $gatheredDetails['pickUpLocation'], $extraHoldFields, $pickup )) { - $this->flashMessenger()->setNamespace('error') - ->addMessage('hold_invalid_pickup'); + $this->flashMessenger()->addMessage('hold_invalid_pickup', 'error'); } else { // If we made it this far, we're ready to place the hold; // if successful, we will redirect and can stop here. @@ -134,19 +132,18 @@ public function holdAction() '%%url%%' => $this->url()->fromRoute('myresearch-holds') ], ]; - $this->flashMessenger()->setNamespace('success') - ->addMessage($msg); + $this->flashMessenger()->addMessage($msg, 'success'); return $this->redirectToRecord('#top'); } else { // Failure: use flash messenger to display messages, stay on // the current form. if (isset($results['status'])) { - $this->flashMessenger()->setNamespace('error') - ->addMessage($results['status']); + $this->flashMessenger() + ->addMessage($results['status'], 'error'); } if (isset($results['sysMessage'])) { - $this->flashMessenger()->setNamespace('error') - ->addMessage($results['sysMessage']); + $this->flashMessenger() + ->addMessage($results['sysMessage'], 'error'); } } } diff --git a/module/VuFind/src/VuFind/Controller/ILLRequestsTrait.php b/module/VuFind/src/VuFind/Controller/ILLRequestsTrait.php index 0436f4094dd..97720e3a934 100644 --- a/module/VuFind/src/VuFind/Controller/ILLRequestsTrait.php +++ b/module/VuFind/src/VuFind/Controller/ILLRequestsTrait.php @@ -45,8 +45,7 @@ trait ILLRequestsTrait */ public function blockedILLRequestAction() { - $this->flashMessenger()->setNamespace('error') - ->addMessage('ill_request_error_blocked'); + $this->flashMessenger()->addMessage('ill_request_error_blocked', 'error'); return $this->redirectToRecord('#top'); } @@ -112,8 +111,8 @@ public function illRequestAction() // Success: Go to Display ILL Requests if (isset($results['success']) && $results['success'] == true) { - $this->flashMessenger()->setNamespace('success') - ->addMessage('ill_request_place_success'); + $this->flashMessenger() + ->addMessage('ill_request_place_success', 'success'); if ($this->inLightbox()) { return false; } @@ -124,12 +123,12 @@ public function illRequestAction() // Failure: use flash messenger to display messages, stay on // the current form. if (isset($results['status'])) { - $this->flashMessenger()->setNamespace('error') - ->addMessage($results['status']); + $this->flashMessenger() + ->addMessage($results['status'], 'error'); } if (isset($results['sysMessage'])) { - $this->flashMessenger()->setNamespace('error') - ->addMessage($results['sysMessage']); + $this->flashMessenger() + ->addMessage($results['sysMessage'], 'error'); } } } diff --git a/module/VuFind/src/VuFind/Controller/InstallController.php b/module/VuFind/src/VuFind/Controller/InstallController.php index 05fedd3a748..71ee2fb58c2 100644 --- a/module/VuFind/src/VuFind/Controller/InstallController.php +++ b/module/VuFind/src/VuFind/Controller/InstallController.php @@ -258,7 +258,7 @@ public function fixdependenciesAction() if (!$this->phpVersionIsNewEnough()) { $msg = "VuFind requires PHP version 5.3.3 or newer; you are running " . phpversion() . ". Please upgrade."; - $this->flashMessenger()->setNamespace('error')->addMessage($msg); + $this->flashMessenger()->addMessage($msg, 'error'); $problems++; } @@ -270,7 +270,7 @@ public function fixdependenciesAction() . " this. For details on how to do this, see " . "http://vufind.org/wiki/vufind2:installation_notes " . "and look at the PHP installation instructions for your platform."; - $this->flashMessenger()->setNamespace('error')->addMessage($msg); + $this->flashMessenger()->addMessage($msg, 'error'); $problems++; } @@ -282,7 +282,7 @@ public function fixdependenciesAction() . " For details on how to do this, see " . "http://vufind.org/wiki/vufind2:installation_notes " . "and look at the PHP installation instructions for your platform."; - $this->flashMessenger()->setNamespace('error')->addMessage($msg); + $this->flashMessenger()->addMessage($msg, 'error'); $problems++; } @@ -294,7 +294,7 @@ public function fixdependenciesAction() . " this. For details on how to do this, see " . "http://vufind.org/wiki/vufind2:installation_notes " . "and look at the PHP installation instructions for your platform."; - $this->flashMessenger()->setNamespace('error')->addMessage($msg); + $this->flashMessenger()->addMessage($msg, 'error'); $problems++; } @@ -305,7 +305,7 @@ public function fixdependenciesAction() . " For details on how to do this, see " . "http://vufind.org/wiki/vufind2:installation_notes " . "and look at the PHP installation instructions for your platform."; - $this->flashMessenger()->setNamespace('error')->addMessage($msg); + $this->flashMessenger()->addMessage($msg, 'error'); $problems++; } @@ -330,20 +330,20 @@ public function fixdatabaseAction() $skip = $this->params()->fromPost('printsql', 'nope') == 'Skip'; if (!preg_match('/^\w*$/', $view->dbname)) { - $this->flashMessenger()->setNamespace('error') - ->addMessage('Database name must be alphanumeric.'); + $this->flashMessenger() + ->addMessage('Database name must be alphanumeric.', 'error'); } else if (!preg_match('/^\w*$/', $view->dbuser)) { - $this->flashMessenger()->setNamespace('error') - ->addMessage('Database user must be alphanumeric.'); + $this->flashMessenger() + ->addMessage('Database user must be alphanumeric.', 'error'); } else if ($skip || $this->formWasSubmitted('submit')) { $newpass = $this->params()->fromPost('dbpass'); $newpassConf = $this->params()->fromPost('dbpassconfirm'); if ((empty($newpass) || empty($newpassConf))) { - $this->flashMessenger()->setNamespace('error') - ->addMessage('Password fields must not be blank.'); + $this->flashMessenger() + ->addMessage('Password fields must not be blank.', 'error'); } else if ($newpass != $newpassConf) { - $this->flashMessenger()->setNamespace('error') - ->addMessage('Password fields must match.'); + $this->flashMessenger() + ->addMessage('Password fields must match.', 'error'); } else { // Connect to database: $connection = $view->driver . '://' . $view->dbrootuser . ':' @@ -355,11 +355,11 @@ public function fixdatabaseAction() $db = $this->getServiceLocator()->get('VuFind\DbAdapterFactory') ->getAdapterFromConnectionString("{$connection}/{$dbName}"); } catch (\Exception $e) { - $this->flashMessenger()->setNamespace('error') + $this->flashMessenger() ->addMessage( 'Problem initializing database adapter; ' . 'check for missing ' . $view->driver - . ' library . Details: ' . $e->getMessage() + . ' library . Details: ' . $e->getMessage(), 'error' ); return $view; } @@ -419,8 +419,7 @@ public function fixdatabaseAction() } return $this->redirect()->toRoute('install-home'); } catch (\Exception $e) { - $this->flashMessenger()->setNamespace('error') - ->addMessage($e->getMessage()); + $this->flashMessenger()->addMessage($e->getMessage(), 'error'); } } } @@ -729,7 +728,7 @@ public function fixsecurityAction() $userConfirmation = $this->params()->fromPost('fix-user-table', 'Unset'); if ($userConfirmation == 'No') { $msg = 'Security upgrade aborted.'; - $this->flashMessenger()->setNamespace('error')->addMessage($msg); + $this->flashMessenger()->addMessage($msg, 'error'); return $this->redirect()->toRoute('install-home'); } @@ -788,7 +787,7 @@ public function performsecurityfixAction() } } $msg = count($rows) . ' user row(s) encrypted.'; - $this->flashMessenger()->setNamespace('info')->addMessage($msg); + $this->flashMessenger()->addMessage($msg, 'info'); } return $this->redirect()->toRoute('install-home'); } diff --git a/module/VuFind/src/VuFind/Controller/LibraryCardsController.php b/module/VuFind/src/VuFind/Controller/LibraryCardsController.php index 5c99e5e1bc5..4b5ac6632d1 100644 --- a/module/VuFind/src/VuFind/Controller/LibraryCardsController.php +++ b/module/VuFind/src/VuFind/Controller/LibraryCardsController.php @@ -163,8 +163,7 @@ public function deleteCardAction() $user->deleteLibraryCard($cardID); // Success Message - $this->flashMessenger()->setNamespace('success') - ->addMessage('Library Card Deleted'); + $this->flashMessenger()->addMessage('Library Card Deleted', 'success'); // Redirect to MyResearch library cards return $this->redirect()->toRoute('librarycards-home'); } @@ -217,8 +216,8 @@ protected function processEditLibraryCard($user) $password = $this->params()->fromPost('password', ''); if (!$username || !$password) { - $this->flashMessenger()->setNamespace('error') - ->addMessage('authentication_error_blank'); + $this->flashMessenger() + ->addMessage('authentication_error_blank', 'error'); return false; } @@ -230,8 +229,8 @@ protected function processEditLibraryCard($user) $catalog = $this->getILS(); $patron = $catalog->patronLogin($username, $password); if (!$patron) { - $this->flashMessenger()->setNamespace('error') - ->addMessage('authentication_error_invalid'); + $this->flashMessenger() + ->addMessage('authentication_error_invalid', 'error'); return false; } @@ -241,8 +240,7 @@ protected function processEditLibraryCard($user) $id == 'NEW' ? null : $id, $cardName, $username, $password ); } catch(\VuFind\Exception\LibraryCard $e) { - $this->flashMessenger()->setNamespace('error') - ->addMessage($e->getMessage()); + $this->flashMessenger()->addMessage($e->getMessage(), 'error'); return false; } diff --git a/module/VuFind/src/VuFind/Controller/MissingrecordController.php b/module/VuFind/src/VuFind/Controller/MissingrecordController.php index de95dddfab1..a2d746dd080 100644 --- a/module/VuFind/src/VuFind/Controller/MissingrecordController.php +++ b/module/VuFind/src/VuFind/Controller/MissingrecordController.php @@ -45,8 +45,7 @@ class MissingrecordController extends AbstractBase */ public function homeAction() { - $this->flashMessenger()->setNamespace('error') - ->addMessage('Cannot find record'); + $this->flashMessenger()->addMessage('Cannot find record', 'error'); return $this->createViewModel(); } } diff --git a/module/VuFind/src/VuFind/Controller/MyResearchController.php b/module/VuFind/src/VuFind/Controller/MyResearchController.php index 4b11239b007..32b0fbaaefb 100644 --- a/module/VuFind/src/VuFind/Controller/MyResearchController.php +++ b/module/VuFind/src/VuFind/Controller/MyResearchController.php @@ -63,7 +63,7 @@ protected function processAuthenticationException(AuthException $e) ) { $msg = 'authentication_error_loggedout'; } - $this->flashMessenger()->setNamespace('error')->addMessage($msg); + $this->flashMessenger()->addMessage($msg, 'error'); } /** @@ -169,8 +169,7 @@ public function accountAction() $this->getAuthManager()->create($this->getRequest()); return $this->forwardTo('MyResearch', 'Home'); } catch (AuthException $e) { - $this->flashMessenger()->setNamespace('error') - ->addMessage($e->getMessage()); + $this->flashMessenger()->addMessage($e->getMessage(), 'error'); } } else { // If we are not processing a submission, we need to simply display @@ -285,12 +284,10 @@ public function savesearchAction() $search = $this->getTable('Search'); if (($id = $this->params()->fromQuery('save', false)) !== false) { $search->setSavedFlag($id, true, $user->id); - $this->flashMessenger()->setNamespace('success') - ->addMessage('search_save_success'); + $this->flashMessenger()->addMessage('search_save_success', 'success'); } else if (($id = $this->params()->fromQuery('delete', false)) !== false) { $search->setSavedFlag($id, false); - $this->flashMessenger()->setNamespace('success') - ->addMessage('search_unsave_success'); + $this->flashMessenger()->addMessage('search_unsave_success', 'success'); } else { throw new \Exception('Missing save and delete parameters.'); } @@ -326,8 +323,7 @@ public function profileAction() if (!empty($homeLibrary)) { $user->changeHomeLibrary($homeLibrary); $this->getAuthManager()->updateSession($user); - $this->flashMessenger()->setNamespace('success') - ->addMessage('profile_update'); + $this->flashMessenger()->addMessage('profile_update', 'success'); } // Begin building view object: @@ -401,16 +397,14 @@ public function deleteAction() ? $this->params()->fromPost('ids') : $this->params()->fromPost('idsAll'); if (!is_array($ids) || empty($ids)) { - $this->flashMessenger()->setNamespace('error') - ->addMessage('bulk_noitems_advice'); + $this->flashMessenger()->addMessage('bulk_noitems_advice', 'error'); return $this->redirect()->toUrl($newUrl); } // Process the deletes if necessary: if ($this->formWasSubmitted('submit')) { $this->favorites()->delete($ids, $listID, $user); - $this->flashMessenger()->setNamespace('success') - ->addMessage('fav_delete_success'); + $this->flashMessenger()->addMessage('fav_delete_success', 'success'); return $this->redirect()->toUrl($newUrl); } @@ -460,13 +454,12 @@ public function performDeleteFavorite($id, $source) $table = $this->getTable('UserList'); $list = $table->getExisting($listID); $list->removeResourcesById($user, [$id], $source); - $this->flashMessenger()->setNamespace('success') - ->addMessage('Item removed from list'); + $this->flashMessenger()->addMessage('Item removed from list', 'success'); } else { // ...My Favorites $user->removeResourcesById([$id], $source); - $this->flashMessenger()->setNamespace('success') - ->addMessage('Item removed from favorites'); + $this->flashMessenger() + ->addMessage('Item removed from favorites', 'success'); } // All done -- return true to indicate success. @@ -503,8 +496,7 @@ protected function processEditSubmit($user, $driver, $listID) if ($addToList > -1) { $driver->saveToFavorites(['list' => $addToList], $user); } - $this->flashMessenger()->setNamespace('success') - ->addMessage('edit_list_success'); + $this->flashMessenger()->addMessage('edit_list_success', 'success'); $newUrl = is_null($listID) ? $this->url()->fromRoute('myresearch-favorites') @@ -722,8 +714,7 @@ protected function processEditList($user, $list) switch(get_class($e)) { case 'VuFind\Exception\ListPermission': case 'VuFind\Exception\MissingField': - $this->flashMessenger()->setNamespace('error') - ->addMessage($e->getMessage()); + $this->flashMessenger()->addMessage($e->getMessage(), 'error'); return false; case 'VuFind\Exception\LoginRequired': return $this->forceLogin(); @@ -801,8 +792,7 @@ public function deletelistAction() $list->delete($this->getUser()); // Success Message - $this->flashMessenger()->setNamespace('success') - ->addMessage('fav_list_delete'); + $this->flashMessenger()->addMessage('fav_list_delete', 'success'); } catch (\Exception $e) { switch(get_class($e)) { case 'VuFind\Exception\LoginRequired': @@ -1167,8 +1157,7 @@ public function recoverAction() // Make sure we're configured to do this $this->setUpAuthenticationFromRequest(); if (!$this->getAuthManager()->supportsRecovery()) { - $this->flashMessenger()->setNamespace('error') - ->addMessage('recovery_disabled'); + $this->flashMessenger()->addMessage('recovery_disabled', 'error'); return $this->redirect()->toRoute('myresearch-home'); } if ($this->getUser()) { @@ -1191,8 +1180,8 @@ public function recoverAction() if ($user) { $this->sendRecoveryEmail($user, $this->getConfig()); } else { - $this->flashMessenger()->setNamespace('error') - ->addMessage('recovery_user_not_found'); + $this->flashMessenger() + ->addMessage('recovery_user_not_found', 'error'); } } return $view; @@ -1210,8 +1199,7 @@ protected function sendRecoveryEmail($user, $config) { // If we can't find a user if (null == $user) { - $this->flashMessenger()->setNamespace('error') - ->addMessage('recovery_user_not_found'); + $this->flashMessenger()->addMessage('recovery_user_not_found', 'error'); } else { // Make sure we've waiting long enough $hashtime = $this->getHashAge($user->verify_hash); @@ -1219,8 +1207,7 @@ protected function sendRecoveryEmail($user, $config) ? $config->Authentication->recover_interval : 60; if (time() - $hashtime < $recoveryInterval) { - $this->flashMessenger()->setNamespace('error') - ->addMessage('recovery_too_soon'); + $this->flashMessenger()->addMessage('recovery_too_soon', 'error'); } else { // Attempt to send the email try { @@ -1245,11 +1232,10 @@ protected function sendRecoveryEmail($user, $config) $this->translate('recovery_email_subject'), $message ); - $this->flashMessenger()->setNamespace('success') - ->addMessage('recovery_email_sent'); + $this->flashMessenger() + ->addMessage('recovery_email_sent', 'success'); } catch (MailException $e) { - $this->flashMessenger()->setNamespace('error') - ->addMessage($e->getMessage()); + $this->flashMessenger()->addMessage($e->getMessage(), 'error'); } } } @@ -1271,8 +1257,8 @@ public function verifyAction() ? $config->Authentication->recover_hash_lifetime : 1209600; // Two weeks if (time() - $hashtime > $hashLifetime) { - $this->flashMessenger()->setNamespace('error') - ->addMessage('recovery_expired_hash'); + $this->flashMessenger() + ->addMessage('recovery_expired_hash', 'error'); return $this->forwardTo('MyResearch', 'Login'); } else { $table = $this->getTable('User'); @@ -1292,8 +1278,7 @@ public function verifyAction() } } } - $this->flashMessenger()->setNamespace('error') - ->addMessage('recovery_invalid_hash'); + $this->flashMessenger()->addMessage('recovery_invalid_hash', 'error'); return $this->forwardTo('MyResearch', 'Login'); } @@ -1326,14 +1311,13 @@ public function newPasswordAction() } // Missing or invalid hash if (false == $userFromHash) { - $this->flashMessenger()->setNamespace('error') - ->addMessage('recovery_user_not_found'); + $this->flashMessenger()->addMessage('recovery_user_not_found', 'error'); // Force login or restore hash $post->username = false; return $this->forwardTo('MyResearch', 'Recover'); } elseif ($userFromHash->username !== $post->username) { - $this->flashMessenger()->setNamespace('error') - ->addMessage('authentication_error_invalid'); + $this->flashMessenger() + ->addMessage('authentication_error_invalid', 'error'); $userFromHash->updateHash(); $view->username = $userFromHash->username; $view->hash = $userFromHash->verify_hash; @@ -1351,8 +1335,8 @@ public function newPasswordAction() $valid = false; } if (!$valid) { - $this->flashMessenger()->setNamespace('error') - ->addMessage('authentication_error_invalid'); + $this->flashMessenger() + ->addMessage('authentication_error_invalid', 'error'); $view->verifyold = true; return $view; } @@ -1361,8 +1345,7 @@ public function newPasswordAction() try { $user = $this->getAuthManager()->updatePassword($this->getRequest()); } catch (AuthException $e) { - $this->flashMessenger()->setNamespace('error') - ->addMessage($e->getMessage()); + $this->flashMessenger()->addMessage($e->getMessage(), 'error'); return $view; } // Update hash to prevent reusing hash @@ -1370,8 +1353,7 @@ public function newPasswordAction() // Login $this->getAuthManager()->login($this->request); // Go to favorites - $this->flashMessenger()->setNamespace('success') - ->addMessage('new_password_success'); + $this->flashMessenger()->addMessage('new_password_success', 'success'); return $this->redirect()->toRoute('myresearch-home'); } @@ -1387,8 +1369,7 @@ public function changePasswordAction() } // If not submitted, are we logged in? if (!$this->getAuthManager()->supportsPasswordChange()) { - $this->flashMessenger()->setNamespace('error') - ->addMessage('recovery_new_disabled'); + $this->flashMessenger()->addMessage('recovery_new_disabled', 'error'); return $this->redirect()->toRoute('home'); } $view = $this->createViewModel($this->params()->fromPost()); diff --git a/module/VuFind/src/VuFind/Controller/Plugin/Holds.php b/module/VuFind/src/VuFind/Controller/Plugin/Holds.php index d00b0928653..ecb2d1b2d95 100644 --- a/module/VuFind/src/VuFind/Controller/Plugin/Holds.php +++ b/module/VuFind/src/VuFind/Controller/Plugin/Holds.php @@ -129,8 +129,7 @@ public function cancelHolds($catalog, $patron) // If the user input contains a value not found in the session // whitelist, something has been tampered with -- abort the process. if (!in_array($info, $this->getSession()->validIds)) { - $flashMsg->setNamespace('error') - ->addMessage('error_inconsistent_parameters'); + $flashMsg->addMessage('error_inconsistent_parameters', 'error'); return []; } } @@ -140,21 +139,21 @@ public function cancelHolds($catalog, $patron) ['details' => $details, 'patron' => $patron] ); if ($cancelResults == false) { - $flashMsg->setNamespace('error')->addMessage('hold_cancel_fail'); + $flashMsg->addMessage('hold_cancel_fail', 'error'); } else { if ($cancelResults['count'] > 0) { // TODO : add a mechanism for inserting tokens into translated // messages so we can avoid a double translation here. $msg = $this->getController() ->translate('hold_cancel_success_items'); - $flashMsg->setNamespace('success')->addMessage( - $cancelResults['count'] . ' ' . $msg + $flashMsg->addMessage( + $cancelResults['count'] . ' ' . $msg, 'success' ); } return $cancelResults; } } else { - $flashMsg->setNamespace('error')->addMessage('hold_empty_selection'); + $flashMsg->addMessage('hold_empty_selection', 'error'); } return []; } diff --git a/module/VuFind/src/VuFind/Controller/Plugin/ILLRequests.php b/module/VuFind/src/VuFind/Controller/Plugin/ILLRequests.php index ce4d69e5319..840581e3830 100644 --- a/module/VuFind/src/VuFind/Controller/Plugin/ILLRequests.php +++ b/module/VuFind/src/VuFind/Controller/Plugin/ILLRequests.php @@ -143,8 +143,7 @@ public function cancelILLRequests($catalog, $patron) // If the user input contains a value not found in the session // whitelist, something has been tampered with -- abort the process. if (!in_array($info, $this->getSession()->validIds)) { - $flashMsg->setNamespace('error') - ->addMessage('error_inconsistent_parameters'); + $flashMsg->addMessage('error_inconsistent_parameters', 'error'); return []; } } @@ -154,9 +153,7 @@ public function cancelILLRequests($catalog, $patron) ['details' => $details, 'patron' => $patron] ); if ($cancelResults == false) { - $flashMsg->setNamespace('error')->addMessage( - 'ill_request_cancel_fail' - ); + $flashMsg->addMessage('ill_request_cancel_fail', 'error'); } else { if ($cancelResults['count'] > 0) { // TODO : add a mechanism for inserting tokens into translated @@ -164,16 +161,14 @@ public function cancelILLRequests($catalog, $patron) $msg = $this->getController()->translate( 'ill_request_cancel_success_items' ); - $flashMsg->setNamespace('success')->addMessage( - $cancelResults['count'] . ' ' . $msg + $flashMsg->addMessage( + $cancelResults['count'] . ' ' . $msg, 'success' ); } return $cancelResults; } } else { - $flashMsg->setNamespace('error')->addMessage( - 'ill_request_empty_selection' - ); + $flashMsg->addMessage('ill_request_empty_selection', 'error'); } return []; } diff --git a/module/VuFind/src/VuFind/Controller/Plugin/NewItems.php b/module/VuFind/src/VuFind/Controller/Plugin/NewItems.php index 2a48d529744..f76a2ea315a 100644 --- a/module/VuFind/src/VuFind/Controller/Plugin/NewItems.php +++ b/module/VuFind/src/VuFind/Controller/Plugin/NewItems.php @@ -78,15 +78,17 @@ public function getBibIDsFromCatalog($catalog, $params, $range, $dept, $flash) // Build a list of unique IDs $bibIDs = []; - for ($i = 0; $i < count($newItems['results']); $i++) { - $bibIDs[] = $newItems['results'][$i]['id']; + if (isset($newItems['results'])) { + for ($i = 0; $i < count($newItems['results']); $i++) { + $bibIDs[] = $newItems['results'][$i]['id']; + } } // Truncate the list if it is too long: $limit = $params->getQueryIDLimit(); if (count($bibIDs) > $limit) { $bibIDs = array_slice($bibIDs, 0, $limit); - $flash->setNamespace('info')->addMessage('too_many_new_items'); + $flash->addMessage('too_many_new_items', 'info'); } return $bibIDs; diff --git a/module/VuFind/src/VuFind/Controller/Plugin/Recaptcha.php b/module/VuFind/src/VuFind/Controller/Plugin/Recaptcha.php index 88d49b257a6..7aeb62f07c2 100644 --- a/module/VuFind/src/VuFind/Controller/Plugin/Recaptcha.php +++ b/module/VuFind/src/VuFind/Controller/Plugin/Recaptcha.php @@ -127,8 +127,8 @@ public function validate() $captchaPassed = $response && $response->isValid(); if (!$captchaPassed) { if ($this->errorMode == 'flash') { - $this->getController()->flashMessenger()->setNamespace('error') - ->addMessage('recaptcha_not_passed'); + $this->getController()->flashMessenger() + ->addMessage('recaptcha_not_passed', 'error'); } else { throw new \Exception('recaptcha_not_passed'); } diff --git a/module/VuFind/src/VuFind/Controller/Plugin/Renewals.php b/module/VuFind/src/VuFind/Controller/Plugin/Renewals.php index d3ac6d9e6a4..d8761edcfe1 100644 --- a/module/VuFind/src/VuFind/Controller/Plugin/Renewals.php +++ b/module/VuFind/src/VuFind/Controller/Plugin/Renewals.php @@ -105,7 +105,7 @@ public function processRenewals($request, $catalog, $patron) && is_array($renewResult['blocks']) ) { foreach ($renewResult['blocks'] as $block) { - $flashMsg->setNamespace('info')->addMessage($block); + $flashMsg->addMessage($block, 'info'); } } @@ -113,11 +113,11 @@ public function processRenewals($request, $catalog, $patron) return $renewResult['details']; } else { // System failure: - $flashMsg->setNamespace('error')->addMessage('renew_error'); + $flashMsg->addMessage('renew_error', 'error'); } } else if (!empty($all) || !empty($selected)) { // Button was clicked but no items were selected: - $flashMsg->setNamespace('error')->addMessage('renew_empty_selection'); + $flashMsg->addMessage('renew_empty_selection', 'error'); } return []; diff --git a/module/VuFind/src/VuFind/Controller/Plugin/StorageRetrievalRequests.php b/module/VuFind/src/VuFind/Controller/Plugin/StorageRetrievalRequests.php index 74326488b16..3db780ef50d 100644 --- a/module/VuFind/src/VuFind/Controller/Plugin/StorageRetrievalRequests.php +++ b/module/VuFind/src/VuFind/Controller/Plugin/StorageRetrievalRequests.php @@ -143,8 +143,7 @@ public function cancelStorageRetrievalRequests($catalog, $patron) // If the user input contains a value not found in the session // whitelist, something has been tampered with -- abort the process. if (!in_array($info, $this->getSession()->validIds)) { - $flashMsg->setNamespace('error') - ->addMessage('error_inconsistent_parameters'); + $flashMsg->addMessage('error_inconsistent_parameters', 'error'); return []; } } @@ -154,9 +153,8 @@ public function cancelStorageRetrievalRequests($catalog, $patron) ['details' => $details, 'patron' => $patron] ); if ($cancelResults == false) { - $flashMsg->setNamespace('error')->addMessage( - 'storage_retrieval_request_cancel_fail' - ); + $flashMsg + ->addMessage('storage_retrieval_request_cancel_fail', 'error'); } else { if ($cancelResults['count'] > 0) { // TODO : add a mechanism for inserting tokens into translated @@ -164,16 +162,15 @@ public function cancelStorageRetrievalRequests($catalog, $patron) $msg = $this->getController()->translate( 'storage_retrieval_request_cancel_success_items' ); - $flashMsg->setNamespace('success')->addMessage( - $cancelResults['count'] . ' ' . $msg + $flashMsg->addMessage( + $cancelResults['count'] . ' ' . $msg, 'success' ); } return $cancelResults; } } else { - $flashMsg->setNamespace('error')->addMessage( - 'storage_retrieval_request_empty_selection' - ); + $flashMsg + ->addMessage('storage_retrieval_request_empty_selection', 'error'); } return []; } diff --git a/module/VuFind/src/VuFind/Controller/SearchController.php b/module/VuFind/src/VuFind/Controller/SearchController.php index 086f23b7c13..b06c7e07b9b 100644 --- a/module/VuFind/src/VuFind/Controller/SearchController.php +++ b/module/VuFind/src/VuFind/Controller/SearchController.php @@ -123,12 +123,10 @@ public function emailAction() $view->to, $view->from, $view->message, $view->url, $this->getViewRenderer(), $view->subject, $cc ); - $this->flashMessenger()->setNamespace('success') - ->addMessage('email_success'); + $this->flashMessenger()->addMessage('email_success', 'success'); return $this->redirect()->toUrl($view->url); } catch (MailException $e) { - $this->flashMessenger()->setNamespace('error') - ->addMessage($e->getMessage()); + $this->flashMessenger()->addMessage($e->getMessage(), 'error'); } } return $view; @@ -415,17 +413,17 @@ public function reservesAction() */ public function reservessearchAction() { - $results = $this->getResultsManager()->get('SolrReserves'); - $params = $results->getParams(); - $params->initFromRequest( - new \Zend\Stdlib\Parameters( - $this->getRequest()->getQuery()->toArray() - + $this->getRequest()->getPost()->toArray() - ) + $request = new \Zend\Stdlib\Parameters( + $this->getRequest()->getQuery()->toArray() + + $this->getRequest()->getPost()->toArray() ); - return $this->createViewModel( - ['params' => $params, 'results' => $results] + $view = $this->createViewModel(); + $runner = $this->getServiceLocator()->get('VuFind\SearchRunner'); + $view->results = $runner->run( + $request, 'SolrReserves', $this->getSearchSetupCallback() ); + $view->params = $view->results->getParams(); + return $view; } /** @@ -452,8 +450,7 @@ public function reservesresultsAction() ->getQueryIDLimit(); if (count($bibIDs) > $limit) { $bibIDs = array_slice($bibIDs, 0, $limit); - $this->flashMessenger()->setNamespace('info') - ->addMessage('too_many_reserves'); + $this->flashMessenger()->addMessage('too_many_reserves', 'info'); } // Use standard search action with override parameter to show results: diff --git a/module/VuFind/src/VuFind/Controller/StorageRetrievalRequestsTrait.php b/module/VuFind/src/VuFind/Controller/StorageRetrievalRequestsTrait.php index f24affa0853..28ca30f1631 100644 --- a/module/VuFind/src/VuFind/Controller/StorageRetrievalRequestsTrait.php +++ b/module/VuFind/src/VuFind/Controller/StorageRetrievalRequestsTrait.php @@ -45,8 +45,8 @@ trait StorageRetrievalRequestsTrait */ public function blockedStorageRetrievalRequestAction() { - $this->flashMessenger()->setNamespace('error') - ->addMessage('storage_retrieval_request_error_blocked'); + $this->flashMessenger() + ->addMessage('storage_retrieval_request_error_blocked', 'error'); return $this->redirectToRecord('#top'); } @@ -112,8 +112,9 @@ public function storageRetrievalRequestAction() // Success: Go to Display Storage Retrieval Requests if (isset($results['success']) && $results['success'] == true) { - $this->flashMessenger()->setNamespace('success') - ->addMessage('storage_retrieval_request_place_success'); + $this->flashMessenger()->addMessage( + 'storage_retrieval_request_place_success', 'success' + ); if ($this->inLightbox()) { return false; } @@ -124,12 +125,11 @@ public function storageRetrievalRequestAction() // Failure: use flash messenger to display messages, stay on // the current form. if (isset($results['status'])) { - $this->flashMessenger()->setNamespace('error') - ->addMessage($results['status']); + $this->flashMessenger()->addMessage($results['status'], 'error'); } if (isset($results['sysMessage'])) { - $this->flashMessenger()->setNamespace('error') - ->addMessage($results['sysMessage']); + $this->flashMessenger() + ->addMessage($results['sysMessage'], 'error'); } } } diff --git a/module/VuFind/src/VuFind/Controller/UpgradeController.php b/module/VuFind/src/VuFind/Controller/UpgradeController.php index 86cab730e63..989a818a008 100644 --- a/module/VuFind/src/VuFind/Controller/UpgradeController.php +++ b/module/VuFind/src/VuFind/Controller/UpgradeController.php @@ -122,24 +122,6 @@ protected function attachDefaultListeners() $events->attach(MvcEvent::EVENT_DISPATCH, [$this, 'preDispatch'], 1000); } - /** - * Support method -- given a directory, extract a version number from the - * build.xml file within that directory. - * - * @param string $dir Directory to search for build.xml - * - * @return string - */ - protected function getVersion($dir) - { - $xml = simplexml_load_file($dir . '/build.xml'); - if (!$xml) { - throw new \Exception('Cannot load ' . $dir . '/build.xml.'); - } - $parts = $xml->xpath('/project/property[@name="version"]/@value'); - return (string)$parts[0]; - } - /** * Display disabled message. * @@ -170,25 +152,27 @@ public function errorAction() */ public function establishversionsAction() { - $this->cookie->newVersion = $this->getVersion(realpath(APPLICATION_PATH)); - $this->cookie->oldVersion = $this->getVersion($this->cookie->sourceDir); + $this->cookie->newVersion = \VuFind\Config\Version::getBuildVersion(); + $this->cookie->oldVersion = \VuFind\Config\Version::getBuildVersion( + $this->cookie->sourceDir + ); // Block upgrade when encountering common errors: if (empty($this->cookie->oldVersion)) { - $this->flashMessenger()->setNamespace('error') - ->addMessage('Cannot determine source version.'); + $this->flashMessenger() + ->addMessage('Cannot determine source version.', 'error'); unset($this->cookie->oldVersion); return $this->forwardTo('Upgrade', 'Error'); } if (empty($this->cookie->newVersion)) { - $this->flashMessenger()->setNamespace('error') - ->addMessage('Cannot determine destination version.'); + $this->flashMessenger() + ->addMessage('Cannot determine destination version.', 'error'); unset($this->cookie->newVersion); return $this->forwardTo('Upgrade', 'Error'); } if ($this->cookie->newVersion == $this->cookie->oldVersion) { - $this->flashMessenger()->setNamespace('error') - ->addMessage('Cannot upgrade version to itself.'); + $this->flashMessenger() + ->addMessage('Cannot upgrade version to itself.', 'error'); unset($this->cookie->newVersion); return $this->forwardTo('Upgrade', 'Error'); } @@ -221,8 +205,9 @@ public function fixconfigAction() } catch (\Exception $e) { $extra = is_a($e, 'VuFind\Exception\FileAccess') ? ' Check file permissions.' : ''; - $this->flashMessenger()->setNamespace('error') - ->addMessage('Config upgrade failed: ' . $e->getMessage() . $extra); + $this->flashMessenger()->addMessage( + 'Config upgrade failed: ' . $e->getMessage() . $extra, 'error' + ); return $this->forwardTo('Upgrade', 'Error'); } } @@ -391,8 +376,9 @@ public function fixdatabaseAction() return $this->forwardTo('Upgrade', 'FixDuplicateTags'); } } catch (\Exception $e) { - $this->flashMessenger()->setNamespace('error') - ->addMessage('Database upgrade failed: ' . $e->getMessage()); + $this->flashMessenger()->addMessage( + 'Database upgrade failed: ' . $e->getMessage(), 'error' + ); return $this->forwardTo('Upgrade', 'Error'); } @@ -449,8 +435,9 @@ public function getdbcredentialsAction() $this->session->dbRootPass = $pass; return $this->forwardTo('Upgrade', 'FixDatabase'); } catch (\Exception $e) { - $this->flashMessenger()->setNamespace('error') - ->addMessage('Could not connect; please try again.'); + $this->flashMessenger()->addMessage( + 'Could not connect; please try again.', 'error' + ); } } } @@ -493,14 +480,14 @@ public function fixanonymoustagsAction() if ($this->formWasSubmitted('submit')) { $user = $this->params()->fromPost('username'); if (empty($user)) { - $this->flashMessenger()->setNamespace('error') - ->addMessage('Username must not be empty.'); + $this->flashMessenger() + ->addMessage('Username must not be empty.', 'error'); } else { $userTable = $this->getTable('User'); $user = $userTable->getByUsername($user, false); if (empty($user) || !is_object($user) || !isset($user->id)) { - $this->flashMessenger()->setNamespace('error') - ->addMessage("User {$user} not found."); + $this->flashMessenger() + ->addMessage("User {$user} not found.", 'error'); } else { $table = $this->getTable('ResourceTags'); $table->assignAnonymousTags($user->id); @@ -598,12 +585,13 @@ public function getsourcedirAction() $dir = $this->params()->fromPost('sourcedir'); if (!empty($dir)) { if (!is_dir($dir)) { - $this->flashMessenger()->setNamespace('error') - ->addMessage($dir . ' does not exist.'); + $this->flashMessenger() + ->addMessage($dir . ' does not exist.', 'error'); } else if (!file_exists($dir . '/build.xml')) { - $this->flashMessenger()->setNamespace('error')->addMessage( + $this->flashMessenger()->addMessage( 'Could not find build.xml in source directory;' - . ' upgrade does not support VuFind versions prior to 1.1.' + . ' upgrade does not support VuFind versions prior to 1.1.', + 'error' ); } else { $this->cookie->sourceDir = rtrim($dir, '\/'); @@ -626,14 +614,14 @@ public function getsourceversionAction() // Process form submission: $version = $this->params()->fromPost('sourceversion'); if (!empty($version)) { - $this->cookie->newVersion - = $this->getVersion(realpath(APPLICATION_PATH)); + $this->cookie->newVersion = \VuFind\Config\Version::getBuildVersion(); if (floor($version) != 2) { - $this->flashMessenger()->setNamespace('error') - ->addMessage('Illegal version number.'); + $this->flashMessenger() + ->addMessage('Illegal version number.', 'error'); } else if ($version >= $this->cookie->newVersion) { - $this->flashMessenger()->setNamespace('error')->addMessage( - "Source version must be less than {$this->cookie->newVersion}." + $this->flashMessenger()->addMessage( + "Source version must be less than {$this->cookie->newVersion}.", + 'error' ); } else { $this->cookie->oldVersion = $version; @@ -700,8 +688,7 @@ public function homeAction() (array)$this->session->warnings ); foreach ($allWarnings as $warning) { - $this->flashMessenger()->setNamespace('info') - ->addMessage($warning); + $this->flashMessenger()->addMessage($warning, 'info'); } return $this->createViewModel( diff --git a/module/VuFind/src/VuFind/Cookie/CookieManager.php b/module/VuFind/src/VuFind/Cookie/CookieManager.php index 20a5af45e9b..67357cbc867 100644 --- a/module/VuFind/src/VuFind/Cookie/CookieManager.php +++ b/module/VuFind/src/VuFind/Cookie/CookieManager.php @@ -117,7 +117,20 @@ public function isSecure() } /** - * Set a cookie. + * Support method for setGlobalCookie -- proxy PHP's setcookie() function + * for compatibility with unit testing. + * + * @return bool + */ + public function proxySetCookie() + { + // Special case: in test suite -- don't actually write headers! + return defined('VUFIND_PHPUNIT_RUNNING') + ? true : call_user_func_array('setcookie', func_get_args()); + } + + /** + * Support method for set() -- set the actual cookie in PHP. * * @param string $key Name of cookie to set * @param mixed $value Value to set @@ -125,25 +138,41 @@ public function isSecure() * * @return bool */ - public function set($key, $value, $expire = 0) + public function setGlobalCookie($key, $value, $expire) { - if (is_array($value)) { - $success = true; - foreach ($value as $i => $curr) { - $lastSuccess = setcookie( - $key . '[' . $i . ']', $curr, $expire, - $this->path, $this->domain, $this->secure - ); - if (!$lastSuccess) { - $success = false; - } - } - } else { - $success = setcookie( + // Simple case: flat value. + if (!is_array($value)) { + return $this->proxySetCookie( $key, $value, $expire, $this->path, $this->domain, $this->secure ); } - if ($success) { + + // Complex case: array of values. + $success = true; + foreach ($value as $i => $curr) { + $lastSuccess = $this->proxySetCookie( + $key . '[' . $i . ']', $curr, $expire, + $this->path, $this->domain, $this->secure + ); + if (!$lastSuccess) { + $success = false; + } + } + return $success; + } + + /** + * Set a cookie. + * + * @param string $key Name of cookie to set + * @param mixed $value Value to set + * @param int $expire Cookie expiration time + * + * @return bool + */ + public function set($key, $value, $expire = 0) + { + if ($success = $this->setGlobalCookie($key, $value, $expire)) { $this->cookies[$key] = $value; } return $success; diff --git a/module/VuFind/src/VuFind/Export.php b/module/VuFind/src/VuFind/Export.php index a1a6d6e79ce..ac91cb8ccb5 100644 --- a/module/VuFind/src/VuFind/Export.php +++ b/module/VuFind/src/VuFind/Export.php @@ -54,11 +54,12 @@ class Export protected $exportConfig; /** - * Bulk options (initialized to boolean false, populated later) + * Property to cache active formats + * (initialized to empty array , populated later) * - * @var array|bool + * @var array */ - protected $bulkOptions = false; + protected $activeFormats = []; /** * Constructor @@ -75,28 +76,13 @@ public function __construct(Config $mainConfig, Config $exportConfig) /** * Get bulk export options. * + * @deprecated use getActiveFormats($context) instead + * * @return array */ public function getBulkOptions() { - if ($this->bulkOptions === false) { - $this->bulkOptions = []; - if (isset($this->mainConfig->BulkExport->enabled) - && isset($this->mainConfig->BulkExport->options) - && $this->mainConfig->BulkExport->enabled - ) { - $config = explode(':', $this->mainConfig->BulkExport->options); - foreach ($config as $option) { - if (isset($this->mainConfig->Export->$option) - && $this->mainConfig->Export->$option == true - ) { - $this->bulkOptions[] = $option; - } - } - } - } - - return $this->bulkOptions; + return $this->getActiveFormats('bulk'); } /** @@ -271,14 +257,12 @@ public function getFormatsForRecord($driver) { // Get an array of enabled export formats (from config, or use defaults // if nothing in config array). - $active = isset($this->mainConfig->Export) - ? $this->mainConfig->Export->toArray() - : ['RefWorks' => true, 'EndNote' => true]; + $active = $this->getActiveFormats('record'); // Loop through all possible formats: $formats = []; foreach (array_keys($this->exportConfig->toArray()) as $format) { - if (isset($active[$format]) && $active[$format] + if (in_array($format, $active) && $this->recordSupportsFormat($driver, $format) ) { $formats[] = $format; @@ -299,7 +283,7 @@ public function getFormatsForRecord($driver) */ public function getFormatsForRecords($drivers) { - $formats = $this->getBulkOptions(); + $formats = $this->getActiveFormats('bulk'); foreach ($drivers as $driver) { // Filter out unsupported export formats: $newFormats = []; @@ -338,4 +322,66 @@ public function getLabelForFormat($format) return isset($this->exportConfig->$format->label) ? $this->exportConfig->$format->label : $format; } + + /** + * Get the bulk export type for the specified export format. + * + * @param string $format Format identifier + * + * @return string + */ + public function getBulkExportType($format) + { + // if exportType is set on per-format basis in export.ini then use it + if (isset($this->exportConfig->$format->bulkExportType)) { + return $this->exportConfig->$format->bulkExportType; + } + + // else check if export type is set in config.ini + return isset($this->mainConfig->BulkExport->defaultType) + ? $this->mainConfig->BulkExport->defaultType : 'link'; + } + + /** + * Get active export formats for the given context. + * + * @param string $context Export context (i.e. record, bulk) + * + * @return array + */ + public function getActiveFormats($context = 'record') + { + if (!isset($this->activeFormats[$context])) { + $formatSettings = isset($this->mainConfig->Export) + ? $this->mainConfig->Export->toArray() + : ['RefWorks' => 'record,bulk', 'EndNote' => 'record,bulk']; + + $active = []; + foreach ($formatSettings as $format => $allowedContexts) { + if (strpos($allowedContexts, $context) !== false + || ($context == 'record' && $allowedContexts == 1) + ) { + $active[] = $format; + } + } + + // for legacy settings [BulkExport] + if ($context == 'bulk' + && isset($this->mainConfig->BulkExport->enabled) + && $this->mainConfig->BulkExport->enabled + && isset($this->mainConfig->BulkExport->options) + ) { + $config = explode(':', $this->mainConfig->BulkExport->options); + foreach ($config as $option) { + if (isset($this->mainConfig->Export->$option) + && $this->mainConfig->Export->$option == true + ) { + $active[] = $option; + } + } + } + $this->activeFormats[$context] = array_unique($active); + } + return $this->activeFormats[$context]; + } } diff --git a/module/VuFind/src/VuFind/Hierarchy/TreeRenderer/JSTree.php b/module/VuFind/src/VuFind/Hierarchy/TreeRenderer/JSTree.php index 651276bb92e..4bc71559852 100644 --- a/module/VuFind/src/VuFind/Hierarchy/TreeRenderer/JSTree.php +++ b/module/VuFind/src/VuFind/Hierarchy/TreeRenderer/JSTree.php @@ -176,7 +176,7 @@ protected function buildNodeArray($node, $context, $hierarchyID) 'recordid' => $node->id ], 'a_attr' => [ - 'href' => $this->getContextualUrl($node, $context, $hierarchyID), + 'href' => $this->getContextualUrl($node, $context), 'title' => $node->title ], 'type' => $node->type @@ -194,13 +194,12 @@ protected function buildNodeArray($node, $context, $hierarchyID) /** * Use the router to build the appropriate URL based on context * - * @param object $node JSON object of a node/top node - * @param string $context Record or Collection - * @param string $collectionID Collection ID + * @param object $node JSON object of a node/top node + * @param string $context Record or Collection * * @return string */ - protected function getContextualUrl($node, $context, $collectionID) + protected function getContextualUrl($node, $context) { if ($context == 'Collection') { return $this->getUrlFromRouteCache('collection', $node->id) @@ -257,7 +256,7 @@ protected function jsonToHTML($node, $context, $hierarchyID, $recordID = false) $name = strlen($node->title) > 100 ? substr($node->title, 0, 100) . '...' : $node->title; - $href = $this->getContextualUrl($node, $context, $hierarchyID); + $href = $this->getContextualUrl($node, $context); $icon = $node->type == 'record' ? 'file-o' : 'folder-open'; $html = 'normalizeFile($dir . '/' . $file); + $full = $dir . '/' . $file; + if ($file != '.' && $file != '..' && is_dir($full)) { + $this->normalizeDirectory($full); + } else if (substr($file, -4) == '.ini') { + $this->normalizeFile($full); } } closedir($handle); @@ -127,7 +130,7 @@ public function formatAsString($input) foreach ($input as $key => $value) { $output .= "$key = \"$value\"\n"; } - return trim($output); + return trim($output) . "\n"; } /** diff --git a/module/VuFind/src/VuFind/I18n/TranslatableString.php b/module/VuFind/src/VuFind/I18n/TranslatableString.php index c0eab6cb04f..805d4254a90 100644 --- a/module/VuFind/src/VuFind/I18n/TranslatableString.php +++ b/module/VuFind/src/VuFind/I18n/TranslatableString.php @@ -60,7 +60,7 @@ class TranslatableString implements TranslatableStringInterface */ public function __construct($string, $displayString) { - $this->string = $string; + $this->string = (string)$string; $this->displayString = $displayString; } diff --git a/module/VuFind/src/VuFind/I18n/Translator/Loader/ExtendedIni.php b/module/VuFind/src/VuFind/I18n/Translator/Loader/ExtendedIni.php index 83a6454b89c..629b5100f7f 100644 --- a/module/VuFind/src/VuFind/I18n/Translator/Loader/ExtendedIni.php +++ b/module/VuFind/src/VuFind/I18n/Translator/Loader/ExtendedIni.php @@ -107,12 +107,11 @@ public function addToPathStack($pathStack) * Load method defined by FileLoaderInterface. * * @param string $locale Locale to read from language file - * @param string $filename Language file to read (not used) + * @param string $filename Relative base path for language file (used for + * loading text domains; optional) * * @return TextDomain * @throws InvalidArgumentException - * - * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function load($locale, $filename) { @@ -120,12 +119,12 @@ public function load($locale, $filename) $this->resetLoadedFiles(); // Load base data: - $data = $this->loadLanguageFile($locale . '.ini'); + $data = $this->loadLanguageLocale($locale, $filename); // Load fallback data, if any: if (!empty($this->fallbackLocales)) { foreach ($this->fallbackLocales as $fallbackLocale) { - $newData = $this->loadLanguageFile($fallbackLocale . '.ini'); + $newData = $this->loadLanguageLocale($fallbackLocale, $filename); $newData->merge($data); $data = $newData; } @@ -134,6 +133,21 @@ public function load($locale, $filename) return $data; } + /** + * Get the language file name for a language and domain + * + * @param string $locale Locale name + * @param string $domain Text domain (if any) + * + * @return string + */ + public function getLanguageFilename($locale, $domain) + { + return empty($domain) + ? $locale . '.ini' + : $domain . '/' . $locale . '.ini'; + } + /** * Reset the loaded file list. * @@ -160,14 +174,33 @@ protected function checkAndMarkLoadedFile($filename) return false; } + /** + * Load the language file for a given locale and domain. + * + * @param string $locale Locale name + * @param string $domain Text domain (if any) + * + * @return TextDomain + */ + protected function loadLanguageLocale($locale, $domain) + { + $filename = $this->getLanguageFilename($locale, $domain); + // Load the language file, and throw a fatal exception if it's missing + // and we're not dealing with text domains. A missing base file is an + // unexpected, fatal error; a missing domain-specific file is more likely + // due to the possibility of incomplete translations. + return $this->loadLanguageFile($filename, empty($domain)); + } + /** * Search the path stack for language files and merge them together. * - * @param string $filename Name of file to search path stack for. + * @param string $filename Name of file to search path stack for. + * @param bool $failOnError If true, throw an exception when file not found. * * @return TextDomain */ - protected function loadLanguageFile($filename) + protected function loadLanguageFile($filename, $failOnError = true) { // Don't load a file that has already been loaded: if ($this->checkAndMarkLoadedFile($filename)) { @@ -189,7 +222,13 @@ protected function loadLanguageFile($filename) } } if ($data === false) { - throw new InvalidArgumentException("Ini file '{$filename}' not found"); + // Should we throw an exception? If not, return an empty result: + if ($failOnError) { + throw new InvalidArgumentException( + "Ini file '{$filename}' not found" + ); + } + return new TextDomain(); } return $data; diff --git a/module/VuFind/src/VuFind/I18n/Translator/TranslatorAwareTrait.php b/module/VuFind/src/VuFind/I18n/Translator/TranslatorAwareTrait.php index ee06acb90b4..e57a1260ad0 100644 --- a/module/VuFind/src/VuFind/I18n/Translator/TranslatorAwareTrait.php +++ b/module/VuFind/src/VuFind/I18n/Translator/TranslatorAwareTrait.php @@ -89,28 +89,35 @@ public function getTranslatorLocale($default = 'en') /** * Translate a string (or string-castable object) * - * @param string|object $str String to translate - * @param array $tokens Tokens to inject into the translated string - * @param string $default Default value to use if no translation is found - * (null for no default). + * @param string|object|array $target String to translate or an array of text + * domain and string to translate + * @param array $tokens Tokens to inject into the translated + * string + * @param string $default Default value to use if no translation is + * found (null for no default). * * @return string */ - public function translate($str, $tokens = [], $default = null) + public function translate($target, $tokens = [], $default = null) { + // Figure out the text domain for the string: + list($domain, $str) = $this->extractTextDomain($target); + // Special case: deal with objects with a designated display value: if ($str instanceof \VuFind\I18n\TranslatableStringInterface) { - $translated = $this->translateString((string)$str, $tokens, $default); + // On this pass, don't use the $default, since we want to fail over + // to getDisplayString before giving up: + $translated = $this + ->translateString((string)$str, $tokens, null, $domain); if ($translated !== (string)$str) { return $translated; } - return $this->translateString( - $str->getDisplayString(), $tokens, $default - ); + // Override $domain/$str using getDisplayString() before proceeding: + list($domain, $str) = $this->extractTextDomain($str->getDisplayString()); } // Default case: deal with ordinary strings (or string-castable objects): - return $this->translateString((string)$str, $tokens, $default); + return $this->translateString((string)$str, $tokens, $default, $domain); } /** @@ -118,15 +125,18 @@ public function translate($str, $tokens = [], $default = null) * * @param string $str String to translate * @param array $tokens Tokens to inject into the translated string - * @param string $default Default value to use if no translation is found (null - * for no default). + * @param string $default Default value to use if no translation is found + * (null for no default). + * @param string $domain Text domain (omit for default) * * @return string */ - protected function translateString($str, $tokens = [], $default = null) - { - $msg = null === $this->translator - ? $str : $this->translator->translate($str); + protected function translateString($str, $tokens = [], $default = null, + $domain = 'default' + ) { + + $msg = (null === $this->translator) + ? $str : $this->translator->translate($str, $domain); // Did the translation fail to change anything? If so, use default: if (null !== $default && $msg == $str) { @@ -145,4 +155,32 @@ protected function translateString($str, $tokens = [], $default = null) return $msg; } + + /** + * Given a translation string with or without a text domain, return an + * array with the raw string and the text domain separated. + * + * @param string|object|array $target String to translate or an array of text + * domain and string to translate + * + * @return array + */ + protected function extractTextDomain($target) + { + $parts = is_array($target) ? $target : explode('::', $target); + if (count($parts) < 1 || count($parts) > 2) { + throw new \Exception('Unexpected value sent to translator!'); + } + if (count($parts) == 2) { + if (empty($parts[0])) { + $parts[0] = 'default'; + } + if ($target instanceof \VuFind\I18n\TranslatableStringInterface) { + $class = get_class($target); + $parts[1] = new $class($parts[1], $target->getDisplayString()); + } + return $parts; + } + return ['default', is_array($target) ? $parts[0] : $target]; + } } diff --git a/module/VuFind/src/VuFind/ILS/Driver/DAIA.php b/module/VuFind/src/VuFind/ILS/Driver/DAIA.php index 699f8e2c2f2..2f405ac8e2a 100644 --- a/module/VuFind/src/VuFind/ILS/Driver/DAIA.php +++ b/module/VuFind/src/VuFind/ILS/Driver/DAIA.php @@ -81,12 +81,38 @@ class DAIA extends AbstractBase implements protected $multiQuery = false; /** - * DAIA legacySupport flag + * Acceptable ContentTypes delivered by DAIA server in HTTP header * - * @var boolean - * @deprecated Will be removed in the next driver version + * @var array */ - protected $legacySupport = false; + protected $contentTypesResponse; + + /** + * ContentTypes to use in DAIA HTTP requests in HTTP header + * + * @var array + */ + protected $contentTypesRequest = [ + 'xml' => 'application/xml', + 'json' => 'application/json', + ]; + + /** + * Date converter object + * + * @var \VuFind\Date\Converter + */ + protected $dateConverter; + + /** + * Constructor + * + * @param \VuFind\Date\Converter $converter Date converter + */ + public function __construct(\VuFind\Date\Converter $converter) + { + $this->dateConverter = $converter; + } /** * Initialize the driver. @@ -99,15 +125,13 @@ class DAIA extends AbstractBase implements */ public function init() { - // DAIA.ini sections changed, therefore move old [Global] section to - // new [DAIA] section as fallback - if (isset($this->config['Global']) && !isset($this->config['DAIA'])) { - $this->config['DAIA'] = $this->config['Global']; - $this->legacySupport = true; - } - if (isset($this->config['DAIA']['baseUrl'])) { $this->baseUrl = $this->config['DAIA']['baseUrl']; + } elseif (isset($this->config['Global']['baseUrl'])) { + throw new ILSException( + 'Deprecated [Global] section in DAIA.ini present, but no [DAIA] ' . + 'section found: please update DAIA.ini (cf. config/vufind/DAIA.ini).' + ); } else { throw new ILSException('DAIA/baseUrl configuration needs to be set.'); } @@ -116,19 +140,24 @@ public function init() $this->config['DAIA']['daiaResponseFormat'] ); } else { - $this->debug("No daiaResponseFormat setting found, using default: xml"); - $this->daiaResponseFormat = "xml"; + $this->debug('No daiaResponseFormat setting found, using default: xml'); + $this->daiaResponseFormat = 'xml'; } if (isset($this->config['DAIA']['daiaIdPrefix'])) { $this->daiaIdPrefix = $this->config['DAIA']['daiaIdPrefix']; } else { - $this->debug("No daiaIdPrefix setting found, using default: ppn:"); - $this->daiaIdPrefix = "ppn:"; + $this->debug('No daiaIdPrefix setting found, using default: ppn:'); + $this->daiaIdPrefix = 'ppn:'; } if (isset($this->config['DAIA']['multiQuery'])) { $this->multiQuery = $this->config['DAIA']['multiQuery']; } else { - $this->debug("No multiQuery setting found, using default: false"); + $this->debug('No multiQuery setting found, using default: false'); + } + if (isset($this->config['DAIA']['daiaContentTypes'])) { + $this->contentTypesResponse = $this->config['DAIA']['daiaContentTypes']; + } else { + $this->debug('No ContentTypes for response defined. Accepting any.'); } } @@ -177,12 +206,8 @@ public function getHoldLink($id, $details) */ public function getStatus($id) { - if ($this->legacySupport) { - // we are in legacySupport mode, so use the deprecated - // getXMLStatus() method - return $this->getXMLStatus($id); - } else { - // let's retrieve the DAIA document by URI + // let's retrieve the DAIA document by URI + try { $rawResult = $this->doHTTPRequest($this->generateURI($id)); // extract the DAIA document for the current id from the // HTTPRequest's result @@ -191,7 +216,10 @@ public function getStatus($id) // parse the extracted DAIA document and return the status info return $this->parseDaiaDoc($id, $doc); } + } catch (ILSException $e) { + $this->debug($e->getMessage()); } + return []; } @@ -202,14 +230,12 @@ public function getStatus($id) * collection of records. * As the DAIA Query API supports querying multiple ids simultaneously * (all ids divided by "|") getStatuses(ids) would call getStatus(id) only - * once, id containing the list of ids to be retrieved. Apart from the - * legacySupport this would cause some trouble as the list of ids does not - * necessarily correspond to the VuFind Record-id. Therefore getStatuses(ids) - * has its own logic for multiQuery-support and performs the HTTPRequest - * itself, retrieving one DAIA response for all ids and uses helper - * functions to split this one response into documents corresponding to the - * queried ids. - * If multiQueries are not supported, getStatus(id) is used. + * once, id containing the list of ids to be retrieved. This would cause some + * trouble as the list of ids does not necessarily correspond to the VuFind + * Record-id. Therefore getStatuses(ids) has its own logic for multiQuery-support + * and performs the HTTPRequest itself, retrieving one DAIA response for all ids + * and uses helper functions to split this one response into documents + * corresponding to the queried ids. * * @param array $ids The array of record ids to retrieve the status for * @@ -219,17 +245,11 @@ public function getStatuses($ids) { $status = []; - if ($this->legacySupport) { - // we are in legacySupport mode, so use the deprecated - // getXMLStatus() method for each id - foreach ($ids as $id) { - $status[] = $this->getXMLShortStatus($id); - } - } else { + try { if ($this->multiQuery) { // perform one DAIA query with multiple URIs - $rawResult = $this->doHTTPRequest($this->generateMultiURIs($ids)); - // now we need to reestablish the key-value pair id=>document as + $rawResult = $this + ->doHTTPRequest($this->generateMultiURIs($ids)); // the id used in VuFind can differ from the document-URI // (depending on how the URI is generated) foreach ($ids as $id) { @@ -244,12 +264,22 @@ public function getStatuses($ids) unset($doc); } } else { - // multiQuery is not supported, so retrieve DAIA documents by - // performing getStatus(id) for all ids + // multiQuery is not supported, so retrieve DAIA documents one by + // one foreach ($ids as $id) { - $status[] = $this->getStatus($id); + $rawResult = $this->doHTTPRequest($this->generateURI($id)); + // extract the DAIA document for the current id from the + // HTTPRequest's result + $doc = $this->extractDaiaDoc($id, $rawResult); + if (!is_null($doc)) { + // parse the extracted DAIA document and save the status + // info + $status[] = $this->parseDaiaDoc($id, $doc); + } } } + } catch (ILSException $e) { + $this->debug($e->getMessage()); } return $status; } @@ -288,6 +318,36 @@ public function getPurchaseHistory($id) return []; } + /** + * Support method to handle date uniformly + * + * @param string $date String representing a date + * + * @return string Formatted date + */ + protected function convertDate($date) + { + try { + return $this->dateConverter + ->convertToDisplayDate('Y-m-d', $date); + } catch (\Exception $e) { + $this->debug('Date conversion failed: ' . $e->getMessage()); + return ''; + } + } + + /** + * Support method to handle datetime uniformly + * + * @param string $datetime String representing a datetime + * + * @return string Formatted datetime + */ + protected function convertDatetime($datetime) + { + return $this->convertDate($datetime); + } + /** * Perform an HTTP request. * @@ -298,65 +358,64 @@ public function getPurchaseHistory($id) */ protected function doHTTPRequest($id) { - $contentTypes = [ - "xml" => "application/xml", - "json" => "application/json", - ]; - $http_headers = [ - "Content-type: " . $contentTypes[$this->daiaResponseFormat], - "Accept: " . $contentTypes[$this->daiaResponseFormat], + 'Content-type: ' . $this->contentTypesRequest[$this->daiaResponseFormat], + 'Accept: ' . $this->contentTypesRequest[$this->daiaResponseFormat], ]; $params = [ - "id" => $id, - "format" => $this->daiaResponseFormat, + 'id' => $id, + 'format' => $this->daiaResponseFormat, ]; try { - if ($this->legacySupport) { - // HttpRequest for DAIA legacy support as all - // the parameters are contained in the baseUrl - $result = $this->httpService->get( - $this->baseUrl . $id, - [], null, $http_headers - ); - } else { - $result = $this->httpService->get( - $this->baseUrl, - $params, null, $http_headers - ); - } + $result = $this->httpService->get( + $this->baseUrl, + $params, null, $http_headers + ); } catch (\Exception $e) { - throw new ILSException($e->getMessage()); + throw new ILSException( + 'HTTP request exited with Exception ' . $e->getMessage() . + ' for record: ' . $id + ); } if (!$result->isSuccess()) { - // throw ILSException disabled as this will be shown in VuFind-Frontend - //throw new ILSException('HTTP error ' . $result->getStatusCode() . - // ' retrieving status for record: ' . $id); - // write to Debug instead - $this->debug( + throw new ILSException( 'HTTP status ' . $result->getStatusCode() . ' received, retrieving availability information for record: ' . $id ); - // return false as DAIA request failed - return false; } // check if result matches daiaResponseFormat - if (!preg_match( - "/^" . - str_replace("/", "\/", $contentTypes[$this->daiaResponseFormat]) . - "(\s*)(\;.*)?/", - strtolower($result->getHeaders()->get("ContentType")->getFieldValue()) - )) { - throw new ILSException( - "DAIA-ResponseFormat not supported. Received: " . - $result->getHeaders()->get("ContentType")->getFieldValue() . " - " . - "Expected: " . $contentTypes[$this->daiaResponseFormat] - ); + if ($this->contentTypesResponse != null) { + if ($this->contentTypesResponse[$this->daiaResponseFormat]) { + $contentTypesResponse = array_map( + 'trim', + explode( + ',', + $this->contentTypesResponse[$this->daiaResponseFormat] + ) + ); + list($responseMediaType) = array_pad( + explode( + ';', + $result->getHeaders()->get('ContentType')->getFieldValue(), + 2 + ), + 2, + null + ); // workaround to avoid notices if encoding is not set in header + if (!in_array(trim($responseMediaType), $contentTypesResponse)) { + throw new ILSException( + 'DAIA-ResponseFormat not supported. Received: ' . + $responseMediaType . ' - ' . + 'Expected: ' . + $this->contentTypesResponse[$this->daiaResponseFormat] + ); + } + } } return ($result->getBody()); @@ -373,11 +432,7 @@ protected function doHTTPRequest($id) */ protected function generateURI($id) { - if ($this->legacySupport) { - return $id; - } else { - return $this->daiaIdPrefix . $id; - } + return $this->daiaIdPrefix . $id; } /** @@ -394,9 +449,9 @@ protected function generateMultiURIs($ids) { $multiURI = ''; foreach ($ids as $id) { - $multiURI .= $this->generateURI($id) . "|"; + $multiURI .= $this->generateURI($id) . '|'; } - return rtrim($multiURI, "|"); + return rtrim($multiURI, '|'); } /** @@ -406,11 +461,9 @@ protected function generateMultiURIs($ids) * compatible array of status information. * Supported types are: * - array (for JSON results) - * - DOMNode (for XML results) * * @param string $id Record Id corresponding to the DAIA document - * @param mixed $daiaDoc The DAIA document, supported types are array and - * DOMNode + * @param mixed $daiaDoc The DAIA document, only array is supported * * @return array An array with status information for the record * @throws ILSException @@ -419,8 +472,6 @@ protected function parseDaiaDoc($id, $daiaDoc) { if (is_array($daiaDoc)) { return $this->parseDaiaArray($id, $daiaDoc); - } elseif (is_subclass_of($daiaDoc, "DOMNode")) { - return $this->parseDaiaDom($id, $daiaDoc); } else { throw new ILSException( 'Unsupported document type (did not match Array or DOMNode).' @@ -444,54 +495,45 @@ protected function parseDaiaDoc($id, $daiaDoc) */ protected function extractDaiaDoc($id, $daiaResponse) { - + $docs = []; if ($this->daiaResponseFormat == 'xml') { try { - $docs = new DOMDocument(); - $docs->loadXML($daiaResponse); - // get all the DAIA documents - $doc = $docs->getElementsByTagName("document"); - if (!is_null($doc) && $this->multiQuery) { - // now loop through the found DAIA documents - for ($i = 0; $i < $doc->length; $i++) { - $attr = $doc->item($i)->attributes; - // DAIA documents should use URIs as value for id - $nodeValue = $attr->getNamedItem("id")->nodeValue; - if ($nodeValue == $this->generateURI($id)) { - // we've found the document element with the - // matching URI - return $doc->item($i); - } - } - } elseif (!is_null($doc)) { - // as multiQuery is not enabled we can be sure that the - // DAIA response only contains one document. - return $doc->item(0); - } - // no (id matching) document element found - return null; + $docs = $this->convertDaiaXmlToJson($daiaResponse); } catch (\Exception $e) { throw new ILSException($e->getMessage()); } - } elseif ($this->daiaResponseFormat == 'json') { $docs = json_decode($daiaResponse, true); + } + + if (count($docs)) { + // check for error messages and write those to log + if (array_key_exists('message', $docs)) { + $this->logMessages($docs['message'], 'document'); + } + // do DAIA documents exist? - if (array_key_exists("document", $docs) && $this->multiQuery) { + if (array_key_exists('document', $docs) && $this->multiQuery) { // now loop through the found DAIA documents - foreach ($docs["document"] as $doc) { + foreach ($docs['document'] as $doc) { // DAIA documents should use URIs as value for id - if (isset($doc["id"]) - && $doc["id"] == $this->generateURI($id) + if (isset($doc['id']) + && $doc['id'] == $this->generateURI($id) ) { // we've found the document element with the matching URI - return $doc; + // if the document has an item, then we return it + if (isset($doc['item'])) { + return $doc; + } } } - } elseif (array_key_exists("document", $docs)) { + } elseif (array_key_exists('document', $docs)) { // since a document exists but multiQuery is disabled, the first - // document is returned - return array_shift($docs['document']); + // document is returned if it contains an item + $doc = array_shift($docs['document']); + if (isset($doc['item'])) { + return $doc; + } } // no (id matching) document element found return null; @@ -500,6 +542,90 @@ protected function extractDaiaDoc($id, $daiaResponse) } } + /** + * Converts a DAIA XML response to an array identical with a DAIA JSON response + * for the sent query. + * + * @param string $daiaResponse Response in XML format from DAIA service + * + * @return mixed + */ + protected function convertDaiaXmlToJson($daiaResponse) + { + $dom = new DOMDocument(); + $dom->loadXML($daiaResponse); + + // prepare DOMDocument as json_encode does not support save attributes if + // elements have values (see http://stackoverflow.com/a/20506281/2115462) + $prepare = function ($domNode) use (&$prepare) { + foreach ($domNode->childNodes as $node) { + if ($node->hasChildNodes()) { + $prepare($node); + } else { + if (($domNode->hasAttributes() && strlen($domNode->nodeValue)) + || (in_array( + $domNode->nodeName, + ['storage', 'limitation', 'department', 'institution'] + ) && strlen($domNode->nodeValue))) { + if (trim($node->textContent)) { + $domNode->setAttribute('content', $node->textContent); + $node->nodeValue = ''; + } + } + } + } + }; + $prepare($dom); + + // now let json_encode/decode convert XML into an array + $daiaArray = json_decode( + json_encode(simplexml_load_string($dom->saveXML())), + true + ); + + // merge @attributes fields in parent array + $merge = function ($array) use (&$merge) { + foreach ($array as $key => $value) { + if (is_array($value)) { + $value = $merge($value); + } + if ($key === '@attributes') { + $array = array_merge($array, $value); + unset($array[$key]); + } else { + $array[$key] = $value; + } + } + return $array; + }; + $daiaArray = $merge($daiaArray); + + // restructure the array, moving single elements to their parent's index [0] + $restructure = function ($array) use (&$restructure) { + $elements = [ + 'document', 'item', 'available', 'unavailable', 'limitation', + 'message' + ]; + foreach ($array as $key => $value) { + if (is_array($value)) { + $value = $restructure($value); + } + if (in_array($key, $elements, true) + && !isset($array[$key][0]) + ) { + unset($array[$key]); + $array[$key][] = $value; + } else { + $array[$key] = $value; + } + } + return $array; + }; + $daiaArray = $restructure($daiaArray); + + return $daiaArray; + } + /** * Parse an array with DAIA status information. * @@ -512,46 +638,42 @@ protected function parseDaiaArray($id, $daiaArray) { $doc_id = null; $doc_href = null; - $doc_message = null; - if (array_key_exists("id", $daiaArray)) { - $doc_id = $daiaArray["id"]; + if (array_key_exists('id', $daiaArray)) { + $doc_id = $daiaArray['id']; } - if (array_key_exists("href", $daiaArray)) { - // url of the document - $doc_href = $daiaArray["href"]; + if (array_key_exists('href', $daiaArray)) { + // url of the document (not needed for VuFind) + $doc_href = $daiaArray['href']; } - if (array_key_exists("message", $daiaArray)) { - // array of messages with language code and content - $doc_message = $daiaArray["message"]; + if (array_key_exists('message', $daiaArray)) { + // log messages for debugging + $this->logMessages($daiaArray['message'], 'document'); } // if one or more items exist, iterate and build result-item - if (array_key_exists("item", $daiaArray)) { + if (array_key_exists('item', $daiaArray)) { $number = 0; - foreach ($daiaArray["item"] as $item) { + foreach ($daiaArray['item'] as $item) { $result_item = []; - $result_item["id"] = $id; - $result_item["item_id"] = $item["id"]; - $result_item["ilslink"] = $doc_href; - $number++; // count items - $result_item["number"] = $number; + $result_item['id'] = $id; + $result_item['item_id'] = $item['id']; + // custom DAIA field used in getHoldLink() + $result_item['ilslink'] + = (isset($item['href']) ? $item['href'] : $doc_href); + // count items + $number++; + $result_item['number'] = $this->getItemNumber($item, $number); // set default value for barcode - $result_item["barcode"] = "1"; + $result_item['barcode'] = $this->getItemBarcode($item); // set default value for reserve - $result_item["reserve"] = "N"; + $result_item['reserve'] = $this->getItemReserveStatus($item); // get callnumber - if (isset($item["label"])) { - $result_item["callnumber"] = $item["label"]; - } else { - $result_item["callnumber"] = "Unknown"; - } + $result_item['callnumber'] = $this->getItemCallnumber($item); // get location - if (isset($item["storage"]["content"])) { - $result_item["location"] = $item["storage"]["content"]; - } else { - $result_item["location"] = "Unknown"; - } + $result_item['location'] = $this->getItemLocation($item); + // get location link + $result_item['locationhref'] = $this->getItemLocationLink($item); // status and availability will be calculated in own function - $result_item = $this->calculateStatus($item) + $result_item; + $result_item = $this->getItemStatus($item) + $result_item; // add result_item to the result array $result[] = $result_item; } // end iteration on item @@ -561,756 +683,242 @@ protected function parseDaiaArray($id, $daiaArray) } /** - * Parse a DOMNode Object with DAIA status information. + * Returns an array with status information for provided item. * - * @param string $id Record id for the DAIA array. - * @param DOMNode $daiaDom DOMNode object with raw DAIA status information. + * @param array $item Array with DAIA item data * - * @return array Array with VuFind compatible status information. + * @return array */ - protected function parseDaiaDom($id, $daiaDom) + protected function getItemStatus($item) { - $itemlist = $daiaDom->getElementsByTagName('item'); - $ilslink = ''; - if ($daiaDom->attributes->getNamedItem('href') !== null) { - $ilslink = $daiaDom->attributes - ->getNamedItem('href')->nodeValue; - } - $emptyResult = [ - 'callnumber' => '-', - 'availability' => '0', - 'number' => 1, - 'reserve' => 'No', - 'duedate' => '', - 'queue' => '', - 'delay' => '', - 'barcode' => 'No samples', - 'status' => '', - 'id' => $id, - 'location' => '', - 'ilslink' => $ilslink, - 'label' => 'No samples' - ]; - for ($c = 0; $itemlist->item($c) !== null; $c++) { - $result = [ - 'callnumber' => '', - 'availability' => '0', - 'number' => ($c + 1), - 'reserve' => 'No', - 'duedate' => '', - 'queue' => '', - 'delay' => '', - 'barcode' => 1, - 'status' => '', - 'id' => $id, - 'item_id' => '', - 'recallhref' => '', - 'location' => '', - 'location.id' => '', - 'location.href' => '', - 'label' => '', - 'notes' => [], - ]; - if ($itemlist->item($c)->attributes->getNamedItem('id') !== null) { - $result['item_id'] = $itemlist->item($c)->attributes - ->getNamedItem('id')->nodeValue; - } - if ($itemlist->item($c)->attributes->getNamedItem('href') !== null) { - $result['recallhref'] = $itemlist->item($c)->attributes - ->getNamedItem('href')->nodeValue; - } - $departmentElements = $itemlist->item($c) - ->getElementsByTagName('department'); - if ($departmentElements->length > 0) { - if ($departmentElements->item(0)->nodeValue) { - $result['location'] - = $departmentElements->item(0)->nodeValue; - $result['location.id'] = $departmentElements - ->item(0)->attributes->getNamedItem('id')->nodeValue; - $result['location.href'] = $departmentElements - ->item(0)->attributes->getNamedItem('href')->nodeValue; - } - } - $storageElements - = $itemlist->item($c)->getElementsByTagName('storage'); - if ($storageElements->length > 0) { - if ($storageElements->item(0)->nodeValue) { - $result['location'] = $storageElements->item(0)->nodeValue; - //$result['location.id'] = $storageElements->item(0) - // ->attributes->getNamedItem('id')->nodeValue; - $href = $storageElements->item(0)->attributes - ->getNamedItem('href'); - if ($href !== null) { - //href attribute is recommended but not mandatory - $result['location.href'] = $storageElements->item(0) - ->attributes->getNamedItem('href')->nodeValue; - } - //$result['barcode'] = $result['location.id']; - } - } - $barcodeElements - = $itemlist->item($c)->getElementsByTagName('identifier'); - if ($barcodeElements->length > 0) { - if ($barcodeElements->item(0)->nodeValue) { - $result['barcode'] = $barcodeElements->item(0)->nodeValue; - } - } - $labelElements = $itemlist->item($c)->getElementsByTagName('label'); - if ($labelElements->length > 0) { - if ($labelElements->item(0)->nodeValue) { - $result['label'] = $labelElements->item(0)->nodeValue; - $result['callnumber'] - = urldecode($labelElements->item(0)->nodeValue); - } - } - $messageElements - = $itemlist->item($c)->getElementsByTagName('message'); - if ($messageElements->length > 0) { - for ($m = 0; $messageElements->item($m) !== null; $m++) { - $errno = $messageElements->item($m)->attributes - ->getNamedItem('errno')->nodeValue; - if ($errno === '404') { - $result['status'] = 'missing'; - } else if ($this->logger) { - $lang = $messageElements->item($m)->attributes - ->getNamedItem('lang')->nodeValue; - $logString = "[DAIA] message for {$lang}: " - . $messageElements->item($m)->nodeValue; - $this->debug($logString); - } - } - } - - //$loanAvail = 0; - //$loanExp = 0; - //$presAvail = 0; - //$presExp = 0; - - $unavailableElements = $itemlist->item($c) - ->getElementsByTagName('unavailable'); - if ($unavailableElements->item(0) !== null) { - for ($n = 0; $unavailableElements->item($n) !== null; $n++) { - $service = $unavailableElements->item($n)->attributes - ->getNamedItem('service'); - $expectedNode = $unavailableElements->item($n)->attributes - ->getNamedItem('expected'); - $queueNode = $unavailableElements->item($n)->attributes - ->getNamedItem('queue'); - if ($service !== null) { - $service = $service->nodeValue; - if ($service === 'presentation') { - $result['presentation.availability'] = '0'; - $result['presentation_availability'] = '0'; - if ($expectedNode !== null) { - $result['presentation.duedate'] - = $expectedNode->nodeValue; - } - if ($queueNode !== null) { - $result['presentation.queue'] - = $queueNode->nodeValue; - } - $result['availability'] = '0'; - } elseif ($service === 'loan') { - $result['loan.availability'] = '0'; - $result['loan_availability'] = '0'; - if ($expectedNode !== null) { - $result['loan.duedate'] - = $expectedNode->nodeValue; - } - if ($queueNode !== null) { - $result['loan.queue'] = $queueNode->nodeValue; - } - $result['availability'] = '0'; - } elseif ($service === 'interloan') { - $result['interloan.availability'] = '0'; - if ($expectedNode !== null) { - $result['interloan.duedate'] - = $expectedNode->nodeValue; - } - if ($queueNode !== null) { - $result['interloan.queue'] - = $queueNode->nodeValue; - } - $result['availability'] = '0'; - } elseif ($service === 'openaccess') { - $result['openaccess.availability'] = '0'; - if ($expectedNode !== null) { - $result['openaccess.duedate'] - = $expectedNode->nodeValue; - } - if ($queueNode !== null) { - $result['openaccess.queue'] - = $queueNode->nodeValue; - } - $result['availability'] = '0'; + $availability = false; + $status = ''; // status cannot be null as this will crash the translator + $duedate = null; + $availableLink = ''; + $queue = ''; + if (array_key_exists('available', $item)) { + if (count($item['available']) === 1) { + $availability = true; + } else { + // check if item is loanable or presentation + foreach ($item['available'] as $available) { + // attribute service can be set once or not + if (isset($available['service']) + && in_array( + $available['service'], + ['loan', 'presentation', 'openaccess'] + ) + ) { + // set item available if service is loan, presentation or + // openaccess + $availability = true; + if ($available['service'] == 'loan' + && isset($available['service']['href']) + ) { + // save the link to the ils if we have a href for loan + // service + $availableLink = $available['service']['href']; } } - // TODO: message/limitation - if ($expectedNode !== null) { - $result['duedate'] = $expectedNode->nodeValue; + + // use limitation element for status string + if (isset($available['limitation'])) { + $status = $this->getItemLimitation($available['limitation']); } - if ($queueNode !== null) { - $result['queue'] = $queueNode->nodeValue; + + // log messages for debugging + if (isset($available['message'])) { + $this->logMessages($available['message'], 'item->available'); } } } + } + if (array_key_exists('unavailable', $item)) { + foreach ($item['unavailable'] as $unavailable) { + // attribute service can be set once or not + if (isset($unavailable['service']) + && in_array( + $unavailable['service'], + ['loan', 'presentation', 'openaccess'] + ) + ) { + if ($unavailable['service'] == 'loan' + && isset($unavailable['service']['href']) + ) { + //save the link to the ils if we have a href for loan service + } - $availableElements = $itemlist->item($c) - ->getElementsByTagName('available'); - if ($availableElements->item(0) !== null) { - for ($n = 0; $availableElements->item($n) !== null; $n++) { - $service = $availableElements->item($n)->attributes - ->getNamedItem('service'); - $delayNode = $availableElements->item($n)->attributes - ->getNamedItem('delay'); - if ($service !== null) { - $service = $service->nodeValue; - if ($service === 'presentation') { - $result['presentation.availability'] = '1'; - $result['presentation_availability'] = '1'; - if ($delayNode !== null) { - $result['presentation.delay'] - = $delayNode->nodeValue; - } - $result['availability'] = '1'; - } elseif ($service === 'loan') { - $result['loan.availability'] = '1'; - $result['loan_availability'] = '1'; - if ($delayNode !== null) { - $result['loan.delay'] = $delayNode->nodeValue; - } - $result['availability'] = '1'; - } elseif ($service === 'interloan') { - $result['interloan.availability'] = '1'; - if ($delayNode !== null) { - $result['interloan.delay'] - = $delayNode->nodeValue; - } - $result['availability'] = '1'; - } elseif ($service === 'openaccess') { - $result['openaccess.availability'] = '1'; - if ($delayNode !== null) { - $result['openaccess.delay'] - = $delayNode->nodeValue; - } - $result['availability'] = '1'; - } + // use limitation element for status string + if (isset($unavailable['limitation'])) { + $status = $this + ->getItemLimitation($unavailable['limitation']); } - // TODO: message/limitation - if ($delayNode !== null) { - $result['delay'] = $delayNode->nodeValue; + } + // attribute expected is mandatory for unavailable element + if (isset($unavailable['expected'])) { + try { + $duedate = $this->dateConverter + ->convertToDisplayDate( + 'Y-m-d', $unavailable['expected'] + ); + } catch (\Exception $e) { + $this->debug('Date conversion failed: ' . $e->getMessage()); + $duedate = null; } } + + // attribute queue can be set + if (isset($unavailable['queue'])) { + $queue = $unavailable['queue']; + } + + // log messages for debugging + if (isset($unavailable['message'])) { + $this->logMessages($unavailable['message'], 'item->unavailable'); + } } - // document has no availability elements, so set availability - // and barcode to -1 - if ($availableElements->item(0) === null - && $unavailableElements->item(0) === null - ) { - $result['availability'] = '-1'; - $result['barcode'] = '-1'; - } - $result['ilslink'] = $ilslink; - $status[] = $result; - /* $status = "available"; - if (loanAvail) return 0; - if (presAvail) { - if (loanExp) return 1; - return 2; - } - if (loanExp) return 3; - if (presExp) return 4; - return 5; - */ } - if (count($status) === 0) { - $status[] = $emptyResult; + + /*'availability' => '0', + 'status' => '', // string - needs to be computed from availability info + 'duedate' => '', // if checked_out else null + 'returnDate' => '', // false if not recently returned(?) + 'requests_placed' => '', // total number of placed holds + 'is_holdable' => false, // place holding possible?*/ + + if (!empty($availableLink)) { + $return['ilslink'] = $availableLink; } - return $status; + $return['status'] = $status; + $return['availability'] = $availability; + $return['duedate'] = $duedate; + $return['requests_placed'] = $queue; + + return $return; } /** - * Calculate Status and Availability of an item + * Returns the value for "number" in VuFind getStatus/getHolding array * - * If availability is false the string of status will be shown in vufind + * @param array $item Array with DAIA item data + * @param int $counter Integer counting items as alternative return value + * + * @return mixed + */ + protected function getItemNumber($item, $counter) + { + return $counter; + } + + /** + * Returns the value for "barcode" in VuFind getStatus/getHolding array * - * @param string $item json DAIA item + * @param array $item Array with DAIA item data * - * @return array("status"=>"only for VIPs" ... ) + * @return string */ - protected function calculateStatus($item) + protected function getItemBarcode($item) { - $availability = false; - $status = ''; // status cannot be null as this will crash the translator - $duedate = null; - if (array_key_exists("available", $item)) { - // check if item is loanable or presentation - foreach ($item["available"] as $available) { - // attribute service can be set once or not - if (isset($available["service"])) { - if ($available["service"] == "loan") { - $availability = true; - } - if ($available["service"] == "presentation") { - $availability = true; - } - } - } - } - if (array_key_exists("unavailable", $item)) { - foreach ($item["unavailable"] as $unavailable) { - // attribute service can be set once or not - if (isset($unavailable["service"])) { - if ($unavailable["service"] == "loan") { - $status = "dummy text"; - } - } - // attribute expected is mandatory for unavailable element - if (isset($unavailable["expected"])) { - $duedate = $unavailable["expected"]; - } - } - } - return (["status" => $status, - "availability" => $availability, - "duedate" => $duedate]); + return '1'; } /** - * Flatten a DAIA response to an array of holding information. + * Returns the value for "reserve" in VuFind getStatus/getHolding array * - * @param string $id Document to look up. + * @param array $item Array with DAIA item data * - * @return array + * @return string + */ + protected function getItemReserveStatus($item) + { + return 'N'; + } + + /** + * Returns the value for "callnumber" in VuFind getStatus/getHolding array + * + * @param array $item Array with DAIA item data * - * @deprecated Only kept for legacySupport + * @return string */ - protected function getXMLStatus($id) + protected function getItemCallnumber($item) { - $daia = new DOMDocument(); - $response = $this->doHTTPRequest($id); - if ($response) { - $daia->loadXML($response); - } - // get Availability information from DAIA - $documentlist = $daia->getElementsByTagName('document'); + return array_key_exists('label', $item) && !empty($item['label']) + ? $item['label'] + : 'Unknown'; + } - // handle empty DAIA response - if ($documentlist->length == 0 - && $daia->getElementsByTagName("message") != null + /** + * Returns the value for "location" in VuFind getStatus/getHolding array + * + * @param array $item Array with DAIA item data + * + * @return string + */ + protected function getItemLocation($item) + { + if (isset($item['storage']) + && array_key_exists('content', $item['storage']) + ) { + return $item['storage']['content']; + } elseif (isset($item['department']) + && array_key_exists('content', $item['department']) ) { - // analyse the message for the error handling and debugging + return $item['department']['content']; } + return 'Unknown'; + } - $status = []; - for ($b = 0; $documentlist->item($b) !== null; $b++) { - $itemlist = $documentlist->item($b)->getElementsByTagName('item'); - $ilslink = ''; - if ($documentlist->item($b)->attributes->getNamedItem('href') !== null) { - $ilslink = $documentlist->item($b)->attributes - ->getNamedItem('href')->nodeValue; - } - $emptyResult = [ - 'callnumber' => '-', - 'availability' => '0', - 'number' => 1, - 'reserve' => 'No', - 'duedate' => '', - 'queue' => '', - 'delay' => '', - 'barcode' => 'No samples', - 'status' => '', - 'id' => $id, - 'location' => '', - 'ilslink' => $ilslink, - 'label' => 'No samples' - ]; - for ($c = 0; $itemlist->item($c) !== null; $c++) { - $result = [ - 'callnumber' => '', - 'availability' => '0', - 'number' => ($c + 1), - 'reserve' => 'No', - 'duedate' => '', - 'queue' => '', - 'delay' => '', - 'barcode' => 1, - 'status' => '', - 'id' => $id, - 'item_id' => '', - 'recallhref' => '', - 'location' => '', - 'location.id' => '', - 'location.href' => '', - 'label' => '', - 'notes' => [], - ]; - if ($itemlist->item($c)->attributes->getNamedItem('id') !== null) { - $result['item_id'] = $itemlist->item($c)->attributes - ->getNamedItem('id')->nodeValue; - } - if ($itemlist->item($c)->attributes->getNamedItem('href') !== null) { - $result['recallhref'] = $itemlist->item($c)->attributes - ->getNamedItem('href')->nodeValue; - } - $departmentElements = $itemlist->item($c) - ->getElementsByTagName('department'); - if ($departmentElements->length > 0) { - if ($departmentElements->item(0)->nodeValue) { - $result['location'] - = $departmentElements->item(0)->nodeValue; - $result['location.id'] = $departmentElements - ->item(0)->attributes->getNamedItem('id')->nodeValue; - $result['location.href'] = $departmentElements - ->item(0)->attributes->getNamedItem('href')->nodeValue; - } - } - $storageElements - = $itemlist->item($c)->getElementsByTagName('storage'); - if ($storageElements->length > 0) { - if ($storageElements->item(0)->nodeValue) { - $result['location'] = $storageElements->item(0)->nodeValue; - //$result['location.id'] = $storageElements->item(0) - // ->attributes->getNamedItem('id')->nodeValue; - $href = $storageElements->item(0)->attributes - ->getNamedItem('href'); - if ($href !== null) { - //href attribute is recommended but not mandatory - $result['location.href'] = $storageElements->item(0) - ->attributes->getNamedItem('href')->nodeValue; - } - //$result['barcode'] = $result['location.id']; - } - } - $barcodeElements - = $itemlist->item($c)->getElementsByTagName('identifier'); - if ($barcodeElements->length > 0) { - if ($barcodeElements->item(0)->nodeValue) { - $result['barcode'] = $barcodeElements->item(0)->nodeValue; - } - } - $labelElements = $itemlist->item($c)->getElementsByTagName('label'); - if ($labelElements->length > 0) { - if ($labelElements->item(0)->nodeValue) { - $result['label'] = $labelElements->item(0)->nodeValue; - $result['callnumber'] - = urldecode($labelElements->item(0)->nodeValue); - } - } - $messageElements - = $itemlist->item($c)->getElementsByTagName('message'); - if ($messageElements->length > 0) { - for ($m = 0; $messageElements->item($m) !== null; $m++) { - $errno = $messageElements->item($m)->attributes - ->getNamedItem('errno')->nodeValue; - if ($errno === '404') { - $result['status'] = 'missing'; - } else if ($this->logger) { - $lang = $messageElements->item($m)->attributes - ->getNamedItem('lang')->nodeValue; - $logString = "[DAIA] message for {$lang}: " - . $messageElements->item($m)->nodeValue; - $this->debug($logString); - } - } - } - - //$loanAvail = 0; - //$loanExp = 0; - //$presAvail = 0; - //$presExp = 0; - - $unavailableElements = $itemlist->item($c) - ->getElementsByTagName('unavailable'); - if ($unavailableElements->item(0) !== null) { - for ($n = 0; $unavailableElements->item($n) !== null; $n++) { - $service = $unavailableElements->item($n)->attributes - ->getNamedItem('service'); - $expectedNode = $unavailableElements->item($n)->attributes - ->getNamedItem('expected'); - $queueNode = $unavailableElements->item($n)->attributes - ->getNamedItem('queue'); - if ($service !== null) { - $service = $service->nodeValue; - if ($service === 'presentation') { - $result['presentation.availability'] = '0'; - $result['presentation_availability'] = '0'; - if ($expectedNode !== null) { - $result['presentation.duedate'] - = $expectedNode->nodeValue; - } - if ($queueNode !== null) { - $result['presentation.queue'] - = $queueNode->nodeValue; - } - $result['availability'] = '0'; - } elseif ($service === 'loan') { - $result['loan.availability'] = '0'; - $result['loan_availability'] = '0'; - if ($expectedNode !== null) { - $result['loan.duedate'] - = $expectedNode->nodeValue; - } - if ($queueNode !== null) { - $result['loan.queue'] = $queueNode->nodeValue; - } - $result['availability'] = '0'; - } elseif ($service === 'interloan') { - $result['interloan.availability'] = '0'; - if ($expectedNode !== null) { - $result['interloan.duedate'] - = $expectedNode->nodeValue; - } - if ($queueNode !== null) { - $result['interloan.queue'] - = $queueNode->nodeValue; - } - $result['availability'] = '0'; - } elseif ($service === 'openaccess') { - $result['openaccess.availability'] = '0'; - if ($expectedNode !== null) { - $result['openaccess.duedate'] - = $expectedNode->nodeValue; - } - if ($queueNode !== null) { - $result['openaccess.queue'] - = $queueNode->nodeValue; - } - $result['availability'] = '0'; - } - } - // TODO: message/limitation - if ($expectedNode !== null) { - $result['duedate'] = $expectedNode->nodeValue; - } - if ($queueNode !== null) { - $result['queue'] = $queueNode->nodeValue; - } - } - } + /** + * Returns the value for "location" href in VuFind getStatus/getHolding array + * + * @param array $item Array with DAIA item data + * + * @return string + */ + protected function getItemLocationLink($item) + { + return isset($item['storage']['href']) + ? $item['storage']['href'] : false; + } - $availableElements = $itemlist->item($c) - ->getElementsByTagName('available'); - if ($availableElements->item(0) !== null) { - for ($n = 0; $availableElements->item($n) !== null; $n++) { - $service = $availableElements->item($n)->attributes - ->getNamedItem('service'); - $delayNode = $availableElements->item($n)->attributes - ->getNamedItem('delay'); - if ($service !== null) { - $service = $service->nodeValue; - if ($service === 'presentation') { - $result['presentation.availability'] = '1'; - $result['presentation_availability'] = '1'; - if ($delayNode !== null) { - $result['presentation.delay'] - = $delayNode->nodeValue; - } - $result['availability'] = '1'; - } elseif ($service === 'loan') { - $result['loan.availability'] = '1'; - $result['loan_availability'] = '1'; - if ($delayNode !== null) { - $result['loan.delay'] = $delayNode->nodeValue; - } - $result['availability'] = '1'; - } elseif ($service === 'interloan') { - $result['interloan.availability'] = '1'; - if ($delayNode !== null) { - $result['interloan.delay'] - = $delayNode->nodeValue; - } - $result['availability'] = '1'; - } elseif ($service === 'openaccess') { - $result['openaccess.availability'] = '1'; - if ($delayNode !== null) { - $result['openaccess.delay'] - = $delayNode->nodeValue; - } - $result['availability'] = '1'; - } - } - // TODO: message/limitation - if ($delayNode !== null) { - $result['delay'] = $delayNode->nodeValue; - } - } - } - // document has no availability elements, so set availability - // and barcode to -1 - if ($availableElements->item(0) === null - && $unavailableElements->item(0) === null - ) { - $result['availability'] = '-1'; - $result['barcode'] = '-1'; - } - $result['ilslink'] = $ilslink; - $status[] = $result; - /* $status = "available"; - if (loanAvail) return 0; - if (presAvail) { - if (loanExp) return 1; - return 2; - } - if (loanExp) return 3; - if (presExp) return 4; - return 5; - */ - } - if (count($status) === 0) { - $status[] = $emptyResult; + /** + * Returns the evaluated value of the provided limitation element + * + * @param array $limitations Array with DAIA limitation data + * + * @return string + */ + protected function getItemLimitation($limitations) + { + foreach ($limitations as $limitation) { + // return the first limitation with content set + if (isset($limitation['content'])) { + return $limitation['content']; } } - return $status; + return ''; + } /** - * Return an abbreviated set of status information. - * - * @param string $id The record id to retrieve the status for + * Logs content of message elements in DAIA response for debugging * - * @return mixed On success, an associative array with the following keys: - * id, availability (boolean), status, location, reserve, callnumber, duedate, - * number + * @param array $messages Array with message elements to be logged + * @param string $context Description of current message context * - * @deprecated Only kept for legacySupport + * @return void */ - public function getXMLShortStatus($id) + protected function logMessages($messages, $context) { - $daia = new DOMDocument(); - $response = $this->doHTTPRequest($id); - if ($response) { - $daia->loadXML($response); - } - // get Availability information from DAIA - $itemlist = $daia->getElementsByTagName('item'); - $label = "Unknown"; - $storage = "Unknown"; - $presenceOnly = '1'; - $holding = []; - for ($c = 0; $itemlist->item($c) !== null; $c++) { - $earliest_href = ''; - $storageElements = $itemlist->item($c)->getElementsByTagName('storage'); - if ($storageElements->item(0) && $storageElements->item(0)->nodeValue) { - if ($storageElements->item(0)->nodeValue === 'Internet') { - $href = $storageElements->item(0)->attributes - ->getNamedItem('href')->nodeValue; - $storage = '' . $href . ''; - } else { - $storage = $storageElements->item(0)->nodeValue; - } - } - $labelElements = $itemlist->item($c)->getElementsByTagName('label'); - if ($labelElements->item(0)->nodeValue) { - $label = $labelElements->item(0)->nodeValue; - } - $availableElements = $itemlist->item($c) - ->getElementsByTagName('available'); - if ($availableElements->item(0) !== null) { - $availability = 1; - $status = 'Available'; - $href = $availableElements->item(0)->attributes - ->getNamedItem('href'); - if ($href !== null) { - $earliest_href = $href->nodeValue; - } - for ($n = 0; $availableElements->item($n) !== null; $n++) { - $svc = $availableElements->item($n)->getAttribute('service'); - if ($svc === 'loan') { - $presenceOnly = '0'; - } - // $status .= ' ' . $svc; - } - } else { - $leanable = 1; - $unavailableElements = $itemlist->item($c) - ->getElementsByTagName('unavailable'); - if ($unavailableElements->item(0) !== null) { - $earliest = []; - $queue = []; - $hrefs = []; - for ($n = 0; $unavailableElements->item($n) !== null; $n++) { - $unavailHref = $unavailableElements->item($n)->attributes - ->getNamedItem('href'); - if ($unavailHref !== null) { - $hrefs['item' . $n] = $unavailHref->nodeValue; - } - $expectedNode = $unavailableElements->item($n)->attributes - ->getNamedItem('expected'); - if ($expectedNode !== null) { - //$duedate = $expectedNode->nodeValue; - //$duedate_arr = explode('-', $duedate); - //$duedate_timestamp = mktime( - // '0', '0', '0', $duedate_arr[1], $duedate_arr[2], - // $duedate_arr[0] - //); - //array_push($earliest, array( - // 'expected' => $expectedNode->nodeValue, - // 'recall' => $unavailHref->nodeValue); - //array_push($earliest, $expectedNode->nodeValue); - $earliest['item' . $n] = $expectedNode->nodeValue; - } else { - array_push($earliest, "0"); - } - $queueNode = $unavailableElements->item($n)->attributes - ->getNamedItem('queue'); - if ($queueNode !== null) { - $queue['item' . $n] = $queueNode->nodeValue; - } else { - array_push($queue, "0"); - } - } - } - if (count($earliest) > 0) { - arsort($earliest); - $earliest_counter = 0; - foreach ($earliest as $earliest_key => $earliest_value) { - if ($earliest_counter === 0) { - $earliest_duedate = $earliest_value; - $earliest_href = isset($hrefs[$earliest_key]) - ? $hrefs[$earliest_key] : ''; - $earliest_queue = isset($queue[$earliest_key]) - ? $queue[$earliest_key] : ''; - } - $earliest_counter = 1; - } - } else { - $leanable = 0; - } - $messageElements = $itemlist->item($c) - ->getElementsByTagName('message'); - if ($messageElements->length > 0) { - $errno = $messageElements->item(0)->attributes - ->getNamedItem('errno')->nodeValue; - if ($errno === '404') { - $status = 'missing'; - } - } - if (!isset($status)) { - $status = 'Unavailable'; - } - $availability = 0; - } - $reserve = 'N'; - if (isset($earliest_queue) && $earliest_queue > 0) { - $reserve = 'Y'; + foreach ($messages as $message) { + if (isset($message['content'])) { + $this->debug( + 'Message in DAIA response (' . (string) $context . '): ' . + $message['content'] + ); } - $holding[] = [ - 'availability' => $availability, - 'id' => $id, - 'status' => isset($status) ? "$status" : '', - 'location' => isset($storage) ? "$storage" : '', - 'reserve' => isset($reserve) ? $reserve : '', - 'queue' => isset($earliest_queue) ? $earliest_queue : '', - 'callnumber' => isset($label) ? "$label" : '', - 'duedate' => isset($earliest_duedate) ? $earliest_duedate : '', - 'leanable' => isset($leanable) ? $leanable : '', - 'recallhref' => isset($earliest_href) ? $earliest_href : '', - 'number' => ($c + 1), - 'presenceOnly' => isset($presenceOnly) ? $presenceOnly : '', - ]; } - return $holding; } } diff --git a/module/VuFind/src/VuFind/ILS/Driver/Demo.php b/module/VuFind/src/VuFind/ILS/Driver/Demo.php index 5819af091f7..c6219f89752 100644 --- a/module/VuFind/src/VuFind/ILS/Driver/Demo.php +++ b/module/VuFind/src/VuFind/ILS/Driver/Demo.php @@ -228,6 +228,8 @@ protected function getRecordSource() protected function getRandomHolding($id, $number, array $patron = null) { $status = $this->getFakeStatus(); + $location = $this->getFakeLoc(); + $locationhref = ($location === 'Campus A') ? 'http://campus-a' : false; return [ 'id' => $id, 'source' => $this->getRecordSource(), @@ -236,7 +238,8 @@ protected function getRandomHolding($id, $number, array $patron = null) 'barcode' => sprintf("%08d", rand() % 50000), 'availability' => $status == 'Available', 'status' => $status, - 'location' => $this->getFakeLoc(), + 'location' => $location, + 'locationhref' => $locationhref, 'reserve' => (rand() % 100 > 49) ? 'Y' : 'N', 'callnumber' => $this->getFakeCallNum(), 'duedate' => '', diff --git a/module/VuFind/src/VuFind/ILS/Driver/Factory.php b/module/VuFind/src/VuFind/ILS/Driver/Factory.php index 78b83c70376..ff3fa67e790 100644 --- a/module/VuFind/src/VuFind/ILS/Driver/Factory.php +++ b/module/VuFind/src/VuFind/ILS/Driver/Factory.php @@ -56,6 +56,20 @@ public static function getAleph(ServiceManager $sm) ); } + /** + * Factory for DAIA driver. + * + * @param ServiceManager $sm Service manager. + * + * @return DAIA + */ + public static function getDAIA(ServiceManager $sm) + { + return new DAIA( + $sm->getServiceLocator()->get('VuFind\DateConverter') + ); + } + /** * Factory for Demo driver. * diff --git a/module/VuFind/src/VuFind/ILS/Driver/MultiBackend.php b/module/VuFind/src/VuFind/ILS/Driver/MultiBackend.php index 0a6e35349fb..89a1cef942e 100644 --- a/module/VuFind/src/VuFind/ILS/Driver/MultiBackend.php +++ b/module/VuFind/src/VuFind/ILS/Driver/MultiBackend.php @@ -71,7 +71,7 @@ class MultiBackend extends AbstractBase * * @var object[] */ - protected $cache = []; + protected $cache = []; /** * The array of booleans letting us know if a @@ -79,7 +79,7 @@ class MultiBackend extends AbstractBase * * @var boolean[] */ - protected $isInitialized = []; + protected $isInitialized = []; /** * The array of driver configuration options. @@ -288,7 +288,60 @@ public function getNewItems($page, $limit, $daysOld, $fundId = null) { $driver = $this->getDriver($this->defaultDriver); if ($driver) { - return $driver->getNewItems($page, $limit, $daysOld, $fundId); + $result = $driver->getNewItems($page, $limit, $daysOld, $fundId); + if (isset($result['results'])) { + $result['results'] + = $this->addIdPrefixes($result['results'], $this->defaultDriver); + } + return $result; + } + return []; + } + + /** + * Get Departments + * + * Obtain a list of departments for use in limiting the reserves list. + * + * @return array An associative array with key = dept. ID, value = dept. name. + */ + public function getDepartments() + { + $driver = $this->getDriver($this->defaultDriver); + if ($driver) { + return $driver->getDepartments(); + } + return []; + } + + /** + * Get Instructors + * + * Obtain a list of instructors for use in limiting the reserves list. + * + * @return array An associative array with key = ID, value = name. + */ + public function getInstructors() + { + $driver = $this->getDriver($this->defaultDriver); + if ($driver) { + return $driver->getInstructors(); + } + return []; + } + + /** + * Get Courses + * + * Obtain a list of courses for use in limiting the reserves list. + * + * @return array An associative array with key = ID, value = name. + */ + public function getCourses() + { + $driver = $this->getDriver($this->defaultDriver); + if ($driver) { + return $driver->getCourses(); } return []; } @@ -308,7 +361,11 @@ public function findReserves($course, $inst, $dept) { $driver = $this->getDriver($this->defaultDriver); if ($driver) { - return $driver->findReserves($course, $inst, $dept); + return $this->addIdPrefixes( + $driver->findReserves($course, $inst, $dept), + $this->defaultDriver, + ['BIB_ID'] + ); } return []; } diff --git a/module/VuFind/src/VuFind/ILS/Driver/PICA.php b/module/VuFind/src/VuFind/ILS/Driver/PICA.php deleted file mode 100644 index b0d349154ea..00000000000 --- a/module/VuFind/src/VuFind/ILS/Driver/PICA.php +++ /dev/null @@ -1,714 +0,0 @@ - - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License - * @link http://vufind.org/wiki/vufind2:building_an_ils_driver Wiki - */ -namespace VuFind\ILS\Driver; -use DOMDocument, VuFind\Exception\ILS as ILSException; - -/** - * ILS Driver for VuFind to get information from PICA - * - * Holding information is obtained by DAIA, so it's not necessary to implement those - * functions here; we just need to extend the DAIA driver. - * - * @category VuFind2 - * @package ILS_Drivers - * @author Oliver Goldschmidt - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License - * @link http://vufind.org/wiki/vufind2:building_an_ils_driver Wiki - */ -class PICA extends DAIA -{ - protected $username; - protected $password; - protected $ldapConfigurationParameter; - - protected $catalogHost; - protected $renewalsScript; - protected $dbsid; - - /** - * Initialize the driver. - * - * Validate configuration and perform all resource-intensive tasks needed to - * make the driver active. - * - * @throws ILSException - * @return void - */ - public function init() - { - parent::init(); - - $this->catalogHost = $this->config['Catalog']['Host']; - $this->renewalsScript = $this->config['Catalog']['renewalsScript']; - $this->dbsid = isset($this->config['Catalog']['DB']) - ? $this->config['Catalog']['DB'] : 1; - } - - // public functions implemented to satisfy Driver Interface - - /** - * Patron Login - * - * This is responsible for authenticating a patron against the catalog. - * - * @param string $barcode The patron username - * @param string $password The patron's password - * - * @throws ILSException - * @return mixed Associative array of patron info on successful login, - * null on unsuccessful login. - */ - public function patronLogin($barcode, $password) - { - // Build request: - $request = new \Zend\Http\Request(); - $request->getPost() - ->set('username', $barcode) - ->set('password', $password); - - // First try local database: - $db = new \VuFind\Auth\Database(); - try { - $user = $db->authenticate($request); - } catch (\VuFind\Exception\Auth $e) { - // Next try LDAP: - $ldap = new \VuFind\Auth\LDAP(); - $user = $ldap->authenticate($request); - } - - $_SESSION['picauser'] = $user; - return [ - 'id' => $user->id, - 'firstname' => $user->firstname, - 'lastname' => $user->lastname, - 'email' => $user->email, - 'username' => $barcode, - 'password' => $password, - 'cat_username' => $barcode, - 'cat_password' => $password - ]; - } - - /** - * Get Patron Profile - * - * This is responsible for retrieving the profile for a specific patron. - * - * @param array $user The patron array - * - * @throws ILSException - * @return array Array of the patron's profile data on success. - */ - public function getMyProfile($user) - { - // TODO: this object probably doesn't have enough fields; it may be necessary - // to subclass VuFind\Auth\LDAP with a different processLDAPUser() method for - // loading the additional required properties. - $userinfo = & $_SESSION['picauser']; - // firstname - $recordList['firstname'] = $userinfo->firstname; - // lastname - $recordList['lastname'] = $userinfo->lastname; - // email - $recordList['email'] = $userinfo->email; - //Street and Number $ City $ Zip - if ($userinfo->address) { - $address = explode("\$", $userinfo->address); - // address1 - $recordList['address1'] = $address[1]; - // address2 - $recordList['address2'] = $address[2]; - // zip (Post Code) - $recordList['zip'] = $address[3]; - } else if ($userinfo->homeaddress) { - $address = explode("\$", $userinfo->homeaddress); - $recordList['address2'] = $address[0]; - $recordList['zip'] = $address[1]; - } - // phone - $recordList['phone'] = $userinfo->phone; - // group - $recordList['group'] = $userinfo->group; - if ($recordList['firstname'] === null) { - $recordList = $user; - // add a group - $recordList['group'] = 'No library account'; - } - $recordList['expiration'] = $userinfo->libExpire; - $recordList['status'] = $userinfo->borrowerStatus; - // Get the LOANS-Page to extract a message for the user - $URL = "/loan/DB={$this->dbsid}/USERINFO"; - $POST = [ - "ACT" => "UI_DATA", - "LNG" => "DU", - "BOR_U" => $_SESSION['picauser']->username, - "BOR_PW" => $_SESSION['picauser']->getCatPassword() - ]; - $postit = $this->postit($URL, $POST); - // How many messages are there? - $messages = substr_count($postit, ''); - $position = 0; - if ($messages === 2) { - // ignore the first message (its only the message to close the window - // after finishing) - for ($n = 0; $n < 2; $n++) { - $pos = strpos($postit, '', $position); - $pos_close = strpos($postit, '', $pos); - $value = substr($postit, $pos + 22, ($pos_close - $pos - 22)); - $position = $pos + 1; - } - $recordList['message'] = $value; - } - return $recordList; - } - - /** - * Get Patron Transactions - * - * This is responsible for retrieving all transactions (i.e. checked out items) - * by a specific patron. - * - * @param array $patron The patron array from patronLogin - * - * @throws \VuFind\Exception\Date - * @throws ILSException - * @return array Array of the patron's transactions on success. - * - * @SuppressWarnings(PHPMD.UnusedFormalParameter) - */ - public function getMyTransactions($patron) - { - $URL = "/loan/DB={$this->dbsid}/USERINFO"; - $POST = [ - "ACT" => "UI_LOL", - "LNG" => "DU", - "BOR_U" => $_SESSION['picauser']->username, - "BOR_PW" => $_SESSION['picauser']->getCatPassword() - ]; - $postit = $this->postit($URL, $POST); - // How many items are there? - $holds = substr_count($postit, 'input type="checkbox" name="VB"'); - $iframes = $holdsByIframe = substr_count($postit, '= $holds) { - $position = strpos($postit, '', $current_position - 1 - ); - if ($n === 1) { - $position_reservations = $current_position; - } - if ($n === 2) { - $position_expire = $current_position; - } - if ($n === 4) { - $position_state = $current_position; - } - if ($n === 5) { - $position_title = $current_position; - } - } - if ($position_state !== null - && substr($postit, $position_state + 24, 8) !== 'bestellt' - ) { - $reservations[] - = substr($postit, $position_reservations + 24, 1); - $expiration[] = substr($postit, $position_expire + 24, 10); - $renewals[] = $this->getRenewals($completeValue); - $closing_title = strpos($postit, '', $position_title); - $titles[] = $completeValue . " " . substr( - $postit, $position_title + 24, - ($closing_title - $position_title - 24) - ); - } else { - $holdsByIframe--; - array_pop($ppns); - array_pop($barcode); - } - } - $holds = $holdsByIframe; - } else { - // no iframes in PICA catalog, use checkboxes instead - // Warning: reserved items have no checkbox in OPC! They wont appear - // in this list - $position = strpos($postit, 'input type="checkbox" name="VB"'); - for ($i = 0; $i < $holds; $i++) { - $pos = strpos($postit, 'value=', $position); - $value = substr($postit, $pos + 11, 8); - $completeValue = substr($postit, $pos + 7, 12); - $barcode[] = $completeValue; - $ppns[] = $this->getPpnByBarcode($value); - $position = $pos + 1; - $position_expire = $position; - for ($n = 0; $n < 4; $n++) { - $position_expire = strpos( - $postit, '', $position_expire + 1 - ); - } - $expiration[] = substr($postit, $position_expire + 24, 10); - $renewals[] = $this->getRenewals($completeValue); - } - } - for ($i = 0; $i < $holds; $i++) { - if ($ppns[$i] !== false) { - $transList[] = [ - 'id' => $ppns[$i], - 'duedate' => $expiration[$i], - 'renewals' => $renewals[$i], - 'reservations' => $reservations[$i], - 'vb' => $barcode[$i], - 'title' => $titles[$i] - ]; - } else { - // There is a problem: no PPN found for this item... lets take id 0 - // to avoid serious error (that will just return an empty title) - $transList[] = [ - 'id' => 0, - 'duedate' => $expiration[$i], - 'renewals' => $renewals[$i], - 'reservations' => $reservations[$i], - 'vb' => $barcode[$i], - 'title' => $titles[$i] - ]; - } - } - return $transList; - } - - /** - * Support method - reverse strpos. - * - * @param string $haystack String to search within - * @param string $needle String to search for - * @param int $offset Search offset - * - * @return int Offset of $needle in $haystack - */ - protected function strposBackwards($haystack, $needle, $offset = 0) - { - if ($offset === 0) { - $haystack_reverse = strrev($haystack); - } else { - $haystack_reverse = strrev(substr($haystack, 0, $offset)); - } - $needle_reverse = strrev($needle); - $position_brutto = strpos($haystack_reverse, $needle_reverse); - if ($offset === 0) { - $position_netto = strlen($haystack) - $position_brutto - strlen($needle); - } else { - $position_netto = $offset - $position_brutto - strlen($needle); - } - return $position_netto; - } - - /** - * Get the number of renewals - * - * @param string $barcode Barcode of the medium - * - * @return int number of renewals, if renewals script has not been set, return - * false - */ - protected function getRenewals($barcode) - { - $renewals = false; - if (isset($this->renewalsScript) === true) { - $POST = [ - "DB" => '1', - "VBAR" => $barcode, - "U" => $_SESSION['picauser']->username - ]; - $URL = $this->renewalsScript; - $postit = $this->postit($URL, $POST); - - $renewalsString = $postit; - $pos = strpos($postit, ' "UI_RENEWLOAN", - "BOR_U" => $_SESSION['picauser']->username, - "BOR_PW" => $_SESSION['picauser']->getCatPassword() - ); - if (is_array($recordId) === true) { - // TODO: fix this; something seems wrong with the logic - foreach ($recordId as $rid) { - array_push($POST['VB'], $recordId); - } - } else { - $POST['VB'] = $recordId; - } - $this->postit($URL, $POST); - */ - - return true; - } - - /** - * Get Patron Fines - * - * This is responsible for retrieving all fines by a specific patron. - * - * @param array $patron The patron array from patronLogin - * - * @throws \VuFind\Exception\Date - * @throws ILSException - * @return mixed Array of the patron's fines on success. - * - * @SuppressWarnings(PHPMD.UnusedFormalParameter) - */ - public function getMyFines($patron) - { - $URL = "/loan/DB={$this->dbsid}/LNG=DU/USERINFO"; - $POST = [ - "ACT" => "UI_LOC", - "BOR_U" => $_SESSION['picauser']->username, - "BOR_PW" => $_SESSION['picauser']->getCatPassword() - ]; - $postit = $this->postit($URL, $POST); - - // How many items are there? - $holds = substr_count($postit, 'Betrag'); - for ($i = 0; $i < $holds; $i++) { - $pos = strpos($postit, ' description - // length = position of next - startposition - $nextClosingTd = strpos($postit, '', $pos); - $description[$i] - = substr($postit, $pos + 18, ($nextClosingTd - $pos - 18)); - $position = $pos + 1; - // next class=plain => date of fee creation - $pos = strpos($postit, '', $pos); - $fineDate[$i] = substr($postit, $pos + 18, ($nextClosingTd - $pos - 18)); - $position = $pos + 1; - // next class=plain => amount of fee - $pos = strpos($postit, '', $pos); - $fineString = substr($postit, $pos + 32, ($nextClosingTd - $pos - 32)); - $feeString = explode(',', $fineString); - $feeString[1] = substr($feeString[1], 0, 2); - $fine[$i] = (double) implode('', $feeString); - $position = $pos + 1; - } - - $fineList = []; - for ($i = 0; $i < $holds; $i++) { - $fineList[] = [ - "amount" => $fine[$i], - "checkout" => "", - "fine" => $fineDate[$i] . ': ' . - utf8_encode(html_entity_decode($description[$i])), - "duedate" => "" - ]; - // id should be the ppn of the book resulting the fine but there's - // currently no way to find out the PPN (we have neither barcode nor - // signature...) - } - return $fineList; - } - - /** - * Get Patron Holds - * - * This is responsible for retrieving all holds by a specific patron. - * - * @param array $patron The patron array from patronLogin - * - * @throws \VuFind\Exception\Date - * @throws ILSException - * @return array Array of the patron's holds on success. - * - * @SuppressWarnings(PHPMD.UnusedFormalParameter) - */ - public function getMyHolds($patron) - { - $URL = "/loan/DB={$this->dbsid}/LNG=DU/USERINFO"; - $POST = [ - "ACT" => "UI_LOR", - "BOR_U" => $_SESSION['picauser']->username, - "BOR_PW" => $_SESSION['picauser']->getCatPassword() - ]; - $postit = $this->postit($URL, $POST); - - // How many items are there? - $holds = substr_count($postit, 'input type="checkbox" name="VB"'); - $ppns = []; - $creation = []; - $position = strpos($postit, 'input type="checkbox" name="VB"'); - for ($i = 0; $i < $holds; $i++) { - $pos = strpos($postit, 'value=', $position); - $value = substr($postit, $pos + 11, 8); - $ppns[] = $this->getPpnByBarcode($value); - $position = $pos + 1; - $position_create = $position; - for ($n = 0; $n < 3; $n++) { - $position_create = strpos( - $postit, '', $position_create + 1 - ); - } - $creation[] - = str_replace('-', '.', substr($postit, $position_create + 24, 10)); - } - /* items, which are ordered and have no signature yet, are not included in - * the for-loop getthem by checkbox PPN - */ - $moreholds = substr_count($postit, 'input type="checkbox" name="PPN"'); - $position = strpos($postit, 'input type="checkbox" name="PPN"'); - for ($i = 0; $i < $moreholds; $i++) { - $pos = strpos($postit, 'value=', $position); - // get the length of PPN - $x = strpos($postit, '"', $pos + 7); - $value = substr($postit, $pos + 7, $x - $pos - 7); - // problem: the value presented here does not contain the checksum! - // so its not a valid identifier - // we need to calculate the checksum - $checksum = 0; - for ($i = 0; $i < strlen($value);$i++) { - $checksum += $value[$i] * (9 - $i); - } - if ($checksum % 11 === 1) { - $checksum = 'X'; - } else if ($checksum % 11 === 0) { - $checksum = 0; - } else { - $checksum = 11 - $checksum % 11; - } - $ppns[] = $value . $checksum; - $position = $pos + 1; - $position_create = $position; - for ($n = 0; $n < 3; $n++) { - $position_create = strpos( - $postit, '', $position_create + 1 - ); - } - $creation[] - = str_replace('-', '.', substr($postit, $position_create + 24, 10)); - } - - /* media ordered from closed stack is not visible on the UI_LOR page - * requested above... we need to do another request and filter the - * UI_LOL-page for requests - */ - $POST_LOL = [ - "ACT" => "UI_LOL", - "BOR_U" => $_SESSION['picauser']->username, - "BOR_PW" => $_SESSION['picauser']->getCatPassword() - ]; - $postit_lol = $this->postit($URL, $POST_LOL); - - $requests = substr_count( - $postit_lol, 'bestellt' - ); - $position = 0; - for ($i = 0; $i < $requests; $i++) { - $position = strpos( - $postit_lol, 'bestellt', $position + 1 - ); - $pos = strpos( - $postit_lol, '', ($position - 100) - ); - $nextClosingTd = strpos($postit_lol, '', $pos); - $value = substr($postit_lol, $pos + 27, ($nextClosingTd - $pos - 27)); - $ppns[] = $this->getPpnByBarcode($value); - $creation[] = date('d.m.Y'); - } - - for ($i = 0; $i < ($holds + $moreholds + $requests); $i++) { - $holdList[] = [ - "id" => $ppns[$i], - "create" => $creation[$i] - ]; - } - return $holdList; - } - - /** - * Place Hold - * - * Attempts to place a hold or recall on a particular item and returns - * an array with result details or throws an exception on failure of support - * classes - * - * @param array $holdDetails An array of item and patron data - * - * @throws ILSException - * @return mixed An array of data on the request including - * whether or not it was successful and a system message (if available) - */ - - //public function placeHold($holdDetails) - //{ - //} - - - /** - * Get Funds - * - * Return a list of funds which may be used to limit the getNewItems list. - * - * @throws ILSException - * @return array An associative array with key = fund ID, value = fund name. - */ - public function getFunds() - { - // TODO - return []; - } - - // protected functions to connect to PICA - - /** - * Post something to a foreign host - * - * @param string $file POST target URL - * @param string $data_to_send POST data - * - * @return string POST response - */ - protected function postit($file, $data_to_send) - { - // TODO: can we use Zend\Http\Client here instead? - - // Parameter verarbeiten - foreach ($data_to_send as $key => $dat) { - $data_to_send[$key] - = "$key=" . rawurlencode(utf8_encode(stripslashes($dat))); - } - $postData = implode("&", $data_to_send); - - // HTTP-Header vorbereiten - $out = "POST $file HTTP/1.1\r\n"; - $out .= "Host: " . $this->catalogHost . "\r\n"; - $out .= "Content-type: application/x-www-form-urlencoded\r\n"; - $out .= "Content-length: " . strlen($postData) . "\r\n"; - $out .= "User-Agent: " . $_SERVER["HTTP_USER_AGENT"] . "\r\n"; - $out .= "Connection: Close\r\n"; - $out .= "\r\n"; - $out .= $postData; - if (!$conex = @fsockopen($this->catalogHost, "80", $errno, $errstr, 10)) { - error_log($errno . ': ' . $errstr); - return 0; - } - fwrite($conex, $out); - $data = ''; - while (!feof($conex)) { - $data .= fgets($conex, 512); - } - fclose($conex); - return $data; - } - - /** - * Gets a PPN by its barcode - * - * @param string $barcode Barcode to use for lookup - * - * @return string PPN - */ - protected function getPpnByBarcode($barcode) - { - $searchUrl = "http://" . $this->catalogHost . - "/DB={$this->dbsid}/XML=1.0/CMD?ACT=SRCHA&IKT=1016&SRT=YOP&TRM=sgn+" . - $barcode; - $doc = new DOMDocument(); - $doc->load($searchUrl); - // get Availability information from DAIA - $itemlist = $doc->getElementsByTagName('SHORTTITLE'); - if (count($itemlist->item(0)->attributes) > 0) { - $ppn = $itemlist->item(0)->attributes->getNamedItem('PPN')->nodeValue; - } else { - return false; - } - return $ppn; - } - - /** - * Gets holdings of magazine and journal exemplars - * - * @param string $ppn PPN identifier - * - * @return array - */ - public function getJournalHoldings($ppn) - { - $searchUrl = "http://" . $this->catalogHost . - "/DB={$this->dbsid}/XML=1.0/SET=1/TTL=1/FAM?PPN=" . $ppn . - "&SHRTST=10000"; - $doc = new DOMDocument(); - $doc->load($searchUrl); - $itemlist = $doc->getElementsByTagName('SHORTTITLE'); - $ppn = []; - for ($n = 0; $itemlist->item($n); $n++) { - if (count($itemlist->item($n)->attributes) > 0) { - $ppn[] = $itemlist->item($n)->attributes->getNamedItem('PPN') - ->nodeValue; - } - } - return $ppn; - } -} diff --git a/module/VuFind/src/VuFind/ILS/Driver/Virtua.php b/module/VuFind/src/VuFind/ILS/Driver/Virtua.php index 2d1fca44cdb..eb62efdb596 100644 --- a/module/VuFind/src/VuFind/ILS/Driver/Virtua.php +++ b/module/VuFind/src/VuFind/ILS/Driver/Virtua.php @@ -1539,9 +1539,6 @@ public function placeHold($holdDetails) // Assume an error response: $response = ['success' => false, 'status' => "hold_error_fail"]; - // Get the iPortal server - $web_server = $this->config['Catalog']['webhost']; - // Validate input // * Request level $allowed_req_levels = [ @@ -1568,7 +1565,7 @@ public function placeHold($holdDetails) } // Still here? Guess the request is valid, lets send it to virtua - $virtua_url = "http://$web_server/cgi-bin/chameleon?" . + $virtua_url = $this->getApiBaseUrl() . '?' . // Standard stuff "search=NOSRCH&function=REQUESTS&reqreqtype=0&reqtype=0" . "&reqscr=2&reqreqlevel=2&reqidtype=127&reqmincircperiod=" . @@ -1649,10 +1646,7 @@ public function cancelHolds($cancelDetails) */ protected function cancelHold($request_number) { - // Get the iPortal server - $web_server = $this->config['Catalog']['webhost']; - - $virtua_url = "http://$web_server/cgi-bin/chameleon?" . + $virtua_url = $this->getApiBaseUrl() . '?' . // Standard stuff "search=NOSRCH&function=REQUESTS&reqreqtype=1&reqtype=0" . "&reqscr=4&reqreqlevel=2&reqidtype=127" . @@ -1689,17 +1683,14 @@ protected function cancelHold($request_number) */ protected function fakeLogin($patron) { - // Get the iPortal server - $web_server = $this->config['Catalog']['webhost']; - - $virtua_url = "http://$web_server/cgi-bin/chameleon"; + $virtua_url = $this->getApiBaseUrl(); $postParams = [ "SourceScreen" => "INITREQ", "conf" => "./chameleon.conf", "elementcount" => "1", "function" => "PATRONATTEMPT", "host" => $this->config['Catalog']['host_string'], - "lng" => "en", + "lng" => $this->getConfiguredLanguage(), "login" => "1", "pos" => "1", "rootsearch" => "KEYWORD", @@ -1766,13 +1757,10 @@ public function renewMyItems($renewDetails) $initial[$row['barcode']] = $row; } - // Get the iPortal server - $web_server = $this->config['Catalog']['webhost']; - // Fake a login to get an authenticated session $session_id = $this->fakeLogin($patron); - $virtua_url = "http://$web_server/cgi-bin/chameleon"; + $virtua_url = $this->getApiBaseUrl(); // Have to use raw post data because of the way // virtua expects the barcodes to come across. @@ -1780,7 +1768,7 @@ public function renewMyItems($renewDetails) $post_data .= "&search=" . "PATRON"; $post_data .= "&sessionid=" . "$session_id"; $post_data .= "&skin=" . "homepage"; - $post_data .= "&lng=" . "en"; + $post_data .= "&lng=" . $this->getConfiguredLanguage(); $post_data .= "&inst=" . "consortium"; $post_data .= "&conf=" . urlencode("./chameleon.conf"); $post_data .= "&u1=" . "12"; @@ -1849,6 +1837,32 @@ public function getSuppressedAuthorityRecords() return $list; } + /** + * Support method -- get base URL for API requests. + * + * @return string + */ + protected function getApiBaseUrl() + { + // Get the iPortal server + $host = $this->config['Catalog']['webhost']; + $path = isset($this->config['Catalog']['cgi_token']) + ? trim($this->config['Catalog']['cgi_token'], '/') + : 'cgi-bin'; + return "http://{$host}/{$path}/chameleon"; + } + + /** + * Support method -- determine the language from the configuration. + * + * @return string + */ + protected function getConfiguredLanguage() + { + return isset($this->config['Catalog']['language']) + ? $this->config['Catalog']['language'] : 'en'; + } + /** * Support method -- perform an HTTP request. This will be a GET request unless * either $postParams or $rawPost is set to a non-null value. diff --git a/module/VuFind/src/VuFind/ILS/Driver/Voyager.php b/module/VuFind/src/VuFind/ILS/Driver/Voyager.php index 6e8360eea19..29d67b0a7bf 100644 --- a/module/VuFind/src/VuFind/ILS/Driver/Voyager.php +++ b/module/VuFind/src/VuFind/ILS/Driver/Voyager.php @@ -797,7 +797,7 @@ protected function getPurchaseHistoryData($id) $raw = $processed = []; // Collect raw data: while ($row = $sqlStmt->fetch(PDO::FETCH_ASSOC)) { - $raw[] = $row['MFHD_ID'] . '||' . $row['ENUMCHRON']; + $raw[] = $row['MFHD_ID'] . '||' . utf8_encode($row['ENUMCHRON']); } // Deduplicate data and format it: foreach (array_unique($raw) as $current) { diff --git a/module/VuFind/src/VuFind/ILS/Driver/VoyagerRestful.php b/module/VuFind/src/VuFind/ILS/Driver/VoyagerRestful.php index 9c2f0a17500..8aa285220bf 100644 --- a/module/VuFind/src/VuFind/ILS/Driver/VoyagerRestful.php +++ b/module/VuFind/src/VuFind/ILS/Driver/VoyagerRestful.php @@ -770,6 +770,32 @@ public function getPickUpLocations($patron = false, $holdDetails = null) ]; } } + + // Do we need to sort pickup locations? If the setting is false, don't + // bother doing any more work. If it's not set at all, default to + // alphabetical order. + $orderSetting = isset($this->config['Holds']['pickUpLocationOrder']) + ? $this->config['Holds']['pickUpLocationOrder'] : 'default'; + if (count($pickResponse) > 1 && !empty($orderSetting)) { + $locationOrder = $orderSetting === 'default' + ? [] : array_flip(explode(':', $orderSetting)); + $sortFunction = function ($a, $b) use ($locationOrder) { + $aLoc = $a['locationID']; + $bLoc = $b['locationID']; + if (isset($locationOrder[$aLoc])) { + if (isset($locationOrder[$bLoc])) { + return $locationOrder[$aLoc] - $locationOrder[$bLoc]; + } + return -1; + } + if (isset($locationOrder[$bLoc])) { + return 1; + } + return strcasecmp($a['locationDisplay'], $b['locationDisplay']); + }; + usort($pickResponse, $sortFunction); + } + return $pickResponse; } diff --git a/module/VuFind/src/VuFind/ILS/Logic/Holds.php b/module/VuFind/src/VuFind/ILS/Logic/Holds.php index fbb4d82cd14..6673cd550c1 100644 --- a/module/VuFind/src/VuFind/ILS/Logic/Holds.php +++ b/module/VuFind/src/VuFind/ILS/Logic/Holds.php @@ -122,8 +122,9 @@ protected function formatHoldings($holdings) $retVal[$groupKey] = [ 'items' => $items, 'location' => isset($items[0]['location']) - ? $items[0]['location'] - : '' + ? $items[0]['location'] : '', + 'locationhref' => isset($items[0]['locationhref']) + ? $items[0]['locationhref'] : '' ]; // Copy all text fields from the item to the holdings level foreach ($items as $item) { diff --git a/module/VuFind/src/VuFind/Log/Logger.php b/module/VuFind/src/VuFind/Log/Logger.php index 7ae2ea04c31..e4fad47c0b8 100644 --- a/module/VuFind/src/VuFind/Log/Logger.php +++ b/module/VuFind/src/VuFind/Log/Logger.php @@ -128,9 +128,9 @@ public function setConfig($config) $this->addWriters($writer, $filters); } - // Null writer to avoid errors + // Null (no-op) writer to avoid errors if (count($this->writers) == 0) { - $nullWriter = 'Zend\Log\Writer\Null'; + $nullWriter = 'Zend\Log\Writer\Noop'; $this->addWriter(new $nullWriter()); } } diff --git a/module/VuFind/src/VuFind/Net/IpAddressUtils.php b/module/VuFind/src/VuFind/Net/IpAddressUtils.php new file mode 100644 index 00000000000..b699075e21c --- /dev/null +++ b/module/VuFind/src/VuFind/Net/IpAddressUtils.php @@ -0,0 +1,120 @@ + + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @link http://www.vufind.org Main Page + */ +namespace VuFind\Net; + +/** + * IP address utility functions. + * + * @category VuFind2 + * @package Authorization + * @author Ere Maijala + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @link http://www.vufind.org Main Page + */ +class IpAddressUtils +{ + /** + * Normalize an IP address or a beginning of it to an IPv6 address + * + * @param string $ip IP Address + * @param boolean $end Whether to make a partial address an "end of range" + * address + * + * @return string|false Packed in_addr representation if successful, false + * for invalid IP address + */ + public function normalizeIp($ip, $end = false) + { + // The check for AF_INET6 allows fallback to IPv4 only if necessary. + // Hopefully that's not necessary. + if (strpos($ip, ':') === false || !defined('AF_INET6')) { + // IPv4 address + + // Append parts until complete + $addr = explode('.', $ip); + for ($i = count($addr); $i < 4; $i++) { + $addr[] = $end ? 255 : 0; + } + + // Get rid of leading zeros etc. + $ip = implode('.', array_map('intval', $addr)); + if (!defined('AF_INET6')) { + return inet_pton($ip); + } + $ip = "::$ip"; + } else { + // IPv6 address + + // Expand :: with '0:' as many times as necessary for a complete address + $count = substr_count($ip, ':'); + if ($count < 8) { + $ip = str_replace( + '::', ':' . str_repeat('0:', 8 - $count), $ip + ); + } + if ($ip[0] == ':') { + $ip = "0$ip"; + } + // Append ':0' or ':ffff' to complete the address + $count = substr_count($ip, ':'); + if ($count < 7) { + $ip .= str_repeat($end ? ':ffff' : ':0', 7 - $count); + } + } + return inet_pton($ip); + } + + /** + * Check if an IP address is in a range. Works also with mixed IPv4 and IPv6 + * addresses. + * + * @param string $ip IP address to check + * @param array $ranges An array of IP addresses or address ranges to check + * + * @return bool + */ + public function isInRange($ip, $ranges) + { + $ip = $this->normalizeIp($ip); + foreach ($ranges as $range) { + $ips = explode('-', $range, 2); + if (!isset($ips[1])) { + $ips[1] = $ips[0]; + } + $ips[0] = $this->normalizeIp($ips[0]); + $ips[1] = $this->normalizeIp($ips[1], true); + if ($ips[0] === false || $ips[1] === false) { + continue; + } + if ($ip >= $ips[0] && $ip <= $ips[1]) { + return true; + } + } + return false; + } +} diff --git a/module/VuFind/src/VuFind/Recommend/SwitchQuery.php b/module/VuFind/src/VuFind/Recommend/SwitchQuery.php index 7b6491bd304..bbee882c69c 100644 --- a/module/VuFind/src/VuFind/Recommend/SwitchQuery.php +++ b/module/VuFind/src/VuFind/Recommend/SwitchQuery.php @@ -74,13 +74,11 @@ class SwitchQuery implements RecommendInterface protected $skipChecks = []; /** - * Names of transforms to apply. These should correspond - * with transform method names -- e.g. to apply the transform found in the - * transformTruncateChar() method, you would put 'truncatechar' into this array. + * List of 'opt-in' methods (others are 'opt-out' by default). * * @var array */ - protected $transforms = []; + protected $optInMethods = ['fuzzy', 'truncatechar']; /** * Search results object. @@ -113,10 +111,14 @@ public function setConfig($settings) $callback = function ($i) { return trim(strtolower($i)); }; + // Get a list of "opt out" preferences from the user... $this->skipChecks = !empty($params[1]) ? array_map($callback, explode(',', $params[1])) : []; - $this->transforms = !empty($params[2]) + $optIns = !empty($params[2]) ? explode(',', $params[2]) : []; + $this->skipChecks = array_merge( + $this->skipChecks, array_diff($this->optInMethods, $optIns) + ); } /** @@ -167,27 +169,12 @@ public function process($results) if (substr($method, 0, 5) == 'check') { $currentCheck = strtolower(substr($method, 5)); if (!in_array($currentCheck, $this->skipChecks)) { - $result = $this->$method($query); - if ($result) { + if ($result = $this->$method($query)) { $this->suggestions['switchquery_' . $currentCheck] = $result; } } } } - - // Perform all transforms (based on naming convention): - $methods = get_class_methods($this); - foreach ($methods as $method) { - if (substr($method, 0, 9) == 'transform') { - $currTrans = strtolower(substr($method, 9)); - if (in_array($currTrans, $this->transforms)) { - $result = $this->$method($query); - if ($result) { - $this->suggestions['switchquery_' . $currTrans] = $result; - } - } - } - } } /** @@ -208,6 +195,27 @@ protected function queryShouldBeSkipped($query) return false; } + /** + * Will a fuzzy search help? + * + * @param string $query Query to check + * + * @return string|bool + */ + protected function checkFuzzy($query) + { + // Don't stack tildes: + if (strpos($query, '~') !== false) { + return false; + } + $query = trim($query, ' ?*'); + // Fuzzy search only works for single keywords, not phrases: + if (substr($query, -1) == '"') { + return false; + } + return (substr($query, -1) != '~') ? $query . '~' : false; + } + /** * Does the query contain lowercase boolean operators that should be uppercased? * @@ -271,11 +279,11 @@ protected function checkUnwantedQuotes($query) */ protected function checkWildcard($query) { + $query = trim($query, ' ?~'); // Don't pile wildcards on phrases: if (substr($query, -1) == '"') { return false; } - $query = trim($query, ' ?'); return (substr($query, -1) != '*') ? $query . '*' : false; } @@ -286,7 +294,7 @@ protected function checkWildcard($query) * * @return string|bool */ - protected function transformTruncatechar($query) + protected function checkTruncatechar($query) { // Don't truncate phrases: if (substr($query, -1) == '"') { diff --git a/module/VuFind/src/VuFind/RecordDriver/SolrDefault.php b/module/VuFind/src/VuFind/RecordDriver/SolrDefault.php index c910f4f4267..f216d78193e 100644 --- a/module/VuFind/src/VuFind/RecordDriver/SolrDefault.php +++ b/module/VuFind/src/VuFind/RecordDriver/SolrDefault.php @@ -296,6 +296,19 @@ public function getCallNumbers() return isset($this->fields['callnumber-raw']) ? $this->fields['callnumber-raw'] : []; } + + /** + * Return the first valid DOI found in the record (false if none). + * + * @return mixed + */ + public function getCleanDOI() + { + $field = 'doi_str_mv'; + return (isset($this->fields[$field][0]) && !empty($this->fields[$field][0])) + ? $this->fields[$field][0] : false; + } + /** * Return the first valid ISBN found in the record (favoring ISBN-10 over * ISBN-13 when possible). diff --git a/module/VuFind/src/VuFind/RecordDriver/Summon.php b/module/VuFind/src/VuFind/RecordDriver/Summon.php index 4b027d5dacc..9af20c7a7ac 100644 --- a/module/VuFind/src/VuFind/RecordDriver/Summon.php +++ b/module/VuFind/src/VuFind/RecordDriver/Summon.php @@ -113,7 +113,6 @@ public function getCleanDOI() { return (isset($this->fields['DOI'][0]) && !empty($this->fields['DOI'][0])) ? $this->fields['DOI'][0] : false; - } /** diff --git a/module/VuFind/src/VuFind/RecordTab/PluginManager.php b/module/VuFind/src/VuFind/RecordTab/PluginManager.php index a79162a7fc4..b397c9f247a 100644 --- a/module/VuFind/src/VuFind/RecordTab/PluginManager.php +++ b/module/VuFind/src/VuFind/RecordTab/PluginManager.php @@ -26,6 +26,7 @@ * @link http://vufind.org/wiki/vufind2:record_tabs Wiki */ namespace VuFind\RecordTab; +use VuFind\RecordDriver\AbstractBase as AbstractRecordDriver; /** * Record tab plugin manager @@ -38,6 +39,35 @@ */ class PluginManager extends \VuFind\ServiceManager\AbstractPluginManager { + /** + * Load the specified key from the configuration array using the best + * available match to the class of the provided driver. Return the default + * value if no match is found. + * + * @param AbstractRecordDriver $driver Record driver + * @param array $config Tab configuration (map of + * driver class => tab configuration) + * @param string $setting Key to load from configuration + * @param string $default Default to use if no setting found + * + * @return mixed + */ + protected function getConfigByClass(AbstractRecordDriver $driver, + array $config, $setting, $default + ) { + // Get the current record driver's class name, then start a loop + // in case we need to use a parent class' name to find the appropriate + // setting. + $className = get_class($driver); + do { + if (isset($config[$className][$setting])) { + return $config[$className][$setting]; + } + } while ($className = get_parent_class($className)); + // No setting found... + return $default; + } + /** * Return the name of the base class or interface that plug-ins must conform * to. @@ -53,43 +83,45 @@ protected function getExpectedInterface() * Get an array of service names by looking up the provided record driver in * the provided tab configuration array. * - * @param \VuFind\RecordDriver\AbstractBase $driver Record driver - * @param array $config Tab configuration - * (associative array including 'tabs' array mapping driver class => tab service - * name) + * @param AbstractRecordDriver $driver Record driver + * @param array $config Tab configuration (associative array + * including 'tabs' array mapping driver class => tab service name) * * @return array */ - protected function getTabServiceNames(\VuFind\RecordDriver\AbstractBase $driver, + protected function getTabServiceNames(AbstractRecordDriver $driver, array $config ) { - // Get the current record driver's class name, then start a loop - // in case we need to use a parent class' name to find the appropriate - // setting. - $className = get_class($driver); - while (true) { - if (isset($config[$className]['tabs'])) { - return $config[$className]['tabs']; - } - $className = get_parent_class($className); - if (empty($className)) { - // No setting found... - return []; - } - } + return $this->getConfigByClass($driver, $config, 'tabs', []); + } + + /** + * Get a default tab by looking up the provided record driver in the tab + * configuration array. + * + * @param AbstractRecordDriver $driver Record driver + * @param array $config Tab configuration (map of + * driver class => tab configuration) + * + * @return string + */ + public function getDefaultTabForRecord(AbstractRecordDriver $driver, + array $config + ) { + return $this->getConfigByClass($driver, $config, 'defaultTab', null); } /** * Get an array of valid tabs for the provided record driver. * - * @param \VuFind\RecordDriver\AbstractBase $driver Record driver - * @param array $config Tab configuration (map of - * driver class => tab service name - * @param \Zend\Http\Request $request User request (optional) + * @param AbstractRecordDriver $driver Record driver + * @param array $config Tab configuration (map of + * driver class => tab configuration) + * @param \Zend\Http\Request $request User request (optional) * - * @return array service name => tab object + * @return array service name => tab object */ - public function getTabsForRecord(\VuFind\RecordDriver\AbstractBase $driver, + public function getTabsForRecord(AbstractRecordDriver $driver, array $config, $request = null ) { $tabs = []; diff --git a/module/VuFind/src/VuFind/Role/PermissionProvider/Factory.php b/module/VuFind/src/VuFind/Role/PermissionProvider/Factory.php index 8251bfa1ca9..418c9d9e5c2 100644 --- a/module/VuFind/src/VuFind/Role/PermissionProvider/Factory.php +++ b/module/VuFind/src/VuFind/Role/PermissionProvider/Factory.php @@ -50,7 +50,10 @@ class Factory */ public static function getIpRange(ServiceManager $sm) { - return new IpRange($sm->getServiceLocator()->get('Request')); + return new IpRange( + $sm->getServiceLocator()->get('Request'), + $sm->getServiceLocator()->get('VuFind\IpAddressUtils') + ); } /** diff --git a/module/VuFind/src/VuFind/Role/PermissionProvider/IpRange.php b/module/VuFind/src/VuFind/Role/PermissionProvider/IpRange.php index bb910d1b794..848de695f85 100644 --- a/module/VuFind/src/VuFind/Role/PermissionProvider/IpRange.php +++ b/module/VuFind/src/VuFind/Role/PermissionProvider/IpRange.php @@ -5,6 +5,7 @@ * PHP version 5 * * Copyright (C) Villanova University 2007. + * Copyright (C) The National Library of Finland 2015. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, @@ -23,11 +24,13 @@ * @package Authorization * @author Demian Katz * @author Jochen Lienhard + * @author Ere Maijala * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @link http://www.vufind.org Main Page */ namespace VuFind\Role\PermissionProvider; use Zend\Http\PhpEnvironment\Request; +use VuFind\Net\IpAddressUtils; /** * IpRange permission provider for VuFind. @@ -36,6 +39,7 @@ * @package Authorization * @author Demian Katz * @author Jochen Lienhard + * @author Ere Maijala * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @link http://www.vufind.org Main Page */ @@ -48,14 +52,23 @@ class IpRange implements PermissionProviderInterface */ protected $request; + /** + * IpAddressUtils object + * + * @var IpAddressUtils + */ + protected $ipAddressUtils; + /** * Constructor * - * @param Request $request Request object + * @param Request $request Request object + * @param IpAddressUtils $ipUtils IpAddressUtils object */ - public function __construct(Request $request) + public function __construct(Request $request, IpAddressUtils $ipUtils) { $this->request = $request; + $this->ipAddressUtils = $ipUtils; } /** @@ -70,7 +83,7 @@ public function getPermissions($options) { // Check if any regex matches.... $ip = $this->request->getServer()->get('REMOTE_ADDR'); - if ($this->checkIP($ip, $options)) { + if ($this->ipAddressUtils->isInRange($ip, (array)$options)) { // Match? Grant to all users (guest or logged in). return ['guest', 'loggedin']; } @@ -78,40 +91,4 @@ public function getPermissions($options) // No match? No permissions. return []; } - - /** - * Check if $remoteIP is within $rangeIP - * - * @param string $remoteIP ip address of the user - * @param array $rangeIP single ip or range of addresses - * - * @return bool - * - * @todo Implement IPv6 check - */ - protected function checkIP($remoteIP, $rangeIP) - { - $mylist = []; - $count = 0; - $inList = false; - foreach ((array)$rangeIP as $range) { - if (preg_match('/-/', $range)) { - $tmp = preg_split('/-/', $range); - $mylist[$count]['start'] = $tmp[0]; - $mylist[$count]['end'] = $tmp[1]; - } else { - $mylist[$count]['start'] = $range; - $mylist[$count]['end'] = $range; - } - $count++; - } - foreach ($mylist as $check) { - if (ip2long($remoteIP) >= ip2long($check['start']) - && ip2long($remoteIP) <= ip2long($check['end']) - ) { - $inList = true; - } - } - return $inList; - } -} \ No newline at end of file +} diff --git a/module/VuFind/src/VuFind/Search/Base/Options.php b/module/VuFind/src/VuFind/Search/Base/Options.php index baf551397d1..e2f57f162e8 100644 --- a/module/VuFind/src/VuFind/Search/Base/Options.php +++ b/module/VuFind/src/VuFind/Search/Base/Options.php @@ -149,6 +149,13 @@ abstract class Options implements TranslatorAwareInterface */ protected $translatedFacets = []; + /** + * Text domains for translated facets + * + * @var array + */ + protected $translatedFacetsTextDomains = []; + /** * Spelling setting * @@ -466,6 +473,43 @@ public function getTranslatedFacets() return $this->translatedFacets; } + /** + * Configure facet translation using an array of field names with optional + * colon-separated text domains. + * + * @param array $facets Incoming configuration. + * + * @return void + */ + public function setTranslatedFacets($facets) + { + // Reset properties: + $this->translatedFacets = $this->translatedFacetsTextDomains = []; + + // Fill in new data: + foreach ($facets as $current) { + $parts = explode(':', $current); + $this->translatedFacets[] = $parts[0]; + if (isset($parts[1])) { + $this->translatedFacetsTextDomains[$parts[0]] = $parts[1]; + } + } + } + + /** + * Look up the text domain for use when translating a particular facet + * field. + * + * @param string $field Field name being translated + * + * @return string + */ + public function getTextDomainForTranslatedFacet($field) + { + return isset($this->translatedFacetsTextDomains[$field]) + ? $this->translatedFacetsTextDomains[$field] : 'default'; + } + /** * Get current spellcheck setting and (optionally) change it. * diff --git a/module/VuFind/src/VuFind/Search/Base/Params.php b/module/VuFind/src/VuFind/Search/Base/Params.php index 6873b2f1ce9..c6a4a96dda2 100644 --- a/module/VuFind/src/VuFind/Search/Base/Params.php +++ b/module/VuFind/src/VuFind/Search/Base/Params.php @@ -914,11 +914,11 @@ public function getFilterList($excludeCheckboxFilters = false) ? $this->getCheckboxFacetValues() : []; $list = []; + $translatedFacets = $this->getOptions()->getTranslatedFacets(); // Loop through all the current filter fields foreach ($this->filterList as $field => $values) { list($operator, $field) = $this->parseOperatorAndFieldName($field); - $translate - = in_array($field, $this->getOptions()->getTranslatedFacets()); + $translate = in_array($field, $translatedFacets); // and each value currently used for that field foreach ($values as $value) { // Add to the list unless it's in the list of fields to skip: @@ -947,12 +947,13 @@ public function getFilterList($excludeCheckboxFilters = false) */ protected function formatFilterListEntry($field, $value, $operator, $translate) { - return [ - 'value' => $value, - 'displayText' => $translate ? $this->translate($value) : $value, - 'field' => $field, - 'operator' => $operator, - ]; + if ($translate) { + $domain = $this->getOptions()->getTextDomainForTranslatedFacet($field); + $displayText = $this->translate("$domain::$value"); + } else { + $displayText = $value; + } + return compact('value', 'displayText', 'field', 'operator'); } /** diff --git a/module/VuFind/src/VuFind/Search/Base/Results.php b/module/VuFind/src/VuFind/Search/Base/Results.php index cc358b8ddc6..8f32ddd4da7 100644 --- a/module/VuFind/src/VuFind/Search/Base/Results.php +++ b/module/VuFind/src/VuFind/Search/Base/Results.php @@ -463,7 +463,7 @@ public function getPaginator() } // Build the standard paginator control: - $nullAdapter = "Zend\Paginator\Adapter\Null"; + $nullAdapter = "Zend\Paginator\Adapter\NullFill"; $paginator = new Paginator(new $nullAdapter($total)); $paginator->setCurrentPageNumber($this->getParams()->getPage()) ->setItemCountPerPage($this->getParams()->getLimit()) @@ -621,4 +621,4 @@ public function translate() [$this->getOptions(), 'translate'], func_get_args() ); } -} \ No newline at end of file +} diff --git a/module/VuFind/src/VuFind/Search/EDS/Options.php b/module/VuFind/src/VuFind/Search/EDS/Options.php index 0a1ff435e63..1ce1eca4836 100644 --- a/module/VuFind/src/VuFind/Search/EDS/Options.php +++ b/module/VuFind/src/VuFind/Search/EDS/Options.php @@ -133,9 +133,9 @@ public function __construct(\VuFind\Config\PluginManager $configLoader, if (isset($facetConf->Advanced_Facet_Settings->translated_facets) && count($facetConf->Advanced_Facet_Settings->translated_facets) > 0 ) { - foreach ($facetConf->Advanced_Facet_Settings->translated_facets as $c) { - $this->translatedFacets[] = $c; - } + $this->setTranslatedFacets( + $facetConf->Advanced_Facet_Settings->translated_facets->toArray() + ); } } diff --git a/module/VuFind/src/VuFind/Search/EDS/Results.php b/module/VuFind/src/VuFind/Search/EDS/Results.php index 500e1d38426..91828971b8c 100644 --- a/module/VuFind/src/VuFind/Search/EDS/Results.php +++ b/module/VuFind/src/VuFind/Search/EDS/Results.php @@ -104,7 +104,7 @@ public function getFacetList($filter = null) if (is_array($this->responseFacets)) { // Get the filter list -- we'll need to check it below: $filterList = $this->getParams()->getFilters(); - + $translatedFacets = $this->getOptions()->getTranslatedFacets(); foreach ($this->responseFacets as $current) { // The "displayName" value is actually the name of the field on // EBSCO's side -- we'll probably need to translate this to a @@ -112,9 +112,10 @@ public function getFacetList($filter = null) $field = $current['displayName']; // Should we translate values for the current facet? - $translate = in_array( - $field, $this->getOptions()->getTranslatedFacets() - ); + if ($translate = in_array($field, $translatedFacets)) { + $transTextDomain = $this->getOptions() + ->getTextDomainForTranslatedFacet($field); + } // Loop through all the facet values to see if any are applied. foreach ($current['counts'] as $facetIndex => $facetDetails) { @@ -139,8 +140,9 @@ public function getFacetList($filter = null) // Create display value: $current['counts'][$facetIndex]['displayText'] = $translate - ? $this->translate($facetDetails['displayText']) - : $facetDetails['displayText']; + ? $this->translate( + "$transTextDomain::{$facetDetails['displayText']}" + ) : $facetDetails['displayText']; // Create display value: $current['counts'][$facetIndex]['value'] diff --git a/module/VuFind/src/VuFind/Search/Factory/AbstractSolrBackendFactory.php b/module/VuFind/src/VuFind/Search/Factory/AbstractSolrBackendFactory.php index e62e1131001..1cc621078bc 100644 --- a/module/VuFind/src/VuFind/Search/Factory/AbstractSolrBackendFactory.php +++ b/module/VuFind/src/VuFind/Search/Factory/AbstractSolrBackendFactory.php @@ -259,11 +259,21 @@ protected function getSolrCore() /** * Get the Solr URL. * - * @return string + * @return string|array */ protected function getSolrUrl() { - return $this->config->get('config')->Index->url . '/' . $this->getSolrCore(); + $url = $this->config->get('config')->Index->url; + $core = $this->getSolrCore(); + if (is_object($url)) { + return array_map( + function ($value) use ($core) { + return "$value/$core"; + }, + $url->toArray() + ); + } + return "$url/$core"; } /** diff --git a/module/VuFind/src/VuFind/Search/Primo/Options.php b/module/VuFind/src/VuFind/Search/Primo/Options.php index 7236deb59cb..304507fdc16 100644 --- a/module/VuFind/src/VuFind/Search/Primo/Options.php +++ b/module/VuFind/src/VuFind/Search/Primo/Options.php @@ -59,10 +59,9 @@ public function __construct(\VuFind\Config\PluginManager $configLoader) if (isset($facetSettings->Advanced_Facet_Settings->translated_facets) && count($facetSettings->Advanced_Facet_Settings->translated_facets) > 0 ) { - $list = $facetSettings->Advanced_Facet_Settings->translated_facets; - foreach ($list as $c) { - $this->translatedFacets[] = $c; - } + $this->setTranslatedFacets( + $facetSettings->Advanced_Facet_Settings->translated_facets->toArray() + ); } if (isset($facetSettings->Advanced_Facet_Settings->special_facets)) { $this->specialAdvancedFacets diff --git a/module/VuFind/src/VuFind/Search/Primo/Results.php b/module/VuFind/src/VuFind/Search/Primo/Results.php index cf0fbdfd7e2..a37c6dfd2f8 100644 --- a/module/VuFind/src/VuFind/Search/Primo/Results.php +++ b/module/VuFind/src/VuFind/Search/Primo/Results.php @@ -81,19 +81,23 @@ public function getFacetList($filter = null) $order = array_flip(array_keys($filter)); // Loop through the facets returned by Primo. $facetResult = []; + $translatedFacets = $this->getOptions()->getTranslatedFacets(); if (is_array($this->responseFacets)) { foreach ($this->responseFacets as $field => $current) { - $translate - = in_array($field, $this->getOptions()->getTranslatedFacets()); + if ($translate = in_array($field, $translatedFacets)) { + $transTextDomain = $this->getOptions() + ->getTextDomainForTranslatedFacet($field); + } if (isset($filter[$field])) { $new = []; foreach ($current as $value => $count) { + $rawFixed = $this->getParams()->fixPrimoFacetValue($value); + $displayText = $translate ? $this->translate( + "$transTextDomain::$value", [], $rawFixed + ) : $rawFixed; $new[] = [ 'value' => $value, - 'displayText' => - $translate - ? $this->translate($value) - : $this->getParams()->fixPrimoFacetValue($value), + 'displayText' => $displayText, 'isApplied' => $this->getParams()->hasFilter("$field:" . $value), 'operator' => 'AND', 'count' => $count diff --git a/module/VuFind/src/VuFind/Search/Solr/HierarchicalFacetHelper.php b/module/VuFind/src/VuFind/Search/Solr/HierarchicalFacetHelper.php index 0e2084f9615..1121542a3e8 100644 --- a/module/VuFind/src/VuFind/Search/Solr/HierarchicalFacetHelper.php +++ b/module/VuFind/src/VuFind/Search/Solr/HierarchicalFacetHelper.php @@ -252,7 +252,7 @@ protected function updateAppliedChildrenStatus($list) foreach ($list as &$item) { $item['hasAppliedChildren'] = !empty($item['children']) && $this->updateAppliedChildrenStatus($item['children']); - if ($item['isApplied']) { + if ($item['isApplied'] || $item['hasAppliedChildren']) { $result = true; } } diff --git a/module/VuFind/src/VuFind/Search/Solr/Options.php b/module/VuFind/src/VuFind/Search/Solr/Options.php index fde902c08f4..f617d467adf 100644 --- a/module/VuFind/src/VuFind/Search/Solr/Options.php +++ b/module/VuFind/src/VuFind/Search/Solr/Options.php @@ -155,9 +155,9 @@ public function __construct(\VuFind\Config\PluginManager $configLoader) if (isset($facetSettings->Advanced_Settings->translated_facets) && count($facetSettings->Advanced_Settings->translated_facets) > 0 ) { - foreach ($facetSettings->Advanced_Settings->translated_facets as $c) { - $this->translatedFacets[] = $c; - } + $this->setTranslatedFacets( + $facetSettings->Advanced_Settings->translated_facets->toArray() + ); } if (isset($facetSettings->Advanced_Settings->special_facets)) { $this->specialAdvancedFacets diff --git a/module/VuFind/src/VuFind/Search/Solr/Params.php b/module/VuFind/src/VuFind/Search/Solr/Params.php index 1b27627baec..e76bc991e39 100644 --- a/module/VuFind/src/VuFind/Search/Solr/Params.php +++ b/module/VuFind/src/VuFind/Search/Solr/Params.php @@ -619,6 +619,14 @@ protected function formatFilterListEntry($field, $value, $operator, $translate) $filter['displayText'] = $facetHelper->formatDisplayText( $filter['displayText'], true, $separator ); + if ($translate) { + $domain = $this->getOptions()->getTextDomainForTranslatedFacet( + $field + ); + $filter['displayText'] = $this->translate( + [$domain, $filter['displayText']] + ); + } } return $filter; diff --git a/module/VuFind/src/VuFind/Search/Solr/Results.php b/module/VuFind/src/VuFind/Search/Solr/Results.php index c61a0638452..d6b5f94aaa4 100644 --- a/module/VuFind/src/VuFind/Search/Solr/Results.php +++ b/module/VuFind/src/VuFind/Search/Solr/Results.php @@ -240,6 +240,7 @@ public function getFacetList($filter = null) // Loop through every field returned by the result set $fieldFacets = $this->responseFacets->getFieldFacets(); + $translatedFacets = $this->getOptions()->getTranslatedFacets(); foreach (array_keys($filter) as $field) { $data = isset($fieldFacets[$field]) ? $fieldFacets[$field] : []; // Skip empty arrays: @@ -253,15 +254,18 @@ public function getFacetList($filter = null) // Build our array of values for this field $list[$field]['list'] = []; // Should we translate values for the current facet? - $translate - = in_array($field, $this->getOptions()->getTranslatedFacets()); + if ($translate = in_array($field, $translatedFacets)) { + $translateTextDomain = $this->getOptions() + ->getTextDomainForTranslatedFacet($field); + } // Loop through values: foreach ($data as $value => $count) { // Initialize the array of data about the current facet: $currentSettings = []; $currentSettings['value'] = $value; $currentSettings['displayText'] - = $translate ? $this->translate($value) : $value; + = $translate + ? $this->translate("$translateTextDomain::$value") : $value; $currentSettings['count'] = $count; $currentSettings['operator'] = $this->getParams()->getFacetOperator($field); diff --git a/module/VuFind/src/VuFind/Search/Summon/Options.php b/module/VuFind/src/VuFind/Search/Summon/Options.php index ee938d1227c..626a2b65a4b 100644 --- a/module/VuFind/src/VuFind/Search/Summon/Options.php +++ b/module/VuFind/src/VuFind/Search/Summon/Options.php @@ -66,10 +66,9 @@ public function __construct(\VuFind\Config\PluginManager $configLoader) if (isset($facetSettings->Advanced_Facet_Settings->translated_facets) && count($facetSettings->Advanced_Facet_Settings->translated_facets) > 0 ) { - $list = $facetSettings->Advanced_Facet_Settings->translated_facets; - foreach ($list as $c) { - $this->translatedFacets[] = $c; - } + $this->setTranslatedFacets( + $facetSettings->Advanced_Facet_Settings->translated_facets->toArray() + ); } if (isset($facetSettings->Advanced_Facet_Settings->special_facets)) { $this->specialAdvancedFacets diff --git a/module/VuFind/src/VuFind/Search/Summon/Results.php b/module/VuFind/src/VuFind/Search/Summon/Results.php index 844d97b320c..108418e0c20 100644 --- a/module/VuFind/src/VuFind/Search/Summon/Results.php +++ b/module/VuFind/src/VuFind/Search/Summon/Results.php @@ -204,6 +204,10 @@ protected function formatFacetData($current) $translate = in_array( $field, $this->getOptions()->getTranslatedFacets() ); + if ($translate) { + $transTextDomain = $this->getOptions() + ->getTextDomainForTranslatedFacet($field); + } // Loop through all the facet values to see if any are applied. foreach ($current['counts'] as $facetIndex => $facetDetails) { @@ -236,7 +240,7 @@ protected function formatFacetData($current) // Create display value: $current['counts'][$facetIndex]['displayText'] = $translate - ? $this->translate($facetDetails['value']) + ? $this->translate("$transTextDomain::{$facetDetails['value']}") : $facetDetails['value']; } diff --git a/module/VuFind/src/VuFind/Service/Factory.php b/module/VuFind/src/VuFind/Service/Factory.php index dd279d35644..4f20f5105a8 100644 --- a/module/VuFind/src/VuFind/Service/Factory.php +++ b/module/VuFind/src/VuFind/Service/Factory.php @@ -353,6 +353,9 @@ public static function getHttp(ServiceManager $sm) if (isset($config->Proxy->port)) { $options['proxy_port'] = $config->Proxy->port; } + if (isset($config->Proxy->type)) { + $options['proxy_type'] = $config->Proxy->type; + } } $defaults = isset($config->Http) ? $config->Http->toArray() : []; @@ -461,6 +464,25 @@ public static function getLogger(ServiceManager $sm) return $logger; } + /** + * Construct the ProxyManager configuration. + * + * @param ServiceManager $sm Service manager. + * + * @return \ProxyManager\Configuration + */ + public static function getProxyConfig(ServiceManager $sm) + { + $config = new \ProxyManager\Configuration(); + $cacheManager = $sm->get('VuFind\CacheManager'); + $dir = $cacheManager->getCacheDir() . 'objects'; + $config->setProxiesTargetDir($dir); + if (APPLICATION_ENV != 'development') { + spl_autoload_register($config->getProxyAutoloader()); + } + return $config; + } + /** * Construct the recaptcha helper * diff --git a/module/VuFind/src/VuFind/View/Helper/AbstractLayoutClass.php b/module/VuFind/src/VuFind/View/Helper/AbstractLayoutClass.php index 3b924d77738..9df0a7c2af0 100644 --- a/module/VuFind/src/VuFind/View/Helper/AbstractLayoutClass.php +++ b/module/VuFind/src/VuFind/View/Helper/AbstractLayoutClass.php @@ -56,7 +56,7 @@ abstract class AbstractLayoutClass extends \Zend\View\Helper\AbstractHelper * Constructor * * @param bool $left Does the sidebar go on the left? - * @param bool $offcanvas Offcanvas config setting + * @param bool $offcanvas Is offcanvas menu active? */ public function __construct($left = false, $offcanvas = false) { diff --git a/module/VuFind/src/VuFind/View/Helper/Blueprint/Factory.php b/module/VuFind/src/VuFind/View/Helper/Blueprint/Factory.php deleted file mode 100644 index 27ef1985263..00000000000 --- a/module/VuFind/src/VuFind/View/Helper/Blueprint/Factory.php +++ /dev/null @@ -1,58 +0,0 @@ - - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License - * @link http://vufind.org/wiki/vufind2:developer_manual Wiki - */ -namespace VuFind\View\Helper\Blueprint; -use Zend\ServiceManager\ServiceManager; - -/** - * Factory for Blueprint view helpers. - * - * @category VuFind2 - * @package View_Helpers - * @author Demian Katz - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License - * @link http://vufind.org/wiki/vufind2:developer_manual Wiki - * - * @codeCoverageIgnore - */ -class Factory -{ - /** - * Construct the LayoutClass helper. - * - * @param ServiceManager $sm Service manager. - * - * @return LayoutClass - */ - public static function getLayoutClass(ServiceManager $sm) - { - $config = $sm->getServiceLocator()->get('VuFind\Config')->get('config'); - $left = !isset($config->Site->sidebarOnLeft) - ? false : $config->Site->sidebarOnLeft; - return new LayoutClass($left); - } -} \ No newline at end of file diff --git a/module/VuFind/src/VuFind/View/Helper/Blueprint/LayoutClass.php b/module/VuFind/src/VuFind/View/Helper/Blueprint/LayoutClass.php deleted file mode 100644 index 10fb76a091e..00000000000 --- a/module/VuFind/src/VuFind/View/Helper/Blueprint/LayoutClass.php +++ /dev/null @@ -1,63 +0,0 @@ - - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License - * @link http://vufind.org/wiki/vufind2:developer_manual Wiki - */ -namespace VuFind\View\Helper\Blueprint; - -/** - * Helper class for managing blueprint theme's high-level (body vs. sidebar) page - * layout. - * - * @category VuFind2 - * @package View_Helpers - * @author Demian Katz - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License - * @link http://vufind.org/wiki/vufind2:developer_manual Wiki - */ -class LayoutClass extends \VuFind\View\Helper\AbstractLayoutClass -{ - /** - * Helper to allow easily configurable page layout -- given a broad class - * name, return appropriate CSS classes to lay out the page according to - * the current configuration file settings. - * - * @param string $class Type of class to return ('mainbody' or 'sidebar') - * - * @return string CSS classes to apply - */ - public function __invoke($class) - { - switch ($class) { - case 'mainbody': - return $this->left ? 'span-18 push-5 last' : 'span-18'; - case 'sidebar': - return $this->left ? 'span-5 pull-18 sidebarOnLeft' : 'span-5 last'; - default: - return ''; - } - } -} \ No newline at end of file diff --git a/module/VuFind/src/VuFind/View/Helper/Blueprint/Search.php b/module/VuFind/src/VuFind/View/Helper/Blueprint/Search.php deleted file mode 100644 index 42ef66b5fc7..00000000000 --- a/module/VuFind/src/VuFind/View/Helper/Blueprint/Search.php +++ /dev/null @@ -1,65 +0,0 @@ - - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License - * @link http://vufind.org/wiki/vufind2:developer_manual Wiki - */ -namespace VuFind\View\Helper\Blueprint; - -/** - * Helper class for displaying search-related HTML chunks. - * - * @category VuFind2 - * @package View_Helpers - * @author Demian Katz - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License - * @link http://vufind.org/wiki/vufind2:developer_manual Wiki - */ -class Search extends \VuFind\View\Helper\AbstractSearch -{ - /** - * Get the CSS classes for the container holding the suggestions. - * - * @return string - */ - protected function getContainerClass() - { - return 'corrections'; - } - - /** - * Render an expand link. - * - * @param string $url Link href - * @param \Zend\View\Renderer\PhpRenderer $view View renderer object - * - * @return string - */ - protected function renderExpandLink($url, $view) - { - return '' . $view->transEsc('spell_expand_alt') . ''; - } -} \ No newline at end of file diff --git a/module/VuFind/src/VuFind/View/Helper/Bootprint/Factory.php b/module/VuFind/src/VuFind/View/Helper/Bootprint/Factory.php deleted file mode 100644 index 6a84eeb1ced..00000000000 --- a/module/VuFind/src/VuFind/View/Helper/Bootprint/Factory.php +++ /dev/null @@ -1,58 +0,0 @@ - - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License - * @link http://vufind.org/wiki/vufind2:developer_manual Wiki - */ -namespace VuFind\View\Helper\Bootprint; -use Zend\ServiceManager\ServiceManager; - -/** - * Factory for Bootprint view helpers. - * - * @category VuFind2 - * @package View_Helpers - * @author Demian Katz - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License - * @link http://vufind.org/wiki/vufind2:developer_manual Wiki - * - * @codeCoverageIgnore - */ -class Factory -{ - /** - * Construct the LayoutClass helper. - * - * @param ServiceManager $sm Service manager. - * - * @return LayoutClass - */ - public static function getLayoutClass(ServiceManager $sm) - { - $config = $sm->getServiceLocator()->get('VuFind\Config')->get('config'); - $left = !isset($config->Site->sidebarOnLeft) - ? false : $config->Site->sidebarOnLeft; - return new LayoutClass($left); - } -} \ No newline at end of file diff --git a/module/VuFind/src/VuFind/View/Helper/Bootprint/LayoutClass.php b/module/VuFind/src/VuFind/View/Helper/Bootprint/LayoutClass.php deleted file mode 100644 index 87d93f2db7d..00000000000 --- a/module/VuFind/src/VuFind/View/Helper/Bootprint/LayoutClass.php +++ /dev/null @@ -1,62 +0,0 @@ - - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License - * @link http://vufind.org/wiki/vufind2:developer_manual Wiki - */ -namespace VuFind\View\Helper\Bootprint; - -/** - * Helper class for managing bootprint theme's high-level (body vs. sidebar) page - * layout. - * - * @category VuFind2 - * @package View_Helpers - * @author Demian Katz - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License - * @link http://vufind.org/wiki/vufind2:developer_manual Wiki - */ -class LayoutClass extends \VuFind\View\Helper\AbstractLayoutClass -{ - /** - * Helper to allow easily configurable page layout -- given a broad class - * name, return appropriate CSS classes to lay out the page according to - * the current configuration file settings. - * - * @param string $class Type of class to return ('mainbody' or 'sidebar') - * - * @return string CSS classes to apply - */ - public function __invoke($class) - { - switch ($class) { - case 'mainbody': - return $this->left ? 'span9 pull-right' : 'span9 switch-margins'; - case 'sidebar': - return $this->left - ? 'span3 switch-margins noprint sidebar' : 'span3 noprint sidebar'; - } - } -} diff --git a/module/VuFind/src/VuFind/View/Helper/Bootstrap3/Factory.php b/module/VuFind/src/VuFind/View/Helper/Bootstrap3/Factory.php index 19ef6ebd4aa..8a57856eae0 100644 --- a/module/VuFind/src/VuFind/View/Helper/Bootstrap3/Factory.php +++ b/module/VuFind/src/VuFind/View/Helper/Bootstrap3/Factory.php @@ -67,8 +67,17 @@ public static function getLayoutClass(ServiceManager $sm) $config = $sm->getServiceLocator()->get('VuFind\Config')->get('config'); $left = !isset($config->Site->sidebarOnLeft) ? false : $config->Site->sidebarOnLeft; + $mirror = !isset($config->Site->mirrorSidebarInRTL) + ? true : $config->Site->mirrorSidebarInRTL; $offcanvas = !isset($config->Site->offcanvas) ? false : $config->Site->offcanvas; + // The right-to-left setting is injected into the layout by the Bootstrapper; + // pull it back out here to avoid duplicate effort, then use it to apply + // the mirror setting appropriately. + $layout = $sm->getServiceLocator()->get('viewmanager')->getViewModel(); + if ($layout->rtl && !$mirror) { + $left = !$left; + } return new LayoutClass($left, $offcanvas); } } \ No newline at end of file diff --git a/module/VuFind/src/VuFind/View/Helper/Bootstrap3/LayoutClass.php b/module/VuFind/src/VuFind/View/Helper/Bootstrap3/LayoutClass.php index 2d419a19bd4..518d4bcffa5 100644 --- a/module/VuFind/src/VuFind/View/Helper/Bootstrap3/LayoutClass.php +++ b/module/VuFind/src/VuFind/View/Helper/Bootstrap3/LayoutClass.php @@ -65,8 +65,8 @@ public function __invoke($class) return ""; } return $this->left - ? 'offcanvas offcanvas-left' - : 'offcanvas offcanvas-right'; + ? 'offcanvas offcanvas-left flip' + : 'offcanvas offcanvas-right flip'; } } } diff --git a/module/VuFind/src/VuFind/View/Helper/Root/Auth.php b/module/VuFind/src/VuFind/View/Helper/Root/Auth.php index 6b10626a641..bc83197b426 100644 --- a/module/VuFind/src/VuFind/View/Helper/Root/Auth.php +++ b/module/VuFind/src/VuFind/View/Helper/Root/Auth.php @@ -66,14 +66,16 @@ public function __construct(\VuFind\Auth\Manager $manager) */ protected function renderTemplate($name, $context = []) { + // Get the current auth module's class name + $className = $this->getManager()->getAuthClassForTemplateRendering(); + // Set up the needed context in the view: $contextHelper = $this->getView()->plugin('context'); + $context['topClass'] = $this->getBriefClass($className); $oldContext = $contextHelper($this->getView())->apply($context); - // Get the current auth module's class name, then start a loop - // in case we need to use a parent class' name to find the appropriate - // template. - $className = $this->getManager()->getAuthClassForTemplateRendering(); + // Start a loop in case we need to use a parent class' name to find the + // appropriate template. $topClassName = $className; // for error message $resolver = $this->getView()->resolver(); while (true) { diff --git a/module/VuFind/src/VuFind/View/Helper/Root/Flashmessages.php b/module/VuFind/src/VuFind/View/Helper/Root/Flashmessages.php index 3c37c2f173d..287ab727d71 100644 --- a/module/VuFind/src/VuFind/View/Helper/Root/Flashmessages.php +++ b/module/VuFind/src/VuFind/View/Helper/Root/Flashmessages.php @@ -78,9 +78,8 @@ public function __invoke() $html = ''; $namespaces = ['error', 'info', 'success']; foreach ($namespaces as $ns) { - $this->fm->setNamespace($ns); $messages = array_merge( - $this->fm->getMessages(), $this->fm->getCurrentMessages() + $this->fm->getMessages($ns), $this->fm->getCurrentMessages($ns) ); foreach (array_unique($messages, SORT_REGULAR) as $msg) { $html .= '
'; @@ -108,8 +107,8 @@ public function __invoke() } $html .= '
'; } - $this->fm->clearMessages(); - $this->fm->clearCurrentMessages(); + $this->fm->clearMessages($ns); + $this->fm->clearCurrentMessages($ns); } return $html; } diff --git a/module/VuFind/src/VuFind/View/Helper/Root/OpenUrl.php b/module/VuFind/src/VuFind/View/Helper/Root/OpenUrl.php index 9031cf92448..1bcb8d91fe2 100644 --- a/module/VuFind/src/VuFind/View/Helper/Root/OpenUrl.php +++ b/module/VuFind/src/VuFind/View/Helper/Root/OpenUrl.php @@ -104,16 +104,63 @@ public function __invoke($driver, $area) return $this; } + /** + * Support method for renderTemplate() -- process image based parameters. + * + * @param bool $imagebased Indicates if an image based link + * should be displayed or not (null for system default) + * @param array $params OpenUrl parameters set so far + * + * @return void + */ + protected function addImageBasedParams($imagebased, & $params) + { + $params['openUrlImageBasedMode'] = $this->getImageBasedLinkingMode(); + $params['openUrlImageBasedSrc'] = null; + + if (null === $imagebased) { + $imagebased = $this->imageBasedLinkingIsActive(); + } + + if ($imagebased) { + if (!isset($this->config->dynamic_graphic)) { + // if imagebased linking is forced by the template, but it is not + // configured properly, throw an exception + throw new \Exception( + 'Template tries to display OpenURL as image based link, but + Image based linking is not configured! Please set parameter + dynamic_graphic in config file.' + ); + } + + // Check if we have an image-specific OpenURL to use to override + // the default value when linking the image. + $params['openUrlImageBasedOverride'] = $this->recordDriver + ->tryMethod('getImageBasedOpenUrl'); + + // Concatenate image based OpenUrl base and OpenUrl + // to a usable image reference + $base = $this->config->dynamic_graphic; + $imageOpenUrl = $params['openUrlImageBasedOverride'] + ? $params['openUrlImageBasedOverride'] : $params['openUrl']; + $params['openUrlImageBasedSrc'] = $base + . ((false === strpos($base, '?')) ? '?' : '&') + . $imageOpenUrl; + } + + return $params; + } + /** * Public method to render the OpenURL template * + * @param bool $imagebased Indicates if an image based link + * should be displayed or not (null for system default) + * * @return string */ - public function renderTemplate() + public function renderTemplate($imagebased = null) { - // Static counter to ensure that each OpenURL gets a unique ID. - static $counter = 0; - if (null !== $this->config && isset($this->config->url)) { // Trim off any parameters (for legacy compatibility -- default config // used to include extraneous parameters): @@ -123,9 +170,6 @@ public function renderTemplate() } $embed = (isset($this->config->embed) && !empty($this->config->embed)); - if ($embed) { - $counter++; - } $embedAutoLoad = isset($this->config->embed_auto_load) ? $this->config->embed_auto_load : false; @@ -161,9 +205,9 @@ public function renderTemplate() 'openUrlGraphicHeight' => empty($this->config->graphic_height) ? false : $this->config->graphic_height, 'openUrlEmbed' => $embed, - 'openUrlEmbedAutoLoad' => $embedAutoLoad, - 'openUrlId' => $counter + 'openUrlEmbedAutoLoad' => $embedAutoLoad ]; + $this->addImageBasedParams($imagebased, $params); // Render the subtemplate: return $this->context->__invoke($this->getView())->renderInContext( @@ -171,6 +215,32 @@ public function renderTemplate() ); } + /** + * Public method to check ImageBased Linking mode + * + * @return string|bool false if image based linking is not active, + * config image_based_linking_mode otherwise (default = 'both') + */ + public function getImageBasedLinkingMode() + { + if ($this->imageBasedLinkingIsActive() + && isset($this->config->image_based_linking_mode) + ) { + return $this->config->image_based_linking_mode; + } + return $this->imageBasedLinkingIsActive() ? 'both' : false; + } + + /** + * Public method to check if ImageBased Linking is enabled + * + * @return bool + */ + public function imageBasedLinkingIsActive() + { + return isset($this->config->dynamic_graphic); + } + /** * Public method to check whether OpenURLs are active for current record * diff --git a/module/VuFind/src/VuFind/View/Helper/Root/Recaptcha.php b/module/VuFind/src/VuFind/View/Helper/Root/Recaptcha.php index 7d324e90a14..a9ac553126f 100644 --- a/module/VuFind/src/VuFind/View/Helper/Root/Recaptcha.php +++ b/module/VuFind/src/VuFind/View/Helper/Root/Recaptcha.php @@ -26,7 +26,7 @@ * @link http://vufind.org/wiki/vufind2:developer_manual Wiki */ namespace VuFind\View\Helper\Root; -use Zend\View\Helper\AbstractHelper, Zend\Mvc\Controller\Plugin\FlashMessenger; +use Zend\View\Helper\AbstractHelper; /** * Recaptcha view helper diff --git a/module/VuFind/src/VuFind/View/Helper/Root/Record.php b/module/VuFind/src/VuFind/View/Helper/Root/Record.php index 5c7e38fd525..e8b1ec03b34 100644 --- a/module/VuFind/src/VuFind/View/Helper/Root/Record.php +++ b/module/VuFind/src/VuFind/View/Helper/Root/Record.php @@ -313,7 +313,7 @@ public function getPreviewIds() public function getTitleHtml($maxLength = 180) { $highlightedTitle = $this->driver->tryMethod('getHighlightedTitle'); - $title = $this->driver->tryMethod('getTitle'); + $title = trim($this->driver->tryMethod('getTitle')); if (!empty($highlightedTitle)) { $highlight = $this->getView()->plugin('highlight'); $addEllipsis = $this->getView()->plugin('addEllipsis'); @@ -553,13 +553,15 @@ public function getUrlList() * Get all the links associated with this record. Returns an array of * associative arrays each containing 'desc' and 'url' keys. * + * @param bool $openUrlActive Is there an active OpenURL on the page? + * * @return array */ - public function getLinkDetails() + public function getLinkDetails($openUrlActive = false) { // See if there are any links available: $urls = $this->driver->tryMethod('getURLs'); - if (empty($urls)) { + if (empty($urls) || ($openUrlActive && $this->hasOpenUrlReplaceSetting())) { return []; } @@ -606,15 +608,11 @@ public function getLinkDetails() * replace_other_urls. Returns an array of associative arrays each containing * 'desc' and 'url' keys. * - * @return array + * @return bool */ - public function getLinkDetailsForOpenUrl() + protected function hasOpenUrlReplaceSetting() { - if (isset($this->config->OpenURL->replace_other_urls) - && $this->config->OpenURL->replace_other_urls - ) { - return []; - } - return $this->getLinkDetails(); + return isset($this->config->OpenURL->replace_other_urls) + && $this->config->OpenURL->replace_other_urls; } } diff --git a/module/VuFind/src/VuFind/XSLT/Import/VuFindSitemap.php b/module/VuFind/src/VuFind/XSLT/Import/VuFindSitemap.php index 54eaf2303a9..5f7f3b72721 100644 --- a/module/VuFind/src/VuFind/XSLT/Import/VuFindSitemap.php +++ b/module/VuFind/src/VuFind/XSLT/Import/VuFindSitemap.php @@ -63,26 +63,27 @@ protected static function getApertureFields($htmlFile) @unlink($xmlFile); preg_match('/]*>([^<]*)]*>([^<]*)]*>([^<]*)]*>([^<]*)register(); } -define('PHPUNIT_SEARCH_FIXTURES', realpath(__DIR__ . '/../../VuFindSearch/tests/unit-tests/fixtures')); - -// Use output buffering -- some tests involve HTTP headers and will fail if there is output. -ob_start(); \ No newline at end of file +define('PHPUNIT_SEARCH_FIXTURES', realpath(__DIR__ . '/../../VuFindSearch/tests/unit-tests/fixtures')); \ No newline at end of file diff --git a/module/VuFind/tests/fixtures/configs/buildxml-2.5/build.xml b/module/VuFind/tests/fixtures/configs/buildxml-2.5/build.xml new file mode 100644 index 00000000000..5fb120c3602 --- /dev/null +++ b/module/VuFind/tests/fixtures/configs/buildxml-2.5/build.xml @@ -0,0 +1,302 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Unexpected error during continuous integration tasks -- ${exceptionmsg} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/module/VuFind/tests/integration-tests/src/VuFindTest/Mink/CartTest.php b/module/VuFind/tests/integration-tests/src/VuFindTest/Mink/CartTest.php index 814656bfdc0..4752e8c47a9 100644 --- a/module/VuFind/tests/integration-tests/src/VuFindTest/Mink/CartTest.php +++ b/module/VuFind/tests/integration-tests/src/VuFindTest/Mink/CartTest.php @@ -58,17 +58,28 @@ public function testAddToCart() $session->visit($this->getVuFindUrl() . $path); $page = $session->getPage(); - // Click "add" without selecting anything: + // Click "add" without selecting anything. This test is a bit timing- + // sensitive, so introduce a retry loop before completely failing. $updateCart = $page->find('css', '#updateCart'); $this->assertTrue(is_object($updateCart)); - $updateCart->click(); - $content = $page->find('css', '.popover-content'); - $this->assertTrue(is_object($content)); - $this->assertEquals( - 'No items were selected. ' - . 'Please click on a checkbox next to an item and try again.', - $content->getText() - ); + $clickRetry = 0; + while (true) { + $updateCart->click(); + $content = $page->find('css', '.popover-content'); + if (is_object($content)) { + $this->assertEquals( + 'No items were selected. ' + . 'Please click on a checkbox next to an item and try again.', + $content->getText() + ); + break; + } else { + $clickRetry++; + if ($clickRetry > 4) { + $this->fail('Too many retries on check for error message.'); + } + } + } // Now actually select something: $selectAll = $page->find('css', '#addFormCheckboxSelectAll'); diff --git a/module/VuFind/tests/unit-tests/src/VuFindTest/Config/UpgradeTest.php b/module/VuFind/tests/unit-tests/src/VuFindTest/Config/UpgradeTest.php index 3de75198fdf..6c2b4fa2398 100644 --- a/module/VuFind/tests/unit-tests/src/VuFindTest/Config/UpgradeTest.php +++ b/module/VuFind/tests/unit-tests/src/VuFindTest/Config/UpgradeTest.php @@ -74,13 +74,6 @@ protected function checkVersion($version) $upgrader->run(); $results = $upgrader->getNewConfigs(); - // We should always update BulkExport options to latest full set when - // upgrading a default configuration: - $this->assertEquals( - 'MARC:MARCXML:EndNote:EndNoteWeb:RefWorks:BibTeX:RIS', - $results['config.ini']['BulkExport']['options'] - ); - // Prior to 1.4, Advanced should always == HomePage after upgrade: if ((float)$version < 1.4) { $this->assertEquals( @@ -94,7 +87,7 @@ protected function checkVersion($version) $this->assertTrue(isset($results['sms.ini']['Carriers'])); $warnings = $upgrader->getWarnings(); - // Prior to 1.3, we expect exactly one warning about using a non-blueprint + // Prior to 2.4, we expect exactly one warning about using a deprecated // theme: if ((float)$version < 1.3) { $this->assertEquals(1, count($warnings)); @@ -105,6 +98,15 @@ protected function checkVersion($version) . "reimplement your custom theme.", $warnings[0] ); + } else if ((float)$version < 2.4) { + $this->assertEquals(1, count($warnings)); + $this->assertEquals( + "WARNING: This version of VuFind does not support " + . "the blueprint theme. Your config.ini [Site] theme setting " + . "has been reset to the default: bootprint3. You may need to " + . "reimplement your custom theme.", + $warnings[0] + ); } else { $this->assertEquals(0, count($warnings)); } diff --git a/module/VuFind/tests/unit-tests/src/VuFindTest/Config/VersionTest.php b/module/VuFind/tests/unit-tests/src/VuFindTest/Config/VersionTest.php new file mode 100644 index 00000000000..8040fc79012 --- /dev/null +++ b/module/VuFind/tests/unit-tests/src/VuFindTest/Config/VersionTest.php @@ -0,0 +1,80 @@ + + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @link http://vufind.org/wiki/vufind2:unit_tests Wiki + */ +namespace VuFindTest\Config; +use VuFind\Config\Version; + +/** + * Version Reader Test Class + * + * @category VuFind2 + * @package Tests + * @author Demian Katz + * @author Chris Hallberg + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @link http://vufind.org/wiki/vufind2:unit_tests Wiki + */ +class VersionTest extends \VuFindTest\Unit\TestCase +{ + /** + * Test the default directory parameter. + * + * @return void + */ + public function testDefaultDir() + { + // If we don't pass in a directory, we'll get the APPLICATION_PATH + $this->assertEquals( + Version::getBuildVersion(), + Version::getBuildVersion(realpath(APPLICATION_PATH)) + ); + } + + /** + * Test with a bad directory. + * + * @return void + * + * @expectedException Exception + * @expectedExceptionMessage Cannot load /will/never/exist/ever/ever/build.xml. + */ + public function testMissingFile() + { + Version::getBuildVersion('/will/never/exist/ever/ever'); + } + + /** + * Test with a fixture to confirm that the right value is extracted. + * + * @return void + */ + public function testKnownVersion() + { + $fixture = __DIR__ . '/../../../../fixtures/configs/buildxml-2.5'; + $this->assertEquals('2.5', Version::getBuildVersion($fixture)); + } +} diff --git a/module/VuFind/tests/unit-tests/src/VuFindTest/Config/WriterTest.php b/module/VuFind/tests/unit-tests/src/VuFindTest/Config/WriterTest.php index 050a5493264..ed3798c199e 100644 --- a/module/VuFind/tests/unit-tests/src/VuFindTest/Config/WriterTest.php +++ b/module/VuFind/tests/unit-tests/src/VuFindTest/Config/WriterTest.php @@ -212,4 +212,16 @@ public function testInsertEmpty() $ini = parse_ini_string($test->getContent(), true); $this->assertEquals('', $ini['a']['two']); } + + /** + * Test alignment of values. + * + * @return void + */ + public function testTabAlignment() + { + $test = new Writer('fake.ini', ['general' => ['foo' => 'bar', 'foofoofoofoofoofo' => 'baz']]); + $expected = "[general]\nfoo = \"bar\"\nfoofoofoofoofoofo = \"baz\"\n"; + $this->assertEquals($expected, $test->getContent()); + } } \ No newline at end of file diff --git a/module/VuFind/tests/unit-tests/src/VuFindTest/Controller/Plugin/NewItemsTest.php b/module/VuFind/tests/unit-tests/src/VuFindTest/Controller/Plugin/NewItemsTest.php index 9395d29c6d4..3a3c6be689a 100644 --- a/module/VuFind/tests/unit-tests/src/VuFindTest/Controller/Plugin/NewItemsTest.php +++ b/module/VuFind/tests/unit-tests/src/VuFindTest/Controller/Plugin/NewItemsTest.php @@ -67,10 +67,8 @@ public function testGetBibIDsFromCatalog() public function testGetBibIDsFromCatalogWithIDLimit() { $flash = $this->getMock('Zend\Mvc\Controller\Plugin\FlashMessenger'); - $flash->expects($this->once())->method('setNamespace') - ->with($this->equalTo('info'))->will($this->returnValue($flash)); $flash->expects($this->once())->method('addMessage') - ->with($this->equalTo('too_many_new_items')); + ->with($this->equalTo('too_many_new_items'), $this->equalTo('info')); $config = new Config(['result_pages' => 10]); $newItems = new NewItems($config); $bibs = $newItems->getBibIDsFromCatalog( diff --git a/module/VuFind/tests/unit-tests/src/VuFindTest/ExportTest.php b/module/VuFind/tests/unit-tests/src/VuFindTest/ExportTest.php index 7f4d6da4e73..a727f90546e 100644 --- a/module/VuFind/tests/unit-tests/src/VuFindTest/ExportTest.php +++ b/module/VuFind/tests/unit-tests/src/VuFindTest/ExportTest.php @@ -40,11 +40,11 @@ class ExportTest extends \PHPUnit_Framework_TestCase { /** - * Test bulk options. + * Test bulk options using legacy (deprecated) configuration. * * @return void */ - public function testGetBulkOptions() + public function testGetBulkOptionsLegacy() { $config = [ 'BulkExport' => [ @@ -62,6 +62,47 @@ public function testGetBulkOptions() $this->assertEquals(['foo', 'bar'], $export->getBulkOptions()); } + /** + * Test bulk options. + * + * @return void + */ + public function testGetBulkOptions() + { + $config = [ + 'Export' => [ + 'foo' => 'record,bulk', + 'bar' => 'record,bulk', + 'baz' => 0, + 'xyzzy' => 'record', + ], + ]; + $export = $this->getExport($config); + $this->assertEquals(['foo', 'bar'], $export->getBulkOptions()); + } + + /** + * Test active formats. + * + * @return void + */ + public function testGetActiveFormats() + { + $config = [ + 'Export' => [ + 'foo' => 'record,bulk', + 'bar' => 'record,bulk', + 'baz' => 0, + 'xyzzy' => 1, + ], + ]; + $export = $this->getExport($config); + $this->assertEquals(['foo', 'bar'], $export->getActiveFormats('bulk')); + $this->assertEquals( + ['foo', 'bar', 'xyzzy'], $export->getActiveFormats('record') + ); + } + /** * Test "needs redirect" * @@ -173,13 +214,9 @@ public function testGetFormatsForRecord() public function testGetFormatsForRecords() { $mainConfig = [ - 'BulkExport' => [ - 'enabled' => 1, - 'options' => 'anything:marc', - ], 'Export' => [ - 'anything' => 1, - 'marc' => 1, + 'anything' => 'record,bulk', + 'marc' => 'record,bulk', ], ]; $exportConfig = [ diff --git a/module/VuFind/tests/unit-tests/src/VuFindTest/I18n/ExtendedIniNormalizerTest.php b/module/VuFind/tests/unit-tests/src/VuFindTest/I18n/ExtendedIniNormalizerTest.php index 44f11faa9e2..859385668fe 100644 --- a/module/VuFind/tests/unit-tests/src/VuFindTest/I18n/ExtendedIniNormalizerTest.php +++ b/module/VuFind/tests/unit-tests/src/VuFindTest/I18n/ExtendedIniNormalizerTest.php @@ -51,10 +51,25 @@ public function testLanguageFileIntegrity() { $normalizer = new ExtendedIniNormalizer(); $langDir = realpath(__DIR__ . '/../../../../../../../languages'); - $handle = opendir($langDir); + $this->checkDirectory($normalizer, $langDir); + } + + /** + * Test language integrity inside a directory. + * + * @param ExtendedIniNormalizer $normalizer Normalizer to test + * @param string $dir Directory name. + * + * @return void + */ + protected function checkDirectory($normalizer, $dir) + { + $handle = opendir($dir); while ($file = readdir($handle)) { - if (substr($file, -4) == '.ini') { - $full = $langDir . '/' . $file; + $full = $dir . '/' . $file; + if ($file != '.' && $file != '..' && is_dir($full)) { + $this->checkDirectory($normalizer, $full); + } else if (substr($file, -4) == '.ini') { $this->assertEquals( $normalizer->normalizeFileToString($full), file_get_contents($full), diff --git a/module/VuFind/tests/unit-tests/src/VuFindTest/ILS/Driver/DAIATest.php b/module/VuFind/tests/unit-tests/src/VuFindTest/ILS/Driver/DAIATest.php index 509df5fc106..326f97fa7cf 100644 --- a/module/VuFind/tests/unit-tests/src/VuFindTest/ILS/Driver/DAIATest.php +++ b/module/VuFind/tests/unit-tests/src/VuFindTest/ILS/Driver/DAIATest.php @@ -45,6 +45,57 @@ */ class DAIATest extends \VuFindTest\Unit\ILSDriverTestCase { + protected $testResult = [ + 0 => + [ + 'status' => '', + 'availability' => true, + 'duedate' => null, + 'requests_placed' => '', + 'id' => "027586081", + 'item_id' => "http://uri.gbv.de/document/opac-de-000:epn:711134758", + 'ilslink' => "http://opac.example-library.edu/DB=1/PPNSET?PPN=027586081", + 'number' => 1, + 'barcode' => "1", + 'reserve' => "N", + 'callnumber' => "ABC 12", + 'location' => "Abteilung III", + 'locationhref' => false + ], + 1 => + [ + 'status' => 'nur Kopie', + 'availability' => true, + 'duedate' => null, + 'requests_placed' => '', + 'id' => "027586081", + 'item_id' => "http://uri.gbv.de/document/opac-de-000:epn:711134766", + 'ilslink' => "http://opac.example-library.edu/DB=1/PPNSET?PPN=027586081", + 'number' => 2, + 'barcode' => "1", + 'reserve' => "N", + 'callnumber' => "DEF 34", + 'location' => "Abteilung III", + 'locationhref' => false + ], + 2 => + [ + 'status' => '', + 'availability' => false, + 'duedate' => "02-09-2115", + 'requests_placed' => '', + 'id' => "027586081", + 'item_id' => "http://uri.gbv.de/document/opac-de-000:epn:7111347777", + 'ilslink' => "http://opac.example-library.edu/DB=1/PPNSET?PPN=027586081", + 'number' => 3, + 'barcode' => "1", + 'reserve' => "N", + 'callnumber' => "GHI 56", + 'location' => "Abteilung III", + 'locationhref' => false + ], + ]; + /** * Constructor */ @@ -75,52 +126,9 @@ public function testJSONgetStatus() $result = $conn->getStatus('027586081'); // exact result for using the DAIA.php with testfile daia.json - $testResult = [ - 0 => - [ - 'status' => null, - 'availability' => true, - 'duedate' => null, - 'id' => "027586081", - 'item_id' => "http://uri.gbv.de/document/opac-de-000:epn:711134758", - 'ilslink' => "http://opac.example-library.edu/DB=1/PPNSET?PPN=027586081", - 'number' => 1, - 'barcode' => "1", - 'reserve' => "N", - 'callnumber' => "ABC 12", - 'location' => "Abteilung III", - ], - 1 => - [ - 'status' => null, - 'availability' => true, - 'duedate' => null, - 'id' => "027586081", - 'item_id' => "http://uri.gbv.de/document/opac-de-000:epn:711134766", - 'ilslink' => "http://opac.example-library.edu/DB=1/PPNSET?PPN=027586081", - 'number' => 2, - 'barcode' => "1", - 'reserve' => "N", - 'callnumber' => "DEF 34", - 'location' => "Abteilung III", - ], - 2 => - [ - 'status' => "dummy text", - 'availability' => false, - 'duedate' => "2115-02-09", - 'id' => "027586081", - 'item_id' => "http://uri.gbv.de/document/opac-de-000:epn:7111347777", - 'ilslink' => "http://opac.example-library.edu/DB=1/PPNSET?PPN=027586081", - 'number' => 3, - 'barcode' => "1", - 'reserve' => "N", - 'callnumber' => "GHI 56", - 'location' => "Abteilung III", - ], - ]; - $this->assertEquals($result, $testResult); + + $this->assertEquals($result, $this->testResult); } /** @@ -144,104 +152,7 @@ public function testXMLgetStatus() $conn->init(); $result = $conn->getStatus('027586081'); - // exact result for using the DAIA.php with testfile daia.xml - $testResult = [ - 0 => [ - 'callnumber' => "ABC 12", - 'availability' => "1", - 'number' => 1, - 'reserve' => "No", - 'duedate' => "", - 'queue' => "", - 'delay' => "unknown", - 'barcode' => 1, - 'status' => "", - 'id' => "027586081", - 'item_id' => - "http://uri.gbv.de/document/opac-de-000:epn:711134758", - 'recallhref' => - "http://opac.example-library.edu/DB=1/PPNSET?PPN=027586081", - 'location' => "Abteilung III", - 'location.id' => - "http://uri.gbv.de/organization/isil/DE-000", - 'location.href' => "http://www.example-library.edu", - 'label' => "ABC 12", - 'notes' => [], - 'presentation.availability' => "1", - 'presentation_availability' => "1", - 'presentation.delay' => "unknown", - 'loan.availability' => "1", - 'loan_availability' => "1", - 'loan.delay' => "unknown", - 'interloan.availability' => "1", - 'interloan.delay' => "unknown", - 'ilslink' => - "http://opac.example-library.edu/DB=1/PPNSET?PPN=027586081", - ], - 1 => [ - 'callnumber' => "DEF 34", - 'availability' => "1", - 'number' => 2, - 'reserve' => "No", - 'duedate' => "", - 'queue' => "", - 'delay' => "", - 'barcode' => 1, - 'status' => "", - 'id' => "027586081", - 'item_id' => - "http://uri.gbv.de/document/opac-de-000:epn:711134766", - 'recallhref' => - "http://opac.example-library.edu/DB=1/PPNSET?PPN=027586081", - 'location' => "Abteilung III", - 'location.id' => - "http://uri.gbv.de/organization/isil/DE-000", - 'location.href' => "http://www.example-library.edu", - 'label' => "DEF 34", - 'notes' => [], - 'presentation.availability' => "1", - 'presentation_availability' => "1", - 'loan.availability' => "1", - 'loan_availability' => "1", - 'interloan.availability' => "1", - 'ilslink' => - "http://opac.example-library.edu/DB=1/PPNSET?PPN=027586081", - ], - 2 => [ - 'callnumber' => "GHI 56", - 'availability' => "0", - 'number' => 3, - 'reserve' => "No", - 'duedate' => "2115-02-09", - 'queue' => "", - 'delay' => "", - 'barcode' => 1, - 'status' => "", - 'id' => "027586081", - 'item_id' => - "http://uri.gbv.de/document/opac-de-000:epn:7111347777", - 'recallhref' => - "http://opac.example-library.edu/DB=1/PPNSET?PPN=027586081", - 'location' => "Abteilung III", - 'location.id' => - "http://uri.gbv.de/organization/isil/DE-000", - 'location.href' => "http://www.example-library.edu", - 'label' => "GHI 56", - 'notes' => [], - 'presentation.availability' => "0", - 'presentation_availability' => "0", - 'presentation.duedate' => "2115-02-09", - 'loan.availability' => "0", - 'loan_availability' => "0", - 'loan.duedate' => "2115-02-09", - 'interloan.availability' => "0", - 'interloan.duedate' => "2115-02-09", - 'ilslink' => - "http://opac.example-library.edu/DB=1/PPNSET?PPN=027586081", - ], - ]; - - $this->assertEquals($result, $testResult); + $this->assertEquals($result, $this->testResult); } /** @@ -272,7 +183,7 @@ protected function createConnector($fixture = null) } $service = new \VuFindHttp\HttpService(); $service->setDefaultAdapter($adapter); - $conn = new DAIA(); + $conn = new DAIA(new \VuFind\Date\Converter()); $conn->setHttpService($service); return $conn; } diff --git a/module/VuFind/tests/unit-tests/src/VuFindTest/ILS/Driver/MultiBackendTest.php b/module/VuFind/tests/unit-tests/src/VuFindTest/ILS/Driver/MultiBackendTest.php index 08700dbd610..8fec96624ff 100644 --- a/module/VuFind/tests/unit-tests/src/VuFindTest/ILS/Driver/MultiBackendTest.php +++ b/module/VuFind/tests/unit-tests/src/VuFindTest/ILS/Driver/MultiBackendTest.php @@ -777,48 +777,160 @@ public function testDefaultDriver() * @return void */ public function testGetNewItems() + { + $driver = $this->getDriver(); + $drivers = ['d1' => 'Voyager']; + $this->setProperty($driver, 'drivers', $drivers); + + $return = [ + 'count' => 2, + 'results' => ['id' => '1', 'id' => '2'] + ]; + + $ILS = $this->getMockILS('Voyager', ['getNewItems', 'init']); + $ILS->expects($this->once()) + ->method('getNewItems') + ->with($this->equalTo('1'), $this->equalTo('10'), $this->equalTo('5'), $this->equalTo('0')) + ->will($this->returnValue($return)); + + $sm = $this->getMockSM($this->any(), 'Voyager', $ILS); + $driver->setServiceLocator($sm); + + // getNewItems only works with a default driver, so the first calls fails + $result = $driver->getNewItems(1, 10, 5, 0); + $this->assertEquals([], $result); + + $expected = [ + 'count' => 2, + 'results' => ['id' => 'd1.1', 'id' => 'd1.2'] + ]; + $this->setProperty($driver, 'defaultDriver', 'd1'); + $result = $driver->getNewItems(1, 10, 5, 0); + $this->assertEquals($expected, $result); + } + + /** + * Testing method for getCourses + * + * @return void + */ + public function testGetCourses() { $expected = ['test' => 'true']; $driver = $this->initSimpleMethodTest( $this->once(), $this->never(), - 'getNewItems', - [1, 10, 5, 0], + 'getCourses', + [], $expected, $expected ); - // getNewItems only works with a default driver, so the first calls fails - $result = $driver->getNewItems(1, 10, 5, 0); + // getCourses only works with a default driver, so the first calls fails + $result = $driver->getCourses(); $this->assertEquals([], $result); $this->setProperty($driver, 'defaultDriver', 'd1'); - $result = $driver->getNewItems(1, 10, 5, 0); + $result = $driver->getCourses(); $this->assertEquals($expected, $result); } /** - * Testing method for findReserves + * Testing method for getDepartments * * @return void */ - public function testFindReserves() + public function testGetDepartments() { $expected = ['test' => 'true']; $driver = $this->initSimpleMethodTest( $this->once(), $this->never(), - 'findReserves', - ['course', 'inst', 'dept'], + 'getDepartments', + [], $expected, $expected ); + // getCourses only works with a default driver, so the first calls fails + $result = $driver->getDepartments(); + $this->assertEquals([], $result); + + $this->setProperty($driver, 'defaultDriver', 'd1'); + $result = $driver->getDepartments(); + $this->assertEquals($expected, $result); + } + + /** + * Testing method for getInstructors + * + * @return void + */ + public function testGetInstructors() + { + $expected = ['test' => 'true']; + $driver = $this->initSimpleMethodTest( + $this->once(), + $this->never(), + 'getInstructors', + [], + $expected, + $expected + ); + + // getCourses only works with a default driver, so the first calls fails + $result = $driver->getInstructors(); + $this->assertEquals([], $result); + + $this->setProperty($driver, 'defaultDriver', 'd1'); + $result = $driver->getInstructors(); + $this->assertEquals($expected, $result); + } + + /** + * Testing method for findReserves + * + * @return void + */ + public function testFindReserves() + { + $driver = $this->getDriver(); + $drivers = ['d1' => 'Voyager']; + $this->setProperty($driver, 'drivers', $drivers); + $id = '123456'; + + $reservesReturn = [ + [ + 'BIB_ID' => '12345', + 'COURSE_ID' => 1, + 'DEPARTMENT_ID' => 2, + 'INSTRUCTOR_ID' => 3, + ], + [ + 'BIB_ID' => '56789', + 'COURSE_ID' => 4, + 'DEPARTMENT_ID' => 5, + 'INSTRUCTOR_ID' => 6, + ] + ]; + + $ILS = $this->getMockILS('Voyager', ['findReserves', 'init']); + $ILS->expects($this->once()) + ->method('findReserves') + ->with($this->equalTo('course'), $this->equalTo('inst'), $this->equalTo('dept')) + ->will($this->returnValue($reservesReturn)); + + $sm = $this->getMockSM($this->any(), 'Voyager', $ILS); + $driver->setServiceLocator($sm); + // findReserves only works with a default driver, so the first calls fails $result = $driver->findReserves('course', 'inst', 'dept'); $this->assertEquals([], $result); $this->setProperty($driver, 'defaultDriver', 'd1'); + $expected = $reservesReturn; + $expected[0]['BIB_ID'] = 'd1.' . $expected[0]['BIB_ID']; + $expected[1]['BIB_ID'] = 'd1.' . $expected[1]['BIB_ID']; $result = $driver->findReserves('course', 'inst', 'dept'); $this->assertEquals($expected, $result); } diff --git a/module/VuFind/tests/unit-tests/src/VuFindTest/ILS/Driver/PICATest.php b/module/VuFind/tests/unit-tests/src/VuFindTest/ILS/Driver/PICATest.php deleted file mode 100644 index 84eef101cc9..00000000000 --- a/module/VuFind/tests/unit-tests/src/VuFindTest/ILS/Driver/PICATest.php +++ /dev/null @@ -1,49 +0,0 @@ - - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License - * @link http://www.vufind.org Main Page - */ -namespace VuFindTest\ILS\Driver; -use VuFind\ILS\Driver\PICA; - -/** - * ILS driver test - * - * @category VuFind2 - * @package Tests - * @author Demian Katz - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License - * @link http://www.vufind.org Main Page - */ -class PICATest extends \VuFindTest\Unit\ILSDriverTestCase -{ - /** - * Constructor - */ - public function __construct() - { - $this->driver = new PICA(); - } -} \ No newline at end of file diff --git a/module/VuFind/tests/unit-tests/src/VuFindTest/Net/IpAddressUtilsTest.php b/module/VuFind/tests/unit-tests/src/VuFindTest/Net/IpAddressUtilsTest.php new file mode 100644 index 00000000000..c16bf2faead --- /dev/null +++ b/module/VuFind/tests/unit-tests/src/VuFindTest/Net/IpAddressUtilsTest.php @@ -0,0 +1,116 @@ + + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @link http://vufind.org/wiki/vufind2:unit_tests Wiki + */ +namespace VuFindTest\Net; +use VuFind\Net\IpAddressUtils; + +/** + * IpAddressUtils Test Class + * + * @category VuFind2 + * @package Tests + * @author Ere Maijala + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @link http://vufind.org/wiki/vufind2:unit_tests Wiki + */ +class IpAddressUtilsTest extends \VuFindTest\Unit\TestCase +{ + /** + * Test normalizeIp() + * + * @return void + */ + public function testNormalizeIp() + { + $utils = new IpAddressUtils(); + $this->assertEquals( + hex2bin('00000000000000000000000000000001'), + $utils->normalizeIp('::1') + ); + $this->assertEquals( + hex2bin('0000000000000000000000007f000001'), + $utils->normalizeIp('127.0.0.1') + ); + // Example from http://www.gestioip.net/docu/ipv6_address_examples.html + $this->assertEquals( + hex2bin('20010db80a0b12f00000000000000001'), + $utils->normalizeIp('2001:db8:a0b:12f0::1') + ); + } + + /** + * Test isInRange() + * + * @return void + */ + public function testIsInRange() + { + $utils = new IpAddressUtils(); + $this->assertFalse($utils->isInRange('127.0.0.1', ['127.0.0.0'])); + $this->assertTrue($utils->isInRange('127.0.0.1', ['127.0.0.1'])); + $this->assertTrue($utils->isInRange('127.0.0.1', ['127.0.0'])); + $this->assertFalse($utils->isInRange('127.0.0.1', [])); + $this->assertFalse($utils->isInRange('127.0.0.1', [''])); + $this->assertTrue($utils->isInRange('127.0.0.1', ['127.0.0.0-127.0.0.2'])); + $this->assertTrue( + $utils->isInRange( + '127.0.0.1', + ['192.168.0.1-192.168.0.2', '127.0.0.0-127.0.0.2'] + ) + ); + $this->assertFalse( + $utils->isInRange( + '127.0.0.1', + ['192.168.0.1-192.168.0.2', '127.0.0.2-127.0.0.4'] + ) + ); + $this->assertTrue( + $utils->isInRange( + '2001:db8::ef90:1', + ['2001:db8::ef90:0-2001:db8::ef90:2'] + ) + ); + $this->assertTrue( + $utils->isInRange( + '2001:db8::ef90:1', + ['2001:0db8::ef90:1'] + ) + ); + $this->assertTrue( + $utils->isInRange( + '2001:db8::ef90:1', + ['2001:0db8'] + ) + ); + $this->assertFalse( + $utils->isInRange( + '2001:db8::ef90:1', + ['2001:0db9'] + ) + ); + } +} diff --git a/module/VuFind/tests/unit-tests/src/VuFindTest/View/Helper/Root/TranslateTest.php b/module/VuFind/tests/unit-tests/src/VuFindTest/View/Helper/Root/TranslateTest.php index 0c4347b9f79..a1f5d2f7b87 100644 --- a/module/VuFind/tests/unit-tests/src/VuFindTest/View/Helper/Root/TranslateTest.php +++ b/module/VuFind/tests/unit-tests/src/VuFindTest/View/Helper/Root/TranslateTest.php @@ -27,6 +27,7 @@ */ namespace VuFindTest\View\Helper\Root; use VuFind\View\Helper\Root\Translate; +use VuFind\I18n\TranslatableString; /** * Translate view helper Test Class (and by extension, the TranslatorAwareTrait) @@ -53,6 +54,48 @@ public function testTranslateWithoutTranslator() ); } + /** + * Test invalid translation array + * + * @return void + * + * @expectedException Exception + * @expectedExceptionMessage Unexpected value sent to translator! + */ + public function testTranslateWithEmptyArray() + { + $translate = new Translate(); + $translate->__invoke([]); + } + + /** + * Test invalid translation array + * + * @return void + * + * @expectedException Exception + * @expectedExceptionMessage Unexpected value sent to translator! + */ + public function testTranslateWithOverfilledArray() + { + $translate = new Translate(); + $translate->__invoke([1, 2, 3]); + } + + /** + * Test invalid translation string + * + * @return void + * + * @expectedException Exception + * @expectedExceptionMessage Unexpected value sent to translator! + */ + public function testTranslateWithDoubleTextDomainArray() + { + $translate = new Translate(); + $translate->__invoke('a::b::c'); + } + /** * Test translation with a loaded translator * @@ -61,15 +104,114 @@ public function testTranslateWithoutTranslator() public function testTranslateWithTranslator() { $translate = new Translate(); - $translator = $this->getMock('Zend\I18n\Translator\TranslatorInterface'); - $translator->expects($this->once())->method('translate') - ->with($this->equalTo('foo'))->will($this->returnValue('%%token%%')); - $translate->setTranslator($translator); + $translate->setTranslator( + $this->getMockTranslator(['default' => ['foo' => '%%token%%']]) + ); // Simple case that tests default values and tokens in a single pass: $this->assertEquals('baz', $translate->__invoke( 'foo', ['%%token%%' => 'baz'], 'failure') ); + // Test namespace syntax: + $this->assertEquals('baz', $translate->__invoke( + 'default::foo', ['%%token%%' => 'baz'], 'failure') + ); + // Test array syntax: + $this->assertEquals('baz', $translate->__invoke( + ['foo'], ['%%token%%' => 'baz'], 'failure') + ); + $this->assertEquals('baz', $translate->__invoke( + [null, 'foo'], ['%%token%%' => 'baz'], 'failure') + ); + $this->assertEquals('baz', $translate->__invoke( + ['default', 'foo'], ['%%token%%' => 'baz'], 'failure') + ); + } + + /** + * Test translation of a TranslatableString object with a loaded translator + * + * @return void + */ + public function testTranslateTranslatableStringWithTranslator() + { + $translate = new Translate(); + $translate->setTranslator( + $this->getMockTranslator(['default' => ['foo' => '%%token%%']]) + ); + + // Test a TranslatableString with a translation. + $str1 = new TranslatableString('foo', 'bar'); + // Simple case that tests default values and tokens in a single pass: + $this->assertEquals('baz', $translate->__invoke( + $str1, ['%%token%%' => 'baz'], 'failure') + ); + + // Test a TranslatableString with a fallback. + $str2 = new TranslatableString('bar', 'foo'); + // Simple case that tests default values and tokens in a single pass: + $this->assertEquals('baz', $translate->__invoke( + $str2, ['%%token%%' => 'baz'], 'failure') + ); + + // Test a TranslatableString with no fallback. + $str3 = new TranslatableString('xyzzy', 'bar'); + // Simple case that tests default values and tokens in a single pass: + $this->assertEquals('failure', $translate->__invoke( + $str3, ['%%token%%' => 'baz'], 'failure') + ); + } + + /** + * Test translation of a TranslatableString object using text domains with a + * loaded translator + * + * @return void + */ + public function testTranslateTranslatableStringAndTextDomainsWithTranslator() + { + $translate = new Translate(); + $translate->setTranslator( + $this->getMockTranslator( + [ + 'd1' => ['f1' => 'str1'], + 'd2' => ['f2' => 'str2'], + ] + ) + ); + + // Primary string translatable + $str1 = new TranslatableString('d1::f1', 'd2::f2'); + $this->assertEquals('str1', $translate->__invoke($str1)); + // Secondary string translatable + $str2 = new TranslatableString('d1::f2', 'd2::f2'); + $this->assertEquals('str2', $translate->__invoke($str2)); + // No string translatable + $str3 = new TranslatableString('d1::f2', 'd2::f1'); + $this->assertEquals('failure', $translate->__invoke($str3, [], 'failure')); + } + + /** + * Test translation with a loaded translator and a text domain + * + * @return void + */ + public function testTranslateTextDomainWithTranslator() + { + $translate = new Translate(); + $translate->setTranslator( + $this->getMockTranslator(['zap' => ['foo' => '%%token%%']]) + ); + + // This one will work -- TextDomain defined above + $this->assertEquals('baz', $translate->__invoke( + 'zap::foo', ['%%token%%' => 'baz'], 'failure') + ); + + // This one will use incoming string -- TextDomain undefined + $this->assertEquals('failure', $translate->__invoke( + 'undefined::foo', ['%%token%%' => 'baz'], 'failure') + ); } /** @@ -110,4 +252,23 @@ public function testGetTranslator() $translate->setTranslator($translator); $this->assertEquals($translator, $translate->getTranslator()); } + + /** + * Get mock translator. + * + * @param array $translations Key => value translation map. + * + * @return \Zend\I18n\Translator\TranslatorInterface + */ + protected function getMockTranslator($translations) + { + $callback = function ($str, $domain) use ($translations) { + return isset($translations[$domain][$str]) + ? $translations[$domain][$str] : $str; + }; + $translator = $this->getMock('Zend\I18n\Translator\TranslatorInterface'); + $translator->expects($this->any())->method('translate') + ->will($this->returnCallback($callback)); + return $translator; + } } \ No newline at end of file diff --git a/module/VuFindAdmin/src/VuFindAdmin/Controller/ConfigController.php b/module/VuFindAdmin/src/VuFindAdmin/Controller/ConfigController.php index 85332d42590..d72702db6b0 100644 --- a/module/VuFindAdmin/src/VuFindAdmin/Controller/ConfigController.php +++ b/module/VuFindAdmin/src/VuFindAdmin/Controller/ConfigController.php @@ -65,21 +65,19 @@ public function enableautoconfigAction() $writer = new \VuFind\Config\Writer($configFile); $writer->set('System', 'autoConfigure', 1); if ($writer->save()) { - $this->flashMessenger()->setNamespace('success') - ->addMessage('Auto-configuration enabled.'); + $this->flashMessenger() + ->addMessage('Auto-configuration enabled.', 'success'); // Reload config now that it has been edited (otherwise, old setting // will persist in cache): $this->getServiceLocator()->get('VuFind\Config')->reload('config'); } else { - $this->flashMessenger()->setNamespace('error') - ->addMessage( - 'Could not enable auto-configuration; check permissions on ' - . $configFile . '.' - ); + $this->flashMessenger()->addMessage( + 'Could not enable auto-configuration; check permissions on ' + . $configFile . '.', 'error' + ); } return $this->forwardTo('AdminConfig', 'Home'); } -} - +} \ No newline at end of file diff --git a/module/VuFindAdmin/src/VuFindAdmin/Controller/MaintenanceController.php b/module/VuFindAdmin/src/VuFindAdmin/Controller/MaintenanceController.php index 7e8246d1ddc..14e5ff4d9c4 100644 --- a/module/VuFindAdmin/src/VuFindAdmin/Controller/MaintenanceController.php +++ b/module/VuFindAdmin/src/VuFindAdmin/Controller/MaintenanceController.php @@ -66,8 +66,7 @@ public function clearcacheAction() // If cache is unset, we didn't go through the loop above, so no message // needs to be displayed. if (isset($cache)) { - $this->flashMessenger()->setNamespace('success') - ->addMessage('Cache(s) cleared.'); + $this->flashMessenger()->addMessage('Cache(s) cleared.', 'success'); } return $this->forwardTo('AdminMaintenance', 'Home'); } @@ -120,13 +119,12 @@ protected function expire($table, $successString, $failString, $minAge = 2) { $daysOld = intval($this->params()->fromQuery('daysOld', $minAge)); if ($daysOld < $minAge) { - $this->flashMessenger()->setNamespace('error') - ->addMessage( - str_replace( - '%%age%%', $minAge, - 'Expiration age must be at least %%age%% days.' - ) - ); + $this->flashMessenger()->addMessage( + str_replace( + '%%age%%', $minAge, + 'Expiration age must be at least %%age%% days.' + ), 'error' + ); } else { $search = $this->getTable($table); if (!method_exists($search, 'getExpiredQuery')) { @@ -139,7 +137,7 @@ protected function expire($table, $successString, $failString, $minAge = 2) $search->delete($query); $msg = str_replace('%%count%%', $count, $successString); } - $this->flashMessenger()->setNamespace('success')->addMessage($msg); + $this->flashMessenger()->addMessage($msg, 'success'); } return $this->forwardTo('AdminMaintenance', 'Home'); } diff --git a/module/VuFindAdmin/src/VuFindAdmin/Controller/TagsController.php b/module/VuFindAdmin/src/VuFindAdmin/Controller/TagsController.php index edd8fc7b1d5..9509916f567 100644 --- a/module/VuFindAdmin/src/VuFindAdmin/Controller/TagsController.php +++ b/module/VuFindAdmin/src/VuFindAdmin/Controller/TagsController.php @@ -162,8 +162,7 @@ public function deleteAction() : $this->params()->fromPost('idsAll'); if (!is_array($ids) || empty($ids)) { - $this->flashMessenger()->setNamespace('error') - ->addMessage('bulk_noitems_advice'); + $this->flashMessenger()->addMessage('bulk_noitems_advice', 'error'); return $this->redirect()->toUrl($originUrl); } @@ -175,18 +174,16 @@ public function deleteAction() } if (0 == $delete) { - $this->flashMessenger()->setNamespace('error') - ->addMessage('tags_delete_fail'); + $this->flashMessenger()->addMessage('tags_delete_fail', 'error'); return $this->redirect()->toUrl($originUrl); } - $this->flashMessenger()->setNamespace('success') - ->addMessage( - [ - 'msg' => 'tags_deleted', - 'tokens' => ['%count%' => $delete] - ] - ); + $this->flashMessenger()->addMessage( + [ + 'msg' => 'tags_deleted', + 'tokens' => ['%count%' => $delete] + ], 'success' + ); return $this->redirect()->toUrl($originUrl); } diff --git a/module/VuFindConsole/src/VuFindConsole/Controller/ImportController.php b/module/VuFindConsole/src/VuFindConsole/Controller/ImportController.php index 0ef07edb6a1..1b6c89334d4 100644 --- a/module/VuFindConsole/src/VuFindConsole/Controller/ImportController.php +++ b/module/VuFindConsole/src/VuFindConsole/Controller/ImportController.php @@ -138,6 +138,16 @@ protected function performImport($xml, $properties, $index = 'Solr', */ public function webcrawlAction() { + // Parse switches: + $this->consoleOpts->addRules( + ['test-only' => 'Use test mode', 'index-s' => 'Solr index to use'] + ); + $testMode = $this->consoleOpts->getOption('test-only') ? true : false; + $index = $this->consoleOpts->getOption('index'); + if (empty($index)) { + $index = 'SolrWeb'; + } + $configLoader = $this->getServiceLocator()->get('VuFind\Config'); $crawlConfig = $configLoader->get('webcrawl'); @@ -152,14 +162,26 @@ public function webcrawlAction() // Loop through sitemap URLs in the config file. foreach ($crawlConfig->Sitemaps->url as $current) { - $this->harvestSitemap($current, $verbose); + $this->harvestSitemap($current, $verbose, $index, $testMode); } - // Perform the delete of outdated records: - $solr = $this->getServiceLocator()->get('VuFind\Solr\Writer'); - $solr->deleteByQuery('SolrWeb', 'last_indexed:[* TO ' . $startTime . ']'); - $solr->commit('SolrWeb'); - $solr->optimize('SolrWeb'); + // Skip Solr operations if we're in test mode. + if (!$testMode) { + $solr = $this->getServiceLocator()->get('VuFind\Solr\Writer'); + if ($verbose) { + Console::writeLine("Deleting old records (prior to $startTime)..."); + } + // Perform the delete of outdated records: + $solr->deleteByQuery($index, 'last_indexed:[* TO ' . $startTime . ']'); + if ($verbose) { + Console::writeLine('Committing...'); + } + $solr->commit($index); + if ($verbose) { + Console::writeLine('Optimizing...'); + } + $solr->optimize($index); + } } /** @@ -168,13 +190,16 @@ public function webcrawlAction() * Process a sitemap URL, either harvesting its contents directly or recursively * reading in child sitemaps. * - * @param string $url URL of sitemap to read. - * @param bool $verbose Are we in verbose mode? + * @param string $url URL of sitemap to read. + * @param bool $verbose Are we in verbose mode? + * @param string $index Solr index to update + * @param bool $testMode Are we in test mode? * * @return bool True on success, false on error. */ - protected function harvestSitemap($url, $verbose = false) - { + protected function harvestSitemap($url, $verbose = false, $index = 'SolrWeb', + $testMode = false + ) { if ($verbose) { Console::writeLine("Harvesting $url..."); } @@ -189,19 +214,26 @@ protected function harvestSitemap($url, $verbose = false) $results = isset($xml->sitemap) ? $xml->sitemap : []; foreach ($results as $current) { if (isset($current->loc)) { - if (!$this->harvestSitemap((string)$current->loc, $verbose)) { + $success = $this->harvestSitemap( + (string)$current->loc, $verbose, $index, $testMode + ); + if (!$success) { $retVal = false; } } } - - try { - $this->performImport($file, 'sitemap.properties', 'SolrWeb'); - } catch (\Exception $e) { - if ($verbose) { - Console::writeLine(get_class($e) . ': ' . $e->getMessage()); + // Only import the current sitemap if it contains URLs! + if (isset($xml->url)) { + try { + $this->performImport( + $file, 'sitemap.properties', $index, $testMode + ); + } catch (\Exception $e) { + if ($verbose) { + Console::writeLine(get_class($e) . ': ' . $e->getMessage()); + } + $retVal = false; } - $retVal = false; } } unlink($file); diff --git a/module/VuFindConsole/src/VuFindConsole/Controller/LanguageController.php b/module/VuFindConsole/src/VuFindConsole/Controller/LanguageController.php index 1d3d3638651..0471d70095e 100644 --- a/module/VuFindConsole/src/VuFindConsole/Controller/LanguageController.php +++ b/module/VuFindConsole/src/VuFindConsole/Controller/LanguageController.php @@ -56,36 +56,51 @@ public function copystringAction() ); Console::writeLine("\tsource - the source key to read"); Console::writeLine("\ttarget - the target key to write"); + Console::writeLine( + "(source and target may include 'textdomain::' prefix)" + ); return $this->getFailureResponse(); } $reader = new ExtendedIniReader(); $normalizer = new ExtendedIniNormalizer(); - $source = $argv[0]; - $target = $argv[1]; + list($sourceDomain, $sourceKey) = $this->extractTextDomain($argv[0]); + list($targetDomain, $targetKey) = $this->extractTextDomain($argv[1]); - $langDir = realpath(__DIR__ . '/../../../../../languages'); - $handle = opendir($langDir); - if (!$handle) { - Console::writeLine("Could not open directory $langDir"); + if (!($sourceDir = $this->getLangDir($sourceDomain)) + || !($targetDir = $this->getLangDir($targetDomain, true)) + ) { return $this->getFailureResponse(); } - while ($file = readdir($handle)) { - // Only process .ini files, and ignore native.ini special case file: - if (substr($file, -4) == '.ini' && $file !== 'native.ini') { - Console::writeLine("Processing $file..."); - $full = $langDir . '/' . $file; - $strings = $reader->getTextDomain($full, false); - if (!isset($strings[$source])) { - Console::writeLine("Source key not found."); - } else { - $fHandle = fopen($full, "a"); - fputs($fHandle, "\n$target = \"" . $strings[$source] . "\"\n"); - fclose($fHandle); - $normalizer->normalizeFile($full); - } + + // First, collect the source values from the source text domain: + $sources = []; + $sourceCallback = function ($full) use ($sourceKey, $reader, & $sources) { + $strings = $reader->getTextDomain($full, false); + if (!isset($strings[$sourceKey])) { + Console::writeLine("Source key not found."); + } else { + $sources[basename($full)] = $strings[$sourceKey]; } - } + }; + $this->processDirectory($sourceDir, $sourceCallback); + + // Make sure that all target files exist: + $this->createMissingFiles($targetDir->path, array_keys($sources)); + + // Now copy the values to their destination: + $targetCallback = function ($full) use ($targetKey, $normalizer, $sources) { + if (isset($sources[basename($full)])) { + $fHandle = fopen($full, "a"); + fputs( + $fHandle, + "\n$targetKey = \"" . $sources[basename($full)] . "\"\n" + ); + fclose($fHandle); + $normalizer->normalizeFile($full); + } + }; + $this->processDirectory($targetDir, $targetCallback); return $this->getSuccessResponse(); } @@ -101,44 +116,41 @@ public function deleteAction() $argv = $this->consoleOpts->getRemainingArgs(); if (!isset($argv[0])) { Console::writeLine( - "Usage: {$_SERVER['argv'][0]} [source] [target]" + "Usage: {$_SERVER['argv'][0]} [target]" + ); + Console::writeLine( + "\ttarget - the target key to remove " + . "(may include 'textdomain::' prefix)" ); - Console::writeLine("\ttarget - the target key to remove"); return $this->getFailureResponse(); } $normalizer = new ExtendedIniNormalizer(); - $target = $argv[0] . ' = "'; + list($domain, $key) = $this->extractTextDomain($argv[0]); + $target = $key . ' = "'; - $langDir = realpath(__DIR__ . '/../../../../../languages'); - $handle = opendir($langDir); - if (!$handle) { - Console::writeLine("Could not open directory $langDir"); + if (!($dir = $this->getLangDir($domain))) { return $this->getFailureResponse(); } - while ($file = readdir($handle)) { - // Only process .ini files, and ignore native.ini special case file: - if (substr($file, -4) == '.ini' && $file !== 'native.ini') { - Console::writeLine("Processing $file..."); - $full = $langDir . '/' . $file; - $lines = file($full); - $out = ''; - $found = false; - foreach ($lines as $line) { - if (substr($line, 0, strlen($target)) !== $target) { - $out .= $line; - } else { - $found = true; - } - } - if ($found) { - file_put_contents($full, $out); - $normalizer->normalizeFile($full); + $callback = function ($full) use ($target, $normalizer) { + $lines = file($full); + $out = ''; + $found = false; + foreach ($lines as $line) { + if (substr($line, 0, strlen($target)) !== $target) { + $out .= $line; } else { - Console::writeLine("Source key not found."); + $found = true; } } - } + if ($found) { + file_put_contents($full, $out); + $normalizer->normalizeFile($full); + } else { + Console::writeLine("Source key not found."); + } + }; + $this->processDirectory($dir, $callback); return $this->getSuccessResponse(); } @@ -172,4 +184,77 @@ public function normalizeAction() } return $this->getSuccessResponse(); } + + /** + * Extract a text domain and key from a raw language key. + * + * @param string $raw Raw language key + * + * @return array [textdomain, key] + */ + protected function extractTextDomain($raw) + { + $parts = explode('::', $raw, 2); + return count($parts) > 1 ? $parts : ['default', $raw]; + } + + /** + * Open the language directory as an object using dir(). Return false on + * failure. + * + * @param string $domain Text domain to retrieve. + * @param bool $createIfMissing Should we create a missing directory? + * + * @return object|bool + */ + protected function getLangDir($domain = 'default', $createIfMissing = false) + { + $subDir = $domain == 'default' ? '' : ('/' . $domain); + $langDir = __DIR__ . '/../../../../../languages' . $subDir; + if ($createIfMissing && !is_dir($langDir)) { + mkdir($langDir); + } + $dir = dir(realpath($langDir)); + if (!$dir) { + Console::writeLine("Could not open directory $langDir"); + return false; + } + return $dir; + } + + /** + * Create empty files if they do not already exist. + * + * @param string $path Directory path + * @param array $files Filenames to create in directory + * + * @return void + */ + protected function createMissingFiles($path, $files) + { + foreach ($files as $file) { + if (!file_exists($path . '/' . $file)) { + file_put_contents($path . '/' . $file, ''); + } + } + } + + /** + * Process a language directory. + * + * @param object $dir Directory object from dir() to process + * @param Callable $callback Function to run on all .ini files in $dir + * + * @return void + */ + protected function processDirectory($dir, $callback) + { + while ($file = $dir->read()) { + // Only process .ini files, and ignore native.ini special case file: + if (substr($file, -4) == '.ini' && $file !== 'native.ini') { + Console::writeLine("Processing $file..."); + $callback($dir->path . '/' . $file); + } + } + } } diff --git a/module/VuFindDevTools/src/VuFindDevTools/Controller/DevtoolsController.php b/module/VuFindDevTools/src/VuFindDevTools/Controller/DevtoolsController.php index 836e6b6d204..17e4b203c90 100644 --- a/module/VuFindDevTools/src/VuFindDevTools/Controller/DevtoolsController.php +++ b/module/VuFindDevTools/src/VuFindDevTools/Controller/DevtoolsController.php @@ -27,7 +27,8 @@ * @link http://vufind.org/wiki/alphabetical_heading_browse Wiki */ namespace VuFindDevTools\Controller; -use Zend\I18n\Translator\TextDomain; +use VuFind\I18n\Translator\Loader\ExtendedIni; +use VuFindDevTools\LanguageHelper; /** * Development Tools Controller @@ -42,106 +43,42 @@ class DevtoolsController extends \VuFind\Controller\AbstractBase { /** - * Get a list of help files in the specified language. + * Deminify action * - * @param string $language Language to check. - * - * @return array + * @return \Zend\View\Model\ViewModel */ - protected function getHelpFiles($language) + public function deminifyAction() { - $dir = APPLICATION_PATH - . '/themes/root/templates/HelpTranslations/' . $language; - if (!file_exists($dir) || !is_dir($dir)) { - return []; + $min = trim($this->params()->fromPost('min')); + $view = $this->createViewModel(); + if (!empty($min)) { + $view->min = unserialize($min); } - $handle = opendir($dir); - $files = []; - while ($file = readdir($handle)) { - if (substr($file, -6) == '.phtml') { - $files[] = $file; - } + if (isset($view->min) && $view->min) { + $view->results = $view->min->deminify( + $this->getServiceLocator()->get('VuFind\SearchResultsPluginManager') + ); } - closedir($handle); - return $files; - } - - /** - * Get a list of languages supported by VuFind: - * - * @return array - */ - protected function getLanguages() - { - $langs = []; - $dir = opendir(APPLICATION_PATH . '/languages'); - while ($file = readdir($dir)) { - if (substr($file, -4) == '.ini') { - $lang = current(explode('.', $file)); - if ('native' != $lang) { - $langs[] = $lang; - } + if (isset($view->results) && $view->results) { + $params = $view->results->getParams(); + $view->query = $params->getQuery(); + if (is_callable([$params, 'getBackendParameters'])) { + $view->backendParams = $params->getBackendParameters() + ->getArrayCopy(); + } + try { + $backend = $this->getServiceLocator() + ->get('VuFind\Search\BackendManager') + ->get($params->getSearchClassId()); + } catch (\Exception $e) { + $backend = false; + } + if ($backend && is_callable([$backend, 'getQueryBuilder'])) { + $builder = $backend->getQueryBuilder(); + $view->queryParams = $builder->build($view->query)->getArrayCopy(); } } - closedir($dir); - return $langs; - } - - /** - * Find strings that are absent from a language file. - * - * @param TextDomain $lang1 Left side of comparison - * @param TextDomain $lang2 Right side of comparison - * - * @return array - */ - protected function findMissingLanguageStrings($lang1, $lang2) - { - // Find strings missing from language 2: - return array_values( - array_diff(array_keys((array)$lang1), array_keys((array)$lang2)) - ); - } - - /** - * Compare two languages and return an array of details about how they differ. - * - * @param TextDomain $lang1 Left side of comparison - * @param TextDomain $lang2 Right side of comparison - * - * @return array - */ - protected function compareLanguages($lang1, $lang2) - { - return [ - 'notInL1' => $this->findMissingLanguageStrings($lang2, $lang1), - 'notInL2' => $this->findMissingLanguageStrings($lang1, $lang2), - 'l1Percent' => number_format(count($lang1) / count($lang2) * 100, 2), - 'l2Percent' => number_format(count($lang2) / count($lang1) * 100, 2), - ]; - } - - /** - * Get English name of language - * - * @param string $lang Language code - * - * @return string - */ - public function getLangName($lang) - { - $config = $this->getConfig(); - if (isset($config->Languages->$lang)) { - return $config->Languages->$lang; - } - switch($lang) { - case 'en-gb': - return 'British English'; - case 'pt-br': - return 'Brazilian Portuguese'; - default: - return $lang; - } + return $view; } /** @@ -152,32 +89,8 @@ public function getLangName($lang) public function languageAction() { // Test languages with no local overrides and no fallback: - $loader = new \VuFind\I18n\Translator\Loader\ExtendedIni( - [APPLICATION_PATH . '/languages'] - ); - $mainLanguage = $this->params()->fromQuery('main', 'en'); - $main = $loader->load($mainLanguage, null); - - $details = []; - $allLangs = $this->getLanguages(); - sort($allLangs); - foreach ($allLangs as $langCode) { - $lang = $loader->load($langCode, null); - if (isset($lang['@parent_ini'])) { - // don't count macros in comparison: - unset($lang['@parent_ini']); - } - $details[$langCode] = $this->compareLanguages($main, $lang); - $details[$langCode]['object'] = $lang; - $details[$langCode]['name'] = $this->getLangName($langCode); - $details[$langCode]['helpFiles'] = $this->getHelpFiles($langCode); - } - - return [ - 'details' => $details, - 'mainCode' => $mainLanguage, - 'mainName' => $this->getLangName($mainLanguage), - 'main' => $main, - ]; + $loader = new ExtendedIni([APPLICATION_PATH . '/languages']); + $helper = new LanguageHelper($loader, $this->getConfig()); + return $helper->getAllDetails($this->params()->fromQuery('main', 'en')); } } \ No newline at end of file diff --git a/module/VuFindDevTools/src/VuFindDevTools/LanguageHelper.php b/module/VuFindDevTools/src/VuFindDevTools/LanguageHelper.php new file mode 100644 index 00000000000..f990e8afefb --- /dev/null +++ b/module/VuFindDevTools/src/VuFindDevTools/LanguageHelper.php @@ -0,0 +1,275 @@ + + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @link http://vufind.org/wiki/alphabetical_heading_browse Wiki + */ +namespace VuFindDevTools; +use VuFind\I18n\Translator\Loader\ExtendedIni; +use Zend\Config\Config; +use Zend\I18n\Translator\TextDomain; + +/** + * Language Helper for Development Tools Controller + * + * @category VuFind2 + * @package DevTools + * @author Demian Katz + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @link http://vufind.org/wiki/alphabetical_heading_browse Wiki + */ +class LanguageHelper +{ + /** + * Language loader + * + * @var ExtendedIni + */ + protected $loader; + + /** + * Configuration + * + * @var Config + */ + protected $config; + + /** + * Constructor + * + * @param ExtendedIni $loader Language loader + * @param Config $config Config + */ + public function __construct(ExtendedIni $loader, Config $config) + { + $this->loader = $loader; + $this->config = $config; + } + + /** + * Get a list of help files in the specified language. + * + * @param string $language Language to check. + * + * @return array + */ + protected function getHelpFiles($language) + { + $dir = APPLICATION_PATH + . '/themes/root/templates/HelpTranslations/' . $language; + if (!file_exists($dir) || !is_dir($dir)) { + return []; + } + $handle = opendir($dir); + $files = []; + while ($file = readdir($handle)) { + if (substr($file, -6) == '.phtml') { + $files[] = $file; + } + } + closedir($handle); + return $files; + } + + /** + * Get a list of languages supported by VuFind: + * + * @return array + */ + protected function getLanguages() + { + $langs = []; + $dir = opendir(APPLICATION_PATH . '/languages'); + while ($file = readdir($dir)) { + if (substr($file, -4) == '.ini') { + $lang = current(explode('.', $file)); + if ('native' != $lang) { + $langs[] = $lang; + } + } + } + closedir($dir); + return $langs; + } + + /** + * Find strings that are absent from a language file. + * + * @param TextDomain $lang1 Left side of comparison + * @param TextDomain $lang2 Right side of comparison + * + * @return array + */ + protected function findMissingLanguageStrings($lang1, $lang2) + { + // Find strings missing from language 2: + return array_values( + array_diff(array_keys((array)$lang1), array_keys((array)$lang2)) + ); + } + + /** + * Compare two languages and return an array of details about how they differ. + * + * @param TextDomain $lang1 Left side of comparison + * @param TextDomain $lang2 Right side of comparison + * + * @return array + */ + public function compareLanguages($lang1, $lang2) + { + return [ + 'notInL1' => $this->findMissingLanguageStrings($lang2, $lang1), + 'notInL2' => $this->findMissingLanguageStrings($lang1, $lang2), + 'l1Percent' => number_format(count($lang1) / count($lang2) * 100, 2), + 'l2Percent' => number_format(count($lang2) / count($lang1) * 100, 2), + ]; + } + + /** + * Get English name of language + * + * @param string $lang Language code + * + * @return string + */ + public function getLangName($lang) + { + if (isset($this->config->Languages->$lang)) { + return $this->config->Languages->$lang; + } + switch($lang) { + case 'en-gb': + return 'British English'; + case 'pt-br': + return 'Brazilian Portuguese'; + default: + return $lang; + } + } + + /** + * Get text domains for a language. + * + * @return array + */ + protected function getTextDomains() + { + static $domains = false; + if (!$domains) { + $base = APPLICATION_PATH . '/languages'; + $dir = opendir($base); + $domains = []; + while ($current = readdir($dir)) { + if ($current != '.' && $current != '..' + && is_dir("$base/$current") + ) { + $domains[] = $current; + } + } + closedir($dir); + } + return $domains; + } + + /** + * Load a language, including text domains. + * + * @param string $lang Language to load + * + * @return array + */ + protected function loadLanguage($lang) + { + $base = $this->loader->load($lang, null); + foreach ($this->getTextDomains() as $domain) { + $current = $this->loader->load($lang, $domain); + foreach ($current as $k => $v) { + if ($k != '@parent_ini') { + $base["$domain::$k"] = $v; + } + } + } + if (isset($base['@parent_ini'])) { + // don't count macros in comparison: + unset($base['@parent_ini']); + } + return $base; + } + + /** + * Return details on how $langCode differs from $main. + * + * @param array $main The main language (full details) + * @param string $langCode The code of a language to compare against $main + * + * @return array + */ + protected function getLanguageDetails($main, $langCode) + { + $lang = $this->loadLanguage($langCode); + $details = $this->compareLanguages($main, $lang); + $details['object'] = $lang; + $details['name'] = $this->getLangName($langCode); + $details['helpFiles'] = $this->getHelpFiles($langCode); + return $details; + } + + /** + * Return details on how all languages differ from $main. + * + * @param array $main The main language (full details) + * + * @return array + */ + protected function getAllLanguageDetails($main) + { + $details = []; + $allLangs = $this->getLanguages(); + sort($allLangs); + foreach ($allLangs as $langCode) { + $details[$langCode] = $this->getLanguageDetails($main, $langCode); + } + return $details; + } + + /** + * Return language comparison information, using $mainLanguage as the + * baseline. + * + * @param string $mainLanguage Language code + * + * @return array + */ + public function getAllDetails($mainLanguage) + { + $main = $this->loadLanguage($mainLanguage); + return [ + 'details' => $this->getAllLanguageDetails($main), + 'mainCode' => $mainLanguage, + 'mainName' => $this->getLangName($mainLanguage), + 'main' => $main, + ]; + } +} \ No newline at end of file diff --git a/module/VuFindDevTools/tests/unit-tests/src/VuFindTest/Controller/DevtoolsControllerTest.php b/module/VuFindDevTools/tests/unit-tests/src/VuFindTest/Controller/DevtoolsControllerTest.php index 57780b5fa9a..a386d7c829b 100644 --- a/module/VuFindDevTools/tests/unit-tests/src/VuFindTest/Controller/DevtoolsControllerTest.php +++ b/module/VuFindDevTools/tests/unit-tests/src/VuFindTest/Controller/DevtoolsControllerTest.php @@ -42,45 +42,6 @@ */ class DevtoolsControllerTest extends \VuFindTest\Unit\TestCase { - /** - * Test language mappings. - * - * @return void - */ - public function testGetLangName() - { - $c = $this->getMockController(); - - // config-driven case: - $this->assertEquals('English', $c->getLangName('en')); - - // special cases: - $this->assertEquals('British English', $c->getLangName('en-gb')); - $this->assertEquals('Brazilian Portuguese', $c->getLangName('pt-br')); - - // unknown case: - $this->assertEquals('??', $c->getLangName('??')); - } - - /** - * Test language comparison. - * - * @return void - */ - public function testComparison() - { - $l1 = ['1' => 'one', '2' => 'two', '3' => 'three']; - $l2 = ['2' => 'two', '4' => 'four']; - $c = new Controller(); - $expected = [ - 'notInL1' => [4], - 'notInL2' => [1, 3], - 'l1Percent' => '150.00', - 'l2Percent' => '66.67' - ]; - $this->assertEquals($expected, $this->callMethod($c, 'compareLanguages', [$l1, $l2])); - } - /** * Test language action. * diff --git a/module/VuFindDevTools/tests/unit-tests/src/VuFindTest/LanguageHelperTest.php b/module/VuFindDevTools/tests/unit-tests/src/VuFindTest/LanguageHelperTest.php new file mode 100644 index 00000000000..c55f19d5ea5 --- /dev/null +++ b/module/VuFindDevTools/tests/unit-tests/src/VuFindTest/LanguageHelperTest.php @@ -0,0 +1,97 @@ + + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @link http://vufind.org + */ +namespace VuFindTest\Controller; + +use VuFindDevTools\LanguageHelper; +use Zend\Config\Config; + +/** + * Unit tests for language helper. + * + * @category VuFind2 + * @package Search + * @author Demian Katz + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @link http://vufind.org + */ +class LanguageHelperTest extends \VuFindTest\Unit\TestCase +{ + /** + * Test language mappings. + * + * @return void + */ + public function testGetLangName() + { + $h = $this->getMockHelper(); + + // config-driven case: + $this->assertEquals('English', $h->getLangName('en')); + + // special cases: + $this->assertEquals('British English', $h->getLangName('en-gb')); + $this->assertEquals('Brazilian Portuguese', $h->getLangName('pt-br')); + + // unknown case: + $this->assertEquals('??', $h->getLangName('??')); + } + + /** + * Test language comparison. + * + * @return void + */ + public function testComparison() + { + $l1 = ['1' => 'one', '2' => 'two', '3' => 'three']; + $l2 = ['2' => 'two', '4' => 'four']; + $h = $this->getMockHelper(); + $expected = [ + 'notInL1' => [4], + 'notInL2' => [1, 3], + 'l1Percent' => '150.00', + 'l2Percent' => '66.67' + ]; + $this->assertEquals($expected, $h->compareLanguages($l1, $l2)); + } + + /** + * Get a mock controller. + * + * @return Controller + */ + protected function getMockHelper() + { + $config = new Config(['Languages' => ['en' => 'English']]); + return new LanguageHelper( + $this->getMock('VuFind\I18n\Translator\Loader\ExtendedIni'), + $config + ); + } +} diff --git a/module/VuFindSearch/src/VuFindSearch/Backend/EDS/Base.php b/module/VuFindSearch/src/VuFindSearch/Backend/EDS/Base.php index bb4372d6efc..b99c37256c3 100644 --- a/module/VuFindSearch/src/VuFindSearch/Backend/EDS/Base.php +++ b/module/VuFindSearch/src/VuFindSearch/Backend/EDS/Base.php @@ -52,7 +52,7 @@ abstract class EdsApi_REST_Base * * @var string */ - protected $edsApiHost = 'http://eds-api.ebscohost.com/edsapi/rest'; + protected $edsApiHost = 'http://eds-api.ebscohost.com/edsapi/rest'; /** * Auth host diff --git a/module/VuFindSearch/src/VuFindSearch/Backend/Pazpar2/Connector.php b/module/VuFindSearch/src/VuFindSearch/Backend/Pazpar2/Connector.php index 4c490c982ae..2f1db51961d 100644 --- a/module/VuFindSearch/src/VuFindSearch/Backend/Pazpar2/Connector.php +++ b/module/VuFindSearch/src/VuFindSearch/Backend/Pazpar2/Connector.php @@ -151,8 +151,10 @@ protected function query($command, ParamBag $data = null) * * @return string Response body * - * @throws RemoteErrorException SOLR signaled a server error (HTTP 5xx) - * @throws RequestErrorException SOLR signaled a client error (HTTP 4xx) + * @throws \VuFindSearch\Backend\Exception\RemoteErrorException Server + * signaled a server error (HTTP 5xx) + * @throws \VuFindSearch\Backend\Exception\RequestErrorException Server + * signaled a client error (HTTP 4xx) */ protected function send(\Zend\Http\Client $client) { diff --git a/module/VuFindSearch/src/VuFindSearch/Backend/Primo/Backend.php b/module/VuFindSearch/src/VuFindSearch/Backend/Primo/Backend.php index dbaef82b146..818b785f880 100644 --- a/module/VuFindSearch/src/VuFindSearch/Backend/Primo/Backend.php +++ b/module/VuFindSearch/src/VuFindSearch/Backend/Primo/Backend.php @@ -225,6 +225,7 @@ protected function paramBagToPrimoQuery(ParamBag $params) // Convert the options: $options = []; + // Most parameters need to be flattened from array format, but a few // should remain as arrays: $arraySettings = [ @@ -234,6 +235,12 @@ protected function paramBagToPrimoQuery(ParamBag $params) $options[$key] = in_array($key, $arraySettings) ? $param : $param[0]; } + // Use special facet pcAvailabilty if it has been set + if (isset($params['filterList']['pcAvailability'])) { + unset($options['filterList']['pcAvailability']); + $options['pcAvailability'] = true; + } + return $options; } } diff --git a/module/VuFindSearch/src/VuFindSearch/Backend/Primo/Connector.php b/module/VuFindSearch/src/VuFindSearch/Backend/Primo/Connector.php index 57501ec8fd2..67db8328a5b 100644 --- a/module/VuFindSearch/src/VuFindSearch/Backend/Primo/Connector.php +++ b/module/VuFindSearch/src/VuFindSearch/Backend/Primo/Connector.php @@ -134,6 +134,7 @@ public function query($institution, $terms, $params = null) "onCampus" => true, "didYouMean" => false, "filterList" => null, + "pcAvailability" => false, "pageNumber" => 1, "limit" => 20, "sort" => null, @@ -286,6 +287,17 @@ protected function performSearch($institution, $terms, $args) } } + // QUERYSTRING: pcAvailability + // by default, PrimoCentral only returns matches, + // which are available via Holdingsfile + // pcAvailability = false + // By setting this value to true, also matches, which + // are NOT available via Holdingsfile are returned + // (yes, right, set this to true - thats ExLibris Logic) + if ($args["pcAvailability"]) { + $qs[] = "pcAvailability=true"; + } + // QUERYSTRING: indx (start record) $recordStart = $args["pageNumber"]; if ($recordStart != 1) { @@ -592,7 +604,7 @@ public function getRecord($recordId, $inst_code = null) // Query String Parameters if (isset($recordId)) { $qs = []; - $qs[] = "query=any,contains,\"$recordId\""; + $qs[] = "query=rid,exact,\"$recordId\""; $qs[] = "institution=$inst_code"; $qs[] = "onCampus=true"; $qs[] = "indx=1"; diff --git a/module/VuFindSearch/src/VuFindSearch/Backend/Solr/Connector.php b/module/VuFindSearch/src/VuFindSearch/Backend/Solr/Connector.php index ac21588a481..19faee1ffe9 100644 --- a/module/VuFindSearch/src/VuFindSearch/Backend/Solr/Connector.php +++ b/module/VuFindSearch/src/VuFindSearch/Backend/Solr/Connector.php @@ -71,9 +71,9 @@ class Connector implements \Zend\Log\LoggerAwareInterface const MAX_GET_URL_LENGTH = 2048; /** - * URL of SOLR core. + * URL or an array of alternative URLs of the SOLR core. * - * @var string + * @var string|array */ protected $url; @@ -117,9 +117,9 @@ class Connector implements \Zend\Log\LoggerAwareInterface /** * Constructor * - * @param string $url SOLR base URL - * @param HandlerMap $map Handler map - * @param string $uniqueKey Solr field used to store unique identifier + * @param string|array $url SOLR core URL or an array of alternative URLs + * @param HandlerMap $map Handler map + * @param string $uniqueKey Solr field used to store unique identifier * * @return void */ @@ -248,29 +248,30 @@ public function write(AbstractDocument $document, $format = 'xml', $handler = 'update', ParamBag $params = null ) { $params = $params ?: new ParamBag(); - $url = "{$this->url}/{$handler}"; + $urlSuffix = "/{$handler}"; if (count($params) > 0) { - $url .= '?' . implode('&', $params->request()); + $urlSuffix .= '?' . implode('&', $params->request()); } - $client = $this->createClient($url, 'POST'); - switch ($format) { - case 'xml': - $client->setEncType('text/xml; charset=UTF-8'); - $body = $document->asXML(); - break; - case 'json': - $client->setEncType('application/json'); - $body = $document->asJSON(); - break; - default: - throw new InvalidArgumentException( - "Unable to serialize to selected format: {$format}" - ); - } - $client->setRawBody($body); - $client->getRequest()->getHeaders() - ->addHeaderLine('Content-Length', strlen($body)); - return $this->send($client); + $callback = function ($client) use ($document, $format) { + switch ($format) { + case 'xml': + $client->setEncType('text/xml; charset=UTF-8'); + $body = $document->asXML(); + break; + case 'json': + $client->setEncType('application/json'); + $body = $document->asJSON(); + break; + default: + throw new InvalidArgumentException( + "Unable to serialize to selected format: {$format}" + ); + } + $client->setRawBody($body); + $client->getRequest()->getHeaders() + ->addHeaderLine('Content-Length', strlen($body)); + }; + return $this->trySolrUrls('POST', $urlSuffix, $callback); } /** @@ -344,33 +345,65 @@ public function setAdapter($adapter) */ public function query($handler, ParamBag $params) { - - $url = $this->url . '/' . $handler; + $urlSuffix = '/' . $handler; $paramString = implode('&', $params->request()); if (strlen($paramString) > self::MAX_GET_URL_LENGTH) { $method = Request::METHOD_POST; + $callback = function ($client) use ($paramString) { + $client->setRawBody($paramString); + $client->setEncType(HttpClient::ENC_URLENCODED); + $client->setHeaders(['Content-Length' => strlen($paramString)]); + }; } else { $method = Request::METHOD_GET; + $urlSuffix .= '?' . $paramString; + $callback = null; } - if ($method === Request::METHOD_POST) { - $client = $this->createClient($url, $method); - $client->setRawBody($paramString); - $client->setEncType(HttpClient::ENC_URLENCODED); - $client->setHeaders(['Content-Length' => strlen($paramString)]); - } else { - $url = $url . '?' . $paramString; - $client = $this->createClient($url, $method); + $this->debug(sprintf('Query %s', $paramString)); + return $this->trySolrUrls($method, $urlSuffix, $callback); + } + + /** + * Try all Solr URLs until we find one that works (or throw an exception). + * + * @param string $method HTTP method to use + * @param string $urlSuffix Suffix to append to all URLs tried + * @param Callable $callback Callback to configure client (null for none) + * + * @return string Response body + * + * @throws RemoteErrorException SOLR signaled a server error (HTTP 5xx) + * @throws RequestErrorException SOLR signaled a client error (HTTP 4xx) + */ + protected function trySolrUrls($method, $urlSuffix, $callback = null) + { + // This exception should never get thrown; it's just a safety in case + // something unanticipated occurs. + $exception = new \Exception('Unexpected exception.'); + + // Loop through all base URLs and try them in turn until one works. + foreach ((array)$this->url as $base) { + $client = $this->createClient($base . $urlSuffix, $method); + if (is_callable($callback)) { + $callback($client); + } + try { + return $this->send($client); + } catch (\Exception $ex) { + $exception = $ex; + } } - $this->debug(sprintf('Query %s', $paramString)); - return $this->send($client); + // If we got this far, everything failed -- throw the most recent + // exception caught above. + throw $exception; } /** * Send request the SOLR and return the response. * - * @param HttpClient $client Prepare HTTP client + * @param HttpClient $client Prepared HTTP client * * @return string Response body * diff --git a/packages/DEBIAN/changelog b/packages/DEBIAN/changelog index a4135b48cf1..3843797b14f 100644 --- a/packages/DEBIAN/changelog +++ b/packages/DEBIAN/changelog @@ -1,3 +1,9 @@ +vufind 2.5 distribution; urgency=low + + * VuFind 2.5 release (see http://vufind.org/wiki/changelog for details) + + -- maintainer VuFind Project Administration Team Mo 28 Sep 2015 09:00:00 UTC + vufind 2.4.1 distribution; urgency=low * VuFind 2.4.1 release (see http://vufind.org/wiki/changelog for details) diff --git a/packages/DEBIAN/control b/packages/DEBIAN/control index 868112ab5a9..a4944eb444d 100644 --- a/packages/DEBIAN/control +++ b/packages/DEBIAN/control @@ -1,5 +1,5 @@ Package: vufind2 -Version: 2.4.1 +Version: 2.5 Section: World Wide Web Priority: Optional Architecture: all diff --git a/solr/lib/browse-handler.jar b/solr/lib/browse-handler.jar index 95bf48857f9..1c9c76399a9 100644 Binary files a/solr/lib/browse-handler.jar and b/solr/lib/browse-handler.jar differ diff --git a/solr/website/conf/schema.xml b/solr/website/conf/schema.xml index 06c30403efc..edc9823a27d 100644 --- a/solr/website/conf/schema.xml +++ b/solr/website/conf/schema.xml @@ -117,6 +117,7 @@ + diff --git a/themes/blueprint/css/.htaccess b/themes/blueprint/css/.htaccess deleted file mode 100644 index f2e01735bf7..00000000000 --- a/themes/blueprint/css/.htaccess +++ /dev/null @@ -1,6 +0,0 @@ - - RewriteEngine Off - - -RemoveType .css -AddType text/css .css \ No newline at end of file diff --git a/themes/blueprint/css/EDS.css b/themes/blueprint/css/EDS.css deleted file mode 100644 index 454ca401bfc..00000000000 --- a/themes/blueprint/css/EDS.css +++ /dev/null @@ -1,78 +0,0 @@ -/* publication type css */ - -.pt-icon { width: 70px; float: left; display: inline-block; background-image: url('../images/EDS/PT_Sprite.png'); background-repeat: no-repeat; } -.pt-serialPeriodical { background-position: -30px -30px; height: 59px; } -.pt-newspaperArticle { background-position: -140px -30px; height: 51px; } -.pt-image { background-position: -245px -30px; height: 47px; } -.pt-videoRecording { background-position: -345px -30px; height: 63px; } -.pt-score { background-position: -445px -30px; height: 57px; } -.pt-audio { background-position: -545px -30px; height: 49px; } -.pt-map { background-position: -35px -120px; height: 45px; } -.pt-book { background-position: -140px -120px; height: 59px; } -.pt-kitObject { background-position: -245px -120px; height: 50px; } -.pt-academicJournal, .pt-unknown { background-position: -345px -120px; height: 57px; } -.pt-dissertation { background-position: -445px -120px; height: 63px; } -.pt-literaryMaterial, .pt-authors { background-position: -35px -215px; height: 55px; } -.pt-tableChart { background-position: -140px -215px; height: 49px; } -.pt-patent { background-position: -245px -215px; height: 56px; } -.pt-report { background-position: -345px -215px; height: 63px; } -.pt-reference, .pt-readersAdvisory { background-position: -445px -215px; height: 52px; } -.pt-governmentDocument { background-position: -545px -215px; height: 60px; } -.pt-editorialOpinion { background-position: -35px -305px; height: 47px; } -.pt-transcript { background-position: -140px -305px; height: 63px; } -.pt-review { background-position: -245px -305px; height: 48px; } -.pt-biography { background-position: -345px -305px; height: 53px; } -.pt-electronicResource { background-position: -445px -305px; height: 63px; } -.pt-recommendedReadsList { background-position: -540px -305px; height: 61px; } -.pt-pictureBookExtender { background-position: -35px -400px; height: 65px; } -.pt-grabAndGo { background-position: -140px -400px; height: 51px; } -.pt-featureArticle { background-position: -245px -400px; height: 65px; } -.pt-curricularConnection { background-position: -345px -400px; height: 65px; } -.pt-bookTalk { background-position: -455px -400px; height: 55px; } -.pt-bookDiscussionGuides { background-position: -545px -400px; height: 55px; } -.pt-awardWinner { background-position: -34px -500px; height: 70px; } -.pt-authorReadalike { background-position: -140px -500px; height: 60px; } -.pt-series { background-position: -245px -495px; height: 75px; } -.pt-ebook { background-position: -350px -510px; height: 60px; } -.pt-audiobook { background-position: -440px -510px; height: 60px; } -.pt-conference { background-position: -545px -505px; height: 70px; } -.pt-Poem { background-position: -35px -615px; height: 60px; } -.pt-ShortStory { background-position: -141px -620px; height: 55px; } -.pt-play{ background-position: -245px -620px; height: 50px; } - -/* full text icons */ -/* Icons */ -.icon { - background: url("../images/EDS/sprites_32.png") no-repeat top left; - height: 32px; - line-height: 32px; - display: inline-block; - padding-left: 36px; -} - -.icon.ebook { - background-position: 0 0; -} - -.icon.html { - background-position: 0 -42px; -} - -.icon.pdf { - background-position: 0 -84px; -} - -.icon13 { - background: url("../images/sprites_32.png") no-repeat top left; - padding-left: 18px; - width: 13px; - height: 13px; -} - -.icon13.collapsed { - background-position: 0 -126px; -} - -.icon13.expanded { - background-position: 0 -149px; -} \ No newline at end of file diff --git a/themes/blueprint/css/blueprint/IMPORTANT-README.txt b/themes/blueprint/css/blueprint/IMPORTANT-README.txt deleted file mode 100644 index 906877b57e2..00000000000 --- a/themes/blueprint/css/blueprint/IMPORTANT-README.txt +++ /dev/null @@ -1,15 +0,0 @@ -The default styles for form input elements are pretty ugly (at least on Mac OSX). -Those styles are commented out in screen.css (see below). If the default blueprint styles -are desired, you can uncomment them.... - -These are the styles that have been commented out in screen.css. -/* -input[type=text], input[type=password], input.text, input.title, textarea {background-color:#fff;border:1px solid #bbb;} -input[type=text]:focus, input[type=password]:focus, input.text:focus, input.title:focus, textarea:focus {border-color:#666;} -select {background-color:#fff;border-width:1px;border-style:solid;} -input[type=text], input[type=password], input.text, input.title, textarea, select {margin:0.5em 0;} -input.text, input.title {width:300px;padding:5px;} -input.title {font-size:1.5em;} -textarea {width:390px;height:250px;padding:5px;} -*/ - diff --git a/themes/blueprint/css/blueprint/ie.css b/themes/blueprint/css/blueprint/ie.css deleted file mode 100644 index 61a53714370..00000000000 --- a/themes/blueprint/css/blueprint/ie.css +++ /dev/null @@ -1,36 +0,0 @@ -/* ----------------------------------------------------------------------- - - - Blueprint CSS Framework 1.0 - http://blueprintcss.org - - * Copyright (c) 2007-Present. See LICENSE for more info. - * See README for instructions on how to use Blueprint. - * For credits and origins, see AUTHORS. - * This is a compressed file. See the sources in the 'src' directory. - ------------------------------------------------------------------------ */ - -/* ie.css */ -body {text-align:center;} -.container {text-align:left;} -* html .column, * html .span-1, * html .span-2, * html .span-3, * html .span-4, * html .span-5, * html .span-6, * html .span-7, * html .span-8, * html .span-9, * html .span-10, * html .span-11, * html .span-12, * html .span-13, * html .span-14, * html .span-15, * html .span-16, * html .span-17, * html .span-18, * html .span-19, * html .span-20, * html .span-21, * html .span-22, * html .span-23, * html .span-24 {display:inline;overflow-x:hidden;} -* html legend {margin:0px -8px 16px 0;padding:0;} -sup {vertical-align:text-top;} -sub {vertical-align:text-bottom;} -html>body p code {*white-space:normal;} -hr {margin:-8px auto 11px;} -img {-ms-interpolation-mode:bicubic;} -.clearfix, .container {display:inline-block;} -* html .clearfix, * html .container {height:1%;} -fieldset {padding-top:0;} -legend {margin-top:-0.2em;margin-bottom:1em;margin-left:-0.5em;} -textarea {overflow:auto;} -label {vertical-align:middle;position:relative;top:-0.25em;} -input.text, input.title, textarea {background-color:#fff;border:1px solid #bbb;} -input.text:focus, input.title:focus {border-color:#666;} -input.text, input.title, textarea, select {margin:0.5em 0;} -input.checkbox, input.radio {position:relative;top:.25em;} -form.inline div, form.inline p {vertical-align:middle;} -form.inline input.checkbox, form.inline input.radio, form.inline input.button, form.inline button {margin:0.5em 0;} -button, input.button {position:relative;top:0.25em;} \ No newline at end of file diff --git a/themes/blueprint/css/blueprint/print.css b/themes/blueprint/css/blueprint/print.css deleted file mode 100644 index fe2e0894467..00000000000 --- a/themes/blueprint/css/blueprint/print.css +++ /dev/null @@ -1,29 +0,0 @@ -/* ----------------------------------------------------------------------- - - - Blueprint CSS Framework 1.0 - http://blueprintcss.org - - * Copyright (c) 2007-Present. See LICENSE for more info. - * See README for instructions on how to use Blueprint. - * For credits and origins, see AUTHORS. - * This is a compressed file. See the sources in the 'src' directory. - ------------------------------------------------------------------------ */ - -/* print.css */ -body {line-height:1.5;font-family:"Helvetica Neue", Arial, Helvetica, sans-serif;color:#000;background:none;font-size:10pt;} -.container {background:none;} -hr {background:#ccc;color:#ccc;width:100%;height:2px;margin:2em 0;padding:0;border:none;} -hr.space {background:#fff;color:#fff;visibility:hidden;} -h1, h2, h3, h4, h5, h6 {font-family:"Helvetica Neue", Arial, "Lucida Grande", sans-serif;} -code {font:.9em "Courier New", Monaco, Courier, monospace;} -a img {border:none;} -p img.top {margin-top:0;} -blockquote {margin:1.5em;padding:1em;font-style:italic;font-size:.9em;} -.small {font-size:.9em;} -.large {font-size:1.1em;} -.quiet {color:#999;} -.hide {display:none;} -a:link, a:visited {background:transparent;font-weight:700;text-decoration:underline;} -a:link:after, a:visited:after {content:" (" attr(href) ")";font-size:90%;} \ No newline at end of file diff --git a/themes/blueprint/css/blueprint/screen.css b/themes/blueprint/css/blueprint/screen.css deleted file mode 100644 index 0efd0b88280..00000000000 --- a/themes/blueprint/css/blueprint/screen.css +++ /dev/null @@ -1,267 +0,0 @@ -/* ----------------------------------------------------------------------- - - - Blueprint CSS Framework 1.0 - http://blueprintcss.org - - * Copyright (c) 2007-Present. See LICENSE for more info. - * See README for instructions on how to use Blueprint. - * For credits and origins, see AUTHORS. - * This is a compressed file. See the sources in the 'src' directory. - ------------------------------------------------------------------------ */ - -/* reset.css */ -html {margin:0;padding:0;border:0;} -body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, code, del, dfn, em, img, q, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, dialog, figure, footer, header, hgroup, nav, section {margin:0;padding:0;border:0;font-weight:inherit;font-style:inherit;font-size:100%;font-family:inherit;vertical-align:baseline;} -article, aside, dialog, figure, footer, header, hgroup, nav, section {display:block;} -body {line-height:1.5;background:white;} -table {border-collapse:separate;border-spacing:0;} -caption, th, td {text-align:left;font-weight:normal;float:none !important;} -table, th, td {vertical-align:middle;} -blockquote:before, blockquote:after, q:before, q:after {content:'';} -blockquote, q {quotes:"" "";} -a img {border:none;} -:focus {outline:0;} - -/* typography.css */ -html {font-size:100.01%;} -body {font-size:75%;color:#222;background:#fff;font-family:"Helvetica Neue", Arial, Helvetica, sans-serif;} -h1, h2, h3, h4, h5, h6 {font-weight:normal;color:#111;} -h1 {font-size:3em;line-height:1;margin-bottom:0.5em;} -h2 {font-size:2em;margin-bottom:0.75em;} -h3 {font-size:1.5em;line-height:1;margin-bottom:1em;} -h4 {font-size:1.2em;line-height:1.25;margin-bottom:1.25em;} -h5 {font-size:1em;font-weight:bold;margin-bottom:1.5em;} -h6 {font-size:1em;font-weight:bold;} -h1 img, h2 img, h3 img, h4 img, h5 img, h6 img {margin:0;} -p {margin:0 0 1.5em;} -.left {float:left !important;} -p .left {margin:1.5em 1.5em 1.5em 0;padding:0;} -.right {float:right !important;} -p .right {margin:1.5em 0 1.5em 1.5em;padding:0;} -a:focus, a:hover {color:#09f;} -a {color:#06c;text-decoration:underline;} -blockquote {margin:1.5em;color:#666;font-style:italic;} -strong, dfn {font-weight:bold;} -em, dfn {font-style:italic;} -sup, sub {line-height:0;} -abbr, acronym {border-bottom:1px dotted #666;} -address {margin:0 0 1.5em;font-style:italic;} -del {color:#666;} -pre {margin:1.5em 0;white-space:pre;} -pre, code, tt {font:1em 'andale mono', 'lucida console', monospace;line-height:1.5;} -li ul, li ol {margin:0;} -ul, ol {margin:0 1.5em 1.5em 0;padding-left:1.5em;} -ul {list-style-type:disc;} -ol {list-style-type:decimal;} -dl {margin:0 0 1.5em 0;} -dl dt {font-weight:bold;} -dd {margin-left:1.5em;} -table {margin-bottom:1.4em;width:100%;} -th {font-weight:bold;} -thead th {background:#c3d9ff;} -th, td, caption {padding:4px 10px 4px 5px;} -tbody tr:nth-child(even) td, tbody tr.even td {background:#e5ecf9;} -tfoot {font-style:italic;} -caption {background:#eee;} -.small {font-size:.8em;margin-bottom:1.875em;line-height:1.875em;} -.large {font-size:1.2em;line-height:2.5em;margin-bottom:1.25em;} -.hide {display:none;} -.quiet {color:#666;} -.loud {color:#000;} -.highlight {background:#ff0;} -.added {background:#060;color:#fff;} -.removed {background:#900;color:#fff;} -.first {margin-left:0;padding-left:0;} -.last {margin-right:0;padding-right:0;} -.top {margin-top:0;padding-top:0;} -.bottom {margin-bottom:0;padding-bottom:0;} - -/* forms.css */ -label {font-weight:bold;} -fieldset {padding:0 1.4em 1.4em 1.4em;margin:0 0 1.5em 0;border:1px solid #ccc;} -legend {font-weight:bold;font-size:1.2em;margin-top:-0.2em;margin-bottom:1em;} -fieldset, #IE8#HACK {padding-top:1.4em;} -legend, #IE8#HACK {margin-top:0;margin-bottom:0;} -/* -input[type=text], input[type=password], input.text, input.title, textarea {background-color:#fff;border:1px solid #bbb;} -input[type=text]:focus, input[type=password]:focus, input.text:focus, input.title:focus, textarea:focus {border-color:#666;} -select {background-color:#fff;border-width:1px;border-style:solid;} -input[type=text], input[type=password], input.text, input.title, textarea, select {margin:0.5em 0;} -input.text, input.title {width:300px;padding:5px;} -input.title {font-size:1.5em;} -textarea {width:390px;height:250px;padding:5px;} -*/ -form.inline {line-height:3;} -form.inline p {margin-bottom:0;} -.error, .alert, .notice, .success, .info {padding:0.8em;margin-bottom:1em;border:2px solid #ddd;} -.error, .alert {background:#fbe3e4;color:#8a1f11;border-color:#fbc2c4;} -.notice {background:#fff6bf;color:#514721;border-color:#ffd324;} -.success {background:#e6efc2;color:#264409;border-color:#c6d880;} -.info {background:#d5edf8;color:#205791;border-color:#92cae4;} -.error a, .alert a {color:#8a1f11;} -.notice a {color:#514721;} -.success a {color:#264409;} -.info a {color:#205791;} - -/* grid.css */ -.container {width:950px;margin:0 auto;} -.showgrid {background:url(src/grid.png);} -.column, .span-1, .span-2, .span-3, .span-4, .span-5, .span-6, .span-7, .span-8, .span-9, .span-10, .span-11, .span-12, .span-13, .span-14, .span-15, .span-16, .span-17, .span-18, .span-19, .span-20, .span-21, .span-22, .span-23, .span-24 {float:left;margin-right:10px;} -.last {margin-right:0;} -.span-1 {width:30px;} -.span-2 {width:70px;} -.span-3 {width:110px;} -.span-4 {width:150px;} -.span-5 {width:190px;} -.span-6 {width:230px;} -.span-7 {width:270px;} -.span-8 {width:310px;} -.span-9 {width:350px;} -.span-10 {width:390px;} -.span-11 {width:430px;} -.span-12 {width:470px;} -.span-13 {width:510px;} -.span-14 {width:550px;} -.span-15 {width:590px;} -.span-16 {width:630px;} -.span-17 {width:670px;} -.span-18 {width:710px;} -.span-19 {width:750px;} -.span-20 {width:790px;} -.span-21 {width:830px;} -.span-22 {width:870px;} -.span-23 {width:910px;} -.span-24 {width:950px;margin-right:0;} -input.span-1, textarea.span-1, input.span-2, textarea.span-2, input.span-3, textarea.span-3, input.span-4, textarea.span-4, input.span-5, textarea.span-5, input.span-6, textarea.span-6, input.span-7, textarea.span-7, input.span-8, textarea.span-8, input.span-9, textarea.span-9, input.span-10, textarea.span-10, input.span-11, textarea.span-11, input.span-12, textarea.span-12, input.span-13, textarea.span-13, input.span-14, textarea.span-14, input.span-15, textarea.span-15, input.span-16, textarea.span-16, input.span-17, textarea.span-17, input.span-18, textarea.span-18, input.span-19, textarea.span-19, input.span-20, textarea.span-20, input.span-21, textarea.span-21, input.span-22, textarea.span-22, input.span-23, textarea.span-23, input.span-24, textarea.span-24 {border-left-width:1px;border-right-width:1px;padding-left:5px;padding-right:5px;} -input.span-1, textarea.span-1 {width:18px;} -input.span-2, textarea.span-2 {width:58px;} -input.span-3, textarea.span-3 {width:98px;} -input.span-4, textarea.span-4 {width:138px;} -input.span-5, textarea.span-5 {width:178px;} -input.span-6, textarea.span-6 {width:218px;} -input.span-7, textarea.span-7 {width:258px;} -input.span-8, textarea.span-8 {width:298px;} -input.span-9, textarea.span-9 {width:338px;} -input.span-10, textarea.span-10 {width:378px;} -input.span-11, textarea.span-11 {width:418px;} -input.span-12, textarea.span-12 {width:458px;} -input.span-13, textarea.span-13 {width:498px;} -input.span-14, textarea.span-14 {width:538px;} -input.span-15, textarea.span-15 {width:578px;} -input.span-16, textarea.span-16 {width:618px;} -input.span-17, textarea.span-17 {width:658px;} -input.span-18, textarea.span-18 {width:698px;} -input.span-19, textarea.span-19 {width:738px;} -input.span-20, textarea.span-20 {width:778px;} -input.span-21, textarea.span-21 {width:818px;} -input.span-22, textarea.span-22 {width:858px;} -input.span-23, textarea.span-23 {width:898px;} -input.span-24, textarea.span-24 {width:938px;} -.append-1 {padding-right:40px;} -.append-2 {padding-right:80px;} -.append-3 {padding-right:120px;} -.append-4 {padding-right:160px;} -.append-5 {padding-right:200px;} -.append-6 {padding-right:240px;} -.append-7 {padding-right:280px;} -.append-8 {padding-right:320px;} -.append-9 {padding-right:360px;} -.append-10 {padding-right:400px;} -.append-11 {padding-right:440px;} -.append-12 {padding-right:480px;} -.append-13 {padding-right:520px;} -.append-14 {padding-right:560px;} -.append-15 {padding-right:600px;} -.append-16 {padding-right:640px;} -.append-17 {padding-right:680px;} -.append-18 {padding-right:720px;} -.append-19 {padding-right:760px;} -.append-20 {padding-right:800px;} -.append-21 {padding-right:840px;} -.append-22 {padding-right:880px;} -.append-23 {padding-right:920px;} -.prepend-1 {padding-left:40px;} -.prepend-2 {padding-left:80px;} -.prepend-3 {padding-left:120px;} -.prepend-4 {padding-left:160px;} -.prepend-5 {padding-left:200px;} -.prepend-6 {padding-left:240px;} -.prepend-7 {padding-left:280px;} -.prepend-8 {padding-left:320px;} -.prepend-9 {padding-left:360px;} -.prepend-10 {padding-left:400px;} -.prepend-11 {padding-left:440px;} -.prepend-12 {padding-left:480px;} -.prepend-13 {padding-left:520px;} -.prepend-14 {padding-left:560px;} -.prepend-15 {padding-left:600px;} -.prepend-16 {padding-left:640px;} -.prepend-17 {padding-left:680px;} -.prepend-18 {padding-left:720px;} -.prepend-19 {padding-left:760px;} -.prepend-20 {padding-left:800px;} -.prepend-21 {padding-left:840px;} -.prepend-22 {padding-left:880px;} -.prepend-23 {padding-left:920px;} -.border {padding-right:4px;margin-right:5px;border-right:1px solid #ddd;} -.colborder {padding-right:24px;margin-right:25px;border-right:1px solid #ddd;} -.pull-1 {margin-left:-40px;} -.pull-2 {margin-left:-80px;} -.pull-3 {margin-left:-120px;} -.pull-4 {margin-left:-160px;} -.pull-5 {margin-left:-200px;} -.pull-6 {margin-left:-240px;} -.pull-7 {margin-left:-280px;} -.pull-8 {margin-left:-320px;} -.pull-9 {margin-left:-360px;} -.pull-10 {margin-left:-400px;} -.pull-11 {margin-left:-440px;} -.pull-12 {margin-left:-480px;} -.pull-13 {margin-left:-520px;} -.pull-14 {margin-left:-560px;} -.pull-15 {margin-left:-600px;} -.pull-16 {margin-left:-640px;} -.pull-17 {margin-left:-680px;} -.pull-18 {margin-left:-720px;} -.pull-19 {margin-left:-760px;} -.pull-20 {margin-left:-800px;} -.pull-21 {margin-left:-840px;} -.pull-22 {margin-left:-880px;} -.pull-23 {margin-left:-920px;} -.pull-24 {margin-left:-960px;} -.pull-1, .pull-2, .pull-3, .pull-4, .pull-5, .pull-6, .pull-7, .pull-8, .pull-9, .pull-10, .pull-11, .pull-12, .pull-13, .pull-14, .pull-15, .pull-16, .pull-17, .pull-18, .pull-19, .pull-20, .pull-21, .pull-22, .pull-23, .pull-24 {float:left;position:relative;} -.push-1 {margin:0 -40px 1.5em 40px;} -.push-2 {margin:0 -80px 1.5em 80px;} -.push-3 {margin:0 -120px 1.5em 120px;} -.push-4 {margin:0 -160px 1.5em 160px;} -.push-5 {margin:0 -200px 1.5em 200px;} -.push-6 {margin:0 -240px 1.5em 240px;} -.push-7 {margin:0 -280px 1.5em 280px;} -.push-8 {margin:0 -320px 1.5em 320px;} -.push-9 {margin:0 -360px 1.5em 360px;} -.push-10 {margin:0 -400px 1.5em 400px;} -.push-11 {margin:0 -440px 1.5em 440px;} -.push-12 {margin:0 -480px 1.5em 480px;} -.push-13 {margin:0 -520px 1.5em 520px;} -.push-14 {margin:0 -560px 1.5em 560px;} -.push-15 {margin:0 -600px 1.5em 600px;} -.push-16 {margin:0 -640px 1.5em 640px;} -.push-17 {margin:0 -680px 1.5em 680px;} -.push-18 {margin:0 -720px 1.5em 720px;} -.push-19 {margin:0 -760px 1.5em 760px;} -.push-20 {margin:0 -800px 1.5em 800px;} -.push-21 {margin:0 -840px 1.5em 840px;} -.push-22 {margin:0 -880px 1.5em 880px;} -.push-23 {margin:0 -920px 1.5em 920px;} -.push-24 {margin:0 -960px 1.5em 960px;} -.push-1, .push-2, .push-3, .push-4, .push-5, .push-6, .push-7, .push-8, .push-9, .push-10, .push-11, .push-12, .push-13, .push-14, .push-15, .push-16, .push-17, .push-18, .push-19, .push-20, .push-21, .push-22, .push-23, .push-24 {float:left;position:relative;} -div.prepend-top, .prepend-top {margin-top:1.5em;} -div.append-bottom, .append-bottom {margin-bottom:1.5em;} -.box {padding:1.5em;margin-bottom:1.5em;background:#e5eCf9;} -hr {background:#ddd;color:#ddd;clear:both;float:none;width:100%;height:1px;margin:0 0 1.45em;border:none;} -hr.space {background:#fff;color:#fff;visibility:hidden;} -.clearfix:after, .container:after {content:"\0020";display:block;height:0;clear:both;visibility:hidden;overflow:hidden;} -.clearfix, .container {display:block;} -.clear {clear:both;} \ No newline at end of file diff --git a/themes/blueprint/css/blueprint/src/forms.css b/themes/blueprint/css/blueprint/src/forms.css deleted file mode 100644 index 4dc4bc2ec36..00000000000 --- a/themes/blueprint/css/blueprint/src/forms.css +++ /dev/null @@ -1,81 +0,0 @@ -/* -------------------------------------------------------------- - - forms.css - * Sets up some default styling for forms - * Gives you classes to enhance your forms - - Usage: - * For text fields, use class .title or .text - * For inline forms, use .inline (even when using columns) - --------------------------------------------------------------- */ - -/* - A special hack is included for IE8 since it does not apply padding - correctly on fieldsets - */ -label { font-weight: bold; } -fieldset { padding:0 1.4em 1.4em 1.4em; margin: 0 0 1.5em 0; border: 1px solid #ccc; } -legend { font-weight: bold; font-size:1.2em; margin-top:-0.2em; margin-bottom:1em; } - -fieldset, #IE8#HACK { padding-top:1.4em; } -legend, #IE8#HACK { margin-top:0; margin-bottom:0; } - -/* Form fields --------------------------------------------------------------- */ - -/* - Attribute selectors are used to differentiate the different types - of input elements, but to support old browsers, you will have to - add classes for each one. ".title" simply creates a large text - field, this is purely for looks. - */ -input[type=text], input[type=password], -input.text, input.title, -textarea { - background-color:#fff; - border:1px solid #bbb; -} -input[type=text]:focus, input[type=password]:focus, -input.text:focus, input.title:focus, -textarea:focus { - border-color:#666; -} -select { background-color:#fff; border-width:1px; border-style:solid; } - -input[type=text], input[type=password], -input.text, input.title, -textarea, select { - margin:0.5em 0; -} - -input.text, -input.title { width: 300px; padding:5px; } -input.title { font-size:1.5em; } -textarea { width: 390px; height: 250px; padding:5px; } - -/* - This is to be used on forms where a variety of elements are - placed side-by-side. Use the p tag to denote a line. - */ -form.inline { line-height:3; } -form.inline p { margin-bottom:0; } - - -/* Success, info, notice and error/alert boxes --------------------------------------------------------------- */ - -.error, -.alert, -.notice, -.success, -.info { padding: 0.8em; margin-bottom: 1em; border: 2px solid #ddd; } - -.error, .alert { background: #fbe3e4; color: #8a1f11; border-color: #fbc2c4; } -.notice { background: #fff6bf; color: #514721; border-color: #ffd324; } -.success { background: #e6efc2; color: #264409; border-color: #c6d880; } -.info { background: #d5edf8; color: #205791; border-color: #92cae4; } -.error a, .alert a { color: #8a1f11; } -.notice a { color: #514721; } -.success a { color: #264409; } -.info a { color: #205791; } diff --git a/themes/blueprint/css/blueprint/src/grid.css b/themes/blueprint/css/blueprint/src/grid.css deleted file mode 100644 index c102c1fbde8..00000000000 --- a/themes/blueprint/css/blueprint/src/grid.css +++ /dev/null @@ -1,280 +0,0 @@ -/* -------------------------------------------------------------- - - grid.css - * Sets up an easy-to-use grid of 24 columns. - - By default, the grid is 950px wide, with 24 columns - spanning 30px, and a 10px margin between columns. - - If you need fewer or more columns, namespaces or semantic - element names, use the compressor script (lib/compress.rb) - --------------------------------------------------------------- */ - -/* A container should group all your columns. */ -.container { - width: 950px; - margin: 0 auto; -} - -/* Use this class on any .span / container to see the grid. */ -.showgrid { - background: url(src/grid.png); -} - - -/* Columns --------------------------------------------------------------- */ - -/* Sets up basic grid floating and margin. */ -.column, .span-1, .span-2, .span-3, .span-4, .span-5, .span-6, .span-7, .span-8, .span-9, .span-10, .span-11, .span-12, .span-13, .span-14, .span-15, .span-16, .span-17, .span-18, .span-19, .span-20, .span-21, .span-22, .span-23, .span-24 { - float: left; - margin-right: 10px; -} - -/* The last column in a row needs this class. */ -.last { margin-right: 0; } - -/* Use these classes to set the width of a column. */ -.span-1 {width: 30px;} - -.span-2 {width: 70px;} -.span-3 {width: 110px;} -.span-4 {width: 150px;} -.span-5 {width: 190px;} -.span-6 {width: 230px;} -.span-7 {width: 270px;} -.span-8 {width: 310px;} -.span-9 {width: 350px;} -.span-10 {width: 390px;} -.span-11 {width: 430px;} -.span-12 {width: 470px;} -.span-13 {width: 510px;} -.span-14 {width: 550px;} -.span-15 {width: 590px;} -.span-16 {width: 630px;} -.span-17 {width: 670px;} -.span-18 {width: 710px;} -.span-19 {width: 750px;} -.span-20 {width: 790px;} -.span-21 {width: 830px;} -.span-22 {width: 870px;} -.span-23 {width: 910px;} -.span-24 {width:950px; margin-right:0;} - -/* Use these classes to set the width of an input. */ -input.span-1, textarea.span-1, input.span-2, textarea.span-2, input.span-3, textarea.span-3, input.span-4, textarea.span-4, input.span-5, textarea.span-5, input.span-6, textarea.span-6, input.span-7, textarea.span-7, input.span-8, textarea.span-8, input.span-9, textarea.span-9, input.span-10, textarea.span-10, input.span-11, textarea.span-11, input.span-12, textarea.span-12, input.span-13, textarea.span-13, input.span-14, textarea.span-14, input.span-15, textarea.span-15, input.span-16, textarea.span-16, input.span-17, textarea.span-17, input.span-18, textarea.span-18, input.span-19, textarea.span-19, input.span-20, textarea.span-20, input.span-21, textarea.span-21, input.span-22, textarea.span-22, input.span-23, textarea.span-23, input.span-24, textarea.span-24 { - border-left-width: 1px; - border-right-width: 1px; - padding-left: 5px; - padding-right: 5px; -} - -input.span-1, textarea.span-1 { width: 18px; } -input.span-2, textarea.span-2 { width: 58px; } -input.span-3, textarea.span-3 { width: 98px; } -input.span-4, textarea.span-4 { width: 138px; } -input.span-5, textarea.span-5 { width: 178px; } -input.span-6, textarea.span-6 { width: 218px; } -input.span-7, textarea.span-7 { width: 258px; } -input.span-8, textarea.span-8 { width: 298px; } -input.span-9, textarea.span-9 { width: 338px; } -input.span-10, textarea.span-10 { width: 378px; } -input.span-11, textarea.span-11 { width: 418px; } -input.span-12, textarea.span-12 { width: 458px; } -input.span-13, textarea.span-13 { width: 498px; } -input.span-14, textarea.span-14 { width: 538px; } -input.span-15, textarea.span-15 { width: 578px; } -input.span-16, textarea.span-16 { width: 618px; } -input.span-17, textarea.span-17 { width: 658px; } -input.span-18, textarea.span-18 { width: 698px; } -input.span-19, textarea.span-19 { width: 738px; } -input.span-20, textarea.span-20 { width: 778px; } -input.span-21, textarea.span-21 { width: 818px; } -input.span-22, textarea.span-22 { width: 858px; } -input.span-23, textarea.span-23 { width: 898px; } -input.span-24, textarea.span-24 { width: 938px; } - -/* Add these to a column to append empty cols. */ - -.append-1 { padding-right: 40px;} -.append-2 { padding-right: 80px;} -.append-3 { padding-right: 120px;} -.append-4 { padding-right: 160px;} -.append-5 { padding-right: 200px;} -.append-6 { padding-right: 240px;} -.append-7 { padding-right: 280px;} -.append-8 { padding-right: 320px;} -.append-9 { padding-right: 360px;} -.append-10 { padding-right: 400px;} -.append-11 { padding-right: 440px;} -.append-12 { padding-right: 480px;} -.append-13 { padding-right: 520px;} -.append-14 { padding-right: 560px;} -.append-15 { padding-right: 600px;} -.append-16 { padding-right: 640px;} -.append-17 { padding-right: 680px;} -.append-18 { padding-right: 720px;} -.append-19 { padding-right: 760px;} -.append-20 { padding-right: 800px;} -.append-21 { padding-right: 840px;} -.append-22 { padding-right: 880px;} -.append-23 { padding-right: 920px;} - -/* Add these to a column to prepend empty cols. */ - -.prepend-1 { padding-left: 40px;} -.prepend-2 { padding-left: 80px;} -.prepend-3 { padding-left: 120px;} -.prepend-4 { padding-left: 160px;} -.prepend-5 { padding-left: 200px;} -.prepend-6 { padding-left: 240px;} -.prepend-7 { padding-left: 280px;} -.prepend-8 { padding-left: 320px;} -.prepend-9 { padding-left: 360px;} -.prepend-10 { padding-left: 400px;} -.prepend-11 { padding-left: 440px;} -.prepend-12 { padding-left: 480px;} -.prepend-13 { padding-left: 520px;} -.prepend-14 { padding-left: 560px;} -.prepend-15 { padding-left: 600px;} -.prepend-16 { padding-left: 640px;} -.prepend-17 { padding-left: 680px;} -.prepend-18 { padding-left: 720px;} -.prepend-19 { padding-left: 760px;} -.prepend-20 { padding-left: 800px;} -.prepend-21 { padding-left: 840px;} -.prepend-22 { padding-left: 880px;} -.prepend-23 { padding-left: 920px;} - - -/* Border on right hand side of a column. */ -.border { - padding-right: 4px; - margin-right: 5px; - border-right: 1px solid #ddd; -} - -/* Border with more whitespace, spans one column. */ -.colborder { - padding-right: 24px; - margin-right: 25px; - border-right: 1px solid #ddd; -} - - -/* Use these classes on an element to push it into the -next column, or to pull it into the previous column. */ - - -.pull-1 { margin-left: -40px; } -.pull-2 { margin-left: -80px; } -.pull-3 { margin-left: -120px; } -.pull-4 { margin-left: -160px; } -.pull-5 { margin-left: -200px; } -.pull-6 { margin-left: -240px; } -.pull-7 { margin-left: -280px; } -.pull-8 { margin-left: -320px; } -.pull-9 { margin-left: -360px; } -.pull-10 { margin-left: -400px; } -.pull-11 { margin-left: -440px; } -.pull-12 { margin-left: -480px; } -.pull-13 { margin-left: -520px; } -.pull-14 { margin-left: -560px; } -.pull-15 { margin-left: -600px; } -.pull-16 { margin-left: -640px; } -.pull-17 { margin-left: -680px; } -.pull-18 { margin-left: -720px; } -.pull-19 { margin-left: -760px; } -.pull-20 { margin-left: -800px; } -.pull-21 { margin-left: -840px; } -.pull-22 { margin-left: -880px; } -.pull-23 { margin-left: -920px; } -.pull-24 { margin-left: -960px; } - -.pull-1, .pull-2, .pull-3, .pull-4, .pull-5, .pull-6, .pull-7, .pull-8, .pull-9, .pull-10, .pull-11, .pull-12, .pull-13, .pull-14, .pull-15, .pull-16, .pull-17, .pull-18, .pull-19, .pull-20, .pull-21, .pull-22, .pull-23, .pull-24 {float: left; position:relative;} - - -.push-1 { margin: 0 -40px 1.5em 40px; } -.push-2 { margin: 0 -80px 1.5em 80px; } -.push-3 { margin: 0 -120px 1.5em 120px; } -.push-4 { margin: 0 -160px 1.5em 160px; } -.push-5 { margin: 0 -200px 1.5em 200px; } -.push-6 { margin: 0 -240px 1.5em 240px; } -.push-7 { margin: 0 -280px 1.5em 280px; } -.push-8 { margin: 0 -320px 1.5em 320px; } -.push-9 { margin: 0 -360px 1.5em 360px; } -.push-10 { margin: 0 -400px 1.5em 400px; } -.push-11 { margin: 0 -440px 1.5em 440px; } -.push-12 { margin: 0 -480px 1.5em 480px; } -.push-13 { margin: 0 -520px 1.5em 520px; } -.push-14 { margin: 0 -560px 1.5em 560px; } -.push-15 { margin: 0 -600px 1.5em 600px; } -.push-16 { margin: 0 -640px 1.5em 640px; } -.push-17 { margin: 0 -680px 1.5em 680px; } -.push-18 { margin: 0 -720px 1.5em 720px; } -.push-19 { margin: 0 -760px 1.5em 760px; } -.push-20 { margin: 0 -800px 1.5em 800px; } -.push-21 { margin: 0 -840px 1.5em 840px; } -.push-22 { margin: 0 -880px 1.5em 880px; } -.push-23 { margin: 0 -920px 1.5em 920px; } -.push-24 { margin: 0 -960px 1.5em 960px; } - -.push-1, .push-2, .push-3, .push-4, .push-5, .push-6, .push-7, .push-8, .push-9, .push-10, .push-11, .push-12, .push-13, .push-14, .push-15, .push-16, .push-17, .push-18, .push-19, .push-20, .push-21, .push-22, .push-23, .push-24 {float: left; position:relative;} - - -/* Misc classes and elements --------------------------------------------------------------- */ - -/* In case you need to add a gutter above/below an element */ -div.prepend-top, .prepend-top { - margin-top:1.5em; -} -div.append-bottom, .append-bottom { - margin-bottom:1.5em; -} - -/* Use a .box to create a padded box inside a column. */ -.box { - padding: 1.5em; - margin-bottom: 1.5em; - background: #e5eCf9; -} - -/* Use this to create a horizontal ruler across a column. */ -hr { - background: #ddd; - color: #ddd; - clear: both; - float: none; - width: 100%; - height: 1px; - margin: 0 0 1.45em; - border: none; -} - -hr.space { - background: #fff; - color: #fff; - visibility: hidden; -} - - -/* Clearing floats without extra markup - Based on How To Clear Floats Without Structural Markup by PiE - [http://www.positioniseverything.net/easyclearing.html] */ - -.clearfix:after, .container:after { - content: "\0020"; - display: block; - height: 0; - clear: both; - visibility: hidden; - overflow:hidden; -} -.clearfix, .container {display: block;} - -/* Regular clearing - apply to column that should drop below previous ones. */ - -.clear { clear:both; } diff --git a/themes/blueprint/css/blueprint/src/grid.png b/themes/blueprint/css/blueprint/src/grid.png deleted file mode 100644 index d42a6c32c17..00000000000 Binary files a/themes/blueprint/css/blueprint/src/grid.png and /dev/null differ diff --git a/themes/blueprint/css/blueprint/src/ie.css b/themes/blueprint/css/blueprint/src/ie.css deleted file mode 100644 index 111a2eaf2e0..00000000000 --- a/themes/blueprint/css/blueprint/src/ie.css +++ /dev/null @@ -1,79 +0,0 @@ -/* -------------------------------------------------------------- - - ie.css - - Contains every hack for Internet Explorer, - so that our core files stay sweet and nimble. - --------------------------------------------------------------- */ - -/* Make sure the layout is centered in IE5 */ -body { text-align: center; } -.container { text-align: left; } - -/* Fixes IE margin bugs */ -* html .column, * html .span-1, * html .span-2, -* html .span-3, * html .span-4, * html .span-5, -* html .span-6, * html .span-7, * html .span-8, -* html .span-9, * html .span-10, * html .span-11, -* html .span-12, * html .span-13, * html .span-14, -* html .span-15, * html .span-16, * html .span-17, -* html .span-18, * html .span-19, * html .span-20, -* html .span-21, * html .span-22, * html .span-23, -* html .span-24 { display:inline; overflow-x: hidden; } - - -/* Elements --------------------------------------------------------------- */ - -/* Fixes incorrect styling of legend in IE6. */ -* html legend { margin:0px -8px 16px 0; padding:0; } - -/* Fixes wrong line-height on sup/sub in IE. */ -sup { vertical-align:text-top; } -sub { vertical-align:text-bottom; } - -/* Fixes IE7 missing wrapping of code elements. */ -html>body p code { *white-space: normal; } - -/* IE 6&7 has problems with setting proper
margins. */ -hr { margin:-8px auto 11px; } - -/* Explicitly set interpolation, allowing dynamically resized images to not look horrible */ -img { -ms-interpolation-mode:bicubic; } - -/* Clearing --------------------------------------------------------------- */ - -/* Makes clearfix actually work in IE */ -.clearfix, .container { display:inline-block; } -* html .clearfix, -* html .container { height:1%; } - - -/* Forms --------------------------------------------------------------- */ - -/* Fixes padding on fieldset */ -fieldset { padding-top:0; } -legend { margin-top:-0.2em; margin-bottom:1em; margin-left:-0.5em; } - -/* Makes classic textareas in IE 6 resemble other browsers */ -textarea { overflow:auto; } - -/* Makes labels behave correctly in IE 6 and 7 */ -label { vertical-align:middle; position:relative; top:-0.25em; } - -/* Fixes rule that IE 6 ignores */ -input.text, input.title, textarea { background-color:#fff; border:1px solid #bbb; } -input.text:focus, input.title:focus { border-color:#666; } -input.text, input.title, textarea, select { margin:0.5em 0; } -input.checkbox, input.radio { position:relative; top:.25em; } - -/* Fixes alignment of inline form elements */ -form.inline div, form.inline p { vertical-align:middle; } -form.inline input.checkbox, form.inline input.radio, -form.inline input.button, form.inline button { - margin:0.5em 0; -} -button, input.button { position:relative;top:0.25em; } diff --git a/themes/blueprint/css/blueprint/src/print.css b/themes/blueprint/css/blueprint/src/print.css deleted file mode 100644 index 5db0e65c5e5..00000000000 --- a/themes/blueprint/css/blueprint/src/print.css +++ /dev/null @@ -1,92 +0,0 @@ -/* -------------------------------------------------------------- - - print.css - * Gives you some sensible styles for printing pages. - * See Readme file in this directory for further instructions. - - Some additions you'll want to make, customized to your markup: - #header, #footer, #navigation { display:none; } - --------------------------------------------------------------- */ - -body { - line-height: 1.5; - font-family: "Helvetica Neue", Arial, Helvetica, sans-serif; - color:#000; - background: none; - font-size: 10pt; -} - - -/* Layout --------------------------------------------------------------- */ - -.container { - background: none; -} - -hr { - background:#ccc; - color:#ccc; - width:100%; - height:2px; - margin:2em 0; - padding:0; - border:none; -} -hr.space { - background: #fff; - color: #fff; - visibility: hidden; -} - - -/* Text --------------------------------------------------------------- */ - -h1,h2,h3,h4,h5,h6 { font-family: "Helvetica Neue", Arial, "Lucida Grande", sans-serif; } -code { font:.9em "Courier New", Monaco, Courier, monospace; } - -a img { border:none; } -p img.top { margin-top: 0; } - -blockquote { - margin:1.5em; - padding:1em; - font-style:italic; - font-size:.9em; -} - -.small { font-size: .9em; } -.large { font-size: 1.1em; } -.quiet { color: #999; } -.hide { display:none; } - - -/* Links --------------------------------------------------------------- */ - -a:link, a:visited { - background: transparent; - font-weight:700; - text-decoration: underline; -} - -/* - This has been the source of many questions in the past. This - snippet of CSS appends the URL of each link within the text. - The idea is that users printing your webpage will want to know - the URLs they go to. If you want to remove this functionality, - comment out this snippet and make sure to re-compress your files. - */ -a:link:after, a:visited:after { - content: " (" attr(href) ")"; - font-size: 90%; -} - -/* If you're having trouble printing relative links, uncomment and customize this: - (note: This is valid CSS3, but it still won't go through the W3C CSS Validator) */ - -/* a[href^="/"]:after { - content: " (http://www.yourdomain.com" attr(href) ") "; -} */ diff --git a/themes/blueprint/css/blueprint/src/reset.css b/themes/blueprint/css/blueprint/src/reset.css deleted file mode 100644 index 1417c4c63c9..00000000000 --- a/themes/blueprint/css/blueprint/src/reset.css +++ /dev/null @@ -1,67 +0,0 @@ -/* -------------------------------------------------------------- - - reset.css - * Resets default browser CSS. - --------------------------------------------------------------- */ - -html { - margin:0; - padding:0; - border:0; -} - -body, div, span, object, iframe, -h1, h2, h3, h4, h5, h6, p, blockquote, pre, -a, abbr, acronym, address, code, -del, dfn, em, img, q, dl, dt, dd, ol, ul, li, -fieldset, form, label, legend, -table, caption, tbody, tfoot, thead, tr, th, td, -article, aside, dialog, figure, footer, header, -hgroup, nav, section { - margin: 0; - padding: 0; - border: 0; - font-weight: inherit; - font-style: inherit; - font-size: 100%; - font-family: inherit; - vertical-align: baseline; -} - -/* This helps to make newer HTML5 elements behave like DIVs in older browers */ -article, aside, dialog, figure, footer, header, -hgroup, nav, section { - display:block; -} - -/* Line-height should always be unitless! */ -body { - line-height: 1.5; - background: white; -} - -/* Tables still need 'cellspacing="0"' in the markup. */ -table { - border-collapse: separate; - border-spacing: 0; -} -/* float:none prevents the span-x classes from breaking table-cell display */ -caption, th, td { - text-align: left; - font-weight: normal; - float:none !important; -} -table, th, td { - vertical-align: middle; -} - -/* Remove possible quote marks (") from ,
. */ -blockquote:before, blockquote:after, q:before, q:after { content: ''; } -blockquote, q { quotes: "" ""; } - -/* Remove annoying border on linked images. */ -a img { border: none; } - -/* Remember to define your own focus styles! */ -:focus { outline: 0; } \ No newline at end of file diff --git a/themes/blueprint/css/blueprint/src/typography.css b/themes/blueprint/css/blueprint/src/typography.css deleted file mode 100644 index 159832045c4..00000000000 --- a/themes/blueprint/css/blueprint/src/typography.css +++ /dev/null @@ -1,123 +0,0 @@ -/* -------------------------------------------------------------- - - typography.css - * Sets up some sensible default typography. - --------------------------------------------------------------- */ - -/* Default font settings. - The font-size percentage is of 16px. (0.75 * 16px = 12px) */ -html { font-size:100.01%; } -body { - font-size: 75%; - color: #222; - background: #fff; - font-family: "Helvetica Neue", Arial, Helvetica, sans-serif; -} - - -/* Headings --------------------------------------------------------------- */ - -h1,h2,h3,h4,h5,h6 { font-weight: normal; color: #111; } - -h1 { font-size: 3em; line-height: 1; margin-bottom: 0.5em; } -h2 { font-size: 2em; margin-bottom: 0.75em; } -h3 { font-size: 1.5em; line-height: 1; margin-bottom: 1em; } -h4 { font-size: 1.2em; line-height: 1.25; margin-bottom: 1.25em; } -h5 { font-size: 1em; font-weight: bold; margin-bottom: 1.5em; } -h6 { font-size: 1em; font-weight: bold; } - -h1 img, h2 img, h3 img, -h4 img, h5 img, h6 img { - margin: 0; -} - - -/* Text elements --------------------------------------------------------------- */ - -p { margin: 0 0 1.5em; } -/* - These can be used to pull an image at the start of a paragraph, so - that the text flows around it (usage:

Text

) - */ -.left { float: left !important; } -p .left { margin: 1.5em 1.5em 1.5em 0; padding: 0; } -.right { float: right !important; } -p .right { margin: 1.5em 0 1.5em 1.5em; padding: 0; } - -a:focus, -a:hover { color: #09f; } -a { color: #06c; text-decoration: underline; } - -blockquote { margin: 1.5em; color: #666; font-style: italic; } -strong,dfn { font-weight: bold; } -em,dfn { font-style: italic; } -sup, sub { line-height: 0; } - -abbr, -acronym { border-bottom: 1px dotted #666; } -address { margin: 0 0 1.5em; font-style: italic; } -del { color:#666; } - -pre { margin: 1.5em 0; white-space: pre; } -pre,code,tt { font: 1em 'andale mono', 'lucida console', monospace; line-height: 1.5; } - - -/* Lists --------------------------------------------------------------- */ - -li ul, -li ol { margin: 0; } -ul, ol { margin: 0 1.5em 1.5em 0; padding-left: 1.5em; } - -ul { list-style-type: disc; } -ol { list-style-type: decimal; } - -dl { margin: 0 0 1.5em 0; } -dl dt { font-weight: bold; } -dd { margin-left: 1.5em;} - - -/* Tables --------------------------------------------------------------- */ - -/* - Because of the need for padding on TH and TD, the vertical rhythm - on table cells has to be 27px, instead of the standard 18px or 36px - of other elements. - */ -table { margin-bottom: 1.4em; width:100%; } -th { font-weight: bold; } -thead th { background: #c3d9ff; } -th,td,caption { padding: 4px 10px 4px 5px; } -/* - You can zebra-stripe your tables in outdated browsers by adding - the class "even" to every other table row. - */ -tbody tr:nth-child(even) td, -tbody tr.even td { - background: #e5ecf9; -} -tfoot { font-style: italic; } -caption { background: #eee; } - - -/* Misc classes --------------------------------------------------------------- */ - -.small { font-size: .8em; margin-bottom: 1.875em; line-height: 1.875em; } -.large { font-size: 1.2em; line-height: 2.5em; margin-bottom: 1.25em; } -.hide { display: none; } - -.quiet { color: #666; } -.loud { color: #000; } -.highlight { background:#ff0; } -.added { background:#060; color: #fff; } -.removed { background:#900; color: #fff; } - -.first { margin-left:0; padding-left:0; } -.last { margin-right:0; padding-right:0; } -.top { margin-top:0; padding-top:0; } -.bottom { margin-bottom:0; padding-bottom:0; } diff --git a/themes/blueprint/css/combined.css b/themes/blueprint/css/combined.css deleted file mode 100644 index 5b5bec034d7..00000000000 --- a/themes/blueprint/css/combined.css +++ /dev/null @@ -1,6 +0,0 @@ -.main {padding:0;} -.main .combined-list {margin:0 2px;} -.main .combined-list .result [class^=span-] {width:100%;} -.main .combined-list .result .last {display:none;} -.main .combined-list .result .summcover {display:block;margin:0 auto;} -.main .combined-list .result .span-15 {margin-left:5px;width:80%} \ No newline at end of file diff --git a/themes/blueprint/css/ie.css b/themes/blueprint/css/ie.css deleted file mode 100644 index 3eb855d7d9a..00000000000 --- a/themes/blueprint/css/ie.css +++ /dev/null @@ -1,6 +0,0 @@ -/** Hacks for IE */ - -/* Left align citations */ -.ui-dialog-content.ui-widget-content { - text-align:left; -} \ No newline at end of file diff --git a/themes/blueprint/css/ie8-tab.css b/themes/blueprint/css/ie8-tab.css deleted file mode 100644 index 73dd277f368..00000000000 --- a/themes/blueprint/css/ie8-tab.css +++ /dev/null @@ -1,15 +0,0 @@ -/* Hacks for IE8 */ - -#feedbackTabText { - width: 86px; - height: 30px; - margin-top: -88px; - margin-left: 0px; - position: relative; - text-indent: 0; - text-align: center; - color: white; - font: bold 15px/30px 'lucida sans', 'trebuchet MS', 'Tahoma'; - z-index: 10; - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; /* Internet Explorer */ -} diff --git a/themes/blueprint/css/inspector.css b/themes/blueprint/css/inspector.css deleted file mode 100644 index 010d9872938..00000000000 --- a/themes/blueprint/css/inspector.css +++ /dev/null @@ -1,139 +0,0 @@ -/* Version 1.3b */ - -.jquery_inspector { - padding:0; - -moz-user-select:none; - -webkit-user-select:none; - user-select:none -} -.jquery_inspector .loading { - display:table; - position:absolute; - top:10px; - left:50%; - width:100px; - margin-left:-50px; - color:#FFF; - font:10pt Tahoma,Verdana,Arial; - text-align:center; -} - -.jquery_inspector .turn_left, -.jquery_inspector .turn_right { - z-index:1; - position:absolute; - top:4px; - width:32px; - height:32px; - cursor:pointer; -} -.jquery_inspector .turn_left { - left:5px; -} -.jquery_inspector .turn_right { - right:5px; -} - -.jquery_inspector .zoom_level { - z-index:1; - font:14px Verdana; - color:#FFF; - text-align:center; - position:absolute; - bottom:10px; - left:50%; - margin:0 0 0 -50px; - padding:3px 2px 3px 3px; - width:80px; - cursor:pointer; - background:rgba(0,0,0,.5); - filter:progid:DXImageTransform.Microsoft.Gradient(GradientType=1, StartColorStr='#88000000', EndColorStr='#88000000'); - border-radius:4px; - -moz-user-select:none; - -webkit-user-select:none; - user-select:none -} -.jquery_inspector .zoom_level span { - display:inline-block; - width:41px -} -.jquery_inspector .zoom_level .plus, -.jquery_inspector .zoom_level .minus { - color:#FFF; - text-decoration:none -} - -/* -- MAP -- */ -.jquery_inspector .doc_map { - position:absolute; - bottom:0; - right:0; - width:150px; - height:150px; - border:1px solid #DDD; - border-width:1px 0 0 1px; - z-index:1; - background:#000; - background:rgba(0,0,0,.7); - filter:progid:DXImageTransform.Microsoft.Gradient(GradientType=1, StartColorStr='#AA000000', EndColorStr='#AA000000'); - box-shadow:0 0 10px #000; -} -.jquery_inspector .doc_map img { - position:absolute; - z-index:1; -} -.jquery_inspector .doc_map .pane { - display:block; - position:absolute; - left:10px; - top:10px; - border:2px solid #E00; - background:url('../images/trans.png'); - overflow:hidden; - width:130px; - height:130px; - cursor:move; - z-index:2; -} - -/* -- ZOOM SET BUBBLES -- */ -.jquery_inspector .zoom-set { - position:absolute; - left:50%; - margin:0 0 0 -58px; - bottom:42px; - width:95px; - background:#FFF; - border:1px solid #000; - border-radius:5px; - -moz-border-radius:5px; - -webkit-border-radius:5px; - padding:4px 5px; - text-align:right; -} -.jquery_inspector .zoom-set input { - font:12px Verdana -} -.jquery_inspector .zoom-set button { - font:11px Verdana; - vertical-align:top -} -.jquery_inspector .zoom-set:before, -.jquery_inspector .zoom-set:after { - content:""; - display:block; - position:absolute; - left:50%; - width:0; - bottom:-8px; - margin-left:-6px; - border-color:#000 transparent; - border-style:solid; - border-width:8px 8px 0 -} -.jquery_inspector .zoom-set:after { - bottom:-7px; - margin-left:-5px; - border-color:#FFF transparent; - border-width:7px 7px 0 -} \ No newline at end of file diff --git a/themes/blueprint/css/jquery-ui/README-build-options.txt b/themes/blueprint/css/jquery-ui/README-build-options.txt deleted file mode 100644 index 98bfa6d8a10..00000000000 --- a/themes/blueprint/css/jquery-ui/README-build-options.txt +++ /dev/null @@ -1,5 +0,0 @@ -UI Core: all -Interactions: Draggable, Droppable -Widgets: Autocomplete, Dialog, Tabs, Slider -Effects: none -Theme: smoothness \ No newline at end of file diff --git a/themes/blueprint/css/jquery-ui/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png b/themes/blueprint/css/jquery-ui/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png deleted file mode 100644 index 5b5dab2ab7b..00000000000 Binary files a/themes/blueprint/css/jquery-ui/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png and /dev/null differ diff --git a/themes/blueprint/css/jquery-ui/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png b/themes/blueprint/css/jquery-ui/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png deleted file mode 100644 index ac8b229af95..00000000000 Binary files a/themes/blueprint/css/jquery-ui/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png and /dev/null differ diff --git a/themes/blueprint/css/jquery-ui/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png b/themes/blueprint/css/jquery-ui/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png deleted file mode 100644 index ad3d6346e00..00000000000 Binary files a/themes/blueprint/css/jquery-ui/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png and /dev/null differ diff --git a/themes/blueprint/css/jquery-ui/css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png b/themes/blueprint/css/jquery-ui/css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png deleted file mode 100644 index 42ccba269b6..00000000000 Binary files a/themes/blueprint/css/jquery-ui/css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png and /dev/null differ diff --git a/themes/blueprint/css/jquery-ui/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png b/themes/blueprint/css/jquery-ui/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png deleted file mode 100644 index 5a46b47cb16..00000000000 Binary files a/themes/blueprint/css/jquery-ui/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png and /dev/null differ diff --git a/themes/blueprint/css/jquery-ui/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png b/themes/blueprint/css/jquery-ui/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png deleted file mode 100644 index 86c2baa655e..00000000000 Binary files a/themes/blueprint/css/jquery-ui/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png and /dev/null differ diff --git a/themes/blueprint/css/jquery-ui/css/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png b/themes/blueprint/css/jquery-ui/css/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png deleted file mode 100644 index 4443fdc1a15..00000000000 Binary files a/themes/blueprint/css/jquery-ui/css/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png and /dev/null differ diff --git a/themes/blueprint/css/jquery-ui/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/themes/blueprint/css/jquery-ui/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png deleted file mode 100644 index 7c9fa6c6edc..00000000000 Binary files a/themes/blueprint/css/jquery-ui/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png and /dev/null differ diff --git a/themes/blueprint/css/jquery-ui/css/smoothness/images/ui-icons_222222_256x240.png b/themes/blueprint/css/jquery-ui/css/smoothness/images/ui-icons_222222_256x240.png deleted file mode 100644 index b273ff111d2..00000000000 Binary files a/themes/blueprint/css/jquery-ui/css/smoothness/images/ui-icons_222222_256x240.png and /dev/null differ diff --git a/themes/blueprint/css/jquery-ui/css/smoothness/images/ui-icons_2e83ff_256x240.png b/themes/blueprint/css/jquery-ui/css/smoothness/images/ui-icons_2e83ff_256x240.png deleted file mode 100644 index 09d1cdc856c..00000000000 Binary files a/themes/blueprint/css/jquery-ui/css/smoothness/images/ui-icons_2e83ff_256x240.png and /dev/null differ diff --git a/themes/blueprint/css/jquery-ui/css/smoothness/images/ui-icons_454545_256x240.png b/themes/blueprint/css/jquery-ui/css/smoothness/images/ui-icons_454545_256x240.png deleted file mode 100644 index 59bd45b907c..00000000000 Binary files a/themes/blueprint/css/jquery-ui/css/smoothness/images/ui-icons_454545_256x240.png and /dev/null differ diff --git a/themes/blueprint/css/jquery-ui/css/smoothness/images/ui-icons_888888_256x240.png b/themes/blueprint/css/jquery-ui/css/smoothness/images/ui-icons_888888_256x240.png deleted file mode 100644 index 6d02426c114..00000000000 Binary files a/themes/blueprint/css/jquery-ui/css/smoothness/images/ui-icons_888888_256x240.png and /dev/null differ diff --git a/themes/blueprint/css/jquery-ui/css/smoothness/images/ui-icons_cd0a0a_256x240.png b/themes/blueprint/css/jquery-ui/css/smoothness/images/ui-icons_cd0a0a_256x240.png deleted file mode 100644 index 2ab019b73ec..00000000000 Binary files a/themes/blueprint/css/jquery-ui/css/smoothness/images/ui-icons_cd0a0a_256x240.png and /dev/null differ diff --git a/themes/blueprint/css/jquery-ui/css/smoothness/jquery-ui.css b/themes/blueprint/css/jquery-ui/css/smoothness/jquery-ui.css deleted file mode 100644 index bb945652d68..00000000000 --- a/themes/blueprint/css/jquery-ui/css/smoothness/jquery-ui.css +++ /dev/null @@ -1,404 +0,0 @@ -/* - * jQuery UI CSS Framework 1.8.16 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Theming/API - */ - -/* Layout helpers -----------------------------------*/ -.ui-helper-hidden { display: none; } -.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); } -.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } -.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } -.ui-helper-clearfix { display: inline-block; } -/* required comment for clearfix to work in Opera \*/ -* html .ui-helper-clearfix { height:1%; } -.ui-helper-clearfix { display:block; } -/* end clearfix */ -.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); } - - -/* Interaction Cues -----------------------------------*/ -.ui-state-disabled { cursor: default !important; } - - -/* Icons -----------------------------------*/ - -/* states and images */ -.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } - - -/* Misc visuals -----------------------------------*/ - -/* Overlays */ -.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } - - -/* - * jQuery UI CSS Framework 1.8.16 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Theming/API - * - * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana,Arial,sans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=01_flat.png&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=02_glass.png&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=02_glass.png&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=02_glass.png&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px - */ - - -/* Component containers -----------------------------------*/ -.ui-widget { font-family: Verdana,Arial,sans-serif; font-size: 1.1em; } -.ui-widget .ui-widget { font-size: 1em; } -.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif; font-size: 1em; } -.ui-widget-content { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x; color: #222222; } -.ui-widget-content a { color: #222222; } -.ui-widget-header { border: 1px solid #aaaaaa; background: #cccccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x; color: #222222; font-weight: bold; } -.ui-widget-header a { color: #222222; } - -/* Interaction states -----------------------------------*/ -.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3; background: #e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #555555; } -.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555; text-decoration: none; } -.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999; background: #dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; } -.ui-state-hover a, .ui-state-hover a:hover { color: #212121; text-decoration: none; } -.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; } -.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121; text-decoration: none; } -.ui-widget :active { outline: none; } - -/* Interaction Cues -----------------------------------*/ -.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fcefa1; background: #fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x; color: #363636; } -.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; } -.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x; color: #cd0a0a; } -.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; } -.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; } -.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; } -.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } -.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } - -/* Icons -----------------------------------*/ - -/* states and images */ -.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); } -.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); } -.ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); } -.ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png); } -.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); } -.ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); } -.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png); } -.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png); } - -/* positioning */ -.ui-icon-carat-1-n { background-position: 0 0; } -.ui-icon-carat-1-ne { background-position: -16px 0; } -.ui-icon-carat-1-e { background-position: -32px 0; } -.ui-icon-carat-1-se { background-position: -48px 0; } -.ui-icon-carat-1-s { background-position: -64px 0; } -.ui-icon-carat-1-sw { background-position: -80px 0; } -.ui-icon-carat-1-w { background-position: -96px 0; } -.ui-icon-carat-1-nw { background-position: -112px 0; } -.ui-icon-carat-2-n-s { background-position: -128px 0; } -.ui-icon-carat-2-e-w { background-position: -144px 0; } -.ui-icon-triangle-1-n { background-position: 0 -16px; } -.ui-icon-triangle-1-ne { background-position: -16px -16px; } -.ui-icon-triangle-1-e { background-position: -32px -16px; } -.ui-icon-triangle-1-se { background-position: -48px -16px; } -.ui-icon-triangle-1-s { background-position: -64px -16px; } -.ui-icon-triangle-1-sw { background-position: -80px -16px; } -.ui-icon-triangle-1-w { background-position: -96px -16px; } -.ui-icon-triangle-1-nw { background-position: -112px -16px; } -.ui-icon-triangle-2-n-s { background-position: -128px -16px; } -.ui-icon-triangle-2-e-w { background-position: -144px -16px; } -.ui-icon-arrow-1-n { background-position: 0 -32px; } -.ui-icon-arrow-1-ne { background-position: -16px -32px; } -.ui-icon-arrow-1-e { background-position: -32px -32px; } -.ui-icon-arrow-1-se { background-position: -48px -32px; } -.ui-icon-arrow-1-s { background-position: -64px -32px; } -.ui-icon-arrow-1-sw { background-position: -80px -32px; } -.ui-icon-arrow-1-w { background-position: -96px -32px; } -.ui-icon-arrow-1-nw { background-position: -112px -32px; } -.ui-icon-arrow-2-n-s { background-position: -128px -32px; } -.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } -.ui-icon-arrow-2-e-w { background-position: -160px -32px; } -.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } -.ui-icon-arrowstop-1-n { background-position: -192px -32px; } -.ui-icon-arrowstop-1-e { background-position: -208px -32px; } -.ui-icon-arrowstop-1-s { background-position: -224px -32px; } -.ui-icon-arrowstop-1-w { background-position: -240px -32px; } -.ui-icon-arrowthick-1-n { background-position: 0 -48px; } -.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } -.ui-icon-arrowthick-1-e { background-position: -32px -48px; } -.ui-icon-arrowthick-1-se { background-position: -48px -48px; } -.ui-icon-arrowthick-1-s { background-position: -64px -48px; } -.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } -.ui-icon-arrowthick-1-w { background-position: -96px -48px; } -.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } -.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } -.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } -.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } -.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } -.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } -.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } -.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } -.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } -.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } -.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } -.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } -.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } -.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } -.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } -.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } -.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } -.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } -.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } -.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } -.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } -.ui-icon-arrow-4 { background-position: 0 -80px; } -.ui-icon-arrow-4-diag { background-position: -16px -80px; } -.ui-icon-extlink { background-position: -32px -80px; } -.ui-icon-newwin { background-position: -48px -80px; } -.ui-icon-refresh { background-position: -64px -80px; } -.ui-icon-shuffle { background-position: -80px -80px; } -.ui-icon-transfer-e-w { background-position: -96px -80px; } -.ui-icon-transferthick-e-w { background-position: -112px -80px; } -.ui-icon-folder-collapsed { background-position: 0 -96px; } -.ui-icon-folder-open { background-position: -16px -96px; } -.ui-icon-document { background-position: -32px -96px; } -.ui-icon-document-b { background-position: -48px -96px; } -.ui-icon-note { background-position: -64px -96px; } -.ui-icon-mail-closed { background-position: -80px -96px; } -.ui-icon-mail-open { background-position: -96px -96px; } -.ui-icon-suitcase { background-position: -112px -96px; } -.ui-icon-comment { background-position: -128px -96px; } -.ui-icon-person { background-position: -144px -96px; } -.ui-icon-print { background-position: -160px -96px; } -.ui-icon-trash { background-position: -176px -96px; } -.ui-icon-locked { background-position: -192px -96px; } -.ui-icon-unlocked { background-position: -208px -96px; } -.ui-icon-bookmark { background-position: -224px -96px; } -.ui-icon-tag { background-position: -240px -96px; } -.ui-icon-home { background-position: 0 -112px; } -.ui-icon-flag { background-position: -16px -112px; } -.ui-icon-calendar { background-position: -32px -112px; } -.ui-icon-cart { background-position: -48px -112px; } -.ui-icon-pencil { background-position: -64px -112px; } -.ui-icon-clock { background-position: -80px -112px; } -.ui-icon-disk { background-position: -96px -112px; } -.ui-icon-calculator { background-position: -112px -112px; } -.ui-icon-zoomin { background-position: -128px -112px; } -.ui-icon-zoomout { background-position: -144px -112px; } -.ui-icon-search { background-position: -160px -112px; } -.ui-icon-wrench { background-position: -176px -112px; } -.ui-icon-gear { background-position: -192px -112px; } -.ui-icon-heart { background-position: -208px -112px; } -.ui-icon-star { background-position: -224px -112px; } -.ui-icon-link { background-position: -240px -112px; } -.ui-icon-cancel { background-position: 0 -128px; } -.ui-icon-plus { background-position: -16px -128px; } -.ui-icon-plusthick { background-position: -32px -128px; } -.ui-icon-minus { background-position: -48px -128px; } -.ui-icon-minusthick { background-position: -64px -128px; } -.ui-icon-close { background-position: -80px -128px; } -.ui-icon-closethick { background-position: -96px -128px; } -.ui-icon-key { background-position: -112px -128px; } -.ui-icon-lightbulb { background-position: -128px -128px; } -.ui-icon-scissors { background-position: -144px -128px; } -.ui-icon-clipboard { background-position: -160px -128px; } -.ui-icon-copy { background-position: -176px -128px; } -.ui-icon-contact { background-position: -192px -128px; } -.ui-icon-image { background-position: -208px -128px; } -.ui-icon-video { background-position: -224px -128px; } -.ui-icon-script { background-position: -240px -128px; } -.ui-icon-alert { background-position: 0 -144px; } -.ui-icon-info { background-position: -16px -144px; } -.ui-icon-notice { background-position: -32px -144px; } -.ui-icon-help { background-position: -48px -144px; } -.ui-icon-check { background-position: -64px -144px; } -.ui-icon-bullet { background-position: -80px -144px; } -.ui-icon-radio-off { background-position: -96px -144px; } -.ui-icon-radio-on { background-position: -112px -144px; } -.ui-icon-pin-w { background-position: -128px -144px; } -.ui-icon-pin-s { background-position: -144px -144px; } -.ui-icon-play { background-position: 0 -160px; } -.ui-icon-pause { background-position: -16px -160px; } -.ui-icon-seek-next { background-position: -32px -160px; } -.ui-icon-seek-prev { background-position: -48px -160px; } -.ui-icon-seek-end { background-position: -64px -160px; } -.ui-icon-seek-start { background-position: -80px -160px; } -/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ -.ui-icon-seek-first { background-position: -80px -160px; } -.ui-icon-stop { background-position: -96px -160px; } -.ui-icon-eject { background-position: -112px -160px; } -.ui-icon-volume-off { background-position: -128px -160px; } -.ui-icon-volume-on { background-position: -144px -160px; } -.ui-icon-power { background-position: 0 -176px; } -.ui-icon-signal-diag { background-position: -16px -176px; } -.ui-icon-signal { background-position: -32px -176px; } -.ui-icon-battery-0 { background-position: -48px -176px; } -.ui-icon-battery-1 { background-position: -64px -176px; } -.ui-icon-battery-2 { background-position: -80px -176px; } -.ui-icon-battery-3 { background-position: -96px -176px; } -.ui-icon-circle-plus { background-position: 0 -192px; } -.ui-icon-circle-minus { background-position: -16px -192px; } -.ui-icon-circle-close { background-position: -32px -192px; } -.ui-icon-circle-triangle-e { background-position: -48px -192px; } -.ui-icon-circle-triangle-s { background-position: -64px -192px; } -.ui-icon-circle-triangle-w { background-position: -80px -192px; } -.ui-icon-circle-triangle-n { background-position: -96px -192px; } -.ui-icon-circle-arrow-e { background-position: -112px -192px; } -.ui-icon-circle-arrow-s { background-position: -128px -192px; } -.ui-icon-circle-arrow-w { background-position: -144px -192px; } -.ui-icon-circle-arrow-n { background-position: -160px -192px; } -.ui-icon-circle-zoomin { background-position: -176px -192px; } -.ui-icon-circle-zoomout { background-position: -192px -192px; } -.ui-icon-circle-check { background-position: -208px -192px; } -.ui-icon-circlesmall-plus { background-position: 0 -208px; } -.ui-icon-circlesmall-minus { background-position: -16px -208px; } -.ui-icon-circlesmall-close { background-position: -32px -208px; } -.ui-icon-squaresmall-plus { background-position: -48px -208px; } -.ui-icon-squaresmall-minus { background-position: -64px -208px; } -.ui-icon-squaresmall-close { background-position: -80px -208px; } -.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } -.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } -.ui-icon-grip-solid-vertical { background-position: -32px -224px; } -.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } -.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } -.ui-icon-grip-diagonal-se { background-position: -80px -224px; } - - -/* Misc visuals -----------------------------------*/ - -/* Corner radius */ -.ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -khtml-border-top-left-radius: 4px; border-top-left-radius: 4px; } -.ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; -khtml-border-top-right-radius: 4px; border-top-right-radius: 4px; } -.ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; -khtml-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; } -.ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; -khtml-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; } - -/* Overlays */ -.ui-widget-overlay { background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); } -.ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -khtml-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }/* - * jQuery UI Autocomplete 1.8.16 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Autocomplete#theming - */ -.ui-autocomplete { position: absolute; cursor: default; } - -/* workarounds */ -* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */ - -/* - * jQuery UI Menu 1.8.16 - * - * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Menu#theming - */ -.ui-menu { - list-style:none; - padding: 2px; - margin: 0; - display:block; - float: left; -} -.ui-menu .ui-menu { - margin-top: -3px; -} -.ui-menu .ui-menu-item { - margin:0; - padding: 0; - zoom: 1; - float: left; - clear: left; - width: 100%; -} -.ui-menu .ui-menu-item a { - text-decoration:none; - display:block; - padding:.2em .4em; - line-height:1.5; - zoom:1; -} -.ui-menu .ui-menu-item a.ui-state-hover, -.ui-menu .ui-menu-item a.ui-state-active { - font-weight: normal; - margin: -1px; -} -/* - * jQuery UI Dialog 1.8.16 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Dialog#theming - */ -.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; } -.ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative; } -.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; } -.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; } -.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; } -.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; } -.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; } -.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; } -.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; } -.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; } -.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; } -.ui-draggable .ui-dialog-titlebar { cursor: move; } -/* - * jQuery UI Slider 1.8.16 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Slider#theming - */ -.ui-slider { position: relative; text-align: left; } -.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; } -.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; } - -.ui-slider-horizontal { height: .8em; } -.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; } -.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; } -.ui-slider-horizontal .ui-slider-range-min { left: 0; } -.ui-slider-horizontal .ui-slider-range-max { right: 0; } - -.ui-slider-vertical { width: .8em; height: 100px; } -.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; } -.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; } -.ui-slider-vertical .ui-slider-range-min { bottom: 0; } -.ui-slider-vertical .ui-slider-range-max { top: 0; }/* - * jQuery UI Tabs 1.8.16 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Tabs#theming - */ -.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ -.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; } -.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; } -.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; } -.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; } -.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; } -.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */ -.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; } -.ui-tabs .ui-tabs-hide { display: none !important; } diff --git a/themes/blueprint/css/print.css b/themes/blueprint/css/print.css deleted file mode 100644 index 41dff79e19e..00000000000 --- a/themes/blueprint/css/print.css +++ /dev/null @@ -1,17 +0,0 @@ -@CHARSET "UTF-8"; - -#headerRight, .searchbox, .breadcrumbs, .authorbox, .resulthead, #tabnav, .main .span-5, .result .span-4, .searchtools, .toolbar, .footer, .pagination, .offscreen, .checkbox { - display: none; -} - -body { - margin-top:0; -} -.container, .main .span-18 { - width:100%; -} - -.result .span-9 { - width: 810px; - margin-right: 0; -} diff --git a/themes/blueprint/css/slick/ajax-loader.gif b/themes/blueprint/css/slick/ajax-loader.gif deleted file mode 100644 index e0e6e9760bc..00000000000 Binary files a/themes/blueprint/css/slick/ajax-loader.gif and /dev/null differ diff --git a/themes/blueprint/css/slick/fonts/slick.eot b/themes/blueprint/css/slick/fonts/slick.eot deleted file mode 100644 index 2cbab9ca977..00000000000 Binary files a/themes/blueprint/css/slick/fonts/slick.eot and /dev/null differ diff --git a/themes/blueprint/css/slick/fonts/slick.svg b/themes/blueprint/css/slick/fonts/slick.svg deleted file mode 100644 index b36a66a6c45..00000000000 --- a/themes/blueprint/css/slick/fonts/slick.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - -Generated by Fontastic.me - - - - - - - - - - diff --git a/themes/blueprint/css/slick/fonts/slick.ttf b/themes/blueprint/css/slick/fonts/slick.ttf deleted file mode 100644 index 9d03461b653..00000000000 Binary files a/themes/blueprint/css/slick/fonts/slick.ttf and /dev/null differ diff --git a/themes/blueprint/css/slick/fonts/slick.woff b/themes/blueprint/css/slick/fonts/slick.woff deleted file mode 100644 index 8ee99721bb8..00000000000 Binary files a/themes/blueprint/css/slick/fonts/slick.woff and /dev/null differ diff --git a/themes/blueprint/css/slick/slick.css b/themes/blueprint/css/slick/slick.css deleted file mode 100644 index c7bd010baf3..00000000000 --- a/themes/blueprint/css/slick/slick.css +++ /dev/null @@ -1,85 +0,0 @@ -@charset "UTF-8"; -/* Slider */ -.slick-slider { position: relative; display: block; box-sizing: border-box; -moz-box-sizing: border-box; -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; -ms-touch-action: pan-y; touch-action: pan-y; -webkit-tap-highlight-color: transparent; } - -.slick-list { position: relative; overflow: hidden; display: block; margin: 0; padding: 0; } -.slick-list:focus { outline: none; } -.slick-loading .slick-list { background: #fff url("./ajax-loader.gif") center center no-repeat; } -.slick-list.dragging { cursor: pointer; cursor: hand; } - -.slick-slider .slick-track { -webkit-transform: translate3d(0, 0, 0); -moz-transform: translate3d(0, 0, 0); -ms-transform: translate3d(0, 0, 0); -o-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); } - -.slick-track { position: relative; left: 0; top: 0; display: block; } -.slick-track:before, .slick-track:after { content: ""; display: table; } -.slick-track:after { clear: both; } -.slick-loading .slick-track { visibility: hidden; } - -.slick-slide { float: left; height: 100%; min-height: 1px; display: none; } -[dir="rtl"] .slick-slide { float: right; } -.slick-slide img { display: block; } -.slick-slide.slick-loading img { display: none; } -.slick-slide.dragging img { pointer-events: none; } -.slick-initialized .slick-slide { display: block; } -.slick-loading .slick-slide { visibility: hidden; } -.slick-vertical .slick-slide { display: block; height: auto; border: 1px solid transparent; } - -/* Icons */ -@font-face { font-family: "slick"; src: url("./fonts/slick.eot"); src: url("./fonts/slick.eot?#iefix") format("embedded-opentype"), url("./fonts/slick.woff") format("woff"), url("./fonts/slick.ttf") format("truetype"), url("./fonts/slick.svg#slick") format("svg"); font-weight: normal; font-style: normal; } -/* Arrows */ -.slick-prev, .slick-next { position: absolute; display: block; height: 20px; width: 20px; line-height: 0; font-size: 0; cursor: pointer; background: transparent; color: transparent; top: 50%; margin-top: -10px; padding: 0; border: none; outline: none; } -.slick-prev:hover, .slick-prev:focus, .slick-next:hover, .slick-next:focus { outline: none; background: transparent; color: transparent; } -.slick-prev:hover:before, .slick-prev:focus:before, .slick-next:hover:before, .slick-next:focus:before { opacity: 1; } -.slick-prev.slick-disabled:before, .slick-next.slick-disabled:before { opacity: 0.25; } - -.slick-prev:before, .slick-next:before { font-family: "slick"; font-size: 20px; line-height: 1; color: black; opacity: 0.75; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } - -.slick-prev { left: -25px; } -[dir="rtl"] .slick-prev { left: auto; right: -25px; } -.slick-prev:before { content: "←"; } -[dir="rtl"] .slick-prev:before { content: "→"; } - -.slick-next { right: -25px; } -[dir="rtl"] .slick-next { left: -25px; right: auto; } -.slick-next:before { content: "→"; } -[dir="rtl"] .slick-next:before { content: "←"; } - -/* Dots */ -.slick-slider { margin-bottom: 30px; } - -.slick-dots { position: absolute; bottom: -45px; list-style: none; display: block; text-align: center; padding: 0; width: 100%; } -.slick-dots li { position: relative; display: inline-block; height: 20px; width: 20px; margin: 0 5px; padding: 0; cursor: pointer; } -.slick-dots li button { border: 0; background: transparent; display: block; height: 20px; width: 20px; outline: none; line-height: 0; font-size: 0; color: transparent; padding: 5px; cursor: pointer; } -.slick-dots li button:hover, .slick-dots li button:focus { outline: none; } -.slick-dots li button:hover:before, .slick-dots li button:focus:before { opacity: 1; } -.slick-dots li button:before { position: absolute; top: 0; left: 0; content: "•"; width: 20px; height: 20px; font-family: "slick"; font-size: 6px; line-height: 20px; text-align: center; color: black; opacity: 0.25; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } -.slick-dots li.slick-active button:before { color: black; opacity: 0.75; } - -/*# sourceMappingURL=slick.css.map */ - -/* - similar items carousel - */ -.hover-overlay { - display:block; - position:relative; - text-align:center; - margin:auto; - min-width:150px; - min-height:200px; -} -.hover-overlay img { - margin:auto; - max-width:100%; -} -.hover-overlay .content { - display:none; - position:absolute; - top:0; - left:0; - width:100%; - height:100%; - background:rgba(0,0,0,.5); - color:#FFF; - padding:.5em .5em 0; -} -.hover-overlay:hover .content { - display:block; -} \ No newline at end of file diff --git a/themes/blueprint/css/styles.css b/themes/blueprint/css/styles.css deleted file mode 100644 index de669af5d6b..00000000000 --- a/themes/blueprint/css/styles.css +++ /dev/null @@ -1,2431 +0,0 @@ -@CHARSET "UTF-8"; - -/** General ***/ -body { - margin: 1.5em 0; - /*background:url("../images/bg_body.jpg") no-repeat scroll center top;*/ - background: #619144; -} - -.ui-widget { - font-family: inherit; - font-size: inherit; -} - -.sidebarOnLeft .sidegroup { - margin-left: 10px; -} - -/* adjust some default blueprint styles */ -p,ul,dl,form,input,textarea,select,label { margin-bottom: 0.2em; } -h1 { font-size: 1.5em; margin-top: 0.5em; margin-bottom: 0.5em; } -h2 { font-size: 1.4em; margin-top: 0.5em; margin-bottom: 0.5em; } -h3 { font-size: 1.3em; margin-top: 0.5em; margin-bottom: 0.5em; } -h4 { font-size: 1.2em; margin-top: 0.5em; margin-bottom: 0.5em; } -h5 { font-size: 1.1em; font-weight: bold; margin-bottom: 0.5em; } -h6 { font-size: 1em; font-weight: bold; margin-bottom: 0.4em; } -fieldset { padding:0 .4em .8em 1em;} -legend { font-size:100%;} -fieldset, #IE8#HACK { padding-top:0.4em; } - -.container { - border-radius: 5px 5px 5px 5px; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border: 1px solid #ddd; - background: none repeat scroll 0 0 #FFFFFF; - box-shadow:0 4px 8px #111; -} - -.searchbox,.breadcrumbs,.main,.footer { - border-top: 1px solid #ddd; -} - -.header,.searchbox,.breadcrumbs,.main,.footer { - padding: .8em; -} - -.clearer { - clear: both; -} - -#logo { - background:url("../images/vufind_logo.png") no-repeat scroll left center transparent; - float:left; - height:65px; - width:300px; -} - -#headerRight { - width: 400px; - float: right; - text-align: right; -} - -#langForm { - margin-top: .3em; -} - -label.invalid { - background:url("../images/unchecked.gif") no-repeat scroll 0 0 transparent; - color:#EA5200; - font-weight:bold; - padding-bottom:2px; - padding-left:16px; - margin-left: 5px; -} - -/** class to make stuff "invisible" but still readable by screen readers */ -.offscreen { - position:absolute; - left:-10000px; - top:auto; - width:1px; - height:1px; - overflow:hidden; - display:inline; -} - -div.dialogLoading { - background: url(../images/dialog_loading.gif) no-repeat center center; - height:100%; -} - -.ajax_availability, .ajax_hold_availability, .ajax_storage_retrieval_request_availability, .ajax_ill_request_availability, .ajax_ill_request_loading, .ajax_hold_request_loading { - background: url(../images/ajax_loading.gif) no-repeat left top; - padding:0 .5em .5em 20px; -} -.highlight { - font-weight: bold; - background: none; -} -.floatleft { float:left; } -.floatright { float:right; } -img.alignright { - float: right; - margin: 0 0 0 10px; -} -img.alignleft { - float: left; - margin: 0 10px 0 0; -} - -p.listDescription { - padding: .4em .4em 1em .4em; -} - -/** Buttons to do "bulk" actions **/ - -div.bulkActionButtons { - border-bottom: 1px solid #eee; - padding: 1em 0; -} - -div.bulkActionButtons a { - padding-bottom: 0.2em; -} - -div.bulkActionButtons input.button { - background-color:transparent; - background-position: 2px center; - text-decoration: underline; - border:0 none; - cursor:pointer; - padding:0 0 0 20px; - vertical-align: top; - color: #06C; -} -div.bulkActionButtons input.button:hover { - color: #09D; -} - -div.bulkActionButtons input.button { - width: 0; /* IE table-cell margin fix */ - overflow: visible; - margin-left: .5em; - margin-right: .25em; -} - -div.bulkActionButtons input.button[class] { /* IE < 7 ignores [class] */ - width: auto; /* cancel margin fix for other browsers */ -} - -div.bulkActionButtons input.checkbox { - vertical-align: top; -} -input.smallButton { - background-position: 2px center; - padding: 2px 2px 2px 22px; -} -a.smallButton { - background-color:#EEE; - background-position: 2px center; - border:2px outset #DDD; - color:#000; - display:inline-block; - font-size:10pt; - padding: 1px 4px 1px 26px; - text-decoration:none; -} -a.smallButton:active { - border:2px inset #EEE; -} - -/** Cart **/ -.cartSummary { - float:left; -} -.header .cartSummary { - float:right; -} -ul.cartContent { - list-style-type:none; - margin:0; - padding:0; -} - -/** Alphabetic browse **/ -.alphaBrowseResult { - padding: 0 0.5em 0.5em 0.5em; -} - -.alphaBrowseEntry { - padding: 0.25em 0.5em; - background-color: #eee; - zoom: 1; -} - -.alphaBrowseEntry.alt, .alphaBrowseEntry.alt * { - background-color: #fff; -} - -.alphaBrowseExtra { - display: block; - float: left; - padding-left: .75em; - line-height: 1.31em; -} - -.alphaBrowseForm { - zoom: 1; -} - -.alphaBrowseHeading { - float: left; - width: 650px; - line-height: 1.31em; -} - -.alphaBrowseSource_dewey .alphaBrowseHeading { - width: 200px; - padding-right: .5em; -} - -.alphaBrowseSource_dewey .alphaBrowseColumn_title { - width: 450px; -} - -.alphaBrowseSource_lcc .alphaBrowseHeading { - width: 200px; - padding-right: .5em; -} - -.alphaBrowseSource_lcc .alphaBrowseColumn_title { - width: 450px; -} - -.alphaBrowseSource_title .alphaBrowseHeading { - width: 300px; - padding-right: .5em; -} - -.alphaBrowseSource_title .alphaBrowseColumn_author { - width: 200px; -} - -.alphaBrowseSource_title .alphaBrowseColumn_format { - width: 100px; -} - -.alphaBrowseSource_title .alphaBrowseColumn_publishDate { - width: 45px; -} - -.alphaBrowseCount { - float: right; -} - -.alphaBrowseHeader { - text-align: right; - clear: both; - font-weight: bold; - zoom: 1; -} - -.alphaBrowsePageLinks { - margin: 1em; - font-weight: bold; - background-color: #fff; -} - -.alphaBrowsePrevLink { - float: left; -} - -.alphaBrowseNextLink { - float: right; -} - -.alphaBrowseRelatedHeading { - clear: left; -} - -.alphaBrowseRelatedHeading .title { - font-weight: bold; - font-size: 90%; - margin-left: 2em; -} - -.alphaBrowseRelatedHeading li { - margin-left: 4em; -} - -.alphaBrowseEntry.browse-match { - border:.2em solid #619144; -} - -.browseAlphabetSelectorItem { - float: left; - margin-right:5px; - margin-left:5px; -} - -.browseJumpTo { - float: right; - margin-right:5px; - margin-left:5px; -} - -/** Autocomplete */ -.ui-autocomplete { - max-width: 500px; - max-height: 300px; - overflow: hidden; -} - -/** Publication Year facet */ -fieldset.pubyearLimit { - padding: 0; - border: 0; -} -fieldset.publishDateLimit .ui-slider { - clear: both; - margin: .5em; -} - - -/*****************Breadcrumbs*******************/ -div.breadcrumbs { - overflow:hidden; - padding:0; - height:30px; - line-height:30px; - /* background-color:#ddd; */ -} -div.breadcrumbs a, div.breadcrumbs em, div.breadcrumbs span { - float:left; - overflow:hidden; - height:30px; - padding:0 8px; - font-style:normal; - font-size: 90%; -} -div.breadcrumbs span { - background:url(../images/bg_breadcrumb.png) no-repeat left center; - overflow:hidden; - padding:0; - width:10px; - font-size: 0pt; - line-height: 0px; - - filter:alpha(opacity=40); - opacity:0.4; -} -div.breadcrumbinner { - margin:0 .4em; -} - -/*****************Homepage*******************/ -.searchHomeContent { - padding:5em 0; - margin:0 auto; - width:800px; - text-align:left; -} -.searchHomeForm { - background-color: #E6EFC2; - padding:2em; - text-align:left; - margin-top:.5em; - font-size: 12pt; - border-radius: 5px 5px 5px 5px; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - border: 2px solid #C6D880; - color: #264409; -} -div.searchHomeForm div.searchform { - width:600px; - margin-left: auto; - margin-right: auto; -} - -.searchHomeForm a, .searchHomeForm a:hover { - color:#264409; -} -.searchHomeBrowse { - margin-left:auto; - margin-right:auto; - padding: .4em; - width:800px; -} -.searchHomeBrowse h2 { - border-bottom: 1px solid #94c632; -} - -.searchHomeBrowse ul { - list-style-type: none; - padding:0; -} - -#searchForm_type { - padding:2px; -} - -/******** Result List ***/ - -ul.recordSet { - margin: 0; - padding: 0; - list-style-type: none; -} -ul.recordSet li { - padding: .4em; -} - -ul.recordSet li.alt { - background-color: #eee; -} -ul.recordSet input.checkbox { - display:block; - float: left; - margin-top: .2em; - margin-left: 0; - margin-right: .4em; -} -ul.recordSet .recordNumber { - display:table; - float: left; - font-weight: bold; - margin: 0; - min-width:40px; - text-align:right; -} -ul.recordSet .recordNumber .checkbox_ui { - vertical-align:bottom; - margin:0 3px 3px 2px; -} -ul.recordSet .addToFavLink { - float: right; - text-align: right; -} -.summcover { - min-height: 1px; /* Chrome display glitch workaround */ - max-width: 70px; - padding:0; - margin:0; -} -.authorbox, .authorbio, .authoritybox { - padding:0 0 .4em .4em; - border-bottom: 1px #eee solid; - margin-bottom:.5em; - background-image:url(../images/bg_authorbox.jpg); - background-repeat: repeat-x; - background-position: bottom; -} -.authorbox .applied {color:#000;} -.authorbox .applied img {vertical-align:sub;} -.authorbox .span-5 {white-space:nowrap;} -.authorbox .span-5 a {white-space:normal;} -.authorbio .providerLink { - margin-top: 1em; - margin-bottom: .4em; -} -.searchtools { - /*background-color: #f5f5f5;*/ - border-top: #eee solid 1px; - padding: 1em; - font-size: 90%; -} -.resulthead { - padding:.4em .4em 0em .4em; - border-bottom: 1px #eee solid; - position: relative; -} -.savedLists { - margin-top: .4em; - padding-bottom:0.4em; - padding-top:0.4em; -} -.savedLists ul { margin-top: 0; } -.savedLists ul li { padding:0; } - -li.result blockquote { - margin:0; -} -.groupCallnumber { - margin-left: 18px; -} -.result .qrcodeHolder, .recordsubcontent .qrcodeHolder { - border: 1px solid #cfcfcf; - position: absolute; - display: none; -} - -/** Side facets */ - -ul.filters { - background-color: orange; - color: white; - list-style-type:none; - margin:0; - padding:0.2em 0.4em; -} -ul.filters img { - vertical-align: top; -} -ul.filters a { - color: white; - text-decoration: none; -} -div.sidegroup h4 { - border-bottom:2px solid #ddd; -} -dl.narrowList img { - vertical-align: top; -} -dl.narrowList a:hover { - /*text-decoration: underline;*/ -} -dl.narrowList a { - text-decoration: none; -} -.keywordFilterForm { - margin: 5px 0px 5px 0px; -} -.navmenu dd { - padding: 0.1em 0 0.1em 0.4em; - list-style-type: none; - border-bottom: 1px solid #e3e3e3; - margin: 0; -} -.navmenu dt { - cursor:pointer; - margin-top:.75em; - font-weight:bold; - padding:0.2em 0.4em; - background-color: #eee; -} -.navmenu dt:before { - content:'\25BC'; - display:block; - float:right; - width:10px; - margin:1px 3px 0 0; - text-align:center; - font-size:8pt; -} -.navmenu dd {display:none} -.navmenu.open dt:before {content:'\25B2'} -.navmenu.open dd {display:block} - -dd input[type="checkbox"] { - margin:0 4px 0 0; - vertical-align:text-bottom; -} - -/* Icon Classes */ - -.bookbag { - background-image:url(../images/fugue/bookbag.png); - background-repeat:no-repeat; - background-position: left top; - padding:0 .5em .5em 20px; - margin-right:1em; -} - -input.bookbagView, -input.bookbagAdd, -input.bookbagDelete, -input.bookbagEmpty { - background-color:transparent; - display:inline; - border:0; - color:#06C; - font:8pt Arial; - text-decoration:underline; - cursor:pointer; - padding:0 .5em .5em 16px; -} -.bulkActionButtons input.bookbagView, -.bulkActionButtons input.bookbagAdd, -.bulkActionButtons input.bookbagDelete, -.bulkActionButtons input.bookbagEmpty { - font-size:10pt; -} -.bookbagView:hover, -.bookbagAdd:hover, -.bookbagDelete:hover, -.bookbagEmpty:hover { - color:#09f; -} - -.bookbagView { - background-image:url(../images/fugue/bookbag.png); - background-repeat:no-repeat; - background-position: left top; - padding:0 .5em .5em 20px; - margin-right:1em; -} - -.bookbagAdd { - background-image:url(../images/fugue/bookbagAdd.png); - background-repeat:no-repeat; - background-position: left top; - padding:0 .5em .5em 20px; - margin-right:1em; -} -.bookbagDelete { - background-image:url(../images/fugue/bookbagDelete.png); - background-repeat:no-repeat; - background-position: left top; - padding:0 .5em .5em 20px; - margin-right:1em; -} - -.bookbagEmpty { - background-image:url(../images/fugue/bookbagEmpty.png); - background-repeat:no-repeat; - background-position: left top; - padding:0 .5em .5em 20px; - margin-right:1em; -} - -.print { - background-image:url(../images/silk/printer.png); - background-repeat:no-repeat; - background-position: left top; - padding:0 .5em .5em 20px; - margin-right:1em; -} - -.login { - background-image:url(../images/silk/user.png); - background-repeat:no-repeat; - background-position: left; - padding:.5em .5em .5em 20px; -} -.logout { - background-image:url(../images/silk/door_out.png); - background-repeat:no-repeat; - background-position: left; - padding:.5em .5em .5em 20px; -} -.account { - background-image:url(../images/silk/user.png); - background-repeat:no-repeat; - background-position: left; - padding:.5em .5em .5em 20px; -} -.new_account { - background-image:url(../images/silk/user_add.png); - background-repeat:no-repeat; - background-position: left; - padding:.5em .5em .5em 20px; -} -.forgot_password { - background-image:url(../images/silk/key_go.png); - background-repeat:no-repeat; - background-position: left; - padding:.5em .5em .5em 20px; -} -.lock { - background-image:url(../images/silk/lock.png); - background-repeat:no-repeat; - background-position: left; - padding:.5em .5em .5em 20px; -} -.cite { - background-image:url(../images/silk/report.png); - background-repeat:no-repeat; - background-position: left; - padding:.5em .5em .5em 20px; - margin-right:1em; -} -.export { - background-image:url(../images/silk/application_add.png); - background-repeat:no-repeat; - background-position: left; - padding:.5em .5em .5em 20px; - margin-right:1em; -} -.sms { - background-image:url(../images/silk/phone.png); - background-repeat:no-repeat; - background-position: left; - padding:.5em .5em .5em 20px; - margin-right:1em; -} -.tag { - background-image:url(../images/silk/tag_blue.png); - background-repeat:no-repeat; - background-position: left; - padding:.5em .5em .5em 20px; - margin-right:1em; -} -.mail { - background-image:url(../images/silk/email.png); - background-repeat:no-repeat; - background-position: left; - padding:.5em .5em .5em 20px; - margin-right:1em; -} -.fav { - background-image:url(../images/silk/heart.png); - background-repeat:no-repeat; - background-position: left; - padding:.5em .5em .5em 20px; - margin-right:1em; -} -.edit { - background-image:url(../images/silk/edit.png); - background-repeat:no-repeat; - background-position: left; - padding:.5em 0 .5em 18px; - margin-right:.7em; -} -.save { - background-image:url(../images/silk/disk-black.png); - background-repeat:no-repeat; - background-position: left; - padding:.5em 0 .5em 18px; - margin-right:.7em; -} -.delete { - background-image:url(../images/silk/delete.png); - background-repeat:no-repeat; - background-position: left; - padding:.5em .5em .5em 18px; - margin-right:0; -} -.feed { - background-image:url(../images/silk/feed.png); - background-repeat:no-repeat; - background-position: left; - padding:.5em .5em .5em 20px; - margin-left:1em; -} -.list { - background-image:url(../images/silk/list.png); - background-repeat:no-repeat; - background-position: left; - padding:.5em .5em .5em 20px; - /*margin-left:1em;*/ -} -.gear { - background-image:url(../images/silk/cog.png); - background-repeat:no-repeat; - background-position: left; - padding:.6em .5em .5em 20px; - /*margin-left:1em;*/ -} -h3.list { - padding-bottom:0; - margin-bottom:0; -} -.add { - background-image:url(../images/silk/add.png); - background-repeat:no-repeat; - background-position: left; - padding:.5em .5em .5em 18px; - margin-right:0; -} -.available { - background-image:url(../images/silk/bullet_green.png); - background-repeat:no-repeat; - color:#009900; - padding-left:18px -} -.availableLoc { - background-image:url(../images/fugue/tick-small.png); - background-repeat:no-repeat; - padding-left:18px -} -.checkedout { - background-image:url(../images/silk/bullet_red.png); - background-repeat:no-repeat; - color:#cc0000; - padding-left:18px -} -.checkedoutLoc { - background-image:url(../images/fugue/cross-small.png); - background-repeat:no-repeat; - padding-left:18px -} -.cd { - background-image:url(../images/silk/cd.png); - background-repeat:no-repeat; - background-position: left top; - padding:0 .5em .5em 20px; - margin-right:1em; -} -.dvd { - background-image:url(../images/silk/dvd.png); - background-repeat:no-repeat; - background-position: left top; - padding:0 .5em .5em 20px; - margin-right:1em; -} -.electronic { - background-image:url(../images/tango/www.png); - background-repeat:no-repeat; - background-position: left top; - padding:0 .5em .5em 20px; - margin-right:1em; -} -.map { - background-image:url(../images/silk/map.png); - background-repeat:no-repeat; - background-position: left top; - padding:0 .5em .5em 20px; - margin-right:1em; -} -.globe { - background-image:url(../images/silk/world.png); - background-repeat:no-repeat; - background-position: left top; - padding:0 .5em .5em 20px; - margin-right:1em; -} -.slide { - background-image:url(../images/silk/photo.png); - background-repeat:no-repeat; - background-position: left top; - padding:0 .5em .5em 20px; - margin-right:1em; -} -.microfilm { - background-image:url(../images/silk/film.png); - background-repeat:no-repeat; - background-position: left top; - padding:0 .5em .5em 20px; - margin-right:1em; -} -.photo { - background-image:url(../images/silk/picture.png); - background-repeat:no-repeat; - background-position: left top; - padding:0 .5em .5em 20px; - margin-right:1em; -} -.video { - background-image:url(../images/tango/video.png); - background-repeat:no-repeat; - background-position: left top; - padding:0 .5em .5em 20px; - margin-right:1em; -} -.kit { - background-image:url(../images/silk/package.png); - background-repeat:no-repeat; - background-position: left top; - padding:0 .5em .5em 20px; - margin-right:1em; -} -.musicalscore { - background-image:url(../images/silk/music.png); - background-repeat:no-repeat; - background-position: left top; - padding:0 .5em .5em 20px; - margin-right:1em; -} -.sensorimage { -} -.audio { - background-image:url(../images/tango/audio-volume-high.png); - background-repeat:no-repeat; - background-position: left top; - padding:0 .5em .5em 20px; - margin-right:1em; -} -.physicalobject { -} -.manuscript { - background-image:url(../images/silk/report_edit.png); - background-repeat:no-repeat; - background-position: left top; - padding:0 .5em .5em 20px; - margin-right:1em; -} -.ebook { - background-image:url(../images/ebook.png); - background-repeat:no-repeat; - background-position: left top; - padding:0 .5em .5em 20px; - margin-right:1em; -} -.book { - background-image:url(../images/silk/book.png); - background-repeat:no-repeat; - background-position: left top; - padding:0 .5em .5em 20px; - margin-right:1em; -} -.journal { - background-image:url(../images/silk/report.png); - background-repeat:no-repeat; - background-position: left top; - padding:0 .5em .5em 20px; - margin-right:1em; -} -.newspaper { - background-image:url(../images/silk/newspaper.png); - background-repeat:no-repeat; - background-position: left top; - padding:0 .5em .5em 20px; - margin-right:1em; -} -.qrcodeLink { - background-image:url(../images/fugue/qrcode.png); - background-repeat:no-repeat; - padding:0 .5em .5em 20px; - display: block; -} -.software { - background-image:url(../images/silk/disk_multiple.png); - background-repeat:no-repeat; - background-position: left top; - padding:0 .5em .5em 20px; - margin-right:1em; -} -.iconlabel { - line-height: 16px; - font-size: 8pt; - font-weight: bold; -} -.addThis { - background-image:url(../images/silk/tag_yellow.png); - background-repeat:no-repeat; - background-position: left; - padding:.5em .5em .5em 20px; - margin-right:1em; -} -.holdPlace, .storageRetrievalRequestPlace, .ILLRequestPlace { - background-image:url(../images/fugue/holdPlace.png); - background-repeat:no-repeat; - background-position: left; - padding:.5em .5em .5em 20px; - margin-right:1em; -} -.holdCancel, .storageRetrievalRequestCancel, .ILLRequestCancel { - background-image:url(../images/fugue/holdCancel.png); - background-repeat:no-repeat; - background-position: left; - padding:.5em .5em .5em 20px; - margin-right:1em; -} -.holdCancelAll, .storageRetrievalRequestCancelAll, .ILLRequestCancelAll { - background-image:url(../images/fugue/holdCancelAll.png); - background-repeat:no-repeat; - background-position: left; - padding:.5em .5em .5em 20px; - margin-right:1em; -} -.renew { - background-image:url(../images/fugue/renew.png); - background-repeat:no-repeat; - background-position: left; - padding:.5em .5em .5em 20px; - margin-right:1em; -} -.renewAll { - background-image:url(../images/fugue/renewAll.png); - background-repeat:no-repeat; - background-position: left; - padding:.5em .5em .5em 20px; - margin-right:1em; -} -.checkRequest, .checkStorageRetrievalRequest, .checkILLRequest { - background-image:url(../images/fugue/checkRequest.png); - background-repeat:no-repeat; - padding-left:18px; -} -.holdBlocked { - background-image:url(../images/fugue/holdBlocked.png); - background-repeat:no-repeat; - padding-left:18px; -} -.unknown { - background-image:url(../images/silk/bullet_orange.png); - background-repeat:no-repeat; - color:#ff890f; - padding-left:18px; -} - -/***** Pagination *****/ - -.pagination { - font-size:90%; - padding:1em 0 1em 0; - margin:1.5em 0; - text-align:center; -} -.pagination a { - padding: .2em .3em; - margin-right:.5em; - border: 1px solid #fff; -} -.pagination a:hover { - border: 1px solid #cccccc; -} -.pagination span { - padding: .2em .3em; - margin-right:.5em; - font-weight:bold; -} - -/*** Record Page */ -div.record { - padding:0 1.5em; -} -div.recordsubcontent { - padding:1em 1.5em 1em 1.5em; -} -.recordcover { - display: block; - padding:3px; - background-color:#eee; - border:1px solid #cfcfcf; - margin: 1em auto 0; - max-width: 120px; -} - -div.record img.qrcode { - display: block; - margin: 1em auto 0; - border:1px solid #cfcfcf; -} -.holdsMessage { - margin-top: 1em; -} -.phone-error { - color:red; - margin-left:80px; -} -#tagRecord { - display: inline-block; - padding-top: 4px; -} -.record-tag, -.record-tag * { - display: inline-block; - vertical-align: top; -} -.record-tag { - float: left; - margin: 0 4px; - padding-top: 4px; - padding-right: 1px; - padding-bottom: 0; - padding-left: 6px; -} -.record-tag .badge { - background-color: #DDD; - border: 0; - border-radius: 1em; - cursor: pointer; - display: inline-block; - font-size: 8pt; - margin-top: -2px; - background-position: 85%; - padding-top: 4px; - padding-left: .5em; - padding-bottom: 4px; - padding-right: 20px; -} -.record-tag span.badge { - padding-top: 2px; - padding-left: 4px; - padding-bottom: 2px; - padding-right: 4px; -} -.record-tag.selected { - background: #619144; - border-radius: 3px; -} -.record-tag.selected a { - color: #FFF; -} - -/* hack to hide redundant titles introduced by syndetics plus */ -#syn_nyreview .syn_title, -#syn_chreview .syn_title, -#syn_dbchapter .syn_title, -#syn_anotes .syn_title, -#syn_video_clip .syn_title { - display:none; -} - -/***** Citation Table *****/ -.citation { - font-size:90%; -} -.citation th { - text-align:left; - color:#666; - padding:.3em 0 .3em 0; - border-bottom: 1px solid #f3f3f3; - vertical-align: top; -} -.citation tr { - border-collapse: collapse; -} -.citation td { - padding:.3em 0 .3em 1em; - border-bottom: 1px solid #f3f3f3; -} -.citation tr, .citation td { - vertical-align:top; -} - -.citation tbody tr td { - background:none repeat scroll 0 0 white; -} - -div.recordsubcontent table.citation { - width: auto; -} - -table.authors th { - font-size:120%; - padding:0 0.8em; -} - -/************* Tabs (Record Page) *****************/ - -#tabnav { - font-size:90%; - margin-top:1em; - padding:0 0 0 1em; - background-color:#fafafa; - border-top:1px #eee solid; - border-bottom: 1px #dcdcdc solid; -} -#tabnav ul { -float: left; - margin:0; - padding:0px 5px 0 0; - list-style:none; -} -#tabnav li { - float:left; - margin:0 0 0 0px; - padding:0 0 0 10px; -} -#tabnav a { - float:left; - display:block; - padding:18px 10px 10px 5px; - text-decoration:none; - font-weight:normal; - color:#000; -} -/* Commented Backslash Hack - hides rule from IE5-Mac \*/ -#tabnav a {float:none;} -/* End IE5-Mac hack */ -#tabnav a:hover { - color:#000; -} -#tabnav .active { - background:url(../images/subnavTab_left.jpg) no-repeat left top; - margin-bottom:-1px; -} -#tabnav .active a { - background:url(../images/subnavTab_right.jpg) no-repeat right top; - color:#000; - padding:18px 10px 12px 0px; -} - -/** Similar Items (record view) **/ - -ul.similar { - list-style: none; - padding: 0 13px 0 0; - margin: 0px; - text-align:justified; -} - -ul.similar li { - padding-bottom:10px; -} - -/** Random Items (results view) **/ - -ul.random { - list-style: none; - padding: 0; - margin: 0px; - text-align:justified; -} - -ul.random li { - padding-bottom:10px; -} - -ul.random li img { - margin: 0 auto 1em auto; -} - -ul.random.image, ul.random.mixed { - text-align: center; -} - -ul.random.image li img { - margin: 0 auto; -} - -/*********** Toolbar (Record View) ************/ -.toolbar { - border-bottom:1px solid #eee; - text-align:right; - font-size:90%; - min-height:2em; - padding-left:1em; - margin-bottom:1em; -} -.toolbar ul { - display:inline; - height:23px; - list-style-type:none; -} -.toolbar ul li { - float:left; - margin-left:.5em; -} -.toolbar ul.menu { - display:block; - margin-top: 0; - border-right: 1px solid #cccccc; - border-left: 1px solid #cccccc; - position:absolute; - background:white; - height:auto; - padding: 0; -} -.toolbar ul.menu li { - border-bottom: 1px solid #cccccc; - padding:5px; - clear: left; - position:block; - width:100px; - text-align: left; - background:white; - margin: 0px; -} - -/*********** Storage Retrieval Request Form ************/ -.storageRetrievalRequestForm .label { - width: 70px; - text-align: right; - float: left; - margin-right: 12px; -} -.storageRetrievalRequestReference { - margin-left: 12px; -} - -/*********** Toolbar (Favorites View) ************/ -.toolbar ul li input.button { - background-color:transparent; - background-position: 2px center; - border:0 none; - cursor:pointer; - margin-right:0; - padding:0 0 0 23px; - vertical-align: top; - color: #06C; -} - -.toolbar ul li input.button { - width: 0; /* IE table-cell margin fix */ - overflow: visible; -} - -.toolbar ul li input.button[class] { /* IE < 7 ignores [class] */ - width: auto; /* cancel margin fix for other browsers */ -} - -.toolbar ul li input.checkbox { - vertical-align: top; -} - -/*** MARC view (Record page) **/ - -table.marc th { - text-align: right; - vertical-align: top; -} - -/** tag list */ -#tagList { - width: 350px; -} - -/***** Data Grid (Holdings) ******/ - -table.datagrid { - width:100%;/*oringinally set to auto*/ - border-collapse: collapse; - margin-bottom:1.5em; -} - -table.datagrid th { - color: #003366; - background-color: #DDEEFF; - border: solid 1px #99CCFF; - text-align: left; - border-left: 1px solid #FFFFFF; - border-right: 1px solid #FFFFFF; - padding: 5px 15px 5px 15px; -} - -table.datagrid th a { - color: #336699; -} - -table.datagrid td { - border-left: 1px solid #FFFFFF; - border-right: 1px solid #FFFFFF; - padding: 5px 10px 5px 10px; -} - -table.datagrid td a { - color: #003366; -} - -table.datagrid tr.evenrow { - background-color: #EEEEEE; -} - -table.datagrid tr.oddrow { - background-color: #DDDDDD; -} - -.qrcodeHoldings { - float: right; - text-align: left; -} - -.qrcodeHoldings a { - float: none; -} - -/* Comments */ - -ul.commentList { - margin-bottom: 1em; - list-style-type:none; -} -ul.commentList li { - border-bottom: 1px solid #eee; - padding-bottom: 1em; - margin-bottom:1em; -} -ul.commentList li div.posted { - color:#666; - font-size: 80%; - margin-top:1em; - width:100%; -} - -form#commentRecord { - padding-left: 1.5em; -} -form#commentRecord #comment { - vertical-align: middle; -} - -/** Forms **/ - -label.displayBlock { - display:block; - font-weight:bold; -} -input.button { -} -#listForm fieldset { - width: 400px -} - -/** Citation **/ - -p.citationText { - padding-left:25px; - text-indent:-25px; - width:95%; -} - -/* Tag cloud */ - -.cloud1 { - font-size: .8em; -} -.cloud2 { - font-size: 1em; -} -.cloud3 { - font-size: 1.2em; -} -.cloud4 { - font-size: 1.4em; -} -.cloud5 { - font-size: 1.6em; -} - -/* New advanced search screen stuff */ -.advSearchContent { - /* Needed for IE7 compatibility: */ - width: 96%; -} -.advSearchContent div[class*="span-"] select { - display:block; - width:100%; -} -.groupSearchHolder { - clear: both; - padding: 10px 10px 5px; -} -.groupSearchHolder .advRow { - padding: 1px 0px; - clear:both; -} -.groupSearchHolder .advRow div { - float: left; - padding: 0px 5px; -} -.groupSearchHolder span.clearer { - display: block; - clear: left; -} -.groupSearchDetails .join { - padding-right: 5px; - float: left; -} -.groupSearchHolder .label, .groupSearchHolder .join { - width: 140px; - text-align: right; -} -.addSearch { - padding: 0px 0px 4px 165px; -} -.groupSearchHolder .terms { - width: 250px; -} -.groupSearchHolder .terms input { - width: 100%; -} -.groupSearchHolder .field { -} -.group .groupSearchDetails { - float: right; - text-align: right; - padding: 3px 5px; -} -.group0 .groupSearchDetails { - border: 1px solid #D8D7D8; - border-top: 0px; -} -.group1 .groupSearchDetails { - border: 1px solid #94C632; - border-top: 0px; -} -#searchHolder .group0 { - border-top : 1px solid #D8D7D8; - background:url(../images/gradient_grey.gif) repeat-y; -} -#searchHolder .group1 { - border-top: 1px solid #94C632; - background:url(../images/gradient_green.gif) repeat-y; -} -#searchHolder .group { - margin-bottom: 10px; -} -.searchGroups { - margin-bottom: 10px; - font-size: 125%; -} -.searchGroups .searchGroupDetails { - float: right; -} - - -/* Browse Lists */ -.browseNav { - font-size:90%; - background-color:#fff; - width: 215px; - border: 1px solid; - height: 300px; - overflow: scroll; -} -.browseNav ul { - width: 100%; - display:block; - list-style:none; - margin: 0; - padding: 0; -} -.browseNav li { - width: 100%; - display:block; -} -.browseNav a { - display:block; - background:url(../images/tabs_bg.jpg) repeat-x right top; - padding:.7em 1em .7em 1em; - text-decoration:none; - /* - border-top: 1px solid #ccc; - border-left: 1px solid #eee; - border-right: 1px solid #ccc; - */ - color:#333; -} -.browseNav a:hover { - color: #0066CC; - background:url(../images/tabs_hover_bg.jpg) repeat-x right top; -} -.browseNav .active a:hover { - background:url(../images/tab_active_bg.jpg) repeat-x right top; -} -.browseNav a.first { - border-left: 1px solid #ccc; -} -.browseNav .active a { - background-image:url(../images/tab_active_bg.jpg); - color:#000; -} -.browseNav a.viewRecords { - float:right; - display:table; - font-size:80%; - height:100%; - padding:5px 8px; - background:rgba(255,255,255,.3); - margin-left:3px; -} -.browseNav a.viewRecords:hover { - background:rgba(255,255,255,.6); -} - -/** Google search **/ -#searchcontrol .gsc-control { - width: 100%; -} - -/** Solr record editor */ -div.fieldValue { - width: 500px; - overflow: auto; -} - -/** system unavailable and other fatal error pages */ -div.unavailable, div.fatalError { - width: 65%; - margin:5em auto 5em auto; - padding: 2em 5em; - border-radius: 5px 5px 5px 5px; - -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; - font-size:125%; -} -div.debug code { - font-size: x-small; -} - -/** Open Library Subjects **/ -.olSubjectImage { - width:36px; - border: 1px solid black -} - -.olSubjectCover { - float:left; - margin-right: 10px; -} - -.olSubjectAuthor { - color:black; - display:block; -} - -.olSubjectMore { - text-align:right; - text-decoration:none; -} - -/* Grid View */ - -.hitCount { - position: absolute; - bottom: 0px; -} - -.viewButtons { - text-align: right; - margin-bottom: 2px; -} -.viewButtons a { - text-decoration:none; -} -.viewButtons span { - padding: 2px; -} -.viewButtons img, .viewButtons span { - border:1px solid transparent; - border-radius:3px; -} -.viewButtons .selected { - border-color:orange; -} - -.gridImageBox { - text-align:center; - width:155px; - height:130px; - overflow:hidden; - display:block; -} - -.gridImage{ - height:130px; -} - -.gridTitleBox { - height:55px; - display:block; - text-align:center; - font-size:86%; - width:155px; -} - -.gridTitle { - display:block; - height:40px; - overflow:hidden; - line-height:1.2em; -} - -td.gridCell { - width: 25%; -} - -tr:nth-child(even) td.gridCell {background-color:white;} - -/* These two separate styles cannot be combined; they are both needed for - cross-browser support. */ -tr:nth-child(even) td.gridMouseOver { - background-color:#f5f5f5; -} -.gridMouseOver { - background-color:#f5f5f5; -} - -/* Result Limit */ -#limit { - margin-bottom: 2px; -} - -.limitSelect { - text-align: right; -} - -/* Lightbox-specific tweaks */ -#modalDialog div.record { - padding:0; -} -#modalDialog .hideinlightbox { - display: none; -} - -/************************* COLLECTIONS PAGE ************************/ -.disambiguationDiv { - background-color: #FFF; - padding: 20px; -} - -.disambiguationDiv h1 { - font-size: 2em; -} - -#disambiguationItemsDiv { - padding: 5px; - margin-bottom: 30px; -} - -.disambiguationItem { - background-color: #EEEEEE; -} - -.disambiguationItem.alt { - background-color: #FFF; -} - -.collectionDetails { - background-color: #FFF; - padding:20px 1em 1em 1em; - border: 2px solid #EEEEEE; - margin-top: -2px; - margin-bottom: 20px; -} - -.collectionDetails form { - border: 1px solid #EEEEEE; -} - -.collectionDetails .sortSelector { - border: 0px solid #FFF; - float: right; -} - -.collectionDetails li.result { - background-color: #EEEEEE; - margin-bottom: 0px; -} - -.collectionDetails li.result.alt { - background-color: #FFF; - margin-bottom: 0px; -} - -.collectionDetails .pagination span { - border: 1px solid #EEEEEE; - padding-left: 4px; - padding-right: 4px; -} - -.collectionDetails .paginationTop .pagination { - text-align: center; - margin-top: 5px; - margin-bottom: 8px; - padding-bottom: 0; - padding-top: 0; -} - -.collectionDetails .paginationTop .pagination span { - border: 1px solid #EEEEEE; - font-weight: bold; - padding-left: 4px; - padding-right: 4px; - margin-left: 3px; -} - -.collectionDetails .paginationTop .pagination a:hover { - border: 1px solid #EEEEEE; -} - -.collectionDetails .paginationTop .pagination a { - border: 1px solid #FFF; - padding-left: 4px; - padding-right: 4px; - margin-left: 3px; -} - -.collectionDetails .viewButtons { - float:right; - margin-right:10px; -} - -.collectionBrowseResult { - padding: 0 0.5em 0.5em; - border-top: solid 1px #EEEEEE; -} - -.collectionBrowseEntry.listBrowse.alt { - background-color:#EEEEEE; -} - -.collectionBrowseHeading { - float: left; - width: 80%; - padding: 0.5em; -} - -.collectionBrowseCount { - padding: 0.5em; - float: right; -} - -/* Rss Recommendations */ -div.suggestionHeader { - min-height:30px; - padding-top: 5px; - border: 2px solid #EEE; -} - -div.submenuSuggestion { - margin-top: 10px; -} - -.submenuSuggestion h4 { - font-family: Georgia,"Times New Roman",Serif; - color: #7c1416; - padding-top:12px; -} - -.suggestionLogo { - float:right; - margin-bottom:2px; -} -.suggestionWhatsThis { - color: #7C1416; - font-family: Georgia,"Times New Roman",Serif; - font-size: 10px; - float:right; - clear:right; -} -.suggestedResult { - background-color:#EEEEEE; - padding:10px 0px 10px 0px; -} -.suggestedResult.alt { - background-color:#FFF; -} - -ul.suggestion { - border: 0px solid #EEE; - list-style: none; - margin: 0px; - padding-left: 0px; - padding-right: 0px; -} -ul.suggestion li{ - padding-left: 4px; - padding-right: 4px; -} - -/* Europeana recommendation images */ -.europeanaImage { - width:65px; - border: 1px solid white; -} - -.europeanaImg { - float:left; - margin-right: 10px; -} - -/* Google map */ -.mapClusterToggle{ - position: relative; - float: right; - top: -474px; - left: -92px; - width: 63px; - height: 19px; - background-color: #FFF; - padding: 0px 4px 0px 4px; - border:1px solid #CDF; - border-radius:1px; - box-shadow:2px 2px 3px #788; - background-image: linear-gradient(bottom, rgb(238,238,238) 0%, rgb(255,255,255) 100%); - background-image: -o-linear-gradient(bottom, rgb(238,238,238) 0%, rgb(255,255,255) 100%); - background-image: -moz-linear-gradient(bottom, rgb(238,238,238) 0%, rgb(255,255,255) 100%); - background-image: -webkit-linear-gradient(bottom, rgb(238,238,238) 0%, rgb(255,255,255) 100%); - background-image: -ms-linear-gradient(bottom, rgb(238,238,238) 0%, rgb(255,255,255) 100%); -} -.mapClusterToggle input { - vertical-align:top; -} -.mapClusterToggle label { - vertical-align:middle; -} -.mapInfoWrapper{ - min-width: 450px; - max-width: 450px; - overflow: hidden; - display: block; - max-height: 275px; -} -.mapInfoResult { - min-width: 440px; - max-width: 440px; - background-color:#EEEEEE; - padding:2px 2px 2px 2px; -} -.mapInfoResult.alt { - background-color:#FFF; -} -.mapSeeAllDiv{ - font-size:1.2em; - font-weight: bold; - text-align:center; -} -.mapInfoResults{ - float: left; - border:1px solid #EEEEEE; -} -.mapInfoResultThumb { - float: right; -} -.mapInfoResultThumbImg { - height: 32px; - width: 32px; -} -/************pubdate_vis timeline**********/ -.dateVisClear { - background-color: #FFF; - border: 2px solid #545454; - position: absolute; - left: 6px; top: 6px; - height: 20px; - padding-left: 5px; - padding-right: 5px; -} - -/* table for displaying full status in result list */ -table.summHoldings { - font-size: smaller; - margin-bottom: .5em; -} -table.summHoldings th { - padding: 0; - color: #666666; - border-bottom: 1px solid #999999; -} -table.summHoldings td { - background: inherit !important; - padding: 0; -} -table.summHoldings .locationColumn { - width: 50%; -} -table.summHoldings .callnumColumn { - width: 30%; -} -table.summHoldings .statusColumn { - width: 20%; -} -a.summHoldings { - font-size: smaller; -} -/*****************contextHelp*******************/ - -table#contextHelp td, table#contextHelp tr { - padding: 0; -} - -table#contextHelp { - z-index: 1; - display: none; - position: absolute; - border-spacing: 0; - border-collapse: collapse; - max-width: 400px; - top: 0; -} -table#contextHelp tr.top td, table#contextHelp tr.bottom td { - background-image: url(../images/contextHelp.png); - background-repeat: repeat-x; - height: 9px; -} -table#contextHelp tr.top td.left { - background-position: 0 0; - width: 4px; -} -table#contextHelp tr.top td.center { - background-position: 0 100%; -} -table#contextHelp tr.top td.right { - background-position: -4px 0; - width: 4px; -} -table#contextHelp tr.bottom td.left { - background-position: -12px 0; - width: 4px; -} -table#contextHelp tr.bottom td.center { - background-position: 0 -9px; -} -table#contextHelp tr.bottom td.right { - background-position: -8px 0; - width: 4px; -} -table#contextHelp tr.middle td{ - background: #ededed; -} -table#contextHelp td.body { - padding: 12px 10px; - background: #ededed; -} -table#contextHelp td.body h2 { - font-size: 1.4em; - margin-bottom: 5px; - color: #2D4687; - font-weight: bold; -} -table#contextHelp a { - color: #04778E; - /*border-bottom: solid 1px #ACD4DB;*/ - text-decoration: underline; - font-weight: bold; -} -table#contextHelp a:hover { - color: #024A59; - /*border-color: #82A1A5;*/ -} -table#contextHelp div.arrow { - height: 6px; - background-image: url(../images/contextHelp-arrow.png); - background-repeat: no-repeat; - margin: 0 15px; -} -table#contextHelp div.arrow.down { - background-position: 0 -6px; - margin-top: 3px; -} -table#contextHelp div.arrow.up { - background-position: 0 0; - margin-bottom: 3px; -} -table#contextHelp p { - font-size: 0.9em; - text-align: left; - font-weight: bold; -} -table#contextHelp p.separator { - background: url(../images/dashed-line-grey.gif) 0 top repeat-x scroll; - margin-top:15px; - padding-top:15px; -} -div#closeContextHelp { - float: right; - width: 16px; - height: 16px; - margin-top: -6px; - margin-right:-4px; - background: url(../images/cross-stack.png) 0 0; - cursor: pointer; -} -div#closeContextHelp:hover { - background-position: 0 -16px; -} -div#closeContextHelp:active { - background-position: 0 -32px; -} - -.sysInfo { - margin: 0 auto; - padding: 1em; - background-color: #FFEF8F; - border: 2px solid #F9DD34; - border-radius: 5px 5px 5px 5px; -} -.confirmDialog { - margin: auto; -} -.confirmDialog form { - display:inline-block; - float: center; -} - -.mobileViewLink { - width:100%; - padding:10px; - background-color: #FDD5A3; - border: solid 2px #E77825; - font-size:24px; -} - -/* Make sure COinS information is invisible */ -.Z3988 { - display: none; -} - -#hierarchyTreeHolder, #hierarchyRecordHolder { - background-color: #FFF; - padding: 0.5em; -} - -#hierarchyTreeHolder { - border: 1px solid #DCDCDC; -} - -.collectionDetailsTree #hierarchyTreeHolder, .collectionDetailsTree #hierarchyRecordHolder { - border-top: 0; -} - -#hierarchyTree, #hierarchyRecord { - padding: 0.5em 0.5em 0.5em 0; - max-height:375px; - min-height:375px; - overflow: hidden; - overflow-y: auto; -} - -#hierarchyRecord { - overflow: auto; -} - -#hierarchyRecord th { - width: 12em; -} - -#treeSearch { - display:none; - float: right; - width: 100%; - border: 1px solid #DCDCDC; -} - -#treeSearch #treeSearchText{ - display:block; - float:right; - margin: 1px 0px 0px 0px; -} - -#treeSearch #search { - display:block; - float:right; - margin-bottom: 0px; -} - -#treeSearch #treeSearchType { - display:block; - float:right; - margin:2px 4px 0px 4px; -} - -#treeSearch #treeSearchNoResults { - display:none; - float:left; - color: #AF1B0A; - margin:3px 0px 0px 5px; -} - -#treeSearch #treeSearchLoadingImg { - display:none; - float:right; - margin:3px 4px 4px 5px; -} - -#treeSearchLimitReached { - display:none; - color: #AF1B0A; - margin:3px 0px 0px 5px; -} - -#modalDialog #hierarchyTree { - max-height: 100%; - min-height: 100%; - overflow: auto; - overflow-y: auto; -} - -#hierarchyTree ul { - list-style-type: none; - margin: 0; - padding: 0; -} - -.tree { - background-image:url(../images/fugue/tree.png); - background-repeat:no-repeat; - background-position: left; - padding:.5em .5em .5em 20px; - margin-right:1em; -} - -.currentTree, .hierarchyTreeLinkText { - background-image:url(../images/fugue/treeCurrent.png); - background-repeat:no-repeat; - background-position: left; - padding:.5em .5em .5em 20px; - margin-right:1em; -} - -#hierarchyTree #treeList li { - background-image:url(../images/fugue/treeItem.png); - background-repeat: no-repeat; - padding: 0.25em 0 0 23px; - background-position: 0 0.25em; -} - -#hierarchyTree #treeList li.currentRecord { - background-image:url(../images/fugue/treeItemCurrent.png); - background-repeat: no-repeat; - padding: 0.25em 0 0 23px; - background-position: 0 0.25em; -} - -#hierarchyTree #treeList li.hierarchy { - background-image:url(../images/fugue/collection.png); - background-repeat: no-repeat; - padding: 0.25em 0 0 23px; - background-position: 0 0.25em; -} - -#hierarchyTree #treeList li.currentHierarchy { - background-image:url(../images/fugue/collectionCurrent.png); - background-repeat: no-repeat; - padding: 0.25em 0 0 23px; - background-position: 0 0.25em; -} - -#hierarchyTree #treeList li.currentHierarchy > a, #hierarchyTree #treeList li.currentRecord > a { - color: #000; - font-weight: bold; -} - -#toggleTree { - background-image:url(../images/fugue/treeCurrent.png); - background-repeat: no-repeat; - padding: 0.25em 0 0 23px; - background-position: 0 0.25em; -} - -#treeSelector { - background-color: #FAFAFA; - border: 1px solid #DCDCDC; - border-bottom: 0 none; - padding: 0.25em; -} - -.collectionDetailsTree #treeSelector { - background-color: #FAFAFA; - border: 1px solid #DCDCDC; - border-top: 0 none; - padding: 0.25em; -} - -#treeSelector a { - margin-right: 1em; -} - -.jstree-highlight { - font-weight: bold; -} - -/* hides the div so that only people with JavaScript will see the tab */ -div.slideOutForm { - display: none; -} - -/* stylizes the feedback tab div */ -.slide-out-div { - padding: 20px; - width: 270px; - height: 300px; - background: #6B8F25; - border: 1px solid #000000; - z-index: 9; - color: white; -} - -/* larger font size for "send us your feedback" */ -p.feedbackHeader { - font-size: 1.4em; -} - -/* this is used to change the properties of errors in the feedback tab */ -#contact_form .error { - padding: .1em; - line-height: 2.5; -} - -#contact_form .invalid { - background-color: white; -} - -/* changes the text on the feedback home page */ -.feedbackPageLabel { - color: black; -} - -/* These two sections change the colors of the selected and unselected text fields */ -.feedbackSelect { - background: #D6FFAD; -} - -.feedbackDeselect { - background: #FFFFFF; -} - -/* Creates and positions the new handle on the feedback form */ -div.handle { - cursor:pointer; - text-decoration: none; -} - -#feedbackTabBox { - margin-top: 0px; - margin-left: 0px; - - width:30px; - height:86px; - background-color:#6B8F25; - overflow: visible; - border-right: solid 1px black; - border-bottom: solid 1px black; - border-top: solid 1px black; - - padding: 0; - position: relative; -} - -#feedbackTabText { - transform:rotate(-90deg); - -ms-transform:rotate(-90deg); /* IE 9 */ - -webkit-transform:rotate(-90deg); /* Safari and Chrome */ - -o-transform: rotate(-90deg); /* Opera */ - -moz-transform: rotate(-90deg); /*Firefox*/ - width: 86px; - height: 30px; - margin-top: -58px; - margin-left: -28px; - position: relative; - text-indent: 0; - text-align: center; - color: white; - font: bold 15px/30px 'lucida sans', 'trebuchet MS', 'Tahoma'; - z-index: 10; -} - -.searchTabNav { - border-bottom:1px solid #619144; - display:table; - list-style:none; - padding:0 10px 1px 10px; -} -.searchTabNav li { - background:#EFD; - border:1px solid #619144; - display:inline; - font-size:10pt; - margin:0 1px; - padding:3px 6px; - text-align:center; - width:60px; -} -.searchTabNav li.active { - background:#FFF; - border-bottom:1px solid #FFF; -} -.searchTabNav li.active a { - color:#000; - text-decoration:none; -} - -.combinedResult { - width: 47%; - margin: 5px; - padding: 5px; - float: left; - border: 1px solid #eee; -} - -.combinedResult .span-4, .combinedResult ul.recordSet .recordNumber { - display: none; -} - -.combinedResult .span-9 { - width: 330px; -} - -.combinedResult .span-2 { - clear: left; - float: left; -} - -.combinedResult .more_link { - text-align: center; - border-top: 1px solid #eee; -} - -.authmethod0 { - width:47%; - float:left; - padding:1%; - border-right:1px solid rgb(204, 204, 204); -} - -.authmethod1 { - width:47%; - float:left; - padding:1%; - border-left:1px solid rgb(204, 204, 204); - margin:-1px; /* keep the borders on top of one another; longest one will win */ -} - -#authcontainer { - float:left; - width:100%; -} - -/* Admin styling */ -.tagForm select { - width:200px; -} - -/********** Styles for results visualizations **********/ - -#visualResults .node { - border: solid 1px white; - font: 10px sans-serif; - line-height: 12px; - overflow: hidden; - position: absolute; - margin:-1px; -} - -#visualResults .node div { - margin-left: 3px; - margin-top: 0px; -} - -#visualResults .toplevel {border: 2px solid black;} - -#visualResults .label { - display: block; - line-height: 1; - padding: 2px; - background: rgba(0, 0, 0, 0.2); - color: #000000; - border-radius: 2px; - z-index: 200; - position: absolute; - bottom: 0; - right: 0; -} - -#visualResults .notalabel {color: #000000;} - -#viz-instructions {padding-top:600px;} - -#gbsViewer { - margin:25px 0px 50px 25px; - width: 90%; - height: 600px; -} diff --git a/themes/blueprint/css/vudl.css b/themes/blueprint/css/vudl.css deleted file mode 100644 index cee20e59b84..00000000000 --- a/themes/blueprint/css/vudl.css +++ /dev/null @@ -1,161 +0,0 @@ -/** GENERAL **/ -div.main { - padding-top:2px; -} -.inspector_container,.bottom { - position:relative; - clear:both; -} - -/** SIDE BAR **/ -.side_nav { - display:table; - position:relative; - float:left; - width:150px; - text-align:center; - border-right:5px solid #EEE; - padding:9px 5px 0 0; - margin:3px 0 0 0; - overflow:hidden; -} -.side_nav a.top { - float:left; - display:inline-block; - width:50%; - height:20px; - padding:6px 0 0 0; - margin:0 0 4px 0; -} -.side_nav a.top.selected { - color:#060; - text-decoration:none; - border-top:3px solid #AB6; - cursor:default; - padding:3px 0 0 0; - font-weight:bold; -} -.side-loading { - display:block; - background:#EEE; - border-radius:3px; - margin:6px 2px 0 0; -} -.page_list { - clear:both; - display:block; - width:150px; - height:100%; - margin:0; - padding:0; - overflow-y:scroll; -} - -/** PAGE AND DOC ICONS **/ -.page_link { - clear:both; - display:block; - text-align:center; - padding:10px 2px; - margin:3px 0; - border-radius:3px; - cursor:pointer; - width:125px; -} -.page_link:not(.selected):hover { - background:#EEE; -} -.page_list .selected,.doc_list .selected { - background:#E6EFC2; - border: 2px solid #C6D880; - border-radius: 5px; - -moz-border-radius: 5px; - padding:8px 0; - cursor:default; -} -.page_link img,.page_link div { - display:block; - margin:3px auto; -} -.doc_list .pdf { - background:url('../images/small/pdf.png'); - width:70px; - height:87px; -} -.doc_list .doc { - background:url('../images/small/doc.png'); - width:116px; - height:85px; -} - -/** MAIN VIEW **/ -.view { - display:block; - float:right; - width:756px; - padding:0 5px; - margin:0; -} -.view .navigation { - display:block; - width:100%; - margin:0 0 1px 0; - padding:0; - border-bottom:1px solid #C6D880; - text-align:center; -} -.view .navigation a { - display:inline-block; - padding:0; - width:144px; - padding:10px 0; - text-align:center; - border:1px solid #C6D880; - border-bottom:0; - margin:0 1px; - cursor:pointer; -} -.view .navigation a.selected { - background:#E6EFC2; - padding:13px 0 10px 0; - color:#060; - text-decoration:none; - font-weight:bold; -} -.preview { - overflow-y:auto; -} -#preview { - display:block; - max-width:100%; - margin:auto; -} - -/** VARIOUS VIEWS **/ -.information { - padding:0 2em; - font-size:12pt; -} -.information p { - margin:0 2em; - text-indent:-1em; -} -.information h2 { - text-align:center; - text-indent:0; -} -.zoomFrame { - width:754px; - height:700px; - position:relative; -} - -/** INSPECTOR IMAGES **/ -.turn_left,.turn_right { - width:32px; - height:32px; - background:url('../images/rotate_anticlockwise.png'); -} -.turn_right { - background:url('../images/rotate_clockwise.png'); -} \ No newline at end of file diff --git a/themes/blueprint/images/.htaccess b/themes/blueprint/images/.htaccess deleted file mode 100644 index d96fae1a2e7..00000000000 --- a/themes/blueprint/images/.htaccess +++ /dev/null @@ -1,3 +0,0 @@ - - RewriteEngine Off - diff --git a/themes/blueprint/images/1.gif b/themes/blueprint/images/1.gif deleted file mode 100644 index f47a0ae4730..00000000000 Binary files a/themes/blueprint/images/1.gif and /dev/null differ diff --git a/themes/blueprint/images/2.gif b/themes/blueprint/images/2.gif deleted file mode 100644 index b400fd7ce99..00000000000 Binary files a/themes/blueprint/images/2.gif and /dev/null differ diff --git a/themes/blueprint/images/3.gif b/themes/blueprint/images/3.gif deleted file mode 100644 index 74582c6d8fc..00000000000 Binary files a/themes/blueprint/images/3.gif and /dev/null differ diff --git a/themes/blueprint/images/4.gif b/themes/blueprint/images/4.gif deleted file mode 100644 index f05c24d5432..00000000000 Binary files a/themes/blueprint/images/4.gif and /dev/null differ diff --git a/themes/blueprint/images/5.gif b/themes/blueprint/images/5.gif deleted file mode 100644 index f6a4bb71244..00000000000 Binary files a/themes/blueprint/images/5.gif and /dev/null differ diff --git a/themes/blueprint/images/EDS/PT_Sprite.png b/themes/blueprint/images/EDS/PT_Sprite.png deleted file mode 100644 index 64225908ea4..00000000000 Binary files a/themes/blueprint/images/EDS/PT_Sprite.png and /dev/null differ diff --git a/themes/blueprint/images/EDS/sprites_32.png b/themes/blueprint/images/EDS/sprites_32.png deleted file mode 100644 index 1ac5486a821..00000000000 Binary files a/themes/blueprint/images/EDS/sprites_32.png and /dev/null differ diff --git a/themes/blueprint/images/ajax_loading.gif b/themes/blueprint/images/ajax_loading.gif deleted file mode 100644 index d42f72c7236..00000000000 Binary files a/themes/blueprint/images/ajax_loading.gif and /dev/null differ diff --git a/themes/blueprint/images/bg_authorbox.jpg b/themes/blueprint/images/bg_authorbox.jpg deleted file mode 100644 index cb7efb1d325..00000000000 Binary files a/themes/blueprint/images/bg_authorbox.jpg and /dev/null differ diff --git a/themes/blueprint/images/bg_body.jpg b/themes/blueprint/images/bg_body.jpg deleted file mode 100644 index 4ff574fef12..00000000000 Binary files a/themes/blueprint/images/bg_body.jpg and /dev/null differ diff --git a/themes/blueprint/images/bg_breadcrumb.png b/themes/blueprint/images/bg_breadcrumb.png deleted file mode 100644 index 748a53ee20b..00000000000 Binary files a/themes/blueprint/images/bg_breadcrumb.png and /dev/null differ diff --git a/themes/blueprint/images/bullet_green.png b/themes/blueprint/images/bullet_green.png deleted file mode 100644 index 058ad261f52..00000000000 Binary files a/themes/blueprint/images/bullet_green.png and /dev/null differ diff --git a/themes/blueprint/images/bullet_red.png b/themes/blueprint/images/bullet_red.png deleted file mode 100644 index 0cd80311583..00000000000 Binary files a/themes/blueprint/images/bullet_red.png and /dev/null differ diff --git a/themes/blueprint/images/contextHelp-arrow.png b/themes/blueprint/images/contextHelp-arrow.png deleted file mode 100644 index 6a62a447a03..00000000000 Binary files a/themes/blueprint/images/contextHelp-arrow.png and /dev/null differ diff --git a/themes/blueprint/images/contextHelp.png b/themes/blueprint/images/contextHelp.png deleted file mode 100644 index fbb82ee2639..00000000000 Binary files a/themes/blueprint/images/contextHelp.png and /dev/null differ diff --git a/themes/blueprint/images/cross-stack.png b/themes/blueprint/images/cross-stack.png deleted file mode 100644 index 2b378cf8f36..00000000000 Binary files a/themes/blueprint/images/cross-stack.png and /dev/null differ diff --git a/themes/blueprint/images/dialog_loading.gif b/themes/blueprint/images/dialog_loading.gif deleted file mode 100644 index 0ca7ada9605..00000000000 Binary files a/themes/blueprint/images/dialog_loading.gif and /dev/null differ diff --git a/themes/blueprint/images/ebook.png b/themes/blueprint/images/ebook.png deleted file mode 100644 index 6535ad8e5a2..00000000000 Binary files a/themes/blueprint/images/ebook.png and /dev/null differ diff --git a/themes/blueprint/images/europeana.eu.png b/themes/blueprint/images/europeana.eu.png deleted file mode 100644 index 0e09113d028..00000000000 Binary files a/themes/blueprint/images/europeana.eu.png and /dev/null differ diff --git a/themes/blueprint/images/fugue/bookbag.png b/themes/blueprint/images/fugue/bookbag.png deleted file mode 100644 index 223e889eb13..00000000000 Binary files a/themes/blueprint/images/fugue/bookbag.png and /dev/null differ diff --git a/themes/blueprint/images/fugue/bookbagAdd.png b/themes/blueprint/images/fugue/bookbagAdd.png deleted file mode 100644 index 2398cd9d3eb..00000000000 Binary files a/themes/blueprint/images/fugue/bookbagAdd.png and /dev/null differ diff --git a/themes/blueprint/images/fugue/bookbagDelete.png b/themes/blueprint/images/fugue/bookbagDelete.png deleted file mode 100644 index 21a2243339b..00000000000 Binary files a/themes/blueprint/images/fugue/bookbagDelete.png and /dev/null differ diff --git a/themes/blueprint/images/fugue/bookbagEmpty.png b/themes/blueprint/images/fugue/bookbagEmpty.png deleted file mode 100644 index 65c2fc83fd9..00000000000 Binary files a/themes/blueprint/images/fugue/bookbagEmpty.png and /dev/null differ diff --git a/themes/blueprint/images/fugue/checkRequest.png b/themes/blueprint/images/fugue/checkRequest.png deleted file mode 100644 index 4362dcbf3b6..00000000000 Binary files a/themes/blueprint/images/fugue/checkRequest.png and /dev/null differ diff --git a/themes/blueprint/images/fugue/collection.png b/themes/blueprint/images/fugue/collection.png deleted file mode 100644 index 320e701ae15..00000000000 Binary files a/themes/blueprint/images/fugue/collection.png and /dev/null differ diff --git a/themes/blueprint/images/fugue/collectionCurrent.png b/themes/blueprint/images/fugue/collectionCurrent.png deleted file mode 100644 index 97326696703..00000000000 Binary files a/themes/blueprint/images/fugue/collectionCurrent.png and /dev/null differ diff --git a/themes/blueprint/images/fugue/cross-small.png b/themes/blueprint/images/fugue/cross-small.png deleted file mode 100644 index 53c3a71b259..00000000000 Binary files a/themes/blueprint/images/fugue/cross-small.png and /dev/null differ diff --git a/themes/blueprint/images/fugue/holdBlocked.png b/themes/blueprint/images/fugue/holdBlocked.png deleted file mode 100644 index a4a414b5cfd..00000000000 Binary files a/themes/blueprint/images/fugue/holdBlocked.png and /dev/null differ diff --git a/themes/blueprint/images/fugue/holdCancel.png b/themes/blueprint/images/fugue/holdCancel.png deleted file mode 100644 index 38558b29b4b..00000000000 Binary files a/themes/blueprint/images/fugue/holdCancel.png and /dev/null differ diff --git a/themes/blueprint/images/fugue/holdCancelAll.png b/themes/blueprint/images/fugue/holdCancelAll.png deleted file mode 100644 index 3f93371db6b..00000000000 Binary files a/themes/blueprint/images/fugue/holdCancelAll.png and /dev/null differ diff --git a/themes/blueprint/images/fugue/holdPlace.png b/themes/blueprint/images/fugue/holdPlace.png deleted file mode 100644 index b001bb73586..00000000000 Binary files a/themes/blueprint/images/fugue/holdPlace.png and /dev/null differ diff --git a/themes/blueprint/images/fugue/qrcode.png b/themes/blueprint/images/fugue/qrcode.png deleted file mode 100644 index c2cfa4765ab..00000000000 Binary files a/themes/blueprint/images/fugue/qrcode.png and /dev/null differ diff --git a/themes/blueprint/images/fugue/renew.png b/themes/blueprint/images/fugue/renew.png deleted file mode 100644 index a502793fb1c..00000000000 Binary files a/themes/blueprint/images/fugue/renew.png and /dev/null differ diff --git a/themes/blueprint/images/fugue/renewAll.png b/themes/blueprint/images/fugue/renewAll.png deleted file mode 100644 index 92506b6cc23..00000000000 Binary files a/themes/blueprint/images/fugue/renewAll.png and /dev/null differ diff --git a/themes/blueprint/images/fugue/tick-small.png b/themes/blueprint/images/fugue/tick-small.png deleted file mode 100644 index a110aef9330..00000000000 Binary files a/themes/blueprint/images/fugue/tick-small.png and /dev/null differ diff --git a/themes/blueprint/images/fugue/tree.png b/themes/blueprint/images/fugue/tree.png deleted file mode 100644 index d0b534db872..00000000000 Binary files a/themes/blueprint/images/fugue/tree.png and /dev/null differ diff --git a/themes/blueprint/images/fugue/treeCurrent.png b/themes/blueprint/images/fugue/treeCurrent.png deleted file mode 100644 index dc4d5008d17..00000000000 Binary files a/themes/blueprint/images/fugue/treeCurrent.png and /dev/null differ diff --git a/themes/blueprint/images/fugue/treeItem.png b/themes/blueprint/images/fugue/treeItem.png deleted file mode 100644 index 13cb0a63c69..00000000000 Binary files a/themes/blueprint/images/fugue/treeItem.png and /dev/null differ diff --git a/themes/blueprint/images/fugue/treeItemCurrent.png b/themes/blueprint/images/fugue/treeItemCurrent.png deleted file mode 100644 index 78918c872c4..00000000000 Binary files a/themes/blueprint/images/fugue/treeItemCurrent.png and /dev/null differ diff --git a/themes/blueprint/images/gradient_green.gif b/themes/blueprint/images/gradient_green.gif deleted file mode 100644 index fa0e0c802b0..00000000000 Binary files a/themes/blueprint/images/gradient_green.gif and /dev/null differ diff --git a/themes/blueprint/images/gradient_grey.gif b/themes/blueprint/images/gradient_grey.gif deleted file mode 100644 index 526e8c50dfc..00000000000 Binary files a/themes/blueprint/images/gradient_grey.gif and /dev/null differ diff --git a/themes/blueprint/images/loading.gif b/themes/blueprint/images/loading.gif deleted file mode 100644 index 471c1a4f93f..00000000000 Binary files a/themes/blueprint/images/loading.gif and /dev/null differ diff --git a/themes/blueprint/images/preview_ht.gif b/themes/blueprint/images/preview_ht.gif deleted file mode 100644 index 289a45854e5..00000000000 Binary files a/themes/blueprint/images/preview_ht.gif and /dev/null differ diff --git a/themes/blueprint/images/preview_ol.gif b/themes/blueprint/images/preview_ol.gif deleted file mode 100644 index 51ae53f7aba..00000000000 Binary files a/themes/blueprint/images/preview_ol.gif and /dev/null differ diff --git a/themes/blueprint/images/rotate_anticlockwise.png b/themes/blueprint/images/rotate_anticlockwise.png deleted file mode 100644 index 204535a3e1f..00000000000 Binary files a/themes/blueprint/images/rotate_anticlockwise.png and /dev/null differ diff --git a/themes/blueprint/images/rotate_clockwise.png b/themes/blueprint/images/rotate_clockwise.png deleted file mode 100644 index 9d9f34876f2..00000000000 Binary files a/themes/blueprint/images/rotate_clockwise.png and /dev/null differ diff --git a/themes/blueprint/images/silk/add.png b/themes/blueprint/images/silk/add.png deleted file mode 100644 index 6332fefea4b..00000000000 Binary files a/themes/blueprint/images/silk/add.png and /dev/null differ diff --git a/themes/blueprint/images/silk/application_add.png b/themes/blueprint/images/silk/application_add.png deleted file mode 100644 index 2e945076cf7..00000000000 Binary files a/themes/blueprint/images/silk/application_add.png and /dev/null differ diff --git a/themes/blueprint/images/silk/bin.png b/themes/blueprint/images/silk/bin.png deleted file mode 100644 index ebad933c8b3..00000000000 Binary files a/themes/blueprint/images/silk/bin.png and /dev/null differ diff --git a/themes/blueprint/images/silk/book.png b/themes/blueprint/images/silk/book.png deleted file mode 100644 index b0f4dd7928c..00000000000 Binary files a/themes/blueprint/images/silk/book.png and /dev/null differ diff --git a/themes/blueprint/images/silk/book_link.png b/themes/blueprint/images/silk/book_link.png deleted file mode 100644 index dd0820e86d0..00000000000 Binary files a/themes/blueprint/images/silk/book_link.png and /dev/null differ diff --git a/themes/blueprint/images/silk/book_open.png b/themes/blueprint/images/silk/book_open.png deleted file mode 100644 index 7d863f94974..00000000000 Binary files a/themes/blueprint/images/silk/book_open.png and /dev/null differ diff --git a/themes/blueprint/images/silk/box.png b/themes/blueprint/images/silk/box.png deleted file mode 100644 index 8443c23eb94..00000000000 Binary files a/themes/blueprint/images/silk/box.png and /dev/null differ diff --git a/themes/blueprint/images/silk/bullet_green.png b/themes/blueprint/images/silk/bullet_green.png deleted file mode 100644 index 058ad261f52..00000000000 Binary files a/themes/blueprint/images/silk/bullet_green.png and /dev/null differ diff --git a/themes/blueprint/images/silk/bullet_orange.png b/themes/blueprint/images/silk/bullet_orange.png deleted file mode 100644 index fa63024e55b..00000000000 Binary files a/themes/blueprint/images/silk/bullet_orange.png and /dev/null differ diff --git a/themes/blueprint/images/silk/bullet_red.png b/themes/blueprint/images/silk/bullet_red.png deleted file mode 100644 index 0cd80311583..00000000000 Binary files a/themes/blueprint/images/silk/bullet_red.png and /dev/null differ diff --git a/themes/blueprint/images/silk/cart.png b/themes/blueprint/images/silk/cart.png deleted file mode 100644 index 1baf7b9fde1..00000000000 Binary files a/themes/blueprint/images/silk/cart.png and /dev/null differ diff --git a/themes/blueprint/images/silk/cart_delete.png b/themes/blueprint/images/silk/cart_delete.png deleted file mode 100644 index ac5bce5c886..00000000000 Binary files a/themes/blueprint/images/silk/cart_delete.png and /dev/null differ diff --git a/themes/blueprint/images/silk/cart_go.png b/themes/blueprint/images/silk/cart_go.png deleted file mode 100644 index 20ee0584f61..00000000000 Binary files a/themes/blueprint/images/silk/cart_go.png and /dev/null differ diff --git a/themes/blueprint/images/silk/cart_put.png b/themes/blueprint/images/silk/cart_put.png deleted file mode 100644 index 3aec353e03f..00000000000 Binary files a/themes/blueprint/images/silk/cart_put.png and /dev/null differ diff --git a/themes/blueprint/images/silk/cart_remove.png b/themes/blueprint/images/silk/cart_remove.png deleted file mode 100644 index 360217b526d..00000000000 Binary files a/themes/blueprint/images/silk/cart_remove.png and /dev/null differ diff --git a/themes/blueprint/images/silk/cd.png b/themes/blueprint/images/silk/cd.png deleted file mode 100644 index ef4322357cb..00000000000 Binary files a/themes/blueprint/images/silk/cd.png and /dev/null differ diff --git a/themes/blueprint/images/silk/cog.png b/themes/blueprint/images/silk/cog.png deleted file mode 100644 index 67de2c6ccbe..00000000000 Binary files a/themes/blueprint/images/silk/cog.png and /dev/null differ diff --git a/themes/blueprint/images/silk/delete.png b/themes/blueprint/images/silk/delete.png deleted file mode 100644 index 08f249365af..00000000000 Binary files a/themes/blueprint/images/silk/delete.png and /dev/null differ diff --git a/themes/blueprint/images/silk/disk-black.png b/themes/blueprint/images/silk/disk-black.png deleted file mode 100644 index 8d1a21e35d0..00000000000 Binary files a/themes/blueprint/images/silk/disk-black.png and /dev/null differ diff --git a/themes/blueprint/images/silk/disk_multiple.png b/themes/blueprint/images/silk/disk_multiple.png deleted file mode 100644 index fc5a52f5e4a..00000000000 Binary files a/themes/blueprint/images/silk/disk_multiple.png and /dev/null differ diff --git a/themes/blueprint/images/silk/door_in.png b/themes/blueprint/images/silk/door_in.png deleted file mode 100644 index 41676a0a5be..00000000000 Binary files a/themes/blueprint/images/silk/door_in.png and /dev/null differ diff --git a/themes/blueprint/images/silk/door_out.png b/themes/blueprint/images/silk/door_out.png deleted file mode 100644 index 2541d2bcbc2..00000000000 Binary files a/themes/blueprint/images/silk/door_out.png and /dev/null differ diff --git a/themes/blueprint/images/silk/dvd.png b/themes/blueprint/images/silk/dvd.png deleted file mode 100644 index 9d94de5df00..00000000000 Binary files a/themes/blueprint/images/silk/dvd.png and /dev/null differ diff --git a/themes/blueprint/images/silk/edit.png b/themes/blueprint/images/silk/edit.png deleted file mode 100644 index 0bfecd50ee9..00000000000 Binary files a/themes/blueprint/images/silk/edit.png and /dev/null differ diff --git a/themes/blueprint/images/silk/email.png b/themes/blueprint/images/silk/email.png deleted file mode 100644 index 7348aed77fe..00000000000 Binary files a/themes/blueprint/images/silk/email.png and /dev/null differ diff --git a/themes/blueprint/images/silk/error.png b/themes/blueprint/images/silk/error.png deleted file mode 100644 index 628cf2dae3d..00000000000 Binary files a/themes/blueprint/images/silk/error.png and /dev/null differ diff --git a/themes/blueprint/images/silk/expand.png b/themes/blueprint/images/silk/expand.png deleted file mode 100644 index af4fe074772..00000000000 Binary files a/themes/blueprint/images/silk/expand.png and /dev/null differ diff --git a/themes/blueprint/images/silk/feed.png b/themes/blueprint/images/silk/feed.png deleted file mode 100644 index 315c4f4fa62..00000000000 Binary files a/themes/blueprint/images/silk/feed.png and /dev/null differ diff --git a/themes/blueprint/images/silk/film.png b/themes/blueprint/images/silk/film.png deleted file mode 100644 index b0ce7bb198a..00000000000 Binary files a/themes/blueprint/images/silk/film.png and /dev/null differ diff --git a/themes/blueprint/images/silk/heart.png b/themes/blueprint/images/silk/heart.png deleted file mode 100644 index d9ee53e590a..00000000000 Binary files a/themes/blueprint/images/silk/heart.png and /dev/null differ diff --git a/themes/blueprint/images/silk/help.png b/themes/blueprint/images/silk/help.png deleted file mode 100644 index 5c870176d4d..00000000000 Binary files a/themes/blueprint/images/silk/help.png and /dev/null differ diff --git a/themes/blueprint/images/silk/house.png b/themes/blueprint/images/silk/house.png deleted file mode 100644 index fed62219f57..00000000000 Binary files a/themes/blueprint/images/silk/house.png and /dev/null differ diff --git a/themes/blueprint/images/silk/key_go.png b/themes/blueprint/images/silk/key_go.png deleted file mode 100644 index 30b0dc316e5..00000000000 Binary files a/themes/blueprint/images/silk/key_go.png and /dev/null differ diff --git a/themes/blueprint/images/silk/list.png b/themes/blueprint/images/silk/list.png deleted file mode 100644 index 244e6ca045c..00000000000 Binary files a/themes/blueprint/images/silk/list.png and /dev/null differ diff --git a/themes/blueprint/images/silk/lock.png b/themes/blueprint/images/silk/lock.png deleted file mode 100644 index 2ebc4f6f966..00000000000 Binary files a/themes/blueprint/images/silk/lock.png and /dev/null differ diff --git a/themes/blueprint/images/silk/map.png b/themes/blueprint/images/silk/map.png deleted file mode 100644 index f90ef25ec7f..00000000000 Binary files a/themes/blueprint/images/silk/map.png and /dev/null differ diff --git a/themes/blueprint/images/silk/music.png b/themes/blueprint/images/silk/music.png deleted file mode 100644 index a8b3ede3df9..00000000000 Binary files a/themes/blueprint/images/silk/music.png and /dev/null differ diff --git a/themes/blueprint/images/silk/newspaper.png b/themes/blueprint/images/silk/newspaper.png deleted file mode 100644 index 6a2ecce1b85..00000000000 Binary files a/themes/blueprint/images/silk/newspaper.png and /dev/null differ diff --git a/themes/blueprint/images/silk/package.png b/themes/blueprint/images/silk/package.png deleted file mode 100644 index da3c2a2d74b..00000000000 Binary files a/themes/blueprint/images/silk/package.png and /dev/null differ diff --git a/themes/blueprint/images/silk/phone.png b/themes/blueprint/images/silk/phone.png deleted file mode 100644 index c39f162f854..00000000000 Binary files a/themes/blueprint/images/silk/phone.png and /dev/null differ diff --git a/themes/blueprint/images/silk/photo.png b/themes/blueprint/images/silk/photo.png deleted file mode 100644 index 6c2aaaaaf33..00000000000 Binary files a/themes/blueprint/images/silk/photo.png and /dev/null differ diff --git a/themes/blueprint/images/silk/picture.png b/themes/blueprint/images/silk/picture.png deleted file mode 100644 index 4a158fef7e0..00000000000 Binary files a/themes/blueprint/images/silk/picture.png and /dev/null differ diff --git a/themes/blueprint/images/silk/printer.png b/themes/blueprint/images/silk/printer.png deleted file mode 100644 index a350d187153..00000000000 Binary files a/themes/blueprint/images/silk/printer.png and /dev/null differ diff --git a/themes/blueprint/images/silk/readme.txt b/themes/blueprint/images/silk/readme.txt deleted file mode 100644 index 2cf67dcaff6..00000000000 --- a/themes/blueprint/images/silk/readme.txt +++ /dev/null @@ -1,22 +0,0 @@ -Silk icon set 1.3 - -_________________________________________ -Mark James -http://www.famfamfam.com/lab/icons/silk/ -_________________________________________ - -This work is licensed under a -Creative Commons Attribution 2.5 License. -[ http://creativecommons.org/licenses/by/2.5/ ] - -This means you may use it for any purpose, -and make any changes you like. -All I ask is that you include a link back -to this page in your credits. - -Are you using this icon set? Send me an email -(including a link or picture if available) to -mjames@gmail.com - -Any other questions about this icon set please -contact mjames@gmail.com \ No newline at end of file diff --git a/themes/blueprint/images/silk/report.png b/themes/blueprint/images/silk/report.png deleted file mode 100644 index 779ad58efc5..00000000000 Binary files a/themes/blueprint/images/silk/report.png and /dev/null differ diff --git a/themes/blueprint/images/silk/report_edit.png b/themes/blueprint/images/silk/report_edit.png deleted file mode 100644 index c61a6d84779..00000000000 Binary files a/themes/blueprint/images/silk/report_edit.png and /dev/null differ diff --git a/themes/blueprint/images/silk/report_picture.png b/themes/blueprint/images/silk/report_picture.png deleted file mode 100644 index 3a9a7e5eb91..00000000000 Binary files a/themes/blueprint/images/silk/report_picture.png and /dev/null differ diff --git a/themes/blueprint/images/silk/script.png b/themes/blueprint/images/silk/script.png deleted file mode 100644 index 0f9ed4d4830..00000000000 Binary files a/themes/blueprint/images/silk/script.png and /dev/null differ diff --git a/themes/blueprint/images/silk/script_edit.png b/themes/blueprint/images/silk/script_edit.png deleted file mode 100644 index b4d31ce282f..00000000000 Binary files a/themes/blueprint/images/silk/script_edit.png and /dev/null differ diff --git a/themes/blueprint/images/silk/sound.png b/themes/blueprint/images/silk/sound.png deleted file mode 100644 index 6056d234a98..00000000000 Binary files a/themes/blueprint/images/silk/sound.png and /dev/null differ diff --git a/themes/blueprint/images/silk/tag_blue.png b/themes/blueprint/images/silk/tag_blue.png deleted file mode 100644 index 9757fc6ed65..00000000000 Binary files a/themes/blueprint/images/silk/tag_blue.png and /dev/null differ diff --git a/themes/blueprint/images/silk/tag_yellow.png b/themes/blueprint/images/silk/tag_yellow.png deleted file mode 100644 index 83d12924ff3..00000000000 Binary files a/themes/blueprint/images/silk/tag_yellow.png and /dev/null differ diff --git a/themes/blueprint/images/silk/tick.png b/themes/blueprint/images/silk/tick.png deleted file mode 100644 index a9925a06ab0..00000000000 Binary files a/themes/blueprint/images/silk/tick.png and /dev/null differ diff --git a/themes/blueprint/images/silk/user.png b/themes/blueprint/images/silk/user.png deleted file mode 100644 index 79f35ccbdad..00000000000 Binary files a/themes/blueprint/images/silk/user.png and /dev/null differ diff --git a/themes/blueprint/images/silk/user_add.png b/themes/blueprint/images/silk/user_add.png deleted file mode 100644 index deae99bcff9..00000000000 Binary files a/themes/blueprint/images/silk/user_add.png and /dev/null differ diff --git a/themes/blueprint/images/silk/user_comment.png b/themes/blueprint/images/silk/user_comment.png deleted file mode 100644 index e54ebebafb5..00000000000 Binary files a/themes/blueprint/images/silk/user_comment.png and /dev/null differ diff --git a/themes/blueprint/images/silk/user_delete.png b/themes/blueprint/images/silk/user_delete.png deleted file mode 100644 index acbb5630e51..00000000000 Binary files a/themes/blueprint/images/silk/user_delete.png and /dev/null differ diff --git a/themes/blueprint/images/silk/user_edit.png b/themes/blueprint/images/silk/user_edit.png deleted file mode 100644 index c1974cda745..00000000000 Binary files a/themes/blueprint/images/silk/user_edit.png and /dev/null differ diff --git a/themes/blueprint/images/silk/user_gray.png b/themes/blueprint/images/silk/user_gray.png deleted file mode 100644 index 8fd539e9cb0..00000000000 Binary files a/themes/blueprint/images/silk/user_gray.png and /dev/null differ diff --git a/themes/blueprint/images/silk/user_green.png b/themes/blueprint/images/silk/user_green.png deleted file mode 100644 index 30383c2de51..00000000000 Binary files a/themes/blueprint/images/silk/user_green.png and /dev/null differ diff --git a/themes/blueprint/images/silk/user_orange.png b/themes/blueprint/images/silk/user_orange.png deleted file mode 100644 index b818127df6d..00000000000 Binary files a/themes/blueprint/images/silk/user_orange.png and /dev/null differ diff --git a/themes/blueprint/images/silk/user_red.png b/themes/blueprint/images/silk/user_red.png deleted file mode 100644 index c6f66e8b300..00000000000 Binary files a/themes/blueprint/images/silk/user_red.png and /dev/null differ diff --git a/themes/blueprint/images/silk/user_suit.png b/themes/blueprint/images/silk/user_suit.png deleted file mode 100644 index b3454e15fb6..00000000000 Binary files a/themes/blueprint/images/silk/user_suit.png and /dev/null differ diff --git a/themes/blueprint/images/silk/world.png b/themes/blueprint/images/silk/world.png deleted file mode 100644 index 68f21d30116..00000000000 Binary files a/themes/blueprint/images/silk/world.png and /dev/null differ diff --git a/themes/blueprint/images/small/Book.png b/themes/blueprint/images/small/Book.png deleted file mode 100644 index c6e7b30f6b6..00000000000 Binary files a/themes/blueprint/images/small/Book.png and /dev/null differ diff --git a/themes/blueprint/images/small/BookChapter.png b/themes/blueprint/images/small/BookChapter.png deleted file mode 100644 index ab0b9508d4f..00000000000 Binary files a/themes/blueprint/images/small/BookChapter.png and /dev/null differ diff --git a/themes/blueprint/images/small/BookReview.png b/themes/blueprint/images/small/BookReview.png deleted file mode 100644 index 369a83a2bab..00000000000 Binary files a/themes/blueprint/images/small/BookReview.png and /dev/null differ diff --git a/themes/blueprint/images/small/Dissertation.png b/themes/blueprint/images/small/Dissertation.png deleted file mode 100644 index a91cb33f87a..00000000000 Binary files a/themes/blueprint/images/small/Dissertation.png and /dev/null differ diff --git a/themes/blueprint/images/small/Journal.png b/themes/blueprint/images/small/Journal.png deleted file mode 100644 index 015762a1ce8..00000000000 Binary files a/themes/blueprint/images/small/Journal.png and /dev/null differ diff --git a/themes/blueprint/images/small/JournalArticle.png b/themes/blueprint/images/small/JournalArticle.png deleted file mode 100644 index 4f833af9bd2..00000000000 Binary files a/themes/blueprint/images/small/JournalArticle.png and /dev/null differ diff --git a/themes/blueprint/images/small/NewspaperArticle.png b/themes/blueprint/images/small/NewspaperArticle.png deleted file mode 100644 index 53e97223e01..00000000000 Binary files a/themes/blueprint/images/small/NewspaperArticle.png and /dev/null differ diff --git a/themes/blueprint/images/small/Report.png b/themes/blueprint/images/small/Report.png deleted file mode 100644 index ed2f758e4ac..00000000000 Binary files a/themes/blueprint/images/small/Report.png and /dev/null differ diff --git a/themes/blueprint/images/small/TradePublicationArticle.png b/themes/blueprint/images/small/TradePublicationArticle.png deleted file mode 100644 index 753f47a95a7..00000000000 Binary files a/themes/blueprint/images/small/TradePublicationArticle.png and /dev/null differ diff --git a/themes/blueprint/images/small/doc.png b/themes/blueprint/images/small/doc.png deleted file mode 100644 index 447826c011b..00000000000 Binary files a/themes/blueprint/images/small/doc.png and /dev/null differ diff --git a/themes/blueprint/images/small/eBook.png b/themes/blueprint/images/small/eBook.png deleted file mode 100644 index d0632f7b95e..00000000000 Binary files a/themes/blueprint/images/small/eBook.png and /dev/null differ diff --git a/themes/blueprint/images/small/pdf.png b/themes/blueprint/images/small/pdf.png deleted file mode 100644 index 15eb6dce505..00000000000 Binary files a/themes/blueprint/images/small/pdf.png and /dev/null differ diff --git a/themes/blueprint/images/subnavTab_left.jpg b/themes/blueprint/images/subnavTab_left.jpg deleted file mode 100644 index 64874ade1f6..00000000000 Binary files a/themes/blueprint/images/subnavTab_left.jpg and /dev/null differ diff --git a/themes/blueprint/images/subnavTab_right.jpg b/themes/blueprint/images/subnavTab_right.jpg deleted file mode 100644 index 1539d14ba3c..00000000000 Binary files a/themes/blueprint/images/subnavTab_right.jpg and /dev/null differ diff --git a/themes/blueprint/images/tab_active_arrow.jpg b/themes/blueprint/images/tab_active_arrow.jpg deleted file mode 100644 index 31c1836c5e8..00000000000 Binary files a/themes/blueprint/images/tab_active_arrow.jpg and /dev/null differ diff --git a/themes/blueprint/images/tab_active_bg.jpg b/themes/blueprint/images/tab_active_bg.jpg deleted file mode 100644 index 57988815080..00000000000 Binary files a/themes/blueprint/images/tab_active_bg.jpg and /dev/null differ diff --git a/themes/blueprint/images/tabs_bg.jpg b/themes/blueprint/images/tabs_bg.jpg deleted file mode 100644 index e54c7050def..00000000000 Binary files a/themes/blueprint/images/tabs_bg.jpg and /dev/null differ diff --git a/themes/blueprint/images/tabs_hover_bg.jpg b/themes/blueprint/images/tabs_hover_bg.jpg deleted file mode 100644 index 6996a02c077..00000000000 Binary files a/themes/blueprint/images/tabs_hover_bg.jpg and /dev/null differ diff --git a/themes/blueprint/images/tango/audio-volume-high.png b/themes/blueprint/images/tango/audio-volume-high.png deleted file mode 100644 index ec8f00b4ad0..00000000000 Binary files a/themes/blueprint/images/tango/audio-volume-high.png and /dev/null differ diff --git a/themes/blueprint/images/tango/bookmark_add.png b/themes/blueprint/images/tango/bookmark_add.png deleted file mode 100644 index 6cf6443a296..00000000000 Binary files a/themes/blueprint/images/tango/bookmark_add.png and /dev/null differ diff --git a/themes/blueprint/images/tango/email.png b/themes/blueprint/images/tango/email.png deleted file mode 100644 index 859251fe0fc..00000000000 Binary files a/themes/blueprint/images/tango/email.png and /dev/null differ diff --git a/themes/blueprint/images/tango/film.png b/themes/blueprint/images/tango/film.png deleted file mode 100644 index 4a71b1d66e1..00000000000 Binary files a/themes/blueprint/images/tango/film.png and /dev/null differ diff --git a/themes/blueprint/images/tango/find.png b/themes/blueprint/images/tango/find.png deleted file mode 100644 index d072d3cbe2d..00000000000 Binary files a/themes/blueprint/images/tango/find.png and /dev/null differ diff --git a/themes/blueprint/images/tango/gnome-help.png b/themes/blueprint/images/tango/gnome-help.png deleted file mode 100644 index f25fc3fbf10..00000000000 Binary files a/themes/blueprint/images/tango/gnome-help.png and /dev/null differ diff --git a/themes/blueprint/images/tango/video.png b/themes/blueprint/images/tango/video.png deleted file mode 100644 index 5dacbb231ad..00000000000 Binary files a/themes/blueprint/images/tango/video.png and /dev/null differ diff --git a/themes/blueprint/images/tango/www.png b/themes/blueprint/images/tango/www.png deleted file mode 100644 index 53014ab153f..00000000000 Binary files a/themes/blueprint/images/tango/www.png and /dev/null differ diff --git a/themes/blueprint/images/trans.png b/themes/blueprint/images/trans.png deleted file mode 100644 index 44a2b9dcb68..00000000000 Binary files a/themes/blueprint/images/trans.png and /dev/null differ diff --git a/themes/blueprint/images/unchecked.gif b/themes/blueprint/images/unchecked.gif deleted file mode 100644 index 06ecaba118e..00000000000 Binary files a/themes/blueprint/images/unchecked.gif and /dev/null differ diff --git a/themes/blueprint/images/view_grid.png b/themes/blueprint/images/view_grid.png deleted file mode 100644 index 1c4e4391966..00000000000 Binary files a/themes/blueprint/images/view_grid.png and /dev/null differ diff --git a/themes/blueprint/images/view_list.png b/themes/blueprint/images/view_list.png deleted file mode 100644 index 847c39a8ee1..00000000000 Binary files a/themes/blueprint/images/view_list.png and /dev/null differ diff --git a/themes/blueprint/images/view_visual.png b/themes/blueprint/images/view_visual.png deleted file mode 100644 index 12e3eb9e631..00000000000 Binary files a/themes/blueprint/images/view_visual.png and /dev/null differ diff --git a/themes/blueprint/images/vufind_logo.png b/themes/blueprint/images/vufind_logo.png deleted file mode 100755 index b873fdc6662..00000000000 Binary files a/themes/blueprint/images/vufind_logo.png and /dev/null differ diff --git a/themes/blueprint/js/.htaccess b/themes/blueprint/js/.htaccess deleted file mode 100644 index a00c90e011a..00000000000 --- a/themes/blueprint/js/.htaccess +++ /dev/null @@ -1,6 +0,0 @@ - - RewriteEngine Off - - -RemoveType .js -AddType text/javascript .js \ No newline at end of file diff --git a/themes/blueprint/js/advanced_search.js b/themes/blueprint/js/advanced_search.js deleted file mode 100644 index 4baa0b70d7c..00000000000 --- a/themes/blueprint/js/advanced_search.js +++ /dev/null @@ -1,189 +0,0 @@ -/*global addSearchString, deleteSearchGroupString, searchFieldLabel, searchFields, searchJoins, searchLabel, searchMatch*/ - -var nextGroupNumber = 0; -var groupSearches = []; - -function jsEntityEncode(str) -{ - var new_str = str.replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"').replace(/'/g, '''); - return new_str; -} - -function addSearch(group, term, field) -{ - if (term == undefined) {term = '';} - if (field == undefined) {field = '';} - - var newSearch = '
'; - - // Label - newSearch += '
 
'; - - // Terms - newSearch += '
'; - - // Field - newSearch += '
'; - newSearch += ''; - newSearch += '
'; - - // Handle floating nonsense - newSearch += ''; - newSearch += '
'; - - // Done - $("#group" + group + "SearchHolder").append(newSearch); - - // Actual value doesn't matter once it's not zero. - groupSearches[group]++; -} - -function reNumGroup(oldGroup, newNum) -{ - // Keep the old details for use - var oldId = $(oldGroup).attr("id"); - var oldNum = oldId.substring(5, oldId.length); - - // Which alternating row we're on - var alt = newNum % 2; - - // Make sure the function was called correctly - if (oldNum != newNum) { - // Update the delete link with the new ID - $("#delete_link_" + oldNum).attr("id", "delete_link_" + newNum); - - // Update the bool[] parameter number - $(oldGroup).find("[name='bool" + oldNum + "[]']:first").attr("name", "bool" + newNum + "[]"); - - // Update the add term link with the new ID - $("#add_search_link_" + oldNum).attr("id", "add_search_link_" + newNum); - - // Now loop through and update all lookfor[] and type[] parameters - $("#group"+ oldNum + "SearchHolder").find("[name='lookfor" + oldNum + "[]']").each(function() { - $(this).attr("name", "lookfor" + newNum + "[]"); - }); - $("#group"+ oldNum + "SearchHolder").find("[name='type" + oldNum + "[]']").each(function() { - $(this).attr("name", "type" + newNum + "[]"); - }); - - // Update search holder ID - $("#group"+ oldNum + "SearchHolder").attr("id", "group" + newNum + "SearchHolder"); - - // Finally, re-number the group itself - $(oldGroup).attr("id", "group" + newNum).attr("class", "group group" + alt); - } -} - -function reSortGroups() -{ - // Loop through all groups - var groups = 0; - $("#searchHolder > .group").each(function() { - // If the number of this group doesn't - // match our running count - if ($(this).attr("id") != "group"+groups) { - // Re-number this group - reNumGroup(this, groups); - } - groups++; - }); - nextGroupNumber = groups; - - // Hide some group-related controls if there is only one group: - if (nextGroupNumber == 1) { - $("#groupJoin").hide(); - $("#delete_link_0").hide(); - } else { - $("#groupJoin").show(); - $("#delete_link_0").show(); - } -} - -function addGroup(firstTerm, firstField, join) -{ - if (firstTerm == undefined) {firstTerm = '';} - if (firstField == undefined) {firstField = '';} - if (join == undefined) {join = '';} - - var newGroup = '
'; - newGroup += '
'; - - // Boolean operator drop-down - newGroup += '
'; - newGroup += ''; - newGroup += '
'; - - // Delete link - newGroup += '' + deleteSearchGroupString + ''; - newGroup += '
'; - - // Holder for all the search fields - newGroup += '
'; - - // Add search term link - newGroup += ''; - - newGroup += '
'; - - // Set to 0 so adding searches knows - // which one is first. - groupSearches[nextGroupNumber] = 0; - - // Add the new group into the page - $("#searchHolder").append(newGroup); - // Add the first search field - addSearch(nextGroupNumber, firstTerm, firstField); - // Keep the page in order - reSortGroups(); - - // Pass back the number of this group - return nextGroupNumber - 1; -} - -function deleteGroup(group) -{ - // Find the group and remove it - $("#group" + group).remove(); - // And keep the page in order - reSortGroups(); - // If the last group was removed, add an empty group - if (nextGroupNumber == 0) { - addGroup(); - } -} - -// Fired by onclick event -function deleteGroupJS(group) -{ - var groupNum = group.id.replace("delete_link_", ""); - deleteGroup(groupNum); - return false; -} - -// Fired by onclick event -function addSearchJS(group) -{ - var groupNum = group.id.replace("add_search_link_", ""); - addSearch(groupNum); - return false; -} \ No newline at end of file diff --git a/themes/blueprint/js/advanced_search_eds.js b/themes/blueprint/js/advanced_search_eds.js deleted file mode 100644 index 77be147149d..00000000000 --- a/themes/blueprint/js/advanced_search_eds.js +++ /dev/null @@ -1,205 +0,0 @@ -/*global addSearchString, deleteSearchGroupString, searchFieldLabel, searchFields, searchJoins, searchLabel, searchMatch*/ - -var nextGroupNumber = 0; -var groupSearches = []; -var booleanSearchOperators = [ "AND", "OR", "NOT"]; -function jsEntityEncode(str) -{ - var new_str = str.replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"').replace(/'/g, '''); - return new_str; -} - -function addSearch(group, term, field, op) -{ - if (term == undefined) {term = '';} - if (field == undefined) {field = '';} - if (op == undefined) {op = 'AND';} - - var newSearch = '
'; - - // Label - newSearch += '
'; - if (groupSearches[group] == 0) { - newSearch += ' '; - } - - newSearch +=''; - - newSearch += '
'; //end label/op dropdown - // Terms - newSearch += '
'; - - // Field - newSearch += '
'; - newSearch += ''; - newSearch += '
'; - - // Handle floating nonsense - newSearch += ''; - newSearch += '
'; - - // Done - $("#group" + group + "SearchHolder").append(newSearch); - - // Actual value doesn't matter once it's not zero. - groupSearches[group]++; -} - -function reNumGroup(oldGroup, newNum) -{ - // Keep the old details for use - var oldId = $(oldGroup).attr("id"); - var oldNum = oldId.substring(5, oldId.length); - - // Which alternating row we're on - var alt = newNum % 2; - - // Make sure the function was called correctly - if (oldNum != newNum) { - // Update the delete link with the new ID - $("#delete_link_" + oldNum).attr("id", "delete_link_" + newNum); - - // Update the bool[] parameter number - $(oldGroup).find("[name='bool" + oldNum + "[]']:first").attr("name", "bool" + newNum + "[]"); - - // Update the add term link with the new ID - $("#add_search_link_" + oldNum).attr("id", "add_search_link_" + newNum); - - // Now loop through and update all lookfor[] and type[] parameters - $("#group"+ oldNum + "SearchHolder").find("[name='lookfor" + oldNum + "[]']").each(function() { - $(this).attr("name", "lookfor" + newNum + "[]"); - }); - $("#group"+ oldNum + "SearchHolder").find("[name='type" + oldNum + "[]']").each(function() { - $(this).attr("name", "type" + newNum + "[]"); - }); - - // Update search holder ID - $("#group"+ oldNum + "SearchHolder").attr("id", "group" + newNum + "SearchHolder"); - - // Finally, re-number the group itself - $(oldGroup).attr("id", "group" + newNum).attr("class", "group group" + alt); - } -} - -function reSortGroups() -{ - // Loop through all groups - var groups = 0; - $("#searchHolder > .group").each(function() { - // If the number of this group doesn't - // match our running count - if ($(this).attr("id") != "group"+groups) { - // Re-number this group - reNumGroup(this, groups); - } - groups++; - }); - nextGroupNumber = groups; - - // Hide some group-related controls if there is only one group: - if (nextGroupNumber == 1) { - $("#groupJoin").hide(); - $("#delete_link_0").hide(); - } else { - $("#groupJoin").show(); - $("#delete_link_0").show(); - } -} - -function addGroup(firstTerm, firstField, join) -{ - if (firstTerm == undefined) {firstTerm = '';} - if (firstField == undefined) {firstField = '';} - if (join == undefined) {join = '';} - - var newGroup = '
'; - newGroup += '
'; - - // Boolean operator drop-down - newGroup += '
'; - newGroup += ''; - newGroup += '
'; - - // Delete link - newGroup += '' + deleteSearchGroupString + ''; - newGroup += '
'; - - // Holder for all the search fields - newGroup += '
'; - - // Add search term link - newGroup += ''; - - newGroup += '
'; - - // Set to 0 so adding searches knows - // which one is first. - groupSearches[nextGroupNumber] = 0; - - // Add the new group into the page - $("#searchHolder").append(newGroup); - // Add the first search field - addSearch(nextGroupNumber, firstTerm, firstField); - // Keep the page in order - reSortGroups(); - - // Pass back the number of this group - return nextGroupNumber - 1; -} - -function deleteGroup(group) -{ - // Find the group and remove it - $("#group" + group).remove(); - // And keep the page in order - reSortGroups(); - // If the last group was removed, add an empty group - if (nextGroupNumber == 0) { - addGroup(); - } -} - -// Fired by onclick event -function deleteGroupJS(group) -{ - var groupNum = group.id.replace("delete_link_", ""); - deleteGroup(groupNum); - return false; -} - -// Fired by onclick event -function addSearchJS(group) -{ - var groupNum = group.id.replace("add_search_link_", ""); - addSearch(groupNum); - return false; -} \ No newline at end of file diff --git a/themes/blueprint/js/bulk_actions.js b/themes/blueprint/js/bulk_actions.js deleted file mode 100644 index 4afe029e9a7..00000000000 --- a/themes/blueprint/js/bulk_actions.js +++ /dev/null @@ -1,78 +0,0 @@ -/*global extractSource, getLightbox, printIDs*/ - -function registerBulkActions() { - $('form[name="bulkActionForm"] input[type="submit"]').unbind('click').click(function(){ - var ids = $.map($(this.form).find('input.checkbox_ui:checked'), function(i) { - return $(i).val(); - }); - // If no IDs were selected, let the non-Javascript action display an error: - if (ids.length == 0) { - return true; - } - var action = $(this).attr('name'); - var message = $(this).attr('title'); - var id = ''; - var module = "Cart"; - var postParams; - switch (action) { - case 'export': - postParams = {ids:ids, 'export':'1'}; - action = "MyResearchBulk"; - break; - case 'delete': - module = "MyResearch"; - action = "Delete"; - id = $(this).attr('id'); - id = (id.indexOf('bottom_delete_list_items_') != -1) - ? id.replace('bottom_delete_list_items_', '') - : id.replace('delete_list_items_', ''); - postParams = {ids:ids, 'delete':'1', 'listID':id}; - break; - case 'email': - action = "MyResearchBulk"; - postParams = {ids:ids, email:'1'}; - break; - case 'print': - if (printIDs(ids)) { - // IDs successfully printed -- we're done: - return false; - } else { - // No selected IDs: show error - action = "MyResearchBulk"; - postParams = {error:'1'}; - } - break; - } - getLightbox(module, action, id, '', message, '', '', '', postParams); - return false; - }); - - // Support delete list button: - $('.deleteList').unbind('click').click(function(){ - var id = $(this).attr('id').substr('deleteList'.length); - var message = $(this).attr('title'); - var postParams = {listID: id, deleteList: 'deleteList'}; - getLightbox('MyResearch', 'DeleteList', '', '', message, 'MyResearch', 'Favorites', '', postParams); - return false; - }); - - // Support delete item from list button: - $('.delete.tool').unbind('click').click(function(){ - var recordID = this.href.substring(this.href.indexOf('delete=')+'delete='.length); - recordID = decodeURIComponent(recordID.split('&')[0].replace(/\+/g, ' ')); - var listID = this.href.substring(this.href.lastIndexOf('/')+1); - listID = decodeURIComponent(listID.split('?')[0]); - if (listID == 'Favorites') { - listID = ''; - } - var message = $(this).attr('title'); - var postParams = {'delete': recordID, 'source': extractSource(this)}; - getLightbox('MyResearch', 'MyList', listID, '', message, 'MyResearch', 'MyList', listID, postParams); - - return false; - }); -} - -$(document).ready(function(){ - registerBulkActions(); -}); \ No newline at end of file diff --git a/themes/blueprint/js/cart.js b/themes/blueprint/js/cart.js deleted file mode 100644 index c3a1f1fad9b..00000000000 --- a/themes/blueprint/js/cart.js +++ /dev/null @@ -1,217 +0,0 @@ -/*global cartCookieDomain, contextHelp, vufindString*/ - -var _CART_COOKIE = 'vufind_cart'; -var _CART_COOKIE_SOURCES = 'vufind_cart_src'; -var _CART_COOKIE_DELIM = "\t"; - -function getItemsFromCartCookie() { - var ids = $.cookie(_CART_COOKIE); - if (ids) { - var cart = ids.split(_CART_COOKIE_DELIM); - if (!cart) { - return []; - } - - var sources = $.cookie(_CART_COOKIE_SOURCES); - - var i; - if (!sources) { - // Backward compatibility with VuFind 1.x -- if no source cookie, all - // items come from the VuFind source: - for (i = 0; i < cart.length; i++) { - cart[i] = 'VuFind|' + cart[i]; - } - } else { - // Default case for VuFind 2.x carts -- decompress source data: - sources = sources.split(_CART_COOKIE_DELIM); - for (i = 0; i < cart.length; i++) { - var sourceIndex = cart[i].charCodeAt(0) - 65; - cart[i] = sources[sourceIndex] + '|' + cart[i].substr(1); - } - } - - return cart; - } - return []; -} - -function cartHelp(msg, elId) { - contextHelp.flash('#' + elId, '10', '1', 'down', 'right', msg, 5000); -} - -// return unique values from the given array -function uniqueValues(array) { - var o = {}, i, l = array.length, r = []; - for(i=0; i= vufindString.bookbagMax) ? " (" + vufindString.bookbagStatusFull + ")" : " "; - $('#cartStatus').html(cartStatus); -} - -function removeRecordState() { - $('#recordCart').html(vufindString.addBookBag).removeClass('cartRemove').addClass('cartAdd'); - $('#cartSize').empty().append("0"); -} - -function removeCartCheckbox() { - $('.checkbox_ui, .selectAllCheckboxes').each(function(){ - $(this).attr('checked', false); - }); -} - -function redrawCartStatus() { - var items = getItemsFromCartCookie(); - removeCartCheckbox(); - updateRecordState(items); - updateCartSummary(items); -} - -function registerUpdateCart($form) { - if($form) { - $("#updateCart, #bottom_updateCart").unbind('click').click(function(){ - var elId = this.id; - var selectedBoxes = $("input[name='ids[]']:checked", $form); - var selected = []; - $(selectedBoxes).each(function(i) { - selected[i] = this.value; - }); - - if (selected.length > 0) { - var inCart = 0; - var msg = ""; - var orig = getItemsFromCartCookie(); - $(selected).each(function(i) { - for (var x in orig) { - if (this == orig[x]) { - inCart++; - return; - } - } - addItemToCartCookie(this); - }); - var updated = getItemsFromCartCookie(); - var added = updated.length - orig.length; - msg += added + " " + vufindString.itemsAddBag + "
"; - if (inCart > 0 && orig.length > 0) { - msg += inCart + " " + vufindString.itemsInBag + "
"; - } - if (updated.length >= vufindString.bookbagMax) { - msg += vufindString.bookbagFull + "
"; - } - cartHelp(msg, elId); - } else { - cartHelp(vufindString.bulk_noitems_advice, elId); - } - redrawCartStatus(); - return false; - }); - } -} - -$(document).ready(function() { - var cartRecordId = $('#cartId').val(); - $('#cartItems').hide(); - $('#viewCart, #updateCart, #bottom_updateCart').removeClass('offscreen'); - - // Record - $('#recordCart').removeClass('offscreen').click(function() { - if(cartRecordId != undefined) { - if ($(this).hasClass('bookbagAdd')) { - updateCartSummary(addItemToCartCookie(cartRecordId)); - $(this).html(vufindString.removeBookBag).removeClass('bookbagAdd').addClass('bookbagDelete'); - } else { - updateCartSummary(removeItemFromCartCookie(cartRecordId)); - $(this).html(vufindString.addBookBag).removeClass('bookbagDelete').addClass('bookbagAdd'); - } - } - return false; - }); - redrawCartStatus(); - var $form = $('form[name="bulkActionForm"]'); - registerUpdateCart($form); -}); \ No newline at end of file diff --git a/themes/blueprint/js/check_item_statuses.js b/themes/blueprint/js/check_item_statuses.js deleted file mode 100644 index 5ec034a777f..00000000000 --- a/themes/blueprint/js/check_item_statuses.js +++ /dev/null @@ -1,81 +0,0 @@ -/*global path*/ - -function checkItemStatuses() { - var id = $.map($('.ajaxItemId'), function(i) { - return $(i).find('.hiddenId')[0].value; - }); - if (id.length) { - $(".ajax_availability").show(); - $.ajax({ - dataType: 'json', - url: path + '/AJAX/JSON?method=getItemStatuses', - data: {id:id}, - success: function(response) { - if(response.status == 'OK') { - $.each(response.data, function(i, result) { - - var item = $($('.ajaxItemId')[result.record_number]); - - item.find('.status').empty().append(result.availability_message); - if (typeof(result.full_status) != 'undefined' - && result.full_status.length > 0 - && item.find('.callnumAndLocation').length > 0 - ) { - // Full status mode is on -- display the HTML and hide extraneous junk: - item.find('.callnumAndLocation').empty().append(result.full_status); - item.find('.callnumber').hide(); - item.find('.location').hide(); - item.find('.hideIfDetailed').hide(); - item.find('.status').hide(); - } else if (typeof(result.missing_data) != 'undefined' - && result.missing_data - ) { - // No data is available -- hide the entire status area: - item.find('.callnumAndLocation').hide(); - item.find('.status').hide(); - } else if (result.locationList) { - // We have multiple locations -- build appropriate HTML and hide unwanted labels: - item.find('.callnumber').hide(); - item.find('.hideIfDetailed').hide(); - item.find('.location').hide(); - var locationListHTML = ""; - for (var x=0; x '; - } else { - locationListHTML += '' - + result.locationList[x].location + ' '; - } - locationListHTML += ''; - locationListHTML += '
'; - locationListHTML += (result.locationList[x].callnumbers) - ? result.locationList[x].callnumbers : ''; - locationListHTML += '
'; - } - item.find('.locationDetails').show(); - item.find('.locationDetails').empty().append(locationListHTML); - } else { - // Default case -- load call number and location into appropriate containers: - item.find('.callnumber').empty().append(result.callnumber); - item.find('.location').empty().append( - result.reserve == 'true' - ? result.reserve_message - : result.location - ); - } - }); - } else { - // display the error message on each of the ajax status place holder - $(".ajax_availability").empty().append(response.data); - } - $(".ajax_availability").removeClass('ajax_availability'); - } - }); - } -} - -$(document).ready(function() { - checkItemStatuses(); -}); \ No newline at end of file diff --git a/themes/blueprint/js/check_save_statuses.js b/themes/blueprint/js/check_save_statuses.js deleted file mode 100644 index b1e2f7e1d44..00000000000 --- a/themes/blueprint/js/check_save_statuses.js +++ /dev/null @@ -1,58 +0,0 @@ -/*global extractController, extractSource, getLightbox, path*/ - -function checkSaveStatuses() { - var data = $.map($('.recordId'), function(i) { - return {'id':$(i).find('.hiddenId')[0].value, 'source':extractSource(i)}; - }); - if (data.length) { - var ids = []; - var srcs = []; - for (var i = 0; i < data.length; i++) { - ids[i] = data[i].id; - srcs[i] = data[i].source; - } - $.ajax({ - dataType: 'json', - url: path + '/AJAX/JSON?method=getSaveStatuses', - data: {id:ids, 'source':srcs}, - success: function(response) { - if(response.status == 'OK') { - $('.savedLists > ul').empty(); - $.each(response.data, function(i, result) { - var $container = $('#result'+result.record_number).find('.savedLists'); - if ($container.length == 0) { // Record view - $container = $('#savedLists'); - } - var $ul = $container.children('ul:first'); - if ($ul.length == 0) { - $container.append('
    '); - $ul = $container.children('ul:first'); - } - var html = '
  • ' - + result.list_title + '
  • '; - $ul.append(html); - $container.show(); - }); - } - } - }); - } -} - -$(document).ready(function() { - checkSaveStatuses(); - // attach click event to the save record link - $('a.saveRecord').click(function() { - var id = $(this).parents('.recordId').find('.hiddenId'); - if (id.length > 0) { - // search results: - id = id[0].value; - } else { - // record view: - id = document.getElementById('record_id').value; - } - var controller = extractController(this); - var $dialog = getLightbox(controller, 'Save', id, null, this.title, controller, 'Save', id); - return false; - }); -}); \ No newline at end of file diff --git a/themes/blueprint/js/collection_record.js b/themes/blueprint/js/collection_record.js deleted file mode 100644 index fcd40d33ab5..00000000000 --- a/themes/blueprint/js/collection_record.js +++ /dev/null @@ -1,16 +0,0 @@ -function toggleCollectionInfo() { - $("#collectionInfo").toggle(); -} - -function showMoreInfoToggle() { - toggleCollectionInfo(); - $("#moreInfoToggle").show(); - $("#moreInfoToggle").click(function(e) { - e.preventDefault(); - toggleCollectionInfo(); - }); -} - -$(document).ready(function() { - showMoreInfoToggle(); -}); \ No newline at end of file diff --git a/themes/blueprint/js/common.js b/themes/blueprint/js/common.js deleted file mode 100644 index 974147d4595..00000000000 --- a/themes/blueprint/js/common.js +++ /dev/null @@ -1,484 +0,0 @@ -/*global getLightbox, isPhoneNumberValid, path, vufindString*/ - -/** - * Initialize common functions and event handlers. - */ -// disable caching for all AJAX requests -$.ajaxSetup({cache: false}); - -// set global options for the jQuery validation plugin -$.validator.setDefaults({ - errorClass: 'invalid' -}); - -function toggleMenu(elemId) { - var elem = $("#"+elemId); - if (elem.hasClass("offscreen")) { - elem.removeClass("offscreen"); - } else { - elem.addClass("offscreen"); - } -} - -function moreFacets(name) { - $("#more"+name).addClass("offscreen"); - $("#narrowGroupHidden_"+name).removeClass("offscreen"); -} - -function lessFacets(name) { - $("#more"+name).removeClass("offscreen"); - $("#narrowGroupHidden_"+name).addClass("offscreen"); -} - -function filterAll(element, formId) { - // Look for filters (specifically checkbox filters) - if (formId == null) { - formId = "searchForm"; - } - $("#" + formId + " :input[type='checkbox'][name='filter[]']") - .attr('checked', element.checked); - $("#" + formId + " :input[type='checkbox'][name='dfApplied']") - .attr('checked', element.checked); -} - -function extractParams(str) { - var params = {}; - var classes = str.split(/\s+/); - for(var i = 0; i < classes.length; i++) { - if (classes[i].indexOf(':') > 0) { - var pair = classes[i].split(':'); - params[pair[0]] = pair[1]; - } - } - return params; -} - -function initAutocomplete() { - $('input.autocomplete').each(function() { - var lastXhr = null; - var params = extractParams($(this).attr('class')); - var maxItems = params.maxItems > 0 ? params.maxItems : 10; - var $autocomplete = $(this).autocomplete({ - source: function(request, response) { - var type = params.type; - if (!type && params.typeSelector) { - type = $('#' + params.typeSelector).val(); - } - var searcher = params.searcher; - if (!searcher) { - searcher = 'Solr'; - } - // Abort previous access if one is defined - if (lastXhr !== null && typeof lastXhr["abort"] != "undefined") { - lastXhr.abort(); - } - lastXhr = $.ajax({ - url: path + '/AJAX/JSON', - data: {method:'getACSuggestions',type:type,q:request.term,searcher:searcher}, - dataType:'json', - success: function(json) { - if (json.status == 'OK' && json.data.length > 0) { - response(json.data.slice(0, maxItems)); - } else { - $autocomplete.autocomplete('close'); - } - } - }); - } - }); - }); -} - -function htmlEncode(value){ - if (value) { - return jQuery('
    ').text(value).html(); - } else { - return ''; - } -} - -// mostly lifted from http://docs.jquery.com/Frequently_Asked_Questions#How_do_I_select_an_element_by_an_ID_that_has_characters_used_in_CSS_notation.3F -function jqEscape(myid) { - return String(myid).replace(/(:|\.)/g,'\\$1'); -} - -function printIDs(ids) -{ - if(ids.length == 0) { - return false; - } - var parts = []; - $(ids).each(function() { - parts[parts.length] = encodeURIComponent('id[]') + '=' + encodeURIComponent(this); - }); - var url = path + '/Records?print=true&' + parts.join('&'); - window.open(url); - return true; -} - -var contextHelp = { - init: function() { - $('body').append('
    '); - }, - - hover: function(listenTo, widthOffset, heightOffset, direction, align, msgText) { - $(listenTo).mouseenter(function() { - contextHelp.contextHelpSys.setPosition(listenTo, widthOffset, heightOffset, direction, align, '', false); - contextHelp.contextHelpSys.updateContents(msgText); - }); - $(listenTo).mouseleave(function() { - contextHelp.contextHelpSys.hideMessage(); - }); - }, - - flash: function(id, widthOffset, heightOffset, direction, align, msgText, duration) { - this.contextHelpSys.setPosition(id, widthOffset, heightOffset, direction, align); - this.contextHelpSys.updateContents(msgText); - setTimeout(this.contextHelpSys.hideMessage, duration); - }, - - contextHelpSys: { - CHTable:"#contextHelp", - CHContent:"#contextHelpContent", - arrowUp:"#contextHelp .arrow.up", - arrowDown:"#contextHelp .arrow.down", - closeButton:"#closeContextHelp", - showCloseButton: true, - curElement:null, - curOffsetX:0, - curOffsetY:0, - curDirection:"auto", - curAlign:"auto", - curMaxWidth:null, - isUp:false, - load:function(){ - $(contextHelp.contextHelpSys.closeButton).click(contextHelp.contextHelpSys.hideMessage); - $(window).resize(contextHelp.contextHelpSys.position);}, - setPosition:function(element, offsetX, offsetY, direction, align, maxWidth, showCloseButton){ - if(element==null){element=document;} - if(offsetX==null){offsetX=0;} - if(offsetY==null){offsetY=0;} - if(direction==null){direction="auto";} - if(align==null){align="auto";} - if(showCloseButton==null){showCloseButton=true;} - contextHelp.contextHelpSys.curElement=$(element); - contextHelp.contextHelpSys.curOffsetX=offsetX; - contextHelp.contextHelpSys.curOffsetY=offsetY; - contextHelp.contextHelpSys.curDirection=direction; - contextHelp.contextHelpSys.curAlign=align; - contextHelp.contextHelpSys.curMaxWidth=maxWidth; - contextHelp.contextHelpSys.showCloseButton=showCloseButton;}, - position:function(){ - if(!contextHelp.contextHelpSys.isUp||!contextHelp.contextHelpSys.curElement.length){return;} - var offset=contextHelp.contextHelpSys.curElement.offset(); - var left=parseInt(offset.left, 10)+parseInt(contextHelp.contextHelpSys.curOffsetX, 10); - var top=parseInt(offset.top, 10)+parseInt(contextHelp.contextHelpSys.curOffsetY, 10); - var direction=contextHelp.contextHelpSys.curDirection; - var align=contextHelp.contextHelpSys.curAlign; - if(contextHelp.contextHelpSys.curMaxWidth){ - $(contextHelp.contextHelpSys.CHTable).css("width",contextHelp.contextHelpSys.curMaxWidth); - } else { - $(contextHelp.contextHelpSys.CHTable).css("width","auto"); - } - if (direction=="auto") { - if (parseInt(top, 10)-parseInt($(contextHelp.contextHelpSys.CHTable).height()<$(document).scrollTop(), 10)) { - direction="down"; - } else { - direction="up"; - } - } - if(direction=="up"){ - top = parseInt(top, 10) - parseInt($(contextHelp.contextHelpSys.CHTable).height(), 10); - $(contextHelp.contextHelpSys.arrowUp).css("display","none"); - $(contextHelp.contextHelpSys.arrowDown).css("display","block"); - } else { - if(direction=="down"){ - top = parseInt(top, 10) + parseInt(contextHelp.contextHelpSys.curElement.height(), 10); - $(contextHelp.contextHelpSys.arrowUp).css("display","block"); - $(contextHelp.contextHelpSys.arrowDown).css("display","none"); - } - } - if(align=="auto"){ - if(left+parseInt($(contextHelp.contextHelpSys.CHTable).width()>$(document).width(), 10)){ - align="left"; - } else { - align="right"; - } - } - if(align=="right"){ - left-=24; - $(contextHelp.contextHelpSys.arrowUp).css("background-position","0 0"); - $(contextHelp.contextHelpSys.arrowDown).css("background-position","0 -6px"); - } - else{ - if(align=="left"){ - left-=parseInt($(contextHelp.contextHelpSys.CHTable).width(), 10); - left+=24; - $(contextHelp.contextHelpSys.arrowUp).css("background-position","100% 0"); - $(contextHelp.contextHelpSys.arrowDown).css("background-position","100% -6px"); - } - } - if(contextHelp.contextHelpSys.showCloseButton) { - $(contextHelp.contextHelpSys.closeButton).show(); - } else { - $(contextHelp.contextHelpSys.closeButton).hide(); - } - $(contextHelp.contextHelpSys.CHTable).css("left",left + "px"); - $(contextHelp.contextHelpSys.CHTable).css("top",top + "px"); - }, - updateContents:function(msg){ - contextHelp.contextHelpSys.isUp=true; - $(contextHelp.contextHelpSys.CHContent).empty(); - $(contextHelp.contextHelpSys.CHContent).append(msg); - contextHelp.contextHelpSys.position(); - $(contextHelp.contextHelpSys.CHTable).hide(); - $(contextHelp.contextHelpSys.CHTable).fadeIn(); - }, - hideMessage:function(){ - if(contextHelp.contextHelpSys.isUp){ - $(contextHelp.contextHelpSys.CHTable).fadeOut(); - contextHelp.contextHelpSys.isUp=false; - } - } - } -}; - -function extractDataByClassPrefix(element, prefix) -{ - var classes = $(element).attr('class').split(/\s+/); - - for (var i = 0; i < classes.length; i++) { - if (classes[i].substr(0, prefix.length) == prefix) { - return classes[i].substr(prefix.length); - } - } - - // No matching controller class was found! - return ''; -} - -// extract a controller name from the classes of the provided element -function extractController(element) -{ - return extractDataByClassPrefix(element, 'controller'); -} - -// extract a record source name from the classes of the provided element; default -// to 'VuFind' if no source found -function extractSource(element) -{ - var x = extractDataByClassPrefix(element, 'source'); - return x.length == 0 ? 'VuFind' : x; -} - -// Advanced facets -function updateOrFacets(url, op) { - window.location.assign(url); - var list = $(op).parents('dl'); - var header = $(list).find('dt'); - list.html(header[0].outerHTML+'
    '+vufindString.loading+'...
    '); -} -function setupOrFacets() { - var facets = $('.facetOR'); - for(var i=0;i'); - } else { - $facet.before(''); - } - } -} - -// Phone number validation -var libphoneTranslateCodes = ["libphonenumber_invalid", "libphonenumber_invalidcountry", "libphonenumber_invalidregion", "libphonenumber_notanumber", "libphonenumber_toolong", "libphonenumber_tooshort", "libphonenumber_tooshortidd"]; -var libphoneErrorStrings = ["Phone number invalid", "Invalid country calling code", "Invalid region code", "The string supplied did not seem to be a phone number", "The string supplied is too long to be a phone number", "The string supplied is too short to be a phone number", "Phone number too short after IDD"]; -function phoneNumberFormHandler(numID, regionCode) { - var phoneInput = document.getElementById(numID); - var number = phoneInput.value; - var valid = isPhoneNumberValid(number, regionCode); - if(valid !== true) { - if(typeof valid === 'string') { - for(var i=libphoneErrorStrings.length;i--;) { - if(valid.match(libphoneErrorStrings[i])) { - valid = vufindString[libphoneTranslateCodes[i]]; - } - } - } else { - valid = vufindString['libphonenumber_invalid']; - } - $(phoneInput).siblings('.phone-error').html(valid); - } else { - $(phoneInput).siblings('.phone-error').html(''); - } - return valid == true; -} - -$(document).ready(function(){ - // initialize autocomplete - initAutocomplete(); - - // put focus on the "mainFocus" element - $('.mainFocus').each(function(){ $(this).focus(); } ); - - // support "jump menu" dropdown boxes - $('select.jumpMenu').change(function(){ $(this).parent('form').submit(); }); - - // attach click event to the "keep filters" checkbox - $('#searchFormKeepFilters').change(function() { filterAll(this); }); - - // attach click event to the search help links - $('a.searchHelp').click(function(){ - window.open(path + '/Help/Home?topic=search', 'Help', 'width=625, height=510'); - return false; - }); - - // attach click event to the advanced search help links - $('a.advsearchHelp').click(function(){ - window.open(path + '/Help/Home?topic=advsearch', 'Help', 'width=625, height=510'); - return false; - }); - - // attach click event to the visualization help links - $('a.visualizationHelp').click(function(){ - window.open(path + '/Help/Home?topic=visualization', 'Help', 'width=625, height=510'); - return false; - }); - - // assign click event to "email search" links - $('a.mailSearch').click(function() { - var id = this.id.substr('mailSearch'.length); - var $dialog = getLightbox('Search', 'Email', id, null, this.title, 'Search', 'Email', id); - return false; - }); - - // assign action to the "select all checkboxes" class - $('input[type="checkbox"].selectAllCheckboxes').change(function(){ - $(this.form).find('input[type="checkbox"]').attr('checked', $(this).is(':checked')); - }); - - // attach mouseover event to grid view records - $('.gridCellHover').mouseover(function() { - $(this).addClass('gridMouseOver'); - }); - - // attach mouseout event to grid view records - $('.gridCellHover').mouseout(function() { - $(this).removeClass('gridMouseOver'); - }); - - // assign click event to "viewCart" links - $('a.viewCart').click(function() { - var $dialog = getLightbox('Cart', 'Home', null, null, this.title, '', '', '', {viewCart:"1"}); - return false; - }); - - // handle QR code links - $('a.qrcodeLink').click(function() { - if ($(this).hasClass("active")) { - $(this).html(vufindString.qrcode_show).removeClass("active"); - } else { - $(this).html(vufindString.qrcode_hide).addClass("active"); - } - - var holder = $(this).next('.qrcodeHolder'); - - if (holder.find('img').length == 0) { - // We need to insert the QRCode image - var template = holder.find('.qrCodeImgTag').html(); - holder.html(template); - } - - holder.toggle(); - - return false; - }); - - // Print - var url = window.location.href; - if(url.indexOf('?' + 'print' + '=') != -1 || url.indexOf('&' + 'print' + '=') != -1) { - $("link[media='print']").attr("media", "all"); - window.print(); - } - - // Collapsing facets - $('.narrowList dt').click(function(){ - $(this).parent().toggleClass('open'); - $(this.className.replace('facet_', '#narrowGroupHidden_')).toggleClass('open'); - }); - - // Support holds cancel list buttons: - function cancelHolds(type) { - var typeIDS = type+'IDS'; - var selector = '[name="'+typeIDS+'[]"]'; - if (type == 'cancelSelected') { - selector += ':checked'; - } - var ids = $(selector); - var cancelIDS = []; - for(var i=0;i'+vufindString.bulk_noitems_advice+'
    '); - return false; - } - for(var i=0;i'+vufindString.bulk_noitems_advice+''); - return false; - } - for(var i=0;ie;++e){var u=sa[e]+t;if(u in n)return u}}function g(){}function p(){}function v(n){function t(){for(var t,r=e,u=-1,i=r.length;++ue;e++)for(var u,i=n[e],o=0,a=i.length;a>o;o++)(u=i[o])&&t(u,o,e);return n}function D(n){return fa(n,ya),n}function P(n){var t,e;return function(r,u,i){var o,a=n[i].update,c=a.length;for(i!=e&&(e=i,t=0),u>=t&&(t=u+1);!(o=a[t])&&++t0&&(n=n.substring(0,a));var s=Ma.get(n);return s&&(n=s,c=F),a?t?u:r:t?g:i}function H(n,t){return function(e){var r=Xo.event;Xo.event=e,t[0]=this.__data__;try{n.apply(this,t)}finally{Xo.event=r}}}function F(n,t){var e=H(n,t);return function(n){var t=this,r=n.relatedTarget;r&&(r===t||8&r.compareDocumentPosition(t))||e.call(t,n)}}function O(){var n=".dragsuppress-"+ ++ba,t="click"+n,e=Xo.select(Go).on("touchmove"+n,d).on("dragstart"+n,d).on("selectstart"+n,d);if(_a){var r=Jo.style,u=r[_a];r[_a]="none"}return function(i){function o(){e.on(t,null)}e.on(n,null),_a&&(r[_a]=u),i&&(e.on(t,function(){d(),o()},!0),setTimeout(o,0))}}function Y(n,t){t.changedTouches&&(t=t.changedTouches[0]);var e=n.ownerSVGElement||n;if(e.createSVGPoint){var r=e.createSVGPoint();if(0>wa&&(Go.scrollX||Go.scrollY)){e=Xo.select("body").append("svg").style({position:"absolute",top:0,left:0,margin:0,padding:0,border:"none"},"important");var u=e[0][0].getScreenCTM();wa=!(u.f||u.e),e.remove()}return wa?(r.x=t.pageX,r.y=t.pageY):(r.x=t.clientX,r.y=t.clientY),r=r.matrixTransform(n.getScreenCTM().inverse()),[r.x,r.y]}var i=n.getBoundingClientRect();return[t.clientX-i.left-n.clientLeft,t.clientY-i.top-n.clientTop]}function I(n){return n>0?1:0>n?-1:0}function Z(n,t,e){return(t[0]-n[0])*(e[1]-n[1])-(t[1]-n[1])*(e[0]-n[0])}function V(n){return n>1?0:-1>n?Sa:Math.acos(n)}function X(n){return n>1?Ea:-1>n?-Ea:Math.asin(n)}function $(n){return((n=Math.exp(n))-1/n)/2}function B(n){return((n=Math.exp(n))+1/n)/2}function W(n){return((n=Math.exp(2*n))-1)/(n+1)}function J(n){return(n=Math.sin(n/2))*n}function G(){}function K(n,t,e){return new Q(n,t,e)}function Q(n,t,e){this.h=n,this.s=t,this.l=e}function nt(n,t,e){function r(n){return n>360?n-=360:0>n&&(n+=360),60>n?i+(o-i)*n/60:180>n?o:240>n?i+(o-i)*(240-n)/60:i}function u(n){return Math.round(255*r(n))}var i,o;return n=isNaN(n)?0:(n%=360)<0?n+360:n,t=isNaN(t)?0:0>t?0:t>1?1:t,e=0>e?0:e>1?1:e,o=.5>=e?e*(1+t):e+t-e*t,i=2*e-o,gt(u(n+120),u(n),u(n-120))}function tt(n,t,e){return new et(n,t,e)}function et(n,t,e){this.h=n,this.c=t,this.l=e}function rt(n,t,e){return isNaN(n)&&(n=0),isNaN(t)&&(t=0),ut(e,Math.cos(n*=Na)*t,Math.sin(n)*t)}function ut(n,t,e){return new it(n,t,e)}function it(n,t,e){this.l=n,this.a=t,this.b=e}function ot(n,t,e){var r=(n+16)/116,u=r+t/500,i=r-e/200;return u=ct(u)*Fa,r=ct(r)*Oa,i=ct(i)*Ya,gt(lt(3.2404542*u-1.5371385*r-.4985314*i),lt(-.969266*u+1.8760108*r+.041556*i),lt(.0556434*u-.2040259*r+1.0572252*i))}function at(n,t,e){return n>0?tt(Math.atan2(e,t)*La,Math.sqrt(t*t+e*e),n):tt(0/0,0/0,n)}function ct(n){return n>.206893034?n*n*n:(n-4/29)/7.787037}function st(n){return n>.008856?Math.pow(n,1/3):7.787037*n+4/29}function lt(n){return Math.round(255*(.00304>=n?12.92*n:1.055*Math.pow(n,1/2.4)-.055))}function ft(n){return gt(n>>16,255&n>>8,255&n)}function ht(n){return ft(n)+""}function gt(n,t,e){return new pt(n,t,e)}function pt(n,t,e){this.r=n,this.g=t,this.b=e}function vt(n){return 16>n?"0"+Math.max(0,n).toString(16):Math.min(255,n).toString(16)}function dt(n,t,e){var r,u,i,o=0,a=0,c=0;if(r=/([a-z]+)\((.*)\)/i.exec(n))switch(u=r[2].split(","),r[1]){case"hsl":return e(parseFloat(u[0]),parseFloat(u[1])/100,parseFloat(u[2])/100);case"rgb":return t(Mt(u[0]),Mt(u[1]),Mt(u[2]))}return(i=Va.get(n))?t(i.r,i.g,i.b):(null!=n&&"#"===n.charAt(0)&&(4===n.length?(o=n.charAt(1),o+=o,a=n.charAt(2),a+=a,c=n.charAt(3),c+=c):7===n.length&&(o=n.substring(1,3),a=n.substring(3,5),c=n.substring(5,7)),o=parseInt(o,16),a=parseInt(a,16),c=parseInt(c,16)),t(o,a,c))}function mt(n,t,e){var r,u,i=Math.min(n/=255,t/=255,e/=255),o=Math.max(n,t,e),a=o-i,c=(o+i)/2;return a?(u=.5>c?a/(o+i):a/(2-o-i),r=n==o?(t-e)/a+(e>t?6:0):t==o?(e-n)/a+2:(n-t)/a+4,r*=60):(r=0/0,u=c>0&&1>c?0:r),K(r,u,c)}function yt(n,t,e){n=xt(n),t=xt(t),e=xt(e);var r=st((.4124564*n+.3575761*t+.1804375*e)/Fa),u=st((.2126729*n+.7151522*t+.072175*e)/Oa),i=st((.0193339*n+.119192*t+.9503041*e)/Ya);return ut(116*u-16,500*(r-u),200*(u-i))}function xt(n){return(n/=255)<=.04045?n/12.92:Math.pow((n+.055)/1.055,2.4)}function Mt(n){var t=parseFloat(n);return"%"===n.charAt(n.length-1)?Math.round(2.55*t):t}function _t(n){return"function"==typeof n?n:function(){return n}}function bt(n){return n}function wt(n){return function(t,e,r){return 2===arguments.length&&"function"==typeof e&&(r=e,e=null),St(t,e,n,r)}}function St(n,t,e,r){function u(){var n,t=c.status;if(!t&&c.responseText||t>=200&&300>t||304===t){try{n=e.call(i,c)}catch(r){return o.error.call(i,r),void 0}o.load.call(i,n)}else o.error.call(i,c)}var i={},o=Xo.dispatch("beforesend","progress","load","error"),a={},c=new XMLHttpRequest,s=null;return!Go.XDomainRequest||"withCredentials"in c||!/^(http(s)?:)?\/\//.test(n)||(c=new XDomainRequest),"onload"in c?c.onload=c.onerror=u:c.onreadystatechange=function(){c.readyState>3&&u()},c.onprogress=function(n){var t=Xo.event;Xo.event=n;try{o.progress.call(i,c)}finally{Xo.event=t}},i.header=function(n,t){return n=(n+"").toLowerCase(),arguments.length<2?a[n]:(null==t?delete a[n]:a[n]=t+"",i)},i.mimeType=function(n){return arguments.length?(t=null==n?null:n+"",i):t},i.responseType=function(n){return arguments.length?(s=n,i):s},i.response=function(n){return e=n,i},["get","post"].forEach(function(n){i[n]=function(){return i.send.apply(i,[n].concat(Bo(arguments)))}}),i.send=function(e,r,u){if(2===arguments.length&&"function"==typeof r&&(u=r,r=null),c.open(e,n,!0),null==t||"accept"in a||(a.accept=t+",*/*"),c.setRequestHeader)for(var l in a)c.setRequestHeader(l,a[l]);return null!=t&&c.overrideMimeType&&c.overrideMimeType(t),null!=s&&(c.responseType=s),null!=u&&i.on("error",u).on("load",function(n){u(null,n)}),o.beforesend.call(i,c),c.send(null==r?null:r),i},i.abort=function(){return c.abort(),i},Xo.rebind(i,o,"on"),null==r?i:i.get(kt(r))}function kt(n){return 1===n.length?function(t,e){n(null==t?e:null)}:n}function Et(){var n=At(),t=Ct()-n;t>24?(isFinite(t)&&(clearTimeout(Wa),Wa=setTimeout(Et,t)),Ba=0):(Ba=1,Ga(Et))}function At(){var n=Date.now();for(Ja=Xa;Ja;)n>=Ja.t&&(Ja.f=Ja.c(n-Ja.t)),Ja=Ja.n;return n}function Ct(){for(var n,t=Xa,e=1/0;t;)t.f?t=n?n.n=t.n:Xa=t.n:(t.t8?function(n){return n/e}:function(n){return n*e},symbol:n}}function zt(n){var t=n.decimal,e=n.thousands,r=n.grouping,u=n.currency,i=r?function(n){for(var t=n.length,u=[],i=0,o=r[0];t>0&&o>0;)u.push(n.substring(t-=o,t+o)),o=r[i=(i+1)%r.length];return u.reverse().join(e)}:bt;return function(n){var e=Qa.exec(n),r=e[1]||" ",o=e[2]||">",a=e[3]||"",c=e[4]||"",s=e[5],l=+e[6],f=e[7],h=e[8],g=e[9],p=1,v="",d="",m=!1;switch(h&&(h=+h.substring(1)),(s||"0"===r&&"="===o)&&(s=r="0",o="=",f&&(l-=Math.floor((l-1)/4))),g){case"n":f=!0,g="g";break;case"%":p=100,d="%",g="f";break;case"p":p=100,d="%",g="r";break;case"b":case"o":case"x":case"X":"#"===c&&(v="0"+g.toLowerCase());case"c":case"d":m=!0,h=0;break;case"s":p=-1,g="r"}"$"===c&&(v=u[0],d=u[1]),"r"!=g||h||(g="g"),null!=h&&("g"==g?h=Math.max(1,Math.min(21,h)):("e"==g||"f"==g)&&(h=Math.max(0,Math.min(20,h)))),g=nc.get(g)||qt;var y=s&&f;return function(n){if(m&&n%1)return"";var e=0>n||0===n&&0>1/n?(n=-n,"-"):a;if(0>p){var u=Xo.formatPrefix(n,h);n=u.scale(n),d=u.symbol}else n*=p;n=g(n,h);var c=n.lastIndexOf("."),x=0>c?n:n.substring(0,c),M=0>c?"":t+n.substring(c+1);!s&&f&&(x=i(x));var _=v.length+x.length+M.length+(y?0:e.length),b=l>_?new Array(_=l-_+1).join(r):"";return y&&(x=i(b+x)),e+=v,n=x+M,("<"===o?e+n+b:">"===o?b+e+n:"^"===o?b.substring(0,_>>=1)+e+n+b.substring(_):e+(y?n:b+n))+d}}}function qt(n){return n+""}function Tt(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function Rt(n,t,e){function r(t){var e=n(t),r=i(e,1);return r-t>t-e?e:r}function u(e){return t(e=n(new ec(e-1)),1),e}function i(n,e){return t(n=new ec(+n),e),n}function o(n,r,i){var o=u(n),a=[];if(i>1)for(;r>o;)e(o)%i||a.push(new Date(+o)),t(o,1);else for(;r>o;)a.push(new Date(+o)),t(o,1);return a}function a(n,t,e){try{ec=Tt;var r=new Tt;return r._=n,o(r,t,e)}finally{ec=Date}}n.floor=n,n.round=r,n.ceil=u,n.offset=i,n.range=o;var c=n.utc=Dt(n);return c.floor=c,c.round=Dt(r),c.ceil=Dt(u),c.offset=Dt(i),c.range=a,n}function Dt(n){return function(t,e){try{ec=Tt;var r=new Tt;return r._=t,n(r,e)._}finally{ec=Date}}}function Pt(n){function t(n){function t(t){for(var e,u,i,o=[],a=-1,c=0;++aa;){if(r>=s)return-1;if(u=t.charCodeAt(a++),37===u){if(o=t.charAt(a++),i=N[o in uc?t.charAt(a++):o],!i||(r=i(n,e,r))<0)return-1}else if(u!=e.charCodeAt(r++))return-1}return r}function r(n,t,e){b.lastIndex=0;var r=b.exec(t.substring(e));return r?(n.w=w.get(r[0].toLowerCase()),e+r[0].length):-1}function u(n,t,e){M.lastIndex=0;var r=M.exec(t.substring(e));return r?(n.w=_.get(r[0].toLowerCase()),e+r[0].length):-1}function i(n,t,e){E.lastIndex=0;var r=E.exec(t.substring(e));return r?(n.m=A.get(r[0].toLowerCase()),e+r[0].length):-1}function o(n,t,e){S.lastIndex=0;var r=S.exec(t.substring(e));return r?(n.m=k.get(r[0].toLowerCase()),e+r[0].length):-1}function a(n,t,r){return e(n,C.c.toString(),t,r)}function c(n,t,r){return e(n,C.x.toString(),t,r)}function s(n,t,r){return e(n,C.X.toString(),t,r)}function l(n,t,e){var r=x.get(t.substring(e,e+=2).toLowerCase());return null==r?-1:(n.p=r,e)}var f=n.dateTime,h=n.date,g=n.time,p=n.periods,v=n.days,d=n.shortDays,m=n.months,y=n.shortMonths;t.utc=function(n){function e(n){try{ec=Tt;var t=new ec;return t._=n,r(t)}finally{ec=Date}}var r=t(n);return e.parse=function(n){try{ec=Tt;var t=r.parse(n);return t&&t._}finally{ec=Date}},e.toString=r.toString,e},t.multi=t.utc.multi=ee;var x=Xo.map(),M=jt(v),_=Ht(v),b=jt(d),w=Ht(d),S=jt(m),k=Ht(m),E=jt(y),A=Ht(y);p.forEach(function(n,t){x.set(n.toLowerCase(),t)});var C={a:function(n){return d[n.getDay()]},A:function(n){return v[n.getDay()]},b:function(n){return y[n.getMonth()]},B:function(n){return m[n.getMonth()]},c:t(f),d:function(n,t){return Ut(n.getDate(),t,2)},e:function(n,t){return Ut(n.getDate(),t,2)},H:function(n,t){return Ut(n.getHours(),t,2)},I:function(n,t){return Ut(n.getHours()%12||12,t,2)},j:function(n,t){return Ut(1+tc.dayOfYear(n),t,3)},L:function(n,t){return Ut(n.getMilliseconds(),t,3)},m:function(n,t){return Ut(n.getMonth()+1,t,2)},M:function(n,t){return Ut(n.getMinutes(),t,2)},p:function(n){return p[+(n.getHours()>=12)]},S:function(n,t){return Ut(n.getSeconds(),t,2)},U:function(n,t){return Ut(tc.sundayOfYear(n),t,2)},w:function(n){return n.getDay()},W:function(n,t){return Ut(tc.mondayOfYear(n),t,2)},x:t(h),X:t(g),y:function(n,t){return Ut(n.getFullYear()%100,t,2)},Y:function(n,t){return Ut(n.getFullYear()%1e4,t,4)},Z:ne,"%":function(){return"%"}},N={a:r,A:u,b:i,B:o,c:a,d:Bt,e:Bt,H:Jt,I:Jt,j:Wt,L:Qt,m:$t,M:Gt,p:l,S:Kt,U:Ot,w:Ft,W:Yt,x:c,X:s,y:Zt,Y:It,Z:Vt,"%":te};return t}function Ut(n,t,e){var r=0>n?"-":"",u=(r?-n:n)+"",i=u.length;return r+(e>i?new Array(e-i+1).join(t)+u:u)}function jt(n){return new RegExp("^(?:"+n.map(Xo.requote).join("|")+")","i")}function Ht(n){for(var t=new u,e=-1,r=n.length;++e68?1900:2e3)}function $t(n,t,e){ic.lastIndex=0;var r=ic.exec(t.substring(e,e+2));return r?(n.m=r[0]-1,e+r[0].length):-1}function Bt(n,t,e){ic.lastIndex=0;var r=ic.exec(t.substring(e,e+2));return r?(n.d=+r[0],e+r[0].length):-1}function Wt(n,t,e){ic.lastIndex=0;var r=ic.exec(t.substring(e,e+3));return r?(n.j=+r[0],e+r[0].length):-1}function Jt(n,t,e){ic.lastIndex=0;var r=ic.exec(t.substring(e,e+2));return r?(n.H=+r[0],e+r[0].length):-1}function Gt(n,t,e){ic.lastIndex=0;var r=ic.exec(t.substring(e,e+2));return r?(n.M=+r[0],e+r[0].length):-1}function Kt(n,t,e){ic.lastIndex=0;var r=ic.exec(t.substring(e,e+2));return r?(n.S=+r[0],e+r[0].length):-1}function Qt(n,t,e){ic.lastIndex=0;var r=ic.exec(t.substring(e,e+3));return r?(n.L=+r[0],e+r[0].length):-1}function ne(n){var t=n.getTimezoneOffset(),e=t>0?"-":"+",r=~~(oa(t)/60),u=oa(t)%60;return e+Ut(r,"0",2)+Ut(u,"0",2)}function te(n,t,e){oc.lastIndex=0;var r=oc.exec(t.substring(e,e+1));return r?e+r[0].length:-1}function ee(n){for(var t=n.length,e=-1;++ea;++a)u.point((e=n[a])[0],e[1]);return u.lineEnd(),void 0}var c=new ke(e,n,null,!0),s=new ke(e,null,c,!1);c.o=s,i.push(c),o.push(s),c=new ke(r,n,null,!1),s=new ke(r,null,c,!0),c.o=s,i.push(c),o.push(s)}}),o.sort(t),Se(i),Se(o),i.length){for(var a=0,c=e,s=o.length;s>a;++a)o[a].e=c=!c;for(var l,f,h=i[0];;){for(var g=h,p=!0;g.v;)if((g=g.n)===h)return;l=g.z,u.lineStart();do{if(g.v=g.o.v=!0,g.e){if(p)for(var a=0,s=l.length;s>a;++a)u.point((f=l[a])[0],f[1]);else r(g.x,g.n.x,1,u);g=g.n}else{if(p){l=g.p.z;for(var a=l.length-1;a>=0;--a)u.point((f=l[a])[0],f[1])}else r(g.x,g.p.x,-1,u);g=g.p}g=g.o,l=g.z,p=!p}while(!g.v);u.lineEnd()}}}function Se(n){if(t=n.length){for(var t,e,r=0,u=n[0];++r1&&2&t&&e.push(e.pop().concat(e.shift())),g.push(e.filter(Ae))}}var g,p,v,d=t(i),m=u.invert(r[0],r[1]),y={point:o,lineStart:c,lineEnd:s,polygonStart:function(){y.point=l,y.lineStart=f,y.lineEnd=h,g=[],p=[],i.polygonStart()},polygonEnd:function(){y.point=o,y.lineStart=c,y.lineEnd=s,g=Xo.merge(g);var n=Le(m,p);g.length?we(g,Ne,n,e,i):n&&(i.lineStart(),e(null,null,1,i),i.lineEnd()),i.polygonEnd(),g=p=null},sphere:function(){i.polygonStart(),i.lineStart(),e(null,null,1,i),i.lineEnd(),i.polygonEnd()}},x=Ce(),M=t(x);return y}}function Ae(n){return n.length>1}function Ce(){var n,t=[];return{lineStart:function(){t.push(n=[])},point:function(t,e){n.push([t,e])},lineEnd:g,buffer:function(){var e=t;return t=[],n=null,e},rejoin:function(){t.length>1&&t.push(t.pop().concat(t.shift()))}}}function Ne(n,t){return((n=n.x)[0]<0?n[1]-Ea-Aa:Ea-n[1])-((t=t.x)[0]<0?t[1]-Ea-Aa:Ea-t[1])}function Le(n,t){var e=n[0],r=n[1],u=[Math.sin(e),-Math.cos(e),0],i=0,o=0;hc.reset();for(var a=0,c=t.length;c>a;++a){var s=t[a],l=s.length;if(l)for(var f=s[0],h=f[0],g=f[1]/2+Sa/4,p=Math.sin(g),v=Math.cos(g),d=1;;){d===l&&(d=0),n=s[d];var m=n[0],y=n[1]/2+Sa/4,x=Math.sin(y),M=Math.cos(y),_=m-h,b=oa(_)>Sa,w=p*x;if(hc.add(Math.atan2(w*Math.sin(_),v*M+w*Math.cos(_))),i+=b?_+(_>=0?ka:-ka):_,b^h>=e^m>=e){var S=fe(se(f),se(n));pe(S);var k=fe(u,S);pe(k);var E=(b^_>=0?-1:1)*X(k[2]);(r>E||r===E&&(S[0]||S[1]))&&(o+=b^_>=0?1:-1)}if(!d++)break;h=m,p=x,v=M,f=n}}return(-Aa>i||Aa>i&&0>hc)^1&o}function ze(n){var t,e=0/0,r=0/0,u=0/0;return{lineStart:function(){n.lineStart(),t=1},point:function(i,o){var a=i>0?Sa:-Sa,c=oa(i-e);oa(c-Sa)0?Ea:-Ea),n.point(u,r),n.lineEnd(),n.lineStart(),n.point(a,r),n.point(i,r),t=0):u!==a&&c>=Sa&&(oa(e-u)Aa?Math.atan((Math.sin(t)*(i=Math.cos(r))*Math.sin(e)-Math.sin(r)*(u=Math.cos(t))*Math.sin(n))/(u*i*o)):(t+r)/2}function Te(n,t,e,r){var u;if(null==n)u=e*Ea,r.point(-Sa,u),r.point(0,u),r.point(Sa,u),r.point(Sa,0),r.point(Sa,-u),r.point(0,-u),r.point(-Sa,-u),r.point(-Sa,0),r.point(-Sa,u);else if(oa(n[0]-t[0])>Aa){var i=n[0]i}function e(n){var e,i,c,s,l;return{lineStart:function(){s=c=!1,l=1},point:function(f,h){var g,p=[f,h],v=t(f,h),d=o?v?0:u(f,h):v?u(f+(0>f?Sa:-Sa),h):0;if(!e&&(s=c=v)&&n.lineStart(),v!==c&&(g=r(e,p),(de(e,g)||de(p,g))&&(p[0]+=Aa,p[1]+=Aa,v=t(p[0],p[1]))),v!==c)l=0,v?(n.lineStart(),g=r(p,e),n.point(g[0],g[1])):(g=r(e,p),n.point(g[0],g[1]),n.lineEnd()),e=g;else if(a&&e&&o^v){var m;d&i||!(m=r(p,e,!0))||(l=0,o?(n.lineStart(),n.point(m[0][0],m[0][1]),n.point(m[1][0],m[1][1]),n.lineEnd()):(n.point(m[1][0],m[1][1]),n.lineEnd(),n.lineStart(),n.point(m[0][0],m[0][1])))}!v||e&&de(e,p)||n.point(p[0],p[1]),e=p,c=v,i=d},lineEnd:function(){c&&n.lineEnd(),e=null},clean:function(){return l|(s&&c)<<1}}}function r(n,t,e){var r=se(n),u=se(t),o=[1,0,0],a=fe(r,u),c=le(a,a),s=a[0],l=c-s*s;if(!l)return!e&&n;var f=i*c/l,h=-i*s/l,g=fe(o,a),p=ge(o,f),v=ge(a,h);he(p,v);var d=g,m=le(p,d),y=le(d,d),x=m*m-y*(le(p,p)-1);if(!(0>x)){var M=Math.sqrt(x),_=ge(d,(-m-M)/y);if(he(_,p),_=ve(_),!e)return _;var b,w=n[0],S=t[0],k=n[1],E=t[1];w>S&&(b=w,w=S,S=b);var A=S-w,C=oa(A-Sa)A;if(!C&&k>E&&(b=k,k=E,E=b),N?C?k+E>0^_[1]<(oa(_[0]-w)Sa^(w<=_[0]&&_[0]<=S)){var L=ge(d,(-m+M)/y);return he(L,p),[_,ve(L)]}}}function u(t,e){var r=o?n:Sa-n,u=0;return-r>t?u|=1:t>r&&(u|=2),-r>e?u|=4:e>r&&(u|=8),u}var i=Math.cos(n),o=i>0,a=oa(i)>Aa,c=cr(n,6*Na);return Ee(t,e,c,o?[0,-n]:[-Sa,n-Sa])}function De(n,t,e,r){return function(u){var i,o=u.a,a=u.b,c=o.x,s=o.y,l=a.x,f=a.y,h=0,g=1,p=l-c,v=f-s;if(i=n-c,p||!(i>0)){if(i/=p,0>p){if(h>i)return;g>i&&(g=i)}else if(p>0){if(i>g)return;i>h&&(h=i)}if(i=e-c,p||!(0>i)){if(i/=p,0>p){if(i>g)return;i>h&&(h=i)}else if(p>0){if(h>i)return;g>i&&(g=i)}if(i=t-s,v||!(i>0)){if(i/=v,0>v){if(h>i)return;g>i&&(g=i)}else if(v>0){if(i>g)return;i>h&&(h=i)}if(i=r-s,v||!(0>i)){if(i/=v,0>v){if(i>g)return;i>h&&(h=i)}else if(v>0){if(h>i)return;g>i&&(g=i)}return h>0&&(u.a={x:c+h*p,y:s+h*v}),1>g&&(u.b={x:c+g*p,y:s+g*v}),u}}}}}}function Pe(n,t,e,r){function u(r,u){return oa(r[0]-n)0?0:3:oa(r[0]-e)0?2:1:oa(r[1]-t)0?1:0:u>0?3:2}function i(n,t){return o(n.x,t.x)}function o(n,t){var e=u(n,1),r=u(t,1);return e!==r?e-r:0===e?t[1]-n[1]:1===e?n[0]-t[0]:2===e?n[1]-t[1]:t[0]-n[0]}return function(a){function c(n){for(var t=0,e=d.length,r=n[1],u=0;e>u;++u)for(var i,o=1,a=d[u],c=a.length,s=a[0];c>o;++o)i=a[o],s[1]<=r?i[1]>r&&Z(s,i,n)>0&&++t:i[1]<=r&&Z(s,i,n)<0&&--t,s=i;return 0!==t}function s(i,a,c,s){var l=0,f=0;if(null==i||(l=u(i,c))!==(f=u(a,c))||o(i,a)<0^c>0){do s.point(0===l||3===l?n:e,l>1?r:t);while((l=(l+c+4)%4)!==f)}else s.point(a[0],a[1])}function l(u,i){return u>=n&&e>=u&&i>=t&&r>=i}function f(n,t){l(n,t)&&a.point(n,t)}function h(){N.point=p,d&&d.push(m=[]),S=!0,w=!1,_=b=0/0}function g(){v&&(p(y,x),M&&w&&A.rejoin(),v.push(A.buffer())),N.point=f,w&&a.lineEnd()}function p(n,t){n=Math.max(-Ac,Math.min(Ac,n)),t=Math.max(-Ac,Math.min(Ac,t));var e=l(n,t);if(d&&m.push([n,t]),S)y=n,x=t,M=e,S=!1,e&&(a.lineStart(),a.point(n,t));else if(e&&w)a.point(n,t);else{var r={a:{x:_,y:b},b:{x:n,y:t}};C(r)?(w||(a.lineStart(),a.point(r.a.x,r.a.y)),a.point(r.b.x,r.b.y),e||a.lineEnd(),k=!1):e&&(a.lineStart(),a.point(n,t),k=!1)}_=n,b=t,w=e}var v,d,m,y,x,M,_,b,w,S,k,E=a,A=Ce(),C=De(n,t,e,r),N={point:f,lineStart:h,lineEnd:g,polygonStart:function(){a=A,v=[],d=[],k=!0},polygonEnd:function(){a=E,v=Xo.merge(v);var t=c([n,r]),e=k&&t,u=v.length;(e||u)&&(a.polygonStart(),e&&(a.lineStart(),s(null,null,1,a),a.lineEnd()),u&&we(v,i,t,s,a),a.polygonEnd()),v=d=m=null}};return N}}function Ue(n,t){function e(e,r){return e=n(e,r),t(e[0],e[1])}return n.invert&&t.invert&&(e.invert=function(e,r){return e=t.invert(e,r),e&&n.invert(e[0],e[1])}),e}function je(n){var t=0,e=Sa/3,r=nr(n),u=r(t,e);return u.parallels=function(n){return arguments.length?r(t=n[0]*Sa/180,e=n[1]*Sa/180):[180*(t/Sa),180*(e/Sa)]},u}function He(n,t){function e(n,t){var e=Math.sqrt(i-2*u*Math.sin(t))/u;return[e*Math.sin(n*=u),o-e*Math.cos(n)]}var r=Math.sin(n),u=(r+Math.sin(t))/2,i=1+r*(2*u-r),o=Math.sqrt(i)/u;return e.invert=function(n,t){var e=o-t;return[Math.atan2(n,e)/u,X((i-(n*n+e*e)*u*u)/(2*u))]},e}function Fe(){function n(n,t){Nc+=u*n-r*t,r=n,u=t}var t,e,r,u;Rc.point=function(i,o){Rc.point=n,t=r=i,e=u=o},Rc.lineEnd=function(){n(t,e)}}function Oe(n,t){Lc>n&&(Lc=n),n>qc&&(qc=n),zc>t&&(zc=t),t>Tc&&(Tc=t)}function Ye(){function n(n,t){o.push("M",n,",",t,i)}function t(n,t){o.push("M",n,",",t),a.point=e}function e(n,t){o.push("L",n,",",t)}function r(){a.point=n}function u(){o.push("Z")}var i=Ie(4.5),o=[],a={point:n,lineStart:function(){a.point=t},lineEnd:r,polygonStart:function(){a.lineEnd=u},polygonEnd:function(){a.lineEnd=r,a.point=n},pointRadius:function(n){return i=Ie(n),a},result:function(){if(o.length){var n=o.join("");return o=[],n}}};return a}function Ie(n){return"m0,"+n+"a"+n+","+n+" 0 1,1 0,"+-2*n+"a"+n+","+n+" 0 1,1 0,"+2*n+"z"}function Ze(n,t){dc+=n,mc+=t,++yc}function Ve(){function n(n,r){var u=n-t,i=r-e,o=Math.sqrt(u*u+i*i);xc+=o*(t+n)/2,Mc+=o*(e+r)/2,_c+=o,Ze(t=n,e=r)}var t,e;Pc.point=function(r,u){Pc.point=n,Ze(t=r,e=u)}}function Xe(){Pc.point=Ze}function $e(){function n(n,t){var e=n-r,i=t-u,o=Math.sqrt(e*e+i*i);xc+=o*(r+n)/2,Mc+=o*(u+t)/2,_c+=o,o=u*n-r*t,bc+=o*(r+n),wc+=o*(u+t),Sc+=3*o,Ze(r=n,u=t)}var t,e,r,u;Pc.point=function(i,o){Pc.point=n,Ze(t=r=i,e=u=o)},Pc.lineEnd=function(){n(t,e)}}function Be(n){function t(t,e){n.moveTo(t,e),n.arc(t,e,o,0,ka)}function e(t,e){n.moveTo(t,e),a.point=r}function r(t,e){n.lineTo(t,e)}function u(){a.point=t}function i(){n.closePath()}var o=4.5,a={point:t,lineStart:function(){a.point=e},lineEnd:u,polygonStart:function(){a.lineEnd=i},polygonEnd:function(){a.lineEnd=u,a.point=t},pointRadius:function(n){return o=n,a},result:g};return a}function We(n){function t(n){return(a?r:e)(n)}function e(t){return Ke(t,function(e,r){e=n(e,r),t.point(e[0],e[1])})}function r(t){function e(e,r){e=n(e,r),t.point(e[0],e[1])}function r(){x=0/0,S.point=i,t.lineStart()}function i(e,r){var i=se([e,r]),o=n(e,r);u(x,M,y,_,b,w,x=o[0],M=o[1],y=e,_=i[0],b=i[1],w=i[2],a,t),t.point(x,M)}function o(){S.point=e,t.lineEnd()}function c(){r(),S.point=s,S.lineEnd=l}function s(n,t){i(f=n,h=t),g=x,p=M,v=_,d=b,m=w,S.point=i}function l(){u(x,M,y,_,b,w,g,p,f,v,d,m,a,t),S.lineEnd=o,o()}var f,h,g,p,v,d,m,y,x,M,_,b,w,S={point:e,lineStart:r,lineEnd:o,polygonStart:function(){t.polygonStart(),S.lineStart=c},polygonEnd:function(){t.polygonEnd(),S.lineStart=r}};return S}function u(t,e,r,a,c,s,l,f,h,g,p,v,d,m){var y=l-t,x=f-e,M=y*y+x*x;if(M>4*i&&d--){var _=a+g,b=c+p,w=s+v,S=Math.sqrt(_*_+b*b+w*w),k=Math.asin(w/=S),E=oa(oa(w)-1)i||oa((y*L+x*z)/M-.5)>.3||o>a*g+c*p+s*v)&&(u(t,e,r,a,c,s,C,N,E,_/=S,b/=S,w,d,m),m.point(C,N),u(C,N,E,_,b,w,l,f,h,g,p,v,d,m))}}var i=.5,o=Math.cos(30*Na),a=16;return t.precision=function(n){return arguments.length?(a=(i=n*n)>0&&16,t):Math.sqrt(i)},t}function Je(n){var t=We(function(t,e){return n([t*La,e*La])});return function(n){return tr(t(n))}}function Ge(n){this.stream=n}function Ke(n,t){return{point:t,sphere:function(){n.sphere()},lineStart:function(){n.lineStart()},lineEnd:function(){n.lineEnd()},polygonStart:function(){n.polygonStart()},polygonEnd:function(){n.polygonEnd()}}}function Qe(n){return nr(function(){return n})()}function nr(n){function t(n){return n=a(n[0]*Na,n[1]*Na),[n[0]*h+c,s-n[1]*h]}function e(n){return n=a.invert((n[0]-c)/h,(s-n[1])/h),n&&[n[0]*La,n[1]*La]}function r(){a=Ue(o=ur(m,y,x),i);var n=i(v,d);return c=g-n[0]*h,s=p+n[1]*h,u()}function u(){return l&&(l.valid=!1,l=null),t}var i,o,a,c,s,l,f=We(function(n,t){return n=i(n,t),[n[0]*h+c,s-n[1]*h]}),h=150,g=480,p=250,v=0,d=0,m=0,y=0,x=0,M=Ec,_=bt,b=null,w=null;return t.stream=function(n){return l&&(l.valid=!1),l=tr(M(o,f(_(n)))),l.valid=!0,l},t.clipAngle=function(n){return arguments.length?(M=null==n?(b=n,Ec):Re((b=+n)*Na),u()):b -},t.clipExtent=function(n){return arguments.length?(w=n,_=n?Pe(n[0][0],n[0][1],n[1][0],n[1][1]):bt,u()):w},t.scale=function(n){return arguments.length?(h=+n,r()):h},t.translate=function(n){return arguments.length?(g=+n[0],p=+n[1],r()):[g,p]},t.center=function(n){return arguments.length?(v=n[0]%360*Na,d=n[1]%360*Na,r()):[v*La,d*La]},t.rotate=function(n){return arguments.length?(m=n[0]%360*Na,y=n[1]%360*Na,x=n.length>2?n[2]%360*Na:0,r()):[m*La,y*La,x*La]},Xo.rebind(t,f,"precision"),function(){return i=n.apply(this,arguments),t.invert=i.invert&&e,r()}}function tr(n){return Ke(n,function(t,e){n.point(t*Na,e*Na)})}function er(n,t){return[n,t]}function rr(n,t){return[n>Sa?n-ka:-Sa>n?n+ka:n,t]}function ur(n,t,e){return n?t||e?Ue(or(n),ar(t,e)):or(n):t||e?ar(t,e):rr}function ir(n){return function(t,e){return t+=n,[t>Sa?t-ka:-Sa>t?t+ka:t,e]}}function or(n){var t=ir(n);return t.invert=ir(-n),t}function ar(n,t){function e(n,t){var e=Math.cos(t),a=Math.cos(n)*e,c=Math.sin(n)*e,s=Math.sin(t),l=s*r+a*u;return[Math.atan2(c*i-l*o,a*r-s*u),X(l*i+c*o)]}var r=Math.cos(n),u=Math.sin(n),i=Math.cos(t),o=Math.sin(t);return e.invert=function(n,t){var e=Math.cos(t),a=Math.cos(n)*e,c=Math.sin(n)*e,s=Math.sin(t),l=s*i-c*o;return[Math.atan2(c*i+s*o,a*r+l*u),X(l*r-a*u)]},e}function cr(n,t){var e=Math.cos(n),r=Math.sin(n);return function(u,i,o,a){var c=o*t;null!=u?(u=sr(e,u),i=sr(e,i),(o>0?i>u:u>i)&&(u+=o*ka)):(u=n+o*ka,i=n-.5*c);for(var s,l=u;o>0?l>i:i>l;l-=c)a.point((s=ve([e,-r*Math.cos(l),-r*Math.sin(l)]))[0],s[1])}}function sr(n,t){var e=se(t);e[0]-=n,pe(e);var r=V(-e[1]);return((-e[2]<0?-r:r)+2*Math.PI-Aa)%(2*Math.PI)}function lr(n,t,e){var r=Xo.range(n,t-Aa,e).concat(t);return function(n){return r.map(function(t){return[n,t]})}}function fr(n,t,e){var r=Xo.range(n,t-Aa,e).concat(t);return function(n){return r.map(function(t){return[t,n]})}}function hr(n){return n.source}function gr(n){return n.target}function pr(n,t,e,r){var u=Math.cos(t),i=Math.sin(t),o=Math.cos(r),a=Math.sin(r),c=u*Math.cos(n),s=u*Math.sin(n),l=o*Math.cos(e),f=o*Math.sin(e),h=2*Math.asin(Math.sqrt(J(r-t)+u*o*J(e-n))),g=1/Math.sin(h),p=h?function(n){var t=Math.sin(n*=h)*g,e=Math.sin(h-n)*g,r=e*c+t*l,u=e*s+t*f,o=e*i+t*a;return[Math.atan2(u,r)*La,Math.atan2(o,Math.sqrt(r*r+u*u))*La]}:function(){return[n*La,t*La]};return p.distance=h,p}function vr(){function n(n,u){var i=Math.sin(u*=Na),o=Math.cos(u),a=oa((n*=Na)-t),c=Math.cos(a);Uc+=Math.atan2(Math.sqrt((a=o*Math.sin(a))*a+(a=r*i-e*o*c)*a),e*i+r*o*c),t=n,e=i,r=o}var t,e,r;jc.point=function(u,i){t=u*Na,e=Math.sin(i*=Na),r=Math.cos(i),jc.point=n},jc.lineEnd=function(){jc.point=jc.lineEnd=g}}function dr(n,t){function e(t,e){var r=Math.cos(t),u=Math.cos(e),i=n(r*u);return[i*u*Math.sin(t),i*Math.sin(e)]}return e.invert=function(n,e){var r=Math.sqrt(n*n+e*e),u=t(r),i=Math.sin(u),o=Math.cos(u);return[Math.atan2(n*i,r*o),Math.asin(r&&e*i/r)]},e}function mr(n,t){function e(n,t){var e=oa(oa(t)-Ea)u;u++){for(;r>1&&Z(n[e[r-2]],n[e[r-1]],n[u])<=0;)--r;e[r++]=u}return e.slice(0,r)}function kr(n,t){return n[0]-t[0]||n[1]-t[1]}function Er(n,t,e){return(e[0]-t[0])*(n[1]-t[1])<(e[1]-t[1])*(n[0]-t[0])}function Ar(n,t,e,r){var u=n[0],i=e[0],o=t[0]-u,a=r[0]-i,c=n[1],s=e[1],l=t[1]-c,f=r[1]-s,h=(a*(c-s)-f*(u-i))/(f*o-a*l);return[u+h*o,c+h*l]}function Cr(n){var t=n[0],e=n[n.length-1];return!(t[0]-e[0]||t[1]-e[1])}function Nr(){Jr(this),this.edge=this.site=this.circle=null}function Lr(n){var t=Jc.pop()||new Nr;return t.site=n,t}function zr(n){Or(n),$c.remove(n),Jc.push(n),Jr(n)}function qr(n){var t=n.circle,e=t.x,r=t.cy,u={x:e,y:r},i=n.P,o=n.N,a=[n];zr(n);for(var c=i;c.circle&&oa(e-c.circle.x)l;++l)s=a[l],c=a[l-1],$r(s.edge,c.site,s.site,u);c=a[0],s=a[f-1],s.edge=Vr(c.site,s.site,null,u),Fr(c),Fr(s)}function Tr(n){for(var t,e,r,u,i=n.x,o=n.y,a=$c._;a;)if(r=Rr(a,o)-i,r>Aa)a=a.L;else{if(u=i-Dr(a,o),!(u>Aa)){r>-Aa?(t=a.P,e=a):u>-Aa?(t=a,e=a.N):t=e=a;break}if(!a.R){t=a;break}a=a.R}var c=Lr(n);if($c.insert(t,c),t||e){if(t===e)return Or(t),e=Lr(t.site),$c.insert(c,e),c.edge=e.edge=Vr(t.site,c.site),Fr(t),Fr(e),void 0;if(!e)return c.edge=Vr(t.site,c.site),void 0;Or(t),Or(e);var s=t.site,l=s.x,f=s.y,h=n.x-l,g=n.y-f,p=e.site,v=p.x-l,d=p.y-f,m=2*(h*d-g*v),y=h*h+g*g,x=v*v+d*d,M={x:(d*y-g*x)/m+l,y:(h*x-v*y)/m+f};$r(e.edge,s,p,M),c.edge=Vr(s,n,null,M),e.edge=Vr(n,p,null,M),Fr(t),Fr(e)}}function Rr(n,t){var e=n.site,r=e.x,u=e.y,i=u-t;if(!i)return r;var o=n.P;if(!o)return-1/0;e=o.site;var a=e.x,c=e.y,s=c-t;if(!s)return a;var l=a-r,f=1/i-1/s,h=l/s;return f?(-h+Math.sqrt(h*h-2*f*(l*l/(-2*s)-c+s/2+u-i/2)))/f+r:(r+a)/2}function Dr(n,t){var e=n.N;if(e)return Rr(e,t);var r=n.site;return r.y===t?r.x:1/0}function Pr(n){this.site=n,this.edges=[]}function Ur(n){for(var t,e,r,u,i,o,a,c,s,l,f=n[0][0],h=n[1][0],g=n[0][1],p=n[1][1],v=Xc,d=v.length;d--;)if(i=v[d],i&&i.prepare())for(a=i.edges,c=a.length,o=0;c>o;)l=a[o].end(),r=l.x,u=l.y,s=a[++o%c].start(),t=s.x,e=s.y,(oa(r-t)>Aa||oa(u-e)>Aa)&&(a.splice(o,0,new Br(Xr(i.site,l,oa(r-f)Aa?{x:f,y:oa(t-f)Aa?{x:oa(e-p)Aa?{x:h,y:oa(t-h)Aa?{x:oa(e-g)=-Ca)){var g=c*c+s*s,p=l*l+f*f,v=(f*g-s*p)/h,d=(c*p-l*g)/h,f=d+a,m=Gc.pop()||new Hr;m.arc=n,m.site=u,m.x=v+o,m.y=f+Math.sqrt(v*v+d*d),m.cy=f,n.circle=m;for(var y=null,x=Wc._;x;)if(m.yd||d>=a)return;if(h>p){if(i){if(i.y>=s)return}else i={x:d,y:c};e={x:d,y:s}}else{if(i){if(i.yr||r>1)if(h>p){if(i){if(i.y>=s)return}else i={x:(c-u)/r,y:c};e={x:(s-u)/r,y:s}}else{if(i){if(i.yg){if(i){if(i.x>=a)return}else i={x:o,y:r*o+u};e={x:a,y:r*a+u}}else{if(i){if(i.xr;++r)if(o=l[r],o.x==e[0]){if(o.i)if(null==s[o.i+1])for(s[o.i-1]+=o.x,s.splice(o.i,1),u=r+1;i>u;++u)l[u].i--;else for(s[o.i-1]+=o.x+s[o.i+1],s.splice(o.i,2),u=r+1;i>u;++u)l[u].i-=2;else if(null==s[o.i+1])s[o.i]=o.x;else for(s[o.i]=o.x+s[o.i+1],s.splice(o.i+1,1),u=r+1;i>u;++u)l[u].i--;l.splice(r,1),i--,r--}else o.x=su(parseFloat(e[0]),parseFloat(o.x));for(;i>r;)o=l.pop(),null==s[o.i+1]?s[o.i]=o.x:(s[o.i]=o.x+s[o.i+1],s.splice(o.i+1,1)),i--;return 1===s.length?null==s[0]?(o=l[0].x,function(n){return o(n)+""}):function(){return t}:function(n){for(r=0;i>r;++r)s[(o=l[r]).i]=o.x(n);return s.join("")}}function fu(n,t){for(var e,r=Xo.interpolators.length;--r>=0&&!(e=Xo.interpolators[r](n,t)););return e}function hu(n,t){var e,r=[],u=[],i=n.length,o=t.length,a=Math.min(n.length,t.length);for(e=0;a>e;++e)r.push(fu(n[e],t[e]));for(;i>e;++e)u[e]=n[e];for(;o>e;++e)u[e]=t[e];return function(n){for(e=0;a>e;++e)u[e]=r[e](n);return u}}function gu(n){return function(t){return 0>=t?0:t>=1?1:n(t)}}function pu(n){return function(t){return 1-n(1-t)}}function vu(n){return function(t){return.5*(.5>t?n(2*t):2-n(2-2*t))}}function du(n){return n*n}function mu(n){return n*n*n}function yu(n){if(0>=n)return 0;if(n>=1)return 1;var t=n*n,e=t*n;return 4*(.5>n?e:3*(n-t)+e-.75)}function xu(n){return function(t){return Math.pow(t,n)}}function Mu(n){return 1-Math.cos(n*Ea)}function _u(n){return Math.pow(2,10*(n-1))}function bu(n){return 1-Math.sqrt(1-n*n)}function wu(n,t){var e;return arguments.length<2&&(t=.45),arguments.length?e=t/ka*Math.asin(1/n):(n=1,e=t/4),function(r){return 1+n*Math.pow(2,-10*r)*Math.sin((r-e)*ka/t)}}function Su(n){return n||(n=1.70158),function(t){return t*t*((n+1)*t-n)}}function ku(n){return 1/2.75>n?7.5625*n*n:2/2.75>n?7.5625*(n-=1.5/2.75)*n+.75:2.5/2.75>n?7.5625*(n-=2.25/2.75)*n+.9375:7.5625*(n-=2.625/2.75)*n+.984375}function Eu(n,t){n=Xo.hcl(n),t=Xo.hcl(t);var e=n.h,r=n.c,u=n.l,i=t.h-e,o=t.c-r,a=t.l-u;return isNaN(o)&&(o=0,r=isNaN(r)?t.c:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return rt(e+i*n,r+o*n,u+a*n)+""}}function Au(n,t){n=Xo.hsl(n),t=Xo.hsl(t);var e=n.h,r=n.s,u=n.l,i=t.h-e,o=t.s-r,a=t.l-u;return isNaN(o)&&(o=0,r=isNaN(r)?t.s:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return nt(e+i*n,r+o*n,u+a*n)+""}}function Cu(n,t){n=Xo.lab(n),t=Xo.lab(t);var e=n.l,r=n.a,u=n.b,i=t.l-e,o=t.a-r,a=t.b-u;return function(n){return ot(e+i*n,r+o*n,u+a*n)+""}}function Nu(n,t){return t-=n,function(e){return Math.round(n+t*e)}}function Lu(n){var t=[n.a,n.b],e=[n.c,n.d],r=qu(t),u=zu(t,e),i=qu(Tu(e,t,-u))||0;t[0]*e[1]180?l+=360:l-s>180&&(s+=360),u.push({i:r.push(r.pop()+"rotate(",null,")")-2,x:su(s,l)})):l&&r.push(r.pop()+"rotate("+l+")"),f!=h?u.push({i:r.push(r.pop()+"skewX(",null,")")-2,x:su(f,h)}):h&&r.push(r.pop()+"skewX("+h+")"),g[0]!=p[0]||g[1]!=p[1]?(e=r.push(r.pop()+"scale(",null,",",null,")"),u.push({i:e-4,x:su(g[0],p[0])},{i:e-2,x:su(g[1],p[1])})):(1!=p[0]||1!=p[1])&&r.push(r.pop()+"scale("+p+")"),e=u.length,function(n){for(var t,i=-1;++ie;++e)(t=n[e][1])>u&&(r=e,u=t);return r}function ei(n){return n.reduce(ri,0)}function ri(n,t){return n+t[1]}function ui(n,t){return ii(n,Math.ceil(Math.log(t.length)/Math.LN2+1))}function ii(n,t){for(var e=-1,r=+n[0],u=(n[1]-r)/t,i=[];++e<=t;)i[e]=u*e+r;return i}function oi(n){return[Xo.min(n),Xo.max(n)]}function ai(n,t){return n.parent==t.parent?1:2}function ci(n){var t=n.children;return t&&t.length?t[0]:n._tree.thread}function si(n){var t,e=n.children;return e&&(t=e.length)?e[t-1]:n._tree.thread}function li(n,t){var e=n.children;if(e&&(u=e.length))for(var r,u,i=-1;++i0&&(n=r);return n}function fi(n,t){return n.x-t.x}function hi(n,t){return t.x-n.x}function gi(n,t){return n.depth-t.depth}function pi(n,t){function e(n,r){var u=n.children;if(u&&(o=u.length))for(var i,o,a=null,c=-1;++c=0;)t=u[i]._tree,t.prelim+=e,t.mod+=e,e+=t.shift+(r+=t.change)}function di(n,t,e){n=n._tree,t=t._tree;var r=e/(t.number-n.number);n.change+=r,t.change-=r,t.shift+=e,t.prelim+=e,t.mod+=e}function mi(n,t,e){return n._tree.ancestor.parent==t.parent?n._tree.ancestor:e}function yi(n,t){return n.value-t.value}function xi(n,t){var e=n._pack_next;n._pack_next=t,t._pack_prev=n,t._pack_next=e,e._pack_prev=t}function Mi(n,t){n._pack_next=t,t._pack_prev=n}function _i(n,t){var e=t.x-n.x,r=t.y-n.y,u=n.r+t.r;return.999*u*u>e*e+r*r}function bi(n){function t(n){l=Math.min(n.x-n.r,l),f=Math.max(n.x+n.r,f),h=Math.min(n.y-n.r,h),g=Math.max(n.y+n.r,g)}if((e=n.children)&&(s=e.length)){var e,r,u,i,o,a,c,s,l=1/0,f=-1/0,h=1/0,g=-1/0;if(e.forEach(wi),r=e[0],r.x=-r.r,r.y=0,t(r),s>1&&(u=e[1],u.x=u.r,u.y=0,t(u),s>2))for(i=e[2],Ei(r,u,i),t(i),xi(r,i),r._pack_prev=i,xi(i,u),u=r._pack_next,o=3;s>o;o++){Ei(r,u,i=e[o]);var p=0,v=1,d=1;for(a=u._pack_next;a!==u;a=a._pack_next,v++)if(_i(a,i)){p=1;break}if(1==p)for(c=r._pack_prev;c!==a._pack_prev&&!_i(c,i);c=c._pack_prev,d++);p?(d>v||v==d&&u.ro;o++)i=e[o],i.x-=m,i.y-=y,x=Math.max(x,i.r+Math.sqrt(i.x*i.x+i.y*i.y));n.r=x,e.forEach(Si)}}function wi(n){n._pack_next=n._pack_prev=n}function Si(n){delete n._pack_next,delete n._pack_prev}function ki(n,t,e,r){var u=n.children;if(n.x=t+=r*n.x,n.y=e+=r*n.y,n.r*=r,u)for(var i=-1,o=u.length;++iu&&(e+=u/2,u=0),0>i&&(r+=i/2,i=0),{x:e,y:r,dx:u,dy:i}}function Ti(n){var t=n[0],e=n[n.length-1];return e>t?[t,e]:[e,t]}function Ri(n){return n.rangeExtent?n.rangeExtent():Ti(n.range())}function Di(n,t,e,r){var u=e(n[0],n[1]),i=r(t[0],t[1]);return function(n){return i(u(n))}}function Pi(n,t){var e,r=0,u=n.length-1,i=n[r],o=n[u];return i>o&&(e=r,r=u,u=e,e=i,i=o,o=e),n[r]=t.floor(i),n[u]=t.ceil(o),n}function Ui(n){return n?{floor:function(t){return Math.floor(t/n)*n},ceil:function(t){return Math.ceil(t/n)*n}}:ls}function ji(n,t,e,r){var u=[],i=[],o=0,a=Math.min(n.length,t.length)-1;for(n[a]2?ji:Di,c=r?Pu:Du;return o=u(n,t,c,e),a=u(t,n,c,fu),i}function i(n){return o(n)}var o,a;return i.invert=function(n){return a(n)},i.domain=function(t){return arguments.length?(n=t.map(Number),u()):n},i.range=function(n){return arguments.length?(t=n,u()):t},i.rangeRound=function(n){return i.range(n).interpolate(Nu)},i.clamp=function(n){return arguments.length?(r=n,u()):r},i.interpolate=function(n){return arguments.length?(e=n,u()):e},i.ticks=function(t){return Ii(n,t)},i.tickFormat=function(t,e){return Zi(n,t,e)},i.nice=function(t){return Oi(n,t),u()},i.copy=function(){return Hi(n,t,e,r)},u()}function Fi(n,t){return Xo.rebind(n,t,"range","rangeRound","interpolate","clamp")}function Oi(n,t){return Pi(n,Ui(Yi(n,t)[2]))}function Yi(n,t){null==t&&(t=10);var e=Ti(n),r=e[1]-e[0],u=Math.pow(10,Math.floor(Math.log(r/t)/Math.LN10)),i=t/r*u;return.15>=i?u*=10:.35>=i?u*=5:.75>=i&&(u*=2),e[0]=Math.ceil(e[0]/u)*u,e[1]=Math.floor(e[1]/u)*u+.5*u,e[2]=u,e}function Ii(n,t){return Xo.range.apply(Xo,Yi(n,t))}function Zi(n,t,e){var r=Yi(n,t);return Xo.format(e?e.replace(Qa,function(n,t,e,u,i,o,a,c,s,l){return[t,e,u,i,o,a,c,s||"."+Xi(l,r),l].join("")}):",."+Vi(r[2])+"f")}function Vi(n){return-Math.floor(Math.log(n)/Math.LN10+.01)}function Xi(n,t){var e=Vi(t[2]);return n in fs?Math.abs(e-Vi(Math.max(Math.abs(t[0]),Math.abs(t[1]))))+ +("e"!==n):e-2*("%"===n)}function $i(n,t,e,r){function u(n){return(e?Math.log(0>n?0:n):-Math.log(n>0?0:-n))/Math.log(t)}function i(n){return e?Math.pow(t,n):-Math.pow(t,-n)}function o(t){return n(u(t))}return o.invert=function(t){return i(n.invert(t))},o.domain=function(t){return arguments.length?(e=t[0]>=0,n.domain((r=t.map(Number)).map(u)),o):r},o.base=function(e){return arguments.length?(t=+e,n.domain(r.map(u)),o):t},o.nice=function(){var t=Pi(r.map(u),e?Math:gs);return n.domain(t),r=t.map(i),o},o.ticks=function(){var n=Ti(r),o=[],a=n[0],c=n[1],s=Math.floor(u(a)),l=Math.ceil(u(c)),f=t%1?2:t;if(isFinite(l-s)){if(e){for(;l>s;s++)for(var h=1;f>h;h++)o.push(i(s)*h);o.push(i(s))}else for(o.push(i(s));s++0;h--)o.push(i(s)*h);for(s=0;o[s]c;l--);o=o.slice(s,l)}return o},o.tickFormat=function(n,t){if(!arguments.length)return hs;arguments.length<2?t=hs:"function"!=typeof t&&(t=Xo.format(t));var r,a=Math.max(.1,n/o.ticks().length),c=e?(r=1e-12,Math.ceil):(r=-1e-12,Math.floor);return function(n){return n/i(c(u(n)+r))<=a?t(n):""}},o.copy=function(){return $i(n.copy(),t,e,r)},Fi(o,n)}function Bi(n,t,e){function r(t){return n(u(t))}var u=Wi(t),i=Wi(1/t);return r.invert=function(t){return i(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain((e=t.map(Number)).map(u)),r):e},r.ticks=function(n){return Ii(e,n)},r.tickFormat=function(n,t){return Zi(e,n,t)},r.nice=function(n){return r.domain(Oi(e,n))},r.exponent=function(o){return arguments.length?(u=Wi(t=o),i=Wi(1/t),n.domain(e.map(u)),r):t},r.copy=function(){return Bi(n.copy(),t,e)},Fi(r,n)}function Wi(n){return function(t){return 0>t?-Math.pow(-t,n):Math.pow(t,n)}}function Ji(n,t){function e(e){return o[((i.get(e)||"range"===t.t&&i.set(e,n.push(e)))-1)%o.length]}function r(t,e){return Xo.range(n.length).map(function(n){return t+e*n})}var i,o,a;return e.domain=function(r){if(!arguments.length)return n;n=[],i=new u;for(var o,a=-1,c=r.length;++ae?[0/0,0/0]:[e>0?u[e-1]:n[0],et?0/0:t/i+n,[t,t+1/i]},r.copy=function(){return Ki(n,t,e)},u()}function Qi(n,t){function e(e){return e>=e?t[Xo.bisect(n,e)]:void 0}return e.domain=function(t){return arguments.length?(n=t,e):n},e.range=function(n){return arguments.length?(t=n,e):t},e.invertExtent=function(e){return e=t.indexOf(e),[n[e-1],n[e]]},e.copy=function(){return Qi(n,t)},e}function no(n){function t(n){return+n}return t.invert=t,t.domain=t.range=function(e){return arguments.length?(n=e.map(t),t):n},t.ticks=function(t){return Ii(n,t)},t.tickFormat=function(t,e){return Zi(n,t,e)},t.copy=function(){return no(n)},t}function to(n){return n.innerRadius}function eo(n){return n.outerRadius}function ro(n){return n.startAngle}function uo(n){return n.endAngle}function io(n){function t(t){function o(){s.push("M",i(n(l),a))}for(var c,s=[],l=[],f=-1,h=t.length,g=_t(e),p=_t(r);++f1&&u.push("H",r[0]),u.join("")}function so(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t1){a=t[1],i=n[c],c++,r+="C"+(u[0]+o[0])+","+(u[1]+o[1])+","+(i[0]-a[0])+","+(i[1]-a[1])+","+i[0]+","+i[1];for(var s=2;s9&&(u=3*t/Math.sqrt(u),o[a]=u*e,o[a+1]=u*r));for(a=-1;++a<=c;)u=(n[Math.min(c,a+1)][0]-n[Math.max(0,a-1)][0])/(6*(1+o[a]*o[a])),i.push([u||0,o[a]*u||0]);return i}function Eo(n){return n.length<3?oo(n):n[0]+po(n,ko(n))}function Ao(n){for(var t,e,r,u=-1,i=n.length;++ue?s():(i.active=e,o.event&&o.event.start.call(n,l,t),o.tween.forEach(function(e,r){(r=r.call(n,l,t))&&v.push(r)}),Xo.timer(function(){return p.c=c(r||1)?be:c,1},0,a),void 0)}function c(r){if(i.active!==e)return s();for(var u=r/g,a=f(u),c=v.length;c>0;)v[--c].call(n,a);return u>=1?(o.event&&o.event.end.call(n,l,t),s()):void 0}function s(){return--i.count?delete i[e]:delete n.__transition__,1}var l=n.__data__,f=o.ease,h=o.delay,g=o.duration,p=Ja,v=[];return p.t=h+a,r>=h?u(r-h):(p.c=u,void 0)},0,a)}}function Ho(n,t){n.attr("transform",function(n){return"translate("+t(n)+",0)"})}function Fo(n,t){n.attr("transform",function(n){return"translate(0,"+t(n)+")"})}function Oo(n){return n.toISOString()}function Yo(n,t,e){function r(t){return n(t)}function u(n,e){var r=n[1]-n[0],u=r/e,i=Xo.bisect(js,u);return i==js.length?[t.year,Yi(n.map(function(n){return n/31536e6}),e)[2]]:i?t[u/js[i-1]1?{floor:function(t){for(;e(t=n.floor(t));)t=Io(t-1);return t},ceil:function(t){for(;e(t=n.ceil(t));)t=Io(+t+1);return t}}:n))},r.ticks=function(n,t){var e=Ti(r.domain()),i=null==n?u(e,10):"number"==typeof n?u(e,n):!n.range&&[{range:n},t];return i&&(n=i[0],t=i[1]),n.range(e[0],Io(+e[1]+1),1>t?1:t)},r.tickFormat=function(){return e},r.copy=function(){return Yo(n.copy(),t,e)},Fi(r,n)}function Io(n){return new Date(n)}function Zo(n){return JSON.parse(n.responseText)}function Vo(n){var t=Wo.createRange();return t.selectNode(Wo.body),t.createContextualFragment(n.responseText)}var Xo={version:"3.4.1"};Date.now||(Date.now=function(){return+new Date});var $o=[].slice,Bo=function(n){return $o.call(n)},Wo=document,Jo=Wo.documentElement,Go=window;try{Bo(Jo.childNodes)[0].nodeType}catch(Ko){Bo=function(n){for(var t=n.length,e=new Array(t);t--;)e[t]=n[t];return e}}try{Wo.createElement("div").style.setProperty("opacity",0,"")}catch(Qo){var na=Go.Element.prototype,ta=na.setAttribute,ea=na.setAttributeNS,ra=Go.CSSStyleDeclaration.prototype,ua=ra.setProperty;na.setAttribute=function(n,t){ta.call(this,n,t+"")},na.setAttributeNS=function(n,t,e){ea.call(this,n,t,e+"")},ra.setProperty=function(n,t,e){ua.call(this,n,t+"",e)}}Xo.ascending=function(n,t){return t>n?-1:n>t?1:n>=t?0:0/0},Xo.descending=function(n,t){return n>t?-1:t>n?1:t>=n?0:0/0},Xo.min=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u=e);)e=void 0;for(;++ur&&(e=r)}else{for(;++u=e);)e=void 0;for(;++ur&&(e=r)}return e},Xo.max=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u=e);)e=void 0;for(;++ue&&(e=r)}else{for(;++u=e);)e=void 0;for(;++ue&&(e=r)}return e},Xo.extent=function(n,t){var e,r,u,i=-1,o=n.length;if(1===arguments.length){for(;++i=e);)e=u=void 0;for(;++ir&&(e=r),r>u&&(u=r))}else{for(;++i=e);)e=void 0;for(;++ir&&(e=r),r>u&&(u=r))}return[e,u]},Xo.sum=function(n,t){var e,r=0,u=n.length,i=-1;if(1===arguments.length)for(;++i1&&(t=t.map(e)),t=t.filter(n),t.length?Xo.quantile(t.sort(Xo.ascending),.5):void 0},Xo.bisector=function(n){return{left:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;n.call(t,t[i],i)r;){var i=r+u>>>1;er?0:r);r>e;)i[e]=[t=u,u=n[++e]];return i},Xo.zip=function(){if(!(u=arguments.length))return[];for(var n=-1,e=Xo.min(arguments,t),r=new Array(e);++n=0;)for(r=n[u],t=r.length;--t>=0;)e[--o]=r[t];return e};var oa=Math.abs;Xo.range=function(n,t,r){if(arguments.length<3&&(r=1,arguments.length<2&&(t=n,n=0)),1/0===(t-n)/r)throw new Error("infinite range");var u,i=[],o=e(oa(r)),a=-1;if(n*=o,t*=o,r*=o,0>r)for(;(u=n+r*++a)>t;)i.push(u/o);else for(;(u=n+r*++a)=o.length)return r?r.call(i,a):e?a.sort(e):a;for(var s,l,f,h,g=-1,p=a.length,v=o[c++],d=new u;++g=o.length)return n;var r=[],u=a[e++];return n.forEach(function(n,u){r.push({key:n,values:t(u,e)})}),u?r.sort(function(n,t){return u(n.key,t.key)}):r}var e,r,i={},o=[],a=[];return i.map=function(t,e){return n(e,t,0)},i.entries=function(e){return t(n(Xo.map,e,0),0)},i.key=function(n){return o.push(n),i},i.sortKeys=function(n){return a[o.length-1]=n,i},i.sortValues=function(n){return e=n,i},i.rollup=function(n){return r=n,i},i},Xo.set=function(n){var t=new l;if(n)for(var e=0,r=n.length;r>e;++e)t.add(n[e]);return t},r(l,{has:i,add:function(n){return this[aa+n]=!0,n},remove:function(n){return n=aa+n,n in this&&delete this[n]},values:a,size:c,empty:s,forEach:function(n){for(var t in this)t.charCodeAt(0)===ca&&n.call(this,t.substring(1))}}),Xo.behavior={},Xo.rebind=function(n,t){for(var e,r=1,u=arguments.length;++r=0&&(r=n.substring(e+1),n=n.substring(0,e)),n)return arguments.length<2?this[n].on(r):this[n].on(r,t);if(2===arguments.length){if(null==t)for(n in this)this.hasOwnProperty(n)&&this[n].on(r,null);return this}},Xo.event=null,Xo.requote=function(n){return n.replace(la,"\\$&")};var la=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g,fa={}.__proto__?function(n,t){n.__proto__=t}:function(n,t){for(var e in t)n[e]=t[e]},ha=function(n,t){return t.querySelector(n)},ga=function(n,t){return t.querySelectorAll(n)},pa=Jo[h(Jo,"matchesSelector")],va=function(n,t){return pa.call(n,t)};"function"==typeof Sizzle&&(ha=function(n,t){return Sizzle(n,t)[0]||null},ga=function(n,t){return Sizzle.uniqueSort(Sizzle(n,t))},va=Sizzle.matchesSelector),Xo.selection=function(){return xa};var da=Xo.selection.prototype=[];da.select=function(n){var t,e,r,u,i=[];n=M(n);for(var o=-1,a=this.length;++o=0&&(e=n.substring(0,t),n=n.substring(t+1)),ma.hasOwnProperty(e)?{space:ma[e],local:n}:n}},da.attr=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node();return n=Xo.ns.qualify(n),n.local?e.getAttributeNS(n.space,n.local):e.getAttribute(n)}for(t in n)this.each(b(t,n[t]));return this}return this.each(b(n,t))},da.classed=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node(),r=(n=k(n)).length,u=-1;if(t=e.classList){for(;++ur){if("string"!=typeof n){2>r&&(t="");for(e in n)this.each(C(e,n[e],t));return this}if(2>r)return Go.getComputedStyle(this.node(),null).getPropertyValue(n);e=""}return this.each(C(n,t,e))},da.property=function(n,t){if(arguments.length<2){if("string"==typeof n)return this.node()[n];for(t in n)this.each(N(t,n[t]));return this}return this.each(N(n,t))},da.text=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.textContent=null==t?"":t}:null==n?function(){this.textContent=""}:function(){this.textContent=n}):this.node().textContent},da.html=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.innerHTML=null==t?"":t}:null==n?function(){this.innerHTML=""}:function(){this.innerHTML=n}):this.node().innerHTML},da.append=function(n){return n=L(n),this.select(function(){return this.appendChild(n.apply(this,arguments))})},da.insert=function(n,t){return n=L(n),t=M(t),this.select(function(){return this.insertBefore(n.apply(this,arguments),t.apply(this,arguments)||null)})},da.remove=function(){return this.each(function(){var n=this.parentNode;n&&n.removeChild(this)})},da.data=function(n,t){function e(n,e){var r,i,o,a=n.length,f=e.length,h=Math.min(a,f),g=new Array(f),p=new Array(f),v=new Array(a);if(t){var d,m=new u,y=new u,x=[];for(r=-1;++rr;++r)p[r]=z(e[r]);for(;a>r;++r)v[r]=n[r]}p.update=g,p.parentNode=g.parentNode=v.parentNode=n.parentNode,c.push(p),s.push(g),l.push(v)}var r,i,o=-1,a=this.length;if(!arguments.length){for(n=new Array(a=(r=this[0]).length);++oi;i++){u.push(t=[]),t.parentNode=(e=this[i]).parentNode;for(var a=0,c=e.length;c>a;a++)(r=e[a])&&n.call(r,r.__data__,a,i)&&t.push(r)}return x(u)},da.order=function(){for(var n=-1,t=this.length;++n=0;)(e=r[u])&&(i&&i!==e.nextSibling&&i.parentNode.insertBefore(e,i),i=e);return this},da.sort=function(n){n=T.apply(this,arguments);for(var t=-1,e=this.length;++tn;n++)for(var e=this[n],r=0,u=e.length;u>r;r++){var i=e[r];if(i)return i}return null},da.size=function(){var n=0;return this.each(function(){++n}),n};var ya=[];Xo.selection.enter=D,Xo.selection.enter.prototype=ya,ya.append=da.append,ya.empty=da.empty,ya.node=da.node,ya.call=da.call,ya.size=da.size,ya.select=function(n){for(var t,e,r,u,i,o=[],a=-1,c=this.length;++ar){if("string"!=typeof n){2>r&&(t=!1);for(e in n)this.each(j(e,n[e],t));return this}if(2>r)return(r=this.node()["__on"+n])&&r._;e=!1}return this.each(j(n,t,e))};var Ma=Xo.map({mouseenter:"mouseover",mouseleave:"mouseout"});Ma.forEach(function(n){"on"+n in Wo&&Ma.remove(n)});var _a="onselectstart"in Wo?null:h(Jo.style,"userSelect"),ba=0;Xo.mouse=function(n){return Y(n,m())};var wa=/WebKit/.test(Go.navigator.userAgent)?-1:0;Xo.touches=function(n,t){return arguments.length<2&&(t=m().touches),t?Bo(t).map(function(t){var e=Y(n,t);return e.identifier=t.identifier,e}):[]},Xo.behavior.drag=function(){function n(){this.on("mousedown.drag",o).on("touchstart.drag",a)}function t(){return Xo.event.changedTouches[0].identifier}function e(n,t){return Xo.touches(n).filter(function(n){return n.identifier===t})[0]}function r(n,t,e,r){return function(){function o(){var n=t(l,g),e=n[0]-v[0],r=n[1]-v[1];d|=e|r,v=n,f({type:"drag",x:n[0]+c[0],y:n[1]+c[1],dx:e,dy:r})}function a(){m.on(e+"."+p,null).on(r+"."+p,null),y(d&&Xo.event.target===h),f({type:"dragend"})}var c,s=this,l=s.parentNode,f=u.of(s,arguments),h=Xo.event.target,g=n(),p=null==g?"drag":"drag-"+g,v=t(l,g),d=0,m=Xo.select(Go).on(e+"."+p,o).on(r+"."+p,a),y=O();i?(c=i.apply(s,arguments),c=[c.x-v[0],c.y-v[1]]):c=[0,0],f({type:"dragstart"})}}var u=y(n,"drag","dragstart","dragend"),i=null,o=r(g,Xo.mouse,"mousemove","mouseup"),a=r(t,e,"touchmove","touchend");return n.origin=function(t){return arguments.length?(i=t,n):i},Xo.rebind(n,u,"on")};var Sa=Math.PI,ka=2*Sa,Ea=Sa/2,Aa=1e-6,Ca=Aa*Aa,Na=Sa/180,La=180/Sa,za=Math.SQRT2,qa=2,Ta=4;Xo.interpolateZoom=function(n,t){function e(n){var t=n*y;if(m){var e=B(v),o=i/(qa*h)*(e*W(za*t+v)-$(v));return[r+o*s,u+o*l,i*e/B(za*t+v)]}return[r+n*s,u+n*l,i*Math.exp(za*t)]}var r=n[0],u=n[1],i=n[2],o=t[0],a=t[1],c=t[2],s=o-r,l=a-u,f=s*s+l*l,h=Math.sqrt(f),g=(c*c-i*i+Ta*f)/(2*i*qa*h),p=(c*c-i*i-Ta*f)/(2*c*qa*h),v=Math.log(Math.sqrt(g*g+1)-g),d=Math.log(Math.sqrt(p*p+1)-p),m=d-v,y=(m||Math.log(c/i))/za;return e.duration=1e3*y,e},Xo.behavior.zoom=function(){function n(n){n.on(A,s).on(Pa+".zoom",f).on(C,h).on("dblclick.zoom",g).on(L,l)}function t(n){return[(n[0]-S.x)/S.k,(n[1]-S.y)/S.k]}function e(n){return[n[0]*S.k+S.x,n[1]*S.k+S.y]}function r(n){S.k=Math.max(E[0],Math.min(E[1],n))}function u(n,t){t=e(t),S.x+=n[0]-t[0],S.y+=n[1]-t[1]}function i(){_&&_.domain(M.range().map(function(n){return(n-S.x)/S.k}).map(M.invert)),w&&w.domain(b.range().map(function(n){return(n-S.y)/S.k}).map(b.invert))}function o(n){n({type:"zoomstart"})}function a(n){i(),n({type:"zoom",scale:S.k,translate:[S.x,S.y]})}function c(n){n({type:"zoomend"})}function s(){function n(){l=1,u(Xo.mouse(r),g),a(i)}function e(){f.on(C,Go===r?h:null).on(N,null),p(l&&Xo.event.target===s),c(i)}var r=this,i=z.of(r,arguments),s=Xo.event.target,l=0,f=Xo.select(Go).on(C,n).on(N,e),g=t(Xo.mouse(r)),p=O();U.call(r),o(i)}function l(){function n(){var n=Xo.touches(g);return h=S.k,n.forEach(function(n){n.identifier in v&&(v[n.identifier]=t(n))}),n}function e(){for(var t=Xo.event.changedTouches,e=0,i=t.length;i>e;++e)v[t[e].identifier]=null;var o=n(),c=Date.now();if(1===o.length){if(500>c-x){var s=o[0],l=v[s.identifier];r(2*S.k),u(s,l),d(),a(p)}x=c}else if(o.length>1){var s=o[0],f=o[1],h=s[0]-f[0],g=s[1]-f[1];m=h*h+g*g}}function i(){for(var n,t,e,i,o=Xo.touches(g),c=0,s=o.length;s>c;++c,i=null)if(e=o[c],i=v[e.identifier]){if(t)break;n=e,t=i}if(i){var l=(l=e[0]-n[0])*l+(l=e[1]-n[1])*l,f=m&&Math.sqrt(l/m);n=[(n[0]+e[0])/2,(n[1]+e[1])/2],t=[(t[0]+i[0])/2,(t[1]+i[1])/2],r(f*h)}x=null,u(n,t),a(p)}function f(){if(Xo.event.touches.length){for(var t=Xo.event.changedTouches,e=0,r=t.length;r>e;++e)delete v[t[e].identifier];for(var u in v)return void n()}b.on(M,null).on(_,null),w.on(A,s).on(L,l),k(),c(p)}var h,g=this,p=z.of(g,arguments),v={},m=0,y=Xo.event.changedTouches[0].identifier,M="touchmove.zoom-"+y,_="touchend.zoom-"+y,b=Xo.select(Go).on(M,i).on(_,f),w=Xo.select(g).on(A,null).on(L,e),k=O();U.call(g),e(),o(p)}function f(){var n=z.of(this,arguments);m?clearTimeout(m):(U.call(this),o(n)),m=setTimeout(function(){m=null,c(n)},50),d();var e=v||Xo.mouse(this);p||(p=t(e)),r(Math.pow(2,.002*Ra())*S.k),u(e,p),a(n)}function h(){p=null}function g(){var n=z.of(this,arguments),e=Xo.mouse(this),i=t(e),s=Math.log(S.k)/Math.LN2;o(n),r(Math.pow(2,Xo.event.shiftKey?Math.ceil(s)-1:Math.floor(s)+1)),u(e,i),a(n),c(n)}var p,v,m,x,M,_,b,w,S={x:0,y:0,k:1},k=[960,500],E=Da,A="mousedown.zoom",C="mousemove.zoom",N="mouseup.zoom",L="touchstart.zoom",z=y(n,"zoomstart","zoom","zoomend");return n.event=function(n){n.each(function(){var n=z.of(this,arguments),t=S;ks?Xo.select(this).transition().each("start.zoom",function(){S=this.__chart__||{x:0,y:0,k:1},o(n)}).tween("zoom:zoom",function(){var e=k[0],r=k[1],u=e/2,i=r/2,o=Xo.interpolateZoom([(u-S.x)/S.k,(i-S.y)/S.k,e/S.k],[(u-t.x)/t.k,(i-t.y)/t.k,e/t.k]);return function(t){var r=o(t),c=e/r[2];this.__chart__=S={x:u-r[0]*c,y:i-r[1]*c,k:c},a(n)}}).each("end.zoom",function(){c(n)}):(this.__chart__=S,o(n),a(n),c(n))})},n.translate=function(t){return arguments.length?(S={x:+t[0],y:+t[1],k:S.k},i(),n):[S.x,S.y]},n.scale=function(t){return arguments.length?(S={x:S.x,y:S.y,k:+t},i(),n):S.k},n.scaleExtent=function(t){return arguments.length?(E=null==t?Da:[+t[0],+t[1]],n):E},n.center=function(t){return arguments.length?(v=t&&[+t[0],+t[1]],n):v},n.size=function(t){return arguments.length?(k=t&&[+t[0],+t[1]],n):k},n.x=function(t){return arguments.length?(_=t,M=t.copy(),S={x:0,y:0,k:1},n):_},n.y=function(t){return arguments.length?(w=t,b=t.copy(),S={x:0,y:0,k:1},n):w},Xo.rebind(n,z,"on")};var Ra,Da=[0,1/0],Pa="onwheel"in Wo?(Ra=function(){return-Xo.event.deltaY*(Xo.event.deltaMode?120:1)},"wheel"):"onmousewheel"in Wo?(Ra=function(){return Xo.event.wheelDelta},"mousewheel"):(Ra=function(){return-Xo.event.detail},"MozMousePixelScroll");G.prototype.toString=function(){return this.rgb()+""},Xo.hsl=function(n,t,e){return 1===arguments.length?n instanceof Q?K(n.h,n.s,n.l):dt(""+n,mt,K):K(+n,+t,+e)};var Ua=Q.prototype=new G;Ua.brighter=function(n){return n=Math.pow(.7,arguments.length?n:1),K(this.h,this.s,this.l/n)},Ua.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),K(this.h,this.s,n*this.l)},Ua.rgb=function(){return nt(this.h,this.s,this.l)},Xo.hcl=function(n,t,e){return 1===arguments.length?n instanceof et?tt(n.h,n.c,n.l):n instanceof it?at(n.l,n.a,n.b):at((n=yt((n=Xo.rgb(n)).r,n.g,n.b)).l,n.a,n.b):tt(+n,+t,+e)};var ja=et.prototype=new G;ja.brighter=function(n){return tt(this.h,this.c,Math.min(100,this.l+Ha*(arguments.length?n:1)))},ja.darker=function(n){return tt(this.h,this.c,Math.max(0,this.l-Ha*(arguments.length?n:1)))},ja.rgb=function(){return rt(this.h,this.c,this.l).rgb()},Xo.lab=function(n,t,e){return 1===arguments.length?n instanceof it?ut(n.l,n.a,n.b):n instanceof et?rt(n.l,n.c,n.h):yt((n=Xo.rgb(n)).r,n.g,n.b):ut(+n,+t,+e)};var Ha=18,Fa=.95047,Oa=1,Ya=1.08883,Ia=it.prototype=new G;Ia.brighter=function(n){return ut(Math.min(100,this.l+Ha*(arguments.length?n:1)),this.a,this.b)},Ia.darker=function(n){return ut(Math.max(0,this.l-Ha*(arguments.length?n:1)),this.a,this.b)},Ia.rgb=function(){return ot(this.l,this.a,this.b)},Xo.rgb=function(n,t,e){return 1===arguments.length?n instanceof pt?gt(n.r,n.g,n.b):dt(""+n,gt,nt):gt(~~n,~~t,~~e)};var Za=pt.prototype=new G;Za.brighter=function(n){n=Math.pow(.7,arguments.length?n:1);var t=this.r,e=this.g,r=this.b,u=30;return t||e||r?(t&&u>t&&(t=u),e&&u>e&&(e=u),r&&u>r&&(r=u),gt(Math.min(255,~~(t/n)),Math.min(255,~~(e/n)),Math.min(255,~~(r/n)))):gt(u,u,u)},Za.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),gt(~~(n*this.r),~~(n*this.g),~~(n*this.b))},Za.hsl=function(){return mt(this.r,this.g,this.b)},Za.toString=function(){return"#"+vt(this.r)+vt(this.g)+vt(this.b)};var Va=Xo.map({aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074});Va.forEach(function(n,t){Va.set(n,ft(t))}),Xo.functor=_t,Xo.xhr=wt(bt),Xo.dsv=function(n,t){function e(n,e,i){arguments.length<3&&(i=e,e=null);var o=St(n,t,null==e?r:u(e),i);return o.row=function(n){return arguments.length?o.response(null==(e=n)?r:u(n)):e},o}function r(n){return e.parse(n.responseText)}function u(n){return function(t){return e.parse(t.responseText,n)}}function i(t){return t.map(o).join(n)}function o(n){return a.test(n)?'"'+n.replace(/\"/g,'""')+'"':n}var a=new RegExp('["'+n+"\n]"),c=n.charCodeAt(0);return e.parse=function(n,t){var r;return e.parseRows(n,function(n,e){if(r)return r(n,e-1);var u=new Function("d","return {"+n.map(function(n,t){return JSON.stringify(n)+": d["+t+"]"}).join(",")+"}");r=t?function(n,e){return t(u(n),e)}:u})},e.parseRows=function(n,t){function e(){if(l>=s)return o;if(u)return u=!1,i;var t=l;if(34===n.charCodeAt(t)){for(var e=t;e++l;){var r=n.charCodeAt(l++),a=1;if(10===r)u=!0;else if(13===r)u=!0,10===n.charCodeAt(l)&&(++l,++a);else if(r!==c)continue;return n.substring(t,l-a)}return n.substring(t)}for(var r,u,i={},o={},a=[],s=n.length,l=0,f=0;(r=e())!==o;){for(var h=[];r!==i&&r!==o;)h.push(r),r=e();(!t||(h=t(h,f++)))&&a.push(h)}return a},e.format=function(t){if(Array.isArray(t[0]))return e.formatRows(t);var r=new l,u=[];return t.forEach(function(n){for(var t in n)r.has(t)||u.push(r.add(t))}),[u.map(o).join(n)].concat(t.map(function(t){return u.map(function(n){return o(t[n])}).join(n)})).join("\n")},e.formatRows=function(n){return n.map(i).join("\n")},e},Xo.csv=Xo.dsv(",","text/csv"),Xo.tsv=Xo.dsv(" ","text/tab-separated-values");var Xa,$a,Ba,Wa,Ja,Ga=Go[h(Go,"requestAnimationFrame")]||function(n){setTimeout(n,17)};Xo.timer=function(n,t,e){var r=arguments.length;2>r&&(t=0),3>r&&(e=Date.now());var u=e+t,i={c:n,t:u,f:!1,n:null};$a?$a.n=i:Xa=i,$a=i,Ba||(Wa=clearTimeout(Wa),Ba=1,Ga(Et))},Xo.timer.flush=function(){At(),Ct()},Xo.round=function(n,t){return t?Math.round(n*(t=Math.pow(10,t)))/t:Math.round(n)};var Ka=["y","z","a","f","p","n","\xb5","m","","k","M","G","T","P","E","Z","Y"].map(Lt);Xo.formatPrefix=function(n,t){var e=0;return n&&(0>n&&(n*=-1),t&&(n=Xo.round(n,Nt(n,t))),e=1+Math.floor(1e-12+Math.log(n)/Math.LN10),e=Math.max(-24,Math.min(24,3*Math.floor((0>=e?e+1:e-1)/3)))),Ka[8+e/3]};var Qa=/(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i,nc=Xo.map({b:function(n){return n.toString(2)},c:function(n){return String.fromCharCode(n)},o:function(n){return n.toString(8)},x:function(n){return n.toString(16)},X:function(n){return n.toString(16).toUpperCase()},g:function(n,t){return n.toPrecision(t)},e:function(n,t){return n.toExponential(t)},f:function(n,t){return n.toFixed(t)},r:function(n,t){return(n=Xo.round(n,Nt(n,t))).toFixed(Math.max(0,Math.min(20,Nt(n*(1+1e-15),t))))}}),tc=Xo.time={},ec=Date;Tt.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){rc.setUTCDate.apply(this._,arguments)},setDay:function(){rc.setUTCDay.apply(this._,arguments)},setFullYear:function(){rc.setUTCFullYear.apply(this._,arguments)},setHours:function(){rc.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){rc.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){rc.setUTCMinutes.apply(this._,arguments)},setMonth:function(){rc.setUTCMonth.apply(this._,arguments)},setSeconds:function(){rc.setUTCSeconds.apply(this._,arguments)},setTime:function(){rc.setTime.apply(this._,arguments)}};var rc=Date.prototype;tc.year=Rt(function(n){return n=tc.day(n),n.setMonth(0,1),n},function(n,t){n.setFullYear(n.getFullYear()+t)},function(n){return n.getFullYear()}),tc.years=tc.year.range,tc.years.utc=tc.year.utc.range,tc.day=Rt(function(n){var t=new ec(2e3,0);return t.setFullYear(n.getFullYear(),n.getMonth(),n.getDate()),t},function(n,t){n.setDate(n.getDate()+t)},function(n){return n.getDate()-1}),tc.days=tc.day.range,tc.days.utc=tc.day.utc.range,tc.dayOfYear=function(n){var t=tc.year(n);return Math.floor((n-t-6e4*(n.getTimezoneOffset()-t.getTimezoneOffset()))/864e5)},["sunday","monday","tuesday","wednesday","thursday","friday","saturday"].forEach(function(n,t){t=7-t;var e=tc[n]=Rt(function(n){return(n=tc.day(n)).setDate(n.getDate()-(n.getDay()+t)%7),n},function(n,t){n.setDate(n.getDate()+7*Math.floor(t))},function(n){var e=tc.year(n).getDay();return Math.floor((tc.dayOfYear(n)+(e+t)%7)/7)-(e!==t)});tc[n+"s"]=e.range,tc[n+"s"].utc=e.utc.range,tc[n+"OfYear"]=function(n){var e=tc.year(n).getDay();return Math.floor((tc.dayOfYear(n)+(e+t)%7)/7)}}),tc.week=tc.sunday,tc.weeks=tc.sunday.range,tc.weeks.utc=tc.sunday.utc.range,tc.weekOfYear=tc.sundayOfYear;var uc={"-":"",_:" ",0:"0"},ic=/^\s*\d+/,oc=/^%/;Xo.locale=function(n){return{numberFormat:zt(n),timeFormat:Pt(n)}};var ac=Xo.locale({decimal:".",thousands:",",grouping:[3],currency:["$",""],dateTime:"%a %b %e %X %Y",date:"%m/%d/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});Xo.format=ac.numberFormat,Xo.geo={},re.prototype={s:0,t:0,add:function(n){ue(n,this.t,cc),ue(cc.s,this.s,this),this.s?this.t+=cc.t:this.s=cc.t},reset:function(){this.s=this.t=0},valueOf:function(){return this.s}};var cc=new re;Xo.geo.stream=function(n,t){n&&sc.hasOwnProperty(n.type)?sc[n.type](n,t):ie(n,t)};var sc={Feature:function(n,t){ie(n.geometry,t)},FeatureCollection:function(n,t){for(var e=n.features,r=-1,u=e.length;++rn?4*Sa+n:n,gc.lineStart=gc.lineEnd=gc.point=g}};Xo.geo.bounds=function(){function n(n,t){x.push(M=[l=n,h=n]),f>t&&(f=t),t>g&&(g=t)}function t(t,e){var r=se([t*Na,e*Na]);if(m){var u=fe(m,r),i=[u[1],-u[0],0],o=fe(i,u);pe(o),o=ve(o);var c=t-p,s=c>0?1:-1,v=o[0]*La*s,d=oa(c)>180;if(d^(v>s*p&&s*t>v)){var y=o[1]*La;y>g&&(g=y)}else if(v=(v+360)%360-180,d^(v>s*p&&s*t>v)){var y=-o[1]*La;f>y&&(f=y)}else f>e&&(f=e),e>g&&(g=e);d?p>t?a(l,t)>a(l,h)&&(h=t):a(t,h)>a(l,h)&&(l=t):h>=l?(l>t&&(l=t),t>h&&(h=t)):t>p?a(l,t)>a(l,h)&&(h=t):a(t,h)>a(l,h)&&(l=t)}else n(t,e);m=r,p=t}function e(){_.point=t}function r(){M[0]=l,M[1]=h,_.point=n,m=null}function u(n,e){if(m){var r=n-p;y+=oa(r)>180?r+(r>0?360:-360):r}else v=n,d=e;gc.point(n,e),t(n,e)}function i(){gc.lineStart()}function o(){u(v,d),gc.lineEnd(),oa(y)>Aa&&(l=-(h=180)),M[0]=l,M[1]=h,m=null}function a(n,t){return(t-=n)<0?t+360:t}function c(n,t){return n[0]-t[0]}function s(n,t){return t[0]<=t[1]?t[0]<=n&&n<=t[1]:nhc?(l=-(h=180),f=-(g=90)):y>Aa?g=90:-Aa>y&&(f=-90),M[0]=l,M[1]=h -}};return function(n){g=h=-(l=f=1/0),x=[],Xo.geo.stream(n,_);var t=x.length;if(t){x.sort(c);for(var e,r=1,u=x[0],i=[u];t>r;++r)e=x[r],s(e[0],u)||s(e[1],u)?(a(u[0],e[1])>a(u[0],u[1])&&(u[1]=e[1]),a(e[0],u[1])>a(u[0],u[1])&&(u[0]=e[0])):i.push(u=e);for(var o,e,p=-1/0,t=i.length-1,r=0,u=i[t];t>=r;u=e,++r)e=i[r],(o=a(u[1],e[0]))>p&&(p=o,l=e[0],h=u[1])}return x=M=null,1/0===l||1/0===f?[[0/0,0/0],[0/0,0/0]]:[[l,f],[h,g]]}}(),Xo.geo.centroid=function(n){pc=vc=dc=mc=yc=xc=Mc=_c=bc=wc=Sc=0,Xo.geo.stream(n,kc);var t=bc,e=wc,r=Sc,u=t*t+e*e+r*r;return Ca>u&&(t=xc,e=Mc,r=_c,Aa>vc&&(t=dc,e=mc,r=yc),u=t*t+e*e+r*r,Ca>u)?[0/0,0/0]:[Math.atan2(e,t)*La,X(r/Math.sqrt(u))*La]};var pc,vc,dc,mc,yc,xc,Mc,_c,bc,wc,Sc,kc={sphere:g,point:me,lineStart:xe,lineEnd:Me,polygonStart:function(){kc.lineStart=_e},polygonEnd:function(){kc.lineStart=xe}},Ec=Ee(be,ze,Te,[-Sa,-Sa/2]),Ac=1e9;Xo.geo.clipExtent=function(){var n,t,e,r,u,i,o={stream:function(n){return u&&(u.valid=!1),u=i(n),u.valid=!0,u},extent:function(a){return arguments.length?(i=Pe(n=+a[0][0],t=+a[0][1],e=+a[1][0],r=+a[1][1]),u&&(u.valid=!1,u=null),o):[[n,t],[e,r]]}};return o.extent([[0,0],[960,500]])},(Xo.geo.conicEqualArea=function(){return je(He)}).raw=He,Xo.geo.albers=function(){return Xo.geo.conicEqualArea().rotate([96,0]).center([-.6,38.7]).parallels([29.5,45.5]).scale(1070)},Xo.geo.albersUsa=function(){function n(n){var i=n[0],o=n[1];return t=null,e(i,o),t||(r(i,o),t)||u(i,o),t}var t,e,r,u,i=Xo.geo.albers(),o=Xo.geo.conicEqualArea().rotate([154,0]).center([-2,58.5]).parallels([55,65]),a=Xo.geo.conicEqualArea().rotate([157,0]).center([-3,19.9]).parallels([8,18]),c={point:function(n,e){t=[n,e]}};return n.invert=function(n){var t=i.scale(),e=i.translate(),r=(n[0]-e[0])/t,u=(n[1]-e[1])/t;return(u>=.12&&.234>u&&r>=-.425&&-.214>r?o:u>=.166&&.234>u&&r>=-.214&&-.115>r?a:i).invert(n)},n.stream=function(n){var t=i.stream(n),e=o.stream(n),r=a.stream(n);return{point:function(n,u){t.point(n,u),e.point(n,u),r.point(n,u)},sphere:function(){t.sphere(),e.sphere(),r.sphere()},lineStart:function(){t.lineStart(),e.lineStart(),r.lineStart()},lineEnd:function(){t.lineEnd(),e.lineEnd(),r.lineEnd()},polygonStart:function(){t.polygonStart(),e.polygonStart(),r.polygonStart()},polygonEnd:function(){t.polygonEnd(),e.polygonEnd(),r.polygonEnd()}}},n.precision=function(t){return arguments.length?(i.precision(t),o.precision(t),a.precision(t),n):i.precision()},n.scale=function(t){return arguments.length?(i.scale(t),o.scale(.35*t),a.scale(t),n.translate(i.translate())):i.scale()},n.translate=function(t){if(!arguments.length)return i.translate();var s=i.scale(),l=+t[0],f=+t[1];return e=i.translate(t).clipExtent([[l-.455*s,f-.238*s],[l+.455*s,f+.238*s]]).stream(c).point,r=o.translate([l-.307*s,f+.201*s]).clipExtent([[l-.425*s+Aa,f+.12*s+Aa],[l-.214*s-Aa,f+.234*s-Aa]]).stream(c).point,u=a.translate([l-.205*s,f+.212*s]).clipExtent([[l-.214*s+Aa,f+.166*s+Aa],[l-.115*s-Aa,f+.234*s-Aa]]).stream(c).point,n},n.scale(1070)};var Cc,Nc,Lc,zc,qc,Tc,Rc={point:g,lineStart:g,lineEnd:g,polygonStart:function(){Nc=0,Rc.lineStart=Fe},polygonEnd:function(){Rc.lineStart=Rc.lineEnd=Rc.point=g,Cc+=oa(Nc/2)}},Dc={point:Oe,lineStart:g,lineEnd:g,polygonStart:g,polygonEnd:g},Pc={point:Ze,lineStart:Ve,lineEnd:Xe,polygonStart:function(){Pc.lineStart=$e},polygonEnd:function(){Pc.point=Ze,Pc.lineStart=Ve,Pc.lineEnd=Xe}};Xo.geo.path=function(){function n(n){return n&&("function"==typeof a&&i.pointRadius(+a.apply(this,arguments)),o&&o.valid||(o=u(i)),Xo.geo.stream(n,o)),i.result()}function t(){return o=null,n}var e,r,u,i,o,a=4.5;return n.area=function(n){return Cc=0,Xo.geo.stream(n,u(Rc)),Cc},n.centroid=function(n){return dc=mc=yc=xc=Mc=_c=bc=wc=Sc=0,Xo.geo.stream(n,u(Pc)),Sc?[bc/Sc,wc/Sc]:_c?[xc/_c,Mc/_c]:yc?[dc/yc,mc/yc]:[0/0,0/0]},n.bounds=function(n){return qc=Tc=-(Lc=zc=1/0),Xo.geo.stream(n,u(Dc)),[[Lc,zc],[qc,Tc]]},n.projection=function(n){return arguments.length?(u=(e=n)?n.stream||Je(n):bt,t()):e},n.context=function(n){return arguments.length?(i=null==(r=n)?new Ye:new Be(n),"function"!=typeof a&&i.pointRadius(a),t()):r},n.pointRadius=function(t){return arguments.length?(a="function"==typeof t?t:(i.pointRadius(+t),+t),n):a},n.projection(Xo.geo.albersUsa()).context(null)},Xo.geo.transform=function(n){return{stream:function(t){var e=new Ge(t);for(var r in n)e[r]=n[r];return e}}},Ge.prototype={point:function(n,t){this.stream.point(n,t)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}},Xo.geo.projection=Qe,Xo.geo.projectionMutator=nr,(Xo.geo.equirectangular=function(){return Qe(er)}).raw=er.invert=er,Xo.geo.rotation=function(n){function t(t){return t=n(t[0]*Na,t[1]*Na),t[0]*=La,t[1]*=La,t}return n=ur(n[0]%360*Na,n[1]*Na,n.length>2?n[2]*Na:0),t.invert=function(t){return t=n.invert(t[0]*Na,t[1]*Na),t[0]*=La,t[1]*=La,t},t},rr.invert=er,Xo.geo.circle=function(){function n(){var n="function"==typeof r?r.apply(this,arguments):r,t=ur(-n[0]*Na,-n[1]*Na,0).invert,u=[];return e(null,null,1,{point:function(n,e){u.push(n=t(n,e)),n[0]*=La,n[1]*=La}}),{type:"Polygon",coordinates:[u]}}var t,e,r=[0,0],u=6;return n.origin=function(t){return arguments.length?(r=t,n):r},n.angle=function(r){return arguments.length?(e=cr((t=+r)*Na,u*Na),n):t},n.precision=function(r){return arguments.length?(e=cr(t*Na,(u=+r)*Na),n):u},n.angle(90)},Xo.geo.distance=function(n,t){var e,r=(t[0]-n[0])*Na,u=n[1]*Na,i=t[1]*Na,o=Math.sin(r),a=Math.cos(r),c=Math.sin(u),s=Math.cos(u),l=Math.sin(i),f=Math.cos(i);return Math.atan2(Math.sqrt((e=f*o)*e+(e=s*l-c*f*a)*e),c*l+s*f*a)},Xo.geo.graticule=function(){function n(){return{type:"MultiLineString",coordinates:t()}}function t(){return Xo.range(Math.ceil(i/d)*d,u,d).map(h).concat(Xo.range(Math.ceil(s/m)*m,c,m).map(g)).concat(Xo.range(Math.ceil(r/p)*p,e,p).filter(function(n){return oa(n%d)>Aa}).map(l)).concat(Xo.range(Math.ceil(a/v)*v,o,v).filter(function(n){return oa(n%m)>Aa}).map(f))}var e,r,u,i,o,a,c,s,l,f,h,g,p=10,v=p,d=90,m=360,y=2.5;return n.lines=function(){return t().map(function(n){return{type:"LineString",coordinates:n}})},n.outline=function(){return{type:"Polygon",coordinates:[h(i).concat(g(c).slice(1),h(u).reverse().slice(1),g(s).reverse().slice(1))]}},n.extent=function(t){return arguments.length?n.majorExtent(t).minorExtent(t):n.minorExtent()},n.majorExtent=function(t){return arguments.length?(i=+t[0][0],u=+t[1][0],s=+t[0][1],c=+t[1][1],i>u&&(t=i,i=u,u=t),s>c&&(t=s,s=c,c=t),n.precision(y)):[[i,s],[u,c]]},n.minorExtent=function(t){return arguments.length?(r=+t[0][0],e=+t[1][0],a=+t[0][1],o=+t[1][1],r>e&&(t=r,r=e,e=t),a>o&&(t=a,a=o,o=t),n.precision(y)):[[r,a],[e,o]]},n.step=function(t){return arguments.length?n.majorStep(t).minorStep(t):n.minorStep()},n.majorStep=function(t){return arguments.length?(d=+t[0],m=+t[1],n):[d,m]},n.minorStep=function(t){return arguments.length?(p=+t[0],v=+t[1],n):[p,v]},n.precision=function(t){return arguments.length?(y=+t,l=lr(a,o,90),f=fr(r,e,y),h=lr(s,c,90),g=fr(i,u,y),n):y},n.majorExtent([[-180,-90+Aa],[180,90-Aa]]).minorExtent([[-180,-80-Aa],[180,80+Aa]])},Xo.geo.greatArc=function(){function n(){return{type:"LineString",coordinates:[t||r.apply(this,arguments),e||u.apply(this,arguments)]}}var t,e,r=hr,u=gr;return n.distance=function(){return Xo.geo.distance(t||r.apply(this,arguments),e||u.apply(this,arguments))},n.source=function(e){return arguments.length?(r=e,t="function"==typeof e?null:e,n):r},n.target=function(t){return arguments.length?(u=t,e="function"==typeof t?null:t,n):u},n.precision=function(){return arguments.length?n:0},n},Xo.geo.interpolate=function(n,t){return pr(n[0]*Na,n[1]*Na,t[0]*Na,t[1]*Na)},Xo.geo.length=function(n){return Uc=0,Xo.geo.stream(n,jc),Uc};var Uc,jc={sphere:g,point:g,lineStart:vr,lineEnd:g,polygonStart:g,polygonEnd:g},Hc=dr(function(n){return Math.sqrt(2/(1+n))},function(n){return 2*Math.asin(n/2)});(Xo.geo.azimuthalEqualArea=function(){return Qe(Hc)}).raw=Hc;var Fc=dr(function(n){var t=Math.acos(n);return t&&t/Math.sin(t)},bt);(Xo.geo.azimuthalEquidistant=function(){return Qe(Fc)}).raw=Fc,(Xo.geo.conicConformal=function(){return je(mr)}).raw=mr,(Xo.geo.conicEquidistant=function(){return je(yr)}).raw=yr;var Oc=dr(function(n){return 1/n},Math.atan);(Xo.geo.gnomonic=function(){return Qe(Oc)}).raw=Oc,xr.invert=function(n,t){return[n,2*Math.atan(Math.exp(t))-Ea]},(Xo.geo.mercator=function(){return Mr(xr)}).raw=xr;var Yc=dr(function(){return 1},Math.asin);(Xo.geo.orthographic=function(){return Qe(Yc)}).raw=Yc;var Ic=dr(function(n){return 1/(1+n)},function(n){return 2*Math.atan(n)});(Xo.geo.stereographic=function(){return Qe(Ic)}).raw=Ic,_r.invert=function(n,t){return[-t,2*Math.atan(Math.exp(n))-Ea]},(Xo.geo.transverseMercator=function(){var n=Mr(_r),t=n.center,e=n.rotate;return n.center=function(n){return n?t([-n[1],n[0]]):(n=t(),[-n[1],n[0]])},n.rotate=function(n){return n?e([n[0],n[1],n.length>2?n[2]+90:90]):(n=e(),[n[0],n[1],n[2]-90])},n.rotate([0,0])}).raw=_r,Xo.geom={},Xo.geom.hull=function(n){function t(n){if(n.length<3)return[];var t,u=_t(e),i=_t(r),o=n.length,a=[],c=[];for(t=0;o>t;t++)a.push([+u.call(this,n[t],t),+i.call(this,n[t],t),t]);for(a.sort(kr),t=0;o>t;t++)c.push([a[t][0],-a[t][1]]);var s=Sr(a),l=Sr(c),f=l[0]===s[0],h=l[l.length-1]===s[s.length-1],g=[];for(t=s.length-1;t>=0;--t)g.push(n[a[s[t]][2]]);for(t=+f;t=r&&s.x<=i&&s.y>=u&&s.y<=o?[[r,o],[i,o],[i,u],[r,u]]:[];l.point=n[a]}),t}function e(n){return n.map(function(n,t){return{x:Math.round(i(n,t)/Aa)*Aa,y:Math.round(o(n,t)/Aa)*Aa,i:t}})}var r=br,u=wr,i=r,o=u,a=Kc;return n?t(n):(t.links=function(n){return nu(e(n)).edges.filter(function(n){return n.l&&n.r}).map(function(t){return{source:n[t.l.i],target:n[t.r.i]}})},t.triangles=function(n){var t=[];return nu(e(n)).cells.forEach(function(e,r){for(var u,i,o=e.site,a=e.edges.sort(jr),c=-1,s=a.length,l=a[s-1].edge,f=l.l===o?l.r:l.l;++c=s,h=r>=l,g=(h<<1)+f;n.leaf=!1,n=n.nodes[g]||(n.nodes[g]=iu()),f?u=s:a=s,h?o=l:c=l,i(n,t,e,r,u,o,a,c)}var l,f,h,g,p,v,d,m,y,x=_t(a),M=_t(c);if(null!=t)v=t,d=e,m=r,y=u;else if(m=y=-(v=d=1/0),f=[],h=[],p=n.length,o)for(g=0;p>g;++g)l=n[g],l.xm&&(m=l.x),l.y>y&&(y=l.y),f.push(l.x),h.push(l.y);else for(g=0;p>g;++g){var _=+x(l=n[g],g),b=+M(l,g);v>_&&(v=_),d>b&&(d=b),_>m&&(m=_),b>y&&(y=b),f.push(_),h.push(b)}var w=m-v,S=y-d;w>S?y=d+w:m=v+S;var k=iu();if(k.add=function(n){i(k,n,+x(n,++g),+M(n,g),v,d,m,y)},k.visit=function(n){ou(n,k,v,d,m,y)},g=-1,null==t){for(;++g=0?n.substring(0,t):n,r=t>=0?n.substring(t+1):"in";return e=ts.get(e)||ns,r=es.get(r)||bt,gu(r(e.apply(null,$o.call(arguments,1))))},Xo.interpolateHcl=Eu,Xo.interpolateHsl=Au,Xo.interpolateLab=Cu,Xo.interpolateRound=Nu,Xo.transform=function(n){var t=Wo.createElementNS(Xo.ns.prefix.svg,"g");return(Xo.transform=function(n){if(null!=n){t.setAttribute("transform",n);var e=t.transform.baseVal.consolidate()}return new Lu(e?e.matrix:rs)})(n)},Lu.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var rs={a:1,b:0,c:0,d:1,e:0,f:0};Xo.interpolateTransform=Ru,Xo.layout={},Xo.layout.bundle=function(){return function(n){for(var t=[],e=-1,r=n.length;++ea*a/d){if(p>c){var s=t.charge/c;n.px-=i*s,n.py-=o*s}return!0}if(t.point&&c&&p>c){var s=t.pointCharge/c;n.px-=i*s,n.py-=o*s}}return!t.charge}}function t(n){n.px=Xo.event.x,n.py=Xo.event.y,a.resume()}var e,r,u,i,o,a={},c=Xo.dispatch("start","tick","end"),s=[1,1],l=.9,f=us,h=is,g=-30,p=os,v=.1,d=.64,m=[],y=[];return a.tick=function(){if((r*=.99)<.005)return c.end({type:"end",alpha:r=0}),!0;var t,e,a,f,h,p,d,x,M,_=m.length,b=y.length;for(e=0;b>e;++e)a=y[e],f=a.source,h=a.target,x=h.x-f.x,M=h.y-f.y,(p=x*x+M*M)&&(p=r*i[e]*((p=Math.sqrt(p))-u[e])/p,x*=p,M*=p,h.x-=x*(d=f.weight/(h.weight+f.weight)),h.y-=M*d,f.x+=x*(d=1-d),f.y+=M*d);if((d=r*v)&&(x=s[0]/2,M=s[1]/2,e=-1,d))for(;++e<_;)a=m[e],a.x+=(x-a.x)*d,a.y+=(M-a.y)*d;if(g)for(Zu(t=Xo.geom.quadtree(m),r,o),e=-1;++e<_;)(a=m[e]).fixed||t.visit(n(a));for(e=-1;++e<_;)a=m[e],a.fixed?(a.x=a.px,a.y=a.py):(a.x-=(a.px-(a.px=a.x))*l,a.y-=(a.py-(a.py=a.y))*l);c.tick({type:"tick",alpha:r})},a.nodes=function(n){return arguments.length?(m=n,a):m},a.links=function(n){return arguments.length?(y=n,a):y},a.size=function(n){return arguments.length?(s=n,a):s},a.linkDistance=function(n){return arguments.length?(f="function"==typeof n?n:+n,a):f},a.distance=a.linkDistance,a.linkStrength=function(n){return arguments.length?(h="function"==typeof n?n:+n,a):h},a.friction=function(n){return arguments.length?(l=+n,a):l},a.charge=function(n){return arguments.length?(g="function"==typeof n?n:+n,a):g},a.chargeDistance=function(n){return arguments.length?(p=n*n,a):Math.sqrt(p)},a.gravity=function(n){return arguments.length?(v=+n,a):v},a.theta=function(n){return arguments.length?(d=n*n,a):Math.sqrt(d)},a.alpha=function(n){return arguments.length?(n=+n,r?r=n>0?n:0:n>0&&(c.start({type:"start",alpha:r=n}),Xo.timer(a.tick)),a):r},a.start=function(){function n(n,r){if(!e){for(e=new Array(c),a=0;c>a;++a)e[a]=[];for(a=0;s>a;++a){var u=y[a];e[u.source.index].push(u.target),e[u.target.index].push(u.source)}}for(var i,o=e[t],a=-1,s=o.length;++at;++t)(r=m[t]).index=t,r.weight=0;for(t=0;l>t;++t)r=y[t],"number"==typeof r.source&&(r.source=m[r.source]),"number"==typeof r.target&&(r.target=m[r.target]),++r.source.weight,++r.target.weight;for(t=0;c>t;++t)r=m[t],isNaN(r.x)&&(r.x=n("x",p)),isNaN(r.y)&&(r.y=n("y",v)),isNaN(r.px)&&(r.px=r.x),isNaN(r.py)&&(r.py=r.y);if(u=[],"function"==typeof f)for(t=0;l>t;++t)u[t]=+f.call(this,y[t],t);else for(t=0;l>t;++t)u[t]=f;if(i=[],"function"==typeof h)for(t=0;l>t;++t)i[t]=+h.call(this,y[t],t);else for(t=0;l>t;++t)i[t]=h;if(o=[],"function"==typeof g)for(t=0;c>t;++t)o[t]=+g.call(this,m[t],t);else for(t=0;c>t;++t)o[t]=g;return a.resume()},a.resume=function(){return a.alpha(.1)},a.stop=function(){return a.alpha(0)},a.drag=function(){return e||(e=Xo.behavior.drag().origin(bt).on("dragstart.force",Fu).on("drag.force",t).on("dragend.force",Ou)),arguments.length?(this.on("mouseover.force",Yu).on("mouseout.force",Iu).call(e),void 0):e},Xo.rebind(a,c,"on")};var us=20,is=1,os=1/0;Xo.layout.hierarchy=function(){function n(t,o,a){var c=u.call(e,t,o);if(t.depth=o,a.push(t),c&&(s=c.length)){for(var s,l,f=-1,h=t.children=new Array(s),g=0,p=o+1;++fg;++g)for(u.call(n,s[0][g],p=v[g],l[0][g][1]),h=1;d>h;++h)u.call(n,s[h][g],p+=l[h-1][g][1],l[h][g][1]);return a}var t=bt,e=Qu,r=ni,u=Ku,i=Ju,o=Gu;return n.values=function(e){return arguments.length?(t=e,n):t},n.order=function(t){return arguments.length?(e="function"==typeof t?t:cs.get(t)||Qu,n):e},n.offset=function(t){return arguments.length?(r="function"==typeof t?t:ss.get(t)||ni,n):r},n.x=function(t){return arguments.length?(i=t,n):i},n.y=function(t){return arguments.length?(o=t,n):o},n.out=function(t){return arguments.length?(u=t,n):u},n};var cs=Xo.map({"inside-out":function(n){var t,e,r=n.length,u=n.map(ti),i=n.map(ei),o=Xo.range(r).sort(function(n,t){return u[n]-u[t]}),a=0,c=0,s=[],l=[];for(t=0;r>t;++t)e=o[t],c>a?(a+=i[e],s.push(e)):(c+=i[e],l.push(e));return l.reverse().concat(s)},reverse:function(n){return Xo.range(n.length).reverse()},"default":Qu}),ss=Xo.map({silhouette:function(n){var t,e,r,u=n.length,i=n[0].length,o=[],a=0,c=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];r>a&&(a=r),o.push(r)}for(e=0;i>e;++e)c[e]=(a-o[e])/2;return c},wiggle:function(n){var t,e,r,u,i,o,a,c,s,l=n.length,f=n[0],h=f.length,g=[];for(g[0]=c=s=0,e=1;h>e;++e){for(t=0,u=0;l>t;++t)u+=n[t][e][1];for(t=0,i=0,a=f[e][0]-f[e-1][0];l>t;++t){for(r=0,o=(n[t][e][1]-n[t][e-1][1])/(2*a);t>r;++r)o+=(n[r][e][1]-n[r][e-1][1])/a;i+=o*n[t][e][1]}g[e]=c-=u?i/u*a:0,s>c&&(s=c)}for(e=0;h>e;++e)g[e]-=s;return g},expand:function(n){var t,e,r,u=n.length,i=n[0].length,o=1/u,a=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];if(r)for(t=0;u>t;t++)n[t][e][1]/=r;else for(t=0;u>t;t++)n[t][e][1]=o}for(e=0;i>e;++e)a[e]=0;return a},zero:ni});Xo.layout.histogram=function(){function n(n,i){for(var o,a,c=[],s=n.map(e,this),l=r.call(this,s,i),f=u.call(this,l,s,i),i=-1,h=s.length,g=f.length-1,p=t?1:1/h;++i0)for(i=-1;++i=l[0]&&a<=l[1]&&(o=c[Xo.bisect(f,a,1,g)-1],o.y+=p,o.push(n[i]));return c}var t=!0,e=Number,r=oi,u=ui;return n.value=function(t){return arguments.length?(e=t,n):e},n.range=function(t){return arguments.length?(r=_t(t),n):r},n.bins=function(t){return arguments.length?(u="number"==typeof t?function(n){return ii(n,t)}:_t(t),n):u},n.frequency=function(e){return arguments.length?(t=!!e,n):t},n},Xo.layout.tree=function(){function n(n,i){function o(n,t){var r=n.children,u=n._tree;if(r&&(i=r.length)){for(var i,a,s,l=r[0],f=l,h=-1;++h0&&(di(mi(a,n,r),n,u),s+=u,l+=u),f+=a._tree.mod,s+=i._tree.mod,h+=c._tree.mod,l+=o._tree.mod;a&&!si(o)&&(o._tree.thread=a,o._tree.mod+=f-l),i&&!ci(c)&&(c._tree.thread=i,c._tree.mod+=s-h,r=n)}return r}var s=t.call(this,n,i),l=s[0];pi(l,function(n,t){n._tree={ancestor:n,prelim:0,mod:0,change:0,shift:0,number:t?t._tree.number+1:0}}),o(l),a(l,-l._tree.prelim);var f=li(l,hi),h=li(l,fi),g=li(l,gi),p=f.x-e(f,h)/2,v=h.x+e(h,f)/2,d=g.depth||1;return pi(l,u?function(n){n.x*=r[0],n.y=n.depth*r[1],delete n._tree}:function(n){n.x=(n.x-p)/(v-p)*r[0],n.y=n.depth/d*r[1],delete n._tree}),s}var t=Xo.layout.hierarchy().sort(null).value(null),e=ai,r=[1,1],u=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(u=null==(r=t),n):u?null:r},n.nodeSize=function(t){return arguments.length?(u=null!=(r=t),n):u?r:null},Vu(n,t)},Xo.layout.pack=function(){function n(n,i){var o=e.call(this,n,i),a=o[0],c=u[0],s=u[1],l=null==t?Math.sqrt:"function"==typeof t?t:function(){return t};if(a.x=a.y=0,pi(a,function(n){n.r=+l(n.value)}),pi(a,bi),r){var f=r*(t?1:Math.max(2*a.r/c,2*a.r/s))/2;pi(a,function(n){n.r+=f}),pi(a,bi),pi(a,function(n){n.r-=f})}return ki(a,c/2,s/2,t?1:1/Math.max(2*a.r/c,2*a.r/s)),o}var t,e=Xo.layout.hierarchy().sort(yi),r=0,u=[1,1];return n.size=function(t){return arguments.length?(u=t,n):u},n.radius=function(e){return arguments.length?(t=null==e||"function"==typeof e?e:+e,n):t},n.padding=function(t){return arguments.length?(r=+t,n):r},Vu(n,e)},Xo.layout.cluster=function(){function n(n,i){var o,a=t.call(this,n,i),c=a[0],s=0;pi(c,function(n){var t=n.children;t&&t.length?(n.x=Ci(t),n.y=Ai(t)):(n.x=o?s+=e(n,o):0,n.y=0,o=n)});var l=Ni(c),f=Li(c),h=l.x-e(l,f)/2,g=f.x+e(f,l)/2;return pi(c,u?function(n){n.x=(n.x-c.x)*r[0],n.y=(c.y-n.y)*r[1]}:function(n){n.x=(n.x-h)/(g-h)*r[0],n.y=(1-(c.y?n.y/c.y:1))*r[1]}),a}var t=Xo.layout.hierarchy().sort(null).value(null),e=ai,r=[1,1],u=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(u=null==(r=t),n):u?null:r},n.nodeSize=function(t){return arguments.length?(u=null!=(r=t),n):u?r:null},Vu(n,t)},Xo.layout.treemap=function(){function n(n,t){for(var e,r,u=-1,i=n.length;++ut?0:t),e.area=isNaN(r)||0>=r?0:r}function t(e){var i=e.children;if(i&&i.length){var o,a,c,s=f(e),l=[],h=i.slice(),p=1/0,v="slice"===g?s.dx:"dice"===g?s.dy:"slice-dice"===g?1&e.depth?s.dy:s.dx:Math.min(s.dx,s.dy);for(n(h,s.dx*s.dy/e.value),l.area=0;(c=h.length)>0;)l.push(o=h[c-1]),l.area+=o.area,"squarify"!==g||(a=r(l,v))<=p?(h.pop(),p=a):(l.area-=l.pop().area,u(l,v,s,!1),v=Math.min(s.dx,s.dy),l.length=l.area=0,p=1/0);l.length&&(u(l,v,s,!0),l.length=l.area=0),i.forEach(t)}}function e(t){var r=t.children;if(r&&r.length){var i,o=f(t),a=r.slice(),c=[];for(n(a,o.dx*o.dy/t.value),c.area=0;i=a.pop();)c.push(i),c.area+=i.area,null!=i.z&&(u(c,i.z?o.dx:o.dy,o,!a.length),c.length=c.area=0);r.forEach(e)}}function r(n,t){for(var e,r=n.area,u=0,i=1/0,o=-1,a=n.length;++oe&&(i=e),e>u&&(u=e));return r*=r,t*=t,r?Math.max(t*u*p/r,r/(t*i*p)):1/0}function u(n,t,e,r){var u,i=-1,o=n.length,a=e.x,s=e.y,l=t?c(n.area/t):0;if(t==e.dx){for((r||l>e.dy)&&(l=e.dy);++ie.dx)&&(l=e.dx);++ie&&(t=1),1>e&&(n=0),function(){var e,r,u;do e=2*Math.random()-1,r=2*Math.random()-1,u=e*e+r*r;while(!u||u>1);return n+t*e*Math.sqrt(-2*Math.log(u)/u)}},logNormal:function(){var n=Xo.random.normal.apply(Xo,arguments);return function(){return Math.exp(n())}},bates:function(n){var t=Xo.random.irwinHall(n);return function(){return t()/n}},irwinHall:function(n){return function(){for(var t=0,e=0;n>e;e++)t+=Math.random();return t}}},Xo.scale={};var ls={floor:bt,ceil:bt};Xo.scale.linear=function(){return Hi([0,1],[0,1],fu,!1)};var fs={s:1,g:1,p:1,r:1,e:1};Xo.scale.log=function(){return $i(Xo.scale.linear().domain([0,1]),10,!0,[1,10])};var hs=Xo.format(".0e"),gs={floor:function(n){return-Math.ceil(-n)},ceil:function(n){return-Math.floor(-n)}};Xo.scale.pow=function(){return Bi(Xo.scale.linear(),1,[0,1])},Xo.scale.sqrt=function(){return Xo.scale.pow().exponent(.5)},Xo.scale.ordinal=function(){return Ji([],{t:"range",a:[[]]})},Xo.scale.category10=function(){return Xo.scale.ordinal().range(ps)},Xo.scale.category20=function(){return Xo.scale.ordinal().range(vs)},Xo.scale.category20b=function(){return Xo.scale.ordinal().range(ds)},Xo.scale.category20c=function(){return Xo.scale.ordinal().range(ms)};var ps=[2062260,16744206,2924588,14034728,9725885,9197131,14907330,8355711,12369186,1556175].map(ht),vs=[2062260,11454440,16744206,16759672,2924588,10018698,14034728,16750742,9725885,12955861,9197131,12885140,14907330,16234194,8355711,13092807,12369186,14408589,1556175,10410725].map(ht),ds=[3750777,5395619,7040719,10264286,6519097,9216594,11915115,13556636,9202993,12426809,15186514,15190932,8666169,11356490,14049643,15177372,8077683,10834324,13528509,14589654].map(ht),ms=[3244733,7057110,10406625,13032431,15095053,16616764,16625259,16634018,3253076,7652470,10607003,13101504,7695281,10394312,12369372,14342891,6513507,9868950,12434877,14277081].map(ht);Xo.scale.quantile=function(){return Gi([],[]) -},Xo.scale.quantize=function(){return Ki(0,1,[0,1])},Xo.scale.threshold=function(){return Qi([.5],[0,1])},Xo.scale.identity=function(){return no([0,1])},Xo.svg={},Xo.svg.arc=function(){function n(){var n=t.apply(this,arguments),i=e.apply(this,arguments),o=r.apply(this,arguments)+ys,a=u.apply(this,arguments)+ys,c=(o>a&&(c=o,o=a,a=c),a-o),s=Sa>c?"0":"1",l=Math.cos(o),f=Math.sin(o),h=Math.cos(a),g=Math.sin(a);return c>=xs?n?"M0,"+i+"A"+i+","+i+" 0 1,1 0,"+-i+"A"+i+","+i+" 0 1,1 0,"+i+"M0,"+n+"A"+n+","+n+" 0 1,0 0,"+-n+"A"+n+","+n+" 0 1,0 0,"+n+"Z":"M0,"+i+"A"+i+","+i+" 0 1,1 0,"+-i+"A"+i+","+i+" 0 1,1 0,"+i+"Z":n?"M"+i*l+","+i*f+"A"+i+","+i+" 0 "+s+",1 "+i*h+","+i*g+"L"+n*h+","+n*g+"A"+n+","+n+" 0 "+s+",0 "+n*l+","+n*f+"Z":"M"+i*l+","+i*f+"A"+i+","+i+" 0 "+s+",1 "+i*h+","+i*g+"L0,0"+"Z"}var t=to,e=eo,r=ro,u=uo;return n.innerRadius=function(e){return arguments.length?(t=_t(e),n):t},n.outerRadius=function(t){return arguments.length?(e=_t(t),n):e},n.startAngle=function(t){return arguments.length?(r=_t(t),n):r},n.endAngle=function(t){return arguments.length?(u=_t(t),n):u},n.centroid=function(){var n=(t.apply(this,arguments)+e.apply(this,arguments))/2,i=(r.apply(this,arguments)+u.apply(this,arguments))/2+ys;return[Math.cos(i)*n,Math.sin(i)*n]},n};var ys=-Ea,xs=ka-Aa;Xo.svg.line=function(){return io(bt)};var Ms=Xo.map({linear:oo,"linear-closed":ao,step:co,"step-before":so,"step-after":lo,basis:mo,"basis-open":yo,"basis-closed":xo,bundle:Mo,cardinal:go,"cardinal-open":fo,"cardinal-closed":ho,monotone:Eo});Ms.forEach(function(n,t){t.key=n,t.closed=/-closed$/.test(n)});var _s=[0,2/3,1/3,0],bs=[0,1/3,2/3,0],ws=[0,1/6,2/3,1/6];Xo.svg.line.radial=function(){var n=io(Ao);return n.radius=n.x,delete n.x,n.angle=n.y,delete n.y,n},so.reverse=lo,lo.reverse=so,Xo.svg.area=function(){return Co(bt)},Xo.svg.area.radial=function(){var n=Co(Ao);return n.radius=n.x,delete n.x,n.innerRadius=n.x0,delete n.x0,n.outerRadius=n.x1,delete n.x1,n.angle=n.y,delete n.y,n.startAngle=n.y0,delete n.y0,n.endAngle=n.y1,delete n.y1,n},Xo.svg.chord=function(){function n(n,a){var c=t(this,i,n,a),s=t(this,o,n,a);return"M"+c.p0+r(c.r,c.p1,c.a1-c.a0)+(e(c,s)?u(c.r,c.p1,c.r,c.p0):u(c.r,c.p1,s.r,s.p0)+r(s.r,s.p1,s.a1-s.a0)+u(s.r,s.p1,c.r,c.p0))+"Z"}function t(n,t,e,r){var u=t.call(n,e,r),i=a.call(n,u,r),o=c.call(n,u,r)+ys,l=s.call(n,u,r)+ys;return{r:i,a0:o,a1:l,p0:[i*Math.cos(o),i*Math.sin(o)],p1:[i*Math.cos(l),i*Math.sin(l)]}}function e(n,t){return n.a0==t.a0&&n.a1==t.a1}function r(n,t,e){return"A"+n+","+n+" 0 "+ +(e>Sa)+",1 "+t}function u(n,t,e,r){return"Q 0,0 "+r}var i=hr,o=gr,a=No,c=ro,s=uo;return n.radius=function(t){return arguments.length?(a=_t(t),n):a},n.source=function(t){return arguments.length?(i=_t(t),n):i},n.target=function(t){return arguments.length?(o=_t(t),n):o},n.startAngle=function(t){return arguments.length?(c=_t(t),n):c},n.endAngle=function(t){return arguments.length?(s=_t(t),n):s},n},Xo.svg.diagonal=function(){function n(n,u){var i=t.call(this,n,u),o=e.call(this,n,u),a=(i.y+o.y)/2,c=[i,{x:i.x,y:a},{x:o.x,y:a},o];return c=c.map(r),"M"+c[0]+"C"+c[1]+" "+c[2]+" "+c[3]}var t=hr,e=gr,r=Lo;return n.source=function(e){return arguments.length?(t=_t(e),n):t},n.target=function(t){return arguments.length?(e=_t(t),n):e},n.projection=function(t){return arguments.length?(r=t,n):r},n},Xo.svg.diagonal.radial=function(){var n=Xo.svg.diagonal(),t=Lo,e=n.projection;return n.projection=function(n){return arguments.length?e(zo(t=n)):t},n},Xo.svg.symbol=function(){function n(n,r){return(Ss.get(t.call(this,n,r))||Ro)(e.call(this,n,r))}var t=To,e=qo;return n.type=function(e){return arguments.length?(t=_t(e),n):t},n.size=function(t){return arguments.length?(e=_t(t),n):e},n};var Ss=Xo.map({circle:Ro,cross:function(n){var t=Math.sqrt(n/5)/2;return"M"+-3*t+","+-t+"H"+-t+"V"+-3*t+"H"+t+"V"+-t+"H"+3*t+"V"+t+"H"+t+"V"+3*t+"H"+-t+"V"+t+"H"+-3*t+"Z"},diamond:function(n){var t=Math.sqrt(n/(2*Cs)),e=t*Cs;return"M0,"+-t+"L"+e+",0"+" 0,"+t+" "+-e+",0"+"Z"},square:function(n){var t=Math.sqrt(n)/2;return"M"+-t+","+-t+"L"+t+","+-t+" "+t+","+t+" "+-t+","+t+"Z"},"triangle-down":function(n){var t=Math.sqrt(n/As),e=t*As/2;return"M0,"+e+"L"+t+","+-e+" "+-t+","+-e+"Z"},"triangle-up":function(n){var t=Math.sqrt(n/As),e=t*As/2;return"M0,"+-e+"L"+t+","+e+" "+-t+","+e+"Z"}});Xo.svg.symbolTypes=Ss.keys();var ks,Es,As=Math.sqrt(3),Cs=Math.tan(30*Na),Ns=[],Ls=0;Ns.call=da.call,Ns.empty=da.empty,Ns.node=da.node,Ns.size=da.size,Xo.transition=function(n){return arguments.length?ks?n.transition():n:xa.transition()},Xo.transition.prototype=Ns,Ns.select=function(n){var t,e,r,u=this.id,i=[];n=M(n);for(var o=-1,a=this.length;++oi;i++){u.push(t=[]);for(var e=this[i],a=0,c=e.length;c>a;a++)(r=e[a])&&n.call(r,r.__data__,a,i)&&t.push(r)}return Do(u,this.id)},Ns.tween=function(n,t){var e=this.id;return arguments.length<2?this.node().__transition__[e].tween.get(n):R(this,null==t?function(t){t.__transition__[e].tween.remove(n)}:function(r){r.__transition__[e].tween.set(n,t)})},Ns.attr=function(n,t){function e(){this.removeAttribute(a)}function r(){this.removeAttributeNS(a.space,a.local)}function u(n){return null==n?e:(n+="",function(){var t,e=this.getAttribute(a);return e!==n&&(t=o(e,n),function(n){this.setAttribute(a,t(n))})})}function i(n){return null==n?r:(n+="",function(){var t,e=this.getAttributeNS(a.space,a.local);return e!==n&&(t=o(e,n),function(n){this.setAttributeNS(a.space,a.local,t(n))})})}if(arguments.length<2){for(t in n)this.attr(t,n[t]);return this}var o="transform"==n?Ru:fu,a=Xo.ns.qualify(n);return Po(this,"attr."+n,t,a.local?i:u)},Ns.attrTween=function(n,t){function e(n,e){var r=t.call(this,n,e,this.getAttribute(u));return r&&function(n){this.setAttribute(u,r(n))}}function r(n,e){var r=t.call(this,n,e,this.getAttributeNS(u.space,u.local));return r&&function(n){this.setAttributeNS(u.space,u.local,r(n))}}var u=Xo.ns.qualify(n);return this.tween("attr."+n,u.local?r:e)},Ns.style=function(n,t,e){function r(){this.style.removeProperty(n)}function u(t){return null==t?r:(t+="",function(){var r,u=Go.getComputedStyle(this,null).getPropertyValue(n);return u!==t&&(r=fu(u,t),function(t){this.style.setProperty(n,r(t),e)})})}var i=arguments.length;if(3>i){if("string"!=typeof n){2>i&&(t="");for(e in n)this.style(e,n[e],t);return this}e=""}return Po(this,"style."+n,t,u)},Ns.styleTween=function(n,t,e){function r(r,u){var i=t.call(this,r,u,Go.getComputedStyle(this,null).getPropertyValue(n));return i&&function(t){this.style.setProperty(n,i(t),e)}}return arguments.length<3&&(e=""),this.tween("style."+n,r)},Ns.text=function(n){return Po(this,"text",n,Uo)},Ns.remove=function(){return this.each("end.transition",function(){var n;this.__transition__.count<2&&(n=this.parentNode)&&n.removeChild(this)})},Ns.ease=function(n){var t=this.id;return arguments.length<1?this.node().__transition__[t].ease:("function"!=typeof n&&(n=Xo.ease.apply(Xo,arguments)),R(this,function(e){e.__transition__[t].ease=n}))},Ns.delay=function(n){var t=this.id;return R(this,"function"==typeof n?function(e,r,u){e.__transition__[t].delay=+n.call(e,e.__data__,r,u)}:(n=+n,function(e){e.__transition__[t].delay=n}))},Ns.duration=function(n){var t=this.id;return R(this,"function"==typeof n?function(e,r,u){e.__transition__[t].duration=Math.max(1,n.call(e,e.__data__,r,u))}:(n=Math.max(1,n),function(e){e.__transition__[t].duration=n}))},Ns.each=function(n,t){var e=this.id;if(arguments.length<2){var r=Es,u=ks;ks=e,R(this,function(t,r,u){Es=t.__transition__[e],n.call(t,t.__data__,r,u)}),Es=r,ks=u}else R(this,function(r){var u=r.__transition__[e];(u.event||(u.event=Xo.dispatch("start","end"))).on(n,t)});return this},Ns.transition=function(){for(var n,t,e,r,u=this.id,i=++Ls,o=[],a=0,c=this.length;c>a;a++){o.push(n=[]);for(var t=this[a],s=0,l=t.length;l>s;s++)(e=t[s])&&(r=Object.create(e.__transition__[u]),r.delay+=r.duration,jo(e,s,i,r)),n.push(e)}return Do(o,i)},Xo.svg.axis=function(){function n(n){n.each(function(){var n,s=Xo.select(this),l=this.__chart__||e,f=this.__chart__=e.copy(),h=null==c?f.ticks?f.ticks.apply(f,a):f.domain():c,g=null==t?f.tickFormat?f.tickFormat.apply(f,a):bt:t,p=s.selectAll(".tick").data(h,f),v=p.enter().insert("g",".domain").attr("class","tick").style("opacity",Aa),d=Xo.transition(p.exit()).style("opacity",Aa).remove(),m=Xo.transition(p).style("opacity",1),y=Ri(f),x=s.selectAll(".domain").data([0]),M=(x.enter().append("path").attr("class","domain"),Xo.transition(x));v.append("line"),v.append("text");var _=v.select("line"),b=m.select("line"),w=p.select("text").text(g),S=v.select("text"),k=m.select("text");switch(r){case"bottom":n=Ho,_.attr("y2",u),S.attr("y",Math.max(u,0)+o),b.attr("x2",0).attr("y2",u),k.attr("x",0).attr("y",Math.max(u,0)+o),w.attr("dy",".71em").style("text-anchor","middle"),M.attr("d","M"+y[0]+","+i+"V0H"+y[1]+"V"+i);break;case"top":n=Ho,_.attr("y2",-u),S.attr("y",-(Math.max(u,0)+o)),b.attr("x2",0).attr("y2",-u),k.attr("x",0).attr("y",-(Math.max(u,0)+o)),w.attr("dy","0em").style("text-anchor","middle"),M.attr("d","M"+y[0]+","+-i+"V0H"+y[1]+"V"+-i);break;case"left":n=Fo,_.attr("x2",-u),S.attr("x",-(Math.max(u,0)+o)),b.attr("x2",-u).attr("y2",0),k.attr("x",-(Math.max(u,0)+o)).attr("y",0),w.attr("dy",".32em").style("text-anchor","end"),M.attr("d","M"+-i+","+y[0]+"H0V"+y[1]+"H"+-i);break;case"right":n=Fo,_.attr("x2",u),S.attr("x",Math.max(u,0)+o),b.attr("x2",u).attr("y2",0),k.attr("x",Math.max(u,0)+o).attr("y",0),w.attr("dy",".32em").style("text-anchor","start"),M.attr("d","M"+i+","+y[0]+"H0V"+y[1]+"H"+i)}if(f.rangeBand){var E=f,A=E.rangeBand()/2;l=f=function(n){return E(n)+A}}else l.rangeBand?l=f:d.call(n,f);v.call(n,l),m.call(n,f)})}var t,e=Xo.scale.linear(),r=zs,u=6,i=6,o=3,a=[10],c=null;return n.scale=function(t){return arguments.length?(e=t,n):e},n.orient=function(t){return arguments.length?(r=t in qs?t+"":zs,n):r},n.ticks=function(){return arguments.length?(a=arguments,n):a},n.tickValues=function(t){return arguments.length?(c=t,n):c},n.tickFormat=function(e){return arguments.length?(t=e,n):t},n.tickSize=function(t){var e=arguments.length;return e?(u=+t,i=+arguments[e-1],n):u},n.innerTickSize=function(t){return arguments.length?(u=+t,n):u},n.outerTickSize=function(t){return arguments.length?(i=+t,n):i},n.tickPadding=function(t){return arguments.length?(o=+t,n):o},n.tickSubdivide=function(){return arguments.length&&n},n};var zs="bottom",qs={top:1,right:1,bottom:1,left:1};Xo.svg.brush=function(){function n(i){i.each(function(){var i=Xo.select(this).style("pointer-events","all").style("-webkit-tap-highlight-color","rgba(0,0,0,0)").on("mousedown.brush",u).on("touchstart.brush",u),o=i.selectAll(".background").data([0]);o.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),i.selectAll(".extent").data([0]).enter().append("rect").attr("class","extent").style("cursor","move");var a=i.selectAll(".resize").data(p,bt);a.exit().remove(),a.enter().append("g").attr("class",function(n){return"resize "+n}).style("cursor",function(n){return Ts[n]}).append("rect").attr("x",function(n){return/[ew]$/.test(n)?-3:null}).attr("y",function(n){return/^[ns]/.test(n)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),a.style("display",n.empty()?"none":null);var l,f=Xo.transition(i),h=Xo.transition(o);c&&(l=Ri(c),h.attr("x",l[0]).attr("width",l[1]-l[0]),e(f)),s&&(l=Ri(s),h.attr("y",l[0]).attr("height",l[1]-l[0]),r(f)),t(f)})}function t(n){n.selectAll(".resize").attr("transform",function(n){return"translate("+l[+/e$/.test(n)]+","+f[+/^s/.test(n)]+")"})}function e(n){n.select(".extent").attr("x",l[0]),n.selectAll(".extent,.n>rect,.s>rect").attr("width",l[1]-l[0])}function r(n){n.select(".extent").attr("y",f[0]),n.selectAll(".extent,.e>rect,.w>rect").attr("height",f[1]-f[0])}function u(){function u(){32==Xo.event.keyCode&&(C||(x=null,L[0]-=l[1],L[1]-=f[1],C=2),d())}function p(){32==Xo.event.keyCode&&2==C&&(L[0]+=l[1],L[1]+=f[1],C=0,d())}function v(){var n=Xo.mouse(_),u=!1;M&&(n[0]+=M[0],n[1]+=M[1]),C||(Xo.event.altKey?(x||(x=[(l[0]+l[1])/2,(f[0]+f[1])/2]),L[0]=l[+(n[0]p?(u=r,r=p):u=p),v[0]!=r||v[1]!=u?(e?o=null:i=null,v[0]=r,v[1]=u,!0):void 0}function y(){v(),S.style("pointer-events","all").selectAll(".resize").style("display",n.empty()?"none":null),Xo.select("body").style("cursor",null),z.on("mousemove.brush",null).on("mouseup.brush",null).on("touchmove.brush",null).on("touchend.brush",null).on("keydown.brush",null).on("keyup.brush",null),N(),w({type:"brushend"})}var x,M,_=this,b=Xo.select(Xo.event.target),w=a.of(_,arguments),S=Xo.select(_),k=b.datum(),E=!/^(n|s)$/.test(k)&&c,A=!/^(e|w)$/.test(k)&&s,C=b.classed("extent"),N=O(),L=Xo.mouse(_),z=Xo.select(Go).on("keydown.brush",u).on("keyup.brush",p);if(Xo.event.changedTouches?z.on("touchmove.brush",v).on("touchend.brush",y):z.on("mousemove.brush",v).on("mouseup.brush",y),S.interrupt().selectAll("*").interrupt(),C)L[0]=l[0]-L[0],L[1]=f[0]-L[1];else if(k){var q=+/w$/.test(k),T=+/^n/.test(k);M=[l[1-q]-L[0],f[1-T]-L[1]],L[0]=l[q],L[1]=f[T]}else Xo.event.altKey&&(x=L.slice());S.style("pointer-events","none").selectAll(".resize").style("display",null),Xo.select("body").style("cursor",b.style("cursor")),w({type:"brushstart"}),v()}var i,o,a=y(n,"brushstart","brush","brushend"),c=null,s=null,l=[0,0],f=[0,0],h=!0,g=!0,p=Rs[0];return n.event=function(n){n.each(function(){var n=a.of(this,arguments),t={x:l,y:f,i:i,j:o},e=this.__chart__||t;this.__chart__=t,ks?Xo.select(this).transition().each("start.brush",function(){i=e.i,o=e.j,l=e.x,f=e.y,n({type:"brushstart"})}).tween("brush:brush",function(){var e=hu(l,t.x),r=hu(f,t.y);return i=o=null,function(u){l=t.x=e(u),f=t.y=r(u),n({type:"brush",mode:"resize"})}}).each("end.brush",function(){i=t.i,o=t.j,n({type:"brush",mode:"resize"}),n({type:"brushend"})}):(n({type:"brushstart"}),n({type:"brush",mode:"resize"}),n({type:"brushend"}))})},n.x=function(t){return arguments.length?(c=t,p=Rs[!c<<1|!s],n):c},n.y=function(t){return arguments.length?(s=t,p=Rs[!c<<1|!s],n):s},n.clamp=function(t){return arguments.length?(c&&s?(h=!!t[0],g=!!t[1]):c?h=!!t:s&&(g=!!t),n):c&&s?[h,g]:c?h:s?g:null},n.extent=function(t){var e,r,u,a,h;return arguments.length?(c&&(e=t[0],r=t[1],s&&(e=e[0],r=r[0]),i=[e,r],c.invert&&(e=c(e),r=c(r)),e>r&&(h=e,e=r,r=h),(e!=l[0]||r!=l[1])&&(l=[e,r])),s&&(u=t[0],a=t[1],c&&(u=u[1],a=a[1]),o=[u,a],s.invert&&(u=s(u),a=s(a)),u>a&&(h=u,u=a,a=h),(u!=f[0]||a!=f[1])&&(f=[u,a])),n):(c&&(i?(e=i[0],r=i[1]):(e=l[0],r=l[1],c.invert&&(e=c.invert(e),r=c.invert(r)),e>r&&(h=e,e=r,r=h))),s&&(o?(u=o[0],a=o[1]):(u=f[0],a=f[1],s.invert&&(u=s.invert(u),a=s.invert(a)),u>a&&(h=u,u=a,a=h))),c&&s?[[e,u],[r,a]]:c?[e,r]:s&&[u,a])},n.clear=function(){return n.empty()||(l=[0,0],f=[0,0],i=o=null),n},n.empty=function(){return!!c&&l[0]==l[1]||!!s&&f[0]==f[1]},Xo.rebind(n,a,"on")};var Ts={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},Rs=[["n","e","s","w","nw","ne","se","sw"],["e","w"],["n","s"],[]],Ds=tc.format=ac.timeFormat,Ps=Ds.utc,Us=Ps("%Y-%m-%dT%H:%M:%S.%LZ");Ds.iso=Date.prototype.toISOString&&+new Date("2000-01-01T00:00:00.000Z")?Oo:Us,Oo.parse=function(n){var t=new Date(n);return isNaN(t)?null:t},Oo.toString=Us.toString,tc.second=Rt(function(n){return new ec(1e3*Math.floor(n/1e3))},function(n,t){n.setTime(n.getTime()+1e3*Math.floor(t))},function(n){return n.getSeconds()}),tc.seconds=tc.second.range,tc.seconds.utc=tc.second.utc.range,tc.minute=Rt(function(n){return new ec(6e4*Math.floor(n/6e4))},function(n,t){n.setTime(n.getTime()+6e4*Math.floor(t))},function(n){return n.getMinutes()}),tc.minutes=tc.minute.range,tc.minutes.utc=tc.minute.utc.range,tc.hour=Rt(function(n){var t=n.getTimezoneOffset()/60;return new ec(36e5*(Math.floor(n/36e5-t)+t))},function(n,t){n.setTime(n.getTime()+36e5*Math.floor(t))},function(n){return n.getHours()}),tc.hours=tc.hour.range,tc.hours.utc=tc.hour.utc.range,tc.month=Rt(function(n){return n=tc.day(n),n.setDate(1),n},function(n,t){n.setMonth(n.getMonth()+t)},function(n){return n.getMonth()}),tc.months=tc.month.range,tc.months.utc=tc.month.utc.range;var js=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],Hs=[[tc.second,1],[tc.second,5],[tc.second,15],[tc.second,30],[tc.minute,1],[tc.minute,5],[tc.minute,15],[tc.minute,30],[tc.hour,1],[tc.hour,3],[tc.hour,6],[tc.hour,12],[tc.day,1],[tc.day,2],[tc.week,1],[tc.month,1],[tc.month,3],[tc.year,1]],Fs=Ds.multi([[".%L",function(n){return n.getMilliseconds()}],[":%S",function(n){return n.getSeconds()}],["%I:%M",function(n){return n.getMinutes()}],["%I %p",function(n){return n.getHours()}],["%a %d",function(n){return n.getDay()&&1!=n.getDate()}],["%b %d",function(n){return 1!=n.getDate()}],["%B",function(n){return n.getMonth()}],["%Y",be]]),Os={range:function(n,t,e){return Xo.range(+n,+t,e).map(Io)},floor:bt,ceil:bt};Hs.year=tc.year,tc.scale=function(){return Yo(Xo.scale.linear(),Hs,Fs)};var Ys=Hs.map(function(n){return[n[0].utc,n[1]]}),Is=Ps.multi([[".%L",function(n){return n.getUTCMilliseconds()}],[":%S",function(n){return n.getUTCSeconds()}],["%I:%M",function(n){return n.getUTCMinutes()}],["%I %p",function(n){return n.getUTCHours()}],["%a %d",function(n){return n.getUTCDay()&&1!=n.getUTCDate()}],["%b %d",function(n){return 1!=n.getUTCDate()}],["%B",function(n){return n.getUTCMonth()}],["%Y",be]]);Ys.year=tc.year.utc,tc.scale.utc=function(){return Yo(Xo.scale.linear(),Ys,Is)},Xo.text=wt(function(n){return n.responseText}),Xo.json=function(n,t){return St(n,"application/json",Zo,t)},Xo.html=function(n,t){return St(n,"text/html",Vo,t)},Xo.xml=wt(function(n){return n.responseXML}),"function"==typeof define&&define.amd?define(Xo):"object"==typeof module&&module.exports?module.exports=Xo:this.d3=Xo}(); \ No newline at end of file diff --git a/themes/blueprint/js/d3_license b/themes/blueprint/js/d3_license deleted file mode 100644 index ef77418668b..00000000000 --- a/themes/blueprint/js/d3_license +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2010-2014, Michael Bostock -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -* The name Michael Bostock may not be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL MICHAEL BOSTOCK BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, -EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - diff --git a/themes/blueprint/js/embedGBS.js b/themes/blueprint/js/embedGBS.js deleted file mode 100644 index ae81464ebee..00000000000 --- a/themes/blueprint/js/embedGBS.js +++ /dev/null @@ -1,14 +0,0 @@ -/*global getBibKeyString, google */ - -// we don't need to wait for dom ready since lang is in the dom root -var lang = document.documentElement.getAttribute('lang'); -google.load("books", "0", {"language":lang}); - -function initialize() { - var bibkeys = getBibKeyString().split(/\s+/); - var viewer = new google.books.DefaultViewer(document.getElementById('gbsViewer')); - viewer.load(bibkeys); -} - -google.setOnLoadCallback(initialize); - diff --git a/themes/blueprint/js/feedback.js b/themes/blueprint/js/feedback.js deleted file mode 100644 index a9dbc84fc97..00000000000 --- a/themes/blueprint/js/feedback.js +++ /dev/null @@ -1,62 +0,0 @@ -/*global alert,path*/ - -// This overrides settings in jquery.tabSlideOut.v2.0.js -$(document).ready(function(){ - $('.slide-out-div').tabSlideOut({ - pathToTabImage: path + '/themes/blueprint/images/trans.png', - imageHeight: '86px', - imageWidth: '30px', - handleOffset: '-1', - speed: '300', - topPos: '150px' - }); -}); - -// This is the ajax for the feedback -$(document).ready(function(){ - $('#contact_form label.error').hide(); - $("div#slideOut").removeClass('slideOutForm'); - $('input.text-input').addClass('feedbackDeselect'); - $('input.text-input').focus(function(){ - $(this).removeClass('feedbackDeselect').addClass('feedbackSelect'); - }); - $('input.text-input').blur(function(){ - $(this).removeClass('feedbackSelect').addClass('feedbackDeselect'); - }); - - $('#contact_form form').validate(); - $('#contact_form form').unbind('submit').submit(function() { - // validate and process form here - var name = $("input#name"); - var email = $("input#email"); - var comments = $("textarea#comments"); - if (!$(this).valid() || !name.valid() || !email.valid() || !comments.valid()) { return false; } - - var dataString = 'name='+ encodeURIComponent(name.val()) + '&email=' - + encodeURIComponent(email.val()) + '&comments=' + encodeURIComponent(comments.val()); - - // Grabs hidden inputs - var formSuccess = $("input#formSuccess").val(); - var feedbackSuccess = $("input#feedbackSuccess").val(); - var feedbackFailure = $("input#feedbackFailure").val(); - - $.ajax({ - type: "POST", - url: $(this).attr('action'), - data: dataString, - success: function() { - $('#contact_form').html("
    "); - $('#message').html("

    "+formSuccess+"


    ") - .append("

    "+feedbackSuccess+"

    ") - .hide() - .fadeIn(1500, function() { - $('#message'); - }); - }, - error: function() { - alert(feedbackFailure); - } - }); - return false; - }); -}); diff --git a/themes/blueprint/js/flot/LICENSE.txt b/themes/blueprint/js/flot/LICENSE.txt deleted file mode 100644 index 07d5b2094d1..00000000000 --- a/themes/blueprint/js/flot/LICENSE.txt +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (c) 2007-2009 IOLA and Ole Laursen - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. diff --git a/themes/blueprint/js/flot/excanvas.min.js b/themes/blueprint/js/flot/excanvas.min.js deleted file mode 100644 index 988f934a183..00000000000 --- a/themes/blueprint/js/flot/excanvas.min.js +++ /dev/null @@ -1 +0,0 @@ -if(!document.createElement("canvas").getContext){(function(){var z=Math;var K=z.round;var J=z.sin;var U=z.cos;var b=z.abs;var k=z.sqrt;var D=10;var F=D/2;function T(){return this.context_||(this.context_=new W(this))}var O=Array.prototype.slice;function G(i,j,m){var Z=O.call(arguments,2);return function(){return i.apply(j,Z.concat(O.call(arguments)))}}function AD(Z){return String(Z).replace(/&/g,"&").replace(/"/g,""")}function r(i){if(!i.namespaces.g_vml_){i.namespaces.add("g_vml_","urn:schemas-microsoft-com:vml","#default#VML")}if(!i.namespaces.g_o_){i.namespaces.add("g_o_","urn:schemas-microsoft-com:office:office","#default#VML")}if(!i.styleSheets.ex_canvas_){var Z=i.createStyleSheet();Z.owningElement.id="ex_canvas_";Z.cssText="canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}"}}r(document);var E={init:function(Z){if(/MSIE/.test(navigator.userAgent)&&!window.opera){var i=Z||document;i.createElement("canvas");i.attachEvent("onreadystatechange",G(this.init_,this,i))}},init_:function(m){var j=m.getElementsByTagName("canvas");for(var Z=0;Z1){j--}if(6*j<1){return i+(Z-i)*6*j}else{if(2*j<1){return Z}else{if(3*j<2){return i+(Z-i)*(2/3-j)*6}else{return i}}}}function Y(Z){var AE,p=1;Z=String(Z);if(Z.charAt(0)=="#"){AE=Z}else{if(/^rgb/.test(Z)){var m=g(Z);var AE="#",AF;for(var j=0;j<3;j++){if(m[j].indexOf("%")!=-1){AF=Math.floor(C(m[j])*255)}else{AF=Number(m[j])}AE+=I[N(AF,0,255)]}p=m[3]}else{if(/^hsl/.test(Z)){var m=g(Z);AE=c(m);p=m[3]}else{AE=B[Z]||Z}}}return{color:AE,alpha:p}}var L={style:"normal",variant:"normal",weight:"normal",size:10,family:"sans-serif"};var f={};function X(Z){if(f[Z]){return f[Z]}var m=document.createElement("div");var j=m.style;try{j.font=Z}catch(i){}return f[Z]={style:j.fontStyle||L.style,variant:j.fontVariant||L.variant,weight:j.fontWeight||L.weight,size:j.fontSize||L.size,family:j.fontFamily||L.family}}function P(j,i){var Z={};for(var AF in j){Z[AF]=j[AF]}var AE=parseFloat(i.currentStyle.fontSize),m=parseFloat(j.size);if(typeof j.size=="number"){Z.size=j.size}else{if(j.size.indexOf("px")!=-1){Z.size=m}else{if(j.size.indexOf("em")!=-1){Z.size=AE*m}else{if(j.size.indexOf("%")!=-1){Z.size=(AE/100)*m}else{if(j.size.indexOf("pt")!=-1){Z.size=m/0.75}else{Z.size=AE}}}}}Z.size*=0.981;return Z}function AA(Z){return Z.style+" "+Z.variant+" "+Z.weight+" "+Z.size+"px "+Z.family}function t(Z){switch(Z){case"butt":return"flat";case"round":return"round";case"square":default:return"square"}}function W(i){this.m_=V();this.mStack_=[];this.aStack_=[];this.currentPath_=[];this.strokeStyle="#000";this.fillStyle="#000";this.lineWidth=1;this.lineJoin="miter";this.lineCap="butt";this.miterLimit=D*1;this.globalAlpha=1;this.font="10px sans-serif";this.textAlign="left";this.textBaseline="alphabetic";this.canvas=i;var Z=i.ownerDocument.createElement("div");Z.style.width=i.clientWidth+"px";Z.style.height=i.clientHeight+"px";Z.style.overflow="hidden";Z.style.position="absolute";i.appendChild(Z);this.element_=Z;this.arcScaleX_=1;this.arcScaleY_=1;this.lineScale_=1}var M=W.prototype;M.clearRect=function(){if(this.textMeasureEl_){this.textMeasureEl_.removeNode(true);this.textMeasureEl_=null}this.element_.innerHTML=""};M.beginPath=function(){this.currentPath_=[]};M.moveTo=function(i,Z){var j=this.getCoords_(i,Z);this.currentPath_.push({type:"moveTo",x:j.x,y:j.y});this.currentX_=j.x;this.currentY_=j.y};M.lineTo=function(i,Z){var j=this.getCoords_(i,Z);this.currentPath_.push({type:"lineTo",x:j.x,y:j.y});this.currentX_=j.x;this.currentY_=j.y};M.bezierCurveTo=function(j,i,AI,AH,AG,AE){var Z=this.getCoords_(AG,AE);var AF=this.getCoords_(j,i);var m=this.getCoords_(AI,AH);e(this,AF,m,Z)};function e(Z,m,j,i){Z.currentPath_.push({type:"bezierCurveTo",cp1x:m.x,cp1y:m.y,cp2x:j.x,cp2y:j.y,x:i.x,y:i.y});Z.currentX_=i.x;Z.currentY_=i.y}M.quadraticCurveTo=function(AG,j,i,Z){var AF=this.getCoords_(AG,j);var AE=this.getCoords_(i,Z);var AH={x:this.currentX_+2/3*(AF.x-this.currentX_),y:this.currentY_+2/3*(AF.y-this.currentY_)};var m={x:AH.x+(AE.x-this.currentX_)/3,y:AH.y+(AE.y-this.currentY_)/3};e(this,AH,m,AE)};M.arc=function(AJ,AH,AI,AE,i,j){AI*=D;var AN=j?"at":"wa";var AK=AJ+U(AE)*AI-F;var AM=AH+J(AE)*AI-F;var Z=AJ+U(i)*AI-F;var AL=AH+J(i)*AI-F;if(AK==Z&&!j){AK+=0.125}var m=this.getCoords_(AJ,AH);var AG=this.getCoords_(AK,AM);var AF=this.getCoords_(Z,AL);this.currentPath_.push({type:AN,x:m.x,y:m.y,radius:AI,xStart:AG.x,yStart:AG.y,xEnd:AF.x,yEnd:AF.y})};M.rect=function(j,i,Z,m){this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath()};M.strokeRect=function(j,i,Z,m){var p=this.currentPath_;this.beginPath();this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath();this.stroke();this.currentPath_=p};M.fillRect=function(j,i,Z,m){var p=this.currentPath_;this.beginPath();this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath();this.fill();this.currentPath_=p};M.createLinearGradient=function(i,m,Z,j){var p=new v("gradient");p.x0_=i;p.y0_=m;p.x1_=Z;p.y1_=j;return p};M.createRadialGradient=function(m,AE,j,i,p,Z){var AF=new v("gradientradial");AF.x0_=m;AF.y0_=AE;AF.r0_=j;AF.x1_=i;AF.y1_=p;AF.r1_=Z;return AF};M.drawImage=function(AO,j){var AH,AF,AJ,AV,AM,AK,AQ,AX;var AI=AO.runtimeStyle.width;var AN=AO.runtimeStyle.height;AO.runtimeStyle.width="auto";AO.runtimeStyle.height="auto";var AG=AO.width;var AT=AO.height;AO.runtimeStyle.width=AI;AO.runtimeStyle.height=AN;if(arguments.length==3){AH=arguments[1];AF=arguments[2];AM=AK=0;AQ=AJ=AG;AX=AV=AT}else{if(arguments.length==5){AH=arguments[1];AF=arguments[2];AJ=arguments[3];AV=arguments[4];AM=AK=0;AQ=AG;AX=AT}else{if(arguments.length==9){AM=arguments[1];AK=arguments[2];AQ=arguments[3];AX=arguments[4];AH=arguments[5];AF=arguments[6];AJ=arguments[7];AV=arguments[8]}else{throw Error("Invalid number of arguments")}}}var AW=this.getCoords_(AH,AF);var m=AQ/2;var i=AX/2;var AU=[];var Z=10;var AE=10;AU.push(" ','","");this.element_.insertAdjacentHTML("BeforeEnd",AU.join(""))};M.stroke=function(AM){var m=10;var AN=10;var AE=5000;var AG={x:null,y:null};var AL={x:null,y:null};for(var AH=0;AHAL.x){AL.x=Z.x}if(AG.y==null||Z.yAL.y){AL.y=Z.y}}}AK.push(' ">');if(!AM){R(this,AK)}else{a(this,AK,AG,AL)}AK.push("");this.element_.insertAdjacentHTML("beforeEnd",AK.join(""))}};function R(j,AE){var i=Y(j.strokeStyle);var m=i.color;var p=i.alpha*j.globalAlpha;var Z=j.lineScale_*j.lineWidth;if(Z<1){p*=Z}AE.push("')}function a(AO,AG,Ah,AP){var AH=AO.fillStyle;var AY=AO.arcScaleX_;var AX=AO.arcScaleY_;var Z=AP.x-Ah.x;var m=AP.y-Ah.y;if(AH instanceof v){var AL=0;var Ac={x:0,y:0};var AU=0;var AK=1;if(AH.type_=="gradient"){var AJ=AH.x0_/AY;var j=AH.y0_/AX;var AI=AH.x1_/AY;var Aj=AH.y1_/AX;var Ag=AO.getCoords_(AJ,j);var Af=AO.getCoords_(AI,Aj);var AE=Af.x-Ag.x;var p=Af.y-Ag.y;AL=Math.atan2(AE,p)*180/Math.PI;if(AL<0){AL+=360}if(AL<0.000001){AL=0}}else{var Ag=AO.getCoords_(AH.x0_,AH.y0_);Ac={x:(Ag.x-Ah.x)/Z,y:(Ag.y-Ah.y)/m};Z/=AY*D;m/=AX*D;var Aa=z.max(Z,m);AU=2*AH.r0_/Aa;AK=2*AH.r1_/Aa-AU}var AS=AH.colors_;AS.sort(function(Ak,i){return Ak.offset-i.offset});var AN=AS.length;var AR=AS[0].color;var AQ=AS[AN-1].color;var AW=AS[0].alpha*AO.globalAlpha;var AV=AS[AN-1].alpha*AO.globalAlpha;var Ab=[];for(var Ae=0;Ae')}else{if(AH instanceof u){if(Z&&m){var AF=-Ah.x;var AZ=-Ah.y;AG.push("')}}else{var Ai=Y(AO.fillStyle);var AT=Ai.color;var Ad=Ai.alpha*AO.globalAlpha;AG.push('')}}}M.fill=function(){this.stroke(true)};M.closePath=function(){this.currentPath_.push({type:"close"})};M.getCoords_=function(j,i){var Z=this.m_;return{x:D*(j*Z[0][0]+i*Z[1][0]+Z[2][0])-F,y:D*(j*Z[0][1]+i*Z[1][1]+Z[2][1])-F}};M.save=function(){var Z={};Q(this,Z);this.aStack_.push(Z);this.mStack_.push(this.m_);this.m_=d(V(),this.m_)};M.restore=function(){if(this.aStack_.length){Q(this.aStack_.pop(),this);this.m_=this.mStack_.pop()}};function H(Z){return isFinite(Z[0][0])&&isFinite(Z[0][1])&&isFinite(Z[1][0])&&isFinite(Z[1][1])&&isFinite(Z[2][0])&&isFinite(Z[2][1])}function y(i,Z,j){if(!H(Z)){return }i.m_=Z;if(j){var p=Z[0][0]*Z[1][1]-Z[0][1]*Z[1][0];i.lineScale_=k(b(p))}}M.translate=function(j,i){var Z=[[1,0,0],[0,1,0],[j,i,1]];y(this,d(Z,this.m_),false)};M.rotate=function(i){var m=U(i);var j=J(i);var Z=[[m,j,0],[-j,m,0],[0,0,1]];y(this,d(Z,this.m_),false)};M.scale=function(j,i){this.arcScaleX_*=j;this.arcScaleY_*=i;var Z=[[j,0,0],[0,i,0],[0,0,1]];y(this,d(Z,this.m_),true)};M.transform=function(p,m,AF,AE,i,Z){var j=[[p,m,0],[AF,AE,0],[i,Z,1]];y(this,d(j,this.m_),true)};M.setTransform=function(AE,p,AG,AF,j,i){var Z=[[AE,p,0],[AG,AF,0],[j,i,1]];y(this,Z,true)};M.drawText_=function(AK,AI,AH,AN,AG){var AM=this.m_,AQ=1000,i=0,AP=AQ,AF={x:0,y:0},AE=[];var Z=P(X(this.font),this.element_);var j=AA(Z);var AR=this.element_.currentStyle;var p=this.textAlign.toLowerCase();switch(p){case"left":case"center":case"right":break;case"end":p=AR.direction=="ltr"?"right":"left";break;case"start":p=AR.direction=="rtl"?"right":"left";break;default:p="left"}switch(this.textBaseline){case"hanging":case"top":AF.y=Z.size/1.75;break;case"middle":break;default:case null:case"alphabetic":case"ideographic":case"bottom":AF.y=-Z.size/2.25;break}switch(p){case"right":i=AQ;AP=0.05;break;case"center":i=AP=AQ/2;break}var AO=this.getCoords_(AI+AF.x,AH+AF.y);AE.push('');if(AG){R(this,AE)}else{a(this,AE,{x:-i,y:0},{x:AP,y:Z.size})}var AL=AM[0][0].toFixed(3)+","+AM[1][0].toFixed(3)+","+AM[0][1].toFixed(3)+","+AM[1][1].toFixed(3)+",0,0";var AJ=K(AO.x/D)+","+K(AO.y/D);AE.push('','','');this.element_.insertAdjacentHTML("beforeEnd",AE.join(""))};M.fillText=function(j,Z,m,i){this.drawText_(j,Z,m,i,false)};M.strokeText=function(j,Z,m,i){this.drawText_(j,Z,m,i,true)};M.measureText=function(j){if(!this.textMeasureEl_){var Z='';this.element_.insertAdjacentHTML("beforeEnd",Z);this.textMeasureEl_=this.element_.lastChild}var i=this.element_.ownerDocument;this.textMeasureEl_.innerHTML="";this.textMeasureEl_.style.font=this.font;this.textMeasureEl_.appendChild(i.createTextNode(j));return{width:this.textMeasureEl_.offsetWidth}};M.clip=function(){};M.arcTo=function(){};M.createPattern=function(i,Z){return new u(i,Z)};function v(Z){this.type_=Z;this.x0_=0;this.y0_=0;this.r0_=0;this.x1_=0;this.y1_=0;this.r1_=0;this.colors_=[]}v.prototype.addColorStop=function(i,Z){Z=Y(Z);this.colors_.push({offset:i,color:Z.color,alpha:Z.alpha})};function u(i,Z){q(i);switch(Z){case"repeat":case null:case"":this.repetition_="repeat";break;case"repeat-x":case"repeat-y":case"no-repeat":this.repetition_=Z;break;default:n("SYNTAX_ERR")}this.src_=i.src;this.width_=i.width;this.height_=i.height}function n(Z){throw new o(Z)}function q(Z){if(!Z||Z.nodeType!=1||Z.tagName!="IMG"){n("TYPE_MISMATCH_ERR")}if(Z.readyState!="complete"){n("INVALID_STATE_ERR")}}function o(Z){this.code=this[Z];this.message=Z+": DOM Exception "+this.code}var x=o.prototype=new Error;x.INDEX_SIZE_ERR=1;x.DOMSTRING_SIZE_ERR=2;x.HIERARCHY_REQUEST_ERR=3;x.WRONG_DOCUMENT_ERR=4;x.INVALID_CHARACTER_ERR=5;x.NO_DATA_ALLOWED_ERR=6;x.NO_MODIFICATION_ALLOWED_ERR=7;x.NOT_FOUND_ERR=8;x.NOT_SUPPORTED_ERR=9;x.INUSE_ATTRIBUTE_ERR=10;x.INVALID_STATE_ERR=11;x.SYNTAX_ERR=12;x.INVALID_MODIFICATION_ERR=13;x.NAMESPACE_ERR=14;x.INVALID_ACCESS_ERR=15;x.VALIDATION_ERR=16;x.TYPE_MISMATCH_ERR=17;G_vmlCanvasManager=E;CanvasRenderingContext2D=W;CanvasGradient=v;CanvasPattern=u;DOMException=o})()}; diff --git a/themes/blueprint/js/flot/jquery.flot.min.js b/themes/blueprint/js/flot/jquery.flot.min.js deleted file mode 100644 index 9b913dab86f..00000000000 --- a/themes/blueprint/js/flot/jquery.flot.min.js +++ /dev/null @@ -1 +0,0 @@ -(function(){jQuery.color={};jQuery.color.make=function(G,H,J,I){var A={};A.r=G||0;A.g=H||0;A.b=J||0;A.a=I!=null?I:1;A.add=function(C,D){for(var E=0;E=1){return"rgb("+[A.r,A.g,A.b].join(",")+")"}else{return"rgba("+[A.r,A.g,A.b,A.a].join(",")+")"}};A.normalize=function(){function C(E,D,F){return DF?F:D)}A.r=C(0,parseInt(A.r),255);A.g=C(0,parseInt(A.g),255);A.b=C(0,parseInt(A.b),255);A.a=C(0,A.a,1);return A};A.clone=function(){return jQuery.color.make(A.r,A.b,A.g,A.a)};return A.normalize()};jQuery.color.extract=function(E,F){var A;do{A=E.css(F).toLowerCase();if(A!=""&&A!="transparent"){break}E=E.parent()}while(!jQuery.nodeName(E.get(0),"body"));if(A=="rgba(0, 0, 0, 0)"){A="transparent"}return jQuery.color.parse(A)};jQuery.color.parse=function(A){var F,H=jQuery.color.make;if(F=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(A)){return H(parseInt(F[1],10),parseInt(F[2],10),parseInt(F[3],10))}if(F=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(A)){return H(parseInt(F[1],10),parseInt(F[2],10),parseInt(F[3],10),parseFloat(F[4]))}if(F=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(A)){return H(parseFloat(F[1])*2.55,parseFloat(F[2])*2.55,parseFloat(F[3])*2.55)}if(F=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(A)){return H(parseFloat(F[1])*2.55,parseFloat(F[2])*2.55,parseFloat(F[3])*2.55,parseFloat(F[4]))}if(F=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(A)){return H(parseInt(F[1],16),parseInt(F[2],16),parseInt(F[3],16))}if(F=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(A)){return H(parseInt(F[1]+F[1],16),parseInt(F[2]+F[2],16),parseInt(F[3]+F[3],16))}var G=jQuery.trim(A).toLowerCase();if(G=="transparent"){return H(255,255,255,0)}else{F=B[G];return H(F[0],F[1],F[2])}};var B={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})();(function(C){function B(l,W,X,E){var O=[],g={colors:["#edc240","#afd8f8","#cb4b4b","#4da74d","#9440ed"],legend:{show:true,noColumns:1,labelFormatter:null,labelBoxBorderColor:"#ccc",container:null,position:"ne",margin:5,backgroundColor:null,backgroundOpacity:0.85},xaxis:{mode:null,transform:null,inverseTransform:null,min:null,max:null,autoscaleMargin:null,ticks:null,tickFormatter:null,labelWidth:null,labelHeight:null,tickDecimals:null,tickSize:null,minTickSize:null,monthNames:null,timeformat:null,twelveHourClock:false},yaxis:{autoscaleMargin:0.02},x2axis:{autoscaleMargin:null},y2axis:{autoscaleMargin:0.02},series:{points:{show:false,radius:3,lineWidth:2,fill:true,fillColor:"#ffffff"},lines:{lineWidth:2,fill:false,fillColor:null,steps:false},bars:{show:false,lineWidth:2,barWidth:1,fill:true,fillColor:null,align:"left",horizontal:false},shadowSize:3},grid:{show:true,aboveData:false,color:"#545454",backgroundColor:null,tickColor:"rgba(0,0,0,0.15)",labelMargin:5,borderWidth:2,borderColor:null,markings:null,markingsColor:"#f4f4f4",markingsLineWidth:2,clickable:false,hoverable:false,autoHighlight:true,mouseActiveRadius:10},hooks:{}},P=null,AC=null,AD=null,Y=null,AJ=null,s={xaxis:{},yaxis:{},x2axis:{},y2axis:{}},e={left:0,right:0,top:0,bottom:0},y=0,Q=0,I=0,t=0,L={processOptions:[],processRawData:[],processDatapoints:[],draw:[],bindEvents:[],drawOverlay:[]},G=this;G.setData=f;G.setupGrid=k;G.draw=AH;G.getPlaceholder=function(){return l};G.getCanvas=function(){return P};G.getPlotOffset=function(){return e};G.width=function(){return I};G.height=function(){return t};G.offset=function(){var AK=AD.offset();AK.left+=e.left;AK.top+=e.top;return AK};G.getData=function(){return O};G.getAxes=function(){return s};G.getOptions=function(){return g};G.highlight=AE;G.unhighlight=x;G.triggerRedrawOverlay=q;G.pointOffset=function(AK){return{left:parseInt(T(AK,"xaxis").p2c(+AK.x)+e.left),top:parseInt(T(AK,"yaxis").p2c(+AK.y)+e.top)}};G.hooks=L;b(G);r(X);c();f(W);k();AH();AG();function Z(AM,AK){AK=[G].concat(AK);for(var AL=0;AL=g.colors.length){AP=0;++AO}}var AQ=0,AW;for(AP=0;APAl.datamax){Al.datamax=Aj}}for(Ac=0;Ac0&&Ab[AZ-AX]!=null&&Ab[AZ-AX]!=Ab[AZ]&&Ab[AZ-AX+1]!=Ab[AZ+1]){for(AV=0;AVAU){AU=Ai}}if(Af.y){if(AiAd){Ad=Ai}}}}if(AR.bars.show){var Ag=AR.bars.align=="left"?0:-AR.bars.barWidth/2;if(AR.bars.horizontal){AY+=Ag;Ad+=Ag+AR.bars.barWidth}else{AS+=Ag;AU+=Ag+AR.bars.barWidth}}AN(AR.xaxis,AS,AU);AN(AR.yaxis,AY,Ad)}for(AK in s){if(s[AK].datamin==AW){s[AK].datamin=null}if(s[AK].datamax==AQ){s[AK].datamax=null}}}function c(){function AK(AM,AL){var AN=document.createElement("canvas");AN.width=AM;AN.height=AL;if(C.browser.msie){AN=window.G_vmlCanvasManager.initElement(AN)}return AN}y=l.width();Q=l.height();l.html("");if(l.css("position")=="static"){l.css("position","relative")}if(y<=0||Q<=0){throw"Invalid dimensions for plot, width = "+y+", height = "+Q}if(C.browser.msie){window.G_vmlCanvasManager.init_(document)}P=C(AK(y,Q)).appendTo(l).get(0);Y=P.getContext("2d");AC=C(AK(y,Q)).css({position:"absolute",left:0,top:0}).appendTo(l).get(0);AJ=AC.getContext("2d");AJ.stroke()}function AG(){AD=C([AC,P]);if(g.grid.hoverable){AD.mousemove(D)}if(g.grid.clickable){AD.click(d)}Z(L.bindEvents,[AD])}function k(){function AL(AT,AU){function AP(AV){return AV}var AS,AO,AQ=AU.transform||AP,AR=AU.inverseTransform;if(AT==s.xaxis||AT==s.x2axis){AS=AT.scale=I/(AQ(AT.max)-AQ(AT.min));AO=AQ(AT.min);if(AQ==AP){AT.p2c=function(AV){return(AV-AO)*AS}}else{AT.p2c=function(AV){return(AQ(AV)-AO)*AS}}if(!AR){AT.c2p=function(AV){return AO+AV/AS}}else{AT.c2p=function(AV){return AR(AO+AV/AS)}}}else{AS=AT.scale=t/(AQ(AT.max)-AQ(AT.min));AO=AQ(AT.max);if(AQ==AP){AT.p2c=function(AV){return(AO-AV)*AS}}else{AT.p2c=function(AV){return(AO-AQ(AV))*AS}}if(!AR){AT.c2p=function(AV){return AO-AV/AS}}else{AT.c2p=function(AV){return AR(AO-AV/AS)}}}}function AN(AR,AT){var AQ,AS=[],AP;AR.labelWidth=AT.labelWidth;AR.labelHeight=AT.labelHeight;if(AR==s.xaxis||AR==s.x2axis){if(AR.labelWidth==null){AR.labelWidth=y/(AR.ticks.length>0?AR.ticks.length:1)}if(AR.labelHeight==null){AS=[];for(AQ=0;AQ'+AP+"")}}if(AS.length>0){var AO=C('
    '+AS.join("")+'
    ').appendTo(l);AR.labelHeight=AO.height();AO.remove()}}}else{if(AR.labelWidth==null||AR.labelHeight==null){for(AQ=0;AQ'+AP+"")}}if(AS.length>0){var AO=C('
    '+AS.join("")+"
    ").appendTo(l);if(AR.labelWidth==null){AR.labelWidth=AO.width()}if(AR.labelHeight==null){AR.labelHeight=AO.find("div").height()}AO.remove()}}}if(AR.labelWidth==null){AR.labelWidth=0}if(AR.labelHeight==null){AR.labelHeight=0}}function AM(){var AP=g.grid.borderWidth;for(i=0;i0){e.bottom=Math.max(AP,s.xaxis.labelHeight+AO)}if(s.yaxis.labelWidth>0){e.left=Math.max(AP,s.yaxis.labelWidth+AO)}if(s.x2axis.labelHeight>0){e.top=Math.max(AP,s.x2axis.labelHeight+AO)}if(s.y2axis.labelWidth>0){e.right=Math.max(AP,s.y2axis.labelWidth+AO)}I=y-e.left-e.right;t=Q-e.bottom-e.top}var AK;for(AK in s){K(s[AK],g[AK])}if(g.grid.show){for(AK in s){F(s[AK],g[AK]);p(s[AK],g[AK]);AN(s[AK],g[AK])}AM()}else{e.left=e.right=e.top=e.bottom=0;I=y;t=Q}for(AK in s){AL(s[AK],g[AK])}if(g.grid.show){h()}AI()}function K(AN,AQ){var AM=+(AQ.min!=null?AQ.min:AN.datamin),AK=+(AQ.max!=null?AQ.max:AN.datamax),AP=AK-AM;if(AP==0){var AL=AK==0?1:0.01;if(AQ.min==null){AM-=AL}if(AQ.max==null||AQ.min!=null){AK+=AL}}else{var AO=AQ.autoscaleMargin;if(AO!=null){if(AQ.min==null){AM-=AP*AO;if(AM<0&&AN.datamin!=null&&AN.datamin>=0){AM=0}}if(AQ.max==null){AK+=AP*AO;if(AK>0&&AN.datamax!=null&&AN.datamax<=0){AK=0}}}}AN.min=AM;AN.max=AK}function F(AP,AS){var AO;if(typeof AS.ticks=="number"&&AS.ticks>0){AO=AS.ticks}else{if(AP==s.xaxis||AP==s.x2axis){AO=0.3*Math.sqrt(y)}else{AO=0.3*Math.sqrt(Q)}}var AX=(AP.max-AP.min)/AO,AZ,AT,AV,AW,AR,AM,AL;if(AS.mode=="time"){var AU={second:1000,minute:60*1000,hour:60*60*1000,day:24*60*60*1000,month:30*24*60*60*1000,year:365.2425*24*60*60*1000};var AY=[[1,"second"],[2,"second"],[5,"second"],[10,"second"],[30,"second"],[1,"minute"],[2,"minute"],[5,"minute"],[10,"minute"],[30,"minute"],[1,"hour"],[2,"hour"],[4,"hour"],[8,"hour"],[12,"hour"],[1,"day"],[2,"day"],[3,"day"],[0.25,"month"],[0.5,"month"],[1,"month"],[2,"month"],[3,"month"],[6,"month"],[1,"year"]];var AN=0;if(AS.minTickSize!=null){if(typeof AS.tickSize=="number"){AN=AS.tickSize}else{AN=AS.minTickSize[0]*AU[AS.minTickSize[1]]}}for(AR=0;AR=AN){break}}AZ=AY[AR][0];AV=AY[AR][1];if(AV=="year"){AM=Math.pow(10,Math.floor(Math.log(AX/AU.year)/Math.LN10));AL=(AX/AU.year)/AM;if(AL<1.5){AZ=1}else{if(AL<3){AZ=2}else{if(AL<7.5){AZ=5}else{AZ=10}}}AZ*=AM}if(AS.tickSize){AZ=AS.tickSize[0];AV=AS.tickSize[1]}AT=function(Ac){var Ah=[],Af=Ac.tickSize[0],Ai=Ac.tickSize[1],Ag=new Date(Ac.min);var Ab=Af*AU[Ai];if(Ai=="second"){Ag.setUTCSeconds(A(Ag.getUTCSeconds(),Af))}if(Ai=="minute"){Ag.setUTCMinutes(A(Ag.getUTCMinutes(),Af))}if(Ai=="hour"){Ag.setUTCHours(A(Ag.getUTCHours(),Af))}if(Ai=="month"){Ag.setUTCMonth(A(Ag.getUTCMonth(),Af))}if(Ai=="year"){Ag.setUTCFullYear(A(Ag.getUTCFullYear(),Af))}Ag.setUTCMilliseconds(0);if(Ab>=AU.minute){Ag.setUTCSeconds(0)}if(Ab>=AU.hour){Ag.setUTCMinutes(0)}if(Ab>=AU.day){Ag.setUTCHours(0)}if(Ab>=AU.day*4){Ag.setUTCDate(1)}if(Ab>=AU.year){Ag.setUTCMonth(0)}var Ak=0,Aj=Number.NaN,Ad;do{Ad=Aj;Aj=Ag.getTime();Ah.push({v:Aj,label:Ac.tickFormatter(Aj,Ac)});if(Ai=="month"){if(Af<1){Ag.setUTCDate(1);var Aa=Ag.getTime();Ag.setUTCMonth(Ag.getUTCMonth()+1);var Ae=Ag.getTime();Ag.setTime(Aj+Ak*AU.hour+(Ae-Aa)*Af);Ak=Ag.getUTCHours();Ag.setUTCHours(0)}else{Ag.setUTCMonth(Ag.getUTCMonth()+Af)}}else{if(Ai=="year"){Ag.setUTCFullYear(Ag.getUTCFullYear()+Af)}else{Ag.setTime(Aj+Ab)}}}while(AjAK){AQ=AK}AM=Math.pow(10,-AQ);AL=AX/AM;if(AL<1.5){AZ=1}else{if(AL<3){AZ=2;if(AL>2.25&&(AK==null||AQ+1<=AK)){AZ=2.5;++AQ}}else{if(AL<7.5){AZ=5}else{AZ=10}}}AZ*=AM;if(AS.minTickSize!=null&&AZ0){AO.ticks=AO.tickGenerator(AO)}}else{if(AQ.ticks){var AP=AQ.ticks;if(C.isFunction(AP)){AP=AP({min:AO.min,max:AO.max})}var AN,AK;for(AN=0;AN1){AL=AM[1]}}else{AK=AM}if(AL==null){AL=AO.tickFormatter(AK,AO)}AO.ticks[AN]={v:AK,label:AL}}}}}if(AQ.autoscaleMargin!=null&&AO.ticks.length>0){if(AQ.min==null){AO.min=Math.min(AO.min,AO.ticks[0].v)}if(AQ.max==null&&AO.ticks.length>1){AO.max=Math.max(AO.max,AO.ticks[AO.ticks.length-1].v)}}}function AH(){Y.clearRect(0,0,y,Q);var AL=g.grid;if(AL.show&&!AL.aboveData){S()}for(var AK=0;AKAP){return{from:AP,to:AQ,axis:AN}}return{from:AQ,to:AP,axis:AN}}function S(){var AO;Y.save();Y.translate(e.left,e.top);if(g.grid.backgroundColor){Y.fillStyle=R(g.grid.backgroundColor,t,0,"rgba(255, 255, 255, 0)");Y.fillRect(0,0,I,t)}var AL=g.grid.markings;if(AL){if(C.isFunction(AL)){AL=AL({xmin:s.xaxis.min,xmax:s.xaxis.max,ymin:s.yaxis.min,ymax:s.yaxis.max,xaxis:s.xaxis,yaxis:s.yaxis,x2axis:s.x2axis,y2axis:s.y2axis})}for(AO=0;AOAQ.axis.max||AN.toAN.axis.max){continue}AQ.from=Math.max(AQ.from,AQ.axis.min);AQ.to=Math.min(AQ.to,AQ.axis.max);AN.from=Math.max(AN.from,AN.axis.min);AN.to=Math.min(AN.to,AN.axis.max);if(AQ.from==AQ.to&&AN.from==AN.to){continue}AQ.from=AQ.axis.p2c(AQ.from);AQ.to=AQ.axis.p2c(AQ.to);AN.from=AN.axis.p2c(AN.from);AN.to=AN.axis.p2c(AN.to);if(AQ.from==AQ.to||AN.from==AN.to){Y.beginPath();Y.strokeStyle=AK.color||g.grid.markingsColor;Y.lineWidth=AK.lineWidth||g.grid.markingsLineWidth;Y.moveTo(AQ.from,AN.from);Y.lineTo(AQ.to,AN.to);Y.stroke()}else{Y.fillStyle=AK.color||g.grid.markingsColor;Y.fillRect(AQ.from,AN.to,AQ.to-AQ.from,AN.from-AN.to)}}}Y.lineWidth=1;Y.strokeStyle=g.grid.tickColor;Y.beginPath();var AM,AP=s.xaxis;for(AO=0;AO=s.xaxis.max){continue}Y.moveTo(Math.floor(AP.p2c(AM))+Y.lineWidth/2,0);Y.lineTo(Math.floor(AP.p2c(AM))+Y.lineWidth/2,t)}AP=s.yaxis;for(AO=0;AO=AP.max){continue}Y.moveTo(0,Math.floor(AP.p2c(AM))+Y.lineWidth/2);Y.lineTo(I,Math.floor(AP.p2c(AM))+Y.lineWidth/2)}AP=s.x2axis;for(AO=0;AO=AP.max){continue}Y.moveTo(Math.floor(AP.p2c(AM))+Y.lineWidth/2,-5);Y.lineTo(Math.floor(AP.p2c(AM))+Y.lineWidth/2,5)}AP=s.y2axis;for(AO=0;AO=AP.max){continue}Y.moveTo(I-5,Math.floor(AP.p2c(AM))+Y.lineWidth/2);Y.lineTo(I+5,Math.floor(AP.p2c(AM))+Y.lineWidth/2)}Y.stroke();if(g.grid.borderWidth){var AR=g.grid.borderWidth;Y.lineWidth=AR;Y.strokeStyle=g.grid.borderColor;Y.strokeRect(-AR/2,-AR/2,I+AR,t+AR)}Y.restore()}function h(){l.find(".tickLabels").remove();var AK=['
    '];function AM(AP,AQ){for(var AO=0;AOAP.max){continue}AK.push(AQ(AN,AP))}}var AL=g.grid.labelMargin+g.grid.borderWidth;AM(s.xaxis,function(AN,AO){return'
    '+AN.label+"
    "});AM(s.yaxis,function(AN,AO){return'
    '+AN.label+"
    "});AM(s.x2axis,function(AN,AO){return'
    '+AN.label+"
    "});AM(s.y2axis,function(AN,AO){return'
    '+AN.label+"
    "});AK.push("
    ");l.append(AK.join(""))}function AA(AK){if(AK.lines.show){a(AK)}if(AK.bars.show){n(AK)}if(AK.points.show){o(AK)}}function a(AN){function AM(AY,AZ,AR,Ad,Ac){var Ae=AY.points,AS=AY.pointsize,AW=null,AV=null;Y.beginPath();for(var AX=AS;AX=Aa&&Ab>Ac.max){if(Aa>Ac.max){continue}AU=(Ac.max-Ab)/(Aa-Ab)*(AT-AU)+AU;Ab=Ac.max}else{if(Aa>=Ab&&Aa>Ac.max){if(Ab>Ac.max){continue}AT=(Ac.max-Ab)/(Aa-Ab)*(AT-AU)+AU;Aa=Ac.max}}if(AU<=AT&&AU=AT&&AU>Ad.max){if(AT>Ad.max){continue}Ab=(Ad.max-AU)/(AT-AU)*(Aa-Ab)+Ab;AU=Ad.max}else{if(AT>=AU&&AT>Ad.max){if(AU>Ad.max){continue}Aa=(Ad.max-AU)/(AT-AU)*(Aa-Ab)+Ab;AT=Ad.max}}if(AU!=AW||Ab!=AV){Y.moveTo(Ad.p2c(AU)+AZ,Ac.p2c(Ab)+AR)}AW=AT;AV=Aa;Y.lineTo(Ad.p2c(AT)+AZ,Ac.p2c(Aa)+AR)}Y.stroke()}function AO(AX,Ae,Ac){var Af=AX.points,AR=AX.pointsize,AS=Math.min(Math.max(0,Ac.min),Ac.max),Aa,AV=0,Ad=false;for(var AW=AR;AW=AT&&AU>Ae.max){if(AT>Ae.max){continue}Ab=(Ae.max-AU)/(AT-AU)*(AZ-Ab)+Ab;AU=Ae.max}else{if(AT>=AU&&AT>Ae.max){if(AU>Ae.max){continue}AZ=(Ae.max-AU)/(AT-AU)*(AZ-Ab)+Ab;AT=Ae.max}}if(!Ad){Y.beginPath();Y.moveTo(Ae.p2c(AU),Ac.p2c(AS));Ad=true}if(Ab>=Ac.max&&AZ>=Ac.max){Y.lineTo(Ae.p2c(AU),Ac.p2c(Ac.max));Y.lineTo(Ae.p2c(AT),Ac.p2c(Ac.max));AV=AT;continue}else{if(Ab<=Ac.min&&AZ<=Ac.min){Y.lineTo(Ae.p2c(AU),Ac.p2c(Ac.min));Y.lineTo(Ae.p2c(AT),Ac.p2c(Ac.min));AV=AT;continue}}var Ag=AU,AY=AT;if(Ab<=AZ&&Ab=Ac.min){AU=(Ac.min-Ab)/(AZ-Ab)*(AT-AU)+AU;Ab=Ac.min}else{if(AZ<=Ab&&AZ=Ac.min){AT=(Ac.min-Ab)/(AZ-Ab)*(AT-AU)+AU;AZ=Ac.min}}if(Ab>=AZ&&Ab>Ac.max&&AZ<=Ac.max){AU=(Ac.max-Ab)/(AZ-Ab)*(AT-AU)+AU;Ab=Ac.max}else{if(AZ>=Ab&&AZ>Ac.max&&Ab<=Ac.max){AT=(Ac.max-Ab)/(AZ-Ab)*(AT-AU)+AU;AZ=Ac.max}}if(AU!=Ag){if(Ab<=Ac.min){Aa=Ac.min}else{Aa=Ac.max}Y.lineTo(Ae.p2c(Ag),Ac.p2c(Aa));Y.lineTo(Ae.p2c(AU),Ac.p2c(Aa))}Y.lineTo(Ae.p2c(AU),Ac.p2c(Ab));Y.lineTo(Ae.p2c(AT),Ac.p2c(AZ));if(AT!=AY){if(AZ<=Ac.min){Aa=Ac.min}else{Aa=Ac.max}Y.lineTo(Ae.p2c(AT),Ac.p2c(Aa));Y.lineTo(Ae.p2c(AY),Ac.p2c(Aa))}AV=Math.max(AT,AY)}if(Ad){Y.lineTo(Ae.p2c(AV),Ac.p2c(AS));Y.fill()}}Y.save();Y.translate(e.left,e.top);Y.lineJoin="round";var AP=AN.lines.lineWidth,AK=AN.shadowSize;if(AP>0&&AK>0){Y.lineWidth=AK;Y.strokeStyle="rgba(0,0,0,0.1)";var AQ=Math.PI/18;AM(AN.datapoints,Math.sin(AQ)*(AP/2+AK/2),Math.cos(AQ)*(AP/2+AK/2),AN.xaxis,AN.yaxis);Y.lineWidth=AK/2;AM(AN.datapoints,Math.sin(AQ)*(AP/2+AK/4),Math.cos(AQ)*(AP/2+AK/4),AN.xaxis,AN.yaxis)}Y.lineWidth=AP;Y.strokeStyle=AN.color;var AL=V(AN.lines,AN.color,0,t);if(AL){Y.fillStyle=AL;AO(AN.datapoints,AN.xaxis,AN.yaxis)}if(AP>0){AM(AN.datapoints,0,0,AN.xaxis,AN.yaxis)}Y.restore()}function o(AN){function AP(AU,AT,Ab,AR,AV,AZ,AY){var Aa=AU.points,AQ=AU.pointsize;for(var AS=0;ASAZ.max||AWAY.max){continue}Y.beginPath();Y.arc(AZ.p2c(AX),AY.p2c(AW)+AR,AT,0,AV,false);if(Ab){Y.fillStyle=Ab;Y.fill()}Y.stroke()}}Y.save();Y.translate(e.left,e.top);var AO=AN.lines.lineWidth,AL=AN.shadowSize,AK=AN.points.radius;if(AO>0&&AL>0){var AM=AL/2;Y.lineWidth=AM;Y.strokeStyle="rgba(0,0,0,0.1)";AP(AN.datapoints,AK,null,AM+AM/2,Math.PI,AN.xaxis,AN.yaxis);Y.strokeStyle="rgba(0,0,0,0.2)";AP(AN.datapoints,AK,null,AM/2,Math.PI,AN.xaxis,AN.yaxis)}Y.lineWidth=AO;Y.strokeStyle=AN.color;AP(AN.datapoints,AK,V(AN.points,AN.color),0,2*Math.PI,AN.xaxis,AN.yaxis);Y.restore()}function AB(AV,AU,Ad,AQ,AY,AN,AL,AT,AS,Ac,AZ){var AM,Ab,AR,AX,AO,AK,AW,AP,Aa;if(AZ){AP=AK=AW=true;AO=false;AM=Ad;Ab=AV;AX=AU+AQ;AR=AU+AY;if(AbAT.max||AXAS.max){return }if(AMAT.max){Ab=AT.max;AK=false}if(ARAS.max){AX=AS.max;AW=false}AM=AT.p2c(AM);AR=AS.p2c(AR);Ab=AT.p2c(Ab);AX=AS.p2c(AX);if(AL){Ac.beginPath();Ac.moveTo(AM,AR);Ac.lineTo(AM,AX);Ac.lineTo(Ab,AX);Ac.lineTo(Ab,AR);Ac.fillStyle=AL(AR,AX);Ac.fill()}if(AO||AK||AW||AP){Ac.beginPath();Ac.moveTo(AM,AR+AN);if(AO){Ac.lineTo(AM,AX+AN)}else{Ac.moveTo(AM,AX+AN)}if(AW){Ac.lineTo(Ab,AX+AN)}else{Ac.moveTo(Ab,AX+AN)}if(AK){Ac.lineTo(Ab,AR+AN)}else{Ac.moveTo(Ab,AR+AN)}if(AP){Ac.lineTo(AM,AR+AN)}else{Ac.moveTo(AM,AR+AN)}Ac.stroke()}}function n(AM){function AL(AS,AR,AU,AP,AT,AW,AV){var AX=AS.points,AO=AS.pointsize;for(var AQ=0;AQ")}AP.push("");AN=true}if(AV){AR=AV(AR,AU)}AP.push('
    '+AR+"")}if(AN){AP.push("")}if(AP.length==0){return }var AT=''+AP.join("")+"
    ";if(g.legend.container!=null){C(g.legend.container).html(AT)}else{var AQ="",AL=g.legend.position,AM=g.legend.margin;if(AM[0]==null){AM=[AM,AM]}if(AL.charAt(0)=="n"){AQ+="top:"+(AM[1]+e.top)+"px;"}else{if(AL.charAt(0)=="s"){AQ+="bottom:"+(AM[1]+e.bottom)+"px;"}}if(AL.charAt(1)=="e"){AQ+="right:"+(AM[0]+e.right)+"px;"}else{if(AL.charAt(1)=="w"){AQ+="left:"+(AM[0]+e.left)+"px;"}}var AS=C('
    '+AT.replace('style="','style="position:absolute;'+AQ+";")+"
    ").appendTo(l);if(g.legend.backgroundOpacity!=0){var AO=g.legend.backgroundColor;if(AO==null){AO=g.grid.backgroundColor;if(AO&&typeof AO=="string"){AO=C.color.parse(AO)}else{AO=C.color.extract(AS,"background-color")}AO.a=1;AO=AO.toString()}var AK=AS.children();C('
    ').prependTo(AS).css("opacity",g.legend.backgroundOpacity)}}}var w=[],J=null;function AF(AR,AP,AM){var AX=g.grid.mouseActiveRadius,Aj=AX*AX+1,Ah=null,Aa=false,Af,Ad;for(Af=0;AfAL||AT-AZ<-AL||AS-AW>AK||AS-AW<-AK){continue}var AV=Math.abs(AQ.p2c(AT)-AR),AU=Math.abs(AO.p2c(AS)-AP),Ab=AV*AV+AU*AU;if(Ab<=Aj){Aj=Ab;Ah=[Af,Ad/Ac]}}}if(AY.bars.show&&!Ah){var AN=AY.bars.align=="left"?0:-AY.bars.barWidth/2,Ag=AN+AY.bars.barWidth;for(Ad=0;Ad=Math.min(Ai,AT)&&AW>=AS+AN&&AW<=AS+Ag):(AZ>=AT+AN&&AZ<=AT+Ag&&AW>=Math.min(Ai,AS)&&AW<=Math.max(Ai,AS))){Ah=[Af,Ad/Ac]}}}}if(Ah){Af=Ah[0];Ad=Ah[1];Ac=O[Af].datapoints.pointsize;return{datapoint:O[Af].datapoints.points.slice(Ad*Ac,(Ad+1)*Ac),dataIndex:Ad,series:O[Af],seriesIndex:Af}}return null}function D(AK){if(g.grid.hoverable){H("plothover",AK,function(AL){return AL.hoverable!=false})}}function d(AK){H("plotclick",AK,function(AL){return AL.clickable!=false})}function H(AL,AK,AM){var AN=AD.offset(),AS={pageX:AK.pageX,pageY:AK.pageY},AQ=AK.pageX-AN.left-e.left,AO=AK.pageY-AN.top-e.top;if(s.xaxis.used){AS.x=s.xaxis.c2p(AQ)}if(s.yaxis.used){AS.y=s.yaxis.c2p(AO)}if(s.x2axis.used){AS.x2=s.x2axis.c2p(AQ)}if(s.y2axis.used){AS.y2=s.y2axis.c2p(AO)}var AT=AF(AQ,AO,AM);if(AT){AT.pageX=parseInt(AT.series.xaxis.p2c(AT.datapoint[0])+AN.left+e.left);AT.pageY=parseInt(AT.series.yaxis.p2c(AT.datapoint[1])+AN.top+e.top)}if(g.grid.autoHighlight){for(var AP=0;APAQ.max||ARAP.max){return }var AO=AN.points.radius+AN.points.lineWidth/2;AJ.lineWidth=AO;AJ.strokeStyle=C.color.parse(AN.color).scale("a",0.5).toString();var AK=1.5*AO;AJ.beginPath();AJ.arc(AQ.p2c(AL),AP.p2c(AR),AK,0,2*Math.PI,false);AJ.stroke()}function z(AN,AK){AJ.lineWidth=AN.bars.lineWidth;AJ.strokeStyle=C.color.parse(AN.color).scale("a",0.5).toString();var AM=C.color.parse(AN.color).scale("a",0.5).toString();var AL=AN.bars.align=="left"?0:-AN.bars.barWidth/2;AB(AK[0],AK[1],AK[2]||0,AL,AL+AN.bars.barWidth,0,function(){return AM},AN.xaxis,AN.yaxis,AJ,AN.bars.horizontal)}function R(AM,AL,AQ,AO){if(typeof AM=="string"){return AM}else{var AP=Y.createLinearGradient(0,AQ,0,AL);for(var AN=0,AK=AM.colors.length;AN12){K=K-12}else{if(K==0){K=12}}}for(var F=0;FQ?Q:S)}function C(U,R){var T=J.getOptions();var S=J.getPlaceholder().offset();var Q=J.getPlotOffset();U.x=G(0,R.pageX-S.left-Q.left,J.width());U.y=G(0,R.pageY-S.top-Q.top,J.height());if(T.selection.mode=="y"){U.x=U==O.first?0:J.width()}if(T.selection.mode=="x"){U.y=U==O.first?0:J.height()}}function K(Q){if(Q.pageX==null){return }C(O.second,Q);if(E()){O.show=true;J.triggerRedrawOverlay()}else{P(true)}}function P(Q){if(O.show){O.show=false;J.triggerRedrawOverlay();if(!Q){J.getPlaceholder().trigger("plotunselected",[])}}}function N(R,Q){var T,S,U=J.getAxes();var V=J.getOptions();if(V.selection.mode=="y"){O.first.x=0;O.second.x=J.width()}else{T=R.xaxis?U.xaxis:(R.x2axis?U.x2axis:U.xaxis);S=R.xaxis||R.x2axis||{from:R.x1,to:R.x2};O.first.x=T.p2c(Math.min(S.from,S.to));O.second.x=T.p2c(Math.max(S.from,S.to))}if(V.selection.mode=="x"){O.first.y=0;O.second.y=J.height()}else{T=R.yaxis?U.yaxis:(R.y2axis?U.y2axis:U.yaxis);S=R.yaxis||R.y2axis||{from:R.y1,to:R.y2};O.first.y=T.p2c(Math.min(S.from,S.to));O.second.y=T.p2c(Math.max(S.from,S.to))}O.show=true;J.triggerRedrawOverlay();if(!Q){H()}}function E(){var Q=5;return Math.abs(O.second.x-O.first.x)>=Q&&Math.abs(O.second.y-O.first.y)>=Q}J.clearSelection=P;J.setSelection=N;J.getSelection=F;J.hooks.bindEvents.push(function(R,Q){var S=R.getOptions();if(S.selection.mode!=null){Q.mousemove(D)}if(S.selection.mode!=null){Q.mousedown(M)}});J.hooks.drawOverlay.push(function(T,Y){if(O.show&&E()){var R=T.getPlotOffset();var Q=T.getOptions();Y.save();Y.translate(R.left,R.top);var U=A.color.parse(Q.selection.color);Y.strokeStyle=U.scale("a",0.8).toString();Y.lineWidth=1;Y.lineJoin="round";Y.fillStyle=U.scale("a",0.4).toString();var W=Math.min(O.first.x,O.second.x),V=Math.min(O.first.y,O.second.y),X=Math.abs(O.second.x-O.first.x),S=Math.abs(O.second.y-O.first.y);Y.fillRect(W,V,X,S);Y.strokeRect(W,V,X,S);Y.restore()}})}A.plot.plugins.push({init:B,options:{selection:{mode:null,color:"#e8cfac"}},name:"selection",version:"1.0"})})(jQuery); diff --git a/themes/blueprint/js/hierarchyTree_JSTree.js b/themes/blueprint/js/hierarchyTree_JSTree.js deleted file mode 100644 index dafb0f44245..00000000000 --- a/themes/blueprint/js/hierarchyTree_JSTree.js +++ /dev/null @@ -1,271 +0,0 @@ -/*global hierarchySettings, path, vufindString*/ - -var hierarchyID; -var baseTreeSearchFullURL; - -function showTreeError(msg) -{ - $("#hierarchyTreeHolder").html('

    ' + msg + '

    '); -} - -function getRecord(recordID) -{ - $.ajax({ - url: path + '/Hierarchy/GetRecord?' + $.param({id: recordID}), - dataType: 'html', - success: function(response) { - if (response) { - $('#hierarchyRecord').html(response); - // Remove the old path highlighting - $('#hierarchyTree a').removeClass("jstree-highlight"); - // Add Current path highlighting - var jsTreeNode = $(":input[value='"+recordID+"']").parent(); - jsTreeNode.children("a").addClass("jstree-highlight"); - jsTreeNode.parents("li").children("a").addClass("jstree-highlight"); - } - } - }); -} - -function hideFullHierarchy(jsTreeNode) -{ - // Hide all nodes - $('#hierarchyTree li').hide(); - // Show the nodes on the current path - $(jsTreeNode).show().parents().show(); - // Show the nodes below the current path - $(jsTreeNode).find("li").show(); -} - -function scroll(scroller, mode) -{ - // Get the currently cicked item - var jsTreeNode = $(".jstree-clicked").parent('li'); - // Toggle display of closed nodes - $('#hierarchyTree li.jstree-closed').toggle(); - if (mode == "show") { - $('#hierarchyTree li').show(); - $(scroller).animate({ - scrollTop: -$(scroller).scrollTop() - }); - $('#toggleTree').html(vufindString.hideTree); - } else { - hideFullHierarchy(jsTreeNode); - $(scroller).animate({ - scrollTop: $(jsTreeNode).offset().top - $(scroller).offset().top + $(scroller).scrollTop() - }); - $('#toggleTree').html(vufindString.showTree); - } -} - -function changeNoResultLabel(display) -{ - if (display) { - $("#treeSearchNoResults").show(); - } else { - $("#treeSearchNoResults").hide(); - } -} - -function changeLimitReachedLabel(display) -{ - if (display) { - $("#treeSearchLimitReached").show(); - } else { - $("#treeSearchLimitReached").hide(); - } -} - -function doTreeSearch() -{ - var keyword = $("#treeSearchText").val(); - if (keyword == ""){ - changeNoResultLabel(true); - return; - } - var searchType = $("#treeSearchType").val(); - - $("#treeSearchLoadingImg").show(); - $.getJSON(path + '/Hierarchy/SearchTree?' + $.param({'lookfor': keyword, 'hierarchyID': hierarchyID, 'type': searchType}), function(results) - { - if (results["limitReached"] == true) { - if(typeof(baseTreeSearchFullURL) == "undefined" || baseTreeSearchFullURL == null){ - baseTreeSearchFullURL = $("#fullSearchLink").attr("href"); - } - $("#fullSearchLink").attr("href", baseTreeSearchFullURL + "?lookfor="+ keyword + "&filter[]=hierarchy_top_id:\"" + hierarchyID + "\""); - changeLimitReachedLabel(true); - } else { - changeLimitReachedLabel(false); - } - - if (results["results"].length >= 1) { - $("#hierarchyTree .jstree-search").removeClass("jstree-search"); - $("#hierarchyTree").jstree("close_all", hierarchyID); - changeNoResultLabel(false); - } else { - $("#hierarchyTree .jstree-search").removeClass("jstree-search"); - changeNoResultLabel(true); - } - - $.each(results["results"], function(key, val) - { - var jsTreeNode = $('.jsTreeID:input[value="'+val+'"]').parent(); - if (jsTreeNode.hasClass("jstree-closed")) { - jsTreeNode.removeClass("jstree-closed").addClass("jstree-open"); - } - jsTreeNode.show().children('a:first').addClass("jstree-search"); - var parents = $(jsTreeNode).parents(); - parents.each(function() { - if ($(this).hasClass("jstree-closed")) { - $(this).removeClass("jstree-closed").addClass("jstree-open"); - } - $(this).show(); - }); - }); - if (results["results"].length == 1) { - $("#hierarchyTree .jstree-clicked").removeClass("jstree-clicked"); - // only do this for collection pages - if ($(".Collection").length != 0) { - getRecord(results["results"][0]); - } - } - $("#treeSearchLoadingImg").hide(); - }); -} -// Code for the search button -$(function () -{ - $("#treeSearch input").click(function () - { - if (this.id == "search") { - doTreeSearch(); - } - }); -}); - -$(document).ready(function() -{ - hierarchyID = $("#hierarchyTree").find(".hiddenHierarchyId")[0].value; - var recordID = $("#hierarchyTree").find(".hiddenRecordId")[0].value; - var scroller = hierarchySettings.lightboxMode ? '#modalDialog' : '#hierarchyTree'; - var context = $("#hierarchyTree").find(".hiddenContext")[0].value; - - if (!hierarchySettings.fullHierarchy) { - // Set Up Partial Hierarchy View Toggle - $('#hierarchyTree').parent().prepend('' + vufindString.showTree + ''); - $('#toggleTree').click(function(e) - { - e.preventDefault(); - $(this).toggleClass("open"); - if ($(this).hasClass("open")) { - scroll(scroller, "show"); - } else { - scroll(scroller, "hide"); - } - $("#hierarchyTree").jstree("toggle_dots"); - }); - } - - $("#hierarchyTree") - .bind("loaded.jstree", function (event, data) - { - var idList = $('#hierarchyTree .JSTreeID'); - $(idList).each(function() - { - var id = $.trim($(this).text()); - $(this).before(''); - $(this).remove(); - }); - - $(".Collection").each(function() - { - var id = $(this).attr("value"); - $(this).next("a").click(function(e) - { - e.preventDefault(); - $("#hierarchyTree a").removeClass("jstree-clicked"); - $(this).addClass("jstree-clicked"); - // Open this node - $(this).parent().removeClass("jstree-closed").addClass("jstree-open"); - getRecord(id); - return false; - }); - }); - - $("#hierarchyTree a").click(function(e) - { - e.preventDefault(); - if (context == "Record") { - window.location = $(this).attr("href"); - } - if ($('#toggleTree').length > 0 && !$('#toggleTree').hasClass("open")) { - hideFullHierarchy($(this).parent()); - } - }); - - var jsTreeNode = $(".jsTreeID:input[value='"+recordID+"']").parent(); - // Open Nodes to Current Path - jsTreeNode.parents("li").removeClass("jstree-closed").addClass("jstree-open"); - // Initially Open Current node too - jsTreeNode.removeClass("jstree-closed").addClass("jstree-open"); - // Add clicked class - $("> a", jsTreeNode).addClass("jstree-clicked"); - // Add highlight class to parents - jsTreeNode.parents("li").children("a").addClass("jstree-highlight"); - - if (!hierarchySettings.fullHierarchy) { - // Initial hide of nodes outside current path - hideFullHierarchy(jsTreeNode); - $("#hierarchyTree").jstree("toggle_dots"); - } - // Scroll to the current record - $(scroller).delay(250).animate({ - scrollTop: jsTreeNode.offset().top - $(scroller).offset().top + $(scroller).scrollTop() - }); - }) - .jstree({ - "xml_data" : { - "ajax" : { - "url" : path + '/Hierarchy/GetTree?' + $.param({'hierarchyID': hierarchyID, 'id': recordID, 'context': context, mode: "Tree"}), - success: function(data) - { - // Necessary as data is a string - var dataAsXML = $.parseXML(data); - if(dataAsXML) { - var error = $(dataAsXML).find("error"); - if (error.length > 0) { - showTreeError($(error).text()); - return false; - } else { - return data; - } - } else { - showTreeError("Unable to Parse XML"); - } - }, - failure: function() - { - showTreeError("Unable to Load Tree"); - } - }, - "xsl" : "nest" - }, - "plugins" : [ "themes", "xml_data", "ui" ], - "themes" : { - "url": path + '/themes/blueprint/js/jsTree/themes/vufind/style.css' - } - }).bind("open_node.jstree close_node.jstree", function (e, data) - { - $(data.args[0]).find("li").show(); - }); - - $('#treeSearch').show(); - $('#treeSearchText').bind('keypress', function(e) - { - var code = (e.keyCode ? e.keyCode : e.which); - if(code == 13) { - // Enter keycode should call the search code - doTreeSearch(); - } - }); -}); \ No newline at end of file diff --git a/themes/blueprint/js/hold.js b/themes/blueprint/js/hold.js deleted file mode 100644 index 486506db6f0..00000000000 --- a/themes/blueprint/js/hold.js +++ /dev/null @@ -1,42 +0,0 @@ -/*global path */ -function setUpHoldRequestForm(recordId) { - $('#requestGroupId').change(function() { - var $emptyOption = $("#pickUpLocation option[value='']"); - $("#pickUpLocation option[value!='']").remove(); - if ($('#requestGroupId').val() === '') { - $('#pickUpLocation').attr('disabled', 'disabled'); - return; - } - $('#pickUpLocationLabel').addClass("ajax_hold_request_loading"); - var params = { - method: 'getRequestGroupPickupLocations', - id: recordId, - requestGroupId: $('#requestGroupId').val() - }; - $.ajax({ - data: params, - dataType: 'json', - cache: false, - url: path + '/AJAX/JSON', - success: function(response) { - if (response.status == 'OK') { - var defaultValue = $('#pickUpLocation').data('default'); - $.each(response.data.locations, function() { - var option = $('').attr('value', this.locationID).text(this.locationDisplay); - if (this.locationID == defaultValue || (defaultValue == '' && this.isDefault && $emptyOption.length == 0)) { - option.attr('selected', 'selected'); - } - $('#pickUpLocation').append(option); - }); - } - $('#pickUpLocationLabel').removeClass("ajax_hold_request_loading"); - $('#pickUpLocation').removeAttr('disabled'); - }, - fail: function() { - $('#pickUpLocationLabel').removeClass("ajax_hold_request_loading"); - $('#pickUpLocation').removeAttr('disabled'); - } - }); - }); - $('#requestGroupId').change(); -} diff --git a/themes/blueprint/js/ill.js b/themes/blueprint/js/ill.js deleted file mode 100644 index e299090be42..00000000000 --- a/themes/blueprint/js/ill.js +++ /dev/null @@ -1,30 +0,0 @@ -/*global path */ -function setUpILLRequestForm(recordId) { - $("#ILLRequestForm #pickupLibrary").change(function() { - $("#ILLRequestForm #pickupLibraryLocation option").remove(); - $("#ILLRequestForm #pickupLibraryLocationLabel").addClass("ajax_ill_request_loading"); - var url = path + '/AJAX/JSON?' + $.param({method:'getLibraryPickupLocations', id: recordId, pickupLib: $("#ILLRequestForm #pickupLibrary").val() }); - $.ajax({ - dataType: 'json', - cache: false, - url: url, - success: function(response) { - if (response.status == 'OK') { - $.each(response.data.locations, function() { - var option = $("").attr("value", this.id).text(this.name); - if (this.isDefault) { - option.attr("selected", "selected"); - } - $("#ILLRequestForm #pickupLibraryLocation").append(option); - }); - } - $("#ILLRequestForm #pickupLibraryLocationLabel").removeClass("ajax_ill_request_loading"); - }, - fail: function() { - $("#ILLRequestForm #pickupLibraryLocationLabel").removeClass("ajax_ill_request_loading"); - } - }); - - }); - $("#ILLRequestForm #pickupLibrary").change(); -} diff --git a/themes/blueprint/js/jquery-ui/README-build-options.txt b/themes/blueprint/js/jquery-ui/README-build-options.txt deleted file mode 100644 index 98bfa6d8a10..00000000000 --- a/themes/blueprint/js/jquery-ui/README-build-options.txt +++ /dev/null @@ -1,5 +0,0 @@ -UI Core: all -Interactions: Draggable, Droppable -Widgets: Autocomplete, Dialog, Tabs, Slider -Effects: none -Theme: smoothness \ No newline at end of file diff --git a/themes/blueprint/js/jquery-ui/js/img-rotate.js b/themes/blueprint/js/jquery-ui/js/img-rotate.js deleted file mode 100644 index 9d053a9f79d..00000000000 --- a/themes/blueprint/js/jquery-ui/js/img-rotate.js +++ /dev/null @@ -1,50 +0,0 @@ -/* jquery-rotate-0.1.js August 4th 2011 - * A simple plugin to do cross-browser CSS rotations with backwards compatibility - * - * Written by Austen Hoogen - * http://www.austenhoogen.com - * - * This plugin is Open Source Software released under GPL v3 - * - * This software comes with no guarantees. Use at your own risk. - * Use your attorney fees for good, not evil. Donate to a charity instead. - */ - -(function( $ ){ - $.fn.rotate = function(degrees){ - if ($.browser.msie) { - // This fix unearthed from: - // http://msdn.microsoft.com/en-us/library/ms533014%28v=vs.85%29.aspx - // A simple explanation that [MXX] uses the sine and cosine of radians - // instead of degrees would have sped up the search quite a bit... - // But why would we want adequate and verbose documentation?? - // Who enjoys actually getting work done anyway?? Srsly... - deg2radians = Math.PI * 2 / 360; - rad = degrees * deg2radians ; - costheta = Math.cos(rad); - sintheta = Math.sin(rad); - - M11 = costheta; - M12 = -sintheta; - M21 = sintheta; - M22 = costheta; - - msUglyStepdaughterCode = "progid:DXImageTransform.Microsoft.Matrix("; - msUglyStepdaughterCode += "M11=" + M11 + ", M12=" + M12 + ", M21=" + M21 + ", M22=" + M22; - msUglyStepdaughterCode += ", sizingMethod='auto expand')" - - this.css("-ms-transform","rotate(" + degrees + "deg)"); - this.css("filter",msUglyStepdaughterCode); - this.css("zoom","1"); - } else if ($.browser.webkit) { - this.css("-webkit-transform","rotate(" + degrees + "deg)"); - } else if ($.browser.opera) { - this.css("-o-transform","rotate(" + degrees + "deg)"); - } else if ($.browser.mozilla) { - this.css("-moz-transform","rotate(" + degrees + "deg)"); - } else { - this.css("transform","rotate(" + degrees + "deg)"); - } - return this; - }; -})( jQuery); \ No newline at end of file diff --git a/themes/blueprint/js/jquery-ui/js/inspector.js b/themes/blueprint/js/jquery-ui/js/inspector.js deleted file mode 100644 index 3f03947c26c..00000000000 --- a/themes/blueprint/js/jquery-ui/js/inspector.js +++ /dev/null @@ -1,454 +0,0 @@ -/* - * JS Frame for Zooming and Rotating an Image - * - * - Only has one method: $(container).inspector(img-src); - * - Used for initializing ^^^^^^^^^ - * and loading images - * - * Chris Hallberg ').addClass("drag-master") - .css({'margin':'0'}) - .appendTo(elem) - .attr('unselectable', 'on') // prevent selection - .each(function(){this.onselectstart=function(){return false}}); - $('').addClass("loading") - .html('Loading...') - .appendTo(elem); - $('').addClass('doc').appendTo('.drag-master',elem); - // ZOOM DISPLAY - $('
    ').addClass('zoom_level') - .html(' +') - .appendTo(elem); - // ZOOM SET TEXT BOX - $('').appendTo('head'); - $('
    ').addClass('zoom-set') - .html('') - .appendTo(elem).hide(); - $('').appendTo('.zoom-set',elem); - // ROTATE LEFT ARROW - $('
    ').addClass('turn_left') - .html('') - .appendTo(elem); - // ROTATE RIGHT ARROW - $('
    ').addClass('turn_right') - .html('') - .appendTo(elem); - // MAP - $('
    ').addClass('doc_map') - .html('
     
    ') - .appendTo(elem); - }, - - // ASSIGN CLICKS DEPENDENT ON STATE - setHandlers: function(elem,state) { - $(elem).resize(function() { - methods.setDrag($('.doc',elem),elem,state); - }); - $(window) - .unbind('load resize scroll') - .load(function() { - methods.setDrag($('.doc',elem),$(elem),state); - }) - .resize(function() { - methods.setDrag($('.doc',elem),elem,state); - }) - .scroll(function() { - methods.setDrag($('.doc',elem),elem,state); - }); - $('.drag-master',elem) - .unbind('click mousewheel') - .click(function(){$('.zoom-set',elem).hide()}) // hide bubble on unfocus - // ZOOMING IN AND OUT - .mousewheel(function(event,delta){ // zoom with mouse scroll - event.preventDefault(); - methods.zoom.call(this,elem,event,delta,state); - }); - $(elem).find('.doc_map .pane') - .unbind('mousewheel') - .mousewheel(function(event,delta){ // zoom with mouse scroll on map - event.preventDefault(); - var newZoom = state.zoom * (1+(delta/4)); - methods.setZoom(elem,newZoom,state); - }); - $('.turn_left',elem) - .unbind('click') - .click(function() { // rotate image counter-clockwise - state.angle -= 90; - $(elem).find('.doc,.doc_map img').rotate(state.angle); - // center - methods.resize($('.doc',elem),elem,state); - methods.setDrag($('.doc',elem),elem,state); - }) - $('.turn_right',elem) - .unbind('click') - .click(function() { // rotate image clockwise - state.angle += 90; - $(elem).find('.doc,.doc_map img').rotate(state.angle); - // center - methods.resize($('.doc',elem),elem,state); - methods.setDrag($('.doc',elem),elem,state); - }); - // IE doc_map rotation - if($.browser.msie) { - $(elem).find('.turn_left,.turn_right').click(function() { - if(state.angle%180 > 0) { - var margin = (state.mapHeight-state.mapWidth)/2; - $(elem).find('.doc_map img').css({ - 'left':state.mapX-margin, - 'top' :state.mapY+margin - }); - } else { - $(elem).find('.doc_map img').css({ - 'left':state.mapX, - 'top' :state.mapY - }); - } - }); - } - $('.zoom-set button',elem) - .unbind('click') - .click(function () { // zoom to typed level - methods.setZoom(elem,$('#new-zoom-level').val()/100,state); - }); - $('.zoom_level span',elem) - .unbind('click') - .click(function() { // clicking the percent opens zoom bubble - $('.zoom-set',elem).toggle(); - }); - $('.zoom_level .plus',elem) - .unbind('click') - .click(function() { // zoom in button - methods.setZoom(elem,state.zoom*1.5,state); - }) - $('.zoom_level .minus',elem) - .unbind('click') - .click(function() { // zoom out button - methods.setZoom(elem,state.zoom*.5,state); - }) - }, - - load: function(elem,src) { - //alert('load'); - $('.loading',elem).show(); - $('.drag-master').css({'cursor':'progress'}); - var state = { - angle:0, - padding:0, - img:src - }; - $('.doc',elem) - .css({ - 'width':'auto', - 'height':'auto' - }) - .unbind('load') - .load(function() { - //alert('img loaded'); - state.width = $(this).width(); - state.height = $(this).height(); - state.size = Math.max(state.width,state.height); - state.zoom = $(elem).width()/state.width; - $(this).css({ - 'position':'absolute' - }) - state = methods.fit(elem,this,state); - $('.zoom_level span',elem).html(Math.round(state.zoom*100)+"%"); - // stop loading - $('.loading',elem).hide(); - $(this).show(); - // map - state.mapSize = 140/state.size; - state.mapWidth = (state.width*state.mapSize); - state.mapHeight = (state.height*state.mapSize); - state.mapX = ((150-state.mapWidth)/2); - state.mapY = ((150-state.mapHeight)/2); - $(elem).find('.doc_map img').css({ - 'width' :state.mapWidth, - 'height':state.mapHeight, - 'left':state.mapX, - 'top':state.mapY - }).rotate(0); - // trying to improve drag performance - $(elem).find('.doc,.doc_map img').rotate(360); - methods.resize($('.doc',elem),elem,state); - methods.setDrag($('.doc',elem),elem,state); - methods.mapDrag({position:{left:$(elem).offset().left,top:$(elem).offset().top}},elem,this,state); - // show signs of life - $('.drag-master').css({'cursor':'move'}); - }) - .attr('src',src) - .hide(); - $(elem).find('.doc_map img').attr('src',src); - return state; - }, - - zoom : function(elem,event,delta,state) { - var newZoom = state.zoom * (1+(delta/4)); - if(newZoom < state.minZoom) newZoom = state.minZoom; - else if(newZoom > 8) newZoom = 8; - if(newZoom == state.zoom) return; - state.center = [ - event.pageX, - event.pageY, - (event.pageX-$('.drag-master',elem).offset().left)/state.zoom, - (event.pageY-$('.drag-master',elem).offset().top) /state.zoom - ]; - state.zoom = newZoom; - methods.resize($('.doc',elem),elem,state,true); - }, - - setZoom : function(elem,newZoom,state) { - if(newZoom < state.minZoom) newZoom = state.minZoom; - if(newZoom > 8) newZoom = 8; // 800% - if(state.zoom == newZoom) return; - var centerX = $(elem).offset().left+($(elem).width()/2); - var centerY = $(elem).offset().top+($(elem).height()/2); - state.center = [ - centerX, - centerY, - (centerX-$(elem).find('.drag-master').offset().left)/state.zoom, - (centerY-$(elem).find('.drag-master').offset().top) /state.zoom - ]; - state.zoom = newZoom; - methods.resize($(elem).find('.doc'),elem,state,true); - $('.zoom-set',elem).hide(); - }, - - setDrag : function(pic,elem,state) { - // container sides - var eOffset = $(elem).offset(); - var left = eOffset.left; - var right = eOffset.left+$(elem).width(); - var top = eOffset.top; - var bottom = eOffset.top+$(elem).height(); - // image size - var width = $(pic).width(); - var height = $(pic).height(); - // rotation fix - if(!$.browser.msie && state.angle%180 > 0) { - width = height; - height = $(pic).width(); - } - - var DM = $(elem).find('.drag-master'); - var offsetX = (DM.width()-width)/2; - var offsetY = (DM.height()-height)/2; - var vals = [ - left - offsetX, - top - offsetY, - right - offsetX - width, - bottom - offsetY - height - ]; - var cont = []; - for(i in vals) cont[i] = vals[i]; - - if(width > $(elem).width()) { - cont[0] = vals[2]; - cont[2] = vals[0]; - } - if(height > $(elem).height()) { - cont[1] = vals[3]; - cont[3] = vals[1]; - } - - $(elem).find('.drag-master').draggable({ - containment:cont, - scroll:false, - drag:function(event,ui) { - methods.mapDrag(ui,elem,pic,state); - } - }); - }, - - // FIT PICTURE TO FRAME - fit : function(elem,img,state) { - if($(elem).width() > $(elem).height()) { - state.zoom = ($(elem).height()*.95)/state.size; - } else { - state.zoom = ($(elem).width()*.95)/state.size; - } - state.minZoom = state.zoom*.9; - state.center = [ - $(elem).offset().left+$(elem).width()/2, - $(elem).offset().top+$(elem).height()/2, - 0, - 0 - ]; - methods.resize(img,elem,state,true); - // center - $('.drag-master',elem).css({ - //'background':'#222', //debug - 'top' :Math.floor(($(elem).height()-(state.size*state.zoom))/2)-1, - 'left' :Math.floor(($(elem).width() -(state.size*state.zoom))/2) - }); - // init pane - $(elem).find('.pane').css({ - 'left':state.mapX, - 'top':state.mapY, - 'right':state.mapX, - 'bottom':state.mapY - }); - return state; - }, - - resize : function(img,elem,state,center) { - if(state.angle%180 > 0 && $.browser.msie) { - var margin = Math.abs(state.height-state.width)*state.zoom/2; - $(img).css({ - 'width' :state.width*state.zoom, - 'height':state.height*state.zoom, - 'top' :(state.size-state.height)*state.zoom/2+margin, - 'left' :(state.size-state.width) *state.zoom/2-margin - }); - } else { - $(img).css({ - 'width' :state.width*state.zoom, - 'height':state.height*state.zoom, - 'top' :(state.size-state.height)*state.zoom/2, - 'left' :(state.size-state.width) *state.zoom/2 - }); - } - $('.drag-master',elem).css({ - 'width' :state.size*state.zoom, - 'height':state.size*state.zoom - }); - - methods.setDrag(img,elem,state); - $('.zoom_level span',elem).html(Math.round(state.zoom*100)+"%"); - - // CENTER - if(center) { - $(elem).find('.drag-master').css({ - 'left':state.center[0]-(state.center[2]*state.zoom)-$(elem).offset().left, - 'top' :state.center[1]-(state.center[3]*state.zoom)-$(elem).offset().top - }); - } - - // MAP - var dm = $(elem).find('.drag-master'); - methods.mapDrag({position:{left:dm.offset().left-$(elem).offset().left,top:dm.offset().top-$(elem).offset().top}},elem,$(elem).find('.doc'),state); - }, - - mapDrag : function(ui,elem,pic,state) { - $(pic).rotate(state.angle); - - var width = state.mapWidth; - var height = state.mapHeight; - var borderWidth = ($.browser.msie)? 0:parseInt($(elem).find('.pane').css('border-left-width')); - - // map info - var mapOffset = $(elem).find('.doc_map').offset(); - var mapImg = $(elem).find('.doc_map img'); - var miOffset = mapImg.offset(); - var miWidth = mapImg.width(); - var miHeight = mapImg.height(); - - // display info - var picWidth = $(pic).width(); - var picHeight = $(pic).height(); - - // rotational dimension consideration - if(!$.browser.msie && state.angle%180 > 0) { - width = height; - height = state.mapWidth; - miWidth = miHeight; - miHeight = mapImg.width(); - picWidth = picHeight; - picHeight = $(pic).width(); - var diff = Math.abs(miWidth-miHeight)/2; - miOffset.left += diff; - miOffset.top -= diff; - } - - // position and width percents - var DM = $('.drag-master'); - var mX = (picWidth-DM.width())/2; - var mY = (picHeight-DM.height())/2; - var posX = Math.min(0,(ui.position.left-mX))/picWidth; - var posY = Math.min(0,(ui.position.top-mY))/picHeight; - var coveredX = Math.max(0,picWidth-$(elem).width())/picWidth; - var coveredY = Math.max(0,picHeight-$(elem).height())/picHeight; - - var css = { - 'left' : miOffset.left - mapOffset.left - miWidth*posX - borderWidth, - 'top' : miOffset.top - mapOffset.top - miHeight*posY - borderWidth, - 'width' : (miWidth - borderWidth) * (1-coveredX), - 'height': (miHeight - borderWidth) * (1-coveredY) - }; - - // firefox rotation fix (doesn't change offset) - if(state.angle%180 > 0 && $.browser.mozilla) { - var m = Math.abs(height-width)/2; - css.left -= m; - css.top += m; - } - - $(elem).find('.pane').css(css); - - // dragging - var cont = [ - miOffset.left, - miOffset.top, - miOffset.left + miWidth - css.width - borderWidth*2, - miOffset.top + miHeight - css.height - borderWidth*2 - ]; - - // firefox rotation fix part 2 - if(state.angle%180 > 0 && $.browser.mozilla) { - var m = Math.abs(height-width)/2; - cont[0] -= m; - cont[1] += m; - cont[2] -= m; - cont[3] += m; - } - - $(elem).find('.pane').draggable({ - containment:cont, - scroll:false, - drag:function(event,ui) { - var DM = $(elem).find('.drag-master'); - var margin = Math.abs(state.height-state.width)/2*state.zoom; - var left = (~(ui.position.left-state.mapX)/width)*picWidth; - var top = (~(ui.position.top-state.mapY)/height)*picHeight; - if(state.width < state.height) - left += mX + mY; - else - top += mX + mY; - if($(elem).width() < $(pic).width()) - DM.css({'left': left }); - if($(elem).height() < $(pic).height()) - DM.css({'top' : top }); - } - }); - } - }; - - $.fn.inspector = function(src) { - if($('.drag-master',this).length == 0 || $.browser.msie) { // init or IE just start over for IE - methods.init(this); // add interface - methods.setHandlers(this, methods.load(this,src) ); - } - else if($('.doc',this).attr('src') != src) { - methods.setHandlers(this, methods.load(this,src) ); - } - return this; - } -})(jQuery); \ No newline at end of file diff --git a/themes/blueprint/js/jquery-ui/js/jquery-ui.js b/themes/blueprint/js/jquery-ui/js/jquery-ui.js deleted file mode 100644 index 8c966753195..00000000000 --- a/themes/blueprint/js/jquery-ui/js/jquery-ui.js +++ /dev/null @@ -1,284 +0,0 @@ -/*! - * jQuery UI 1.8.16 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI - */ -(function(c,j){function k(a,b){var d=a.nodeName.toLowerCase();if("area"===d){b=a.parentNode;d=b.name;if(!a.href||!d||b.nodeName.toLowerCase()!=="map")return false;a=c("img[usemap=#"+d+"]")[0];return!!a&&l(a)}return(/input|select|textarea|button|object/.test(d)?!a.disabled:"a"==d?a.href||b:b)&&l(a)}function l(a){return!c(a).parents().andSelf().filter(function(){return c.curCSS(this,"visibility")==="hidden"||c.expr.filters.hidden(this)}).length}c.ui=c.ui||{};if(!c.ui.version){c.extend(c.ui,{version:"1.8.16", -keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});c.fn.extend({propAttr:c.fn.prop||c.fn.attr,_focus:c.fn.focus,focus:function(a,b){return typeof a==="number"?this.each(function(){var d= -this;setTimeout(function(){c(d).focus();b&&b.call(d)},a)}):this._focus.apply(this,arguments)},scrollParent:function(){var a;a=c.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(c.curCSS(this,"position",1))&&/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(c.curCSS(this, -"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!a.length?c(document):a},zIndex:function(a){if(a!==j)return this.css("zIndex",a);if(this.length){a=c(this[0]);for(var b;a.length&&a[0]!==document;){b=a.css("position");if(b==="absolute"||b==="relative"||b==="fixed"){b=parseInt(a.css("zIndex"),10);if(!isNaN(b)&&b!==0)return b}a=a.parent()}}return 0},disableSelection:function(){return this.bind((c.support.selectstart?"selectstart": -"mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});c.each(["Width","Height"],function(a,b){function d(f,g,m,n){c.each(e,function(){g-=parseFloat(c.curCSS(f,"padding"+this,true))||0;if(m)g-=parseFloat(c.curCSS(f,"border"+this+"Width",true))||0;if(n)g-=parseFloat(c.curCSS(f,"margin"+this,true))||0});return g}var e=b==="Width"?["Left","Right"]:["Top","Bottom"],h=b.toLowerCase(),i={innerWidth:c.fn.innerWidth,innerHeight:c.fn.innerHeight, -outerWidth:c.fn.outerWidth,outerHeight:c.fn.outerHeight};c.fn["inner"+b]=function(f){if(f===j)return i["inner"+b].call(this);return this.each(function(){c(this).css(h,d(this,f)+"px")})};c.fn["outer"+b]=function(f,g){if(typeof f!=="number")return i["outer"+b].call(this,f);return this.each(function(){c(this).css(h,d(this,f,true,g)+"px")})}});c.extend(c.expr[":"],{data:function(a,b,d){return!!c.data(a,d[3])},focusable:function(a){return k(a,!isNaN(c.attr(a,"tabindex")))},tabbable:function(a){var b=c.attr(a, -"tabindex"),d=isNaN(b);return(d||b>=0)&&k(a,!d)}});c(function(){var a=document.body,b=a.appendChild(b=document.createElement("div"));c.extend(b.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});c.support.minHeight=b.offsetHeight===100;c.support.selectstart="onselectstart"in b;a.removeChild(b).style.display="none"});c.extend(c.ui,{plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&& -a.element[0].parentNode)for(var e=0;e0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a=9)&&!a.button)return this._mouseUp(a);if(this._mouseStarted){this._mouseDrag(a);return a.preventDefault()}if(this._mouseDistanceMet(a)&&this._mouseDelayMet(a))(this._mouseStarted=this._mouseStart(this._mouseDownEvent,a)!==false)?this._mouseDrag(a):this._mouseUp(a);return!this._mouseStarted},_mouseUp:function(a){b(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted= -false;a.target==this._mouseDownEvent.target&&b.data(a.target,this.widgetName+".preventClickEvent",true);this._mouseStop(a)}return false},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX-a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return true}})})(jQuery); -;/* - * jQuery UI Position 1.8.16 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Position - */ -(function(c){c.ui=c.ui||{};var n=/left|center|right/,o=/top|center|bottom/,t=c.fn.position,u=c.fn.offset;c.fn.position=function(b){if(!b||!b.of)return t.apply(this,arguments);b=c.extend({},b);var a=c(b.of),d=a[0],g=(b.collision||"flip").split(" "),e=b.offset?b.offset.split(" "):[0,0],h,k,j;if(d.nodeType===9){h=a.width();k=a.height();j={top:0,left:0}}else if(d.setTimeout){h=a.width();k=a.height();j={top:a.scrollTop(),left:a.scrollLeft()}}else if(d.preventDefault){b.at="left top";h=k=0;j={top:b.of.pageY, -left:b.of.pageX}}else{h=a.outerWidth();k=a.outerHeight();j=a.offset()}c.each(["my","at"],function(){var f=(b[this]||"").split(" ");if(f.length===1)f=n.test(f[0])?f.concat(["center"]):o.test(f[0])?["center"].concat(f):["center","center"];f[0]=n.test(f[0])?f[0]:"center";f[1]=o.test(f[1])?f[1]:"center";b[this]=f});if(g.length===1)g[1]=g[0];e[0]=parseInt(e[0],10)||0;if(e.length===1)e[1]=e[0];e[1]=parseInt(e[1],10)||0;if(b.at[0]==="right")j.left+=h;else if(b.at[0]==="center")j.left+=h/2;if(b.at[1]==="bottom")j.top+= -k;else if(b.at[1]==="center")j.top+=k/2;j.left+=e[0];j.top+=e[1];return this.each(function(){var f=c(this),l=f.outerWidth(),m=f.outerHeight(),p=parseInt(c.curCSS(this,"marginLeft",true))||0,q=parseInt(c.curCSS(this,"marginTop",true))||0,v=l+p+(parseInt(c.curCSS(this,"marginRight",true))||0),w=m+q+(parseInt(c.curCSS(this,"marginBottom",true))||0),i=c.extend({},j),r;if(b.my[0]==="right")i.left-=l;else if(b.my[0]==="center")i.left-=l/2;if(b.my[1]==="bottom")i.top-=m;else if(b.my[1]==="center")i.top-= -m/2;i.left=Math.round(i.left);i.top=Math.round(i.top);r={left:i.left-p,top:i.top-q};c.each(["left","top"],function(s,x){c.ui.position[g[s]]&&c.ui.position[g[s]][x](i,{targetWidth:h,targetHeight:k,elemWidth:l,elemHeight:m,collisionPosition:r,collisionWidth:v,collisionHeight:w,offset:e,my:b.my,at:b.at})});c.fn.bgiframe&&f.bgiframe();f.offset(c.extend(i,{using:b.using}))})};c.ui.position={fit:{left:function(b,a){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();b.left= -d>0?b.left-d:Math.max(b.left-a.collisionPosition.left,b.left)},top:function(b,a){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();b.top=d>0?b.top-d:Math.max(b.top-a.collisionPosition.top,b.top)}},flip:{left:function(b,a){if(a.at[0]!=="center"){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();var g=a.my[0]==="left"?-a.elemWidth:a.my[0]==="right"?a.elemWidth:0,e=a.at[0]==="left"?a.targetWidth:-a.targetWidth,h=-2*a.offset[0];b.left+= -a.collisionPosition.left<0?g+e+h:d>0?g+e+h:0}},top:function(b,a){if(a.at[1]!=="center"){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();var g=a.my[1]==="top"?-a.elemHeight:a.my[1]==="bottom"?a.elemHeight:0,e=a.at[1]==="top"?a.targetHeight:-a.targetHeight,h=-2*a.offset[1];b.top+=a.collisionPosition.top<0?g+e+h:d>0?g+e+h:0}}}};if(!c.offset.setOffset){c.offset.setOffset=function(b,a){if(/static/.test(c.curCSS(b,"position")))b.style.position="relative";var d=c(b), -g=d.offset(),e=parseInt(c.curCSS(b,"top",true),10)||0,h=parseInt(c.curCSS(b,"left",true),10)||0;g={top:a.top-g.top+e,left:a.left-g.left+h};"using"in a?a.using.call(b,g):d.css(g)};c.fn.offset=function(b){var a=this[0];if(!a||!a.ownerDocument)return null;if(b)return this.each(function(){c.offset.setOffset(this,b)});return u.call(this)}}})(jQuery); -;/* - * jQuery UI Draggable 1.8.16 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Draggables - * - * Depends: - * jquery.ui.core.js - * jquery.ui.mouse.js - * jquery.ui.widget.js - */ -(function(d){d.widget("ui.draggable",d.ui.mouse,{widgetEventPrefix:"drag",options:{addClasses:true,appendTo:"parent",axis:false,connectToSortable:false,containment:false,cursor:"auto",cursorAt:false,grid:false,handle:false,helper:"original",iframeFix:false,opacity:false,refreshPositions:false,revert:false,revertDuration:500,scope:"default",scroll:true,scrollSensitivity:20,scrollSpeed:20,snap:false,snapMode:"both",snapTolerance:20,stack:false,zIndex:false},_create:function(){if(this.options.helper== -"original"&&!/^(?:r|a|f)/.test(this.element.css("position")))this.element[0].style.position="relative";this.options.addClasses&&this.element.addClass("ui-draggable");this.options.disabled&&this.element.addClass("ui-draggable-disabled");this._mouseInit()},destroy:function(){if(this.element.data("draggable")){this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled");this._mouseDestroy();return this}},_mouseCapture:function(a){var b= -this.options;if(this.helper||b.disabled||d(a.target).is(".ui-resizable-handle"))return false;this.handle=this._getHandle(a);if(!this.handle)return false;if(b.iframeFix)d(b.iframeFix===true?"iframe":b.iframeFix).each(function(){d('
    ').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1E3}).css(d(this).offset()).appendTo("body")});return true},_mouseStart:function(a){var b=this.options; -this.helper=this._createHelper(a);this._cacheHelperProportions();if(d.ui.ddmanager)d.ui.ddmanager.current=this;this._cacheMargins();this.cssPosition=this.helper.css("position");this.scrollParent=this.helper.scrollParent();this.offset=this.positionAbs=this.element.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};d.extend(this.offset,{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}); -this.originalPosition=this.position=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);b.containment&&this._setContainment();if(this._trigger("start",a)===false){this._clear();return false}this._cacheHelperProportions();d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.helper.addClass("ui-draggable-dragging");this._mouseDrag(a,true);d.ui.ddmanager&&d.ui.ddmanager.dragStart(this,a);return true}, -_mouseDrag:function(a,b){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute");if(!b){b=this._uiHash();if(this._trigger("drag",a,b)===false){this._mouseUp({});return false}this.position=b.position}if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);return false},_mouseStop:function(a){var b= -false;if(d.ui.ddmanager&&!this.options.dropBehaviour)b=d.ui.ddmanager.drop(this,a);if(this.dropped){b=this.dropped;this.dropped=false}if((!this.element[0]||!this.element[0].parentNode)&&this.options.helper=="original")return false;if(this.options.revert=="invalid"&&!b||this.options.revert=="valid"&&b||this.options.revert===true||d.isFunction(this.options.revert)&&this.options.revert.call(this.element,b)){var c=this;d(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration, -10),function(){c._trigger("stop",a)!==false&&c._clear()})}else this._trigger("stop",a)!==false&&this._clear();return false},_mouseUp:function(a){this.options.iframeFix===true&&d("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)});d.ui.ddmanager&&d.ui.ddmanager.dragStop(this,a);return d.ui.mouse.prototype._mouseUp.call(this,a)},cancel:function(){this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear();return this},_getHandle:function(a){var b=!this.options.handle|| -!d(this.options.handle,this.element).length?true:false;d(this.options.handle,this.element).find("*").andSelf().each(function(){if(this==a.target)b=true});return b},_createHelper:function(a){var b=this.options;a=d.isFunction(b.helper)?d(b.helper.apply(this.element[0],[a])):b.helper=="clone"?this.element.clone().removeAttr("id"):this.element;a.parents("body").length||a.appendTo(b.appendTo=="parent"?this.element[0].parentNode:b.appendTo);a[0]!=this.element[0]&&!/(fixed|absolute)/.test(a.css("position"))&& -a.css("position","absolute");return a},_adjustOffsetFromHelper:function(a){if(typeof a=="string")a=a.split(" ");if(d.isArray(a))a={left:+a[0],top:+a[1]||0};if("left"in a)this.offset.click.left=a.left+this.margins.left;if("right"in a)this.offset.click.left=this.helperProportions.width-a.right+this.margins.left;if("top"in a)this.offset.click.top=a.top+this.margins.top;if("bottom"in a)this.offset.click.top=this.helperProportions.height-a.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent= -this.helper.offsetParent();var a=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0])){a.left+=this.scrollParent.scrollLeft();a.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&d.browser.msie)a={top:0,left:0};return{top:a.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:a.left+(parseInt(this.offsetParent.css("borderLeftWidth"), -10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.element.position();return{top:a.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"), -10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var a=this.options;if(a.containment=="parent")a.containment=this.helper[0].parentNode;if(a.containment=="document"||a.containment=="window")this.containment=[a.containment=="document"?0:d(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,a.containment=="document"?0:d(window).scrollTop()-this.offset.relative.top-this.offset.parent.top, -(a.containment=="document"?0:d(window).scrollLeft())+d(a.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(a.containment=="document"?0:d(window).scrollTop())+(d(a.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(a.containment)&&a.containment.constructor!=Array){a=d(a.containment);var b=a[0];if(b){a.offset();var c=d(b).css("overflow")!= -"hidden";this.containment=[(parseInt(d(b).css("borderLeftWidth"),10)||0)+(parseInt(d(b).css("paddingLeft"),10)||0),(parseInt(d(b).css("borderTopWidth"),10)||0)+(parseInt(d(b).css("paddingTop"),10)||0),(c?Math.max(b.scrollWidth,b.offsetWidth):b.offsetWidth)-(parseInt(d(b).css("borderLeftWidth"),10)||0)-(parseInt(d(b).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(c?Math.max(b.scrollHeight,b.offsetHeight):b.offsetHeight)-(parseInt(d(b).css("borderTopWidth"), -10)||0)-(parseInt(d(b).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom];this.relative_container=a}}else if(a.containment.constructor==Array)this.containment=a.containment},_convertPositionTo:function(a,b){if(!b)b=this.position;a=a=="absolute"?1:-1;var c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName);return{top:b.top+ -this.offset.relative.top*a+this.offset.parent.top*a-(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:c.scrollTop())*a),left:b.left+this.offset.relative.left*a+this.offset.parent.left*a-(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():f?0:c.scrollLeft())*a)}},_generatePosition:function(a){var b=this.options,c=this.cssPosition=="absolute"&& -!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName),e=a.pageX,h=a.pageY;if(this.originalPosition){var g;if(this.containment){if(this.relative_container){g=this.relative_container.offset();g=[this.containment[0]+g.left,this.containment[1]+g.top,this.containment[2]+g.left,this.containment[3]+g.top]}else g=this.containment;if(a.pageX-this.offset.click.leftg[2])e=g[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>g[3])h=g[3]+this.offset.click.top}if(b.grid){h=b.grid[1]?this.originalPageY+Math.round((h-this.originalPageY)/b.grid[1])*b.grid[1]:this.originalPageY;h=g?!(h-this.offset.click.topg[3])?h:!(h-this.offset.click.topg[2])?e:!(e-this.offset.click.left=0;i--){var j=c.snapElements[i].left,l=j+c.snapElements[i].width,k=c.snapElements[i].top,m=k+c.snapElements[i].height;if(j-e=j&&f<=l||h>=j&&h<=l||fl)&&(e>= -i&&e<=k||g>=i&&g<=k||ek);default:return false}};d.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(a,b){var c=d.ui.ddmanager.droppables[a.options.scope]||[],e=b?b.type:null,g=(a.currentItem||a.element).find(":data(droppable)").andSelf(),f=0;a:for(;f").addClass("ui-autocomplete").appendTo(d(this.options.appendTo||"body",b)[0]).mousedown(function(c){var f=a.menu.element[0];d(c.target).closest(".ui-menu-item").length||setTimeout(function(){d(document).one("mousedown",function(h){h.target!==a.element[0]&&h.target!==f&&!d.ui.contains(f,h.target)&&a.close()})},1);setTimeout(function(){clearTimeout(a.closing)},13)}).menu({focus:function(c,f){f=f.item.data("item.autocomplete");false!==a._trigger("focus",c,{item:f})&&/^key/.test(c.originalEvent.type)&& -a.element.val(f.value)},selected:function(c,f){var h=f.item.data("item.autocomplete"),i=a.previous;if(a.element[0]!==b.activeElement){a.element.focus();a.previous=i;setTimeout(function(){a.previous=i;a.selectedItem=h},1)}false!==a._trigger("select",c,{item:h})&&a.element.val(h.value);a.term=a.element.val();a.close(c);a.selectedItem=h},blur:function(){a.menu.element.is(":visible")&&a.element.val()!==a.term&&a.element.val(a.term)}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu"); -d.fn.bgiframe&&this.menu.element.bgiframe()},destroy:function(){this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete").removeAttr("role").removeAttr("aria-autocomplete").removeAttr("aria-haspopup");this.menu.element.remove();d.Widget.prototype.destroy.call(this)},_setOption:function(a,b){d.Widget.prototype._setOption.apply(this,arguments);a==="source"&&this._initSource();if(a==="appendTo")this.menu.element.appendTo(d(b||"body",this.element[0].ownerDocument)[0]);a==="disabled"&& -b&&this.xhr&&this.xhr.abort()},_initSource:function(){var a=this,b,g;if(d.isArray(this.options.source)){b=this.options.source;this.source=function(c,f){f(d.ui.autocomplete.filter(b,c.term))}}else if(typeof this.options.source==="string"){g=this.options.source;this.source=function(c,f){a.xhr&&a.xhr.abort();a.xhr=d.ajax({url:g,data:c,dataType:"json",autocompleteRequest:++e,success:function(h){this.autocompleteRequest===e&&f(h)},error:function(){this.autocompleteRequest===e&&f([])}})}}else this.source= -this.options.source},search:function(a,b){a=a!=null?a:this.element.val();this.term=this.element.val();if(a.length").data("item.autocomplete",b).append(d("").text(b.label)).appendTo(a)},_move:function(a,b){if(this.menu.element.is(":visible"))if(this.menu.first()&&/^previous/.test(a)||this.menu.last()&&/^next/.test(a)){this.element.val(this.term);this.menu.deactivate()}else this.menu[a](b);else this.search(null,b)},widget:function(){return this.menu.element}});d.extend(d.ui.autocomplete,{escapeRegex:function(a){return a.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, -"\\$&")},filter:function(a,b){var g=new RegExp(d.ui.autocomplete.escapeRegex(b),"i");return d.grep(a,function(c){return g.test(c.label||c.value||c)})}})})(jQuery); -(function(d){d.widget("ui.menu",{_create:function(){var e=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(a){if(d(a.target).closest(".ui-menu-item a").length){a.preventDefault();e.select(a)}});this.refresh()},refresh:function(){var e=this;this.element.children("li:not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","menuitem").children("a").addClass("ui-corner-all").attr("tabindex", --1).mouseenter(function(a){e.activate(a,d(this).parent())}).mouseleave(function(){e.deactivate()})},activate:function(e,a){this.deactivate();if(this.hasScroll()){var b=a.offset().top-this.element.offset().top,g=this.element.scrollTop(),c=this.element.height();if(b<0)this.element.scrollTop(g+b);else b>=c&&this.element.scrollTop(g+b-c+a.height())}this.active=a.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end();this._trigger("focus",e,{item:a})},deactivate:function(){if(this.active){this.active.children("a").removeClass("ui-state-hover").removeAttr("id"); -this._trigger("blur");this.active=null}},next:function(e){this.move("next",".ui-menu-item:first",e)},previous:function(e){this.move("prev",".ui-menu-item:last",e)},first:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},last:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},move:function(e,a,b){if(this.active){e=this.active[e+"All"](".ui-menu-item").eq(0);e.length?this.activate(b,e):this.activate(b,this.element.children(a))}else this.activate(b, -this.element.children(a))},nextPage:function(e){if(this.hasScroll())if(!this.active||this.last())this.activate(e,this.element.children(".ui-menu-item:first"));else{var a=this.active.offset().top,b=this.element.height(),g=this.element.children(".ui-menu-item").filter(function(){var c=d(this).offset().top-a-b+d(this).height();return c<10&&c>-10});g.length||(g=this.element.children(".ui-menu-item:last"));this.activate(e,g)}else this.activate(e,this.element.children(".ui-menu-item").filter(!this.active|| -this.last()?":first":":last"))},previousPage:function(e){if(this.hasScroll())if(!this.active||this.first())this.activate(e,this.element.children(".ui-menu-item:last"));else{var a=this.active.offset().top,b=this.element.height();result=this.element.children(".ui-menu-item").filter(function(){var g=d(this).offset().top-a+b-d(this).height();return g<10&&g>-10});result.length||(result=this.element.children(".ui-menu-item:first"));this.activate(e,result)}else this.activate(e,this.element.children(".ui-menu-item").filter(!this.active|| -this.first()?":last":":first"))},hasScroll:function(){return this.element.height()
    ")).appendTo(document.body).hide().addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+ -b.dialogClass).css({zIndex:b.zIndex}).attr("tabIndex",-1).css("outline",0).keydown(function(i){if(b.closeOnEscape&&!i.isDefaultPrevented()&&i.keyCode&&i.keyCode===c.ui.keyCode.ESCAPE){a.close(i);i.preventDefault()}}).attr({role:"dialog","aria-labelledby":e}).mousedown(function(i){a.moveToTop(false,i)});a.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(g);var f=(a.uiDialogTitlebar=c("
    ")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(g), -h=c('').addClass("ui-dialog-titlebar-close ui-corner-all").attr("role","button").hover(function(){h.addClass("ui-state-hover")},function(){h.removeClass("ui-state-hover")}).focus(function(){h.addClass("ui-state-focus")}).blur(function(){h.removeClass("ui-state-focus")}).click(function(i){a.close(i);return false}).appendTo(f);(a.uiDialogTitlebarCloseText=c("")).addClass("ui-icon ui-icon-closethick").text(b.closeText).appendTo(h);c("").addClass("ui-dialog-title").attr("id", -e).html(d).prependTo(f);if(c.isFunction(b.beforeclose)&&!c.isFunction(b.beforeClose))b.beforeClose=b.beforeclose;f.find("*").add(f).disableSelection();b.draggable&&c.fn.draggable&&a._makeDraggable();b.resizable&&c.fn.resizable&&a._makeResizable();a._createButtons(b.buttons);a._isOpen=false;c.fn.bgiframe&&g.bgiframe()},_init:function(){this.options.autoOpen&&this.open()},destroy:function(){var a=this;a.overlay&&a.overlay.destroy();a.uiDialog.hide();a.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body"); -a.uiDialog.remove();a.originalTitle&&a.element.attr("title",a.originalTitle);return a},widget:function(){return this.uiDialog},close:function(a){var b=this,d,e;if(false!==b._trigger("beforeClose",a)){b.overlay&&b.overlay.destroy();b.uiDialog.unbind("keypress.ui-dialog");b._isOpen=false;if(b.options.hide)b.uiDialog.hide(b.options.hide,function(){b._trigger("close",a)});else{b.uiDialog.hide();b._trigger("close",a)}c.ui.dialog.overlay.resize();if(b.options.modal){d=0;c(".ui-dialog").each(function(){if(this!== -b.uiDialog[0]){e=c(this).css("z-index");isNaN(e)||(d=Math.max(d,e))}});c.ui.dialog.maxZ=d}return b}},isOpen:function(){return this._isOpen},moveToTop:function(a,b){var d=this,e=d.options;if(e.modal&&!a||!e.stack&&!e.modal)return d._trigger("focus",b);if(e.zIndex>c.ui.dialog.maxZ)c.ui.dialog.maxZ=e.zIndex;if(d.overlay){c.ui.dialog.maxZ+=1;d.overlay.$el.css("z-index",c.ui.dialog.overlay.maxZ=c.ui.dialog.maxZ)}a={scrollTop:d.element.scrollTop(),scrollLeft:d.element.scrollLeft()};c.ui.dialog.maxZ+=1; -d.uiDialog.css("z-index",c.ui.dialog.maxZ);d.element.attr(a);d._trigger("focus",b);return d},open:function(){if(!this._isOpen){var a=this,b=a.options,d=a.uiDialog;a.overlay=b.modal?new c.ui.dialog.overlay(a):null;a._size();a._position(b.position);d.show(b.show);a.moveToTop(true);b.modal&&d.bind("keypress.ui-dialog",function(e){if(e.keyCode===c.ui.keyCode.TAB){var g=c(":tabbable",this),f=g.filter(":first");g=g.filter(":last");if(e.target===g[0]&&!e.shiftKey){f.focus(1);return false}else if(e.target=== -f[0]&&e.shiftKey){g.focus(1);return false}}});c(a.element.find(":tabbable").get().concat(d.find(".ui-dialog-buttonpane :tabbable").get().concat(d.get()))).eq(0).focus();a._isOpen=true;a._trigger("open");return a}},_createButtons:function(a){var b=this,d=false,e=c("
    ").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),g=c("
    ").addClass("ui-dialog-buttonset").appendTo(e);b.uiDialog.find(".ui-dialog-buttonpane").remove();typeof a==="object"&&a!==null&&c.each(a, -function(){return!(d=true)});if(d){c.each(a,function(f,h){h=c.isFunction(h)?{click:h,text:f}:h;var i=c('').click(function(){h.click.apply(b.element[0],arguments)}).appendTo(g);c.each(h,function(j,k){if(j!=="click")j in o?i[j](k):i.attr(j,k)});c.fn.button&&i.button()});e.appendTo(b.uiDialog)}},_makeDraggable:function(){function a(f){return{position:f.position,offset:f.offset}}var b=this,d=b.options,e=c(document),g;b.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close", -handle:".ui-dialog-titlebar",containment:"document",start:function(f,h){g=d.height==="auto"?"auto":c(this).height();c(this).height(c(this).height()).addClass("ui-dialog-dragging");b._trigger("dragStart",f,a(h))},drag:function(f,h){b._trigger("drag",f,a(h))},stop:function(f,h){d.position=[h.position.left-e.scrollLeft(),h.position.top-e.scrollTop()];c(this).removeClass("ui-dialog-dragging").height(g);b._trigger("dragStop",f,a(h));c.ui.dialog.overlay.resize()}})},_makeResizable:function(a){function b(f){return{originalPosition:f.originalPosition, -originalSize:f.originalSize,position:f.position,size:f.size}}a=a===l?this.options.resizable:a;var d=this,e=d.options,g=d.uiDialog.css("position");a=typeof a==="string"?a:"n,e,s,w,se,sw,ne,nw";d.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:d.element,maxWidth:e.maxWidth,maxHeight:e.maxHeight,minWidth:e.minWidth,minHeight:d._minHeight(),handles:a,start:function(f,h){c(this).addClass("ui-dialog-resizing");d._trigger("resizeStart",f,b(h))},resize:function(f,h){d._trigger("resize", -f,b(h))},stop:function(f,h){c(this).removeClass("ui-dialog-resizing");e.height=c(this).height();e.width=c(this).width();d._trigger("resizeStop",f,b(h));c.ui.dialog.overlay.resize()}}).css("position",g).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_minHeight:function(){var a=this.options;return a.height==="auto"?a.minHeight:Math.min(a.minHeight,a.height)},_position:function(a){var b=[],d=[0,0],e;if(a){if(typeof a==="string"||typeof a==="object"&&"0"in a){b=a.split?a.split(" "): -[a[0],a[1]];if(b.length===1)b[1]=b[0];c.each(["left","top"],function(g,f){if(+b[g]===b[g]){d[g]=b[g];b[g]=f}});a={my:b.join(" "),at:b.join(" "),offset:d.join(" ")}}a=c.extend({},c.ui.dialog.prototype.options.position,a)}else a=c.ui.dialog.prototype.options.position;(e=this.uiDialog.is(":visible"))||this.uiDialog.show();this.uiDialog.css({top:0,left:0}).position(c.extend({of:window},a));e||this.uiDialog.hide()},_setOptions:function(a){var b=this,d={},e=false;c.each(a,function(g,f){b._setOption(g,f); -if(g in m)e=true;if(g in n)d[g]=f});e&&this._size();this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option",d)},_setOption:function(a,b){var d=this,e=d.uiDialog;switch(a){case "beforeclose":a="beforeClose";break;case "buttons":d._createButtons(b);break;case "closeText":d.uiDialogTitlebarCloseText.text(""+b);break;case "dialogClass":e.removeClass(d.options.dialogClass).addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+b);break;case "disabled":b?e.addClass("ui-dialog-disabled"): -e.removeClass("ui-dialog-disabled");break;case "draggable":var g=e.is(":data(draggable)");g&&!b&&e.draggable("destroy");!g&&b&&d._makeDraggable();break;case "position":d._position(b);break;case "resizable":(g=e.is(":data(resizable)"))&&!b&&e.resizable("destroy");g&&typeof b==="string"&&e.resizable("option","handles",b);!g&&b!==false&&d._makeResizable(b);break;case "title":c(".ui-dialog-title",d.uiDialogTitlebar).html(""+(b||" "));break}c.Widget.prototype._setOption.apply(d,arguments)},_size:function(){var a= -this.options,b,d,e=this.uiDialog.is(":visible");this.element.show().css({width:"auto",minHeight:0,height:0});if(a.minWidth>a.width)a.width=a.minWidth;b=this.uiDialog.css({height:"auto",width:a.width}).height();d=Math.max(0,a.minHeight-b);if(a.height==="auto")if(c.support.minHeight)this.element.css({minHeight:d,height:"auto"});else{this.uiDialog.show();a=this.element.css("height","auto").height();e||this.uiDialog.hide();this.element.height(Math.max(a,d))}else this.element.height(Math.max(a.height- -b,0));this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())}});c.extend(c.ui.dialog,{version:"1.8.16",uuid:0,maxZ:0,getTitleId:function(a){a=a.attr("id");if(!a){this.uuid+=1;a=this.uuid}return"ui-dialog-title-"+a},overlay:function(a){this.$el=c.ui.dialog.overlay.create(a)}});c.extend(c.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:c.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(a){return a+".dialog-overlay"}).join(" "), -create:function(a){if(this.instances.length===0){setTimeout(function(){c.ui.dialog.overlay.instances.length&&c(document).bind(c.ui.dialog.overlay.events,function(d){if(c(d.target).zIndex()
    ").addClass("ui-widget-overlay")).appendTo(document.body).css({width:this.width(),height:this.height()});c.fn.bgiframe&&b.bgiframe();this.instances.push(b);return b},destroy:function(a){var b=c.inArray(a,this.instances);b!=-1&&this.oldInstances.push(this.instances.splice(b,1)[0]);this.instances.length===0&&c([document,window]).unbind(".dialog-overlay");a.remove();var d=0;c.each(this.instances,function(){d=Math.max(d,this.css("z-index"))});this.maxZ=d},height:function(){var a,b;if(c.browser.msie&& -c.browser.version<7){a=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight);b=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight);return a
    ").appendTo(this.element).addClass("ui-slider-range ui-widget-header"+(b.range==="min"||b.range==="max"?" ui-slider-range-"+b.range:""))}for(var j=c.length;j"); -this.handles=c.add(d(e.join("")).appendTo(a.element));this.handle=this.handles.eq(0);this.handles.add(this.range).filter("a").click(function(g){g.preventDefault()}).hover(function(){b.disabled||d(this).addClass("ui-state-hover")},function(){d(this).removeClass("ui-state-hover")}).focus(function(){if(b.disabled)d(this).blur();else{d(".ui-slider .ui-state-focus").removeClass("ui-state-focus");d(this).addClass("ui-state-focus")}}).blur(function(){d(this).removeClass("ui-state-focus")});this.handles.each(function(g){d(this).data("index.ui-slider-handle", -g)});this.handles.keydown(function(g){var k=true,l=d(this).data("index.ui-slider-handle"),i,h,m;if(!a.options.disabled){switch(g.keyCode){case d.ui.keyCode.HOME:case d.ui.keyCode.END:case d.ui.keyCode.PAGE_UP:case d.ui.keyCode.PAGE_DOWN:case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:k=false;if(!a._keySliding){a._keySliding=true;d(this).addClass("ui-state-active");i=a._start(g,l);if(i===false)return}break}m=a.options.step;i=a.options.values&&a.options.values.length? -(h=a.values(l)):(h=a.value());switch(g.keyCode){case d.ui.keyCode.HOME:h=a._valueMin();break;case d.ui.keyCode.END:h=a._valueMax();break;case d.ui.keyCode.PAGE_UP:h=a._trimAlignValue(i+(a._valueMax()-a._valueMin())/5);break;case d.ui.keyCode.PAGE_DOWN:h=a._trimAlignValue(i-(a._valueMax()-a._valueMin())/5);break;case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:if(i===a._valueMax())return;h=a._trimAlignValue(i+m);break;case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:if(i===a._valueMin())return;h=a._trimAlignValue(i- -m);break}a._slide(g,l,h);return k}}).keyup(function(g){var k=d(this).data("index.ui-slider-handle");if(a._keySliding){a._keySliding=false;a._stop(g,k);a._change(g,k);d(this).removeClass("ui-state-active")}});this._refreshValue();this._animateOff=false},destroy:function(){this.handles.remove();this.range.remove();this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-slider-disabled ui-widget ui-widget-content ui-corner-all").removeData("slider").unbind(".slider");this._mouseDestroy(); -return this},_mouseCapture:function(a){var b=this.options,c,f,e,j,g;if(b.disabled)return false;this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()};this.elementOffset=this.element.offset();c=this._normValueFromMouse({x:a.pageX,y:a.pageY});f=this._valueMax()-this._valueMin()+1;j=this;this.handles.each(function(k){var l=Math.abs(c-j.values(k));if(f>l){f=l;e=d(this);g=k}});if(b.range===true&&this.values(1)===b.min){g+=1;e=d(this.handles[g])}if(this._start(a,g)===false)return false; -this._mouseSliding=true;j._handleIndex=g;e.addClass("ui-state-active").focus();b=e.offset();this._clickOffset=!d(a.target).parents().andSelf().is(".ui-slider-handle")?{left:0,top:0}:{left:a.pageX-b.left-e.width()/2,top:a.pageY-b.top-e.height()/2-(parseInt(e.css("borderTopWidth"),10)||0)-(parseInt(e.css("borderBottomWidth"),10)||0)+(parseInt(e.css("marginTop"),10)||0)};this.handles.hasClass("ui-state-hover")||this._slide(a,g,c);return this._animateOff=true},_mouseStart:function(){return true},_mouseDrag:function(a){var b= -this._normValueFromMouse({x:a.pageX,y:a.pageY});this._slide(a,this._handleIndex,b);return false},_mouseStop:function(a){this.handles.removeClass("ui-state-active");this._mouseSliding=false;this._stop(a,this._handleIndex);this._change(a,this._handleIndex);this._clickOffset=this._handleIndex=null;return this._animateOff=false},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(a){var b;if(this.orientation==="horizontal"){b= -this.elementSize.width;a=a.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)}else{b=this.elementSize.height;a=a.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)}b=a/b;if(b>1)b=1;if(b<0)b=0;if(this.orientation==="vertical")b=1-b;a=this._valueMax()-this._valueMin();return this._trimAlignValue(this._valueMin()+b*a)},_start:function(a,b){var c={handle:this.handles[b],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(b); -c.values=this.values()}return this._trigger("start",a,c)},_slide:function(a,b,c){var f;if(this.options.values&&this.options.values.length){f=this.values(b?0:1);if(this.options.values.length===2&&this.options.range===true&&(b===0&&c>f||b===1&&c1){this.options.values[a]=this._trimAlignValue(b);this._refreshValue();this._change(null,a)}else if(arguments.length)if(d.isArray(arguments[0])){c=this.options.values;f=arguments[0];for(e=0;e=this._valueMax())return this._valueMax();var b=this.options.step>0?this.options.step:1,c=(a-this._valueMin())%b;a=a-c;if(Math.abs(c)*2>=b)a+=c>0?b:-b;return parseFloat(a.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},_refreshValue:function(){var a= -this.options.range,b=this.options,c=this,f=!this._animateOff?b.animate:false,e,j={},g,k,l,i;if(this.options.values&&this.options.values.length)this.handles.each(function(h){e=(c.values(h)-c._valueMin())/(c._valueMax()-c._valueMin())*100;j[c.orientation==="horizontal"?"left":"bottom"]=e+"%";d(this).stop(1,1)[f?"animate":"css"](j,b.animate);if(c.options.range===true)if(c.orientation==="horizontal"){if(h===0)c.range.stop(1,1)[f?"animate":"css"]({left:e+"%"},b.animate);if(h===1)c.range[f?"animate":"css"]({width:e- -g+"%"},{queue:false,duration:b.animate})}else{if(h===0)c.range.stop(1,1)[f?"animate":"css"]({bottom:e+"%"},b.animate);if(h===1)c.range[f?"animate":"css"]({height:e-g+"%"},{queue:false,duration:b.animate})}g=e});else{k=this.value();l=this._valueMin();i=this._valueMax();e=i!==l?(k-l)/(i-l)*100:0;j[c.orientation==="horizontal"?"left":"bottom"]=e+"%";this.handle.stop(1,1)[f?"animate":"css"](j,b.animate);if(a==="min"&&this.orientation==="horizontal")this.range.stop(1,1)[f?"animate":"css"]({width:e+"%"}, -b.animate);if(a==="max"&&this.orientation==="horizontal")this.range[f?"animate":"css"]({width:100-e+"%"},{queue:false,duration:b.animate});if(a==="min"&&this.orientation==="vertical")this.range.stop(1,1)[f?"animate":"css"]({height:e+"%"},b.animate);if(a==="max"&&this.orientation==="vertical")this.range[f?"animate":"css"]({height:100-e+"%"},{queue:false,duration:b.animate})}}});d.extend(d.ui.slider,{version:"1.8.16"})})(jQuery); -;/* - * jQuery UI Tabs 1.8.16 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Tabs - * - * Depends: - * jquery.ui.core.js - * jquery.ui.widget.js - */ -(function(d,p){function u(){return++v}function w(){return++x}var v=0,x=0;d.widget("ui.tabs",{options:{add:null,ajaxOptions:null,cache:false,cookie:null,collapsible:false,disable:null,disabled:[],enable:null,event:"click",fx:null,idPrefix:"ui-tabs-",load:null,panelTemplate:"
    ",remove:null,select:null,show:null,spinner:"Loading…",tabTemplate:"
  • #{label}
  • "},_create:function(){this._tabify(true)},_setOption:function(b,e){if(b=="selected")this.options.collapsible&& -e==this.options.selected||this.select(e);else{this.options[b]=e;this._tabify()}},_tabId:function(b){return b.title&&b.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF-]/g,"")||this.options.idPrefix+u()},_sanitizeSelector:function(b){return b.replace(/:/g,"\\:")},_cookie:function(){var b=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+w());return d.cookie.apply(null,[b].concat(d.makeArray(arguments)))},_ui:function(b,e){return{tab:b,panel:e,index:this.anchors.index(b)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var b= -d(this);b.html(b.data("label.tabs")).removeData("label.tabs")})},_tabify:function(b){function e(g,f){g.css("display","");!d.support.opacity&&f.opacity&&g[0].style.removeAttribute("filter")}var a=this,c=this.options,h=/^#.+/;this.list=this.element.find("ol,ul").eq(0);this.lis=d(" > li:has(a[href])",this.list);this.anchors=this.lis.map(function(){return d("a",this)[0]});this.panels=d([]);this.anchors.each(function(g,f){var i=d(f).attr("href"),l=i.split("#")[0],q;if(l&&(l===location.toString().split("#")[0]|| -(q=d("base")[0])&&l===q.href)){i=f.hash;f.href=i}if(h.test(i))a.panels=a.panels.add(a.element.find(a._sanitizeSelector(i)));else if(i&&i!=="#"){d.data(f,"href.tabs",i);d.data(f,"load.tabs",i.replace(/#.*$/,""));i=a._tabId(f);f.href="#"+i;f=a.element.find("#"+i);if(!f.length){f=d(c.panelTemplate).attr("id",i).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(a.panels[g-1]||a.list);f.data("destroy.tabs",true)}a.panels=a.panels.add(f)}else c.disabled.push(g)});if(b){this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all"); -this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.lis.addClass("ui-state-default ui-corner-top");this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom");if(c.selected===p){location.hash&&this.anchors.each(function(g,f){if(f.hash==location.hash){c.selected=g;return false}});if(typeof c.selected!=="number"&&c.cookie)c.selected=parseInt(a._cookie(),10);if(typeof c.selected!=="number"&&this.lis.filter(".ui-tabs-selected").length)c.selected= -this.lis.index(this.lis.filter(".ui-tabs-selected"));c.selected=c.selected||(this.lis.length?0:-1)}else if(c.selected===null)c.selected=-1;c.selected=c.selected>=0&&this.anchors[c.selected]||c.selected<0?c.selected:0;c.disabled=d.unique(c.disabled.concat(d.map(this.lis.filter(".ui-state-disabled"),function(g){return a.lis.index(g)}))).sort();d.inArray(c.selected,c.disabled)!=-1&&c.disabled.splice(d.inArray(c.selected,c.disabled),1);this.panels.addClass("ui-tabs-hide");this.lis.removeClass("ui-tabs-selected ui-state-active"); -if(c.selected>=0&&this.anchors.length){a.element.find(a._sanitizeSelector(a.anchors[c.selected].hash)).removeClass("ui-tabs-hide");this.lis.eq(c.selected).addClass("ui-tabs-selected ui-state-active");a.element.queue("tabs",function(){a._trigger("show",null,a._ui(a.anchors[c.selected],a.element.find(a._sanitizeSelector(a.anchors[c.selected].hash))[0]))});this.load(c.selected)}d(window).bind("unload",function(){a.lis.add(a.anchors).unbind(".tabs");a.lis=a.anchors=a.panels=null})}else c.selected=this.lis.index(this.lis.filter(".ui-tabs-selected")); -this.element[c.collapsible?"addClass":"removeClass"]("ui-tabs-collapsible");c.cookie&&this._cookie(c.selected,c.cookie);b=0;for(var j;j=this.lis[b];b++)d(j)[d.inArray(b,c.disabled)!=-1&&!d(j).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled");c.cache===false&&this.anchors.removeData("cache.tabs");this.lis.add(this.anchors).unbind(".tabs");if(c.event!=="mouseover"){var k=function(g,f){f.is(":not(.ui-state-disabled)")&&f.addClass("ui-state-"+g)},n=function(g,f){f.removeClass("ui-state-"+ -g)};this.lis.bind("mouseover.tabs",function(){k("hover",d(this))});this.lis.bind("mouseout.tabs",function(){n("hover",d(this))});this.anchors.bind("focus.tabs",function(){k("focus",d(this).closest("li"))});this.anchors.bind("blur.tabs",function(){n("focus",d(this).closest("li"))})}var m,o;if(c.fx)if(d.isArray(c.fx)){m=c.fx[0];o=c.fx[1]}else m=o=c.fx;var r=o?function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.hide().removeClass("ui-tabs-hide").animate(o,o.duration||"normal", -function(){e(f,o);a._trigger("show",null,a._ui(g,f[0]))})}:function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.removeClass("ui-tabs-hide");a._trigger("show",null,a._ui(g,f[0]))},s=m?function(g,f){f.animate(m,m.duration||"normal",function(){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");e(f,m);a.element.dequeue("tabs")})}:function(g,f){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");a.element.dequeue("tabs")}; -this.anchors.bind(c.event+".tabs",function(){var g=this,f=d(g).closest("li"),i=a.panels.filter(":not(.ui-tabs-hide)"),l=a.element.find(a._sanitizeSelector(g.hash));if(f.hasClass("ui-tabs-selected")&&!c.collapsible||f.hasClass("ui-state-disabled")||f.hasClass("ui-state-processing")||a.panels.filter(":animated").length||a._trigger("select",null,a._ui(this,l[0]))===false){this.blur();return false}c.selected=a.anchors.index(this);a.abort();if(c.collapsible)if(f.hasClass("ui-tabs-selected")){c.selected= --1;c.cookie&&a._cookie(c.selected,c.cookie);a.element.queue("tabs",function(){s(g,i)}).dequeue("tabs");this.blur();return false}else if(!i.length){c.cookie&&a._cookie(c.selected,c.cookie);a.element.queue("tabs",function(){r(g,l)});a.load(a.anchors.index(this));this.blur();return false}c.cookie&&a._cookie(c.selected,c.cookie);if(l.length){i.length&&a.element.queue("tabs",function(){s(g,i)});a.element.queue("tabs",function(){r(g,l)});a.load(a.anchors.index(this))}else throw"jQuery UI Tabs: Mismatching fragment identifier."; -d.browser.msie&&this.blur()});this.anchors.bind("click.tabs",function(){return false})},_getIndex:function(b){if(typeof b=="string")b=this.anchors.index(this.anchors.filter("[href$="+b+"]"));return b},destroy:function(){var b=this.options;this.abort();this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs");this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.anchors.each(function(){var e= -d.data(this,"href.tabs");if(e)this.href=e;var a=d(this).unbind(".tabs");d.each(["href","load","cache"],function(c,h){a.removeData(h+".tabs")})});this.lis.unbind(".tabs").add(this.panels).each(function(){d.data(this,"destroy.tabs")?d(this).remove():d(this).removeClass("ui-state-default ui-corner-top ui-tabs-selected ui-state-active ui-state-hover ui-state-focus ui-state-disabled ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide")});b.cookie&&this._cookie(null,b.cookie);return this},add:function(b, -e,a){if(a===p)a=this.anchors.length;var c=this,h=this.options;e=d(h.tabTemplate.replace(/#\{href\}/g,b).replace(/#\{label\}/g,e));b=!b.indexOf("#")?b.replace("#",""):this._tabId(d("a",e)[0]);e.addClass("ui-state-default ui-corner-top").data("destroy.tabs",true);var j=c.element.find("#"+b);j.length||(j=d(h.panelTemplate).attr("id",b).data("destroy.tabs",true));j.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide");if(a>=this.lis.length){e.appendTo(this.list);j.appendTo(this.list[0].parentNode)}else{e.insertBefore(this.lis[a]); -j.insertBefore(this.panels[a])}h.disabled=d.map(h.disabled,function(k){return k>=a?++k:k});this._tabify();if(this.anchors.length==1){h.selected=0;e.addClass("ui-tabs-selected ui-state-active");j.removeClass("ui-tabs-hide");this.element.queue("tabs",function(){c._trigger("show",null,c._ui(c.anchors[0],c.panels[0]))});this.load(0)}this._trigger("add",null,this._ui(this.anchors[a],this.panels[a]));return this},remove:function(b){b=this._getIndex(b);var e=this.options,a=this.lis.eq(b).remove(),c=this.panels.eq(b).remove(); -if(a.hasClass("ui-tabs-selected")&&this.anchors.length>1)this.select(b+(b+1=b?--h:h});this._tabify();this._trigger("remove",null,this._ui(a.find("a")[0],c[0]));return this},enable:function(b){b=this._getIndex(b);var e=this.options;if(d.inArray(b,e.disabled)!=-1){this.lis.eq(b).removeClass("ui-state-disabled");e.disabled=d.grep(e.disabled,function(a){return a!=b});this._trigger("enable",null, -this._ui(this.anchors[b],this.panels[b]));return this}},disable:function(b){b=this._getIndex(b);var e=this.options;if(b!=e.selected){this.lis.eq(b).addClass("ui-state-disabled");e.disabled.push(b);e.disabled.sort();this._trigger("disable",null,this._ui(this.anchors[b],this.panels[b]))}return this},select:function(b){b=this._getIndex(b);if(b==-1)if(this.options.collapsible&&this.options.selected!=-1)b=this.options.selected;else return this;this.anchors.eq(b).trigger(this.options.event+".tabs");return this}, -load:function(b){b=this._getIndex(b);var e=this,a=this.options,c=this.anchors.eq(b)[0],h=d.data(c,"load.tabs");this.abort();if(!h||this.element.queue("tabs").length!==0&&d.data(c,"cache.tabs"))this.element.dequeue("tabs");else{this.lis.eq(b).addClass("ui-state-processing");if(a.spinner){var j=d("span",c);j.data("label.tabs",j.html()).html(a.spinner)}this.xhr=d.ajax(d.extend({},a.ajaxOptions,{url:h,success:function(k,n){e.element.find(e._sanitizeSelector(c.hash)).html(k);e._cleanup();a.cache&&d.data(c, -"cache.tabs",true);e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.success(k,n)}catch(m){}},error:function(k,n){e._cleanup();e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.error(k,n,b,c)}catch(m){}}}));e.element.dequeue("tabs");return this}},abort:function(){this.element.queue([]);this.panels.stop(false,true);this.element.queue("tabs",this.element.queue("tabs").splice(-2,2));if(this.xhr){this.xhr.abort();delete this.xhr}this._cleanup();return this}, -url:function(b,e){this.anchors.eq(b).removeData("cache.tabs").data("load.tabs",e);return this},length:function(){return this.anchors.length}});d.extend(d.ui.tabs,{version:"1.8.16"});d.extend(d.ui.tabs.prototype,{rotation:null,rotate:function(b,e){var a=this,c=this.options,h=a._rotate||(a._rotate=function(j){clearTimeout(a.rotation);a.rotation=setTimeout(function(){var k=c.selected;a.select(++k= 0 ? '&' : '?') + q; - options.data = null; // data is null for 'get' - } - else { - options.data = q; // data is the query string for 'post' - } - - var $form = this, callbacks = []; - if (options.resetForm) { - callbacks.push(function() { $form.resetForm(); }); - } - if (options.clearForm) { - callbacks.push(function() { $form.clearForm(); }); - } - - // perform a load on the target only if dataType is not provided - if (!options.dataType && options.target) { - var oldSuccess = options.success || function(){}; - callbacks.push(function(data) { - var fn = options.replaceTarget ? 'replaceWith' : 'html'; - $(options.target)[fn](data).each(oldSuccess, arguments); - }); - } - else if (options.success) { - callbacks.push(options.success); - } - - options.success = function(data, status, xhr) { // jQuery 1.4+ passes xhr as 3rd arg - var context = options.context || options; // jQuery 1.4+ supports scope context - for (var i=0, max=callbacks.length; i < max; i++) { - callbacks[i].apply(context, [data, status, xhr || $form, $form]); - } - }; - - // are there files to upload? - var fileInputs = $('input:file', this).length > 0; - var mp = 'multipart/form-data'; - var multipart = ($form.attr('enctype') == mp || $form.attr('encoding') == mp); - - // options.iframe allows user to force iframe mode - // 06-NOV-09: now defaulting to iframe mode if file input is detected - if (options.iframe !== false && (fileInputs || options.iframe || multipart)) { - // hack to fix Safari hang (thanks to Tim Molendijk for this) - // see: http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d - if (options.closeKeepAlive) { - $.get(options.closeKeepAlive, fileUpload); - } - else { - fileUpload(); - } - } - else { - $.ajax(options); - } - - // fire 'notify' event - this.trigger('form-submit-notify', [this, options]); - return this; - - - // private function for handling file uploads (hat tip to YAHOO!) - function fileUpload() { - var form = $form[0]; - - if ($(':input[name=submit],:input[id=submit]', form).length) { - // if there is an input with a name or id of 'submit' then we won't be - // able to invoke the submit fn on the form (at least not x-browser) - alert('Error: Form elements must not have name or id of "submit".'); - return; - } - - var s = $.extend(true, {}, $.ajaxSettings, options); - s.context = s.context || s; - var id = 'jqFormIO' + (new Date().getTime()), fn = '_'+id; - window[fn] = function() { - var f = $io.data('form-plugin-onload'); - if (f) { - f(); - window[fn] = undefined; - try { delete window[fn]; } catch(e){} - } - } - var $io = $('