aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorNicolas Lœuillet <nicolas@loeuillet.org>2014-04-03 14:42:03 +0200
committerNicolas Lœuillet <nicolas@loeuillet.org>2014-04-03 14:42:03 +0200
commit0d67b00d5d3b7ce1b76b639dcc65c415a5f13439 (patch)
tree7c4d113bb1c3d90ef53e08138a2850576395780f
parent99679d06884120c57f43b44e55e03595f1f87bed (diff)
parent7d2f1aa2793595aa6cdc58a58260184234cfa809 (diff)
downloadwallabag-0d67b00d5d3b7ce1b76b639dcc65c415a5f13439.tar.gz
wallabag-0d67b00d5d3b7ce1b76b639dcc65c415a5f13439.tar.zst
wallabag-0d67b00d5d3b7ce1b76b639dcc65c415a5f13439.zip
Merge pull request #595 from wallabag/dev1.6.11.6.0
wallabag 1.6.0
-rw-r--r--.gitignore3
-rwxr-xr-xTRANSLATION.md67
-rw-r--r--check_setup.php10
-rw-r--r--inc/3rdparty/Session.class.php40
-rw-r--r--inc/3rdparty/class.messages.php3
-rw-r--r--inc/3rdparty/libraries/feedwriter/FeedItem.php1
-rwxr-xr-x[-rw-r--r--]inc/3rdparty/libraries/feedwriter/FeedWriter.php168
-rwxr-xr-xinc/3rdparty/makefulltextfeed.php353
-rwxr-xr-xinc/3rdparty/makefulltextfeedHelpers.php355
-rwxr-xr-xinc/poche/Database.class.php117
-rwxr-xr-xinc/poche/Poche.class.php663
-rwxr-xr-x[-rw-r--r--]inc/poche/Tools.class.php81
-rwxr-xr-xinc/poche/config.inc.php.new14
-rw-r--r--inc/poche/global.inc.php2
-rwxr-xr-x[-rw-r--r--]index.php17
-rw-r--r--install/index.php73
-rw-r--r--locale/cs_CZ.utf8/LC_MESSAGES/cs_CZ.utf8.po496
-rw-r--r--locale/de_DE.utf8/LC_MESSAGES/de_DE.utf8.mobin4776 -> 10620 bytes
-rw-r--r--locale/de_DE.utf8/LC_MESSAGES/de_DE.utf8.po647
-rw-r--r--locale/en_EN.utf8/LC_MESSAGES/en_EN.utf8.mobin4481 -> 11884 bytes
-rw-r--r--locale/en_EN.utf8/LC_MESSAGES/en_EN.utf8.po488
-rw-r--r--locale/es_ES.utf8/LC_MESSAGES/es_ES.utf8.po495
-rw-r--r--locale/fa_IR.utf8/LC_MESSAGES/fa_IR.utf8.po491
-rw-r--r--locale/fr_FR.utf8/LC_MESSAGES/fr_FR.utf8.mobin4810 -> 12738 bytes
-rw-r--r--locale/fr_FR.utf8/LC_MESSAGES/fr_FR.utf8.po513
-rw-r--r--locale/it_IT.utf8/LC_MESSAGES/it_IT.utf8.po503
-rwxr-xr-xlocale/pl_PL.utf8/LC_MESSAGES/pl_PL.utf8.mobin10557 -> 11935 bytes
-rwxr-xr-xlocale/pl_PL.utf8/LC_MESSAGES/pl_PL.utf8.po486
-rw-r--r--locale/pt_BR.utf8/LC_MESSAGES/pt_BR.utf8.mobin0 -> 12451 bytes
-rw-r--r--locale/pt_BR.utf8/LC_MESSAGES/pt_BR.utf8.po549
-rwxr-xr-xlocale/ru_RU.utf8/LC_MESSAGES/ru_RU.utf8.mobin13000 -> 13552 bytes
-rwxr-xr-xlocale/ru_RU.utf8/LC_MESSAGES/ru_RU.utf8.po421
-rw-r--r--locale/sl_SI.utf8/LC_MESSAGES/sl_SI.utf8.po507
-rwxr-xr-xlocale/tools/fillCache.php59
-rwxr-xr-xlocale/uk_UA.utf8/LC_MESSAGES/uk_UA.utf8.mobin13258 -> 15670 bytes
-rwxr-xr-xlocale/uk_UA.utf8/LC_MESSAGES/uk_UA.utf8.po278
-rwxr-xr-xthemes/baggy/_display-mode.twig5
-rwxr-xr-x[-rw-r--r--]themes/baggy/_head.twig27
-rw-r--r--themes/baggy/_menu.twig8
-rwxr-xr-xthemes/baggy/_pocheit-form.twig10
-rw-r--r--themes/baggy/_search-form.twig21
-rwxr-xr-x[-rw-r--r--]themes/baggy/_top.twig2
-rwxr-xr-x[-rw-r--r--]themes/baggy/config.twig38
-rwxr-xr-xthemes/baggy/css/main.css233
-rwxr-xr-x[-rw-r--r--]themes/baggy/edit-tags.twig8
-rwxr-xr-x[-rw-r--r--]themes/baggy/home.twig16
-rwxr-xr-xthemes/baggy/img/baggy/blank.pngbin0 -> 141 bytes
-rw-r--r--themes/baggy/img/baggy/down.pngbin0 -> 216 bytes
-rwxr-xr-xthemes/baggy/img/baggy/list.pngbin0 -> 201 bytes
-rwxr-xr-xthemes/baggy/img/baggy/table.pngbin0 -> 229 bytes
-rw-r--r--themes/baggy/img/baggy/top.pngbin0 -> 212 bytes
-rwxr-xr-xthemes/baggy/img/logo-other_themes.pngbin0 -> 3922 bytes
-rw-r--r--themes/baggy/js/autoClose.js6
-rwxr-xr-xthemes/baggy/js/init.js56
-rw-r--r--themes/baggy/js/jquery-2.0.3.min.js1
-rwxr-xr-xthemes/baggy/js/jquery.cookie.js117
-rwxr-xr-x[-rw-r--r--]themes/baggy/layout.twig3
-rwxr-xr-x[-rw-r--r--]themes/baggy/tags.twig2
-rwxr-xr-x[-rw-r--r--]themes/baggy/view.twig21
-rwxr-xr-xthemes/courgette/_head.twig18
-rwxr-xr-xthemes/courgette/_top.twig2
-rwxr-xr-xthemes/courgette/_view.twig2
-rwxr-xr-xthemes/courgette/config.twig12
-rwxr-xr-xthemes/courgette/home.twig12
-rwxr-xr-x[-rw-r--r--]themes/courgette/tags.twig2
-rw-r--r--themes/default/_bookmarklet.twig2
-rwxr-xr-x[-rw-r--r--]themes/default/_head.twig25
-rwxr-xr-xthemes/default/_import.twig15
-rw-r--r--themes/default/_menu.twig4
-rwxr-xr-xthemes/default/_pocheit-form.twig26
-rw-r--r--themes/default/_search-form.twig23
-rwxr-xr-xthemes/default/_sorting.twig6
-rwxr-xr-x[-rw-r--r--]themes/default/_top.twig2
-rwxr-xr-x[-rw-r--r--]themes/default/config.twig29
-rw-r--r--themes/default/css/images/animated-overlay.gifbin0 -> 1738 bytes
-rw-r--r--themes/default/css/images/ui-bg_flat_0_aaaaaa_40x100.pngbin0 -> 212 bytes
-rw-r--r--themes/default/css/images/ui-bg_flat_75_ffffff_40x100.pngbin0 -> 208 bytes
-rw-r--r--themes/default/css/images/ui-bg_glass_55_fbf9ee_1x400.pngbin0 -> 335 bytes
-rw-r--r--themes/default/css/images/ui-bg_glass_65_ffffff_1x400.pngbin0 -> 207 bytes
-rw-r--r--themes/default/css/images/ui-bg_glass_75_dadada_1x400.pngbin0 -> 262 bytes
-rw-r--r--themes/default/css/images/ui-bg_glass_75_e6e6e6_1x400.pngbin0 -> 262 bytes
-rw-r--r--themes/default/css/images/ui-bg_glass_95_fef1ec_1x400.pngbin0 -> 332 bytes
-rw-r--r--themes/default/css/images/ui-bg_highlight-soft_75_cccccc_1x100.pngbin0 -> 280 bytes
-rw-r--r--themes/default/css/images/ui-icons_222222_256x240.pngbin0 -> 6922 bytes
-rw-r--r--themes/default/css/images/ui-icons_2e83ff_256x240.pngbin0 -> 4549 bytes
-rw-r--r--themes/default/css/images/ui-icons_454545_256x240.pngbin0 -> 6992 bytes
-rw-r--r--themes/default/css/images/ui-icons_888888_256x240.pngbin0 -> 6999 bytes
-rw-r--r--themes/default/css/images/ui-icons_cd0a0a_256x240.pngbin0 -> 4549 bytes
-rw-r--r--themes/default/css/jquery-ui-1.10.4.custom.css560
-rw-r--r--themes/default/css/jquery-ui-1.10.4.custom.min.css7
-rwxr-xr-x[-rw-r--r--]themes/default/css/style.css55
-rwxr-xr-x[-rw-r--r--]themes/default/edit-tags.twig10
-rwxr-xr-x[-rw-r--r--]themes/default/home.twig21
-rwxr-xr-xthemes/default/js/autoCompleteTags.js47
-rw-r--r--themes/default/js/jquery-ui-1.10.4.custom.js2519
-rw-r--r--themes/default/js/jquery-ui-1.10.4.custom.min.js6
-rwxr-xr-xthemes/default/js/saveLink.js101
-rwxr-xr-x[-rw-r--r--]themes/default/tags.twig12
-rwxr-xr-x[-rw-r--r--]themes/default/view.twig4
-rw-r--r--wallabag_compatibility_test.php154
100 files changed, 9895 insertions, 2255 deletions
diff --git a/.gitignore b/.gitignore
index 2abed7ed..aec2e3ef 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,4 +3,5 @@ cache/*
3vendor 3vendor
4composer.phar 4composer.phar
5db/poche.sqlite 5db/poche.sqlite
6inc/poche/config.inc.php \ No newline at end of file 6inc/poche/config.inc.php
7inc/3rdparty/htmlpurifier/HTMLPurifier/DefinitionCache/Serializer/ \ No newline at end of file
diff --git a/TRANSLATION.md b/TRANSLATION.md
new file mode 100755
index 00000000..2e38d5cc
--- /dev/null
+++ b/TRANSLATION.md
@@ -0,0 +1,67 @@
1# How to manage translations of wallabag
2
3This guide will describe procedure of translation management of wallabag web application.
4
5All translation are made using [gettext](http://en.wikipedia.org/wiki/Gettext) system and tools.
6
7You will need [Poedit](http://www.poedit.net/download.php) editor to update, edit and create your translation files comfortably. In general, you can handle translations also without it: all can be done using gettext tools and your favorite plain text editor only. This guide, however, describes editing with Poedit. If you want to use gettext only, pls refer to xgettext manual page to update po files from sources (see also how it is used by Poedit below) and use msgunfmt tool to compile .mo files manually.
8
9You need to know, that translation phrases are stored in **".po"** files (for example: `locale/pl_PL.utf8/LC_MESSAGES/pl_PL.utf8.po`), which are then complied in **".mo"** files using **msgfmt** gettext tool or by Poedit, which will run msgfmt for you in background.
10
11**It's assumed, that you have wallabag installed locally on your computer or on the server you have access to.**
12
13## To change existing translation you will need to do:
14
15### 1. Clear cache
16You can do this using **http://your-wallabag-host.com/?empty-cache** link (replace http://your-wallabag-host.com/ with real url of your wallabag application)
17
18OR
19
20from command line:
21go to root of your installation of wallabag project and run next command:
22
23`rm -rf ./cache/*`
24
25(this may require root privileges if you run, for example Apatche web server with mod_php)
26
27### 2. Generate php files from all twig templates
28Do this using next command:
29
30`php ./locale/tools/fillCache.php`
31
32OR
33
34from your browser: **http://your-wallabag-host.com/locale/tools/fillCache.php** (this may require removal of .htacces file in locale/ directory).
35
36### 3. Configure your Poedit
37Open Poedit editor, open Edit->Preferences. Go to "Parsers" tab, click on PHP and press "Edit" button. Make sure your "Parser command:" looks like
38
39`xgettext --no-location --force-po -o %o %C %K %F`
40
41Usualy it is required to add "--no-location" to default value.
42
43### 4. Open .po file you want to edit in Poedit and change it's settings
44Open, for example `locale/pl_PL.utf8/LC_MESSAGES/pl_PL.utf8.po` file in your Poedit.
45
46Go to "Catalog"->"Settings..." menu. Go to "Path" tab and add path to wallabag installaion in your local file system. This step can't be ommited as you will not be able to update phrases otherwise.
47
48You can also check "project into" tab to be sure, that "Language" is set correctly (this will allow you to spell check your translation).
49
50### 5. Update opened .po file from sources
51Once you have set your path correctly, you are able to update phrases from sources. Press "Update catalog - synchronize it with sources" button or go to "Catalog"->"Update from sources" menu.
52
53As a result you will see confirmation popup with two tabs: "New strings" and "Obsolete strings". Pls review and accept changes (or press "Undo" if you see too many obsolete strings, as Poedit will remove them all - in this case please make sure all previous steps are performed w/o errors).
54
55### 6. Translate and save your .po file
56If you have any dificulties on this step, please consult with Poedit manual.
57Every time you save your .po file, Poedit will also comple appropriate .mo file by default (of course, if not disabled in preferences).
58
59So, you are almost done.
60
61### 7. Clear cache again
62This step may be required if your web server runs php scripts in name of, say, www user (i.e. Apache with mod_php, not cgi).
63
64
65##To create new translation
66Please simple create appropriate directories in locale folder and perform all steps, described above. Instead of opening an existing file just create new one.
67
diff --git a/check_setup.php b/check_setup.php
index 96dd0f7d..2b84a744 100644
--- a/check_setup.php
+++ b/check_setup.php
@@ -13,16 +13,6 @@ if (version_compare(PHP_VERSION, '5.4.0', '<')) {
13 } 13 }
14} 14}
15 15
16// Check PDO Sqlite
17if (! extension_loaded('pdo_sqlite')) {
18 die('PHP extension required: pdo_sqlite');
19}
20
21// Check ZIP
22if (! extension_loaded('zip')) {
23 die('PHP extension required: zip');
24}
25
26// Check if /cache is writeable 16// Check if /cache is writeable
27if (! is_writable('cache')) { 17if (! is_writable('cache')) {
28 die('The directory "cache" must be writeable by your web server user'); 18 die('The directory "cache" must be writeable by your web server user');
diff --git a/inc/3rdparty/Session.class.php b/inc/3rdparty/Session.class.php
index b30a31f3..59dfbe67 100644
--- a/inc/3rdparty/Session.class.php
+++ b/inc/3rdparty/Session.class.php
@@ -31,9 +31,9 @@ class Session
31 public static $sessionName = ''; 31 public static $sessionName = '';
32 // If the user does not access any page within this time, 32 // If the user does not access any page within this time,
33 // his/her session is considered expired (3600 sec. = 1 hour) 33 // his/her session is considered expired (3600 sec. = 1 hour)
34 public static $inactivityTimeout = 86400; 34 public static $inactivityTimeout = 3600;
35 // Extra timeout for long sessions (if enabled) (82800 sec. = 23 hours) 35 // Extra timeout for long sessions (if enabled) (82800 sec. = 23 hours)
36 public static $longSessionTimeout = 31536000; 36 public static $longSessionTimeout = 7776000; // 7776000 = 90 days
37 // If you get disconnected often or if your IP address changes often. 37 // If you get disconnected often or if your IP address changes often.
38 // Let you disable session cookie hijacking protection 38 // Let you disable session cookie hijacking protection
39 public static $disableSessionProtection = false; 39 public static $disableSessionProtection = false;
@@ -48,8 +48,13 @@ class Session
48 /** 48 /**
49 * Initialize session 49 * Initialize session
50 */ 50 */
51 public static function init() 51 public static function init($longlastingsession = false)
52 { 52 {
53 //check if session name is correct
54 if ( (session_id() && !empty(self::$sessionName) && session_name()!=self::$sessionName) || $longlastingsession ) {
55 session_destroy();
56 }
57
53 // Force cookie path (but do not change lifetime) 58 // Force cookie path (but do not change lifetime)
54 $cookie = session_get_cookie_params(); 59 $cookie = session_get_cookie_params();
55 // Default cookie expiration and path. 60 // Default cookie expiration and path.
@@ -61,12 +66,22 @@ class Session
61 if (isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == "on") { 66 if (isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == "on") {
62 $ssl = true; 67 $ssl = true;
63 } 68 }
64 session_set_cookie_params($cookie['lifetime'], $cookiedir, $_SERVER['HTTP_HOST'], $ssl); 69
70 if ( $longlastingsession ) {
71 session_set_cookie_params(self::$longSessionTimeout, $cookiedir, null, $ssl, true);
72 }
73 else {
74 session_set_cookie_params(0, $cookiedir, null, $ssl, true);
75 }
76 //set server side valid session timeout
77 //WARNING! this may not work in shared session environment. See http://www.php.net/manual/en/session.configuration.php#ini.session.gc-maxlifetime about min value: it can be set in any application
78 ini_set('session.gc_maxlifetime', self::$longSessionTimeout);
79
65 // Use cookies to store session. 80 // Use cookies to store session.
66 ini_set('session.use_cookies', 1); 81 ini_set('session.use_cookies', 1);
67 // Force cookies for session (phpsessionID forbidden in URL) 82 // Force cookies for session (phpsessionID forbidden in URL)
68 ini_set('session.use_only_cookies', 1); 83 ini_set('session.use_only_cookies', 1);
69 if (!session_id()) { 84 if ( !session_id() ) {
70 // Prevent php to use sessionID in URL if cookies are disabled. 85 // Prevent php to use sessionID in URL if cookies are disabled.
71 ini_set('session.use_trans_sid', false); 86 ini_set('session.use_trans_sid', false);
72 if (!empty(self::$sessionName)) { 87 if (!empty(self::$sessionName)) {
@@ -115,6 +130,9 @@ class Session
115 if (self::banCanLogin()) { 130 if (self::banCanLogin()) {
116 if ($login === $loginTest && $password === $passwordTest) { 131 if ($login === $loginTest && $password === $passwordTest) {
117 self::banLoginOk(); 132 self::banLoginOk();
133
134 self::init($longlastingsession);
135
118 // Generate unique random number to sign forms (HMAC) 136 // Generate unique random number to sign forms (HMAC)
119 $_SESSION['uid'] = sha1(uniqid('', true).'_'.mt_rand()); 137 $_SESSION['uid'] = sha1(uniqid('', true).'_'.mt_rand());
120 $_SESSION['ip'] = self::_allIPs(); 138 $_SESSION['ip'] = self::_allIPs();
@@ -135,6 +153,7 @@ class Session
135 self::banLoginFailed(); 153 self::banLoginFailed();
136 } 154 }
137 155
156 self::init();
138 return false; 157 return false;
139 } 158 }
140 159
@@ -143,7 +162,14 @@ class Session
143 */ 162 */
144 public static function logout() 163 public static function logout()
145 { 164 {
146 unset($_SESSION['uid'],$_SESSION['ip'],$_SESSION['expires_on'],$_SESSION['tokens'], $_SESSION['login'], $_SESSION['pass'], $_SESSION['longlastingsession'], $_SESSION['poche_user']); 165 // unset($_SESSION['uid'],$_SESSION['ip'],$_SESSION['expires_on'],$_SESSION['tokens'], $_SESSION['login'], $_SESSION['pass'], $_SESSION['longlastingsession'], $_SESSION['poche_user']);
166
167 // Destruction du cookie (le code peut paraître complexe mais c'est pour être certain de reprendre les mêmes paramètres)
168 $args = array_merge(array(session_name(), ''), array_values(session_get_cookie_params()));
169 $args[2] = time() - 3600;
170 call_user_func_array('setcookie', $args);
171 // Suppression physique de la session
172 session_destroy();
147 } 173 }
148 174
149 /** 175 /**
@@ -157,7 +183,7 @@ class Session
157 || (self::$disableSessionProtection === false 183 || (self::$disableSessionProtection === false
158 && $_SESSION['ip'] !== self::_allIPs()) 184 && $_SESSION['ip'] !== self::_allIPs())
159 || time() >= $_SESSION['expires_on']) { 185 || time() >= $_SESSION['expires_on']) {
160 self::logout(); 186 //self::logout();
161 187
162 return false; 188 return false;
163 } 189 }
diff --git a/inc/3rdparty/class.messages.php b/inc/3rdparty/class.messages.php
index e60bd3a1..27c28f43 100644
--- a/inc/3rdparty/class.messages.php
+++ b/inc/3rdparty/class.messages.php
@@ -59,6 +59,7 @@ class Messages {
59 $this->msgId = md5(uniqid()); 59 $this->msgId = md5(uniqid());
60 60
61 // Create the session array if it doesnt already exist 61 // Create the session array if it doesnt already exist
62 settype($_SESSION, 'array');
62 if( !array_key_exists('flash_messages', $_SESSION) ) $_SESSION['flash_messages'] = array(); 63 if( !array_key_exists('flash_messages', $_SESSION) ) $_SESSION['flash_messages'] = array();
63 64
64 } 65 }
@@ -228,4 +229,4 @@ class Messages {
228 229
229 230
230} // end class 231} // end class
231?> \ No newline at end of file 232?>
diff --git a/inc/3rdparty/libraries/feedwriter/FeedItem.php b/inc/3rdparty/libraries/feedwriter/FeedItem.php
index 9373deeb..0eae5e08 100644
--- a/inc/3rdparty/libraries/feedwriter/FeedItem.php
+++ b/inc/3rdparty/libraries/feedwriter/FeedItem.php
@@ -156,6 +156,7 @@
156 if($this->version == RSS2 || $this->version == RSS1) 156 if($this->version == RSS2 || $this->version == RSS1)
157 { 157 {
158 $this->setElement('link', $link); 158 $this->setElement('link', $link);
159 $this->setElement('guid', $link);
159 } 160 }
160 else 161 else
161 { 162 {
diff --git a/inc/3rdparty/libraries/feedwriter/FeedWriter.php b/inc/3rdparty/libraries/feedwriter/FeedWriter.php
index adb2526c..5d16e765 100644..100755
--- a/inc/3rdparty/libraries/feedwriter/FeedWriter.php
+++ b/inc/3rdparty/libraries/feedwriter/FeedWriter.php
@@ -9,9 +9,9 @@ define('JSONP', 3, true);
9 * Genarate RSS2 or JSON (original: RSS 1.0, RSS2.0 and ATOM Feed) 9 * Genarate RSS2 or JSON (original: RSS 1.0, RSS2.0 and ATOM Feed)
10 * 10 *
11 * Modified for FiveFilters.org's Full-Text RSS project 11 * Modified for FiveFilters.org's Full-Text RSS project
12 * to allow for inclusion of hubs, JSON output. 12 * to allow for inclusion of hubs, JSON output.
13 * Stripped RSS1 and ATOM support. 13 * Stripped RSS1 and ATOM support.
14 * 14 *
15 * @package UnivarselFeedWriter 15 * @package UnivarselFeedWriter
16 * @author Anis uddin Ahmad <anisniit@gmail.com> 16 * @author Anis uddin Ahmad <anisniit@gmail.com>
17 * @link http://www.ajaxray.com/projects/rss 17 * @link http://www.ajaxray.com/projects/rss
@@ -26,32 +26,32 @@ define('JSONP', 3, true);
26 private $CDATAEncoding = array(); // The tag names which have to encoded as CDATA 26 private $CDATAEncoding = array(); // The tag names which have to encoded as CDATA
27 private $xsl = null; // stylesheet to render RSS (used by Chrome) 27 private $xsl = null; // stylesheet to render RSS (used by Chrome)
28 private $json = null; // JSON object 28 private $json = null; // JSON object
29 29
30 private $version = null; 30 private $version = null;
31 31
32 /** 32 /**
33 * Constructor 33 * Constructor
34 * 34 *
35 * @param constant the version constant (RSS2 or JSON). 35 * @param constant the version constant (RSS2 or JSON).
36 */ 36 */
37 function __construct($version = RSS2) 37 function __construct($version = RSS2)
38 { 38 {
39 $this->version = $version; 39 $this->version = $version;
40 40
41 // Setting default value for assential channel elements 41 // Setting default value for assential channel elements
42 $this->channels['title'] = $version . ' Feed'; 42 $this->channels['title'] = $version . ' Feed';
43 $this->channels['link'] = 'http://www.ajaxray.com/blog'; 43 $this->channels['link'] = 'http://www.ajaxray.com/blog';
44 44
45 //Tag names to encode in CDATA 45 //Tag names to encode in CDATA
46 $this->CDATAEncoding = array('description', 'content:encoded', 'content', 'subtitle', 'summary'); 46 $this->CDATAEncoding = array('description', 'content:encoded', 'content', 'subtitle', 'summary');
47 } 47 }
48 48
49 public function setFormat($format) { 49 public function setFormat($format) {
50 $this->version = $format; 50 $this->version = $format;
51 } 51 }
52 52
53 // Start # public functions --------------------------------------------- 53 // Start # public functions ---------------------------------------------
54 54
55 /** 55 /**
56 * Set a channel element 56 * Set a channel element
57 * @access public 57 * @access public
@@ -63,11 +63,11 @@ define('JSONP', 3, true);
63 { 63 {
64 $this->channels[$elementName] = $content ; 64 $this->channels[$elementName] = $content ;
65 } 65 }
66 66
67 /** 67 /**
68 * Set multiple channel elements from an array. Array elements 68 * Set multiple channel elements from an array. Array elements
69 * should be 'channelName' => 'channelContent' format. 69 * should be 'channelName' => 'channelContent' format.
70 * 70 *
71 * @access public 71 * @access public
72 * @param array array of channels 72 * @param array array of channels
73 * @return void 73 * @return void
@@ -75,30 +75,30 @@ define('JSONP', 3, true);
75 public function setChannelElementsFromArray($elementArray) 75 public function setChannelElementsFromArray($elementArray)
76 { 76 {
77 if(! is_array($elementArray)) return; 77 if(! is_array($elementArray)) return;
78 foreach ($elementArray as $elementName => $content) 78 foreach ($elementArray as $elementName => $content)
79 { 79 {
80 $this->setChannelElement($elementName, $content); 80 $this->setChannelElement($elementName, $content);
81 } 81 }
82 } 82 }
83 83
84 /** 84 /**
85 * Genarate the actual RSS/JSON file 85 * Genarate the actual RSS/JSON file
86 * 86 *
87 * @access public 87 * @access public
88 * @return void 88 * @return void
89 */ 89 */
90 public function genarateFeed() 90 public function genarateFeed()
91 { 91 {
92 if ($this->version == RSS2) { 92 if ($this->version == RSS2) {
93 header('Content-type: text/xml; charset=UTF-8'); 93// header('Content-type: text/xml; charset=UTF-8');
94 // this line prevents Chrome 20 from prompting download 94 // this line prevents Chrome 20 from prompting download
95 // used by Google: https://news.google.com/news/feeds?ned=us&topic=b&output=rss 95 // used by Google: https://news.google.com/news/feeds?ned=us&topic=b&output=rss
96 header('X-content-type-options: nosniff'); 96// header('X-content-type-options: nosniff');
97 } elseif ($this->version == JSON) { 97 } elseif ($this->version == JSON) {
98 header('Content-type: application/json; charset=UTF-8'); 98// header('Content-type: application/json; charset=UTF-8');
99 $this->json = new stdClass(); 99 $this->json = new stdClass();
100 } elseif ($this->version == JSONP) { 100 } elseif ($this->version == JSONP) {
101 header('Content-type: application/javascript; charset=UTF-8'); 101// header('Content-type: application/javascript; charset=UTF-8');
102 $this->json = new stdClass(); 102 $this->json = new stdClass();
103 } 103 }
104 $this->printHead(); 104 $this->printHead();
@@ -109,10 +109,10 @@ define('JSONP', 3, true);
109 echo json_encode($this->json); 109 echo json_encode($this->json);
110 } 110 }
111 } 111 }
112 112
113 /** 113 /**
114 * Create a new FeedItem. 114 * Create a new FeedItem.
115 * 115 *
116 * @access public 116 * @access public
117 * @return object instance of FeedItem class 117 * @return object instance of FeedItem class
118 */ 118 */
@@ -121,24 +121,24 @@ define('JSONP', 3, true);
121 $Item = new FeedItem($this->version); 121 $Item = new FeedItem($this->version);
122 return $Item; 122 return $Item;
123 } 123 }
124 124
125 /** 125 /**
126 * Add a FeedItem to the main class 126 * Add a FeedItem to the main class
127 * 127 *
128 * @access public 128 * @access public
129 * @param object instance of FeedItem class 129 * @param object instance of FeedItem class
130 * @return void 130 * @return void
131 */ 131 */
132 public function addItem($feedItem) 132 public function addItem($feedItem)
133 { 133 {
134 $this->items[] = $feedItem; 134 $this->items[] = $feedItem;
135 } 135 }
136 136
137 // Wrapper functions ------------------------------------------------------------------- 137 // Wrapper functions -------------------------------------------------------------------
138 138
139 /** 139 /**
140 * Set the 'title' channel element 140 * Set the 'title' channel element
141 * 141 *
142 * @access public 142 * @access public
143 * @param srting value of 'title' channel tag 143 * @param srting value of 'title' channel tag
144 * @return void 144 * @return void
@@ -147,59 +147,59 @@ define('JSONP', 3, true);
147 { 147 {
148 $this->setChannelElement('title', $title); 148 $this->setChannelElement('title', $title);
149 } 149 }
150 150
151 /** 151 /**
152 * Add a hub to the channel element 152 * Add a hub to the channel element
153 * 153 *
154 * @access public 154 * @access public
155 * @param string URL 155 * @param string URL
156 * @return void 156 * @return void
157 */ 157 */
158 public function addHub($hub) 158 public function addHub($hub)
159 { 159 {
160 $this->hubs[] = $hub; 160 $this->hubs[] = $hub;
161 } 161 }
162 162
163 /** 163 /**
164 * Set XSL URL 164 * Set XSL URL
165 * 165 *
166 * @access public 166 * @access public
167 * @param string URL 167 * @param string URL
168 * @return void 168 * @return void
169 */ 169 */
170 public function setXsl($xsl) 170 public function setXsl($xsl)
171 { 171 {
172 $this->xsl = $xsl; 172 $this->xsl = $xsl;
173 } 173 }
174 174
175 /** 175 /**
176 * Set self URL 176 * Set self URL
177 * 177 *
178 * @access public 178 * @access public
179 * @param string URL 179 * @param string URL
180 * @return void 180 * @return void
181 */ 181 */
182 public function setSelf($self) 182 public function setSelf($self)
183 { 183 {
184 $this->self = $self; 184 $this->self = $self;
185 } 185 }
186 186
187 /** 187 /**
188 * Set the 'description' channel element 188 * Set the 'description' channel element
189 * 189 *
190 * @access public 190 * @access public
191 * @param srting value of 'description' channel tag 191 * @param srting value of 'description' channel tag
192 * @return void 192 * @return void
193 */ 193 */
194 public function setDescription($desciption) 194 public function setDescription($desciption)
195 { 195 {
196 $tag = ($this->version == ATOM)? 'subtitle' : 'description'; 196 $tag = ($this->version == ATOM)? 'subtitle' : 'description';
197 $this->setChannelElement($tag, $desciption); 197 $this->setChannelElement($tag, $desciption);
198 } 198 }
199 199
200 /** 200 /**
201 * Set the 'link' channel element 201 * Set the 'link' channel element
202 * 202 *
203 * @access public 203 * @access public
204 * @param srting value of 'link' channel tag 204 * @param srting value of 'link' channel tag
205 * @return void 205 * @return void
@@ -208,10 +208,10 @@ define('JSONP', 3, true);
208 { 208 {
209 $this->setChannelElement('link', $link); 209 $this->setChannelElement('link', $link);
210 } 210 }
211 211
212 /** 212 /**
213 * Set the 'image' channel element 213 * Set the 'image' channel element
214 * 214 *
215 * @access public 215 * @access public
216 * @param srting title of image 216 * @param srting title of image
217 * @param srting link url of the imahe 217 * @param srting link url of the imahe
@@ -222,14 +222,14 @@ define('JSONP', 3, true);
222 { 222 {
223 $this->setChannelElement('image', array('title'=>$title, 'link'=>$link, 'url'=>$url)); 223 $this->setChannelElement('image', array('title'=>$title, 'link'=>$link, 'url'=>$url));
224 } 224 }
225 225
226 // End # public functions ---------------------------------------------- 226 // End # public functions ----------------------------------------------
227 227
228 // Start # private functions ---------------------------------------------- 228 // Start # private functions ----------------------------------------------
229 229
230 /** 230 /**
231 * Prints the xml and rss namespace 231 * Prints the xml and rss namespace
232 * 232 *
233 * @access private 233 * @access private
234 * @return void 234 * @return void
235 */ 235 */
@@ -247,10 +247,10 @@ define('JSONP', 3, true);
247 $this->json->rss = array('@attributes' => array('version' => '2.0')); 247 $this->json->rss = array('@attributes' => array('version' => '2.0'));
248 } 248 }
249 } 249 }
250 250
251 /** 251 /**
252 * Closes the open tags at the end of file 252 * Closes the open tags at the end of file
253 * 253 *
254 * @access private 254 * @access private
255 * @return void 255 * @return void
256 */ 256 */
@@ -258,14 +258,14 @@ define('JSONP', 3, true);
258 { 258 {
259 if ($this->version == RSS2) 259 if ($this->version == RSS2)
260 { 260 {
261 echo '</channel>',PHP_EOL,'</rss>'; 261 echo '</channel>',PHP_EOL,'</rss>';
262 } 262 }
263 // do nothing for JSON 263 // do nothing for JSON
264 } 264 }
265 265
266 /** 266 /**
267 * Creates a single node as xml format 267 * Creates a single node as xml format
268 * 268 *
269 * @access private 269 * @access private
270 * @param string name of the tag 270 * @param string name of the tag
271 * @param mixed tag value as string or array of nested tags in 'tagName' => 'tagValue' format 271 * @param mixed tag value as string or array of nested tags in 'tagName' => 'tagValue' format
@@ -273,22 +273,22 @@ define('JSONP', 3, true);
273 * @return string formatted xml tag 273 * @return string formatted xml tag
274 */ 274 */
275 private function makeNode($tagName, $tagContent, $attributes = null) 275 private function makeNode($tagName, $tagContent, $attributes = null)
276 { 276 {
277 if ($this->version == RSS2) 277 if ($this->version == RSS2)
278 { 278 {
279 $nodeText = ''; 279 $nodeText = '';
280 $attrText = ''; 280 $attrText = '';
281 if (is_array($attributes)) 281 if (is_array($attributes))
282 { 282 {
283 foreach ($attributes as $key => $value) 283 foreach ($attributes as $key => $value)
284 { 284 {
285 $attrText .= " $key=\"$value\" "; 285 $attrText .= " $key=\"$value\" ";
286 } 286 }
287 } 287 }
288 $nodeText .= "<{$tagName}{$attrText}>"; 288 $nodeText .= "<{$tagName}{$attrText}>";
289 if (is_array($tagContent)) 289 if (is_array($tagContent))
290 { 290 {
291 foreach ($tagContent as $key => $value) 291 foreach ($tagContent as $key => $value)
292 { 292 {
293 $nodeText .= $this->makeNode($key, $value); 293 $nodeText .= $this->makeNode($key, $value);
294 } 294 }
@@ -297,7 +297,7 @@ define('JSONP', 3, true);
297 { 297 {
298 //$nodeText .= (in_array($tagName, $this->CDATAEncoding))? $tagContent : htmlentities($tagContent); 298 //$nodeText .= (in_array($tagName, $this->CDATAEncoding))? $tagContent : htmlentities($tagContent);
299 $nodeText .= htmlspecialchars($tagContent); 299 $nodeText .= htmlspecialchars($tagContent);
300 } 300 }
301 //$nodeText .= (in_array($tagName, $this->CDATAEncoding))? "]]></$tagName>" : "</$tagName>"; 301 //$nodeText .= (in_array($tagName, $this->CDATAEncoding))? "]]></$tagName>" : "</$tagName>";
302 $nodeText .= "</$tagName>"; 302 $nodeText .= "</$tagName>";
303 return $nodeText . PHP_EOL; 303 return $nodeText . PHP_EOL;
@@ -321,7 +321,7 @@ define('JSONP', 3, true);
321 } 321 }
322 return ''; // should not get here 322 return ''; // should not get here
323 } 323 }
324 324
325 private function json_keys(array $array) { 325 private function json_keys(array $array) {
326 $new = array(); 326 $new = array();
327 foreach ($array as $key => $val) { 327 foreach ($array as $key => $val) {
@@ -334,7 +334,7 @@ define('JSONP', 3, true);
334 } 334 }
335 return $new; 335 return $new;
336 } 336 }
337 337
338 /** 338 /**
339 * @desc Print channels 339 * @desc Print channels
340 * @access private 340 * @access private
@@ -344,7 +344,7 @@ define('JSONP', 3, true);
344 { 344 {
345 //Start channel tag 345 //Start channel tag
346 if ($this->version == RSS2) { 346 if ($this->version == RSS2) {
347 echo '<channel>' . PHP_EOL; 347 echo '<channel>' . PHP_EOL;
348 // add hubs 348 // add hubs
349 foreach ($this->hubs as $hub) { 349 foreach ($this->hubs as $hub) {
350 //echo $this->makeNode('link', '', array('rel'=>'hub', 'href'=>$hub, 'xmlns'=>'http://www.w3.org/2005/Atom')); 350 //echo $this->makeNode('link', '', array('rel'=>'hub', 'href'=>$hub, 'xmlns'=>'http://www.w3.org/2005/Atom'));
@@ -356,7 +356,7 @@ define('JSONP', 3, true);
356 echo '<link rel="self" href="'.htmlspecialchars($this->self).'" xmlns="http://www.w3.org/2005/Atom" />' . PHP_EOL; 356 echo '<link rel="self" href="'.htmlspecialchars($this->self).'" xmlns="http://www.w3.org/2005/Atom" />' . PHP_EOL;
357 } 357 }
358 //Print Items of channel 358 //Print Items of channel
359 foreach ($this->channels as $key => $value) 359 foreach ($this->channels as $key => $value)
360 { 360 {
361 echo $this->makeNode($key, $value); 361 echo $this->makeNode($key, $value);
362 } 362 }
@@ -364,26 +364,26 @@ define('JSONP', 3, true);
364 $this->json->rss['channel'] = (object)$this->json_keys($this->channels); 364 $this->json->rss['channel'] = (object)$this->json_keys($this->channels);
365 } 365 }
366 } 366 }
367 367
368 /** 368 /**
369 * Prints formatted feed items 369 * Prints formatted feed items
370 * 370 *
371 * @access private 371 * @access private
372 * @return void 372 * @return void
373 */ 373 */
374 private function printItems() 374 private function printItems()
375 { 375 {
376 foreach ($this->items as $item) { 376 foreach ($this->items as $item) {
377 $itemElements = $item->getElements(); 377 $itemElements = $item->getElements();
378 378
379 echo $this->startItem(); 379 echo $this->startItem();
380 380
381 if ($this->version == JSON || $this->version == JSONP) { 381 if ($this->version == JSON || $this->version == JSONP) {
382 $json_item = array(); 382 $json_item = array();
383 } 383 }
384 384
385 foreach ($itemElements as $thisElement) { 385 foreach ($itemElements as $thisElement) {
386 foreach ($thisElement as $instance) { 386 foreach ($thisElement as $instance) {
387 if ($this->version == RSS2) { 387 if ($this->version == RSS2) {
388 echo $this->makeNode($instance['name'], $instance['content'], $instance['attributes']); 388 echo $this->makeNode($instance['name'], $instance['content'], $instance['attributes']);
389 } elseif ($this->version == JSON || $this->version == JSONP) { 389 } elseif ($this->version == JSON || $this->version == JSONP) {
@@ -406,10 +406,10 @@ define('JSONP', 3, true);
406 } 406 }
407 } 407 }
408 } 408 }
409 409
410 /** 410 /**
411 * Make the starting tag of channels 411 * Make the starting tag of channels
412 * 412 *
413 * @access private 413 * @access private
414 * @return void 414 * @return void
415 */ 415 */
@@ -417,14 +417,14 @@ define('JSONP', 3, true);
417 { 417 {
418 if ($this->version == RSS2) 418 if ($this->version == RSS2)
419 { 419 {
420 echo '<item>' . PHP_EOL; 420 echo '<item>' . PHP_EOL;
421 } 421 }
422 // nothing for JSON 422 // nothing for JSON
423 } 423 }
424 424
425 /** 425 /**
426 * Closes feed item tag 426 * Closes feed item tag
427 * 427 *
428 * @access private 428 * @access private
429 * @return void 429 * @return void
430 */ 430 */
@@ -432,10 +432,10 @@ define('JSONP', 3, true);
432 { 432 {
433 if ($this->version == RSS2) 433 if ($this->version == RSS2)
434 { 434 {
435 echo '</item>' . PHP_EOL; 435 echo '</item>' . PHP_EOL;
436 } 436 }
437 // nothing for JSON 437 // nothing for JSON
438 } 438 }
439 439
440 // End # private functions ---------------------------------------------- 440 // End # private functions ----------------------------------------------
441 } \ No newline at end of file 441 } \ No newline at end of file
diff --git a/inc/3rdparty/makefulltextfeed.php b/inc/3rdparty/makefulltextfeed.php
index 2852c4c2..135964f1 100755
--- a/inc/3rdparty/makefulltextfeed.php
+++ b/inc/3rdparty/makefulltextfeed.php
@@ -55,42 +55,8 @@ if (get_magic_quotes_gpc()) {
55 55
56// set include path 56// set include path
57set_include_path(realpath(dirname(__FILE__).'/libraries').PATH_SEPARATOR.get_include_path()); 57set_include_path(realpath(dirname(__FILE__).'/libraries').PATH_SEPARATOR.get_include_path());
58// Autoloading of classes allows us to include files only when they're 58
59// needed. If we've got a cached copy, for example, only Zend_Cache is loaded. 59require_once dirname(__FILE__).'/makefulltextfeedHelpers.php';
60function autoload($class_name) {
61 static $dir = null;
62 if ($dir === null) $dir = dirname(__FILE__).'/libraries/';
63 static $mapping = array(
64 // Include FeedCreator for RSS/Atom creation
65 'FeedWriter' => 'feedwriter/FeedWriter.php',
66 'FeedItem' => 'feedwriter/FeedItem.php',
67 // Include ContentExtractor and Readability for identifying and extracting content from URLs
68 'ContentExtractor' => 'content-extractor/ContentExtractor.php',
69 'SiteConfig' => 'content-extractor/SiteConfig.php',
70 'Readability' => 'readability/Readability.php',
71 // Include Humble HTTP Agent to allow parallel requests and response caching
72 'HumbleHttpAgent' => 'humble-http-agent/HumbleHttpAgent.php',
73 'SimplePie_HumbleHttpAgent' => 'humble-http-agent/SimplePie_HumbleHttpAgent.php',
74 'CookieJar' => 'humble-http-agent/CookieJar.php',
75 // Include Zend Cache to improve performance (cache results)
76 'Zend_Cache' => 'Zend/Cache.php',
77 // Language detect
78 'Text_LanguageDetect' => 'language-detect/LanguageDetect.php',
79 // HTML5 Lib
80 'HTML5_Parser' => 'html5/Parser.php',
81 // htmLawed - used if XSS filter is enabled (xss_filter)
82 'htmLawed' => 'htmLawed/htmLawed.php'
83 );
84 if (isset($mapping[$class_name])) {
85 debug("** Loading class $class_name ({$mapping[$class_name]})");
86 require $dir.$mapping[$class_name];
87 return true;
88 } else {
89 return false;
90 }
91}
92spl_autoload_register('autoload');
93require dirname(__FILE__).'/libraries/simplepie/autoloader.php';
94 60
95//////////////////////////////// 61////////////////////////////////
96// Load config file 62// Load config file
@@ -415,6 +381,7 @@ if (!$debug_mode) {
415////////////////////////////////// 381//////////////////////////////////
416// Set up HTTP agent 382// Set up HTTP agent
417////////////////////////////////// 383//////////////////////////////////
384global $http;
418$http = new HumbleHttpAgent(); 385$http = new HumbleHttpAgent();
419$http->debug = $debug_mode; 386$http->debug = $debug_mode;
420$http->userAgentMap = $options->user_agents; 387$http->userAgentMap = $options->user_agents;
@@ -478,29 +445,6 @@ if ($html_only || !$result) {
478 $isDummyFeed = true; 445 $isDummyFeed = true;
479 unset($feed, $result); 446 unset($feed, $result);
480 // create single item dummy feed object 447 // create single item dummy feed object
481 class DummySingleItemFeed {
482 public $item;
483 function __construct($url) { $this->item = new DummySingleItem($url); }
484 public function get_title() { return ''; }
485 public function get_description() { return 'Content extracted from '.$this->item->url; }
486 public function get_link() { return $this->item->url; }
487 public function get_language() { return false; }
488 public function get_image_url() { return false; }
489 public function get_items($start=0, $max=1) { return array(0=>$this->item); }
490 }
491 class DummySingleItem {
492 public $url;
493 function __construct($url) { $this->url = $url; }
494 public function get_permalink() { return $this->url; }
495 public function get_title() { return null; }
496 public function get_date($format='') { return false; }
497 public function get_author($key=0) { return null; }
498 public function get_authors() { return null; }
499 public function get_description() { return ''; }
500 public function get_enclosure($key=0, $prefer=null) { return null; }
501 public function get_enclosures() { return null; }
502 public function get_categories() { return null; }
503 }
504 $feed = new DummySingleItemFeed($url); 448 $feed = new DummySingleItemFeed($url);
505} 449}
506 450
@@ -903,294 +847,3 @@ if (!$debug_mode) {
903 if ($callback) echo ');'; 847 if ($callback) echo ');';
904} 848}
905 849
906///////////////////////////////
907// HELPER FUNCTIONS
908///////////////////////////////
909
910function url_allowed($url) {
911 global $options;
912 if (!empty($options->allowed_urls)) {
913 $allowed = false;
914 foreach ($options->allowed_urls as $allowurl) {
915 if (stristr($url, $allowurl) !== false) {
916 $allowed = true;
917 break;
918 }
919 }
920 if (!$allowed) return false;
921 } else {
922 foreach ($options->blocked_urls as $blockurl) {
923 if (stristr($url, $blockurl) !== false) {
924 return false;
925 }
926 }
927 }
928 return true;
929}
930
931//////////////////////////////////////////////
932// Convert $html to UTF8
933// (uses HTTP headers and HTML to find encoding)
934// adapted from http://stackoverflow.com/questions/910793/php-detect-encoding-and-make-everything-utf-8
935//////////////////////////////////////////////
936function convert_to_utf8($html, $header=null)
937{
938 $encoding = null;
939 if ($html || $header) {
940 if (is_array($header)) $header = implode("\n", $header);
941 if (!$header || !preg_match_all('/^Content-Type:\s+([^;]+)(?:;\s*charset=["\']?([^;"\'\n]*))?/im', $header, $match, PREG_SET_ORDER)) {
942 // error parsing the response
943 debug('Could not find Content-Type header in HTTP response');
944 } else {
945 $match = end($match); // get last matched element (in case of redirects)
946 if (isset($match[2])) $encoding = trim($match[2], "\"' \r\n\0\x0B\t");
947 }
948 // TODO: check to see if encoding is supported (can we convert it?)
949 // If it's not, result will be empty string.
950 // For now we'll check for invalid encoding types returned by some sites, e.g. 'none'
951 // Problem URL: http://facta.co.jp/blog/archives/20111026001026.html
952 if (!$encoding || $encoding == 'none') {
953 // search for encoding in HTML - only look at the first 50000 characters
954 // Why 50000? See, for example, http://www.lemonde.fr/festival-de-cannes/article/2012/05/23/deux-cretes-en-goguette-sur-la-croisette_1705732_766360.html
955 // TODO: improve this so it looks at smaller chunks first
956 $html_head = substr($html, 0, 50000);
957 if (preg_match('/^<\?xml\s+version=(?:"[^"]*"|\'[^\']*\')\s+encoding=("[^"]*"|\'[^\']*\')/s', $html_head, $match)) {
958 $encoding = trim($match[1], '"\'');
959 } elseif (preg_match('/<meta\s+http-equiv=["\']?Content-Type["\']? content=["\'][^;]+;\s*charset=["\']?([^;"\'>]+)/i', $html_head, $match)) {
960 $encoding = trim($match[1]);
961 } elseif (preg_match_all('/<meta\s+([^>]+)>/i', $html_head, $match)) {
962 foreach ($match[1] as $_test) {
963 if (preg_match('/charset=["\']?([^"\']+)/i', $_test, $_m)) {
964 $encoding = trim($_m[1]);
965 break;
966 }
967 }
968 }
969 }
970 if (isset($encoding)) $encoding = trim($encoding);
971 // trim is important here!
972 if (!$encoding || (strtolower($encoding) == 'iso-8859-1')) {
973 // replace MS Word smart qutoes
974 $trans = array();
975 $trans[chr(130)] = '&sbquo;'; // Single Low-9 Quotation Mark
976 $trans[chr(131)] = '&fnof;'; // Latin Small Letter F With Hook
977 $trans[chr(132)] = '&bdquo;'; // Double Low-9 Quotation Mark
978 $trans[chr(133)] = '&hellip;'; // Horizontal Ellipsis
979 $trans[chr(134)] = '&dagger;'; // Dagger
980 $trans[chr(135)] = '&Dagger;'; // Double Dagger
981 $trans[chr(136)] = '&circ;'; // Modifier Letter Circumflex Accent
982 $trans[chr(137)] = '&permil;'; // Per Mille Sign
983 $trans[chr(138)] = '&Scaron;'; // Latin Capital Letter S With Caron
984 $trans[chr(139)] = '&lsaquo;'; // Single Left-Pointing Angle Quotation Mark
985 $trans[chr(140)] = '&OElig;'; // Latin Capital Ligature OE
986 $trans[chr(145)] = '&lsquo;'; // Left Single Quotation Mark
987 $trans[chr(146)] = '&rsquo;'; // Right Single Quotation Mark
988 $trans[chr(147)] = '&ldquo;'; // Left Double Quotation Mark
989 $trans[chr(148)] = '&rdquo;'; // Right Double Quotation Mark
990 $trans[chr(149)] = '&bull;'; // Bullet
991 $trans[chr(150)] = '&ndash;'; // En Dash
992 $trans[chr(151)] = '&mdash;'; // Em Dash
993 $trans[chr(152)] = '&tilde;'; // Small Tilde
994 $trans[chr(153)] = '&trade;'; // Trade Mark Sign
995 $trans[chr(154)] = '&scaron;'; // Latin Small Letter S With Caron
996 $trans[chr(155)] = '&rsaquo;'; // Single Right-Pointing Angle Quotation Mark
997 $trans[chr(156)] = '&oelig;'; // Latin Small Ligature OE
998 $trans[chr(159)] = '&Yuml;'; // Latin Capital Letter Y With Diaeresis
999 $html = strtr($html, $trans);
1000 }
1001 if (!$encoding) {
1002 debug('No character encoding found, so treating as UTF-8');
1003 $encoding = 'utf-8';
1004 } else {
1005 debug('Character encoding: '.$encoding);
1006 if (strtolower($encoding) != 'utf-8') {
1007 debug('Converting to UTF-8');
1008 $html = SimplePie_Misc::change_encoding($html, $encoding, 'utf-8');
1009 /*
1010 if (function_exists('iconv')) {
1011 // iconv appears to handle certain character encodings better than mb_convert_encoding
1012 $html = iconv($encoding, 'utf-8', $html);
1013 } else {
1014 $html = mb_convert_encoding($html, 'utf-8', $encoding);
1015 }
1016 */
1017 }
1018 }
1019 }
1020 return $html;
1021}
1022
1023function makeAbsolute($base, $elem) {
1024 $base = new SimplePie_IRI($base);
1025 // remove '//' in URL path (used to prevent URLs from resolving properly)
1026 // TODO: check if this is still the case
1027 if (isset($base->path)) $base->path = preg_replace('!//+!', '/', $base->path);
1028 foreach(array('a'=>'href', 'img'=>'src') as $tag => $attr) {
1029 $elems = $elem->getElementsByTagName($tag);
1030 for ($i = $elems->length-1; $i >= 0; $i--) {
1031 $e = $elems->item($i);
1032 //$e->parentNode->replaceChild($articleContent->ownerDocument->createTextNode($e->textContent), $e);
1033 makeAbsoluteAttr($base, $e, $attr);
1034 }
1035 if (strtolower($elem->tagName) == $tag) makeAbsoluteAttr($base, $elem, $attr);
1036 }
1037}
1038function makeAbsoluteAttr($base, $e, $attr) {
1039 if ($e->hasAttribute($attr)) {
1040 // Trim leading and trailing white space. I don't really like this but
1041 // unfortunately it does appear on some sites. e.g. <img src=" /path/to/image.jpg" />
1042 $url = trim(str_replace('%20', ' ', $e->getAttribute($attr)));
1043 $url = str_replace(' ', '%20', $url);
1044 if (!preg_match('!https?://!i', $url)) {
1045 if ($absolute = SimplePie_IRI::absolutize($base, $url)) {
1046 $e->setAttribute($attr, $absolute);
1047 }
1048 }
1049 }
1050}
1051function makeAbsoluteStr($base, $url) {
1052 $base = new SimplePie_IRI($base);
1053 // remove '//' in URL path (causes URLs not to resolve properly)
1054 if (isset($base->path)) $base->path = preg_replace('!//+!', '/', $base->path);
1055 if (preg_match('!^https?://!i', $url)) {
1056 // already absolute
1057 return $url;
1058 } else {
1059 if ($absolute = SimplePie_IRI::absolutize($base, $url)) {
1060 return $absolute;
1061 }
1062 return false;
1063 }
1064}
1065// returns single page response, or false if not found
1066function getSinglePage($item, $html, $url) {
1067 global $http, $extractor;
1068 debug('Looking for site config files to see if single page link exists');
1069 $site_config = $extractor->buildSiteConfig($url, $html);
1070 $splink = null;
1071 if (!empty($site_config->single_page_link)) {
1072 $splink = $site_config->single_page_link;
1073 } elseif (!empty($site_config->single_page_link_in_feed)) {
1074 // single page link xpath is targeted at feed
1075 $splink = $site_config->single_page_link_in_feed;
1076 // so let's replace HTML with feed item description
1077 $html = $item->get_description();
1078 }
1079 if (isset($splink)) {
1080 // Build DOM tree from HTML
1081 $readability = new Readability($html, $url);
1082 $xpath = new DOMXPath($readability->dom);
1083 // Loop through single_page_link xpath expressions
1084 $single_page_url = null;
1085 foreach ($splink as $pattern) {
1086 $elems = @$xpath->evaluate($pattern, $readability->dom);
1087 if (is_string($elems)) {
1088 $single_page_url = trim($elems);
1089 break;
1090 } elseif ($elems instanceof DOMNodeList && $elems->length > 0) {
1091 foreach ($elems as $item) {
1092 if ($item instanceof DOMElement && $item->hasAttribute('href')) {
1093 $single_page_url = $item->getAttribute('href');
1094 break 2;
1095 } elseif ($item instanceof DOMAttr && $item->value) {
1096 $single_page_url = $item->value;
1097 break 2;
1098 }
1099 }
1100 }
1101 }
1102 // If we've got URL, resolve against $url
1103 if (isset($single_page_url) && ($single_page_url = makeAbsoluteStr($url, $single_page_url))) {
1104 // check it's not what we have already!
1105 if ($single_page_url != $url) {
1106 // it's not, so let's try to fetch it...
1107 $_prev_ref = $http->referer;
1108 $http->referer = $single_page_url;
1109 if (($response = $http->get($single_page_url, true)) && $response['status_code'] < 300) {
1110 $http->referer = $_prev_ref;
1111 return $response;
1112 }
1113 $http->referer = $_prev_ref;
1114 }
1115 }
1116 }
1117 return false;
1118}
1119
1120// based on content-type http header, decide what to do
1121// param: HTTP headers string
1122// return: array with keys: 'mime', 'type', 'subtype', 'action', 'name'
1123// e.g. array('mime'=>'image/jpeg', 'type'=>'image', 'subtype'=>'jpeg', 'action'=>'link', 'name'=>'Image')
1124function get_mime_action_info($headers) {
1125 global $options;
1126 // check if action defined for returned Content-Type
1127 $info = array();
1128 if (preg_match('!^Content-Type:\s*(([-\w]+)/([-\w\+]+))!im', $headers, $match)) {
1129 // look for full mime type (e.g. image/jpeg) or just type (e.g. image)
1130 // match[1] = full mime type, e.g. image/jpeg
1131 // match[2] = first part, e.g. image
1132 // match[3] = last part, e.g. jpeg
1133 $info['mime'] = strtolower(trim($match[1]));
1134 $info['type'] = strtolower(trim($match[2]));
1135 $info['subtype'] = strtolower(trim($match[3]));
1136 foreach (array($info['mime'], $info['type']) as $_mime) {
1137 if (isset($options->content_type_exc[$_mime])) {
1138 $info['action'] = $options->content_type_exc[$_mime]['action'];
1139 $info['name'] = $options->content_type_exc[$_mime]['name'];
1140 break;
1141 }
1142 }
1143 }
1144 return $info;
1145}
1146
1147function remove_url_cruft($url) {
1148 // remove google analytics for the time being
1149 // regex adapted from http://navitronic.co.uk/2010/12/removing-google-analytics-cruft-from-urls/
1150 // https://gist.github.com/758177
1151 return preg_replace('/(\?|\&)utm_[a-z]+=[^\&]+/', '', $url);
1152}
1153
1154function make_substitutions($string) {
1155 if ($string == '') return $string;
1156 global $item, $effective_url;
1157 $string = str_replace('{url}', htmlspecialchars($item->get_permalink()), $string);
1158 $string = str_replace('{effective-url}', htmlspecialchars($effective_url), $string);
1159 return $string;
1160}
1161
1162function get_cache() {
1163 global $options, $valid_key;
1164 static $cache = null;
1165 if ($cache === null) {
1166 $frontendOptions = array(
1167 'lifetime' => 10*60, // cache lifetime of 10 minutes
1168 'automatic_serialization' => false,
1169 'write_control' => false,
1170 'automatic_cleaning_factor' => $options->cache_cleanup,
1171 'ignore_user_abort' => false
1172 );
1173 $backendOptions = array(
1174 'cache_dir' => ($valid_key) ? $options->cache_dir.'/rss-with-key/' : $options->cache_dir.'/rss/', // directory where to put the cache files
1175 'file_locking' => false,
1176 'read_control' => true,
1177 'read_control_type' => 'strlen',
1178 'hashed_directory_level' => $options->cache_directory_level,
1179 'hashed_directory_perm' => 0777,
1180 'cache_file_perm' => 0664,
1181 'file_name_prefix' => 'ff'
1182 );
1183 // getting a Zend_Cache_Core object
1184 $cache = Zend_Cache::factory('Core', 'File', $frontendOptions, $backendOptions);
1185 }
1186 return $cache;
1187}
1188
1189function debug($msg) {
1190 global $debug_mode;
1191 if ($debug_mode) {
1192 echo '* ',$msg,"\n";
1193 ob_flush();
1194 flush();
1195 }
1196} \ No newline at end of file
diff --git a/inc/3rdparty/makefulltextfeedHelpers.php b/inc/3rdparty/makefulltextfeedHelpers.php
new file mode 100755
index 00000000..1c11b8f6
--- /dev/null
+++ b/inc/3rdparty/makefulltextfeedHelpers.php
@@ -0,0 +1,355 @@
1<?php
2
3// Autoloading of classes allows us to include files only when they're
4// needed. If we've got a cached copy, for example, only Zend_Cache is loaded.
5function autoload($class_name) {
6 static $dir = null;
7 if ($dir === null) $dir = dirname(__FILE__).'/libraries/';
8 static $mapping = array(
9 // Include FeedCreator for RSS/Atom creation
10 'FeedWriter' => 'feedwriter/FeedWriter.php',
11 'FeedItem' => 'feedwriter/FeedItem.php',
12 // Include ContentExtractor and Readability for identifying and extracting content from URLs
13 'ContentExtractor' => 'content-extractor/ContentExtractor.php',
14 'SiteConfig' => 'content-extractor/SiteConfig.php',
15 'Readability' => 'readability/Readability.php',
16 // Include Humble HTTP Agent to allow parallel requests and response caching
17 'HumbleHttpAgent' => 'humble-http-agent/HumbleHttpAgent.php',
18 'SimplePie_HumbleHttpAgent' => 'humble-http-agent/SimplePie_HumbleHttpAgent.php',
19 'CookieJar' => 'humble-http-agent/CookieJar.php',
20 // Include Zend Cache to improve performance (cache results)
21 'Zend_Cache' => 'Zend/Cache.php',
22 // Language detect
23 'Text_LanguageDetect' => 'language-detect/LanguageDetect.php',
24 // HTML5 Lib
25 'HTML5_Parser' => 'html5/Parser.php',
26 // htmLawed - used if XSS filter is enabled (xss_filter)
27 'htmLawed' => 'htmLawed/htmLawed.php'
28 );
29 if (isset($mapping[$class_name])) {
30 debug("** Loading class $class_name ({$mapping[$class_name]})");
31 require $dir.$mapping[$class_name];
32 return true;
33 } else {
34 return false;
35 }
36}
37spl_autoload_register('autoload');
38require dirname(__FILE__).'/libraries/simplepie/autoloader.php';
39
40
41class DummySingleItemFeed {
42 public $item;
43 function __construct($url) { $this->item = new DummySingleItem($url); }
44 public function get_title() { return ''; }
45 public function get_description() { return 'Content extracted from '.$this->item->url; }
46 public function get_link() { return $this->item->url; }
47 public function get_language() { return false; }
48 public function get_image_url() { return false; }
49 public function get_items($start=0, $max=1) { return array(0=>$this->item); }
50}
51class DummySingleItem {
52 public $url;
53 function __construct($url) { $this->url = $url; }
54 public function get_permalink() { return $this->url; }
55 public function get_title() { return null; }
56 public function get_date($format='') { return false; }
57 public function get_author($key=0) { return null; }
58 public function get_authors() { return null; }
59 public function get_description() { return ''; }
60 public function get_enclosure($key=0, $prefer=null) { return null; }
61 public function get_enclosures() { return null; }
62 public function get_categories() { return null; }
63}
64
65///////////////////////////////
66// HELPER FUNCTIONS
67///////////////////////////////
68
69function url_allowed($url) {
70 global $options;
71 if (!empty($options->allowed_urls)) {
72 $allowed = false;
73 foreach ($options->allowed_urls as $allowurl) {
74 if (stristr($url, $allowurl) !== false) {
75 $allowed = true;
76 break;
77 }
78 }
79 if (!$allowed) return false;
80 } else {
81 foreach ($options->blocked_urls as $blockurl) {
82 if (stristr($url, $blockurl) !== false) {
83 return false;
84 }
85 }
86 }
87 return true;
88}
89
90//////////////////////////////////////////////
91// Convert $html to UTF8
92// (uses HTTP headers and HTML to find encoding)
93// adapted from http://stackoverflow.com/questions/910793/php-detect-encoding-and-make-everything-utf-8
94//////////////////////////////////////////////
95function convert_to_utf8($html, $header=null)
96{
97 $encoding = null;
98 if ($html || $header) {
99 if (is_array($header)) $header = implode("\n", $header);
100 if (!$header || !preg_match_all('/^Content-Type:\s+([^;]+)(?:;\s*charset=["\']?([^;"\'\n]*))?/im', $header, $match, PREG_SET_ORDER)) {
101 // error parsing the response
102 debug('Could not find Content-Type header in HTTP response');
103 } else {
104 $match = end($match); // get last matched element (in case of redirects)
105 if (isset($match[2])) $encoding = trim($match[2], "\"' \r\n\0\x0B\t");
106 }
107 // TODO: check to see if encoding is supported (can we convert it?)
108 // If it's not, result will be empty string.
109 // For now we'll check for invalid encoding types returned by some sites, e.g. 'none'
110 // Problem URL: http://facta.co.jp/blog/archives/20111026001026.html
111 if (!$encoding || $encoding == 'none') {
112 // search for encoding in HTML - only look at the first 50000 characters
113 // Why 50000? See, for example, http://www.lemonde.fr/festival-de-cannes/article/2012/05/23/deux-cretes-en-goguette-sur-la-croisette_1705732_766360.html
114 // TODO: improve this so it looks at smaller chunks first
115 $html_head = substr($html, 0, 50000);
116 if (preg_match('/^<\?xml\s+version=(?:"[^"]*"|\'[^\']*\')\s+encoding=("[^"]*"|\'[^\']*\')/s', $html_head, $match)) {
117 $encoding = trim($match[1], '"\'');
118 } elseif (preg_match('/<meta\s+http-equiv=["\']?Content-Type["\']? content=["\'][^;]+;\s*charset=["\']?([^;"\'>]+)/i', $html_head, $match)) {
119 $encoding = trim($match[1]);
120 } elseif (preg_match_all('/<meta\s+([^>]+)>/i', $html_head, $match)) {
121 foreach ($match[1] as $_test) {
122 if (preg_match('/charset=["\']?([^"\']+)/i', $_test, $_m)) {
123 $encoding = trim($_m[1]);
124 break;
125 }
126 }
127 }
128 }
129 if (isset($encoding)) $encoding = trim($encoding);
130 // trim is important here!
131 if (!$encoding || (strtolower($encoding) == 'iso-8859-1')) {
132 // replace MS Word smart qutoes
133 $trans = array();
134 $trans[chr(130)] = '&sbquo;'; // Single Low-9 Quotation Mark
135 $trans[chr(131)] = '&fnof;'; // Latin Small Letter F With Hook
136 $trans[chr(132)] = '&bdquo;'; // Double Low-9 Quotation Mark
137 $trans[chr(133)] = '&hellip;'; // Horizontal Ellipsis
138 $trans[chr(134)] = '&dagger;'; // Dagger
139 $trans[chr(135)] = '&Dagger;'; // Double Dagger
140 $trans[chr(136)] = '&circ;'; // Modifier Letter Circumflex Accent
141 $trans[chr(137)] = '&permil;'; // Per Mille Sign
142 $trans[chr(138)] = '&Scaron;'; // Latin Capital Letter S With Caron
143 $trans[chr(139)] = '&lsaquo;'; // Single Left-Pointing Angle Quotation Mark
144 $trans[chr(140)] = '&OElig;'; // Latin Capital Ligature OE
145 $trans[chr(145)] = '&lsquo;'; // Left Single Quotation Mark
146 $trans[chr(146)] = '&rsquo;'; // Right Single Quotation Mark
147 $trans[chr(147)] = '&ldquo;'; // Left Double Quotation Mark
148 $trans[chr(148)] = '&rdquo;'; // Right Double Quotation Mark
149 $trans[chr(149)] = '&bull;'; // Bullet
150 $trans[chr(150)] = '&ndash;'; // En Dash
151 $trans[chr(151)] = '&mdash;'; // Em Dash
152 $trans[chr(152)] = '&tilde;'; // Small Tilde
153 $trans[chr(153)] = '&trade;'; // Trade Mark Sign
154 $trans[chr(154)] = '&scaron;'; // Latin Small Letter S With Caron
155 $trans[chr(155)] = '&rsaquo;'; // Single Right-Pointing Angle Quotation Mark
156 $trans[chr(156)] = '&oelig;'; // Latin Small Ligature OE
157 $trans[chr(159)] = '&Yuml;'; // Latin Capital Letter Y With Diaeresis
158 $html = strtr($html, $trans);
159 }
160 if (!$encoding) {
161 debug('No character encoding found, so treating as UTF-8');
162 $encoding = 'utf-8';
163 } else {
164 debug('Character encoding: '.$encoding);
165 if (strtolower($encoding) != 'utf-8') {
166 debug('Converting to UTF-8');
167 $html = SimplePie_Misc::change_encoding($html, $encoding, 'utf-8');
168 /*
169 if (function_exists('iconv')) {
170 // iconv appears to handle certain character encodings better than mb_convert_encoding
171 $html = iconv($encoding, 'utf-8', $html);
172 } else {
173 $html = mb_convert_encoding($html, 'utf-8', $encoding);
174 }
175 */
176 }
177 }
178 }
179 return $html;
180}
181
182function makeAbsolute($base, $elem) {
183 $base = new SimplePie_IRI($base);
184 // remove '//' in URL path (used to prevent URLs from resolving properly)
185 // TODO: check if this is still the case
186 if (isset($base->path)) $base->path = preg_replace('!//+!', '/', $base->path);
187 foreach(array('a'=>'href', 'img'=>'src') as $tag => $attr) {
188 $elems = $elem->getElementsByTagName($tag);
189 for ($i = $elems->length-1; $i >= 0; $i--) {
190 $e = $elems->item($i);
191 //$e->parentNode->replaceChild($articleContent->ownerDocument->createTextNode($e->textContent), $e);
192 makeAbsoluteAttr($base, $e, $attr);
193 }
194 if (strtolower($elem->tagName) == $tag) makeAbsoluteAttr($base, $elem, $attr);
195 }
196}
197function makeAbsoluteAttr($base, $e, $attr) {
198 if ($e->hasAttribute($attr)) {
199 // Trim leading and trailing white space. I don't really like this but
200 // unfortunately it does appear on some sites. e.g. <img src=" /path/to/image.jpg" />
201 $url = trim(str_replace('%20', ' ', $e->getAttribute($attr)));
202 $url = str_replace(' ', '%20', $url);
203 if (!preg_match('!https?://!i', $url)) {
204 if ($absolute = SimplePie_IRI::absolutize($base, $url)) {
205 $e->setAttribute($attr, $absolute);
206 }
207 }
208 }
209}
210function makeAbsoluteStr($base, $url) {
211 $base = new SimplePie_IRI($base);
212 // remove '//' in URL path (causes URLs not to resolve properly)
213 if (isset($base->path)) $base->path = preg_replace('!//+!', '/', $base->path);
214 if (preg_match('!^https?://!i', $url)) {
215 // already absolute
216 return $url;
217 } else {
218 if ($absolute = SimplePie_IRI::absolutize($base, $url)) {
219 return $absolute;
220 }
221 return false;
222 }
223}
224// returns single page response, or false if not found
225function getSinglePage($item, $html, $url) {
226 global $http, $extractor;
227 debug('Looking for site config files to see if single page link exists');
228 $site_config = $extractor->buildSiteConfig($url, $html);
229 $splink = null;
230 if (!empty($site_config->single_page_link)) {
231 $splink = $site_config->single_page_link;
232 } elseif (!empty($site_config->single_page_link_in_feed)) {
233 // single page link xpath is targeted at feed
234 $splink = $site_config->single_page_link_in_feed;
235 // so let's replace HTML with feed item description
236 $html = $item->get_description();
237 }
238 if (isset($splink)) {
239 // Build DOM tree from HTML
240 $readability = new Readability($html, $url);
241 $xpath = new DOMXPath($readability->dom);
242 // Loop through single_page_link xpath expressions
243 $single_page_url = null;
244 foreach ($splink as $pattern) {
245 $elems = @$xpath->evaluate($pattern, $readability->dom);
246 if (is_string($elems)) {
247 $single_page_url = trim($elems);
248 break;
249 } elseif ($elems instanceof DOMNodeList && $elems->length > 0) {
250 foreach ($elems as $item) {
251 if ($item instanceof DOMElement && $item->hasAttribute('href')) {
252 $single_page_url = $item->getAttribute('href');
253 break 2;
254 } elseif ($item instanceof DOMAttr && $item->value) {
255 $single_page_url = $item->value;
256 break 2;
257 }
258 }
259 }
260 }
261 // If we've got URL, resolve against $url
262 if (isset($single_page_url) && ($single_page_url = makeAbsoluteStr($url, $single_page_url))) {
263 // check it's not what we have already!
264 if ($single_page_url != $url) {
265 // it's not, so let's try to fetch it...
266 $_prev_ref = $http->referer;
267 $http->referer = $single_page_url;
268 if (($response = $http->get($single_page_url, true)) && $response['status_code'] < 300) {
269 $http->referer = $_prev_ref;
270 return $response;
271 }
272 $http->referer = $_prev_ref;
273 }
274 }
275 }
276 return false;
277}
278
279// based on content-type http header, decide what to do
280// param: HTTP headers string
281// return: array with keys: 'mime', 'type', 'subtype', 'action', 'name'
282// e.g. array('mime'=>'image/jpeg', 'type'=>'image', 'subtype'=>'jpeg', 'action'=>'link', 'name'=>'Image')
283function get_mime_action_info($headers) {
284 global $options;
285 // check if action defined for returned Content-Type
286 $info = array();
287 if (preg_match('!^Content-Type:\s*(([-\w]+)/([-\w\+]+))!im', $headers, $match)) {
288 // look for full mime type (e.g. image/jpeg) or just type (e.g. image)
289 // match[1] = full mime type, e.g. image/jpeg
290 // match[2] = first part, e.g. image
291 // match[3] = last part, e.g. jpeg
292 $info['mime'] = strtolower(trim($match[1]));
293 $info['type'] = strtolower(trim($match[2]));
294 $info['subtype'] = strtolower(trim($match[3]));
295 foreach (array($info['mime'], $info['type']) as $_mime) {
296 if (isset($options->content_type_exc[$_mime])) {
297 $info['action'] = $options->content_type_exc[$_mime]['action'];
298 $info['name'] = $options->content_type_exc[$_mime]['name'];
299 break;
300 }
301 }
302 }
303 return $info;
304}
305
306function remove_url_cruft($url) {
307 // remove google analytics for the time being
308 // regex adapted from http://navitronic.co.uk/2010/12/removing-google-analytics-cruft-from-urls/
309 // https://gist.github.com/758177
310 return preg_replace('/(\?|\&)utm_[a-z]+=[^\&]+/', '', $url);
311}
312
313function make_substitutions($string) {
314 if ($string == '') return $string;
315 global $item, $effective_url;
316 $string = str_replace('{url}', htmlspecialchars($item->get_permalink()), $string);
317 $string = str_replace('{effective-url}', htmlspecialchars($effective_url), $string);
318 return $string;
319}
320
321function get_cache() {
322 global $options, $valid_key;
323 static $cache = null;
324 if ($cache === null) {
325 $frontendOptions = array(
326 'lifetime' => 10*60, // cache lifetime of 10 minutes
327 'automatic_serialization' => false,
328 'write_control' => false,
329 'automatic_cleaning_factor' => $options->cache_cleanup,
330 'ignore_user_abort' => false
331 );
332 $backendOptions = array(
333 'cache_dir' => ($valid_key) ? $options->cache_dir.'/rss-with-key/' : $options->cache_dir.'/rss/', // directory where to put the cache files
334 'file_locking' => false,
335 'read_control' => true,
336 'read_control_type' => 'strlen',
337 'hashed_directory_level' => $options->cache_directory_level,
338 'hashed_directory_perm' => 0777,
339 'cache_file_perm' => 0664,
340 'file_name_prefix' => 'ff'
341 );
342 // getting a Zend_Cache_Core object
343 $cache = Zend_Cache::factory('Core', 'File', $frontendOptions, $backendOptions);
344 }
345 return $cache;
346}
347
348function debug($msg) {
349 global $debug_mode;
350 if ($debug_mode) {
351 echo '* ',$msg,"\n";
352 ob_flush();
353 flush();
354 }
355}
diff --git a/inc/poche/Database.class.php b/inc/poche/Database.class.php
index c998fe14..6244df88 100755
--- a/inc/poche/Database.class.php
+++ b/inc/poche/Database.class.php
@@ -18,7 +18,7 @@ class Database {
18 'default' => 'ORDER BY entries.id' 18 'default' => 'ORDER BY entries.id'
19 ); 19 );
20 20
21 function __construct() 21 function __construct()
22 { 22 {
23 switch (STORAGE) { 23 switch (STORAGE) {
24 case 'sqlite': 24 case 'sqlite':
@@ -27,11 +27,11 @@ class Database {
27 break; 27 break;
28 case 'mysql': 28 case 'mysql':
29 $db_path = 'mysql:host=' . STORAGE_SERVER . ';dbname=' . STORAGE_DB; 29 $db_path = 'mysql:host=' . STORAGE_SERVER . ';dbname=' . STORAGE_DB;
30 $this->handle = new PDO($db_path, STORAGE_USER, STORAGE_PASSWORD); 30 $this->handle = new PDO($db_path, STORAGE_USER, STORAGE_PASSWORD);
31 break; 31 break;
32 case 'postgres': 32 case 'postgres':
33 $db_path = 'pgsql:host=' . STORAGE_SERVER . ';dbname=' . STORAGE_DB; 33 $db_path = 'pgsql:host=' . STORAGE_SERVER . ';dbname=' . STORAGE_DB;
34 $this->handle = new PDO($db_path, STORAGE_USER, STORAGE_PASSWORD); 34 $this->handle = new PDO($db_path, STORAGE_USER, STORAGE_PASSWORD);
35 break; 35 break;
36 } 36 }
37 37
@@ -51,7 +51,7 @@ class Database {
51 } 51 }
52 $hasAdmin = count($query->fetchAll()); 52 $hasAdmin = count($query->fetchAll());
53 53
54 if ($hasAdmin == 0) 54 if ($hasAdmin == 0)
55 return false; 55 return false;
56 56
57 return true; 57 return true;
@@ -140,7 +140,7 @@ class Database {
140 $sql = 'INSERT INTO users_config ( user_id, name, value ) VALUES (?, ?, ?)'; 140 $sql = 'INSERT INTO users_config ( user_id, name, value ) VALUES (?, ?, ?)';
141 $params = array($id_user, 'language', LANG); 141 $params = array($id_user, 'language', LANG);
142 $query = $this->executeQuery($sql, $params); 142 $query = $this->executeQuery($sql, $params);
143 143
144 $sql = 'INSERT INTO users_config ( user_id, name, value ) VALUES (?, ?, ?)'; 144 $sql = 'INSERT INTO users_config ( user_id, name, value ) VALUES (?, ?, ?)';
145 $params = array($id_user, 'theme', DEFAULT_THEME); 145 $params = array($id_user, 'theme', DEFAULT_THEME);
146 $query = $this->executeQuery($sql, $params); 146 $query = $this->executeQuery($sql, $params);
@@ -153,7 +153,7 @@ class Database {
153 $query = $this->executeQuery($sql, array($id)); 153 $query = $this->executeQuery($sql, array($id));
154 $result = $query->fetchAll(); 154 $result = $query->fetchAll();
155 $user_config = array(); 155 $user_config = array();
156 156
157 foreach ($result as $key => $value) { 157 foreach ($result as $key => $value) {
158 $user_config[$value['name']] = $value['value']; 158 $user_config[$value['name']] = $value['value'];
159 } 159 }
@@ -201,10 +201,10 @@ class Database {
201 $params_update = array($password, $userId); 201 $params_update = array($password, $userId);
202 $query = $this->executeQuery($sql_update, $params_update); 202 $query = $this->executeQuery($sql_update, $params_update);
203 } 203 }
204 204
205 public function updateUserConfig($userId, $key, $value) { 205 public function updateUserConfig($userId, $key, $value) {
206 $config = $this->getConfigUser($userId); 206 $config = $this->getConfigUser($userId);
207 207
208 if (! isset($config[$key])) { 208 if (! isset($config[$key])) {
209 $sql = "INSERT INTO users_config (value, user_id, name) VALUES (?, ?, ?)"; 209 $sql = "INSERT INTO users_config (value, user_id, name) VALUES (?, ?, ?)";
210 } 210 }
@@ -230,6 +230,36 @@ class Database {
230 } 230 }
231 } 231 }
232 232
233 public function updateContentAndTitle($id, $title, $body, $user_id) {
234 $sql_action = 'UPDATE entries SET content = ?, title = ? WHERE id=? AND user_id=?';
235 $params_action = array($body, $title, $id, $user_id);
236 $query = $this->executeQuery($sql_action, $params_action);
237
238 return $query;
239 }
240
241 public function retrieveUnfetchedEntries($user_id, $limit) {
242
243 $sql_limit = "LIMIT 0,".$limit;
244 if (STORAGE == 'postgres') {
245 $sql_limit = "LIMIT ".$limit." OFFSET 0";
246 }
247
248 $sql = "SELECT * FROM entries WHERE (content = '' OR content IS NULL) AND user_id=? ORDER BY id " . $sql_limit;
249 $query = $this->executeQuery($sql, array($user_id));
250 $entries = $query->fetchAll();
251
252 return $entries;
253 }
254
255 public function retrieveUnfetchedEntriesCount($user_id) {
256 $sql = "SELECT count(*) FROM entries WHERE (content = '' OR content IS NULL) AND user_id=?";
257 $query = $this->executeQuery($sql, array($user_id));
258 list($count) = $query->fetch();
259
260 return $count;
261 }
262
233 public function retrieveAll($user_id) { 263 public function retrieveAll($user_id) {
234 $sql = "SELECT * FROM entries WHERE user_id=? ORDER BY id"; 264 $sql = "SELECT * FROM entries WHERE user_id=? ORDER BY id";
235 $query = $this->executeQuery($sql, array($user_id)); 265 $query = $this->executeQuery($sql, array($user_id));
@@ -294,24 +324,24 @@ class Database {
294 return $entries; 324 return $entries;
295 } 325 }
296 326
297 public function getEntriesByViewCount($view, $user_id, $tag_id = 0) { 327 public function getEntriesByViewCount($view, $user_id, $tag_id = 0) {
298 switch ($view) { 328 switch ($view) {
299 case 'archive': 329 case 'archive':
300 $sql = "SELECT count(*) FROM entries WHERE user_id=? AND is_read=? "; 330 $sql = "SELECT count(*) FROM entries WHERE user_id=? AND is_read=? ";
301 $params = array($user_id, 1); 331 $params = array($user_id, 1);
302 break; 332 break;
303 case 'fav' : 333 case 'fav' :
304 $sql = "SELECT count(*) FROM entries WHERE user_id=? AND is_fav=? "; 334 $sql = "SELECT count(*) FROM entries WHERE user_id=? AND is_fav=? ";
305 $params = array($user_id, 1); 335 $params = array($user_id, 1);
306 break; 336 break;
307 case 'tag' : 337 case 'tag' :
308 $sql = "SELECT count(*) FROM entries 338 $sql = "SELECT count(*) FROM entries
309 LEFT JOIN tags_entries ON tags_entries.entry_id=entries.id 339 LEFT JOIN tags_entries ON tags_entries.entry_id=entries.id
310 WHERE entries.user_id=? AND tags_entries.tag_id = ? "; 340 WHERE entries.user_id=? AND tags_entries.tag_id = ? ";
311 $params = array($user_id, $tag_id); 341 $params = array($user_id, $tag_id);
312 break; 342 break;
313 default: 343 default:
314 $sql = "SELECT count(*) FROM entries WHERE user_id=? AND is_read=? "; 344 $sql = "SELECT count(*) FROM entries WHERE user_id=? AND is_read=? ";
315 $params = array($user_id, 0); 345 $params = array($user_id, 0);
316 break; 346 break;
317 } 347 }
@@ -319,7 +349,7 @@ class Database {
319 $query = $this->executeQuery($sql, $params); 349 $query = $this->executeQuery($sql, $params);
320 list($count) = $query->fetch(); 350 list($count) = $query->fetch();
321 351
322 return $count; 352 return $count;
323 } 353 }
324 354
325 public function updateContent($id, $content, $user_id) { 355 public function updateContent($id, $content, $user_id) {
@@ -329,11 +359,24 @@ class Database {
329 return $query; 359 return $query;
330 } 360 }
331 361
332 public function add($url, $title, $content, $user_id) { 362 /**
333 $sql_action = 'INSERT INTO entries ( url, title, content, user_id ) VALUES (?, ?, ?, ?)'; 363 *
334 $params_action = array($url, $title, $content, $user_id); 364 * @param string $url
335 $query = $this->executeQuery($sql_action, $params_action); 365 * @param string $title
336 return $query; 366 * @param string $content
367 * @param integer $user_id
368 * @return integer $id of inserted record
369 */
370 public function add($url, $title, $content, $user_id, $isFavorite=0, $isRead=0) {
371 $sql_action = 'INSERT INTO entries ( url, title, content, user_id, is_fav, is_read ) VALUES (?, ?, ?, ?, ?, ?)';
372 $params_action = array($url, $title, $content, $user_id, $isFavorite, $isRead);
373 if ( !$this->executeQuery($sql_action, $params_action) ) {
374 $id = null;
375 }
376 else {
377 $id = intval($this->getLastId( (STORAGE == 'postgres') ? 'users_id_seq' : '' ));
378 }
379 return $id;
337 } 380 }
338 381
339 public function deleteById($id, $user_id) { 382 public function deleteById($id, $user_id) {
@@ -364,13 +407,25 @@ class Database {
364 public function getLastId($column = '') { 407 public function getLastId($column = '') {
365 return $this->getHandle()->lastInsertId($column); 408 return $this->getHandle()->lastInsertId($column);
366 } 409 }
410
411 public function search($term, $user_id, $limit = '') {
412 $search = '%'.$term.'%';
413 $sql_action = "SELECT * FROM entries WHERE user_id=? AND (content LIKE ? OR title LIKE ? OR url LIKE ?) "; //searches in content, title and URL
414 $sql_action .= $this->getEntriesOrder().' ' . $limit;
415 $params_action = array($user_id, $search, $search, $search);
416 $query = $this->executeQuery($sql_action, $params_action);
417 return $query->fetchAll();
418 }
367 419
368 public function retrieveAllTags($user_id) { 420 public function retrieveAllTags($user_id, $term = null) {
369 $sql = "SELECT DISTINCT tags.* FROM tags 421 $sql = "SELECT DISTINCT tags.*, count(entries.id) AS entriescount FROM tags
370 LEFT JOIN tags_entries ON tags_entries.tag_id=tags.id 422 LEFT JOIN tags_entries ON tags_entries.tag_id=tags.id
371 LEFT JOIN entries ON tags_entries.entry_id=entries.id 423 LEFT JOIN entries ON tags_entries.entry_id=entries.id
372 WHERE entries.user_id=?"; 424 WHERE entries.user_id=?
373 $query = $this->executeQuery($sql, array($user_id)); 425 ". (($term) ? "AND lower(tags.value) LIKE ?" : '') ."
426 GROUP BY tags.id, tags.value
427 ORDER BY tags.value";
428 $query = $this->executeQuery($sql, (($term)? array($user_id, strtolower('%'.$term.'%')) : array($user_id) ));
374 $tags = $query->fetchAll(); 429 $tags = $query->fetchAll();
375 430
376 return $tags; 431 return $tags;
@@ -390,7 +445,7 @@ class Database {
390 } 445 }
391 446
392 public function retrieveEntriesByTag($tag_id, $user_id) { 447 public function retrieveEntriesByTag($tag_id, $user_id) {
393 $sql = 448 $sql =
394 "SELECT entries.* FROM entries 449 "SELECT entries.* FROM entries
395 LEFT JOIN tags_entries ON tags_entries.entry_id=entries.id 450 LEFT JOIN tags_entries ON tags_entries.entry_id=entries.id
396 WHERE tags_entries.tag_id = ? AND entries.user_id=?"; 451 WHERE tags_entries.tag_id = ? AND entries.user_id=?";
@@ -401,7 +456,7 @@ class Database {
401 } 456 }
402 457
403 public function retrieveTagsByEntry($entry_id) { 458 public function retrieveTagsByEntry($entry_id) {
404 $sql = 459 $sql =
405 "SELECT tags.* FROM tags 460 "SELECT tags.* FROM tags
406 LEFT JOIN tags_entries ON tags_entries.tag_id=tags.id 461 LEFT JOIN tags_entries ON tags_entries.tag_id=tags.id
407 WHERE tags_entries.entry_id = ?"; 462 WHERE tags_entries.entry_id = ?";
diff --git a/inc/poche/Poche.class.php b/inc/poche/Poche.class.php
index 34f2ff5a..a662f695 100755
--- a/inc/poche/Poche.class.php
+++ b/inc/poche/Poche.class.php
@@ -18,7 +18,7 @@ class Poche
18 public $tpl; 18 public $tpl;
19 public $messages; 19 public $messages;
20 public $pagination; 20 public $pagination;
21 21
22 private $currentTheme = ''; 22 private $currentTheme = '';
23 private $currentLanguage = ''; 23 private $currentLanguage = '';
24 private $notInstalledMessage = array(); 24 private $notInstalledMessage = array();
@@ -32,20 +32,21 @@ class Poche
32 'fr_FR.utf8' => 'Français', 32 'fr_FR.utf8' => 'Français',
33 'it_IT.utf8' => 'Italiano', 33 'it_IT.utf8' => 'Italiano',
34 'pl_PL.utf8' => 'Polski', 34 'pl_PL.utf8' => 'Polski',
35 'pt_BR.utf8' => 'Português (Brasil)',
35 'ru_RU.utf8' => 'Pусский', 36 'ru_RU.utf8' => 'Pусский',
36 'sl_SI.utf8' => 'Slovenščina', 37 'sl_SI.utf8' => 'Slovenščina',
37 'uk_UA.utf8' => 'Українськ��й', 38 'uk_UA.utf8' => 'Українськ�',
38 ); 39 );
39 public function __construct() 40 public function __construct()
40 { 41 {
41 if ($this->configFileIsAvailable()) { 42 if ($this->configFileIsAvailable()) {
42 $this->init(); 43 $this->init();
43 } 44 }
44 45
45 if ($this->themeIsInstalled()) { 46 if ($this->themeIsInstalled()) {
46 $this->initTpl(); 47 $this->initTpl();
47 } 48 }
48 49
49 if ($this->systemIsInstalled()) { 50 if ($this->systemIsInstalled()) {
50 $this->store = new Database(); 51 $this->store = new Database();
51 $this->messages = new Messages(); 52 $this->messages = new Messages();
@@ -56,12 +57,10 @@ class Poche
56 $this->store->checkTags(); 57 $this->store->checkTags();
57 } 58 }
58 } 59 }
59 60
60 private function init() 61 private function init()
61 { 62 {
62 Tools::initPhp(); 63 Tools::initPhp();
63 Session::$sessionName = 'poche';
64 Session::init();
65 64
66 if (isset($_SESSION['poche_user']) && $_SESSION['poche_user'] != array()) { 65 if (isset($_SESSION['poche_user']) && $_SESSION['poche_user'] != array()) {
67 $this->user = $_SESSION['poche_user']; 66 $this->user = $_SESSION['poche_user'];
@@ -75,28 +74,28 @@ class Poche
75 $language = $this->user->getConfigValue('language'); 74 $language = $this->user->getConfigValue('language');
76 putenv('LC_ALL=' . $language); 75 putenv('LC_ALL=' . $language);
77 setlocale(LC_ALL, $language); 76 setlocale(LC_ALL, $language);
78 bindtextdomain($language, LOCALE); 77 bindtextdomain($language, LOCALE);
79 textdomain($language); 78 textdomain($language);
80 79
81 # Pagination 80 # Pagination
82 $this->pagination = new Paginator($this->user->getConfigValue('pager'), 'p'); 81 $this->pagination = new Paginator($this->user->getConfigValue('pager'), 'p');
83 82
84 # Set up theme 83 # Set up theme
85 $themeDirectory = $this->user->getConfigValue('theme'); 84 $themeDirectory = $this->user->getConfigValue('theme');
86 85
87 if ($themeDirectory === false) { 86 if ($themeDirectory === false) {
88 $themeDirectory = DEFAULT_THEME; 87 $themeDirectory = DEFAULT_THEME;
89 } 88 }
90 89
91 $this->currentTheme = $themeDirectory; 90 $this->currentTheme = $themeDirectory;
92 91
93 # Set up language 92 # Set up language
94 $languageDirectory = $this->user->getConfigValue('language'); 93 $languageDirectory = $this->user->getConfigValue('language');
95 94
96 if ($languageDirectory === false) { 95 if ($languageDirectory === false) {
97 $languageDirectory = DEFAULT_THEME; 96 $languageDirectory = DEFAULT_THEME;
98 } 97 }
99 98
100 $this->currentLanguage = $languageDirectory; 99 $this->currentLanguage = $languageDirectory;
101 } 100 }
102 101
@@ -109,7 +108,7 @@ class Poche
109 108
110 return true; 109 return true;
111 } 110 }
112 111
113 public function themeIsInstalled() { 112 public function themeIsInstalled() {
114 $passTheme = TRUE; 113 $passTheme = TRUE;
115 # Twig is an absolute requirement for Poche to function. Abort immediately if the Composer installer hasn't been run yet 114 # Twig is an absolute requirement for Poche to function. Abort immediately if the Composer installer hasn't been run yet
@@ -124,27 +123,27 @@ class Poche
124 self::$canRenderTemplates = false; 123 self::$canRenderTemplates = false;
125 124
126 $passTheme = FALSE; 125 $passTheme = FALSE;
127 } 126 }
128 127
129 # Check if the selected theme and its requirements are present 128 # Check if the selected theme and its requirements are present
130 $theme = $this->getTheme(); 129 $theme = $this->getTheme();
131 130
132 if ($theme != '' && ! is_dir(THEME . '/' . $theme)) { 131 if ($theme != '' && ! is_dir(THEME . '/' . $theme)) {
133 $this->notInstalledMessage[] = 'The currently selected theme (' . $theme . ') does not seem to be properly installed (Missing directory: ' . THEME . '/' . $theme . ')'; 132 $this->notInstalledMessage[] = 'The currently selected theme (' . $theme . ') does not seem to be properly installed (Missing directory: ' . THEME . '/' . $theme . ')';
134 133
135 self::$canRenderTemplates = false; 134 self::$canRenderTemplates = false;
136 135
137 $passTheme = FALSE; 136 $passTheme = FALSE;
138 } 137 }
139 138
140 $themeInfo = $this->getThemeInfo($theme); 139 $themeInfo = $this->getThemeInfo($theme);
141 if (isset($themeInfo['requirements']) && is_array($themeInfo['requirements'])) { 140 if (isset($themeInfo['requirements']) && is_array($themeInfo['requirements'])) {
142 foreach ($themeInfo['requirements'] as $requiredTheme) { 141 foreach ($themeInfo['requirements'] as $requiredTheme) {
143 if (! is_dir(THEME . '/' . $requiredTheme)) { 142 if (! is_dir(THEME . '/' . $requiredTheme)) {
144 $this->notInstalledMessage[] = 'The required "' . $requiredTheme . '" theme is missing for the current theme (' . $theme . ')'; 143 $this->notInstalledMessage[] = 'The required "' . $requiredTheme . '" theme is missing for the current theme (' . $theme . ')';
145 144
146 self::$canRenderTemplates = false; 145 self::$canRenderTemplates = false;
147 146
148 $passTheme = FALSE; 147 $passTheme = FALSE;
149 } 148 }
150 } 149 }
@@ -154,21 +153,21 @@ class Poche
154 return FALSE; 153 return FALSE;
155 } 154 }
156 155
157 156
158 return true; 157 return true;
159 } 158 }
160 159
161 /** 160 /**
162 * all checks before installation. 161 * all checks before installation.
163 * @todo move HTML to template 162 * @todo move HTML to template
164 * @return boolean 163 * @return boolean
165 */ 164 */
166 public function systemIsInstalled() 165 public function systemIsInstalled()
167 { 166 {
168 $msg = TRUE; 167 $msg = TRUE;
169 168
170 $configSalt = defined('SALT') ? constant('SALT') : ''; 169 $configSalt = defined('SALT') ? constant('SALT') : '';
171 170
172 if (empty($configSalt)) { 171 if (empty($configSalt)) {
173 $this->notInstalledMessage[] = 'You have not yet filled in the SALT value in the config.inc.php file.'; 172 $this->notInstalledMessage[] = 'You have not yet filled in the SALT value in the config.inc.php file.';
174 $msg = FALSE; 173 $msg = FALSE;
@@ -194,7 +193,7 @@ class Poche
194 193
195 return true; 194 return true;
196 } 195 }
197 196
198 public function getNotInstalledMessage() { 197 public function getNotInstalledMessage() {
199 return $this->notInstalledMessage; 198 return $this->notInstalledMessage;
200 } 199 }
@@ -203,7 +202,7 @@ class Poche
203 { 202 {
204 $loaderChain = new Twig_Loader_Chain(); 203 $loaderChain = new Twig_Loader_Chain();
205 $theme = $this->getTheme(); 204 $theme = $this->getTheme();
206 205
207 # add the current theme as first to the loader chain so Twig will look there first for overridden template files 206 # add the current theme as first to the loader chain so Twig will look there first for overridden template files
208 try { 207 try {
209 $loaderChain->addLoader(new Twig_Loader_Filesystem(THEME . '/' . $theme)); 208 $loaderChain->addLoader(new Twig_Loader_Filesystem(THEME . '/' . $theme));
@@ -211,7 +210,7 @@ class Poche
211 # @todo isInstalled() should catch this, inject Twig later 210 # @todo isInstalled() should catch this, inject Twig later
212 die('The currently selected theme (' . $theme . ') does not seem to be properly installed (' . THEME . '/' . $theme .' is missing)'); 211 die('The currently selected theme (' . $theme . ') does not seem to be properly installed (' . THEME . '/' . $theme .' is missing)');
213 } 212 }
214 213
215 # add all required themes to the loader chain 214 # add all required themes to the loader chain
216 $themeInfo = $this->getThemeInfo($theme); 215 $themeInfo = $this->getThemeInfo($theme);
217 if (isset($themeInfo['requirements']) && is_array($themeInfo['requirements'])) { 216 if (isset($themeInfo['requirements']) && is_array($themeInfo['requirements'])) {
@@ -224,16 +223,16 @@ class Poche
224 } 223 }
225 } 224 }
226 } 225 }
227 226
228 if (DEBUG_POCHE) { 227 if (DEBUG_POCHE) {
229 $twigParams = array(); 228 $twigParams = array();
230 } else { 229 } else {
231 $twigParams = array('cache' => CACHE); 230 $twigParams = array('cache' => CACHE);
232 } 231 }
233 232
234 $this->tpl = new Twig_Environment($loaderChain, $twigParams); 233 $this->tpl = new Twig_Environment($loaderChain, $twigParams);
235 $this->tpl->addExtension(new Twig_Extensions_Extension_I18n()); 234 $this->tpl->addExtension(new Twig_Extensions_Extension_I18n());
236 235
237 # filter to display domain name of an url 236 # filter to display domain name of an url
238 $filter = new Twig_SimpleFilter('getDomain', 'Tools::getDomain'); 237 $filter = new Twig_SimpleFilter('getDomain', 'Tools::getDomain');
239 $this->tpl->addFilter($filter); 238 $this->tpl->addFilter($filter);
@@ -252,7 +251,7 @@ class Poche
252 'poche_url' => Tools::getPocheUrl() 251 'poche_url' => Tools::getPocheUrl()
253 )); 252 ));
254 if (isset($_GET['install'])) { 253 if (isset($_GET['install'])) {
255 if (($_POST['password'] == $_POST['password_repeat']) 254 if (($_POST['password'] == $_POST['password_repeat'])
256 && $_POST['password'] != "" && $_POST['login'] != "") { 255 && $_POST['password'] != "" && $_POST['login'] != "") {
257 # let's rock, install poche baby ! 256 # let's rock, install poche baby !
258 if ($this->store->install($_POST['login'], Tools::encodeString($_POST['password'] . $_POST['login']))) 257 if ($this->store->install($_POST['login'], Tools::encodeString($_POST['password'] . $_POST['login'])))
@@ -269,7 +268,7 @@ class Poche
269 } 268 }
270 exit(); 269 exit();
271 } 270 }
272 271
273 public function getTheme() { 272 public function getTheme() {
274 return $this->currentTheme; 273 return $this->currentTheme;
275 } 274 }
@@ -294,7 +293,7 @@ class Poche
294 if (is_file($themeIniFile) && is_readable($themeIniFile)) { 293 if (is_file($themeIniFile) && is_readable($themeIniFile)) {
295 $themeInfo = parse_ini_file($themeIniFile); 294 $themeInfo = parse_ini_file($themeIniFile);
296 } 295 }
297 296
298 if ($themeInfo === false) { 297 if ($themeInfo === false) {
299 $themeInfo = array(); 298 $themeInfo = array();
300 } 299 }
@@ -305,7 +304,7 @@ class Poche
305 304
306 return $themeInfo; 305 return $themeInfo;
307 } 306 }
308 307
309 public function getInstalledThemes() { 308 public function getInstalledThemes() {
310 $handle = opendir(THEME); 309 $handle = opendir(THEME);
311 $themes = array(); 310 $themes = array();
@@ -332,28 +331,28 @@ class Poche
332 public function getInstalledLanguages() { 331 public function getInstalledLanguages() {
333 $handle = opendir(LOCALE); 332 $handle = opendir(LOCALE);
334 $languages = array(); 333 $languages = array();
335 334
336 while (($language = readdir($handle)) !== false) { 335 while (($language = readdir($handle)) !== false) {
337 # Languages are stored in a directory, so all directory names are languages 336 # Languages are stored in a directory, so all directory names are languages
338 # @todo move language installation data to database 337 # @todo move language installation data to database
339 if (! is_dir(LOCALE . '/' . $language) || in_array($language, array('..', '.'))) { 338 if (! is_dir(LOCALE . '/' . $language) || in_array($language, array('..', '.', 'tools'))) {
340 continue; 339 continue;
341 } 340 }
342 341
343 $current = false; 342 $current = false;
344 343
345 if ($language === $this->getLanguage()) { 344 if ($language === $this->getLanguage()) {
346 $current = true; 345 $current = true;
347 } 346 }
348 347
349 $languages[] = array('name' => $this->language_names[$language], 'value' => $language, 'current' => $current); 348 $languages[] = array('name' => (isset($this->language_names[$language]) ? $this->language_names[$language] : $language), 'value' => $language, 'current' => $current);
350 } 349 }
351 350
352 return $languages; 351 return $languages;
353 } 352 }
354 353
355 public function getDefaultConfig() 354 public function getDefaultConfig()
356 { 355 {
357 return array( 356 return array(
358 'pager' => PAGINATION, 357 'pager' => PAGINATION,
359 'language' => LANG, 358 'language' => LANG,
@@ -361,60 +360,6 @@ class Poche
361 ); 360 );
362 } 361 }
363 362
364 protected function getPageContent(Url $url)
365 {
366 // Saving and clearing context
367 $REAL = array();
368 foreach( $GLOBALS as $key => $value ) {
369 if( $key != "GLOBALS" && $key != "_SESSION" ) {
370 $GLOBALS[$key] = array();
371 $REAL[$key] = $value;
372 }
373 }
374 // Saving and clearing session
375 $REAL_SESSION = array();
376 foreach( $_SESSION as $key => $value ) {
377 $REAL_SESSION[$key] = $value;
378 unset($_SESSION[$key]);
379 }
380
381 // Running code in different context
382 $scope = function() {
383 extract( func_get_arg(1) );
384 $_GET = $_REQUEST = array(
385 "url" => $url->getUrl(),
386 "max" => 5,
387 "links" => "preserve",
388 "exc" => "",
389 "format" => "json",
390 "submit" => "Create Feed"
391 );
392 ob_start();
393 require func_get_arg(0);
394 $json = ob_get_flush();
395 return $json;
396 };
397 $json = $scope( "inc/3rdparty/makefulltextfeed.php", array("url" => $url) );
398
399 // Clearing and restoring context
400 foreach( $GLOBALS as $key => $value ) {
401 if( $key != "GLOBALS" && $key != "_SESSION" ) {
402 unset($GLOBALS[$key]);
403 }
404 }
405 foreach( $REAL as $key => $value ) {
406 $GLOBALS[$key] = $value;
407 }
408 // Clearing and restoring session
409 foreach( $_SESSION as $key => $value ) {
410 unset($_SESSION[$key]);
411 }
412 foreach( $REAL_SESSION as $key => $value ) {
413 $_SESSION[$key] = $value;
414 }
415 return json_decode($json, true);
416 }
417
418 /** 363 /**
419 * Call action (mark as fav, archive, delete, etc.) 364 * Call action (mark as fav, archive, delete, etc.)
420 */ 365 */
@@ -423,28 +368,24 @@ class Poche
423 switch ($action) 368 switch ($action)
424 { 369 {
425 case 'add': 370 case 'add':
426 $content = $this->getPageContent($url); 371 $content = Tools::getPageContent($url);
427 $title = ($content['rss']['channel']['item']['title'] != '') ? $content['rss']['channel']['item']['title'] : _('Untitled'); 372 $title = ($content['rss']['channel']['item']['title'] != '') ? $content['rss']['channel']['item']['title'] : _('Untitled');
428 $body = $content['rss']['channel']['item']['description']; 373 $body = $content['rss']['channel']['item']['description'];
429 374
430 // clean content from prevent xss attack 375 // clean content from prevent xss attack
431 $config = HTMLPurifier_Config::createDefault(); 376 $config = HTMLPurifier_Config::createDefault();
377 $config->set('Cache.SerializerPath', CACHE);
432 $purifier = new HTMLPurifier($config); 378 $purifier = new HTMLPurifier($config);
433 $title = $purifier->purify($title); 379 $title = $purifier->purify($title);
434 $body = $purifier->purify($body); 380 $body = $purifier->purify($body);
435 381
436 //search for possible duplicate if not in import mode 382 //search for possible duplicate
437 if (!$import) { 383 $duplicate = NULL;
438 $duplicate = $this->store->retrieveOneByURL($url->getUrl(), $this->user->getId()); 384 $duplicate = $this->store->retrieveOneByURL($url->getUrl(), $this->user->getId());
439 }
440 385
441 if ($this->store->add($url->getUrl(), $title, $body, $this->user->getId())) { 386 $last_id = $this->store->add($url->getUrl(), $title, $body, $this->user->getId());
387 if ( $last_id ) {
442 Tools::logm('add link ' . $url->getUrl()); 388 Tools::logm('add link ' . $url->getUrl());
443 $sequence = '';
444 if (STORAGE == 'postgres') {
445 $sequence = 'entries_id_seq';
446 }
447 $last_id = $this->store->getLastId($sequence);
448 if (DOWNLOAD_PICTURES) { 389 if (DOWNLOAD_PICTURES) {
449 $content = filtre_picture($body, $url->getUrl(), $last_id); 390 $content = filtre_picture($body, $url->getUrl(), $last_id);
450 Tools::logm('updating content article'); 391 Tools::logm('updating content article');
@@ -464,23 +405,17 @@ class Poche
464 } 405 }
465 } 406 }
466 407
467 if (!$import) { 408 $this->messages->add('s', _('the link has been added successfully'));
468 $this->messages->add('s', _('the link has been added successfully'));
469 }
470 } 409 }
471 else { 410 else {
472 if (!$import) { 411 $this->messages->add('e', _('error during insertion : the link wasn\'t added'));
473 $this->messages->add('e', _('error during insertion : the link wasn\'t added')); 412 Tools::logm('error during insertion : the link wasn\'t added ' . $url->getUrl());
474 Tools::logm('error during insertion : the link wasn\'t added ' . $url->getUrl());
475 }
476 } 413 }
477 414
478 if (!$import) { 415 if ($autoclose == TRUE) {
479 if ($autoclose == TRUE) { 416 Tools::redirect('?view=home');
480 Tools::redirect('?view=home'); 417 } else {
481 } else { 418 Tools::redirect('?view=home&closewin=true');
482 Tools::redirect('?view=home&closewin=true');
483 }
484 } 419 }
485 break; 420 break;
486 case 'delete': 421 case 'delete':
@@ -501,62 +436,56 @@ class Poche
501 case 'toggle_fav' : 436 case 'toggle_fav' :
502 $this->store->favoriteById($id, $this->user->getId()); 437 $this->store->favoriteById($id, $this->user->getId());
503 Tools::logm('mark as favorite link #' . $id); 438 Tools::logm('mark as favorite link #' . $id);
504 if (!$import) { 439 Tools::redirect();
505 Tools::redirect();
506 }
507 break; 440 break;
508 case 'toggle_archive' : 441 case 'toggle_archive' :
509 $this->store->archiveById($id, $this->user->getId()); 442 $this->store->archiveById($id, $this->user->getId());
510 Tools::logm('archive link #' . $id); 443 Tools::logm('archive link #' . $id);
511 if (!$import) { 444 Tools::redirect();
512 Tools::redirect();
513 }
514 break; 445 break;
515 case 'archive_all' : 446 case 'archive_all' :
516 $this->store->archiveAll($this->user->getId()); 447 $this->store->archiveAll($this->user->getId());
517 Tools::logm('archive all links'); 448 Tools::logm('archive all links');
518 if (!$import) { 449 Tools::redirect();
519 Tools::redirect();
520 }
521 break; 450 break;
522 case 'add_tag' : 451 case 'add_tag' :
523 if($import){ 452 $tags = explode(',', $_POST['value']);
524 $entry_id = $id; 453 $entry_id = $_POST['entry_id'];
525 $tags = explode(',', $tags);
526 }
527 else{
528 $tags = explode(',', $_POST['value']);
529 $entry_id = $_POST['entry_id'];
530 }
531 $entry = $this->store->retrieveOneById($entry_id, $this->user->getId()); 454 $entry = $this->store->retrieveOneById($entry_id, $this->user->getId());
532 if (!$entry) { 455 if (!$entry) {
533 $this->messages->add('e', _('Article not found!')); 456 $this->messages->add('e', _('Article not found!'));
534 Tools::logm('error : article not found'); 457 Tools::logm('error : article not found');
535 Tools::redirect(); 458 Tools::redirect();
536 } 459 }
460 //get all already set tags to preven duplicates
461 $already_set_tags = array();
462 $entry_tags = $this->store->retrieveTagsByEntry($entry_id);
463 foreach ($entry_tags as $tag) {
464 $already_set_tags[] = $tag['value'];
465 }
537 foreach($tags as $key => $tag_value) { 466 foreach($tags as $key => $tag_value) {
538 $value = trim($tag_value); 467 $value = trim($tag_value);
539 $tag = $this->store->retrieveTagByValue($value); 468 if ($value && !in_array($value, $already_set_tags)) {
540 469 $tag = $this->store->retrieveTagByValue($value);
541 if (is_null($tag)) { 470
542 # we create the tag 471 if (is_null($tag)) {
543 $tag = $this->store->createTag($value); 472 # we create the tag
544 $sequence = ''; 473 $tag = $this->store->createTag($value);
545 if (STORAGE == 'postgres') { 474 $sequence = '';
546 $sequence = 'tags_id_seq'; 475 if (STORAGE == 'postgres') {
547 } 476 $sequence = 'tags_id_seq';
548 $tag_id = $this->store->getLastId($sequence); 477 }
549 } 478 $tag_id = $this->store->getLastId($sequence);
550 else { 479 }
551 $tag_id = $tag['id']; 480 else {
481 $tag_id = $tag['id'];
482 }
483
484 # we assign the tag to the article
485 $this->store->setTagToEntry($tag_id, $entry_id);
552 } 486 }
553
554 # we assign the tag to the article
555 $this->store->setTagToEntry($tag_id, $entry_id);
556 }
557 if(!$import) {
558 Tools::redirect();
559 } 487 }
488 Tools::redirect();
560 break; 489 break;
561 case 'remove_tag' : 490 case 'remove_tag' :
562 $tag_id = $_GET['tag_id']; 491 $tag_id = $_GET['tag_id'];
@@ -581,8 +510,12 @@ class Poche
581 switch ($view) 510 switch ($view)
582 { 511 {
583 case 'config': 512 case 'config':
584 $dev = trim($this->getPocheVersion('dev')); 513 $dev_infos = $this->getPocheVersion('dev');
585 $prod = trim($this->getPocheVersion('prod')); 514 $dev = trim($dev_infos[0]);
515 $check_time_dev = date('d-M-Y H:i', $dev_infos[1]);
516 $prod_infos = $this->getPocheVersion('prod');
517 $prod = trim($prod_infos[0]);
518 $check_time_prod = date('d-M-Y H:i', $prod_infos[1]);
586 $compare_dev = version_compare(POCHE, $dev); 519 $compare_dev = version_compare(POCHE, $dev);
587 $compare_prod = version_compare(POCHE, $prod); 520 $compare_prod = version_compare(POCHE, $prod);
588 $themes = $this->getInstalledThemes(); 521 $themes = $this->getInstalledThemes();
@@ -594,6 +527,8 @@ class Poche
594 'languages' => $languages, 527 'languages' => $languages,
595 'dev' => $dev, 528 'dev' => $dev,
596 'prod' => $prod, 529 'prod' => $prod,
530 'check_time_dev' => $check_time_dev,
531 'check_time_prod' => $check_time_prod,
597 'compare_dev' => $compare_dev, 532 'compare_dev' => $compare_dev,
598 'compare_prod' => $compare_prod, 533 'compare_prod' => $compare_prod,
599 'token' => $token, 534 'token' => $token,
@@ -619,13 +554,36 @@ class Poche
619 break; 554 break;
620 case 'tags': 555 case 'tags':
621 $token = $this->user->getConfigValue('token'); 556 $token = $this->user->getConfigValue('token');
622 $tags = $this->store->retrieveAllTags($this->user->getId()); 557 //if term is set - search tags for this term
558 $term = Tools::checkVar('term');
559 $tags = $this->store->retrieveAllTags($this->user->getId(), $term);
560 if (Tools::isAjaxRequest()) {
561 $result = array();
562 foreach ($tags as $tag) {
563 $result[] = $tag['value'];
564 }
565 echo json_encode($result);
566 exit;
567 }
623 $tpl_vars = array( 568 $tpl_vars = array(
624 'token' => $token, 569 'token' => $token,
625 'user_id' => $this->user->getId(), 570 'user_id' => $this->user->getId(),
626 'tags' => $tags, 571 'tags' => $tags,
627 ); 572 );
628 break; 573 break;
574 case 'search':
575 if (isset($_GET['search'])) {
576 $search = filter_var($_GET['search'], FILTER_SANITIZE_STRING);
577 $tpl_vars['entries'] = $this->store->search($search, $this->user->getId());
578 $count = count($tpl_vars['entries']);
579 $this->pagination->set_total($count);
580 $page_links = str_replace(array('previous', 'next'), array(_('previous'), _('next')),
581 $this->pagination->page_links('?view=' . $view . '?search=' . $search . '&sort=' . $_SESSION['sort'] . '&' ));
582 $tpl_vars['page_links'] = $page_links;
583 $tpl_vars['nb_results'] = $count;
584 $tpl_vars['search_term'] = $search;
585 }
586 break;
629 case 'view': 587 case 'view':
630 $entry = $this->store->retrieveOneById($id, $this->user->getId()); 588 $entry = $this->store->retrieveOneById($id, $this->user->getId());
631 if ($entry != NULL) { 589 if ($entry != NULL) {
@@ -660,8 +618,9 @@ class Poche
660 'entries' => '', 618 'entries' => '',
661 'page_links' => '', 619 'page_links' => '',
662 'nb_results' => '', 620 'nb_results' => '',
621 'listmode' => (isset($_COOKIE['listmode']) ? true : false),
663 ); 622 );
664 623
665 //if id is given - we retrive entries by tag: id is tag id 624 //if id is given - we retrive entries by tag: id is tag id
666 if ($id) { 625 if ($id) {
667 $tpl_vars['tag'] = $this->store->retrieveTag($id, $this->user->getId()); 626 $tpl_vars['tag'] = $this->store->retrieveTag($id, $this->user->getId());
@@ -686,8 +645,8 @@ class Poche
686 } 645 }
687 646
688 /** 647 /**
689 * update the password of the current user. 648 * update the password of the current user.
690 * if MODE_DEMO is TRUE, the password can't be updated. 649 * if MODE_DEMO is TRUE, the password can't be updated.
691 * @todo add the return value 650 * @todo add the return value
692 * @todo set the new password in function header like this updatePassword($newPassword) 651 * @todo set the new password in function header like this updatePassword($newPassword)
693 * @return boolean 652 * @return boolean
@@ -715,42 +674,44 @@ class Poche
715 } 674 }
716 } 675 }
717 } 676 }
718 677
719 public function updateTheme() 678 public function updateTheme()
720 { 679 {
721 # no data 680 # no data
722 if (empty($_POST['theme'])) { 681 if (empty($_POST['theme'])) {
723 } 682 }
724 683
725 # we are not going to change it to the current theme... 684 # we are not going to change it to the current theme...
726 if ($_POST['theme'] == $this->getTheme()) { 685 if ($_POST['theme'] == $this->getTheme()) {
727 $this->messages->add('w', _('still using the "' . $this->getTheme() . '" theme!')); 686 $this->messages->add('w', _('still using the "' . $this->getTheme() . '" theme!'));
728 Tools::redirect('?view=config'); 687 Tools::redirect('?view=config');
729 } 688 }
730 689
731 $themes = $this->getInstalledThemes(); 690 $themes = $this->getInstalledThemes();
732 $actualTheme = false; 691 $actualTheme = false;
733 692
734 foreach (array_keys($themes) as $theme) { 693 foreach (array_keys($themes) as $theme) {
735 if ($theme == $_POST['theme']) { 694 if ($theme == $_POST['theme']) {
736 $actualTheme = true; 695 $actualTheme = true;
737 break; 696 break;
738 } 697 }
739 } 698 }
740 699
741 if (! $actualTheme) { 700 if (! $actualTheme) {
742 $this->messages->add('e', _('that theme does not seem to be installed')); 701 $this->messages->add('e', _('that theme does not seem to be installed'));
743 Tools::redirect('?view=config'); 702 Tools::redirect('?view=config');
744 } 703 }
745 704
746 $this->store->updateUserConfig($this->user->getId(), 'theme', $_POST['theme']); 705 $this->store->updateUserConfig($this->user->getId(), 'theme', $_POST['theme']);
747 $this->messages->add('s', _('you have changed your theme preferences')); 706 $this->messages->add('s', _('you have changed your theme preferences'));
748 707
749 $currentConfig = $_SESSION['poche_user']->config; 708 $currentConfig = $_SESSION['poche_user']->config;
750 $currentConfig['theme'] = $_POST['theme']; 709 $currentConfig['theme'] = $_POST['theme'];
751 710
752 $_SESSION['poche_user']->setConfig($currentConfig); 711 $_SESSION['poche_user']->setConfig($currentConfig);
753 712
713 $this->emptyCache();
714
754 Tools::redirect('?view=config'); 715 Tools::redirect('?view=config');
755 } 716 }
756 717
@@ -759,39 +720,40 @@ class Poche
759 # no data 720 # no data
760 if (empty($_POST['language'])) { 721 if (empty($_POST['language'])) {
761 } 722 }
762 723
763 # we are not going to change it to the current language... 724 # we are not going to change it to the current language...
764 if ($_POST['language'] == $this->getLanguage()) { 725 if ($_POST['language'] == $this->getLanguage()) {
765 $this->messages->add('w', _('still using the "' . $this->getLanguage() . '" language!')); 726 $this->messages->add('w', _('still using the "' . $this->getLanguage() . '" language!'));
766 Tools::redirect('?view=config'); 727 Tools::redirect('?view=config');
767 } 728 }
768 729
769 $languages = $this->getInstalledLanguages(); 730 $languages = $this->getInstalledLanguages();
770 $actualLanguage = false; 731 $actualLanguage = false;
771 732
772 foreach ($languages as $language) { 733 foreach ($languages as $language) {
773 if ($language['value'] == $_POST['language']) { 734 if ($language['value'] == $_POST['language']) {
774 $actualLanguage = true; 735 $actualLanguage = true;
775 break; 736 break;
776 } 737 }
777 } 738 }
778 739
779 if (! $actualLanguage) { 740 if (! $actualLanguage) {
780 $this->messages->add('e', _('that language does not seem to be installed')); 741 $this->messages->add('e', _('that language does not seem to be installed'));
781 Tools::redirect('?view=config'); 742 Tools::redirect('?view=config');
782 } 743 }
783 744
784 $this->store->updateUserConfig($this->user->getId(), 'language', $_POST['language']); 745 $this->store->updateUserConfig($this->user->getId(), 'language', $_POST['language']);
785 $this->messages->add('s', _('you have changed your language preferences')); 746 $this->messages->add('s', _('you have changed your language preferences'));
786 747
787 $currentConfig = $_SESSION['poche_user']->config; 748 $currentConfig = $_SESSION['poche_user']->config;
788 $currentConfig['language'] = $_POST['language']; 749 $currentConfig['language'] = $_POST['language'];
789 750
790 $_SESSION['poche_user']->setConfig($currentConfig); 751 $_SESSION['poche_user']->setConfig($currentConfig);
791 752
753 $this->emptyCache();
754
792 Tools::redirect('?view=config'); 755 Tools::redirect('?view=config');
793 } 756 }
794
795 /** 757 /**
796 * get credentials from differents sources 758 * get credentials from differents sources
797 * it redirects the user to the $referer link 759 * it redirects the user to the $referer link
@@ -846,7 +808,7 @@ class Poche
846 /** 808 /**
847 * log out the poche user. It cleans the session. 809 * log out the poche user. It cleans the session.
848 * @todo add the return value 810 * @todo add the return value
849 * @return boolean 811 * @return boolean
850 */ 812 */
851 public function logout() 813 public function logout()
852 { 814 {
@@ -857,225 +819,123 @@ class Poche
857 } 819 }
858 820
859 /** 821 /**
860 * import from Instapaper. poche needs a ./instapaper-export.html file 822 * import datas into your poche
861 * @todo add the return value
862 * @param string $targetFile the file used for importing
863 * @return boolean 823 * @return boolean
864 */ 824 */
865 private function importFromInstapaper($targetFile) 825 public function import() {
866 { 826
867 # TODO gestion des articles favs 827 if (!defined('IMPORT_LIMIT')) {
868 $html = new simple_html_dom(); 828 define('IMPORT_LIMIT', 5);
869 $html->load_file($targetFile); 829 }
870 Tools::logm('starting import from instapaper'); 830 if (!defined('IMPORT_DELAY')) {
871 831 define('IMPORT_DELAY', 5);
872 $read = 0; 832 }
873 $errors = array(); 833
874 foreach($html->find('ol') as $ul) 834 if ( isset($_FILES['file']) ) {
875 { 835 // assume, that file is in json format
876 foreach($ul->find('li') as $li) 836 $str_data = file_get_contents($_FILES['file']['tmp_name']);
877 { 837 $data = json_decode($str_data, true);
878 $a = $li->find('a'); 838
879 $url = new Url(base64_encode($a[0]->href)); 839 if ( $data === null ) {
880 $this->action('add', $url, 0, TRUE); 840 //not json - assume html
881 if ($read == '1') { 841 $html = new simple_html_dom();
882 $sequence = ''; 842 $html->load_file($_FILES['file']['tmp_name']);
883 if (STORAGE == 'postgres') { 843 $data = array();
884 $sequence = 'entries_id_seq'; 844 $read = 0;
885 } 845 foreach (array('ol','ul') as $list) {
886 $last_id = $this->store->getLastId($sequence); 846 foreach ($html->find($list) as $ul) {
887 $this->action('toggle_archive', $url, $last_id, TRUE); 847 foreach ($ul->find('li') as $li) {
888 } 848 $tmpEntry = array();
849 $a = $li->find('a');
850 $tmpEntry['url'] = $a[0]->href;
851 $tmpEntry['tags'] = $a[0]->tags;
852 $tmpEntry['is_read'] = $read;
853 if ($tmpEntry['url']) {
854 $data[] = $tmpEntry;
855 }
856 }
857 # the second <ol/ul> is for read links
858 $read = ((sizeof($data) && $read)?0:1);
889 } 859 }
890 860 }
891 # the second <ol> is for read links
892 $read = 1;
893 } 861 }
894 $this->messages->add('s', _('import from instapaper completed'));
895 Tools::logm('import from instapaper completed');
896 Tools::redirect();
897 }
898 862
899 /** 863 //for readability structure
900 * import from Pocket. poche needs a ./ril_export.html file 864 foreach ($data as $record) {
901 * @todo add the return value 865 if (is_array($record)) {
902 * @param string $targetFile the file used for importing 866 $data[] = $record;
903 * @return boolean 867 foreach ($record as $record2) {
904 */ 868 if (is_array($record2)) {
905 private function importFromPocket($targetFile) 869 $data[] = $record2;
906 { 870 }
907 # TODO gestion des articles favs 871 }
908 $html = new simple_html_dom(); 872 }
909 $html->load_file($targetFile); 873 }
910 Tools::logm('starting import from pocket'); 874
911 875 $i = 0; //counter for articles inserted
912 $read = 0; 876 foreach ($data as $record) {
913 $errors = array(); 877 $url = trim( isset($record['article__url']) ? $record['article__url'] : (isset($record['url']) ? $record['url'] : '') );
914 foreach($html->find('ul') as $ul) 878 if ( $url ) {
915 { 879 $title = (isset($record['title']) ? $record['title'] : _('Untitled - Import - ').'</a> <a href="./?import">'._('click to finish import').'</a><a>');
916 foreach($ul->find('li') as $li) 880 $body = (isset($record['content']) ? $record['content'] : '');
917 { 881 $isRead = (isset($record['is_read']) ? intval($record['is_read']) : (isset($record['archive'])?intval($record['archive']):0));
918 $a = $li->find('a'); 882 $isFavorite = (isset($record['is_fav']) ? intval($record['is_fav']) : (isset($record['favorite'])?intval($record['favorite']):0) );
919 $url = new Url(base64_encode($a[0]->href)); 883 //insert new record
920 $this->action('add', $url, 0, TRUE); 884 $id = $this->store->add($url, $title, $body, $this->user->getId(), $isFavorite, $isRead);
921 $sequence = ''; 885 if ( $id ) {
922 if (STORAGE == 'postgres') { 886 //increment no of records inserted
923 $sequence = 'entries_id_seq'; 887 $i++;
924 } 888 if ( isset($record['tags']) && trim($record['tags']) ) {
925 $last_id = $this->store->getLastId($sequence); 889 //@TODO: set tags
926 if ($read == '1') { 890
927 $this->action('toggle_archive', $url, $last_id, TRUE); 891 }
928 }
929 $tags = $a[0]->tags;
930 if(!empty($tags)) {
931 $this->action('add_tag',$url,$last_id,true,false,$tags);
932 }
933 } 892 }
934 893 }
935 # the second <ul> is for read links
936 $read = 1;
937 } 894 }
938 $this->messages->add('s', _('import from pocket completed'));
939 Tools::logm('import from pocket completed');
940 Tools::redirect();
941 }
942 895
943 /** 896 if ( $i > 0 ) {
944 * import from Readability. poche needs a ./readability file 897 $this->messages->add('s', _('Articles inserted: ').$i._('. Please note, that some may be marked as "read".'));
945 * @todo add the return value
946 * @param string $targetFile the file used for importing
947 * @return boolean
948 */
949 private function importFromReadability($targetFile)
950 {
951 # TODO gestion des articles lus / favs
952 $str_data = file_get_contents($targetFile);
953 $data = json_decode($str_data,true);
954 Tools::logm('starting import from Readability');
955 $count = 0;
956 foreach ($data as $key => $value) {
957 $url = NULL;
958 $favorite = FALSE;
959 $archive = FALSE;
960 foreach ($value as $item) {
961 foreach ($item as $attr => $value) {
962 if ($attr == 'article__url') {
963 $url = new Url(base64_encode($value));
964 }
965 $sequence = '';
966 if (STORAGE == 'postgres') {
967 $sequence = 'entries_id_seq';
968 }
969 if ($value == 'true') {
970 if ($attr == 'favorite') {
971 $favorite = TRUE;
972 }
973 if ($attr == 'archive') {
974 $archive = TRUE;
975 }
976 }
977 }
978
979 # we can add the url
980 if (!is_null($url) && $url->isCorrect()) {
981 $this->action('add', $url, 0, TRUE);
982 $count++;
983 if ($favorite) {
984 $last_id = $this->store->getLastId($sequence);
985 $this->action('toggle_fav', $url, $last_id, TRUE);
986 }
987 if ($archive) {
988 $last_id = $this->store->getLastId($sequence);
989 $this->action('toggle_archive', $url, $last_id, TRUE);
990 }
991 }
992 }
993 } 898 }
994 $this->messages->add('s', _('import from Readability completed. ' . $count . ' new links.')); 899 }
995 Tools::logm('import from Readability completed'); 900 //file parsing finished here
901
902 //now download article contents if any
903
904 //check if we need to download any content
905 $recordsDownloadRequired = $this->store->retrieveUnfetchedEntriesCount($this->user->getId());
906 if ( $recordsDownloadRequired == 0 ) {
907 //nothing to download
908 $this->messages->add('s', _('Import finished.'));
996 Tools::redirect(); 909 Tools::redirect();
997 } 910 }
911 else {
912 //if just inserted - don't download anything, download will start in next reload
913 if ( !isset($_FILES['file']) ) {
914 //download next batch
915 $items = $this->store->retrieveUnfetchedEntries($this->user->getId(), IMPORT_LIMIT);
998 916
999 /** 917 $config = HTMLPurifier_Config::createDefault();
1000 * import from Poche exported file 918 $config->set('Cache.SerializerPath', CACHE);
1001 * @param string $targetFile the file used for importing 919 $purifier = new HTMLPurifier($config);
1002 * @return boolean
1003 */
1004 private function importFromPoche($targetFile)
1005 {
1006 $str_data = file_get_contents($targetFile);
1007 $data = json_decode($str_data,true);
1008 Tools::logm('starting import from Poche');
1009 920
921 foreach ($items as $item) {
922 $url = new Url(base64_encode($item['url']));
923 $content = Tools::getPageContent($url);
1010 924
1011 $sequence = ''; 925 $title = (($content['rss']['channel']['item']['title'] != '') ? $content['rss']['channel']['item']['title'] : _('Untitled'));
1012 if (STORAGE == 'postgres') { 926 $body = (($content['rss']['channel']['item']['description'] != '') ? $content['rss']['channel']['item']['description'] : _('Undefined'));
1013 $sequence = 'entries_id_seq';
1014 }
1015 927
1016 $count = 0; 928 //clean content to prevent xss attack
1017 foreach ($data as $value) { 929 $title = $purifier->purify($title);
1018 930 $body = $purifier->purify($body);
1019 $url = new Url(base64_encode($value['url'])); 931
1020 $favorite = ($value['is_fav'] == -1); 932 $this->store->updateContentAndTitle($item['id'], $title, $body, $this->user->getId());
1021 $archive = ($value['is_read'] == -1); 933 }
1022
1023 # we can add the url
1024 if (!is_null($url) && $url->isCorrect()) {
1025
1026 $this->action('add', $url, 0, TRUE);
1027
1028 $count++;
1029 if ($favorite) {
1030 $last_id = $this->store->getLastId($sequence);
1031 $this->action('toggle_fav', $url, $last_id, TRUE);
1032 }
1033 if ($archive) {
1034 $last_id = $this->store->getLastId($sequence);
1035 $this->action('toggle_archive', $url, $last_id, TRUE);
1036 }
1037 }
1038
1039 }
1040 $this->messages->add('s', _('import from Poche completed. ' . $count . ' new links.'));
1041 Tools::logm('import from Poche completed');
1042 Tools::redirect();
1043 }
1044 934
1045 /**
1046 * import datas into your poche
1047 * @param string $from name of the service to import : pocket, instapaper or readability
1048 * @todo add the return value
1049 * @return boolean
1050 */
1051 public function import($from)
1052 {
1053 $providers = array(
1054 'pocket' => 'importFromPocket',
1055 'readability' => 'importFromReadability',
1056 'instapaper' => 'importFromInstapaper',
1057 'poche' => 'importFromPoche',
1058 );
1059
1060 if (! isset($providers[$from])) {
1061 $this->messages->add('e', _('Unknown import provider.'));
1062 Tools::redirect();
1063 }
1064
1065 $targetDefinition = 'IMPORT_' . strtoupper($from) . '_FILE';
1066 $targetFile = constant($targetDefinition);
1067
1068 if (! defined($targetDefinition)) {
1069 $this->messages->add('e', _('Incomplete inc/poche/define.inc.php file, please define "' . $targetDefinition . '".'));
1070 Tools::redirect();
1071 }
1072
1073 if (! file_exists($targetFile)) {
1074 $this->messages->add('e', _('Could not find required "' . $targetFile . '" import file.'));
1075 Tools::redirect();
1076 } 935 }
1077 936 }
1078 $this->$providers[$from]($targetFile); 937
938 return array('includeImport'=>true, 'import'=>array('recordsDownloadRequired'=>$recordsDownloadRequired, 'recordsUnderDownload'=> IMPORT_LIMIT, 'delay'=> IMPORT_DELAY * 1000) );
1079 } 939 }
1080 940
1081 /** 941 /**
@@ -1084,6 +944,9 @@ class Poche
1084 */ 944 */
1085 public function export() 945 public function export()
1086 { 946 {
947 $filename = "wallabag-export-".$this->user->getId()."-".date("Y-m-d").".json";
948 header('Content-Disposition: attachment; filename='.$filename);
949
1087 $entries = $this->store->retrieveAll($this->user->getId()); 950 $entries = $this->store->retrieveAll($this->user->getId());
1088 echo $this->tpl->render('export.twig', array( 951 echo $this->tpl->render('export.twig', array(
1089 'export' => Tools::renderJson($entries), 952 'export' => Tools::renderJson($entries),
@@ -1099,21 +962,29 @@ class Poche
1099 private function getPocheVersion($which = 'prod') 962 private function getPocheVersion($which = 'prod')
1100 { 963 {
1101 $cache_file = CACHE . '/' . $which; 964 $cache_file = CACHE . '/' . $which;
965 $check_time = time();
1102 966
1103 # checks if the cached version file exists 967 # checks if the cached version file exists
1104 if (file_exists($cache_file) && (filemtime($cache_file) > (time() - 86400 ))) { 968 if (file_exists($cache_file) && (filemtime($cache_file) > (time() - 86400 ))) {
1105 $version = file_get_contents($cache_file); 969 $version = file_get_contents($cache_file);
970 $check_time = filemtime($cache_file);
1106 } else { 971 } else {
1107 $version = file_get_contents('http://static.wallabag.org/versions/' . $which); 972 $version = file_get_contents('http://static.wallabag.org/versions/' . $which);
1108 file_put_contents($cache_file, $version, LOCK_EX); 973 file_put_contents($cache_file, $version, LOCK_EX);
1109 } 974 }
1110 return $version; 975 return array($version, $check_time);
1111 } 976 }
1112 977
1113 public function generateToken() 978 public function generateToken()
1114 { 979 {
1115 if (ini_get('open_basedir') === '') { 980 if (ini_get('open_basedir') === '') {
1116 $token = substr(base64_encode(file_get_contents('/dev/urandom', false, null, 0, 20)), 0, 15); 981 if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
982 echo 'This is a server using Windows!';
983 // alternative to /dev/urandom for Windows
984 $token = substr(base64_encode(uniqid(mt_rand(), true)), 0, 20);
985 } else {
986 $token = substr(base64_encode(file_get_contents('/dev/urandom', false, null, 0, 20)), 0, 15);
987 }
1117 } 988 }
1118 else { 989 else {
1119 $token = substr(base64_encode(uniqid(mt_rand(), true)), 0, 20); 990 $token = substr(base64_encode(uniqid(mt_rand(), true)), 0, 20);
@@ -1124,6 +995,7 @@ class Poche
1124 $currentConfig = $_SESSION['poche_user']->config; 995 $currentConfig = $_SESSION['poche_user']->config;
1125 $currentConfig['token'] = $token; 996 $currentConfig['token'] = $token;
1126 $_SESSION['poche_user']->setConfig($currentConfig); 997 $_SESSION['poche_user']->setConfig($currentConfig);
998 Tools::redirect();
1127 } 999 }
1128 1000
1129 public function generateFeeds($token, $user_id, $tag_id, $type = 'home') 1001 public function generateFeeds($token, $user_id, $tag_id, $type = 'home')
@@ -1131,6 +1003,10 @@ class Poche
1131 $allowed_types = array('home', 'fav', 'archive', 'tag'); 1003 $allowed_types = array('home', 'fav', 'archive', 'tag');
1132 $config = $this->store->getConfigUser($user_id); 1004 $config = $this->store->getConfigUser($user_id);
1133 1005
1006 if ($config == null) {
1007 die(_('User with this id (' . $user_id . ') does not exist.'));
1008 }
1009
1134 if (!in_array($type, $allowed_types) || 1010 if (!in_array($type, $allowed_types) ||
1135 $token != $config['token']) { 1011 $token != $config['token']) {
1136 die(_('Uh, there is a problem while generating feeds.')); 1012 die(_('Uh, there is a problem while generating feeds.'));
@@ -1140,8 +1016,9 @@ class Poche
1140 $feed = new FeedWriter(RSS2); 1016 $feed = new FeedWriter(RSS2);
1141 $feed->setTitle('wallabag — ' . $type . ' feed'); 1017 $feed->setTitle('wallabag — ' . $type . ' feed');
1142 $feed->setLink(Tools::getPocheUrl()); 1018 $feed->setLink(Tools::getPocheUrl());
1143 $feed->setChannelElement('updated', date(DATE_RSS , time())); 1019 $feed->setChannelElement('pubDate', date(DATE_RSS , time()));
1144 $feed->setChannelElement('author', 'wallabag'); 1020 $feed->setChannelElement('generator', 'wallabag');
1021 $feed->setDescription('wallabag ' . $type . ' elements');
1145 1022
1146 if ($type == 'tag') { 1023 if ($type == 'tag') {
1147 $entries = $this->store->retrieveEntriesByTag($tag_id, $user_id); 1024 $entries = $this->store->retrieveEntriesByTag($tag_id, $user_id);
@@ -1154,7 +1031,7 @@ class Poche
1154 foreach ($entries as $entry) { 1031 foreach ($entries as $entry) {
1155 $newItem = $feed->createNewItem(); 1032 $newItem = $feed->createNewItem();
1156 $newItem->setTitle($entry['title']); 1033 $newItem->setTitle($entry['title']);
1157 $newItem->setLink(Tools::getPocheUrl() . '?view=view&amp;id=' . $entry['id']); 1034 $newItem->setLink($entry['url']);
1158 $newItem->setDate(time()); 1035 $newItem->setDate(time());
1159 $newItem->setDescription($entry['content']); 1036 $newItem->setDescription($entry['content']);
1160 $feed->addItem($newItem); 1037 $feed->addItem($newItem);
diff --git a/inc/poche/Tools.class.php b/inc/poche/Tools.class.php
index 4ed28ed1..a130e94b 100644..100755
--- a/inc/poche/Tools.class.php
+++ b/inc/poche/Tools.class.php
@@ -7,7 +7,7 @@
7 * @copyright 2013 7 * @copyright 2013
8 * @license http://www.wtfpl.net/ see COPYING file 8 * @license http://www.wtfpl.net/ see COPYING file
9 */ 9 */
10 10
11class Tools 11class Tools
12{ 12{
13 public static function initPhp() 13 public static function initPhp()
@@ -42,7 +42,7 @@ class Tools
42 && (strtolower($_SERVER['HTTPS']) == 'on')) 42 && (strtolower($_SERVER['HTTPS']) == 'on'))
43 || (isset($_SERVER["SERVER_PORT"]) 43 || (isset($_SERVER["SERVER_PORT"])
44 && $_SERVER["SERVER_PORT"] == '443') // HTTPS detection. 44 && $_SERVER["SERVER_PORT"] == '443') // HTTPS detection.
45 || (isset($_SERVER["SERVER_PORT"]) //Custom HTTPS port detection 45 || (isset($_SERVER["SERVER_PORT"]) //Custom HTTPS port detection
46 && $_SERVER["SERVER_PORT"] == SSL_PORT) 46 && $_SERVER["SERVER_PORT"] == SSL_PORT)
47 || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) 47 || (isset($_SERVER['HTTP_X_FORWARDED_PROTO'])
48 && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https'); 48 && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https');
@@ -148,7 +148,7 @@ class Tools
148 ); 148 );
149 149
150 # only download page lesser than 4MB 150 # only download page lesser than 4MB
151 $data = @file_get_contents($url, false, $context, -1, 4000000); 151 $data = @file_get_contents($url, false, $context, -1, 4000000);
152 152
153 if (isset($http_response_header) and isset($http_response_header[0])) { 153 if (isset($http_response_header) and isset($http_response_header[0])) {
154 $httpcodeOK = isset($http_response_header) and isset($http_response_header[0]) and ((strpos($http_response_header[0], '200 OK') !== FALSE) or (strpos($http_response_header[0], '301 Moved Permanently') !== FALSE)); 154 $httpcodeOK = isset($http_response_header) and isset($http_response_header[0]) and ((strpos($http_response_header[0], '200 OK') !== FALSE) or (strpos($http_response_header[0], '301 Moved Permanently') !== FALSE));
@@ -193,14 +193,14 @@ class Tools
193 193
194 public static function logm($message) 194 public static function logm($message)
195 { 195 {
196 if (DEBUG_POCHE) { 196 if (DEBUG_POCHE && php_sapi_name() != 'cli') {
197 $t = strval(date('Y/m/d_H:i:s')) . ' - ' . $_SERVER["REMOTE_ADDR"] . ' - ' . strval($message) . "\n"; 197 $t = strval(date('Y/m/d_H:i:s')) . ' - ' . $_SERVER["REMOTE_ADDR"] . ' - ' . strval($message) . "\n";
198 file_put_contents(CACHE . '/log.txt', $t, FILE_APPEND); 198 file_put_contents(CACHE . '/log.txt', $t, FILE_APPEND);
199 error_log('DEBUG POCHE : ' . $message); 199 error_log('DEBUG POCHE : ' . $message);
200 } 200 }
201 } 201 }
202 202
203 public static function encodeString($string) 203 public static function encodeString($string)
204 { 204 {
205 return sha1($string . SALT); 205 return sha1($string . SALT);
206 } 206 }
@@ -241,7 +241,6 @@ class Tools
241 } 241 }
242 } 242 }
243 243
244
245 public static function download_db() { 244 public static function download_db() {
246 header('Content-Disposition: attachment; filename="poche.sqlite.gz"'); 245 header('Content-Disposition: attachment; filename="poche.sqlite.gz"');
247 self::status(200); 246 self::status(200);
@@ -252,4 +251,74 @@ class Tools
252 251
253 exit; 252 exit;
254 } 253 }
254
255 public static function getPageContent(Url $url)
256 {
257 // Saving and clearing context
258 $REAL = array();
259 foreach( $GLOBALS as $key => $value ) {
260 if( $key != 'GLOBALS' && $key != '_SESSION' && $key != 'HTTP_SESSION_VARS' ) {
261 $GLOBALS[$key] = array();
262 $REAL[$key] = $value;
263 }
264 }
265 // Saving and clearing session
266 if ( isset($_SESSION) ) {
267 $REAL_SESSION = array();
268 foreach( $_SESSION as $key => $value ) {
269 $REAL_SESSION[$key] = $value;
270 unset($_SESSION[$key]);
271 }
272 }
273
274 // Running code in different context
275 $scope = function() {
276 extract( func_get_arg(1) );
277 $_GET = $_REQUEST = array(
278 "url" => $url->getUrl(),
279 "max" => 5,
280 "links" => "preserve",
281 "exc" => "",
282 "format" => "json",
283 "submit" => "Create Feed"
284 );
285 ob_start();
286 require func_get_arg(0);
287 $json = ob_get_contents();
288 ob_end_clean();
289 return $json;
290 };
291 $json = $scope( "inc/3rdparty/makefulltextfeed.php", array("url" => $url) );
292
293 // Clearing and restoring context
294 foreach( $GLOBALS as $key => $value ) {
295 if( $key != "GLOBALS" && $key != "_SESSION" ) {
296 unset($GLOBALS[$key]);
297 }
298 }
299 foreach( $REAL as $key => $value ) {
300 $GLOBALS[$key] = $value;
301 }
302 // Clearing and restoring session
303 if ( isset($REAL_SESSION) ) {
304 foreach( $_SESSION as $key => $value ) {
305 unset($_SESSION[$key]);
306 }
307 foreach( $REAL_SESSION as $key => $value ) {
308 $_SESSION[$key] = $value;
309 }
310 }
311
312 return json_decode($json, true);
313 }
314
315 /**
316 * Returns whether we handle an AJAX (XMLHttpRequest) request.
317 * @return boolean whether we handle an AJAX (XMLHttpRequest) request.
318 */
319 public static function isAjaxRequest()
320 {
321 return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH']==='XMLHttpRequest';
322 }
323
255} 324}
diff --git a/inc/poche/config.inc.php.new b/inc/poche/config.inc.php.new
index 8d52497b..83b3c4c0 100755
--- a/inc/poche/config.inc.php.new
+++ b/inc/poche/config.inc.php.new
@@ -52,12 +52,8 @@ define ('CACHE', ROOT . '/cache');
52 52
53define ('PAGINATION', '10'); 53define ('PAGINATION', '10');
54 54
55define ('POCKET_FILE', '/ril_export.html'); 55//limit for download of articles during import
56define ('READABILITY_FILE', '/readability'); 56define ('IMPORT_LIMIT', 5);
57define ('INSTAPAPER_FILE', '/instapaper-export.html'); 57//delay between downloads (in sec)
58define ('POCHE_FILE', '/poche-export'); 58define ('IMPORT_DELAY', 5);
59 59
60define ('IMPORT_POCKET_FILE', ROOT . POCKET_FILE);
61define ('IMPORT_READABILITY_FILE', ROOT . READABILITY_FILE);
62define ('IMPORT_INSTAPAPER_FILE', ROOT . INSTAPAPER_FILE);
63define ('IMPORT_POCHE_FILE', ROOT . POCHE_FILE); \ No newline at end of file
diff --git a/inc/poche/global.inc.php b/inc/poche/global.inc.php
index d22b0588..15091387 100644
--- a/inc/poche/global.inc.php
+++ b/inc/poche/global.inc.php
@@ -38,7 +38,7 @@ if (! file_exists(ROOT . '/vendor/autoload.php')) {
38 require_once ROOT . '/vendor/autoload.php'; 38 require_once ROOT . '/vendor/autoload.php';
39} 39}
40 40
41# system configuration; database credentials et cetera 41# system configuration; database credentials et caetera
42if (! file_exists(INCLUDES . '/poche/config.inc.php')) { 42if (! file_exists(INCLUDES . '/poche/config.inc.php')) {
43 Poche::$configFileAvailable = false; 43 Poche::$configFileAvailable = false;
44} else { 44} else {
diff --git a/index.php b/index.php
index a26c42e1..7f72b146 100644..100755
--- a/index.php
+++ b/index.php
@@ -8,10 +8,13 @@
8 * @license http://www.wtfpl.net/ see COPYING file 8 * @license http://www.wtfpl.net/ see COPYING file
9 */ 9 */
10 10
11define ('POCHE', '1.5.2'); 11define ('POCHE', '1.6.0');
12require 'check_setup.php'; 12require 'check_setup.php';
13require_once 'inc/poche/global.inc.php'; 13require_once 'inc/poche/global.inc.php';
14session_start(); 14
15# Start session
16Session::$sessionName = 'poche';
17Session::init();
15 18
16# Start Poche 19# Start Poche
17$poche = new Poche(); 20$poche = new Poche();
@@ -30,14 +33,14 @@ $tpl_vars = array(
30 'referer' => $referer, 33 'referer' => $referer,
31 'view' => $view, 34 'view' => $view,
32 'poche_url' => Tools::getPocheUrl(), 35 'poche_url' => Tools::getPocheUrl(),
33 'title' => _('poche, a read it later open source system'), 36 'title' => _('wallabag, a read it later open source system'),
34 'token' => Session::getToken(), 37 'token' => Session::getToken(),
35 'theme' => $poche->getTheme() 38 'theme' => $poche->getTheme()
36); 39);
37 40
38if (! empty($notInstalledMessage)) { 41if (! empty($notInstalledMessage)) {
39 if (! Poche::$canRenderTemplates || ! Poche::$configFileAvailable) { 42 if (! Poche::$canRenderTemplates || ! Poche::$configFileAvailable) {
40 # We cannot use Twig to display the error message 43 # We cannot use Twig to display the error message
41 echo '<h1>Errors</h1><ol>'; 44 echo '<h1>Errors</h1><ol>';
42 foreach ($notInstalledMessage as $message) { 45 foreach ($notInstalledMessage as $message) {
43 echo '<li>' . $message . '</li>'; 46 echo '<li>' . $message . '</li>';
@@ -64,7 +67,8 @@ if (isset($_GET['login'])) {
64 # Update password 67 # Update password
65 $poche->updatePassword(); 68 $poche->updatePassword();
66} elseif (isset($_GET['import'])) { 69} elseif (isset($_GET['import'])) {
67 $import = $poche->import($_GET['from']); 70 $import = $poche->import();
71 $tpl_vars = array_merge($tpl_vars, $import);
68} elseif (isset($_GET['download'])) { 72} elseif (isset($_GET['download'])) {
69 Tools::download_db(); 73 Tools::download_db();
70} elseif (isset($_GET['empty-cache'])) { 74} elseif (isset($_GET['empty-cache'])) {
@@ -75,6 +79,8 @@ if (isset($_GET['login'])) {
75 $poche->updateTheme(); 79 $poche->updateTheme();
76} elseif (isset($_GET['updatelanguage'])) { 80} elseif (isset($_GET['updatelanguage'])) {
77 $poche->updateLanguage(); 81 $poche->updateLanguage();
82} elseif (isset($_GET['uploadfile'])) {
83 $poche->uploadFile();
78} elseif (isset($_GET['feed'])) { 84} elseif (isset($_GET['feed'])) {
79 if (isset($_GET['action']) && $_GET['action'] == 'generate') { 85 if (isset($_GET['action']) && $_GET['action'] == 'generate') {
80 $poche->generateToken(); 86 $poche->generateToken();
@@ -115,6 +121,7 @@ if (Session::isLogged()) {
115} else { 121} else {
116 $tpl_file = Tools::getTplFile('login'); 122 $tpl_file = Tools::getTplFile('login');
117 $tpl_vars['http_auth'] = 0; 123 $tpl_vars['http_auth'] = 0;
124 Session::logout();
118} 125}
119 126
120# because messages can be added in $poche->action(), we have to add this entry now (we can add it before) 127# because messages can be added in $poche->action(), we have to add this entry now (we can add it before)
diff --git a/install/index.php b/install/index.php
index 975b997f..e02952e0 100644
--- a/install/index.php
+++ b/install/index.php
@@ -1,9 +1,30 @@
1<?php 1<?php
2$errors = array(); 2$errors = array();
3$successes = array(); 3$successes = array();
4if ($_POST['download']) { 4
5/* Function taken from at http://php.net/manual/en/function.rmdir.php#110489
6 * Idea : nbari at dalmp dot com
7 * Rights unknown
8 * Here in case of .gitignore files
9 */
10function delTree($dir) {
11 $files = array_diff(scandir($dir), array('.','..'));
12 foreach ($files as $file) {
13 (is_dir("$dir/$file")) ? delTree("$dir/$file") : unlink("$dir/$file");
14 }
15 return rmdir($dir);
16 }
17
18if (isset($_GET['clean'])) {
19 if (is_dir('install')){
20 delTree('install');
21 header('Location: index.php');
22 }
23}
24
25if (isset($_POST['download'])) {
5 if (!file_put_contents("cache/vendor.zip", fopen("http://static.wallabag.org/files/vendor.zip", 'r'))) { 26 if (!file_put_contents("cache/vendor.zip", fopen("http://static.wallabag.org/files/vendor.zip", 'r'))) {
6 $errors[] = 'Impossible to download vendor.zip. Please <a href="http://wllbg.org/vendor">download it manually<∕a> and unzip it in your wallabag folder.'; 27 $errors[] = 'Impossible to download vendor.zip. Please <a href="http://wllbg.org/vendor">download it manually</a> and unzip it in your wallabag folder.';
7 } 28 }
8 else { 29 else {
9 if (extension_loaded('zip')) { 30 if (extension_loaded('zip')) {
@@ -25,7 +46,7 @@ if ($_POST['download']) {
25 } 46 }
26 } 47 }
27} 48}
28else if ($_POST['install']) { 49else if (isset($_POST['install'])) {
29 if (!is_dir('vendor')) { 50 if (!is_dir('vendor')) {
30 $errors[] = 'You must install twig before.'; 51 $errors[] = 'You must install twig before.';
31 } 52 }
@@ -64,6 +85,7 @@ else if ($_POST['install']) {
64 else { 85 else {
65 $db_path = 'sqlite:' . realpath('') . '/db/poche.sqlite'; 86 $db_path = 'sqlite:' . realpath('') . '/db/poche.sqlite';
66 $handle = new PDO($db_path); 87 $handle = new PDO($db_path);
88 $sql_structure = "";
67 } 89 }
68 } 90 }
69 else { 91 else {
@@ -129,7 +151,7 @@ else if ($_POST['install']) {
129 $params = array($id_user, 'language', 'en_EN.UTF8'); 151 $params = array($id_user, 'language', 'en_EN.UTF8');
130 $query = executeQuery($handle, $sql, $params); 152 $query = executeQuery($handle, $sql, $params);
131 153
132 $successes[] = 'wallabag is now installed. Don\'t forget to delete install folder. Then, <a href="index.php">reload this page</a>.'; 154 $successes[] = 'wallabag is now installed. You can now <a href="index.php?clean=0">access it !</a>';
133 } 155 }
134 } 156 }
135 } 157 }
@@ -143,7 +165,7 @@ else if ($_POST['install']) {
143 <!--[if IE]> 165 <!--[if IE]>
144 <meta http-equiv="X-UA-Compatible" content="IE=10"> 166 <meta http-equiv="X-UA-Compatible" content="IE=10">
145 <![endif]--> 167 <![endif]-->
146 <title>wallabag installation</title> 168 <title>wallabag - installation</title>
147 <link rel="shortcut icon" type="image/x-icon" href="themes/baggy/img/favicon.ico" /> 169 <link rel="shortcut icon" type="image/x-icon" href="themes/baggy/img/favicon.ico" />
148 <link rel="apple-touch-icon-precomposed" sizes="144x144" href="themes/baggy/img/apple-touch-icon-144x144-precomposed.png"> 170 <link rel="apple-touch-icon-precomposed" sizes="144x144" href="themes/baggy/img/apple-touch-icon-144x144-precomposed.png">
149 <link rel="apple-touch-icon-precomposed" sizes="72x72" href="themes/baggy/img/apple-touch-icon-72x72-precomposed.png"> 171 <link rel="apple-touch-icon-precomposed" sizes="72x72" href="themes/baggy/img/apple-touch-icon-72x72-precomposed.png">
@@ -154,7 +176,7 @@ else if ($_POST['install']) {
154 <link rel="stylesheet" href="themes/baggy/css/main.css" media="all"> 176 <link rel="stylesheet" href="themes/baggy/css/main.css" media="all">
155 <link rel="stylesheet" href="themes/baggy/css/messages.css" media="all"> 177 <link rel="stylesheet" href="themes/baggy/css/messages.css" media="all">
156 <link rel="stylesheet" href="themes/baggy/css/print.css" media="print"> 178 <link rel="stylesheet" href="themes/baggy/css/print.css" media="print">
157 <script src="themes/baggy/js/jquery-2.0.3.min.js"></script> 179 <script src="themes/default/js/jquery-2.0.3.min.js"></script>
158 <script src="themes/baggy/js/init.js"></script> 180 <script src="themes/baggy/js/init.js"></script>
159 </head> 181 </head>
160 <body> 182 <body>
@@ -198,18 +220,18 @@ else if ($_POST['install']) {
198 <?php if (file_exists('inc/poche/config.inc.php') && is_dir('vendor')) : ?> 220 <?php if (file_exists('inc/poche/config.inc.php') && is_dir('vendor')) : ?>
199 <div class='messages success install'> 221 <div class='messages success install'>
200 <p> 222 <p>
201 wallabag seems already installed. If you want to update it, you only have to delete install folder. 223 wallabag seems already installed. If you want to update it, you only have to delete install folder, then <a href="index.php">reload this page</a>.
202 </p> 224 </p>
203 </div> 225 </div>
204 <?php endif; ?> 226 <?php endif; ?>
205 <?php endif; ?> 227 <?php endif; ?>
206 <p>To install wallabag, you just have to fill the following fields. That's all.</p> 228 <p>To install wallabag, you just have to fill the following fields. That's all.</p>
207 <p>Don't forget to check your server compatibility <a href="wallabag_compatibility_test.php">here</a>.</p> 229 <p>Don't forget to check your server compatibility <a href="wallabag_compatibility_test.php?from=install">here</a>.</p>
208 <form method="post"> 230 <form method="post">
209 <fieldset> 231 <fieldset>
210 <legend><strong>Technical settings</strong></legend> 232 <legend><strong>Technical settings</strong></legend>
211 <?php if (!is_dir('vendor')) : ?> 233 <?php if (!is_dir('vendor')) : ?>
212 <div class='messages notice install'>wallabag needs twig, a template engine (<a href="http://twig.sensiolabs.org/">?</a>). Two ways to install it: 234 <div class='messages notice install'>wallabag needs twig, a template engine (<a href="http://twig.sensiolabs.org/">?</a>). Two ways to install it:<br />
213 <ul> 235 <ul>
214 <li>automatically download and extract vendor.zip into your wallabag folder. 236 <li>automatically download and extract vendor.zip into your wallabag folder.
215 <p><input type="submit" name="download" value="Download vendor.zip" /></p> 237 <p><input type="submit" name="download" value="Download vendor.zip" /></p>
@@ -225,7 +247,11 @@ php composer.phar install</code></pre></li>
225 <p> 247 <p>
226 Database engine: 248 Database engine:
227 <ul> 249 <ul>
228 <li><label for="sqlite">SQLite</label> <input name="db_engine" type="radio" checked="" id="sqlite" value="sqlite" /></li> 250 <li><label for="sqlite">SQLite</label> <input name="db_engine" type="radio" checked="" id="sqlite" value="sqlite" />
251 <div id="pdo_sqlite" class='messages error install'>
252 <p>You have to enable <a href="http://php.net/manual/ref.pdo-sqlite.php">pdo_sqlite extension</a>.</p>
253 </div>
254 </li>
229 <li> 255 <li>
230 <label for="mysql">MySQL</label> <input name="db_engine" type="radio" id="mysql" value="mysql" /> 256 <label for="mysql">MySQL</label> <input name="db_engine" type="radio" id="mysql" value="mysql" />
231 <ul id="mysql_infos"> 257 <ul id="mysql_infos">
@@ -241,7 +267,7 @@ php composer.phar install</code></pre></li>
241 <li><label for="pg_server">Server</label> <input type="text" placeholder="localhost" id="pg_server" name="pg_server" /></li> 267 <li><label for="pg_server">Server</label> <input type="text" placeholder="localhost" id="pg_server" name="pg_server" /></li>
242 <li><label for="pg_database">Database</label> <input type="text" placeholder="wallabag" id="pg_database" name="pg_database" /></li> 268 <li><label for="pg_database">Database</label> <input type="text" placeholder="wallabag" id="pg_database" name="pg_database" /></li>
243 <li><label for="pg_user">User</label> <input type="text" placeholder="user" id="pg_user" name="pg_user" /></li> 269 <li><label for="pg_user">User</label> <input type="text" placeholder="user" id="pg_user" name="pg_user" /></li>
244 id <li><label for="pg_password">Password</label> <input type="text" placeholder="p4ssw0rd" id="pg_password" name="pg_password" /></li> 270 <li><label for="pg_password">Password</label> <input type="text" placeholder="p4ssw0rd" id="pg_password" name="pg_password" /></li>
245 </ul> 271 </ul>
246 </li> 272 </li>
247 </ul> 273 </ul>
@@ -263,26 +289,49 @@ php composer.phar install</code></pre></li>
263 </p> 289 </p>
264 </fieldset> 290 </fieldset>
265 291
266 <input type="submit" value="Install wallabag" name="install" /> 292 <input type="submit" id="install_button" value="Install wallabag" name="install" />
267 </form> 293 </form>
268 </div> 294 </div>
269 <script> 295 <script>
270 $("#mysql_infos").hide(); 296 $("#mysql_infos").hide();
271 $("#pg_infos").hide(); 297 $("#pg_infos").hide();
298
299 <?php
300 if (!extension_loaded('pdo_sqlite')) : ?>
301 $("#install_button").hide();
302 <?php
303 else :
304 ?>
305 $("#pdo_sqlite").hide();
306 <?php
307 endif;
308 ?>
309
272 $("input[name=db_engine]").click(function() 310 $("input[name=db_engine]").click(function()
273 { 311 {
274 if ( $("#mysql").prop('checked')) { 312 if ( $("#mysql").prop('checked')) {
275 $("#mysql_infos").show(); 313 $("#mysql_infos").show();
276 $("#pg_infos").hide(); 314 $("#pg_infos").hide();
315 $("#pdo_sqlite").hide();
316 $("#install_button").show();
277 } 317 }
278 else { 318 else {
279 if ( $("#postgresql").prop('checked')) { 319 if ( $("#postgresql").prop('checked')) {
280 $("#mysql_infos").hide(); 320 $("#mysql_infos").hide();
281 $("#pg_infos").show(); 321 $("#pg_infos").show();
322 $("#pdo_sqlite").hide();
323 $("#install_button").show();
282 } 324 }
283 else { 325 else {
284 $("#mysql_infos").hide(); 326 $("#mysql_infos").hide();
285 $("#pg_infos").hide(); 327 $("#pg_infos").hide();
328 <?php
329 if (!extension_loaded('pdo_sqlite')) : ?>
330 $("#pdo_sqlite").show();
331 $("#install_button").hide();
332 <?php
333 endif;
334 ?>
286 } 335 }
287 } 336 }
288 }); 337 });
diff --git a/locale/cs_CZ.utf8/LC_MESSAGES/cs_CZ.utf8.po b/locale/cs_CZ.utf8/LC_MESSAGES/cs_CZ.utf8.po
index 8209a9cd..cf727432 100644
--- a/locale/cs_CZ.utf8/LC_MESSAGES/cs_CZ.utf8.po
+++ b/locale/cs_CZ.utf8/LC_MESSAGES/cs_CZ.utf8.po
@@ -4,54 +4,137 @@
4msgid "" 4msgid ""
5msgstr "" 5msgstr ""
6"Project-Id-Version: poche\n" 6"Project-Id-Version: poche\n"
7"POT-Creation-Date: \n" 7"Report-Msgid-Bugs-To: \n"
8"PO-Revision-Date: 2013-10-08 13:25+0100\n" 8"POT-Creation-Date: 2014-02-25 15:28+0300\n"
9"Last-Translator: Nicolas Lœuillet <nicolas.loeuillet@gmail.com>\n" 9"PO-Revision-Date: 2014-02-25 15:29+0300\n"
10"Language-Team: Czech (http://www.transifex.com/projects/p/poche/language/" 10"Last-Translator: Maryana <mariroz@mr.lviv.ua>\n"
11"cs/)\n" 11"Language-Team: Czech (http://www.transifex.com/projects/p/poche/language/cs/)\n"
12"Language: cs\n"
12"MIME-Version: 1.0\n" 13"MIME-Version: 1.0\n"
13"Content-Type: text/plain; charset=UTF-8\n" 14"Content-Type: text/plain; charset=UTF-8\n"
14"Content-Transfer-Encoding: 8bit\n" 15"Content-Transfer-Encoding: 8bit\n"
15"Language: cs\n"
16"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" 16"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
17"X-Generator: Poedit 1.5.4\n" 17"X-Generator: Poedit 1.5.4\n"
18"X-Poedit-Language: Czech\n"
19"X-Poedit-Basepath: .\n"
20"X-Poedit-SearchPath-0: /home/mariroz/_DEV/web/wallabag/wallabag-master-testing\n"
21
22msgid "wallabag, a read it later open source system"
23msgstr ""
24
25msgid "login failed: user doesn't exist"
26msgstr ""
27
28msgid "return home"
29msgstr ""
18 30
19msgid "config" 31msgid "config"
20msgstr "nastavení" 32msgstr "nastavení"
21 33
22msgid "Poching a link" 34msgid "Saving articles"
23msgstr "Odkaz se ukládá" 35msgstr ""
36
37msgid "There are several ways to save an article:"
38msgstr ""
24 39
25msgid "read the documentation" 40msgid "read the documentation"
26msgstr "číst dokumentaci" 41msgstr "číst dokumentaci"
27 42
28msgid "by filling this field" 43msgid "download the extension"
44msgstr ""
45
46msgid "via F-Droid"
47msgstr ""
48
49msgid " or "
50msgstr ""
51
52msgid "via Google Play"
53msgstr ""
54
55msgid "download the application"
56msgstr ""
57
58#, fuzzy
59msgid "By filling this field"
29msgstr "vyplněním tohoto pole" 60msgstr "vyplněním tohoto pole"
30 61
31msgid "poche it!" 62msgid "bag it!"
32msgstr "uložit!" 63msgstr ""
33 64
34msgid "Updating poche" 65msgid "Bookmarklet: drag & drop this link to your bookmarks bar"
35msgstr "Poche se aktualizuje" 66msgstr ""
36 67
37msgid "your version" 68msgid "Upgrading wallabag"
38msgstr "vaše verze" 69msgstr ""
39 70
40msgid "latest stable version" 71#, fuzzy
72msgid "Installed version"
41msgstr "poslední stabilní verze" 73msgstr "poslední stabilní verze"
42 74
43msgid "a more recent stable version is available." 75#, fuzzy
76msgid "Latest stable version"
77msgstr "poslední stabilní verze"
78
79#, fuzzy
80msgid "A more recent stable version is available."
44msgstr "je k dispozici novější stabilní verze." 81msgstr "je k dispozici novější stabilní verze."
45 82
46msgid "you are up to date." 83#, fuzzy
84msgid "You are up to date."
47msgstr "je aktuální" 85msgstr "je aktuální"
48 86
49msgid "latest dev version" 87#, fuzzy
88msgid "Latest dev version"
50msgstr "poslední vývojová verze" 89msgstr "poslední vývojová verze"
51 90
52msgid "a more recent development version is available." 91#, fuzzy
92msgid "A more recent development version is available."
53msgstr "je k dispozici novější vývojová verze." 93msgstr "je k dispozici novější vývojová verze."
54 94
95msgid "Feeds"
96msgstr ""
97
98msgid "Your feed token is currently empty and must first be generated to enable feeds. Click <a href='?feed&amp;action=generate'>here to generate it</a>."
99msgstr ""
100
101msgid "Unread feed"
102msgstr ""
103
104#, fuzzy
105msgid "Favorites feed"
106msgstr "oblíbené"
107
108#, fuzzy
109msgid "Archive feed"
110msgstr "archív"
111
112msgid "Your token:"
113msgstr ""
114
115msgid "Your user id:"
116msgstr ""
117
118msgid "You can regenerate your token: <a href='?feed&amp;action=generate'>generate!</a>."
119msgstr ""
120
121#, fuzzy
122msgid "Change your theme"
123msgstr "Změnit heslo"
124
125msgid "Theme:"
126msgstr ""
127
128msgid "Update"
129msgstr "Aktualizovat"
130
131#, fuzzy
132msgid "Change your language"
133msgstr "Změnit heslo"
134
135msgid "Language:"
136msgstr ""
137
55msgid "Change your password" 138msgid "Change your password"
56msgstr "Změnit heslo" 139msgstr "Změnit heslo"
57 140
@@ -64,65 +147,68 @@ msgstr "Heslo"
64msgid "Repeat your new password:" 147msgid "Repeat your new password:"
65msgstr "Znovu nové heslo:" 148msgstr "Znovu nové heslo:"
66 149
67msgid "Update"
68msgstr "Aktualizovat"
69
70msgid "Import" 150msgid "Import"
71msgstr "Importovat" 151msgstr "Importovat"
72 152
73msgid "Please execute the import script locally, it can take a very long time." 153#, fuzzy
154msgid "Please execute the import script locally as it can take a very long time."
74msgstr "Spusťte importní skript lokálně, může to dlouho trvat." 155msgstr "Spusťte importní skript lokálně, může to dlouho trvat."
75 156
76msgid "More info in the official doc:" 157#, fuzzy
158msgid "More info in the official documentation:"
77msgstr "Více informací v oficiální dokumentaci:" 159msgstr "Více informací v oficiální dokumentaci:"
78 160
79msgid "import from Pocket" 161#, fuzzy
162msgid "Import from Pocket"
80msgstr "importovat z Pocket" 163msgstr "importovat z Pocket"
81 164
82msgid "import from Readability" 165#, php-format
166msgid "(you must have a %s file on your server)"
167msgstr ""
168
169#, fuzzy
170msgid "Import from Readability"
83msgstr "importovat z Readability" 171msgstr "importovat z Readability"
84 172
85msgid "import from Instapaper" 173#, fuzzy
174msgid "Import from Instapaper"
86msgstr "importovat z Instapaper" 175msgstr "importovat z Instapaper"
87 176
88msgid "Export your poche data" 177#, fuzzy
178msgid "Import from wallabag"
179msgstr "importovat z Readability"
180
181#, fuzzy
182msgid "Export your wallabag data"
89msgstr "Export dat" 183msgstr "Export dat"
90 184
91msgid "Click here" 185msgid "Click here"
92msgstr "Klikněte zde" 186msgstr "Klikněte zde"
93 187
94msgid "to export your poche data." 188msgid "to download your database."
95msgstr "pro export vašich dat." 189msgstr ""
96
97msgid "back to home"
98msgstr "zpět na úvod"
99 190
100msgid "installation" 191#, fuzzy
101msgstr "instalace" 192msgid "to export your wallabag data."
193msgstr "pro export vašich dat."
102 194
103msgid "install your poche" 195msgid "Cache"
104msgstr "instalovat" 196msgstr ""
105 197
106msgid "" 198msgid "to delete cache."
107"poche is still not installed. Please fill the below form to install it. "
108"Don't hesitate to <a href='http://doc.inthepoche.com'>read the documentation "
109"on poche website</a>."
110msgstr "" 199msgstr ""
111"poche ještě není nainstalováno. Pro instalaci vyplňte níže uvedený formulář. "
112"Nezapomeňte <a href='http://doc.inthepoche.com'>si přečíst dokumentaci</a> "
113"na stránkách programu."
114 200
115msgid "Login" 201msgid "You can enter multiple tags, separated by commas."
116msgstr "Jméno" 202msgstr ""
117 203
118msgid "Repeat your password" 204msgid "return to article"
119msgstr "Zopakujte heslo" 205msgstr ""
120 206
121msgid "Install" 207msgid "plop"
122msgstr "Instalovat" 208msgstr ""
123 209
124msgid "back to top" 210msgid "You can <a href='wallabag_compatibility_test.php'>check your configuration here</a>."
125msgstr "zpět na začátek" 211msgstr ""
126 212
127msgid "favoris" 213msgid "favoris"
128msgstr "oblíbené" 214msgstr "oblíbené"
@@ -151,10 +237,14 @@ msgstr "podle nadpisu"
151msgid "by title desc" 237msgid "by title desc"
152msgstr "podle nadpisu sestupně" 238msgstr "podle nadpisu sestupně"
153 239
154msgid "No link available here!" 240msgid "Tag"
155msgstr "Není k dispozici žádný odkaz!" 241msgstr ""
156 242
157msgid "toggle mark as read" 243msgid "No articles found."
244msgstr ""
245
246#, fuzzy
247msgid "Toggle mark as read"
158msgstr "označit jako přečtené" 248msgstr "označit jako přečtené"
159 249
160msgid "toggle favorite" 250msgid "toggle favorite"
@@ -166,13 +256,95 @@ msgstr "smazat"
166msgid "original" 256msgid "original"
167msgstr "originál" 257msgstr "originál"
168 258
259msgid "estimated reading time:"
260msgstr ""
261
262msgid "mark all the entries as read"
263msgstr ""
264
169msgid "results" 265msgid "results"
170msgstr "výsledky" 266msgstr "výsledky"
171 267
172msgid "tweet" 268msgid "installation"
269msgstr "instalace"
270
271#, fuzzy
272msgid "install your wallabag"
273msgstr "instalovat"
274
275#, fuzzy
276msgid "wallabag is still not installed. Please fill the below form to install it. Don't hesitate to <a href='http://doc.wallabag.org/'>read the documentation on wallabag website</a>."
277msgstr "poche ještě není nainstalováno. Pro instalaci vyplňte níže uvedený formulář. Nezapomeňte <a href='http://doc.inthepoche.com'>si přečíst dokumentaci</a> na stránkách programu."
278
279msgid "Login"
280msgstr "Jméno"
281
282msgid "Repeat your password"
283msgstr "Zopakujte heslo"
284
285msgid "Install"
286msgstr "Instalovat"
287
288#, fuzzy
289msgid "login to your wallabag"
290msgstr "přihlásit se k poche"
291
292msgid "Login to wallabag"
293msgstr ""
294
295msgid "you are in demo mode, some features may be disabled."
296msgstr "používáte ukázkový mód, některé funkce jsou zakázány."
297
298msgid "Username"
299msgstr ""
300
301msgid "Stay signed in"
302msgstr "Zůstat přihlášen(a)"
303
304msgid "(Do not check on public computers)"
305msgstr "(Nezaškrtávejte na veřejně dostupných počítačích)"
306
307msgid "Sign in"
308msgstr "Přihlásit se"
309
310msgid "favorites"
311msgstr "oblíbené"
312
313msgid "estimated reading time :"
314msgstr ""
315
316msgid "Mark all the entries as read"
317msgstr ""
318
319msgid "Return home"
320msgstr ""
321
322#, fuzzy
323msgid "Back to top"
324msgstr "zpět na začátek"
325
326#, fuzzy
327msgid "Mark as read"
328msgstr "označit jako přečtené"
329
330#, fuzzy
331msgid "Favorite"
332msgstr "oblíbené"
333
334#, fuzzy
335msgid "Toggle favorite"
336msgstr "označit jako oblíbené"
337
338#, fuzzy
339msgid "Delete"
340msgstr "smazat"
341
342#, fuzzy
343msgid "Tweet"
173msgstr "tweetnout" 344msgstr "tweetnout"
174 345
175msgid "email" 346#, fuzzy
347msgid "Email"
176msgstr "email" 348msgstr "email"
177 349
178msgid "shaarli" 350msgid "shaarli"
@@ -181,26 +353,24 @@ msgstr "shaarli"
181msgid "flattr" 353msgid "flattr"
182msgstr "flattr" 354msgstr "flattr"
183 355
184msgid "this article appears wrong?" 356#, fuzzy
357msgid "Does this article appear wrong?"
185msgstr "vypadá tento článek špatně?" 358msgstr "vypadá tento článek špatně?"
186 359
187msgid "create an issue" 360msgid "tags:"
188msgstr "odeslat požadavek" 361msgstr ""
189
190msgid "or"
191msgstr "nebo"
192 362
193msgid "contact us by mail" 363msgid "Edit tags"
194msgstr "kontaktovat e-mailem" 364msgstr ""
195 365
196msgid "plop" 366msgid "save link!"
197msgstr "" 367msgstr ""
198 368
199msgid "home" 369msgid "home"
200msgstr "domů" 370msgstr "domů"
201 371
202msgid "favorites" 372msgid "tags"
203msgstr "oblíbené" 373msgstr ""
204 374
205msgid "logout" 375msgid "logout"
206msgstr "odhlásit se" 376msgstr "odhlásit se"
@@ -211,23 +381,187 @@ msgstr "běží na"
211msgid "debug mode is on so cache is off." 381msgid "debug mode is on so cache is off."
212msgstr "je zapnut ladicí mód, proto je keš vypnuta." 382msgstr "je zapnut ladicí mód, proto je keš vypnuta."
213 383
214msgid "your poche version:" 384#, fuzzy
215msgstr "verze:" 385msgid "your wallabag version:"
386msgstr "vaše verze"
216 387
217msgid "storage:" 388msgid "storage:"
218msgstr "úložiště:" 389msgstr "úložiště:"
219 390
220msgid "login to your poche" 391msgid "save a link"
221msgstr "přihlásit se k poche" 392msgstr ""
222 393
223msgid "you are in demo mode, some features may be disabled." 394msgid "back to home"
224msgstr "používáte ukázkový mód, některé funkce jsou zak�zány." 395msgstr "zpět na �vod"
225 396
226msgid "Stay signed in" 397msgid "toggle mark as read"
227msgstr "Zůstat přihlášen(a)" 398msgstr "označit jako přečtené"
228 399
229msgid "(Do not check on public computers)" 400msgid "tweet"
230msgstr "(Nezaškrtávejte na veřejně dostupných počítačích)" 401msgstr "tweetnout"
231 402
232msgid "Sign in" 403msgid "email"
233msgstr "Přihlásit se" 404msgstr "email"
405
406msgid "this article appears wrong?"
407msgstr "vypadá tento článek špatně?"
408
409msgid "No link available here!"
410msgstr "Není k dispozici žádný odkaz!"
411
412msgid "Poching a link"
413msgstr "Odkaz se ukládá"
414
415msgid "by filling this field"
416msgstr "vyplněním tohoto pole"
417
418msgid "bookmarklet: drag & drop this link to your bookmarks bar"
419msgstr ""
420
421msgid "your version"
422msgstr "vaše verze"
423
424msgid "latest stable version"
425msgstr "poslední stabilní verze"
426
427msgid "a more recent stable version is available."
428msgstr "je k dispozici novější stabilní verze."
429
430msgid "you are up to date."
431msgstr "je aktuální"
432
433msgid "latest dev version"
434msgstr "poslední vývojová verze"
435
436msgid "a more recent development version is available."
437msgstr "je k dispozici novější vývojová verze."
438
439msgid "Please execute the import script locally, it can take a very long time."
440msgstr "Spusťte importní skript lokálně, může to dlouho trvat."
441
442#, fuzzy
443msgid "More infos in the official doc:"
444msgstr "Více informací v oficiální dokumentaci:"
445
446msgid "import from Pocket"
447msgstr "importovat z Pocket"
448
449msgid "import from Readability"
450msgstr "importovat z Readability"
451
452msgid "import from Instapaper"
453msgstr "importovat z Instapaper"
454
455msgid "Tags"
456msgstr ""
457
458#, fuzzy
459msgid "Untitled"
460msgstr "podle nadpisu"
461
462msgid "the link has been added successfully"
463msgstr ""
464
465msgid "error during insertion : the link wasn't added"
466msgstr ""
467
468msgid "the link has been deleted successfully"
469msgstr ""
470
471msgid "the link wasn't deleted"
472msgstr ""
473
474msgid "Article not found!"
475msgstr ""
476
477msgid "previous"
478msgstr ""
479
480msgid "next"
481msgstr ""
482
483msgid "in demo mode, you can't update your password"
484msgstr ""
485
486msgid "your password has been updated"
487msgstr ""
488
489msgid "the two fields have to be filled & the password must be the same in the two fields"
490msgstr ""
491
492msgid "still using the \""
493msgstr ""
494
495msgid "that theme does not seem to be installed"
496msgstr ""
497
498msgid "you have changed your theme preferences"
499msgstr ""
500
501msgid "that language does not seem to be installed"
502msgstr ""
503
504msgid "you have changed your language preferences"
505msgstr ""
506
507msgid "login failed: you have to fill all fields"
508msgstr ""
509
510msgid "welcome to your wallabag"
511msgstr ""
512
513msgid "login failed: bad login or password"
514msgstr ""
515
516#, fuzzy
517msgid "import from instapaper completed"
518msgstr "importovat z Instapaper"
519
520#, fuzzy
521msgid "import from pocket completed"
522msgstr "importovat z Pocket"
523
524#, fuzzy
525msgid "import from Readability completed. "
526msgstr "importovat z Readability"
527
528#, fuzzy
529msgid "import from Poche completed. "
530msgstr "importovat z Pocket"
531
532msgid "Unknown import provider."
533msgstr ""
534
535msgid "Incomplete inc/poche/define.inc.php file, please define \""
536msgstr ""
537
538msgid "Could not find required \""
539msgstr ""
540
541msgid "Uh, there is a problem while generating feeds."
542msgstr ""
543
544#, fuzzy
545msgid "Cache deleted."
546msgstr "smazat"
547
548msgid "Oops, it seems you don't have PHP 5."
549msgstr ""
550
551#~ msgid "poche it!"
552#~ msgstr "uložit!"
553
554#~ msgid "Updating poche"
555#~ msgstr "Poche se aktualizuje"
556
557#~ msgid "create an issue"
558#~ msgstr "odeslat požadavek"
559
560#~ msgid "or"
561#~ msgstr "nebo"
562
563#~ msgid "contact us by mail"
564#~ msgstr "kontaktovat e-mailem"
565
566#~ msgid "your poche version:"
567#~ msgstr "verze:"
diff --git a/locale/de_DE.utf8/LC_MESSAGES/de_DE.utf8.mo b/locale/de_DE.utf8/LC_MESSAGES/de_DE.utf8.mo
index 375e923f..bd18817f 100644
--- a/locale/de_DE.utf8/LC_MESSAGES/de_DE.utf8.mo
+++ b/locale/de_DE.utf8/LC_MESSAGES/de_DE.utf8.mo
Binary files differ
diff --git a/locale/de_DE.utf8/LC_MESSAGES/de_DE.utf8.po b/locale/de_DE.utf8/LC_MESSAGES/de_DE.utf8.po
index 5b30d3d7..8b82721d 100644
--- a/locale/de_DE.utf8/LC_MESSAGES/de_DE.utf8.po
+++ b/locale/de_DE.utf8/LC_MESSAGES/de_DE.utf8.po
@@ -1,51 +1,130 @@
1msgid "" 1msgid ""
2msgstr "" 2msgstr ""
3"Project-Id-Version: \n" 3"Project-Id-Version: Wallabag\n"
4"POT-Creation-Date: \n" 4"Report-Msgid-Bugs-To: \n"
5"POT-Creation-Date: 2014-03-27 13:41+0100\n"
5"PO-Revision-Date: \n" 6"PO-Revision-Date: \n"
6"Last-Translator: Square252\n" 7"Last-Translator: Kevin Meyer <wallabag@kevin-meyer.de>\n"
7"Language-Team: \n" 8"Language-Team: \n"
9"Language: de\n"
8"MIME-Version: 1.0\n" 10"MIME-Version: 1.0\n"
9"Content-Type: text/plain; charset=UTF-8\n" 11"Content-Type: text/plain; charset=UTF-8\n"
10"Content-Transfer-Encoding: 8bit\n" 12"Content-Transfer-Encoding: 8bit\n"
11"X-Generator: Poedit 1.5.7\n" 13"X-Generator: Poedit 1.6.4\n"
14"X-Poedit-Basepath: .\n"
15"X-Poedit-SearchPath-0: /Users/kevinmeyer/Dropbox/dev_web/wallabag-dev\n"
12 16
13msgid "config" 17msgid "config"
14msgstr "Konfiguration" 18msgstr "Konfiguration"
15 19
16msgid "Poching a link" 20msgid "Saving articles"
17msgstr "Poche einen Link" 21msgstr "Artikel speichern"
22
23msgid "There are several ways to save an article:"
24msgstr "Es gibt viele Methoden um Artikel zu speichern:"
18 25
19msgid "read the documentation" 26msgid "read the documentation"
20msgstr "Die Dokumentation lesen" 27msgstr "Die Dokumentation lesen"
21 28
22msgid "by filling this field" 29msgid "download the extension"
23msgstr "durch das ausfüllen dieses Feldes:" 30msgstr "installiere die Erweiterung"
31
32msgid "via F-Droid"
33msgstr "via F-Droid"
34
35msgid " or "
36msgstr " oder "
37
38msgid "via Google Play"
39msgstr "via Google Play"
40
41msgid "download the application"
42msgstr "lade die App"
43
44msgid "By filling this field"
45msgstr "Durch Ausfüllen dieses Feldes"
24 46
25msgid "poche it!" 47msgid "bag it!"
26msgstr "Poche es!" 48msgstr "bag it!"
27 49
28msgid "Updating poche" 50msgid "Bookmarklet: drag & drop this link to your bookmarks bar"
29msgstr "Poche aktualisieren" 51msgstr "Bookmarklet: Ziehe diesen Link in deine Lesezeichen-Leiste"
30 52
31msgid "your version" 53msgid "Upgrading wallabag"
32msgstr "Deine Version" 54msgstr "wallabag aktualisieren"
33 55
34msgid "latest stable version" 56msgid "Installed version"
57msgstr "Installierte Version"
58
59msgid "Latest stable version"
35msgstr "Neuste stabile Version" 60msgstr "Neuste stabile Version"
36 61
37msgid "a more recent stable version is available." 62msgid "A more recent stable version is available."
38msgstr "Eine neuere stabile Version ist verfügbar." 63msgstr "Eine neuere stabile Version ist verfügbar."
39 64
40msgid "you are up to date." 65msgid "You are up to date."
41msgstr "Du bist auf den neuesten Stand." 66msgstr "Du bist auf den neuesten Stand."
42 67
43msgid "latest dev version" 68msgid "Last check:"
69msgstr "Zuletzt geprüft:"
70
71msgid "Latest dev version"
44msgstr "Neuste Entwicklungsversion" 72msgstr "Neuste Entwicklungsversion"
45 73
46msgid "a more recent development version is available." 74msgid "A more recent development version is available."
47msgstr "Eine neuere Entwicklungsversion ist verfügbar." 75msgstr "Eine neuere Entwicklungsversion ist verfügbar."
48 76
77msgid "You can clear cache to check the latest release."
78msgstr "Leere den Cache um die neueste Version zu prüfen."
79
80msgid "Feeds"
81msgstr "Feeds"
82
83msgid ""
84"Your feed token is currently empty and must first be generated to enable "
85"feeds. Click <a href='?feed&amp;action=generate'>here to generate it</a>."
86msgstr ""
87"Dein Feed Token ist noch nicht vorhanden und muss zunächst generiert werden, "
88"um deine Feeds zu aktivieren. Klicke <a href='?feed&amp;"
89"action=generate'>hier um ihn zu generieren</a>."
90
91msgid "Unread feed"
92msgstr "Ungelesen Feed"
93
94msgid "Favorites feed"
95msgstr "Favoriten Feed"
96
97msgid "Archive feed"
98msgstr "Archiv Feed"
99
100msgid "Your token:"
101msgstr "Dein Token:"
102
103msgid "Your user id:"
104msgstr "Deine User ID:"
105
106msgid ""
107"You can regenerate your token: <a href='?feed&amp;action=generate'>generate!"
108"</a>."
109msgstr ""
110"Hier kannst du dein Token erzeugen: <a href='?feed&amp;"
111"action=generate'>Generieren!</a>."
112
113msgid "Change your theme"
114msgstr "Theme ändern"
115
116msgid "Theme:"
117msgstr "Theme:"
118
119msgid "Update"
120msgstr "Aktualisieren"
121
122msgid "Change your language"
123msgstr "Sprache ändern"
124
125msgid "Language:"
126msgstr "Sprache:"
127
49msgid "Change your password" 128msgid "Change your password"
50msgstr "Passwort ändern" 129msgstr "Passwort ändern"
51 130
@@ -58,75 +137,86 @@ msgstr "Passwort"
58msgid "Repeat your new password:" 137msgid "Repeat your new password:"
59msgstr "Neues Passwort wiederholen:" 138msgstr "Neues Passwort wiederholen:"
60 139
61msgid "Update"
62msgstr "Aktualisieren"
63
64msgid "Import" 140msgid "Import"
65msgstr "Import" 141msgstr "Import"
66 142
67msgid "Please execute the import script locally, it can take a very long time." 143msgid ""
68msgstr "Bitte führe das Import Script lokal aus, dies kann eine Weile dauern." 144"Importing from other services can be quite long, and webservers default "
145"configuration often prevents long scripts execution time, so it must be done "
146"in multiple parts."
147msgstr ""
148"Der Import von anderen Diensten kann sehr lange dauern. Deswegen bricht der "
149"Webserver diesen in vielen Konfigurationen ab. Daher muss der Import in "
150"mehrere Teile aufgeteilt werden."
151
152msgid "First, select the export file on your computer and upload it."
153msgstr "Wähle eine Datei von deinem Computer aus und lade sie hoch."
154
155msgid "File:"
156msgstr "Datei:"
157
158msgid "Upload"
159msgstr "Hochladen"
69 160
70msgid "More info in the official doc:" 161msgid "Then, click on the right link below."
71msgstr "Mehr Informationen in der offiziellen Dokumentation:" 162msgstr "Klicke dann unten auf den entsprechenden Link."
72 163
73msgid "import from Pocket" 164msgid "Import from Pocket"
74msgstr "Import aus Pocket" 165msgstr "Import aus Pocket"
75 166
76msgid "import from Readability" 167#, php-format
168msgid "(after uploaded %s file)"
169msgstr "(nach Upload der Datei %s)"
170
171msgid "Import from Readability"
77msgstr "Import aus Readability" 172msgstr "Import aus Readability"
78 173
79msgid "import from Instapaper" 174msgid "Import from Instapaper"
80msgstr "Import aus Instapaper" 175msgstr "Import aus Instapaper"
81 176
82msgid "Export your poche data" 177msgid "Import from wallabag"
83msgstr "Exportieren Sie Ihre Poche Daten." 178msgstr "Import aus Readability"
84
85msgid "Click here"
86msgstr "Klicke hier"
87 179
88msgid "to export your poche data." 180msgid ""
89msgstr "um deine Daten aus Poche zu exportieren." 181"3. Your feed token is currently empty and must first be generated to fetch "
182"content. Click <a href='?feed&amp;action=generate'>here to generate it</a>."
183msgstr ""
184"3. Dein Feed Token ist noch nicht vorhanden und muss zunächst generiert "
185"werden, um Inhalt abrufen zu können. Klicke <a href='?feed&amp;"
186"action=generate'>hier um ihn zu generieren</a>."
90 187
91msgid "back to home" 188msgid "Finally, you have to fetch content for imported items."
92msgstr "züruck zur Hauptseite" 189msgstr "Jetzt musst du den Inhalt der importierten Artikel abrufen."
93 190
94msgid "installation" 191msgid "Click here"
95msgstr "Installieren" 192msgstr "Klicke hier"
96 193
97msgid "install your poche" 194msgid "to fetch content for 10 articles"
98msgstr "Installiere dein Poche" 195msgstr "um den Inhalt von 10 Artikeln abzurufen"
99 196
100msgid "" 197msgid ""
101"poche is still not installed. Please fill the below form to install it. " 198"If you have console access to your server, you can also create a cron task:"
102"Don't hesitate to <a href='http://doc.inthepoche.com'>read the documentation "
103"on poche website</a>."
104msgstr "" 199msgstr ""
105"Poche ist noch nicht installiert. Bitte fülle die Felder unten aus, um die " 200"Wenn du Konsolenzugang zu deinem Server hast kannst du auch einen cron "
106"Installation durchzuführen. Zögere nicht, <a href='http://inthepoche.com/" 201"erstellen:"
107"doc'>die Dokumentation auf der Website von Poche zu lesen falls du Probleme "
108"haben solltest."
109 202
110msgid "Login" 203msgid "Export your wallabag data"
111msgstr "Benutzername" 204msgstr "Exportieren deine wallabag Daten"
112 205
113msgid "Repeat your password" 206msgid "to download your database."
114msgstr "Wiederhole dein Passwort" 207msgstr "um deine Datenbank herunterzuladen"
115 208
116msgid "Install" 209msgid "to export your wallabag data."
117msgstr "Installieren" 210msgstr "um deine Daten aus wallabag zu exportieren."
118 211
119msgid "back to top" 212msgid "Cache"
120msgstr "Nach Oben" 213msgstr "Cache"
121 214
122msgid "favoris" 215msgid "to delete cache."
123msgstr "" 216msgstr "um den Cache zu löschen."
124
125msgid "archive"
126msgstr "Archiv"
127 217
128msgid "unread" 218msgid "Tags"
129msgstr "ungelesen" 219msgstr "Tags"
130 220
131msgid "by date asc" 221msgid "by date asc"
132msgstr "nach Datum aufsteigend" 222msgstr "nach Datum aufsteigend"
@@ -146,10 +236,72 @@ msgstr "nach Titel"
146msgid "by title desc" 236msgid "by title desc"
147msgstr "nach Titel absteigend" 237msgstr "nach Titel absteigend"
148 238
149msgid "No link available here!" 239#, fuzzy
150msgstr "Kein Link verfügbar!" 240msgid "toggle view mode"
241msgstr "Favorit"
242
243msgid "home"
244msgstr "Start"
245
246msgid "favorites"
247msgstr "Favoriten"
248
249msgid "archive"
250msgstr "Archiv"
251
252msgid "tags"
253msgstr "Tags"
254
255msgid "save a link"
256msgstr "Speichere einen Link"
257
258msgid "search"
259msgstr "Suche"
260
261msgid "logout"
262msgstr "Logout"
263
264msgid "return home"
265msgstr "Zurück zum Start"
266
267#, fuzzy
268msgid "Search"
269msgstr "Archiv"
270
271msgid "powered by"
272msgstr "bereitgestellt von"
273
274msgid "debug mode is on so cache is off."
275msgstr "Debug Modus ist aktiviert, das Caching ist somit deaktiviert"
276
277msgid "your wallabag version:"
278msgstr "Deine wallabag Version"
279
280msgid "storage:"
281msgstr "Speicher:"
282
283msgid "Save a link"
284msgstr "Speichere einen Link"
285
286msgid "save link!"
287msgstr "Link speichern!"
288
289msgid "unread"
290msgstr "ungelesen"
291
292msgid "Tag"
293msgstr "Tag"
294
295msgid "No articles found."
296msgstr "Keine Artikel gefunden."
151 297
152msgid "toggle mark as read" 298msgid "estimated reading time:"
299msgstr "geschätzte Lesezeit:"
300
301msgid "estimated reading time :"
302msgstr "geschätzte Lesezeit:"
303
304msgid "Toggle mark as read"
153msgstr "Als gelesen markieren" 305msgstr "Als gelesen markieren"
154 306
155msgid "toggle favorite" 307msgid "toggle favorite"
@@ -161,69 +313,346 @@ msgstr "Löschen"
161msgid "original" 313msgid "original"
162msgstr "Original" 314msgstr "Original"
163 315
316msgid "Mark all the entries as read"
317msgstr "Markiere alle als gelesen"
318
164msgid "results" 319msgid "results"
165msgstr "Ergebnisse" 320msgstr "Ergebnisse"
166 321
167msgid "tweet" 322msgid "Uh, there is a problem with the cron."
168msgstr "Twittern" 323msgstr "Oh, es gab ein Problem mit dem cron."
169 324
170msgid "email" 325msgid "Untitled"
171msgstr "senden per E-Mail" 326msgstr "Ohne Titel"
172 327
173msgid "shaarli" 328msgid "the link has been added successfully"
174msgstr "Shaarli" 329msgstr "Speichern des Links erfolgreich"
175 330
176msgid "flattr" 331msgid "error during insertion : the link wasn't added"
177msgstr "flattr" 332msgstr "Fehler beim Einfügen: Der Link wurde nicht hinzugefügt"
178 333
179msgid "this article appears wrong?" 334msgid "the link has been deleted successfully"
180msgstr "dieser Artikel erscheint falsch?" 335msgstr "Löschen des Links erfolgreich"
181 336
182msgid "create an issue" 337msgid "the link wasn't deleted"
183msgstr "ein Ticket erstellen" 338msgstr "Der Link wurde nicht entfernt"
184 339
185msgid "or" 340msgid "Article not found!"
186msgstr "oder" 341msgstr "Artikel nicht gefunden!"
187 342
188msgid "contact us by mail" 343msgid "previous"
189msgstr "kontaktieren Sie uns per E-Mail" 344msgstr "vorherige"
190 345
191msgid "plop" 346msgid "next"
192msgstr "plop" 347msgstr "nächste"
193 348
194msgid "home" 349msgid "in demo mode, you can't update your password"
195msgstr "Start" 350msgstr "im Demo-Modus kann das Passwort nicht geändert werden"
196 351
197msgid "favorites" 352msgid "your password has been updated"
198msgstr "Favoriten" 353msgstr "Dein Passwort wurde geändert"
199 354
200msgid "logout" 355msgid ""
201msgstr "Logout" 356"the two fields have to be filled & the password must be the same in the two "
357"fields"
358msgstr "Beide Felder müssen mit selbem Inhalt ausgefüllt sein"
202 359
203msgid "powered by" 360msgid "still using the \""
204msgstr "bereitgestellt von" 361msgstr "nutze immernoch die \""
205 362
206msgid "debug mode is on so cache is off." 363msgid "that theme does not seem to be installed"
207msgstr "Debug Modus ist aktiviert, das Caching ist somit deaktiviert" 364msgstr "dieses Theme scheint nicht installiert zu sein"
208 365
209msgid "your poche version:" 366msgid "you have changed your theme preferences"
210msgstr "Deine Poche Version" 367msgstr "Du hast deine Theme Einstellungen geändert"
211 368
212msgid "storage:" 369msgid "that language does not seem to be installed"
213msgstr "Speicher:" 370msgstr "Diese Sprache scheint nicht installiert zu sein"
371
372msgid "you have changed your language preferences"
373msgstr "Du hast deine Spracheinstellungen geändert"
374
375msgid "login failed: you have to fill all fields"
376msgstr "Anmeldung fehlgeschlagen: Alle Felder müssen ausgefüllt werden"
377
378msgid "welcome to your wallabag"
379msgstr "Willkommen bei deiner wallabag"
380
381msgid "login failed: bad login or password"
382msgstr "Anmeldung fehlgeschlagen: Falscher Benutzername oder Passwort"
383
384msgid ""
385"import from instapaper completed. You have to execute the cron to fetch "
386"content."
387msgstr ""
388"Import aus Instapaper vollständig. Führe den cronjob aus um den Inhalt "
389"abzurufen."
390
391msgid ""
392"import from pocket completed. You have to execute the cron to fetch content."
393msgstr ""
394"Import aus Pocket vollständig. Führe den cronjob aus um den Inhalt abzurufen."
214 395
215msgid "login to your poche" 396msgid ""
216msgstr "Bei Poche anmelden" 397"import from Readability completed. You have to execute the cron to fetch "
398"content."
399msgstr ""
400"Import aus Readability vollständig. Führe den cronjob aus um den Inhalt "
401"abzurufen."
217 402
218msgid "you are in demo mode, some features may be disabled." 403msgid ""
404"import from Poche completed. You have to execute the cron to fetch content."
219msgstr "" 405msgstr ""
220"Du befindest dich im Demomodus, einige Funktionen könnten deaktiviert sein." 406"Import aus Poche vollständig. Führe den cronjob aus um den Inhalt abzurufen."
407
408msgid "Unknown import provider."
409msgstr "Unbekannter Import Anbieter."
410
411msgid "Could not find required \""
412msgstr "Nicht gefunden: \""
413
414msgid "File uploaded. You can now execute import."
415msgstr "Datei hochgeladen. Du kannst nun importieren."
416
417msgid "Error while importing file. Do you have access to upload it?"
418msgstr "Fehler beim Importieren. Hast du das Recht zum Hochladen?"
419
420msgid "User with this id ("
421msgstr "Nutzer mit dieser id ("
422
423msgid "Uh, there is a problem while generating feeds."
424msgstr "Oh, es gab ein Problem beim Erstellen des Feeds."
425
426msgid "Cache deleted."
427msgstr "Cache gelöscht"
428
429msgid "Oops, it seems you don't have PHP 5."
430msgstr "Oops, es scheint als würde PHP 5 fehlen."
431
432msgid "wallabag, a read it later open source system"
433msgstr "wallabag, ein Später-Lesen Open Source System"
434
435msgid "login failed: user doesn't exist"
436msgstr "Anmeldung fehlgeschlagen: Benutzer existiert nicht"
437
438#~ msgid "You can enter multiple tags, separated by commas."
439#~ msgstr "Du kannst mehrere Tags, durch Kommata getrennt, eingeben."
440
441#~ msgid "return to article"
442#~ msgstr "zurück zum Artikel"
443
444#, fuzzy
445#~ msgid "favoris"
446#~ msgstr "Favoriten"
447
448#~ msgid "mark all the entries as read"
449#~ msgstr "Markiere alle als gelesen"
450
451#~ msgid "Back to top"
452#~ msgstr "Nach Oben"
453
454#~ msgid "Mark as read"
455#~ msgstr "Als gelesen markieren"
456
457#~ msgid "Favorite"
458#~ msgstr "Favoriten"
459
460#~ msgid "Toggle favorite"
461#~ msgstr "Favorit"
462
463#~ msgid "Delete"
464#~ msgstr "Löschen"
465
466#~ msgid "Tweet"
467#~ msgstr "Twittern"
468
469#~ msgid "Email"
470#~ msgstr "per E-Mail senden"
471
472#~ msgid "shaarli"
473#~ msgstr "Shaarli"
474
475#~ msgid "flattr"
476#~ msgstr "flattr"
477
478#~ msgid "Does this article appear wrong?"
479#~ msgstr "Erscheint dieser Artikel falsch?"
480
481#~ msgid "Edit tags"
482#~ msgstr "Tags bearbeiten"
483
484#~ msgid "Start typing for auto complete."
485#~ msgstr "Beginne zu tippen für die Autovervollständigung."
486
487#~ msgid "Return home"
488#~ msgstr "Zurück zum Start"
489
490#~ msgid "tags:"
491#~ msgstr "Tags:"
492
493#~ msgid "login to your wallabag"
494#~ msgstr "Bei wallabag anmelden"
495
496#~ msgid "you are in demo mode, some features may be disabled."
497#~ msgstr ""
498#~ "Du befindest dich im Demomodus, einige Funktionen könnten deaktiviert "
499#~ "sein."
500
501#~ msgid "Login"
502#~ msgstr "Benutzername"
503
504#~ msgid "Stay signed in"
505#~ msgstr "Angemeldet bleiben"
506
507#~ msgid "(Do not check on public computers)"
508#~ msgstr "(nicht auf einem öffentlichen Computer anhaken)"
509
510#~ msgid "plop"
511#~ msgstr "plop"
512
513#~ msgid "Login to wallabag"
514#~ msgstr "Bei wallabag anmelden"
515
516#~ msgid "Username"
517#~ msgstr "Benutzername"
518
519#~ msgid "Sign in"
520#~ msgstr "Einloggen"
521
522#~ msgid "Enter your search here"
523#~ msgstr "Gib hier deine Suchanfrage ein"
524
525#~ msgid "installation"
526#~ msgstr "Installieren"
527
528#~ msgid "install your wallabag"
529#~ msgstr "Installiere deine wallabag"
530
531#~ msgid ""
532#~ "wallabag is still not installed. Please fill the below form to install "
533#~ "it. Don't hesitate to <a href='http://doc.wallabag.org/'>read the "
534#~ "documentation on wallabag website</a>."
535#~ msgstr ""
536#~ "wallabag ist noch nicht installiert. Bitte fülle die Felder unten aus, um "
537#~ "die Installation durchzuführen. Zögere nicht, <a href='http://doc."
538#~ "wallabag.org/'>die Dokumentation auf der Website von wallabag zu lesen, "
539#~ "falls du Probleme haben solltest."
540
541#~ msgid "Repeat your password"
542#~ msgstr "Wiederhole dein Passwort"
543
544#~ msgid "Install"
545#~ msgstr "Installieren"
546
547#~ msgid "No link available here!"
548#~ msgstr "Kein Link verfügbar!"
549
550#~ msgid "toggle mark as read"
551#~ msgstr "Als gelesen markieren"
552
553#~ msgid ""
554#~ "You can <a href='wallabag_compatibility_test.php'>check your "
555#~ "configuration here</a>."
556#~ msgstr ""
557#~ "Du kannst deine Konfiguration <a href='wallabag_compatibility_test."
558#~ "php'>hier testen</a>."
559
560#~ msgid "back to home"
561#~ msgstr "züruck zur Hauptseite"
562
563#~ msgid "tweet"
564#~ msgstr "Twittern"
565
566#~ msgid "email"
567#~ msgstr "senden per E-Mail"
568
569#~ msgid "this article appears wrong?"
570#~ msgstr "dieser Artikel erscheint falsch?"
571
572#~ msgid "Poching a link"
573#~ msgstr "Poche einen Link"
574
575#~ msgid "by filling this field"
576#~ msgstr "durch das ausfüllen dieses Feldes:"
577
578#~ msgid "bookmarklet: drag & drop this link to your bookmarks bar"
579#~ msgstr "Bookmarklet: Ziehe diesen Link in deine Lesezeichen-Leiste"
580
581#~ msgid "your version"
582#~ msgstr "Deine Version"
583
584#~ msgid "latest stable version"
585#~ msgstr "Neuste stabile Version"
586
587#~ msgid "a more recent stable version is available."
588#~ msgstr "Eine neuere stabile Version ist verfügbar."
589
590#~ msgid "you are up to date."
591#~ msgstr "Du bist auf den neuesten Stand."
592
593#~ msgid "latest dev version"
594#~ msgstr "Neuste Entwicklungsversion"
595
596#~ msgid "a more recent development version is available."
597#~ msgstr "Eine neuere Entwicklungsversion ist verfügbar."
598
599#~ msgid ""
600#~ "Please execute the import script locally, it can take a very long time."
601#~ msgstr ""
602#~ "Bitte führe das Import Script lokal aus, dies kann eine Weile dauern."
603
604#~ msgid "More infos in the official doc:"
605#~ msgstr "Mehr Informationen in der offiziellen Dokumentation:"
606
607#~ msgid "import from Pocket"
608#~ msgstr "Import aus Pocket"
609
610#~ msgid "(you must have a %s file on your server)"
611#~ msgstr "(du brauchst eine %s Datei auf deinem Server)"
612
613#~ msgid "import from Readability"
614#~ msgstr "Import aus Readability"
615
616#~ msgid "import from Instapaper"
617#~ msgstr "Import aus Instapaper"
618
619#~ msgid "You can also create a cron task:"
620#~ msgstr "Du kannst auch einen cronjob anlegen:"
621
622#~ msgid ""
623#~ "Please execute the import script locally as it can take a very long time."
624#~ msgstr ""
625#~ "Bitte führe das Import Script lokal aus, da dies eine Weile dauern kann."
626
627#~ msgid "More info in the official documentation:"
628#~ msgstr "Mehr Informationen in der offiziellen Dokumentation:"
629
630#~ msgid "import from instapaper completed"
631#~ msgstr "Import aus Instapaper erfolgreich"
632
633#~ msgid "import from pocket completed"
634#~ msgstr "Import aus Pocket erfolgreich"
635
636#~ msgid "import from Poche completed. "
637#~ msgstr "Import aus Poche erfolgreich"
638
639#~ msgid "Incomplete inc/poche/define.inc.php file, please define \""
640#~ msgstr "Unvollständige inc/poche/define.inc.php Datei, bitte setze \""
641
642#~ msgid "poche it!"
643#~ msgstr "Poche es!"
644
645#~ msgid "Updating poche"
646#~ msgstr "Poche aktualisieren"
647
648#~ msgid "create an issue"
649#~ msgstr "ein Ticket erstellen"
221 650
222msgid "Stay signed in" 651#~ msgid "or"
223msgstr "Angemeldet bleiben" 652#~ msgstr "oder"
224 653
225msgid "(Do not check on public computers)" 654#~ msgid "contact us by mail"
226msgstr "(nicht auf einem öffentlichen Computer anhaken)" 655#~ msgstr "kontaktieren Sie uns per E-Mail"
227 656
228msgid "Sign in" 657#~ msgid "your poche version:"
229msgstr "Einloggen" 658#~ msgstr "Deine Poche Version"
diff --git a/locale/en_EN.utf8/LC_MESSAGES/en_EN.utf8.mo b/locale/en_EN.utf8/LC_MESSAGES/en_EN.utf8.mo
index 83d0a85f..bf5f69e7 100644
--- a/locale/en_EN.utf8/LC_MESSAGES/en_EN.utf8.mo
+++ b/locale/en_EN.utf8/LC_MESSAGES/en_EN.utf8.mo
Binary files differ
diff --git a/locale/en_EN.utf8/LC_MESSAGES/en_EN.utf8.po b/locale/en_EN.utf8/LC_MESSAGES/en_EN.utf8.po
index b78759f5..119fb060 100644
--- a/locale/en_EN.utf8/LC_MESSAGES/en_EN.utf8.po
+++ b/locale/en_EN.utf8/LC_MESSAGES/en_EN.utf8.po
@@ -1,50 +1,124 @@
1msgid "" 1msgid ""
2msgstr "" 2msgstr ""
3"Project-Id-Version: \n" 3"Project-Id-Version: \n"
4"POT-Creation-Date: \n" 4"Report-Msgid-Bugs-To: \n"
5"POT-Creation-Date: 2014-02-25 15:17+0300\n"
5"PO-Revision-Date: \n" 6"PO-Revision-Date: \n"
6"Last-Translator: Nicolas Lœuillet <nicolas.loeuillet@gmail.com>\n" 7"Last-Translator: Maryana <mariroz@mr.lviv.ua>\n"
7"Language-Team: \n" 8"Language-Team: \n"
9"Language: \n"
8"MIME-Version: 1.0\n" 10"MIME-Version: 1.0\n"
9"Content-Type: text/plain; charset=UTF-8\n" 11"Content-Type: text/plain; charset=UTF-8\n"
10"Content-Transfer-Encoding: 8bit\n" 12"Content-Transfer-Encoding: 8bit\n"
11"X-Generator: Poedit 1.5.4\n" 13"X-Generator: Poedit 1.5.4\n"
14"X-Poedit-Language: English\n"
15"X-Poedit-Basepath: .\n"
16"X-Poedit-SearchPath-0: /home/mariroz/_DEV/web/wallabag/wallabag-master-testing\n"
17
18msgid "wallabag, a read it later open source system"
19msgstr "wallabag, a read it later open source system"
20
21msgid "login failed: user doesn't exist"
22msgstr "login failed: user doesn't exist"
23
24msgid "return home"
25msgstr "return home"
12 26
13msgid "config" 27msgid "config"
14msgstr "config" 28msgstr "config"
15 29
16msgid "Poching a link" 30msgid "Saving articles"
17msgstr "Poching a link" 31msgstr "Saving articles"
32
33msgid "There are several ways to save an article:"
34msgstr "There are several ways to save an article:"
18 35
19msgid "read the documentation" 36msgid "read the documentation"
20msgstr "read the documentation" 37msgstr "read the documentation"
21 38
22msgid "by filling this field" 39msgid "download the extension"
23msgstr "by filling this field" 40msgstr "download the extension"
24 41
25msgid "poche it!" 42msgid "via F-Droid"
26msgstr "poche it!" 43msgstr "via F-Droid"
27 44
28msgid "Updating poche" 45msgid " or "
29msgstr "Updating poche" 46msgstr " or "
30 47
31msgid "your version" 48msgid "via Google Play"
32msgstr "your version" 49msgstr "via Google Play"
33 50
34msgid "latest stable version" 51msgid "download the application"
35msgstr "latest stable version" 52msgstr "download the application"
36 53
37msgid "a more recent stable version is available." 54msgid "By filling this field"
38msgstr "a more recent stable version is available." 55msgstr "By filling this field"
39 56
40msgid "you are up to date." 57msgid "bag it!"
41msgstr "you are up to date." 58msgstr "bag it!"
42 59
43msgid "latest dev version" 60msgid "Bookmarklet: drag & drop this link to your bookmarks bar"
44msgstr "latest dev version" 61msgstr "Bookmarklet: drag & drop this link to your bookmarks bar"
45 62
46msgid "a more recent development version is available." 63msgid "Upgrading wallabag"
47msgstr "a more recent development version is available." 64msgstr "Upgrading wallabag"
65
66msgid "Installed version"
67msgstr "Installed version"
68
69msgid "Latest stable version"
70msgstr "Latest stable version"
71
72msgid "A more recent stable version is available."
73msgstr "A more recent stable version is available."
74
75msgid "You are up to date."
76msgstr "You are up to date."
77
78msgid "Latest dev version"
79msgstr "Latest dev version"
80
81msgid "A more recent development version is available."
82msgstr "A more recent development version is available."
83
84msgid "Feeds"
85msgstr "Feeds"
86
87msgid "Your feed token is currently empty and must first be generated to enable feeds. Click <a href='?feed&amp;action=generate'>here to generate it</a>."
88msgstr "Your feed token is currently empty and must first be generated to enable feeds. Click <a href='?feed&amp;action=generate'>here to generate it</a>."
89
90msgid "Unread feed"
91msgstr "Unread feed"
92
93msgid "Favorites feed"
94msgstr "Favorites feed"
95
96msgid "Archive feed"
97msgstr "Archive feed"
98
99msgid "Your token:"
100msgstr "Your token:"
101
102msgid "Your user id:"
103msgstr "Your user id:"
104
105msgid "You can regenerate your token: <a href='?feed&amp;action=generate'>generate!</a>."
106msgstr "You can regenerate your token: <a href='?feed&amp;action=generate'>generate!</a>."
107
108msgid "Change your theme"
109msgstr "Change your theme"
110
111msgid "Theme:"
112msgstr "Theme:"
113
114msgid "Update"
115msgstr "Update"
116
117msgid "Change your language"
118msgstr "Change your language"
119
120msgid "Language:"
121msgstr "Language:"
48 122
49msgid "Change your password" 123msgid "Change your password"
50msgstr "Change your password" 124msgstr "Change your password"
@@ -58,66 +132,60 @@ msgstr "Password"
58msgid "Repeat your new password:" 132msgid "Repeat your new password:"
59msgstr "Repeat your new password:" 133msgstr "Repeat your new password:"
60 134
61msgid "Update"
62msgstr "Update"
63
64msgid "Import" 135msgid "Import"
65msgstr "Import" 136msgstr "Import"
66 137
67msgid "Please execute the import script locally, it can take a very long time." 138msgid "Please execute the import script locally as it can take a very long time."
68msgstr "" 139msgstr "Please execute the import script locally as it can take a very long time."
69"Please execute the import script locally, it can take a very long time."
70 140
71msgid "More info in the official doc:" 141msgid "More info in the official documentation:"
72msgstr "More info in the official doc:" 142msgstr "More info in the official documentation:"
73 143
74msgid "import from Pocket" 144msgid "Import from Pocket"
75msgstr "import from Pocket" 145msgstr "Import from Pocket"
76 146
77msgid "import from Readability" 147#, php-format
78msgstr "import from Readability" 148msgid "(you must have a %s file on your server)"
149msgstr "(you must have a %s file on your server)"
79 150
80msgid "import from Instapaper" 151msgid "Import from Readability"
81msgstr "import from Instapaper" 152msgstr "Import from Readability"
153
154msgid "Import from Instapaper"
155msgstr "Import from Instapaper"
82 156
83msgid "Export your poche data" 157msgid "Import from wallabag"
84msgstr "Export your poche data" 158msgstr "Import from wallabag"
159
160msgid "Export your wallabag data"
161msgstr "Export your wallabag data"
85 162
86msgid "Click here" 163msgid "Click here"
87msgstr "Click here" 164msgstr "Click here"
88 165
89msgid "to export your poche data." 166msgid "to download your database."
90msgstr "to export your poche data." 167msgstr "to download your database."
91 168
92msgid "back to home" 169msgid "to export your wallabag data."
93msgstr "back to home" 170msgstr "to export your wallabag data."
94 171
95msgid "installation" 172msgid "Cache"
96msgstr "installation" 173msgstr "Cache"
97 174
98msgid "install your poche" 175msgid "to delete cache."
99msgstr "install your poche" 176msgstr "to delete cache."
100 177
101msgid "" 178msgid "You can enter multiple tags, separated by commas."
102"poche is still not installed. Please fill the below form to install it. " 179msgstr "You can enter multiple tags, separated by commas."
103"Don't hesitate to <a href='http://doc.inthepoche.com'>read the documentation "
104"on poche website</a>."
105msgstr ""
106"poche is still not installed. Please fill the below form to install it. "
107"Don't hesitate to <a href='http://doc.inthepoche.com'>read the documentation "
108"on poche website</a>."
109
110msgid "Login"
111msgstr "Login"
112 180
113msgid "Repeat your password" 181msgid "return to article"
114msgstr "Repeat your password" 182msgstr "return to article"
115 183
116msgid "Install" 184msgid "plop"
117msgstr "Install" 185msgstr "plop"
118 186
119msgid "back to top" 187msgid "You can <a href='wallabag_compatibility_test.php'>check your configuration here</a>."
120msgstr "back to top" 188msgstr "You can <a href='wallabag_compatibility_test.php'>check your configuration here</a>."
121 189
122msgid "favoris" 190msgid "favoris"
123msgstr "favoris" 191msgstr "favoris"
@@ -146,11 +214,14 @@ msgstr "by title"
146msgid "by title desc" 214msgid "by title desc"
147msgstr "by title desc" 215msgstr "by title desc"
148 216
149msgid "No link available here!" 217msgid "Tag"
150msgstr "No link available here!" 218msgstr "Tag"
151 219
152msgid "toggle mark as read" 220msgid "No articles found."
153msgstr "toggle mark as read" 221msgstr "No articles found."
222
223msgid "Toggle mark as read"
224msgstr "Toggle mark as read"
154 225
155msgid "toggle favorite" 226msgid "toggle favorite"
156msgstr "toggle favorite" 227msgstr "toggle favorite"
@@ -161,14 +232,86 @@ msgstr "delete"
161msgid "original" 232msgid "original"
162msgstr "original" 233msgstr "original"
163 234
235msgid "estimated reading time:"
236msgstr "estimated reading time:"
237
238msgid "mark all the entries as read"
239msgstr "mark all the entries as read"
240
164msgid "results" 241msgid "results"
165msgstr "results" 242msgstr "results"
166 243
167msgid "tweet" 244msgid "installation"
168msgstr "tweet" 245msgstr "installation"
169 246
170msgid "email" 247msgid "install your wallabag"
171msgstr "email" 248msgstr "install your wallabag"
249
250msgid "wallabag is still not installed. Please fill the below form to install it. Don't hesitate to <a href='http://doc.wallabag.org/'>read the documentation on wallabag website</a>."
251msgstr "wallabag is still not installed. Please fill the below form to install it. Don't hesitate to <a href='http://doc.wallabag.org/'>read the documentation on wallabag website</a>."
252
253msgid "Login"
254msgstr "Login"
255
256msgid "Repeat your password"
257msgstr "Repeat your password"
258
259msgid "Install"
260msgstr "Install"
261
262msgid "login to your wallabag"
263msgstr "login to your wallabag"
264
265msgid "Login to wallabag"
266msgstr "Login to wallabag"
267
268msgid "you are in demo mode, some features may be disabled."
269msgstr "you are in demo mode, some features may be disabled."
270
271msgid "Username"
272msgstr "Username"
273
274msgid "Stay signed in"
275msgstr "Stay signed in"
276
277msgid "(Do not check on public computers)"
278msgstr "(Do not check on public computers)"
279
280msgid "Sign in"
281msgstr "Sign in"
282
283msgid "favorites"
284msgstr "favorites"
285
286msgid "estimated reading time :"
287msgstr "estimated reading time :"
288
289msgid "Mark all the entries as read"
290msgstr "Mark all the entries as read"
291
292msgid "Return home"
293msgstr "Return home"
294
295msgid "Back to top"
296msgstr "Back to top"
297
298msgid "Mark as read"
299msgstr "Mark as read"
300
301msgid "Favorite"
302msgstr "Favorite"
303
304msgid "Toggle favorite"
305msgstr "Toggle favorite"
306
307msgid "Delete"
308msgstr "Delete"
309
310msgid "Tweet"
311msgstr "Tweet"
312
313msgid "Email"
314msgstr "Email"
172 315
173msgid "shaarli" 316msgid "shaarli"
174msgstr "shaarli" 317msgstr "shaarli"
@@ -176,26 +319,23 @@ msgstr "shaarli"
176msgid "flattr" 319msgid "flattr"
177msgstr "flattr" 320msgstr "flattr"
178 321
179msgid "this article appears wrong?" 322msgid "Does this article appear wrong?"
180msgstr "this article appears wrong?" 323msgstr "Does this article appear wrong?"
181 324
182msgid "create an issue" 325msgid "tags:"
183msgstr "create an issue" 326msgstr "tags:"
184 327
185msgid "or" 328msgid "Edit tags"
186msgstr "or" 329msgstr "Edit tags"
187 330
188msgid "contact us by mail" 331msgid "save link!"
189msgstr "contact us by mail" 332msgstr "save link!"
190
191msgid "plop"
192msgstr "plop"
193 333
194msgid "home" 334msgid "home"
195msgstr "home" 335msgstr "home"
196 336
197msgid "favorites" 337msgid "tags"
198msgstr "favorites" 338msgstr "tags"
199 339
200msgid "logout" 340msgid "logout"
201msgstr "logout" 341msgstr "logout"
@@ -206,23 +346,179 @@ msgstr "powered by"
206msgid "debug mode is on so cache is off." 346msgid "debug mode is on so cache is off."
207msgstr "debug mode is on so cache is off." 347msgstr "debug mode is on so cache is off."
208 348
209msgid "your poche version:" 349msgid "your wallabag version:"
210msgstr "your poche version:" 350msgstr "your wallabag version:"
211 351
212msgid "storage:" 352msgid "storage:"
213msgstr "storage:" 353msgstr "storage:"
214 354
215msgid "login to your poche" 355msgid "save a link"
216msgstr "login to your poche" 356msgstr "save a link"
217 357
218msgid "you are in demo mode, some features may be disabled." 358msgid "back to home"
219msgstr "you are in demo mode, some features may be disabled." 359msgstr "back to home"
220 360
221msgid "Stay signed in" 361msgid "toggle mark as read"
222msgstr "Stay signed in" 362msgstr "toggle mark as read"
223 363
224msgid "(Do not check on public computers)" 364msgid "tweet"
225msgstr "(Do not check on public computers)" 365msgstr "tweet"
226 366
227msgid "Sign in" 367msgid "email"
228msgstr "Sign in" 368msgstr "email"
369
370msgid "this article appears wrong?"
371msgstr "this article appears wrong?"
372
373msgid "No link available here!"
374msgstr "No link available here!"
375
376msgid "Poching a link"
377msgstr "Poching a link"
378
379msgid "by filling this field"
380msgstr "by filling this field"
381
382msgid "bookmarklet: drag & drop this link to your bookmarks bar"
383msgstr "bookmarklet: drag & drop this link to your bookmarks bar"
384
385msgid "your version"
386msgstr "your version"
387
388msgid "latest stable version"
389msgstr "latest stable version"
390
391msgid "a more recent stable version is available."
392msgstr "a more recent stable version is available."
393
394msgid "you are up to date."
395msgstr "you are up to date."
396
397msgid "latest dev version"
398msgstr "latest dev version"
399
400msgid "a more recent development version is available."
401msgstr "a more recent development version is available."
402
403msgid "Please execute the import script locally, it can take a very long time."
404msgstr "Please execute the import script locally, it can take a very long time."
405
406msgid "More infos in the official doc:"
407msgstr "More infos in the official doc:"
408
409msgid "import from Pocket"
410msgstr "import from Pocket"
411
412msgid "import from Readability"
413msgstr "import from Readability"
414
415msgid "import from Instapaper"
416msgstr "import from Instapaper"
417
418msgid "Tags"
419msgstr "Tags"
420
421msgid "Untitled"
422msgstr "Untitled"
423
424msgid "the link has been added successfully"
425msgstr "the link has been added successfully"
426
427msgid "error during insertion : the link wasn't added"
428msgstr "error during insertion : the link wasn't added"
429
430msgid "the link has been deleted successfully"
431msgstr "the link has been deleted successfully"
432
433msgid "the link wasn't deleted"
434msgstr "the link wasn't deleted"
435
436msgid "Article not found!"
437msgstr "Article not found!"
438
439msgid "previous"
440msgstr "previous"
441
442msgid "next"
443msgstr "next"
444
445msgid "in demo mode, you can't update your password"
446msgstr "in demo mode, you can't update your password"
447
448msgid "your password has been updated"
449msgstr "your password has been updated"
450
451msgid "the two fields have to be filled & the password must be the same in the two fields"
452msgstr "the two fields have to be filled & the password must be the same in the two fields"
453
454msgid "still using the \""
455msgstr "still using the \""
456
457msgid "that theme does not seem to be installed"
458msgstr "that theme does not seem to be installed"
459
460msgid "you have changed your theme preferences"
461msgstr "you have changed your theme preferences"
462
463msgid "that language does not seem to be installed"
464msgstr "that language does not seem to be installed"
465
466msgid "you have changed your language preferences"
467msgstr "you have changed your language preferences"
468
469msgid "login failed: you have to fill all fields"
470msgstr "login failed: you have to fill all fields"
471
472msgid "welcome to your wallabag"
473msgstr "welcome to your wallabag"
474
475msgid "login failed: bad login or password"
476msgstr "login failed: bad login or password"
477
478msgid "import from instapaper completed"
479msgstr "import from instapaper completed"
480
481msgid "import from pocket completed"
482msgstr "import from pocket completed"
483
484msgid "import from Readability completed. "
485msgstr "import from Readability completed. "
486
487msgid "import from Poche completed. "
488msgstr "import from Poche completed. "
489
490msgid "Unknown import provider."
491msgstr "Unknown import provider."
492
493msgid "Incomplete inc/poche/define.inc.php file, please define \""
494msgstr "Incomplete inc/poche/define.inc.php file, please define \""
495
496msgid "Could not find required \""
497msgstr "Could not find required \""
498
499msgid "Uh, there is a problem while generating feeds."
500msgstr "Uh, there is a problem while generating feeds."
501
502msgid "Cache deleted."
503msgstr "Cache deleted."
504
505msgid "Oops, it seems you don't have PHP 5."
506msgstr "Oops, it seems you don't have PHP 5."
507
508#~ msgid "poche it!"
509#~ msgstr "poche it!"
510
511#~ msgid "Updating poche"
512#~ msgstr "Updating poche"
513
514#~ msgid "create an issue"
515#~ msgstr "create an issue"
516
517#~ msgid "or"
518#~ msgstr "or"
519
520#~ msgid "contact us by mail"
521#~ msgstr "contact us by mail"
522
523#~ msgid "your poche version:"
524#~ msgstr "your poche version:"
diff --git a/locale/es_ES.utf8/LC_MESSAGES/es_ES.utf8.po b/locale/es_ES.utf8/LC_MESSAGES/es_ES.utf8.po
index afe0595d..c08decfe 100644
--- a/locale/es_ES.utf8/LC_MESSAGES/es_ES.utf8.po
+++ b/locale/es_ES.utf8/LC_MESSAGES/es_ES.utf8.po
@@ -1,51 +1,136 @@
1msgid "" 1msgid ""
2msgstr "" 2msgstr ""
3"Project-Id-Version: \n" 3"Project-Id-Version: \n"
4"POT-Creation-Date: \n" 4"Report-Msgid-Bugs-To: \n"
5"POT-Creation-Date: 2014-02-25 15:16+0300\n"
5"PO-Revision-Date: \n" 6"PO-Revision-Date: \n"
6"Last-Translator: Nicolas Lœuillet <nicolas.loeuillet@gmail.com>\n" 7"Last-Translator: Maryana <mariroz@mr.lviv.ua>\n"
7"Language-Team: \n" 8"Language-Team: \n"
9"Language: \n"
8"MIME-Version: 1.0\n" 10"MIME-Version: 1.0\n"
9"Content-Type: text/plain; charset=UTF-8\n" 11"Content-Type: text/plain; charset=UTF-8\n"
10"Content-Transfer-Encoding: 8bit\n" 12"Content-Transfer-Encoding: 8bit\n"
11"X-Generator: Poedit 1.5.4\n" 13"X-Generator: Poedit 1.5.4\n"
14"X-Poedit-Language: Spanish\n"
15"X-Poedit-Basepath: .\n"
16"X-Poedit-SearchPath-0: /home/mariroz/_DEV/web/wallabag/wallabag-master-testing\n"
17
18msgid "wallabag, a read it later open source system"
19msgstr ""
20
21msgid "login failed: user doesn't exist"
22msgstr ""
23
24msgid "return home"
25msgstr ""
12 26
13msgid "config" 27msgid "config"
14msgstr "configuración" 28msgstr "configuración"
15 29
16msgid "Poching a link" 30msgid "Saving articles"
17msgstr "Pochear un enlace" 31msgstr ""
32
33msgid "There are several ways to save an article:"
34msgstr ""
18 35
19msgid "read the documentation" 36msgid "read the documentation"
20msgstr "leer la documentación" 37msgstr "leer la documentación"
21 38
22msgid "by filling this field" 39msgid "download the extension"
40msgstr ""
41
42msgid "via F-Droid"
43msgstr ""
44
45msgid " or "
46msgstr ""
47
48msgid "via Google Play"
49msgstr ""
50
51msgid "download the application"
52msgstr ""
53
54#, fuzzy
55msgid "By filling this field"
23msgstr "rellenando este campo" 56msgstr "rellenando este campo"
24 57
25msgid "poche it!" 58msgid "bag it!"
26msgstr "pochéalo!" 59msgstr ""
27 60
28msgid "Updating poche" 61msgid "Bookmarklet: drag & drop this link to your bookmarks bar"
29msgstr "Actualizar" 62msgstr ""
30 63
31msgid "your version" 64msgid "Upgrading wallabag"
32msgstr "su versión" 65msgstr ""
33 66
34msgid "latest stable version" 67#, fuzzy
68msgid "Installed version"
35msgstr "ultima versión estable" 69msgstr "ultima versión estable"
36 70
37msgid "a more recent stable version is available." 71#, fuzzy
72msgid "Latest stable version"
73msgstr "ultima versión estable"
74
75#, fuzzy
76msgid "A more recent stable version is available."
38msgstr "una versión estable más reciente está disponible." 77msgstr "una versión estable más reciente está disponible."
39 78
40msgid "you are up to date." 79#, fuzzy
80msgid "You are up to date."
41msgstr "estás actualizado." 81msgstr "estás actualizado."
42 82
43msgid "latest dev version" 83#, fuzzy
84msgid "Latest dev version"
44msgstr "ultima versión de desarollo" 85msgstr "ultima versión de desarollo"
45 86
46msgid "a more recent development version is available." 87#, fuzzy
88msgid "A more recent development version is available."
47msgstr "una versión de desarollo más reciente está disponible." 89msgstr "una versión de desarollo más reciente está disponible."
48 90
91msgid "Feeds"
92msgstr ""
93
94msgid "Your feed token is currently empty and must first be generated to enable feeds. Click <a href='?feed&amp;action=generate'>here to generate it</a>."
95msgstr ""
96
97msgid "Unread feed"
98msgstr ""
99
100#, fuzzy
101msgid "Favorites feed"
102msgstr "preferidos"
103
104#, fuzzy
105msgid "Archive feed"
106msgstr "archivos"
107
108msgid "Your token:"
109msgstr ""
110
111msgid "Your user id:"
112msgstr ""
113
114msgid "You can regenerate your token: <a href='?feed&amp;action=generate'>generate!</a>."
115msgstr ""
116
117#, fuzzy
118msgid "Change your theme"
119msgstr "Modificar tu contraseña"
120
121msgid "Theme:"
122msgstr ""
123
124msgid "Update"
125msgstr "Actualizar"
126
127#, fuzzy
128msgid "Change your language"
129msgstr "Modificar tu contraseña"
130
131msgid "Language:"
132msgstr ""
133
49msgid "Change your password" 134msgid "Change your password"
50msgstr "Modificar tu contraseña" 135msgstr "Modificar tu contraseña"
51 136
@@ -58,66 +143,68 @@ msgstr "Contraseña"
58msgid "Repeat your new password:" 143msgid "Repeat your new password:"
59msgstr "Repetir la nueva contraseña :" 144msgstr "Repetir la nueva contraseña :"
60 145
61msgid "Update"
62msgstr "Actualizar"
63
64msgid "Import" 146msgid "Import"
65msgstr "Importar" 147msgstr "Importar"
66 148
67msgid "Please execute the import script locally, it can take a very long time." 149#, fuzzy
68msgstr "" 150msgid "Please execute the import script locally as it can take a very long time."
69"Por favor, ejecute la importación en local, esto puede demorar un tiempo." 151msgstr "Por favor, ejecute la importación en local, esto puede demorar un tiempo."
70 152
71msgid "More info in the official doc:" 153#, fuzzy
154msgid "More info in the official documentation:"
72msgstr "Más información en la documentación oficial :" 155msgstr "Más información en la documentación oficial :"
73 156
74msgid "import from Pocket" 157#, fuzzy
158msgid "Import from Pocket"
75msgstr "importación desde Pocket" 159msgstr "importación desde Pocket"
76 160
77msgid "import from Readability" 161#, php-format
162msgid "(you must have a %s file on your server)"
163msgstr ""
164
165#, fuzzy
166msgid "Import from Readability"
78msgstr "importación desde Readability" 167msgstr "importación desde Readability"
79 168
80msgid "import from Instapaper" 169#, fuzzy
170msgid "Import from Instapaper"
81msgstr "importación desde Instapaper" 171msgstr "importación desde Instapaper"
82 172
83msgid "Export your poche data" 173#, fuzzy
174msgid "Import from wallabag"
175msgstr "importación desde Readability"
176
177#, fuzzy
178msgid "Export your wallabag data"
84msgstr "Exportar sus datos de poche" 179msgstr "Exportar sus datos de poche"
85 180
86msgid "Click here" 181msgid "Click here"
87msgstr "Haga clic aquí" 182msgstr "Haga clic aquí"
88 183
89msgid "to export your poche data." 184msgid "to download your database."
90msgstr "para exportar sus datos de poche." 185msgstr ""
91
92msgid "back to home"
93msgstr "volver a la página de inicio"
94 186
95msgid "installation" 187#, fuzzy
96msgstr "instalación" 188msgid "to export your wallabag data."
189msgstr "para exportar sus datos de poche."
97 190
98msgid "install your poche" 191msgid "Cache"
99msgstr "instala tu Poche" 192msgstr ""
100 193
101msgid "" 194msgid "to delete cache."
102"Poche is still not installed. Please fill the below form to install it. "
103"Don't hesitate to <a href='http://doc.inthepoche.com'>read the documentation "
104"on poche website</a>."
105msgstr "" 195msgstr ""
106"Poche todavia no està instalado. Por favor, completa los campos siguientes "
107"para instalarlo. No dudes de <a href='http://doc.inthepoche.com'>leer la "
108"documentación en el sitio de Poche</a>."
109 196
110msgid "Login" 197msgid "You can enter multiple tags, separated by commas."
111msgstr "Nombre de usuario" 198msgstr ""
112 199
113msgid "Repeat your password" 200msgid "return to article"
114msgstr "Repita su contraseña" 201msgstr ""
115 202
116msgid "Install" 203msgid "plop"
117msgstr "Instalar" 204msgstr "plop"
118 205
119msgid "back to top" 206msgid "You can <a href='wallabag_compatibility_test.php'>check your configuration here</a>."
120msgstr "volver arriba" 207msgstr ""
121 208
122msgid "favoris" 209msgid "favoris"
123msgstr "preferidos" 210msgstr "preferidos"
@@ -146,10 +233,14 @@ msgstr "por título"
146msgid "by title desc" 233msgid "by title desc"
147msgstr "por título descendiente" 234msgstr "por título descendiente"
148 235
149msgid "No link available here!" 236msgid "Tag"
150msgstr "¡No hay ningún enlace disponible por aquí!" 237msgstr ""
151 238
152msgid "toggle mark as read" 239msgid "No articles found."
240msgstr ""
241
242#, fuzzy
243msgid "Toggle mark as read"
153msgstr "marcar como leído" 244msgstr "marcar como leído"
154 245
155msgid "toggle favorite" 246msgid "toggle favorite"
@@ -161,13 +252,95 @@ msgstr "eliminar"
161msgid "original" 252msgid "original"
162msgstr "original" 253msgstr "original"
163 254
255msgid "estimated reading time:"
256msgstr ""
257
258msgid "mark all the entries as read"
259msgstr ""
260
164msgid "results" 261msgid "results"
165msgstr "resultados" 262msgstr "resultados"
166 263
167msgid "tweet" 264msgid "installation"
265msgstr "instalación"
266
267#, fuzzy
268msgid "install your wallabag"
269msgstr "instala tu Poche"
270
271#, fuzzy
272msgid "wallabag is still not installed. Please fill the below form to install it. Don't hesitate to <a href='http://doc.wallabag.org/'>read the documentation on wallabag website</a>."
273msgstr "Poche todavia no està instalado. Por favor, completa los campos siguientes para instalarlo. No dudes de <a href='http://doc.inthepoche.com'>leer la documentación en el sitio de Poche</a>."
274
275msgid "Login"
276msgstr "Nombre de usuario"
277
278msgid "Repeat your password"
279msgstr "Repita su contraseña"
280
281msgid "Install"
282msgstr "Instalar"
283
284#, fuzzy
285msgid "login to your wallabag"
286msgstr "conectarse a tu Poche"
287
288msgid "Login to wallabag"
289msgstr ""
290
291msgid "you are in demo mode, some features may be disabled."
292msgstr "este es el modo de demostración, algunas funcionalidades pueden estar desactivadas."
293
294msgid "Username"
295msgstr ""
296
297msgid "Stay signed in"
298msgstr "Seguir conectado"
299
300msgid "(Do not check on public computers)"
301msgstr "(no marcar en un ordenador público)"
302
303msgid "Sign in"
304msgstr "Iniciar sesión"
305
306msgid "favorites"
307msgstr "preferidos"
308
309msgid "estimated reading time :"
310msgstr ""
311
312msgid "Mark all the entries as read"
313msgstr ""
314
315msgid "Return home"
316msgstr ""
317
318#, fuzzy
319msgid "Back to top"
320msgstr "volver arriba"
321
322#, fuzzy
323msgid "Mark as read"
324msgstr "marcar como leído"
325
326#, fuzzy
327msgid "Favorite"
328msgstr "preferidos"
329
330#, fuzzy
331msgid "Toggle favorite"
332msgstr "preferido"
333
334#, fuzzy
335msgid "Delete"
336msgstr "eliminar"
337
338#, fuzzy
339msgid "Tweet"
168msgstr "tweetear" 340msgstr "tweetear"
169 341
170msgid "email" 342#, fuzzy
343msgid "Email"
171msgstr "enviar por mail" 344msgstr "enviar por mail"
172 345
173msgid "shaarli" 346msgid "shaarli"
@@ -176,26 +349,24 @@ msgstr "shaarli"
176msgid "flattr" 349msgid "flattr"
177msgstr "flattr" 350msgstr "flattr"
178 351
179msgid "this article appears wrong?" 352#, fuzzy
353msgid "Does this article appear wrong?"
180msgstr "este articulo no se ve bien?" 354msgstr "este articulo no se ve bien?"
181 355
182msgid "create an issue" 356msgid "tags:"
183msgstr "crear un ticket" 357msgstr ""
184
185msgid "or"
186msgstr "o"
187 358
188msgid "contact us by mail" 359msgid "Edit tags"
189msgstr "contactarnos por mail" 360msgstr ""
190 361
191msgid "plop" 362msgid "save link!"
192msgstr "plop" 363msgstr ""
193 364
194msgid "home" 365msgid "home"
195msgstr "inicio" 366msgstr "inicio"
196 367
197msgid "favorites" 368msgid "tags"
198msgstr "preferidos" 369msgstr ""
199 370
200msgid "logout" 371msgid "logout"
201msgstr "cerrar sesión" 372msgstr "cerrar sesión"
@@ -206,25 +377,187 @@ msgstr "hecho con"
206msgid "debug mode is on so cache is off." 377msgid "debug mode is on so cache is off."
207msgstr "el modo de depuración está activado, así que la cache está desactivada." 378msgstr "el modo de depuración está activado, así que la cache está desactivada."
208 379
209msgid "your poche version:" 380#, fuzzy
210msgstr "tu versión de Poche:" 381msgid "your wallabag version:"
382msgstr "su versión"
211 383
212msgid "storage:" 384msgid "storage:"
213msgstr "almacenamiento:" 385msgstr "almacenamiento:"
214 386
215msgid "login to your poche" 387msgid "save a link"
216msgstr "conectarse a tu Poche" 388msgstr ""
217 389
218msgid "you are in demo mode, some features may be disabled." 390msgid "back to home"
391msgstr "volver a la página de inicio"
392
393msgid "toggle mark as read"
394msgstr "marcar como leído"
395
396msgid "tweet"
397msgstr "tweetear"
398
399msgid "email"
400msgstr "enviar por mail"
401
402msgid "this article appears wrong?"
403msgstr "este articulo no se ve bien?"
404
405msgid "No link available here!"
406msgstr "¡No hay ningún enlace disponible por aquí!"
407
408msgid "Poching a link"
409msgstr "Pochear un enlace"
410
411msgid "by filling this field"
412msgstr "rellenando este campo"
413
414msgid "bookmarklet: drag & drop this link to your bookmarks bar"
219msgstr "" 415msgstr ""
220"este es el modo de demostración, algunas funcionalidades pueden estar "
221"desactivadas."
222 416
223msgid "Stay signed in" 417msgid "your version"
224msgstr "Seguir conectado" 418msgstr "su versión"
225 419
226msgid "(Do not check on public computers)" 420msgid "latest stable version"
227msgstr "(no marcar en un ordenador público)" 421msgstr "ultima versión estable"
228 422
229msgid "Sign in" 423msgid "a more recent stable version is available."
230msgstr "Iniciar sesión" 424msgstr "una versión estable más reciente está disponible."
425
426msgid "you are up to date."
427msgstr "estás actualizado."
428
429msgid "latest dev version"
430msgstr "ultima versión de desarollo"
431
432msgid "a more recent development version is available."
433msgstr "una versión de desarollo más reciente está disponible."
434
435msgid "Please execute the import script locally, it can take a very long time."
436msgstr "Por favor, ejecute la importación en local, esto puede demorar un tiempo."
437
438#, fuzzy
439msgid "More infos in the official doc:"
440msgstr "Más información en la documentación oficial :"
441
442msgid "import from Pocket"
443msgstr "importación desde Pocket"
444
445msgid "import from Readability"
446msgstr "importación desde Readability"
447
448msgid "import from Instapaper"
449msgstr "importación desde Instapaper"
450
451msgid "Tags"
452msgstr ""
453
454#, fuzzy
455msgid "Untitled"
456msgstr "por título"
457
458msgid "the link has been added successfully"
459msgstr ""
460
461msgid "error during insertion : the link wasn't added"
462msgstr ""
463
464msgid "the link has been deleted successfully"
465msgstr ""
466
467msgid "the link wasn't deleted"
468msgstr ""
469
470msgid "Article not found!"
471msgstr ""
472
473msgid "previous"
474msgstr ""
475
476msgid "next"
477msgstr ""
478
479msgid "in demo mode, you can't update your password"
480msgstr ""
481
482msgid "your password has been updated"
483msgstr ""
484
485msgid "the two fields have to be filled & the password must be the same in the two fields"
486msgstr ""
487
488msgid "still using the \""
489msgstr ""
490
491msgid "that theme does not seem to be installed"
492msgstr ""
493
494msgid "you have changed your theme preferences"
495msgstr ""
496
497msgid "that language does not seem to be installed"
498msgstr ""
499
500msgid "you have changed your language preferences"
501msgstr ""
502
503msgid "login failed: you have to fill all fields"
504msgstr ""
505
506msgid "welcome to your wallabag"
507msgstr ""
508
509msgid "login failed: bad login or password"
510msgstr ""
511
512#, fuzzy
513msgid "import from instapaper completed"
514msgstr "importación desde Instapaper"
515
516#, fuzzy
517msgid "import from pocket completed"
518msgstr "importación desde Pocket"
519
520#, fuzzy
521msgid "import from Readability completed. "
522msgstr "importación desde Readability"
523
524#, fuzzy
525msgid "import from Poche completed. "
526msgstr "importación desde Pocket"
527
528msgid "Unknown import provider."
529msgstr ""
530
531msgid "Incomplete inc/poche/define.inc.php file, please define \""
532msgstr ""
533
534msgid "Could not find required \""
535msgstr ""
536
537msgid "Uh, there is a problem while generating feeds."
538msgstr ""
539
540#, fuzzy
541msgid "Cache deleted."
542msgstr "eliminar"
543
544msgid "Oops, it seems you don't have PHP 5."
545msgstr ""
546
547#~ msgid "poche it!"
548#~ msgstr "pochéalo!"
549
550#~ msgid "Updating poche"
551#~ msgstr "Actualizar"
552
553#~ msgid "create an issue"
554#~ msgstr "crear un ticket"
555
556#~ msgid "or"
557#~ msgstr "o"
558
559#~ msgid "contact us by mail"
560#~ msgstr "contactarnos por mail"
561
562#~ msgid "your poche version:"
563#~ msgstr "tu versión de Poche:"
diff --git a/locale/fa_IR.utf8/LC_MESSAGES/fa_IR.utf8.po b/locale/fa_IR.utf8/LC_MESSAGES/fa_IR.utf8.po
index 74a763c6..f24814d5 100644
--- a/locale/fa_IR.utf8/LC_MESSAGES/fa_IR.utf8.po
+++ b/locale/fa_IR.utf8/LC_MESSAGES/fa_IR.utf8.po
@@ -1,51 +1,136 @@
1msgid "" 1msgid ""
2msgstr "" 2msgstr ""
3"Project-Id-Version: \n" 3"Project-Id-Version: \n"
4"POT-Creation-Date: \n" 4"Report-Msgid-Bugs-To: \n"
5"POT-Creation-Date: 2014-02-25 15:15+0300\n"
5"PO-Revision-Date: \n" 6"PO-Revision-Date: \n"
6"Last-Translator: Nicolas Lœuillet <nicolas.loeuillet@gmail.com>\n" 7"Last-Translator: Maryana <mariroz@mr.lviv.ua>\n"
7"Language-Team: \n" 8"Language-Team: \n"
9"Language: \n"
8"MIME-Version: 1.0\n" 10"MIME-Version: 1.0\n"
9"Content-Type: text/plain; charset=UTF-8\n" 11"Content-Type: text/plain; charset=UTF-8\n"
10"Content-Transfer-Encoding: 8bit\n" 12"Content-Transfer-Encoding: 8bit\n"
11"X-Generator: Poedit 1.5.4\n" 13"X-Generator: Poedit 1.5.4\n"
14"X-Poedit-Language: Persian\n"
15"X-Poedit-Basepath: .\n"
16"X-Poedit-SearchPath-0: /home/mariroz/_DEV/web/wallabag/wallabag-master-testing\n"
17
18msgid "wallabag, a read it later open source system"
19msgstr ""
20
21msgid "login failed: user doesn't exist"
22msgstr ""
23
24msgid "return home"
25msgstr ""
12 26
13msgid "config" 27msgid "config"
14msgstr "تنظیمات" 28msgstr "تنظیمات"
15 29
16msgid "Poching a link" 30msgid "Saving articles"
17msgstr "پیوندی را poche کنید" 31msgstr ""
32
33msgid "There are several ways to save an article:"
34msgstr ""
18 35
19msgid "read the documentation" 36msgid "read the documentation"
20msgstr "راهنما را بخوانید" 37msgstr "راهنما را بخوانید"
21 38
22msgid "by filling this field" 39msgid "download the extension"
40msgstr ""
41
42msgid "via F-Droid"
43msgstr ""
44
45msgid " or "
46msgstr ""
47
48msgid "via Google Play"
49msgstr ""
50
51msgid "download the application"
52msgstr ""
53
54#, fuzzy
55msgid "By filling this field"
23msgstr "با پرکردن این بخش" 56msgstr "با پرکردن این بخش"
24 57
25msgid "poche it!" 58msgid "bag it!"
26msgstr "poche کنید!" 59msgstr ""
27 60
28msgid "Updating poche" 61msgid "Bookmarklet: drag & drop this link to your bookmarks bar"
29msgstr "به‌روزرسانی poche" 62msgstr ""
30 63
31msgid "your version" 64msgid "Upgrading wallabag"
32msgstr "نسخهٔ شما" 65msgstr ""
33 66
34msgid "latest stable version" 67#, fuzzy
68msgid "Installed version"
35msgstr "آخرین نسخهٔ پایدار" 69msgstr "آخرین نسخهٔ پایدار"
36 70
37msgid "a more recent stable version is available." 71#, fuzzy
72msgid "Latest stable version"
73msgstr "آخرین نسخهٔ پایدار"
74
75#, fuzzy
76msgid "A more recent stable version is available."
38msgstr "نسخهٔ پایدار تازه‌ای منتشر شده است." 77msgstr "نسخهٔ پایدار تازه‌ای منتشر شده است."
39 78
40msgid "you are up to date." 79#, fuzzy
80msgid "You are up to date."
41msgstr "شما به‌روز هستید." 81msgstr "شما به‌روز هستید."
42 82
43msgid "latest dev version" 83#, fuzzy
84msgid "Latest dev version"
44msgstr "آخرین نسخهٔ آزمایشی" 85msgstr "آخرین نسخهٔ آزمایشی"
45 86
46msgid "a more recent development version is available." 87#, fuzzy
88msgid "A more recent development version is available."
47msgstr "نسخهٔ آزمایشی تازه‌ای منتشر شده است." 89msgstr "نسخهٔ آزمایشی تازه‌ای منتشر شده است."
48 90
91msgid "Feeds"
92msgstr ""
93
94msgid "Your feed token is currently empty and must first be generated to enable feeds. Click <a href='?feed&amp;action=generate'>here to generate it</a>."
95msgstr ""
96
97msgid "Unread feed"
98msgstr ""
99
100#, fuzzy
101msgid "Favorites feed"
102msgstr "بهترین‌ها"
103
104#, fuzzy
105msgid "Archive feed"
106msgstr "بایگانی"
107
108msgid "Your token:"
109msgstr ""
110
111msgid "Your user id:"
112msgstr ""
113
114msgid "You can regenerate your token: <a href='?feed&amp;action=generate'>generate!</a>."
115msgstr ""
116
117#, fuzzy
118msgid "Change your theme"
119msgstr "گذرواژهٔ خود را تغییر دهید"
120
121msgid "Theme:"
122msgstr ""
123
124msgid "Update"
125msgstr "به‌روزرسانی"
126
127#, fuzzy
128msgid "Change your language"
129msgstr "گذرواژهٔ خود را تغییر دهید"
130
131msgid "Language:"
132msgstr ""
133
49msgid "Change your password" 134msgid "Change your password"
50msgstr "گذرواژهٔ خود را تغییر دهید" 135msgstr "گذرواژهٔ خود را تغییر دهید"
51 136
@@ -58,64 +143,68 @@ msgstr "گذرواژه"
58msgid "Repeat your new password:" 143msgid "Repeat your new password:"
59msgstr "گذرواژهٔ تازه را دوباره وارد کنید" 144msgstr "گذرواژهٔ تازه را دوباره وارد کنید"
60 145
61msgid "Update"
62msgstr "به‌روزرسانی"
63
64msgid "Import" 146msgid "Import"
65msgstr "درون‌ریزی" 147msgstr "درون‌ریزی"
66 148
67msgid "Please execute the import script locally, it can take a very long time." 149#, fuzzy
150msgid "Please execute the import script locally as it can take a very long time."
68msgstr "لطفاً برنامهٔ درون‌ریزی را به‌طور محلی اجرا کنید، شاید خیلی طول بکشد." 151msgstr "لطفاً برنامهٔ درون‌ریزی را به‌طور محلی اجرا کنید، شاید خیلی طول بکشد."
69 152
70msgid "More info in the official doc:" 153#, fuzzy
154msgid "More info in the official documentation:"
71msgstr "اطلاعات بیشتر در راهنمای رسمی:" 155msgstr "اطلاعات بیشتر در راهنمای رسمی:"
72 156
73msgid "import from Pocket" 157#, fuzzy
158msgid "Import from Pocket"
74msgstr "درون‌ریزی از Pocket" 159msgstr "درون‌ریزی از Pocket"
75 160
76msgid "import from Readability" 161#, php-format
162msgid "(you must have a %s file on your server)"
163msgstr ""
164
165#, fuzzy
166msgid "Import from Readability"
77msgstr "درون‌ریزی از Readability" 167msgstr "درون‌ریزی از Readability"
78 168
79msgid "import from Instapaper" 169#, fuzzy
170msgid "Import from Instapaper"
80msgstr "درون‌ریزی از Instapaper" 171msgstr "درون‌ریزی از Instapaper"
81 172
82msgid "Export your poche data" 173#, fuzzy
174msgid "Import from wallabag"
175msgstr "درون‌ریزی از Readability"
176
177#, fuzzy
178msgid "Export your wallabag data"
83msgstr "داده‌های poche خود را برون‌بری کنید" 179msgstr "داده‌های poche خود را برون‌بری کنید"
84 180
85msgid "Click here" 181msgid "Click here"
86msgstr "اینجا را کلیک کنید" 182msgstr "اینجا را کلیک کنید"
87 183
88msgid "to export your poche data." 184msgid "to download your database."
89msgstr "برای برون‌بری داده‌های poche شما" 185msgstr ""
90
91msgid "back to home"
92msgstr "بازگشت به خانه"
93 186
94msgid "installation" 187#, fuzzy
95msgstr "نصب" 188msgid "to export your wallabag data."
189msgstr "برای برون‌بری داده‌های poche شما"
96 190
97msgid "install your poche" 191msgid "Cache"
98msgstr "poche خود را نصب کنید" 192msgstr ""
99 193
100msgid "" 194msgid "to delete cache."
101"poche is still not installed. Please fill the below form to install it. "
102"Don't hesitate to <a href='http://doc.inthepoche.com'>read the documentation "
103"on poche website</a>."
104msgstr "" 195msgstr ""
105"poche هنوز نصب نیست. برای نصب لطفاً فرم زیر را پر کنید. خواندن <a "
106"href='http://doc.inthepoche.com'>راهنما در وبگاه poche</a> را از یاد نبرید."
107 196
108msgid "Login" 197msgid "You can enter multiple tags, separated by commas."
109msgstr "ورود" 198msgstr ""
110 199
111msgid "Repeat your password" 200msgid "return to article"
112msgstr "گذرواژه را دوباره وارد کنید" 201msgstr ""
113 202
114msgid "Install" 203msgid "plop"
115msgstr "نصب" 204msgstr "plop"
116 205
117msgid "back to top" 206msgid "You can <a href='wallabag_compatibility_test.php'>check your configuration here</a>."
118msgstr "بازگشت به بالای صفحه" 207msgstr ""
119 208
120msgid "favoris" 209msgid "favoris"
121msgstr "بهترین‌ها" 210msgstr "بهترین‌ها"
@@ -144,10 +233,14 @@ msgstr "با عنوان"
144msgid "by title desc" 233msgid "by title desc"
145msgstr "با عنوان (الفبایی معکوس)" 234msgstr "با عنوان (الفبایی معکوس)"
146 235
147msgid "No link available here!" 236msgid "Tag"
148msgstr "اینجا پیوندی موجود نیست!" 237msgstr ""
149 238
150msgid "toggle mark as read" 239msgid "No articles found."
240msgstr ""
241
242#, fuzzy
243msgid "Toggle mark as read"
151msgstr "خوانده‌شده/خوانده‌نشده" 244msgstr "خوانده‌شده/خوانده‌نشده"
152 245
153msgid "toggle favorite" 246msgid "toggle favorite"
@@ -159,13 +252,95 @@ msgstr "پاک‌کردن"
159msgid "original" 252msgid "original"
160msgstr "اصلی" 253msgstr "اصلی"
161 254
255msgid "estimated reading time:"
256msgstr ""
257
258msgid "mark all the entries as read"
259msgstr ""
260
162msgid "results" 261msgid "results"
163msgstr "نتایج" 262msgstr "نتایج"
164 263
165msgid "tweet" 264msgid "installation"
265msgstr "نصب"
266
267#, fuzzy
268msgid "install your wallabag"
269msgstr "poche خود را نصب کنید"
270
271#, fuzzy
272msgid "wallabag is still not installed. Please fill the below form to install it. Don't hesitate to <a href='http://doc.wallabag.org/'>read the documentation on wallabag website</a>."
273msgstr "poche هنوز نصب نیست. برای نصب لطفاً فرم زیر را پر کنید. خواندن <a href='http://doc.inthepoche.com'>راهنما در وبگاه poche</a> را از یاد نبرید."
274
275msgid "Login"
276msgstr "ورود"
277
278msgid "Repeat your password"
279msgstr "گذرواژه را دوباره وارد کنید"
280
281msgid "Install"
282msgstr "نصب"
283
284#, fuzzy
285msgid "login to your wallabag"
286msgstr "به poche خود وارد شوید"
287
288msgid "Login to wallabag"
289msgstr ""
290
291msgid "you are in demo mode, some features may be disabled."
292msgstr "این تنها نسخهٔ نمایشی است، برخی از ویژگی‌ها کار نمی‌کنند."
293
294msgid "Username"
295msgstr ""
296
297msgid "Stay signed in"
298msgstr "مرا به خاطر بسپار"
299
300msgid "(Do not check on public computers)"
301msgstr "(روی رایانه‌های عمومی این کار را نکنید)"
302
303msgid "Sign in"
304msgstr "ورود"
305
306msgid "favorites"
307msgstr "بهترین‌ها"
308
309msgid "estimated reading time :"
310msgstr ""
311
312msgid "Mark all the entries as read"
313msgstr ""
314
315msgid "Return home"
316msgstr ""
317
318#, fuzzy
319msgid "Back to top"
320msgstr "بازگشت به بالای صفحه"
321
322#, fuzzy
323msgid "Mark as read"
324msgstr "خوانده‌شده/خوانده‌نشده"
325
326#, fuzzy
327msgid "Favorite"
328msgstr "بهترین‌ها"
329
330#, fuzzy
331msgid "Toggle favorite"
332msgstr "جزء بهترین‌ها هست/نیست"
333
334#, fuzzy
335msgid "Delete"
336msgstr "پاک‌کردن"
337
338#, fuzzy
339msgid "Tweet"
166msgstr "توییت" 340msgstr "توییت"
167 341
168msgid "email" 342#, fuzzy
343msgid "Email"
169msgstr "ایمیل" 344msgstr "ایمیل"
170 345
171msgid "shaarli" 346msgid "shaarli"
@@ -174,26 +349,24 @@ msgstr "shaarli"
174msgid "flattr" 349msgid "flattr"
175msgstr "flattr" 350msgstr "flattr"
176 351
177msgid "this article appears wrong?" 352#, fuzzy
353msgid "Does this article appear wrong?"
178msgstr "این مطلب اشتباه نمایش داده شده؟" 354msgstr "این مطلب اشتباه نمایش داده شده؟"
179 355
180msgid "create an issue" 356msgid "tags:"
181msgstr "یک درخواست رفع‌مشکل بنویسید" 357msgstr ""
182
183msgid "or"
184msgstr "یا"
185 358
186msgid "contact us by mail" 359msgid "Edit tags"
187msgstr "به ما ایمیل بزنید" 360msgstr ""
188 361
189msgid "plop" 362msgid "save link!"
190msgstr "plop" 363msgstr ""
191 364
192msgid "home" 365msgid "home"
193msgstr "خانه" 366msgstr "خانه"
194 367
195msgid "favorites" 368msgid "tags"
196msgstr "بهترین‌ها" 369msgstr ""
197 370
198msgid "logout" 371msgid "logout"
199msgstr "بیرون رفتن" 372msgstr "بیرون رفتن"
@@ -204,23 +377,187 @@ msgstr "نیروگرفته از"
204msgid "debug mode is on so cache is off." 377msgid "debug mode is on so cache is off."
205msgstr "حالت عیب‌یابی فعال است، پس کاشه خاموش است." 378msgstr "حالت عیب‌یابی فعال است، پس کاشه خاموش است."
206 379
207msgid "your poche version:" 380#, fuzzy
208msgstr "نسخهٔ poche شما:" 381msgid "your wallabag version:"
382msgstr "نسخهٔ شما"
209 383
210msgid "storage:" 384msgid "storage:"
211msgstr "ذخیره‌سازی:" 385msgstr "ذخیره‌سازی:"
212 386
213msgid "login to your poche" 387msgid "save a link"
214msgstr "به poche خود وارد شوید" 388msgstr ""
215 389
216msgid "you are in demo mode, some features may be disabled." 390msgid "back to home"
217msgstr "��ین �نه� ن�هٔ نمای�ی �س�، برخی از �یژگی‌�ا کن��ی‌کنند." 391msgstr "�ا��گشت به �ن�"
218 392
219msgid "Stay signed in" 393msgid "toggle mark as read"
220msgstr "ما ه �س" 394msgstr "��وانه�ه/�و�ن�‌ن�ه"
221 395
222msgid "(Do not check on public computers)" 396msgid "tweet"
223msgstr "(وی رای��نه‌های عمومی این کار را نکنید)" 397msgstr "�ویی�"
224 398
225msgid "Sign in" 399msgid "email"
226msgstr "ورود" 400msgstr "ایمیل"
401
402msgid "this article appears wrong?"
403msgstr "این مطلب اشتباه نمایش داده شده؟"
404
405msgid "No link available here!"
406msgstr "اینجا پیوندی موجود نیست!"
407
408msgid "Poching a link"
409msgstr "پیوندی را poche کنید"
410
411msgid "by filling this field"
412msgstr "با پرکردن این بخش"
413
414msgid "bookmarklet: drag & drop this link to your bookmarks bar"
415msgstr ""
416
417msgid "your version"
418msgstr "نسخهٔ شما"
419
420msgid "latest stable version"
421msgstr "آخرین نسخهٔ پایدار"
422
423msgid "a more recent stable version is available."
424msgstr "نسخهٔ پایدار تازه‌ای منتشر شده است."
425
426msgid "you are up to date."
427msgstr "شما به‌روز هستید."
428
429msgid "latest dev version"
430msgstr "آخرین نسخهٔ آزمایشی"
431
432msgid "a more recent development version is available."
433msgstr "نسخهٔ آزمایشی تازه‌ای منتشر شده است."
434
435msgid "Please execute the import script locally, it can take a very long time."
436msgstr "لطفاً برنامهٔ درون‌ریزی را به‌طور محلی اجرا کنید، شاید خیلی طول بکشد."
437
438#, fuzzy
439msgid "More infos in the official doc:"
440msgstr "اطلاعات بیشتر در راهنمای رسمی:"
441
442msgid "import from Pocket"
443msgstr "درون‌ریزی از Pocket"
444
445msgid "import from Readability"
446msgstr "درون‌ریزی از Readability"
447
448msgid "import from Instapaper"
449msgstr "درون‌ریزی از Instapaper"
450
451msgid "Tags"
452msgstr ""
453
454#, fuzzy
455msgid "Untitled"
456msgstr "با عنوان"
457
458msgid "the link has been added successfully"
459msgstr ""
460
461msgid "error during insertion : the link wasn't added"
462msgstr ""
463
464msgid "the link has been deleted successfully"
465msgstr ""
466
467msgid "the link wasn't deleted"
468msgstr ""
469
470msgid "Article not found!"
471msgstr ""
472
473msgid "previous"
474msgstr ""
475
476msgid "next"
477msgstr ""
478
479msgid "in demo mode, you can't update your password"
480msgstr ""
481
482msgid "your password has been updated"
483msgstr ""
484
485msgid "the two fields have to be filled & the password must be the same in the two fields"
486msgstr ""
487
488msgid "still using the \""
489msgstr ""
490
491msgid "that theme does not seem to be installed"
492msgstr ""
493
494msgid "you have changed your theme preferences"
495msgstr ""
496
497msgid "that language does not seem to be installed"
498msgstr ""
499
500msgid "you have changed your language preferences"
501msgstr ""
502
503msgid "login failed: you have to fill all fields"
504msgstr ""
505
506msgid "welcome to your wallabag"
507msgstr ""
508
509msgid "login failed: bad login or password"
510msgstr ""
511
512#, fuzzy
513msgid "import from instapaper completed"
514msgstr "درون‌ریزی از Instapaper"
515
516#, fuzzy
517msgid "import from pocket completed"
518msgstr "درون‌ریزی از Pocket"
519
520#, fuzzy
521msgid "import from Readability completed. "
522msgstr "درون‌ریزی از Readability"
523
524#, fuzzy
525msgid "import from Poche completed. "
526msgstr "درون‌ریزی از Pocket"
527
528msgid "Unknown import provider."
529msgstr ""
530
531msgid "Incomplete inc/poche/define.inc.php file, please define \""
532msgstr ""
533
534msgid "Could not find required \""
535msgstr ""
536
537msgid "Uh, there is a problem while generating feeds."
538msgstr ""
539
540#, fuzzy
541msgid "Cache deleted."
542msgstr "پاک‌کردن"
543
544msgid "Oops, it seems you don't have PHP 5."
545msgstr ""
546
547#~ msgid "poche it!"
548#~ msgstr "poche کنید!"
549
550#~ msgid "Updating poche"
551#~ msgstr "به‌روزرسانی poche"
552
553#~ msgid "create an issue"
554#~ msgstr "یک درخواست رفع‌مشکل بنویسید"
555
556#~ msgid "or"
557#~ msgstr "یا"
558
559#~ msgid "contact us by mail"
560#~ msgstr "به ما ایمیل بزنید"
561
562#~ msgid "your poche version:"
563#~ msgstr "نسخهٔ poche شما:"
diff --git a/locale/fr_FR.utf8/LC_MESSAGES/fr_FR.utf8.mo b/locale/fr_FR.utf8/LC_MESSAGES/fr_FR.utf8.mo
index 76872b5a..600b3281 100644
--- a/locale/fr_FR.utf8/LC_MESSAGES/fr_FR.utf8.mo
+++ b/locale/fr_FR.utf8/LC_MESSAGES/fr_FR.utf8.mo
Binary files differ
diff --git a/locale/fr_FR.utf8/LC_MESSAGES/fr_FR.utf8.po b/locale/fr_FR.utf8/LC_MESSAGES/fr_FR.utf8.po
index f105d180..5053e9e3 100644
--- a/locale/fr_FR.utf8/LC_MESSAGES/fr_FR.utf8.po
+++ b/locale/fr_FR.utf8/LC_MESSAGES/fr_FR.utf8.po
@@ -1,50 +1,125 @@
1msgid "" 1msgid ""
2msgstr "" 2msgstr ""
3"Project-Id-Version: \n" 3"Project-Id-Version: \n"
4"POT-Creation-Date: \n" 4"Report-Msgid-Bugs-To: \n"
5"POT-Creation-Date: 2014-02-25 18:33+0300\n"
5"PO-Revision-Date: \n" 6"PO-Revision-Date: \n"
6"Last-Translator: Nicolas Lœuillet <nicolas.loeuillet@gmail.com>\n" 7"Last-Translator: Maryana <mariroz@mr.lviv.ua>\n"
7"Language-Team: \n" 8"Language-Team: \n"
9"Language: \n"
8"MIME-Version: 1.0\n" 10"MIME-Version: 1.0\n"
9"Content-Type: text/plain; charset=UTF-8\n" 11"Content-Type: text/plain; charset=UTF-8\n"
10"Content-Transfer-Encoding: 8bit\n" 12"Content-Transfer-Encoding: 8bit\n"
11"X-Generator: Poedit 1.5.4\n" 13"X-Poedit-KeywordsList: _;gettext;gettext_noop\n"
14"X-Poedit-Basepath: .\n"
15"X-Poedit-SourceCharset: utf-8\n"
16"X-Generator: Poedit 1.5.7\n"
17"X-Poedit-SearchPath-0: /home/mariroz/_DEV/web/wallabag/wallabag-master-testing\n"
18
19msgid "wallabag, a read it later open source system"
20msgstr "wallabag, un système open source de lecture différé"
21
22msgid "login failed: user doesn't exist"
23msgstr "identification échouée : l'utilisateur n'existe pas"
24
25msgid "return home"
26msgstr "retour à l'accueil"
12 27
13msgid "config" 28msgid "config"
14msgstr "configuration" 29msgstr "configuration"
15 30
16msgid "Poching a link" 31msgid "Saving articles"
17msgstr "Pocher un lien" 32msgstr "Sauvegarde des articles"
33
34msgid "There are several ways to save an article:"
35msgstr "Il y a plusieurs façons de sauver un article :"
18 36
19msgid "read the documentation" 37msgid "read the documentation"
20msgstr "lisez la documentation" 38msgstr "lisez la documentation"
21 39
22msgid "by filling this field" 40msgid "download the extension"
23msgstr "en remplissant ce champ" 41msgstr "télécharger l'extension"
24 42
25msgid "poche it!" 43msgid "via F-Droid"
26msgstr "pochez-le !" 44msgstr "via F-Droid"
27 45
28msgid "Updating poche" 46msgid " or "
29msgstr "Mettre à jour poche" 47msgstr "ou"
30 48
31msgid "your version" 49msgid "via Google Play"
32msgstr "votre version" 50msgstr "via Google PlayStore"
33 51
34msgid "latest stable version" 52msgid "download the application"
35msgstr "dernire version stable" 53msgstr "t�lécharger l'application"
36 54
37msgid "a more recent stable version is available." 55msgid "By filling this field"
38msgstr "une version stable plus récente est disponible." 56msgstr "En remplissant ce champ"
39 57
40msgid "you are up to date." 58msgid "bag it!"
41msgstr "vous êtes à jour." 59msgstr "bag it !"
42 60
43msgid "latest dev version" 61msgid "Bookmarklet: drag & drop this link to your bookmarks bar"
44msgstr "derni��re version de veloppement" 62msgstr "Bookmarklet : glissez-d�posez ce lien dans votre barre de favoris"
45 63
46msgid "a more recent development version is available." 64msgid "Upgrading wallabag"
47msgstr "une version de développement plus récente est disponible." 65msgstr "Mise à jour de wallabag"
66
67msgid "Installed version"
68msgstr "Version installée"
69
70msgid "Latest stable version"
71msgstr "Dernière version stable"
72
73msgid "A more recent stable version is available."
74msgstr "Une version stable plus récente est disponible."
75
76msgid "You are up to date."
77msgstr "Vous êtes à jour."
78
79msgid "Latest dev version"
80msgstr "Dernière version de développement"
81
82msgid "A more recent development version is available."
83msgstr "Une version de développement plus récente est disponible."
84
85msgid "Feeds"
86msgstr "Flux"
87
88msgid "Your feed token is currently empty and must first be generated to enable feeds. Click <a href='?feed&amp;action=generate'>here to generate it</a>."
89msgstr "Votre jeton de flux est actuellement vide doit d'abord être généré pour activer les flux. Cliquez <a href='?feed&amp;action=generate'>ici</a> pour le générer."
90
91msgid "Unread feed"
92msgstr "Flux des non lus"
93
94msgid "Favorites feed"
95msgstr "Flux des favoris"
96
97msgid "Archive feed"
98msgstr "Flux des archives"
99
100msgid "Your token:"
101msgstr "Votre jeton :"
102
103msgid "Your user id:"
104msgstr "Votre ID utilisateur :"
105
106msgid "You can regenerate your token: <a href='?feed&amp;action=generate'>generate!</a>."
107msgstr "Vous pouvez regénérer votre jeton : <a href='?feed&amp;action=generate'>génération !</a>."
108
109msgid "Change your theme"
110msgstr "Changer votre thème"
111
112msgid "Theme:"
113msgstr "Thème :"
114
115msgid "Update"
116msgstr "Mettre à jour"
117
118msgid "Change your language"
119msgstr "Changer votre langue"
120
121msgid "Language:"
122msgstr "Langue :"
48 123
49msgid "Change your password" 124msgid "Change your password"
50msgstr "Modifier votre mot de passe" 125msgstr "Modifier votre mot de passe"
@@ -58,65 +133,60 @@ msgstr "Mot de passe"
58msgid "Repeat your new password:" 133msgid "Repeat your new password:"
59msgstr "Répétez votre nouveau mot de passe :" 134msgstr "Répétez votre nouveau mot de passe :"
60 135
61msgid "Update"
62msgstr "Mettre à jour"
63
64msgid "Import" 136msgid "Import"
65msgstr "Importer" 137msgstr "Importer"
66 138
67msgid "Please execute the import script locally, it can take a very long time." 139msgid "Please execute the import script locally as it can take a very long time."
68msgstr "Merci d'exécuter l'import en local, cela peut prendre du temps." 140msgstr "Merci d'exécuter l'import en local car cela peut prendre du temps."
69 141
70msgid "More info in the official doc:" 142msgid "More info in the official documentation:"
71msgstr "Plus d'infos sur la documentation officielle" 143msgstr "Plus d'infos dans la documentation officielle :"
72 144
73msgid "import from Pocket" 145msgid "Import from Pocket"
74msgstr "import depuis Pocket" 146msgstr "Import depuis Pocket"
75 147
76msgid "import from Readability" 148#, php-format
77msgstr "import depuis Readability" 149msgid "(you must have a %s file on your server)"
150msgstr "(le fichier %s doit être présent sur le serveur)"
78 151
79msgid "import from Instapaper" 152msgid "Import from Readability"
80msgstr "import depuis Instapaper" 153msgstr "Import depuis Readability"
81 154
82msgid "Export your poche data" 155msgid "Import from Instapaper"
83msgstr "Exporter vos données de poche" 156msgstr "Import depuis Instapaper"
84 157
85msgid "Click here" 158msgid "Import from wallabag"
86msgstr "Cliquez-ici" 159msgstr "Import depuis wallabag"
87 160
88msgid "to export your poche data." 161msgid "Export your wallabag data"
89msgstr "pour exporter vos données de poche." 162msgstr "Exporter vos données de wallabag"
90 163
91msgid "back to home" 164msgid "Click here"
92msgstr "retour à l'accueil" 165msgstr "Cliquez ici"
93 166
94msgid "installation" 167msgid "to download your database."
95msgstr "installation" 168msgstr "pour télécharger votre base de données."
96 169
97msgid "install your poche" 170msgid "to export your wallabag data."
98msgstr "installez votre poche" 171msgstr "pour exporter vos données de wallabag."
99 172
100msgid "" 173msgid "Cache"
101"poche is still not installed. Please fill the below form to install it. " 174msgstr "Cache"
102"Don't hesitate to <a href='http://doc.inthepoche.com'>read the documentation "
103"on poche website</a>."
104msgstr ""
105"poche n'est pas encore installé. Merci de remplir le formulaire suivant pour "
106"l'installer. N'hésitez pas à <a href='http://doc.inthepoche.com'>lire la "
107"documentation sur le site de poche</a>."
108 175
109msgid "Login" 176msgid "to delete cache."
110msgstr "Nom d'utilisateur" 177msgstr "pour effacer le cache."
111 178
112msgid "Repeat your password" 179msgid "You can enter multiple tags, separated by commas."
113msgstr "pétez votre mot de passe" 180msgstr "Vous pouvez entrer plusieurs tags, sépas par des virgules."
114 181
115msgid "Install" 182msgid "return to article"
116msgstr "Installer" 183msgstr "retourner à l'article"
117 184
118msgid "back to top" 185msgid "plop"
119msgstr "retour en haut de page" 186msgstr "plop"
187
188msgid "You can <a href='wallabag_compatibility_test.php'>check your configuration here</a>."
189msgstr "Vous pouvez vérifier votre configuration <a href='wallabag_compatibility_test.php'>ici</a>."
120 190
121msgid "favoris" 191msgid "favoris"
122msgstr "favoris" 192msgstr "favoris"
@@ -145,14 +215,17 @@ msgstr "par titre"
145msgid "by title desc" 215msgid "by title desc"
146msgstr "par titre desc" 216msgstr "par titre desc"
147 217
148msgid "No link available here!" 218msgid "Tag"
149msgstr "Aucun lien n'est disponible ici !" 219msgstr "Tag"
150 220
151msgid "toggle mark as read" 221msgid "No articles found."
152msgstr "marquer comme lu / non lu" 222msgstr "Aucun article trouvé."
223
224msgid "Toggle mark as read"
225msgstr "Marquer comme lu / non lu"
153 226
154msgid "toggle favorite" 227msgid "toggle favorite"
155msgstr "marquer comme favori" 228msgstr "marquer / enlever comme favori"
156 229
157msgid "delete" 230msgid "delete"
158msgstr "supprimer" 231msgstr "supprimer"
@@ -160,35 +233,107 @@ msgstr "supprimer"
160msgid "original" 233msgid "original"
161msgstr "original" 234msgstr "original"
162 235
236msgid "estimated reading time:"
237msgstr "temps de lecture estimé :"
238
239msgid "mark all the entries as read"
240msgstr "marquer tous les articles comme lus"
241
163msgid "results" 242msgid "results"
164msgstr "résultats" 243msgstr "résultats"
165 244
166msgid "tweet" 245msgid "installation"
167msgstr "tweet" 246msgstr "installation"
168 247
169msgid "email" 248msgid "install your wallabag"
170msgstr "email" 249msgstr "installez votre wallabag"
250
251msgid "wallabag is still not installed. Please fill the below form to install it. Don't hesitate to <a href='http://doc.wallabag.org/'>read the documentation on wallabag website</a>."
252msgstr "wallabag n'est pas encore installé. Merci de remplir le formulaire suivant pour l'installer. N'hésitez pas à <a href='http://doc.wallabag.org'>lire la documentation sur le site de wallabag</a>."
253
254msgid "Login"
255msgstr "Nom d'utilisateur"
256
257msgid "Repeat your password"
258msgstr "Répétez votre mot de passe"
259
260msgid "Install"
261msgstr "Installer"
262
263msgid "login to your wallabag"
264msgstr "se connecter à votre wallabag"
265
266msgid "Login to wallabag"
267msgstr "Se connecter à wallabag"
268
269msgid "you are in demo mode, some features may be disabled."
270msgstr "vous êtes en mode démo, certaines fonctionnalités peuvent être désactivées."
271
272msgid "Username"
273msgstr "Nom d'utilisateur"
274
275msgid "Stay signed in"
276msgstr "Rester connecté"
277
278msgid "(Do not check on public computers)"
279msgstr "(Ne pas cocher sur un ordinateur public)"
280
281msgid "Sign in"
282msgstr "Se connecter"
283
284msgid "Return home"
285msgstr "Retour accueil"
286
287msgid "Back to top"
288msgstr "Haut de page"
289
290msgid "Mark as read"
291msgstr "Marquer comme lu / non lu"
292
293msgid "Favorite"
294msgstr "Favoris"
295
296msgid "Toggle favorite"
297msgstr "Marquer / enlever comme favori"
298
299msgid "Delete"
300msgstr "Effacer"
301
302msgid "Tweet"
303msgstr "Tweet"
304
305msgid "Email"
306msgstr "E-mail"
171 307
172msgid "shaarli" 308msgid "shaarli"
173msgstr "shaarli" 309msgstr "Shaarli"
174 310
175msgid "flattr" 311msgid "flattr"
176msgstr "flattr" 312msgstr "Flattr"
177 313
178msgid "this article appears wrong?" 314msgid "Does this article appear wrong?"
179msgstr "cet article s'affiche mal ?" 315msgstr "Cet article s'affiche mal ?"
180 316
181msgid "create an issue" 317msgid "tags:"
182msgstr "créez un ticket" 318msgstr "tags :"
183 319
184msgid "or" 320msgid "Edit tags"
185msgstr "ou" 321msgstr "Editer les tags"
186 322
187msgid "contact us by mail" 323msgid "save link!"
188msgstr "contactez-nous par email" 324msgstr "sauver le lien !"
189 325
190msgid "plop" 326msgid "powered by"
191msgstr "plop" 327msgstr "propulsé par"
328
329msgid "debug mode is on so cache is off."
330msgstr "le mode de debug est actif, le cache est donc désactivé."
331
332msgid "your wallabag version:"
333msgstr "votre version de wallabag :"
334
335msgid "storage:"
336msgstr "stockage :"
192 337
193msgid "home" 338msgid "home"
194msgstr "accueil" 339msgstr "accueil"
@@ -196,33 +341,193 @@ msgstr "accueil"
196msgid "favorites" 341msgid "favorites"
197msgstr "favoris" 342msgstr "favoris"
198 343
344msgid "tags"
345msgstr "tags"
346
347msgid "save a link"
348msgstr "sauver un lien"
349
199msgid "logout" 350msgid "logout"
200msgstr "déconnexion" 351msgstr "déconnexion"
201 352
202msgid "powered by" 353msgid "back to home"
203msgstr "propuls par" 354msgstr "retour l'accueil"
204 355
205msgid "debug mode is on so cache is off." 356msgid "toggle mark as read"
206msgstr "le mode de debug est actif, le cache est donc désactivé." 357msgstr "marquer comme lu / non lu"
207 358
208msgid "your poche version:" 359msgid "tweet"
209msgstr "votre version de poche :" 360msgstr "tweet"
210 361
211msgid "storage:" 362msgid "email"
212msgstr "stockage :" 363msgstr "ee-mail"
213 364
214msgid "login to your poche" 365msgid "this article appears wrong?"
215msgstr "se connecter à votre poche" 366msgstr "cet article s'affiche mal ?"
216 367
217msgid "you are in demo mode, some features may be disabled." 368msgid "No link available here!"
218msgstr "" 369msgstr "Aucun lien n'est disponible ici !"
219"vous êtes en mode démo, certaines fonctionnalités peuvent être désactivées."
220 370
221msgid "Stay signed in" 371msgid "Poching a link"
222msgstr "Rester connecté" 372msgstr "Sauver un lien"
223 373
224msgid "(Do not check on public computers)" 374msgid "by filling this field"
225msgstr "(ne pas cocher sur un ordinateur public)" 375msgstr "en remplissant ce champ"
226 376
227msgid "Sign in" 377msgid "bookmarklet: drag & drop this link to your bookmarks bar"
228msgstr "Se connecter" 378msgstr "bookmarklet : glissez-déposez ce lien dans votre barre de favoris"
379
380msgid "your version"
381msgstr "votre version"
382
383msgid "latest stable version"
384msgstr "dernière version stable"
385
386msgid "a more recent stable version is available."
387msgstr "une version stable plus récente est disponible."
388
389msgid "you are up to date."
390msgstr "vous êtes à jour."
391
392msgid "latest dev version"
393msgstr "dernière version de développement"
394
395msgid "a more recent development version is available."
396msgstr "une version de développement plus récente est disponible."
397
398msgid "Please execute the import script locally, it can take a very long time."
399msgstr "Merci d'exécuter l'import en local car cela peut prendre du temps."
400
401msgid "More infos in the official doc:"
402msgstr "Plus d'infos dans la documentation officielle :"
403
404msgid "import from Pocket"
405msgstr "import depuis Pocket"
406
407msgid "import from Readability"
408msgstr "import depuis Readability"
409
410msgid "import from Instapaper"
411msgstr "import depuis Instapaper"
412
413msgid "estimated reading time :"
414msgstr "temps de lecture estimé :"
415
416msgid "Mark all the entries as read"
417msgstr "Marquer tous les articles comme lus"
418
419msgid "Tags"
420msgstr "Tags"
421
422msgid "Untitled"
423msgstr "Sans titre"
424
425msgid "the link has been added successfully"
426msgstr "le lien a été ajouté avec succès"
427
428msgid "error during insertion : the link wasn't added"
429msgstr "erreur pendant l'insertion : le lien n'a pas été ajouté"
430
431msgid "the link has been deleted successfully"
432msgstr "le lien a été effacé avec succès"
433
434msgid "the link wasn't deleted"
435msgstr "le lien n'a pas été effacé"
436
437msgid "Article not found!"
438msgstr "Article non trouvé !"
439
440msgid "previous"
441msgstr "précédent"
442
443msgid "next"
444msgstr "suivant"
445
446msgid "in demo mode, you can't update your password"
447msgstr "en mode démo, vous ne pouvez pas mettre à jour le mot de passe"
448
449msgid "your password has been updated"
450msgstr "votre mot de passe a été mis à jour"
451
452msgid "the two fields have to be filled & the password must be the same in the two fields"
453msgstr "les deux champs doivent être remplis & le mot de passe doit être le même dans les deux"
454
455msgid "still using the \""
456msgstr "utilise encore \""
457
458msgid "that theme does not seem to be installed"
459msgstr "ce thème ne semble pas installé"
460
461msgid "you have changed your theme preferences"
462msgstr "vous avez changez vos préférences de thème"
463
464msgid "that language does not seem to be installed"
465msgstr "cette langue ne semble pas être installée"
466
467msgid "you have changed your language preferences"
468msgstr "vous avez changé vos préférences de langue"
469
470msgid "login failed: you have to fill all fields"
471msgstr "identification échouée : vous devez remplir tous les champs"
472
473msgid "welcome to your wallabag"
474msgstr "bienvenue dans votre wallabag"
475
476msgid "login failed: bad login or password"
477msgstr "identification échouée : mauvais identifiant ou mot de passe"
478
479msgid "import from instapaper completed"
480msgstr "Import depuis Instapaper complété"
481
482msgid "import from pocket completed"
483msgstr "Import depuis Pocket complété"
484
485msgid "import from Readability completed. "
486msgstr "Import depuis Readability complété"
487
488msgid "import from Poche completed. "
489msgstr "Import depuis Pocket complété"
490
491msgid "Unknown import provider."
492msgstr "Fournisseur d'import inconnu."
493
494msgid "Incomplete inc/poche/define.inc.php file, please define \""
495msgstr "Fichier inc/poche/define.inc.php incomplet, merci de définir \""
496
497msgid "Could not find required \""
498msgstr "Ne peut pas trouver \""
499
500msgid "Uh, there is a problem while generating feeds."
501msgstr "Ih, il y a un problème lors de la génération des flux."
502
503msgid "Cache deleted."
504msgstr "Cache effacé."
505
506msgid "Oops, it seems you don't have PHP 5."
507msgstr "Oups, vous ne semblez pas avoir PHP 5."
508
509#~ msgid "poche it!"
510#~ msgstr "pochez-le !"
511
512#~ msgid "Updating poche"
513#~ msgstr "Mettre à jour poche"
514
515#, fuzzy
516#~ msgid "Export your poche datas"
517#~ msgstr "Exporter vos données de poche"
518
519#, fuzzy
520#~ msgid "to export your poche datas."
521#~ msgstr "pour exporter vos données de poche."
522
523#~ msgid "create an issue"
524#~ msgstr "créez un ticket"
525
526#~ msgid "or"
527#~ msgstr "ou"
528
529#~ msgid "contact us by mail"
530#~ msgstr "contactez-nous par email"
531
532#~ msgid "your poche version:"
533#~ msgstr "votre version de poche :"
diff --git a/locale/it_IT.utf8/LC_MESSAGES/it_IT.utf8.po b/locale/it_IT.utf8/LC_MESSAGES/it_IT.utf8.po
index 429d5d55..41cc01e0 100644
--- a/locale/it_IT.utf8/LC_MESSAGES/it_IT.utf8.po
+++ b/locale/it_IT.utf8/LC_MESSAGES/it_IT.utf8.po
@@ -4,54 +4,138 @@
4msgid "" 4msgid ""
5msgstr "" 5msgstr ""
6"Project-Id-Version: poche\n" 6"Project-Id-Version: poche\n"
7"POT-Creation-Date: \n" 7"Report-Msgid-Bugs-To: \n"
8"PO-Revision-Date: 2013-11-25 09:47+0100\n" 8"POT-Creation-Date: 2014-02-25 15:13+0300\n"
9"Last-Translator: Nicolas Lœuillet <nicolas.loeuillet@gmail.com>\n" 9"PO-Revision-Date: 2014-02-25 15:13+0300\n"
10"Language-Team: Italian (http://www.transifex.com/projects/p/poche/language/" 10"Last-Translator: Maryana <mariroz@mr.lviv.ua>\n"
11"it/)\n" 11"Language-Team: Italian (http://www.transifex.com/projects/p/poche/language/it/)\n"
12"Language: it\n"
12"MIME-Version: 1.0\n" 13"MIME-Version: 1.0\n"
13"Content-Type: text/plain; charset=UTF-8\n" 14"Content-Type: text/plain; charset=UTF-8\n"
14"Content-Transfer-Encoding: 8bit\n" 15"Content-Transfer-Encoding: 8bit\n"
15"Language: it\n"
16"Plural-Forms: nplurals=2; plural=(n != 1);\n" 16"Plural-Forms: nplurals=2; plural=(n != 1);\n"
17"X-Generator: Poedit 1.5.4\n" 17"X-Generator: Poedit 1.5.4\n"
18"X-Poedit-Language: Italian\n"
19"X-Poedit-Country: ITALY\n"
20"X-Poedit-Basepath: .\n"
21"X-Poedit-SearchPath-0: /home/mariroz/_DEV/web/wallabag/wallabag-master-testing\n"
22
23msgid "wallabag, a read it later open source system"
24msgstr ""
25
26msgid "login failed: user doesn't exist"
27msgstr ""
28
29msgid "return home"
30msgstr ""
18 31
19msgid "config" 32msgid "config"
20msgstr "configurazione" 33msgstr "configurazione"
21 34
22msgid "Poching a link" 35msgid "Saving articles"
23msgstr "Pochare un link" 36msgstr ""
37
38msgid "There are several ways to save an article:"
39msgstr ""
24 40
25msgid "read the documentation" 41msgid "read the documentation"
26msgstr "leggi la documentazione" 42msgstr "leggi la documentazione"
27 43
28msgid "by filling this field" 44msgid "download the extension"
45msgstr ""
46
47msgid "via F-Droid"
48msgstr ""
49
50msgid " or "
51msgstr ""
52
53msgid "via Google Play"
54msgstr ""
55
56msgid "download the application"
57msgstr ""
58
59#, fuzzy
60msgid "By filling this field"
29msgstr "compilando questo campo" 61msgstr "compilando questo campo"
30 62
31msgid "poche it!" 63msgid "bag it!"
32msgstr "pochalo!" 64msgstr ""
33 65
34msgid "Updating poche" 66msgid "Bookmarklet: drag & drop this link to your bookmarks bar"
35msgstr "Aggiornamento poche" 67msgstr ""
36 68
37msgid "your version" 69msgid "Upgrading wallabag"
38msgstr "la tua versione" 70msgstr ""
39 71
40msgid "latest stable version" 72#, fuzzy
73msgid "Installed version"
41msgstr "ultima versione stabile" 74msgstr "ultima versione stabile"
42 75
43msgid "a more recent stable version is available." 76#, fuzzy
77msgid "Latest stable version"
78msgstr "ultima versione stabile"
79
80#, fuzzy
81msgid "A more recent stable version is available."
44msgstr "è disponibile una versione stabile più recente." 82msgstr "è disponibile una versione stabile più recente."
45 83
46msgid "you are up to date." 84#, fuzzy
85msgid "You are up to date."
47msgstr "sei aggiornato." 86msgstr "sei aggiornato."
48 87
49msgid "latest dev version" 88#, fuzzy
89msgid "Latest dev version"
50msgstr "ultima versione di sviluppo" 90msgstr "ultima versione di sviluppo"
51 91
52msgid "a more recent development version is available." 92#, fuzzy
93msgid "A more recent development version is available."
53msgstr "è disponibile una versione di sviluppo più recente." 94msgstr "è disponibile una versione di sviluppo più recente."
54 95
96msgid "Feeds"
97msgstr ""
98
99msgid "Your feed token is currently empty and must first be generated to enable feeds. Click <a href='?feed&amp;action=generate'>here to generate it</a>."
100msgstr ""
101
102msgid "Unread feed"
103msgstr ""
104
105#, fuzzy
106msgid "Favorites feed"
107msgstr "preferiti"
108
109#, fuzzy
110msgid "Archive feed"
111msgstr "archivio"
112
113msgid "Your token:"
114msgstr ""
115
116msgid "Your user id:"
117msgstr ""
118
119msgid "You can regenerate your token: <a href='?feed&amp;action=generate'>generate!</a>."
120msgstr ""
121
122#, fuzzy
123msgid "Change your theme"
124msgstr "Cambia la tua password"
125
126msgid "Theme:"
127msgstr ""
128
129msgid "Update"
130msgstr "Aggiorna"
131
132#, fuzzy
133msgid "Change your language"
134msgstr "Cambia la tua password"
135
136msgid "Language:"
137msgstr ""
138
55msgid "Change your password" 139msgid "Change your password"
56msgstr "Cambia la tua password" 140msgstr "Cambia la tua password"
57 141
@@ -64,67 +148,68 @@ msgstr "Password"
64msgid "Repeat your new password:" 148msgid "Repeat your new password:"
65msgstr "Ripeti la nuova password:" 149msgstr "Ripeti la nuova password:"
66 150
67msgid "Update"
68msgstr "Aggiorna"
69
70msgid "Import" 151msgid "Import"
71msgstr "Importa" 152msgstr "Importa"
72 153
73msgid "Please execute the import script locally, it can take a very long time." 154#, fuzzy
74msgstr "" 155msgid "Please execute the import script locally as it can take a very long time."
75"Si prega di eseguire lo script di importazione a livello locale, può " 156msgstr "Si prega di eseguire lo script di importazione a livello locale, può richiedere un tempo molto lungo."
76"richiedere un tempo molto lungo."
77 157
78msgid "More info in the official doc:" 158#, fuzzy
159msgid "More info in the official documentation:"
79msgstr "Maggiori info nella documentazione ufficiale" 160msgstr "Maggiori info nella documentazione ufficiale"
80 161
81msgid "import from Pocket" 162#, fuzzy
163msgid "Import from Pocket"
82msgstr "Importa da Pocket" 164msgstr "Importa da Pocket"
83 165
84msgid "import from Readability" 166#, php-format
167msgid "(you must have a %s file on your server)"
168msgstr ""
169
170#, fuzzy
171msgid "Import from Readability"
85msgstr "Importa da Readability" 172msgstr "Importa da Readability"
86 173
87msgid "import from Instapaper" 174#, fuzzy
175msgid "Import from Instapaper"
88msgstr "Importa da Instapaper" 176msgstr "Importa da Instapaper"
89 177
90msgid "Export your poche data" 178#, fuzzy
179msgid "Import from wallabag"
180msgstr "Importa da Readability"
181
182#, fuzzy
183msgid "Export your wallabag data"
91msgstr "Esporta i tuoi dati di poche" 184msgstr "Esporta i tuoi dati di poche"
92 185
93msgid "Click here" 186msgid "Click here"
94msgstr "Fai clic qui" 187msgstr "Fai clic qui"
95 188
96msgid "to export your poche data." 189msgid "to download your database."
97msgstr "per esportare i tuoi dati di poche." 190msgstr ""
98
99msgid "back to home"
100msgstr "torna alla home"
101 191
102msgid "installation" 192#, fuzzy
103msgstr "installazione" 193msgid "to export your wallabag data."
194msgstr "per esportare i tuoi dati di poche."
104 195
105msgid "install your poche" 196msgid "Cache"
106msgstr "installa il tuo poche" 197msgstr ""
107 198
108msgid "" 199msgid "to delete cache."
109"poche is still not installed. Please fill the below form to install it. "
110"Don't hesitate to <a href='http://doc.inthepoche.com'>read the documentation "
111"on poche website</a>."
112msgstr "" 200msgstr ""
113"poche non è ancora installato. Si prega di riempire il modulo sottostante "
114"per completare l'installazione. <a href='http://doc.inthepoche.com'>Leggere "
115"la documentazione sul sito di poche</a>."
116 201
117msgid "Login" 202msgid "You can enter multiple tags, separated by commas."
118msgstr "Nome utente" 203msgstr ""
119 204
120msgid "Repeat your password" 205msgid "return to article"
121msgstr "Ripeti la tua password" 206msgstr ""
122 207
123msgid "Install" 208msgid "plop"
124msgstr "Installa" 209msgstr "plop"
125 210
126msgid "back to top" 211msgid "You can <a href='wallabag_compatibility_test.php'>check your configuration here</a>."
127msgstr "torna a inizio pagina" 212msgstr ""
128 213
129msgid "favoris" 214msgid "favoris"
130msgstr "preferiti" 215msgstr "preferiti"
@@ -153,10 +238,14 @@ msgstr "per titolo"
153msgid "by title desc" 238msgid "by title desc"
154msgstr "per titolo decr" 239msgstr "per titolo decr"
155 240
156msgid "No link available here!" 241msgid "Tag"
157msgstr "Nessun link disponibile!" 242msgstr ""
158 243
159msgid "toggle mark as read" 244msgid "No articles found."
245msgstr ""
246
247#, fuzzy
248msgid "Toggle mark as read"
160msgstr "segna come letto / non letto" 249msgstr "segna come letto / non letto"
161 250
162msgid "toggle favorite" 251msgid "toggle favorite"
@@ -168,13 +257,95 @@ msgstr "elimina"
168msgid "original" 257msgid "original"
169msgstr "originale" 258msgstr "originale"
170 259
260msgid "estimated reading time:"
261msgstr ""
262
263msgid "mark all the entries as read"
264msgstr ""
265
171msgid "results" 266msgid "results"
172msgstr "risultati" 267msgstr "risultati"
173 268
174msgid "tweet" 269msgid "installation"
270msgstr "installazione"
271
272#, fuzzy
273msgid "install your wallabag"
274msgstr "installa il tuo poche"
275
276#, fuzzy
277msgid "wallabag is still not installed. Please fill the below form to install it. Don't hesitate to <a href='http://doc.wallabag.org/'>read the documentation on wallabag website</a>."
278msgstr "poche non è ancora installato. Si prega di riempire il modulo sottostante per completare l'installazione. <a href='http://doc.inthepoche.com'>Leggere la documentazione sul sito di poche</a>."
279
280msgid "Login"
281msgstr "Nome utente"
282
283msgid "Repeat your password"
284msgstr "Ripeti la tua password"
285
286msgid "Install"
287msgstr "Installa"
288
289#, fuzzy
290msgid "login to your wallabag"
291msgstr "accedi al tuo poche"
292
293msgid "Login to wallabag"
294msgstr ""
295
296msgid "you are in demo mode, some features may be disabled."
297msgstr "sei in modalità dimostrazione, alcune funzionalità potrebbero essere disattivate."
298
299msgid "Username"
300msgstr ""
301
302msgid "Stay signed in"
303msgstr "Resta connesso"
304
305msgid "(Do not check on public computers)"
306msgstr "(non selezionare su computer pubblici)"
307
308msgid "Sign in"
309msgstr "Accedi"
310
311msgid "favorites"
312msgstr "preferiti"
313
314msgid "estimated reading time :"
315msgstr ""
316
317msgid "Mark all the entries as read"
318msgstr ""
319
320msgid "Return home"
321msgstr ""
322
323#, fuzzy
324msgid "Back to top"
325msgstr "torna a inizio pagina"
326
327#, fuzzy
328msgid "Mark as read"
329msgstr "segna come letto / non letto"
330
331#, fuzzy
332msgid "Favorite"
333msgstr "preferiti"
334
335#, fuzzy
336msgid "Toggle favorite"
337msgstr "segna come preferito"
338
339#, fuzzy
340msgid "Delete"
341msgstr "elimina"
342
343#, fuzzy
344msgid "Tweet"
175msgstr "twitta" 345msgstr "twitta"
176 346
177msgid "email" 347#, fuzzy
348msgid "Email"
178msgstr "email" 349msgstr "email"
179 350
180msgid "shaarli" 351msgid "shaarli"
@@ -183,26 +354,24 @@ msgstr "shaarli"
183msgid "flattr" 354msgid "flattr"
184msgstr "flattr" 355msgstr "flattr"
185 356
186msgid "this article appears wrong?" 357#, fuzzy
358msgid "Does this article appear wrong?"
187msgstr "articolo non visualizzato correttamente?" 359msgstr "articolo non visualizzato correttamente?"
188 360
189msgid "create an issue" 361msgid "tags:"
190msgstr "crea una segnalazione" 362msgstr ""
191
192msgid "or"
193msgstr "oppure"
194 363
195msgid "contact us by mail" 364msgid "Edit tags"
196msgstr "contattaci via email" 365msgstr ""
197 366
198msgid "plop" 367msgid "save link!"
199msgstr "plop" 368msgstr ""
200 369
201msgid "home" 370msgid "home"
202msgstr "home" 371msgstr "home"
203 372
204msgid "favorites" 373msgid "tags"
205msgstr "preferiti" 374msgstr ""
206 375
207msgid "logout" 376msgid "logout"
208msgstr "esci" 377msgstr "esci"
@@ -213,25 +382,187 @@ msgstr "realizzato con"
213msgid "debug mode is on so cache is off." 382msgid "debug mode is on so cache is off."
214msgstr "modalità di debug attiva, cache disattivata." 383msgstr "modalità di debug attiva, cache disattivata."
215 384
216msgid "your poche version:" 385#, fuzzy
217msgstr "la tua versione di poche:" 386msgid "your wallabag version:"
387msgstr "la tua versione"
218 388
219msgid "storage:" 389msgid "storage:"
220msgstr "memoria:" 390msgstr "memoria:"
221 391
222msgid "login to your poche" 392msgid "save a link"
223msgstr "accedi al tuo poche" 393msgstr ""
224 394
225msgid "you are in demo mode, some features may be disabled." 395msgid "back to home"
396msgstr "torna alla home"
397
398msgid "toggle mark as read"
399msgstr "segna come letto / non letto"
400
401msgid "tweet"
402msgstr "twitta"
403
404msgid "email"
405msgstr "email"
406
407msgid "this article appears wrong?"
408msgstr "articolo non visualizzato correttamente?"
409
410msgid "No link available here!"
411msgstr "Nessun link disponibile!"
412
413msgid "Poching a link"
414msgstr "Pochare un link"
415
416msgid "by filling this field"
417msgstr "compilando questo campo"
418
419msgid "bookmarklet: drag & drop this link to your bookmarks bar"
226msgstr "" 420msgstr ""
227"sei in modalità dimostrazione, alcune funzionalità potrebbero essere "
228"disattivate."
229 421
230msgid "Stay signed in" 422msgid "your version"
231msgstr "Resta connesso" 423msgstr "la tua versione"
232 424
233msgid "(Do not check on public computers)" 425msgid "latest stable version"
234msgstr "(non selezionare su computer pubblici)" 426msgstr "ultima versione stabile"
235 427
236msgid "Sign in" 428msgid "a more recent stable version is available."
237msgstr "Accedi" 429msgstr "è disponibile una versione stabile più recente."
430
431msgid "you are up to date."
432msgstr "sei aggiornato."
433
434msgid "latest dev version"
435msgstr "ultima versione di sviluppo"
436
437msgid "a more recent development version is available."
438msgstr "è disponibile una versione di sviluppo più recente."
439
440msgid "Please execute the import script locally, it can take a very long time."
441msgstr "Si prega di eseguire lo script di importazione a livello locale, può richiedere un tempo molto lungo."
442
443#, fuzzy
444msgid "More infos in the official doc:"
445msgstr "Maggiori info nella documentazione ufficiale"
446
447msgid "import from Pocket"
448msgstr "Importa da Pocket"
449
450msgid "import from Readability"
451msgstr "Importa da Readability"
452
453msgid "import from Instapaper"
454msgstr "Importa da Instapaper"
455
456msgid "Tags"
457msgstr ""
458
459#, fuzzy
460msgid "Untitled"
461msgstr "per titolo"
462
463msgid "the link has been added successfully"
464msgstr ""
465
466msgid "error during insertion : the link wasn't added"
467msgstr ""
468
469msgid "the link has been deleted successfully"
470msgstr ""
471
472msgid "the link wasn't deleted"
473msgstr ""
474
475msgid "Article not found!"
476msgstr ""
477
478msgid "previous"
479msgstr ""
480
481msgid "next"
482msgstr ""
483
484msgid "in demo mode, you can't update your password"
485msgstr ""
486
487msgid "your password has been updated"
488msgstr ""
489
490msgid "the two fields have to be filled & the password must be the same in the two fields"
491msgstr ""
492
493msgid "still using the \""
494msgstr ""
495
496msgid "that theme does not seem to be installed"
497msgstr ""
498
499msgid "you have changed your theme preferences"
500msgstr ""
501
502msgid "that language does not seem to be installed"
503msgstr ""
504
505msgid "you have changed your language preferences"
506msgstr ""
507
508msgid "login failed: you have to fill all fields"
509msgstr ""
510
511msgid "welcome to your wallabag"
512msgstr ""
513
514msgid "login failed: bad login or password"
515msgstr ""
516
517#, fuzzy
518msgid "import from instapaper completed"
519msgstr "Importa da Instapaper"
520
521#, fuzzy
522msgid "import from pocket completed"
523msgstr "Importa da Pocket"
524
525#, fuzzy
526msgid "import from Readability completed. "
527msgstr "Importa da Readability"
528
529#, fuzzy
530msgid "import from Poche completed. "
531msgstr "Importa da Pocket"
532
533msgid "Unknown import provider."
534msgstr ""
535
536msgid "Incomplete inc/poche/define.inc.php file, please define \""
537msgstr ""
538
539msgid "Could not find required \""
540msgstr ""
541
542msgid "Uh, there is a problem while generating feeds."
543msgstr ""
544
545#, fuzzy
546msgid "Cache deleted."
547msgstr "elimina"
548
549msgid "Oops, it seems you don't have PHP 5."
550msgstr ""
551
552#~ msgid "poche it!"
553#~ msgstr "pochalo!"
554
555#~ msgid "Updating poche"
556#~ msgstr "Aggiornamento poche"
557
558#~ msgid "create an issue"
559#~ msgstr "crea una segnalazione"
560
561#~ msgid "or"
562#~ msgstr "oppure"
563
564#~ msgid "contact us by mail"
565#~ msgstr "contattaci via email"
566
567#~ msgid "your poche version:"
568#~ msgstr "la tua versione di poche:"
diff --git a/locale/pl_PL.utf8/LC_MESSAGES/pl_PL.utf8.mo b/locale/pl_PL.utf8/LC_MESSAGES/pl_PL.utf8.mo
index 3e8b132f..b363385a 100755
--- a/locale/pl_PL.utf8/LC_MESSAGES/pl_PL.utf8.mo
+++ b/locale/pl_PL.utf8/LC_MESSAGES/pl_PL.utf8.mo
Binary files differ
diff --git a/locale/pl_PL.utf8/LC_MESSAGES/pl_PL.utf8.po b/locale/pl_PL.utf8/LC_MESSAGES/pl_PL.utf8.po
index 0e7cbcf8..1764bd61 100755
--- a/locale/pl_PL.utf8/LC_MESSAGES/pl_PL.utf8.po
+++ b/locale/pl_PL.utf8/LC_MESSAGES/pl_PL.utf8.po
@@ -2,8 +2,8 @@ msgid ""
2msgstr "" 2msgstr ""
3"Project-Id-Version: wballabag\n" 3"Project-Id-Version: wballabag\n"
4"Report-Msgid-Bugs-To: \n" 4"Report-Msgid-Bugs-To: \n"
5"POT-Creation-Date: 2014-02-07 17:38+0300\n" 5"POT-Creation-Date: 2014-02-24 15:19+0300\n"
6"PO-Revision-Date: 2014-02-07 17:43+0300\n" 6"PO-Revision-Date: 2014-02-24 15:29+0300\n"
7"Last-Translator: Maryana <mariroz@mr.lviv.ua>\n" 7"Last-Translator: Maryana <mariroz@mr.lviv.ua>\n"
8"Language-Team: \n" 8"Language-Team: \n"
9"Language: \n" 9"Language: \n"
@@ -15,7 +15,7 @@ msgstr ""
15"X-Poedit-Language: Polish\n" 15"X-Poedit-Language: Polish\n"
16"X-Poedit-Country: POLAND\n" 16"X-Poedit-Country: POLAND\n"
17"X-Poedit-SourceCharset: utf-8\n" 17"X-Poedit-SourceCharset: utf-8\n"
18"X-Poedit-SearchPath-0: /home/mariroz/_DEV/web/wallabag/wallabag\n" 18"X-Poedit-SearchPath-0: /home/mariroz/_DEV/web/wallabag/wallabag-master-testing\n"
19 19
20msgid "poche, a read it later open source system" 20msgid "poche, a read it later open source system"
21msgstr "poche, serwis odrocznego czytania open source" 21msgstr "poche, serwis odrocznego czytania open source"
@@ -23,72 +23,158 @@ msgstr "poche, serwis odrocznego czytania open source"
23msgid "login failed: user doesn't exist" 23msgid "login failed: user doesn't exist"
24msgstr "logowanie nie udało się: użytkownik nie istnieje" 24msgstr "logowanie nie udało się: użytkownik nie istnieje"
25 25
26msgid "Return home" 26msgid "home"
27msgstr "Wrocic do głównej" 27msgstr "strona domowa"
28 28
29msgid "Back to top" 29msgid "favorites"
30msgstr "Wrócić na górę" 30msgstr "ulubione"
31 31
32msgid "original" 32msgid "archive"
33msgstr "oryginal" 33msgstr "archiwum"
34 34
35msgid "Mark as read" 35msgid "tags"
36msgstr "Zaznacz jako przeczytane" 36msgstr "tagi"
37 37
38msgid "Toggle mark as read" 38msgid "config"
39msgstr "Przełącz jako przeczytane" 39msgstr "ustawienia"
40 40
41msgid "Favorite" 41msgid "logout"
42msgstr "Ulubiony" 42msgstr "wyloguj"
43 43
44msgid "Toggle favorite" 44msgid "back to home"
45msgstr "Zaznacz jako ulubione" 45msgstr "wróć do strony domowej"
46 46
47msgid "Delete" 47msgid "Tags"
48msgstr "Usuń" 48msgstr "Tagi"
49 49
50msgid "Tweet" 50#, fuzzy
51msgstr "Tweet" 51msgid "Poching a link"
52msgstr "Zapisywanie linków"
52 53
53msgid "Email" 54msgid "You can poche a link by several methods:"
54msgstr "Wyslij email" 55msgstr "Istnieje kilka sposobów aby zapisać link:"
55 56
56msgid "shaarli" 57msgid "read the documentation"
57msgstr "shaarli" 58msgstr "przeczytaj dokumentację"
58 59
59msgid "flattr" 60msgid "download the extension"
60msgstr "flattr" 61msgstr "pobierz rozszerzenie"
61 62
62msgid "Does this article appear wrong?" 63msgid "download the application"
63msgstr "Czy ten artykuł wygląda nieprawidłowo?" 64msgstr "pobierz aplikację"
64 65
65msgid "tags:" 66#, fuzzy
66msgstr "tegi:" 67msgid "by filling this field"
68msgstr "Poprzez wypełnienie tego pola"
67 69
68msgid "Edit tags" 70msgid "poche it!"
69msgstr "Redagowac tegi" 71msgstr "zapisz!"
70 72
71msgid "return home" 73#, fuzzy
72msgstr "wrócić do głównej" 74msgid "bookmarklet: drag & drop this link to your bookmarks bar"
75msgstr "Bookmarklet: przeciągnij i upucs ten link na pasek zakladek"
73 76
74msgid "powered by" 77msgid "Updating poche"
75msgstr "zasilany przez" 78msgstr "Aktualizacja poche"
76 79
77msgid "debug mode is on so cache is off." 80msgid "your version"
78msgstr "tryb debugowania jest włączony, więc cash jest wyłączony." 81msgstr "twoja wersja"
79 82
80msgid "your poche version:" 83#, fuzzy
81msgstr "twoja wersja poche:" 84msgid "latest stable version"
85msgstr "Najnowsza stabilna wersja"
82 86
83msgid "storage:" 87#, fuzzy
84msgstr "magazyn:" 88msgid "a more recent stable version is available."
89msgstr "Nowsza stabilna wersja jest dostępna."
90
91msgid "you are up to date."
92msgstr "brak nowych aktualizacji."
93
94msgid "latest dev version"
95msgstr "najnowsza wersja rozwojowa"
96
97msgid "a more recent development version is available."
98msgstr "Nowsza wersja rozwojowa jest dostępna."
99
100msgid "Change your theme"
101msgstr "Zmień motyw"
102
103msgid "Theme:"
104msgstr "Motyw:"
105
106msgid "Update"
107msgstr "Aktualizacja"
108
109msgid "Change your password"
110msgstr "Zmień hasło"
111
112msgid "New password:"
113msgstr "Nowe hasło:"
114
115msgid "Password"
116msgstr "Hasło"
117
118msgid "Repeat your new password:"
119msgstr "Powtórz hasło jeszcze raz:"
120
121msgid "Import"
122msgstr "Import"
123
124msgid "Please execute the import script locally, it can take a very long time."
125msgstr "Proszę wykonać skrypt importu lokalnie, ponieważ moze to trwać bardzo długo."
126
127msgid "More infos in the official doc:"
128msgstr "Więcej informacji znajduje się w oficjalnej dokumentacji:"
129
130msgid "import from Pocket"
131msgstr "Importuj z Pocket'a"
132
133#, php-format
134msgid "(you must have a %s file on your server)"
135msgstr "(musisz mieć plik %s na serwerze)"
136
137msgid "import from Readability"
138msgstr "Importuj z Readability"
139
140msgid "import from Instapaper"
141msgstr "Importuj z Instapaper"
142
143#, fuzzy
144msgid "Export your poche datas"
145msgstr "Exportuj dane poche"
146
147msgid "Click here"
148msgstr "Kliknij tu"
149
150#, fuzzy
151msgid "to export your poche datas."
152msgstr "aby wyeksportować dane poche."
153
154msgid "plop"
155msgstr "plop"
156
157msgid "installation"
158msgstr "instalacja"
159
160msgid "install your wallabag"
161msgstr "zainstaluj wallabag"
162
163msgid "wallabag is still not installed. Please fill the below form to install it. Don't hesitate to <a href='http://doc.wallabag.org/'>read the documentation on wallabag website</a>."
164msgstr "wallabag nie jest jeszcze zainstalowany. Proszę wypełnić poniższy formularz, aby go zainstalować. Nie wahaj się <a href='http://doc.wallabag.org/'>zapoznać się z dokumentacją na stronie wallabag</a>."
165
166msgid "Login"
167msgstr "Login"
168
169msgid "Repeat your password"
170msgstr "Powtórz hasło"
171
172msgid "Install"
173msgstr "Instaluj"
85 174
86msgid "favoris" 175msgid "favoris"
87msgstr "ulubione" 176msgstr "ulubione"
88 177
89msgid "archive"
90msgstr "archiwum"
91
92msgid "unread" 178msgid "unread"
93msgstr "nieprzeczytane" 179msgstr "nieprzeczytane"
94 180
@@ -99,7 +185,7 @@ msgid "by date"
99msgstr "wg daty" 185msgstr "wg daty"
100 186
101msgid "by date desc" 187msgid "by date desc"
102msgstr "według daty spadająco" 188msgstr "według daty malejąco"
103 189
104msgid "by title asc" 190msgid "by title asc"
105msgstr "według tytułu rosnąco" 191msgstr "według tytułu rosnąco"
@@ -110,14 +196,20 @@ msgstr "wg tytułu"
110msgid "by title desc" 196msgid "by title desc"
111msgstr "według tytułu malejąco" 197msgstr "według tytułu malejąco"
112 198
113msgid "No articles found." 199msgid "No link available here!"
114msgstr "Nie znaleziono artykułów." 200msgstr "Brak dostępnych linków!"
201
202msgid "toggle mark as read"
203msgstr "przełącz jako przeczytane"
115 204
116msgid "toggle favorite" 205msgid "toggle favorite"
117msgstr "przełączyc ulubione" 206msgstr "przełącz ulubione"
118 207
119msgid "delete" 208msgid "delete"
120msgstr "usunąć" 209msgstr "usuń"
210
211msgid "original"
212msgstr "oryginał"
121 213
122msgid "estimated reading time:" 214msgid "estimated reading time:"
123msgstr "szacowany czas odczytu:" 215msgstr "szacowany czas odczytu:"
@@ -125,32 +217,23 @@ msgstr "szacowany czas odczytu:"
125msgid "results" 217msgid "results"
126msgstr "wyniki" 218msgstr "wyniki"
127 219
128msgid "home" 220msgid "login to your wallabag"
129msgstr "główna" 221msgstr "zaloguj się do swojego wallabag"
130
131msgid "favorites"
132msgstr "ulubione"
133
134msgid "tags"
135msgstr "tagi"
136
137msgid "config"
138msgstr "ustawienia"
139 222
140msgid "logout" 223msgid "you are in demo mode, some features may be disabled."
141msgstr "wyloguj" 224msgstr "jesteś w trybie demo, niektóre funkcje mogą być wyłączone."
142 225
143msgid "Poching links" 226msgid "Stay signed in"
144msgstr "Zapisywanie linków" 227msgstr "Pozostań zalogowany"
145 228
146msgid "There are several ways to poche a link:" 229msgid "(Do not check on public computers)"
147msgstr "Istnieje kilka sposobów aby zapisać link:" 230msgstr "(Nie sprawdzaj na publicznych komputerach)"
148 231
149msgid "read the documentation" 232msgid "Saving articles"
150msgstr "zapoznać się z dokumentacją" 233msgstr "Zapisywanie artykułów"
151 234
152msgid "download the extension" 235msgid "There are several ways to save an article:"
153msgstr "pobrać rozszerzenie" 236msgstr "Istnieje kilka sposobów aby zapisać artykuł:"
154 237
155msgid "via F-Droid" 238msgid "via F-Droid"
156msgstr "przez F-Droid" 239msgstr "przez F-Droid"
@@ -161,20 +244,17 @@ msgstr "albo"
161msgid "via Google Play" 244msgid "via Google Play"
162msgstr "przez Google Play" 245msgstr "przez Google Play"
163 246
164msgid "download the application"
165msgstr "pobrać aplikację"
166
167msgid "By filling this field" 247msgid "By filling this field"
168msgstr "Poprzez wypełnienie tego pola" 248msgstr "Poprzez wypełnienie tego pola"
169 249
170msgid "poche it!" 250msgid "bag it!"
171msgstr "zapis!" 251msgstr "zapisz!"
172 252
173msgid "Bookmarklet: drag & drop this link to your bookmarks bar" 253msgid "Bookmarklet: drag & drop this link to your bookmarks bar"
174msgstr "Bookmarklet: przeciągnij i upucs ten link na pasek zakladek" 254msgstr "Bookmarklet: przeciągnij i upuść ten link na pasek zakladek"
175 255
176msgid "Updating poche" 256msgid "Upgrading wallabag"
177msgstr "Aktualizacja poche" 257msgstr "Aktualizacja wallabag"
178 258
179msgid "Installed version" 259msgid "Installed version"
180msgstr "Zainstalowana wersja " 260msgstr "Zainstalowana wersja "
@@ -186,170 +266,195 @@ msgid "A more recent stable version is available."
186msgstr "Nowsza stabilna wersja jest dostępna." 266msgstr "Nowsza stabilna wersja jest dostępna."
187 267
188msgid "You are up to date." 268msgid "You are up to date."
189msgstr "Masz wszystko najnowsze." 269msgstr "Brak nowych aktualizacji."
190 270
191msgid "latest dev version" 271msgid "Latest dev version"
192msgstr "najnowsza wersja dev" 272msgstr "Najnowsza wersja rozwojowa"
193 273
194msgid "a more recent development version is available." 274#, fuzzy
275msgid "A more recent development version is available."
195msgstr "Nowsza wersja rozwojowa jest dostępna." 276msgstr "Nowsza wersja rozwojowa jest dostępna."
196 277
197msgid "you are up to date."
198msgstr "masz wszystko najnowsze."
199
200msgid "Feeds" 278msgid "Feeds"
201msgstr "Kanały (feeds)" 279msgstr "Kanały (feeds)"
202 280
203msgid "Your feed token is currently empty and must first be generated to enable feeds. Click <a href='?feed&amp;action=generate'>here to generate it</a>." 281msgid "Your feed token is currently empty and must first be generated to enable feeds. Click <a href='?feed&amp;action=generate'>here to generate it</a>."
204msgstr "Twój znak kanału jest pusty i musi najpierw zostac wygenerowany. Kliknij <a href='?feed&action=generate'>tu dla jego generacji</a>." 282msgstr "Twój token kanału jest pusty i musi najpierw zostać wygenerowany. Kliknij <a href='?feed&action=generate'>tu aby go wygenerować</a>."
205 283
206msgid "Unread feed" 284msgid "Unread feed"
207msgstr "Kanał nieprzeczytanego" 285msgstr "Kanał nieprzeczytanych"
208 286
209msgid "Favorites feed" 287msgid "Favorites feed"
210msgstr "Kanał ulubionego" 288msgstr "Kanał ulubionych"
211 289
212msgid "Archive feed" 290msgid "Archive feed"
213msgstr "Kanał archiwum" 291msgstr "Kanał archiwum"
214 292
215msgid "Your token:" 293msgid "Your token:"
216msgstr "Twój znak (token): " 294msgstr "Twój token: "
217 295
218msgid "Your user id:" 296msgid "Your user id:"
219msgstr "Twój id użytkownika (user id):" 297msgstr "Twój identyfikator użytkownika:"
220 298
221msgid "You can regenerate your token: <a href='?feed&amp;action=generate'>generate!</a>." 299msgid "You can regenerate your token: <a href='?feed&amp;action=generate'>generate!</a>."
222msgstr "Mozna zgenerowac nowy znak: kliknij <a href='?feed&amp;action=generate'>zgenerowac!</a>." 300msgstr "Możesz wygenerować token ponownie: kliknij <a href='?feed&amp;action=generate'>generuj!</a>."
223
224msgid "Change your theme"
225msgstr "Zmienic motyw"
226
227msgid "Theme:"
228msgstr "Motyw:"
229
230msgid "Update"
231msgstr "Aktualizacja"
232 301
233msgid "Change your language" 302msgid "Change your language"
234msgstr "Zmienić język" 303msgstr "Zmień język"
235 304
236msgid "Language:" 305msgid "Language:"
237msgstr "Język:" 306msgstr "Język:"
238 307
239msgid "Change your password"
240msgstr "Zmień hasło"
241
242msgid "New password:"
243msgstr "Nowe hasło:"
244
245msgid "Password"
246msgstr "Hasło"
247
248msgid "Repeat your new password:"
249msgstr "Powtórz hasło jeszcze raz:"
250
251msgid "Import"
252msgstr "Import"
253
254msgid "Please execute the import script locally as it can take a very long time." 308msgid "Please execute the import script locally as it can take a very long time."
255msgstr "Proszę wykonać skrypt import lokalnie, gdyż moze to trwać bardzo długo." 309msgstr "Proszę wykonać skrypt importu lokalnie, gdyż moze to trwać bardzo długo."
256 310
257msgid "More info in the official docs:" 311#, fuzzy
258msgstr "Więcej informacji w oficjalnej dokumentacji:" 312msgid "More info in the official documentation:"
313msgstr "Więcej informacji znajduje się w oficjalnej dokumentacji:"
259 314
260msgid "Import from Pocket" 315msgid "Import from Pocket"
261msgstr "Іmport z Pocket'a" 316msgstr "Іmport z Pocket'a"
262 317
263#, php-format
264msgid "(you must have a %s file on your server)"
265msgstr "(musisz mieć plik %s na serwerze)"
266
267msgid "Import from Readability" 318msgid "Import from Readability"
268msgstr "Import z Readability" 319msgstr "Import z Readability"
269 320
270msgid "Import from Instapaper" 321msgid "Import from Instapaper"
271msgstr "Import z Instapaper" 322msgstr "Import z Instapaper"
272 323
273msgid "Import from poche" 324msgid "Import from wallabag"
274msgstr "Import z poche" 325msgstr "Import z wallabag"
275
276msgid "Export your poche data"
277msgstr "Eksportowac dane poche"
278 326
279msgid "Click here" 327msgid "Export your wallabag data"
280msgstr "Kliknij tu" 328msgstr "Eksportowac dane wallabag"
281 329
282msgid "to download your database." 330msgid "to download your database."
283msgstr "aby pobrac bazę danych." 331msgstr "aby pobrac bazę danych."
284 332
285msgid "to export your poche data." 333msgid "to export your wallabag data."
286msgstr "aby eksportować dane poche." 334msgstr "aby eksportować dane wallabag."
287 335
288msgid "Tag" 336msgid "Cache"
289msgstr "Teg" 337msgstr "Cache"
290 338
291msgid "No link available here!" 339msgid "to delete cache."
292msgstr "Brak dostępnych linków!" 340msgstr "aby wyczyścić cache."
293 341
294msgid "toggle mark as read" 342msgid "tweet"
295msgstr "przełączyć znak jako przeczytane" 343msgstr "tweet"
344
345#, fuzzy
346msgid "email"
347msgstr "Wyślij email"
348
349msgid "shaarli"
350msgstr "shaarli"
351
352msgid "flattr"
353msgstr "flattr"
354
355msgid "this article appears wrong?"
356msgstr "Czy ten artykuł wyświetla się nieprawidłowo?"
296 357
297msgid "You can enter multiple tags, separated by commas." 358msgid "You can enter multiple tags, separated by commas."
298msgstr "Mozna wprowadzić wiele tagów rozdzielajac je przecinkami." 359msgstr "Możesz wprowadzić wiele tagów, rozdzielając je przecinkami."
299 360
300msgid "return to article" 361msgid "return to article"
301msgstr "wrócić do artykułu" 362msgstr "wróć do artykułu"
302 363
303msgid "plop" 364#, fuzzy
304msgstr "plop" 365msgid "powered by"
366msgstr "zasilany przez"
367
368msgid "debug mode is on so cache is off."
369msgstr "tryb debugowania jest włączony, więc cashe jest wyłączony."
370
371msgid "your wallabag version:"
372msgstr "twoja wersja wallabag:"
373
374msgid "storage:"
375msgstr "magazyn:"
376
377msgid "save a link"
378msgstr "zapisz link"
379
380msgid "return home"
381msgstr "wróć do strony domowej"
305 382
306msgid "You can <a href='wallabag_compatibility_test.php'>check your configuration here</a>." 383msgid "You can <a href='wallabag_compatibility_test.php'>check your configuration here</a>."
307msgstr "Można <a href='wallabag_compatibility_test.php'>sprawdzić swoją konfigurację tu</a>." 384msgstr "Możesz <a href='wallabag_compatibility_test.php'>sprawdzić swoją konfigurację tu</a>."
308 385
309msgid "installation" 386msgid "Tag"
310msgstr "instalacja" 387msgstr "Tag"
311 388
312msgid "install your wallabag" 389msgid "No articles found."
313msgstr "zainstalować wallabag" 390msgstr "Nie znaleziono artykułów."
314 391
315msgid "wallabag is still not installed. Please fill the below form to install it. Don't hesitate to <a href='http://doc.wallabag.org/'>read the documentation on wallabag website</a>." 392msgid "Toggle mark as read"
316msgstr "wallabag nie jest jeszcze zainstalowany. Proszę wypełnić poniższy formularz, aby go zainstalowac. Nie wahaj się <a href='http://doc.wallabag.org/'>zapoznac się z dokumentacja na stronie wallabag</a>." 393msgstr "Przełącz jako przeczytane"
317 394
318msgid "Login" 395msgid "mark all the entries as read"
396msgstr "zaznacz wszystko jako przeczytane"
397
398msgid "Login to wallabag"
399msgstr "Zaloguj się do wallabag"
400
401msgid "Username"
402msgstr "Nazwa użytkownika"
403
404msgid "Sign in"
319msgstr "Login" 405msgstr "Login"
320 406
321msgid "Repeat your password" 407msgid "Return home"
322msgstr "Powtórz hasło" 408msgstr "Wróć do strony domowej"
323 409
324msgid "Install" 410msgid "Back to top"
325msgstr "Instalowac" 411msgstr "Wróć na górę"
326 412
327msgid "login to your wallabag" 413msgid "Mark as read"
328msgstr "zalogować się do swojego wallabag" 414msgstr "Zaznacz jako przeczytane"
329 415
330msgid "Login to wallabag" 416msgid "Favorite"
331msgstr "Zalogować się do wallabag" 417msgstr "Ulubione"
332 418
333msgid "you are in demo mode, some features may be disabled." 419msgid "Toggle favorite"
334msgstr "jesteś w trybie demo, niektóre funkcje mo być niedostępne." 420msgstr "Zaznacz jako ulubione"
335 421
336msgid "Username" 422msgid "Delete"
337msgstr "Imię u��ytkownika" 423msgstr "Usu�"
338 424
339msgid "Stay signed in" 425msgid "Tweet"
340msgstr "Pozostań zalogowany" 426msgstr "Tweet"
341 427
342msgid "(Do not check on public computers)" 428msgid "Email"
343msgstr "(Nie sprawdzaj na publicznych komputerach" 429msgstr "Wyślij email"
430
431msgid "Does this article appear wrong?"
432msgstr "Czy ten artykuł wyświetla się nieprawidłowo?"
433
434msgid "tags:"
435msgstr "tegi:"
436
437msgid "Edit tags"
438msgstr "Edytuj tagi"
439
440msgid "save link!"
441msgstr "zapisz link!"
442
443#, fuzzy
444msgid "estimated reading time :"
445msgstr "szacowany czas odczytu:"
446
447msgid "Mark all the entries as read"
448msgstr "Oznacz wszystko jako przeczytane"
344 449
345msgid "Untitled" 450msgid "Untitled"
346msgstr "Bez nazwy" 451msgstr "Bez nazwy"
347 452
348msgid "the link has been added successfully" 453msgid "the link has been added successfully"
349msgstr "link pozostał pomyślnie dodany" 454msgstr "link został pomyślnie dodany"
350 455
351msgid "error during insertion : the link wasn't added" 456msgid "error during insertion : the link wasn't added"
352msgstr "błąd podczas wprowadzania: link nie zostal dodany" 457msgstr "błąd podczas wprowadzania: link nie został dodany"
353 458
354msgid "the link has been deleted successfully" 459msgid "the link has been deleted successfully"
355msgstr "link zostal pomyślnie usunięty" 460msgstr "link zostal pomyślnie usunięty"
@@ -357,6 +462,9 @@ msgstr "link zostal pomyślnie usunięty"
357msgid "the link wasn't deleted" 462msgid "the link wasn't deleted"
358msgstr "link nie został usunięty" 463msgstr "link nie został usunięty"
359 464
465msgid "Article not found!"
466msgstr "Nie znaleziono artykułu."
467
360msgid "previous" 468msgid "previous"
361msgstr "poprzednia" 469msgstr "poprzednia"
362 470
@@ -367,7 +475,7 @@ msgid "in demo mode, you can't update your password"
367msgstr "w trybie demo, nie można zmieniać hasła" 475msgstr "w trybie demo, nie można zmieniać hasła"
368 476
369msgid "your password has been updated" 477msgid "your password has been updated"
370msgstr "twoje hasło zmienione" 478msgstr "twoje hasło zostało zmienione"
371 479
372msgid "the two fields have to be filled & the password must be the same in the two fields" 480msgid "the two fields have to be filled & the password must be the same in the two fields"
373msgstr "oba pola muszą być wypełnione i hasła muszę być takie same w obu polach" 481msgstr "oba pola muszą być wypełnione i hasła muszę być takie same w obu polach"
@@ -376,31 +484,28 @@ msgid "still using the \""
376msgstr "nadal w użyciu \"" 484msgstr "nadal w użyciu \""
377 485
378msgid "that theme does not seem to be installed" 486msgid "that theme does not seem to be installed"
379msgstr "wydaje się że motyw nie był zainstalowany" 487msgstr "wydaje się że ten motyw nie jest zainstalowany"
380 488
381msgid "you have changed your theme preferences" 489msgid "you have changed your theme preferences"
382msgstr "ustawienia motywu zostałe zmienione" 490msgstr "ustawienia motywu zostały zmienione"
383 491
384msgid "that language does not seem to be installed" 492msgid "that language does not seem to be installed"
385msgstr "wydaje się że język nie był zainstalowany" 493msgstr "wydaje się że ten język nie jest zainstalowany"
386 494
387msgid "you have changed your language preferences" 495msgid "you have changed your language preferences"
388msgstr "ustawienia języka zostałe zmienione" 496msgstr "ustawienia języka zostały zmienione"
389 497
390msgid "login failed: you have to fill all fields" 498msgid "login failed: you have to fill all fields"
391msgstr "logowanie nie powiodlo się: musisz wypełnić wszystkie pola" 499msgstr "logowanie nie powiodlo się: musisz wypełnić wszystkie pola"
392 500
393msgid "welcome to your poche" 501msgid "welcome to your wallabag"
394msgstr "witamy w poche" 502msgstr "Witamy w wallabag"
395 503
396msgid "login failed: bad login or password" 504msgid "login failed: bad login or password"
397msgstr "logowanie nie powiodlo się: zly login lub hasło" 505msgstr "logowanie nie powiodlo się: niepoprawny login lub hasło"
398
399msgid "see you soon!"
400msgstr "do zobaczenia wkrótce!"
401 506
402msgid "import from instapaper completed" 507msgid "import from instapaper completed"
403msgstr "import з instapaper'a zakończony" 508msgstr "import z instapaper'a zakończony"
404 509
405msgid "import from pocket completed" 510msgid "import from pocket completed"
406msgstr "import z pocket'a zakończony" 511msgstr "import z pocket'a zakończony"
@@ -415,14 +520,25 @@ msgid "Unknown import provider."
415msgstr "Nieznany dostawca importu." 520msgstr "Nieznany dostawca importu."
416 521
417msgid "Incomplete inc/poche/define.inc.php file, please define \"" 522msgid "Incomplete inc/poche/define.inc.php file, please define \""
418msgstr "Niekompletny plik inc/poche/define.inc.php, proszę definiować \"" 523msgstr "Niekompletny plik inc/poche/define.inc.php, proszę zdefiniować \""
419 524
420msgid "Could not find required \"" 525msgid "Could not find required \""
421msgstr "Nie znaleziono potrzebnego \"" 526msgstr "Nie znaleziono potrzebnego \""
422 527
423msgid "Uh, there is a problem while generating feeds." 528msgid "Uh, there is a problem while generating feeds."
424msgstr "Uh, jest problem podczas generowania kanałów (feeds)." 529msgstr "Uh, jest problem podczas generowania kanałów."
530
531msgid "Cache deleted."
532msgstr "Cache wyczyszczony."
425 533
426msgid "Oops, it seems you don't have PHP 5." 534msgid "Oops, it seems you don't have PHP 5."
427msgstr "Oops, wygląda ze u was niema PHP 5." 535msgstr "Oops, wygląda ze nie masz PHP 5."
536
537#~ msgid "Import from poche"
538#~ msgstr "Import z poche"
539
540#~ msgid "welcome to your poche"
541#~ msgstr "witamy w poche"
428 542
543#~ msgid "see you soon!"
544#~ msgstr "do zobaczenia wkrótce!"
diff --git a/locale/pt_BR.utf8/LC_MESSAGES/pt_BR.utf8.mo b/locale/pt_BR.utf8/LC_MESSAGES/pt_BR.utf8.mo
new file mode 100644
index 00000000..c1ce317f
--- /dev/null
+++ b/locale/pt_BR.utf8/LC_MESSAGES/pt_BR.utf8.mo
Binary files differ
diff --git a/locale/pt_BR.utf8/LC_MESSAGES/pt_BR.utf8.po b/locale/pt_BR.utf8/LC_MESSAGES/pt_BR.utf8.po
new file mode 100644
index 00000000..e1453922
--- /dev/null
+++ b/locale/pt_BR.utf8/LC_MESSAGES/pt_BR.utf8.po
@@ -0,0 +1,549 @@
1msgid ""
2msgstr ""
3"Project-Id-Version: wallabag\n"
4"Report-Msgid-Bugs-To: \n"
5"POT-Creation-Date: 2014-02-25 15:17+0300\n"
6"PO-Revision-Date: \n"
7"Last-Translator: @iancamporez <ian@camporez.com>\n"
8"Language-Team: @iancamporez <ian@camporez.com>\n"
9"Language: pt_BR\n"
10"MIME-Version: 1.0\n"
11"Content-Type: text/plain; charset=UTF-8\n"
12"Content-Transfer-Encoding: 8bit\n"
13"X-Generator: Poedit 1.6.4\n"
14"X-Poedit-Basepath: .\n"
15"X-Poedit-SearchPath-0: /home/ian/Projetos/wallabag/locale/en_EN.utf8/"
16"LC_MESSAGES\n"
17
18msgid "wallabag, a read it later open source system"
19msgstr "wallabag, um \"read it later\" de código aberto"
20
21msgid "login failed: user doesn't exist"
22msgstr "falha ao entrar: o usuário não existe"
23
24msgid "return home"
25msgstr "retornar à página inicial"
26
27msgid "config"
28msgstr "configurar"
29
30msgid "Saving articles"
31msgstr "Salvando artigos"
32
33msgid "There are several ways to save an article:"
34msgstr "Existem várias maneiras de salvar um artigo:"
35
36msgid "read the documentation"
37msgstr "ler a documentação"
38
39msgid "download the extension"
40msgstr "baixar a extensão"
41
42msgid "via F-Droid"
43msgstr "via F-Droid"
44
45msgid " or "
46msgstr "ou "
47
48msgid "via Google Play"
49msgstr "via Google Play"
50
51msgid "download the application"
52msgstr "baixar o aplicativo"
53
54msgid "By filling this field"
55msgstr "Preenchendo esse campo"
56
57msgid "bag it!"
58msgstr "adicionar ao wallabag"
59
60msgid "Bookmarklet: drag & drop this link to your bookmarks bar"
61msgstr "Bookmarklet: arraste esse link para sua barra de favoritos"
62
63msgid "Upgrading wallabag"
64msgstr "Atualizando o wallabag"
65
66msgid "Installed version"
67msgstr "Versão instalada"
68
69msgid "Latest stable version"
70msgstr "Última versão estável"
71
72msgid "A more recent stable version is available."
73msgstr "Uma versão estável mais nova está disponível"
74
75msgid "You are up to date."
76msgstr "Você está atualizado."
77
78msgid "Latest dev version"
79msgstr "Última versão em desenvolvimento"
80
81msgid "A more recent development version is available."
82msgstr "Uma versão em desenvolvimento mais recente está disponível"
83
84msgid "Feeds"
85msgstr "Feeds"
86
87msgid ""
88"Your feed token is currently empty and must first be generated to enable "
89"feeds. Click <a href='?feed&amp;action=generate'>here to generate it</a>."
90msgstr ""
91"Seu token do feed e precisa ser gerado para ativar os feeds. Clique <a "
92"href='?feed&amp;action=generate'>aqui para gerar um token</a>."
93
94msgid "Unread feed"
95msgstr "Feed de artigos não lidos"
96
97msgid "Favorites feed"
98msgstr "Feed dos favoritos"
99
100msgid "Archive feed"
101msgstr "Feed de arquivados"
102
103msgid "Your token:"
104msgstr "Seu token:"
105
106msgid "Your user id:"
107msgstr "Seu código de usuário:"
108
109msgid ""
110"You can regenerate your token: <a href='?feed&amp;action=generate'>generate!"
111"</a>."
112msgstr ""
113"Você pode regerar seu token: <a href='?feed&amp;action=generate'>gerar!</a>."
114
115msgid "Change your theme"
116msgstr "Mudar seu tema"
117
118msgid "Theme:"
119msgstr "Tema:"
120
121msgid "Update"
122msgstr "Atualizar"
123
124msgid "Change your language"
125msgstr "Alterar seu idioma"
126
127msgid "Language:"
128msgstr "Idioma:"
129
130msgid "Change your password"
131msgstr "Alterar sua senha"
132
133msgid "New password:"
134msgstr "Nova senha:"
135
136msgid "Password"
137msgstr "Senha"
138
139msgid "Repeat your new password:"
140msgstr "Repetir sua nova senha:"
141
142msgid "Import"
143msgstr "Importar"
144
145msgid ""
146"Please execute the import script locally as it can take a very long time."
147msgstr ""
148"Por favor, execute o script de importação localmente, pois pode demorar "
149"muito tempo."
150
151msgid "More info in the official documentation:"
152msgstr "Mais informações na documentação oficial:"
153
154msgid "Import from Pocket"
155msgstr "Importar do Pocket"
156
157#, php-format
158msgid "(you must have a %s file on your server)"
159msgstr "(você deve ter um arquivo %s no seu servidor)"
160
161msgid "Import from Readability"
162msgstr "Importar do Readability"
163
164msgid "Import from Instapaper"
165msgstr "Importar do Instapaper"
166
167msgid "Import from wallabag"
168msgstr "Importar do wallabag"
169
170msgid "Export your wallabag data"
171msgstr "Exportar seus dados do wallabag"
172
173msgid "Click here"
174msgstr "Clique aqui"
175
176msgid "to download your database."
177msgstr "para baixar seu banco de dados."
178
179msgid "to export your wallabag data."
180msgstr "para exportar seus dados do wallabag."
181
182msgid "Cache"
183msgstr "Cache"
184
185msgid "to delete cache."
186msgstr "para apagar o cache."
187
188msgid "You can enter multiple tags, separated by commas."
189msgstr "Você pode inserir várias tags, separadas por vírgulas."
190
191msgid "return to article"
192msgstr "retornar ao artigo"
193
194msgid "plop"
195msgstr "plop"
196
197msgid ""
198"You can <a href='wallabag_compatibility_test.php'>check your configuration "
199"here</a>."
200msgstr ""
201"Você pode <a href='wallabag_compatibility_test.php'>checar suas "
202"configurações aqui</a>."
203
204msgid "favoris"
205msgstr "favoritos"
206
207msgid "archive"
208msgstr "arquivo"
209
210msgid "unread"
211msgstr "não lidos"
212
213msgid "by date asc"
214msgstr "por data (cresc.)"
215
216msgid "by date"
217msgstr "por data"
218
219msgid "by date desc"
220msgstr "por data (decr.)"
221
222msgid "by title asc"
223msgstr "por título (cresc.)"
224
225msgid "by title"
226msgstr "por título"
227
228msgid "by title desc"
229msgstr "por título (decr.)"
230
231msgid "Tag"
232msgstr "Tag"
233
234msgid "No articles found."
235msgstr "Nenhum artigo encontrado."
236
237msgid "Toggle mark as read"
238msgstr "Alterar \"marcar como lido\""
239
240msgid "toggle favorite"
241msgstr "alterar \"favorito\""
242
243msgid "delete"
244msgstr "deletar"
245
246msgid "original"
247msgstr "original"
248
249msgid "estimated reading time:"
250msgstr "tempo estimado de leitura:"
251
252msgid "mark all the entries as read"
253msgstr "marcar todas as entradas como lidas"
254
255msgid "results"
256msgstr "resultados"
257
258msgid "installation"
259msgstr "instalação"
260
261msgid "install your wallabag"
262msgstr "instalar seu wallabag"
263
264msgid ""
265"wallabag is still not installed. Please fill the below form to install it. "
266"Don't hesitate to <a href='http://doc.wallabag.org/'>read the documentation "
267"on wallabag website</a>."
268msgstr ""
269"O wallabag ainda não está instalado. Preencha o formulário abaixo para "
270"instalá-lo. Não hesite em <a href='http://doc.wallabag.org/'>ler a "
271"documentação no site do wallabag</a>."
272
273msgid "Login"
274msgstr "Login"
275
276msgid "Repeat your password"
277msgstr "Repetir sua senha"
278
279msgid "Install"
280msgstr "Instalar"
281
282msgid "login to your wallabag"
283msgstr "entrar no seu wallabag"
284
285msgid "Login to wallabag"
286msgstr "Entrar no wallabag"
287
288msgid "you are in demo mode, some features may be disabled."
289msgstr "você está no modo demo, alguns recursos podem estar desativados."
290
291msgid "Username"
292msgstr "Nome de usuário"
293
294msgid "Stay signed in"
295msgstr "Continuar conectado"
296
297msgid "(Do not check on public computers)"
298msgstr "(Não marque em computadores públicos)"
299
300msgid "Sign in"
301msgstr "Entrar"
302
303msgid "favorites"
304msgstr "favoritos"
305
306msgid "estimated reading time :"
307msgstr "tempo estimado de leitura :"
308
309msgid "Mark all the entries as read"
310msgstr "Marcar todas as entradas como lidas"
311
312msgid "Return home"
313msgstr "Retornar à página inicial"
314
315msgid "Back to top"
316msgstr "Voltar ao topo"
317
318msgid "Mark as read"
319msgstr "Marcar como lido"
320
321msgid "Favorite"
322msgstr "Favoritar"
323
324msgid "Toggle favorite"
325msgstr "Alterar \"favorito\""
326
327msgid "Delete"
328msgstr "Deletar"
329
330msgid "Tweet"
331msgstr "Tweetar"
332
333msgid "Email"
334msgstr "Email"
335
336msgid "shaarli"
337msgstr "shaarli"
338
339msgid "flattr"
340msgstr "flattr"
341
342msgid "Does this article appear wrong?"
343msgstr "Esse artigo está sendo exibido incorretamente?"
344
345msgid "tags:"
346msgstr "tags:"
347
348msgid "Edit tags"
349msgstr "Editar tags"
350
351msgid "save link!"
352msgstr "salvar link!"
353
354msgid "home"
355msgstr "início"
356
357msgid "tags"
358msgstr "tags"
359
360msgid "logout"
361msgstr "sair"
362
363msgid "powered by"
364msgstr "powered by"
365
366msgid "debug mode is on so cache is off."
367msgstr "o modo debug está ativo, então o cache foi desativado."
368
369msgid "your wallabag version:"
370msgstr "sua versão do wallabag:"
371
372msgid "storage:"
373msgstr "armazenamento:"
374
375msgid "save a link"
376msgstr "salvar link"
377
378msgid "back to home"
379msgstr "voltar à página inicial"
380
381msgid "toggle mark as read"
382msgstr "alterar \"marcar como lido\""
383
384msgid "tweet"
385msgstr "tweetar"
386
387msgid "email"
388msgstr "email"
389
390msgid "this article appears wrong?"
391msgstr "esse artigo está sendo mostrado incorretamente?"
392
393msgid "No link available here!"
394msgstr "Nenhum link disponível aqui!"
395
396msgid "Poching a link"
397msgstr "Pocheando um link"
398
399msgid "by filling this field"
400msgstr "preenchendo esse campo"
401
402msgid "bookmarklet: drag & drop this link to your bookmarks bar"
403msgstr "bookmarklet: arraste esse link para a sua barra de favoritos"
404
405msgid "your version"
406msgstr "sua versão"
407
408msgid "latest stable version"
409msgstr "última versão estável"
410
411msgid "a more recent stable version is available."
412msgstr "uma versão estável mais nova está disponível"
413
414msgid "you are up to date."
415msgstr "você está atualizado."
416
417msgid "latest dev version"
418msgstr "última versão em desenvolvimento"
419
420msgid "a more recent development version is available."
421msgstr "uma versão em desenvolvimento mais nova está disponível"
422
423msgid "Please execute the import script locally, it can take a very long time."
424msgstr ""
425"Por favor, execute o script de importação localmente, pois pode demorar "
426"muito tempo."
427
428msgid "More infos in the official doc:"
429msgstr "Mais informações na documentação oficial:"
430
431msgid "import from Pocket"
432msgstr "importar do Pocket"
433
434msgid "import from Readability"
435msgstr "importar do Readability"
436
437msgid "import from Instapaper"
438msgstr "importar do Instapaper"
439
440msgid "Tags"
441msgstr "Tags"
442
443msgid "Untitled"
444msgstr "Sem título"
445
446msgid "the link has been added successfully"
447msgstr "o link foi adicionado com sucesso"
448
449msgid "error during insertion : the link wasn't added"
450msgstr "erro durante a inserção: o link não foi adicionado"
451
452msgid "the link has been deleted successfully"
453msgstr "o link foi deletado com sucesso"
454
455msgid "the link wasn't deleted"
456msgstr "o link não foi deletado"
457
458msgid "Article not found!"
459msgstr "Artigo não encontrado!"
460
461msgid "previous"
462msgstr "anterior"
463
464msgid "next"
465msgstr "próximo"
466
467msgid "in demo mode, you can't update your password"
468msgstr "você não pode alterar a senha no modo demo"
469
470msgid "your password has been updated"
471msgstr "sua senha foi atualizada"
472
473msgid ""
474"the two fields have to be filled & the password must be the same in the two "
475"fields"
476msgstr ""
477"os dois campos devem estar preenchidos e as senhas devem ser iguais em ambos"
478
479msgid "still using the \""
480msgstr "ainda usando o \""
481
482msgid "that theme does not seem to be installed"
483msgstr "esse tema aparentemente não está instalado"
484
485msgid "you have changed your theme preferences"
486msgstr "você alterou suas preferências de tema"
487
488msgid "that language does not seem to be installed"
489msgstr "esse idioma aparentemente não está instalado"
490
491msgid "you have changed your language preferences"
492msgstr "você alterou suas preferências de idioma"
493
494msgid "login failed: you have to fill all fields"
495msgstr "falha ao entrar: você deve preencher todos os campos"
496
497msgid "welcome to your wallabag"
498msgstr "bem-vindo ao seu wallabag"
499
500msgid "login failed: bad login or password"
501msgstr "falha ao entrar: login ou senha incorretos"
502
503msgid "import from instapaper completed"
504msgstr "importação do instapaper completa"
505
506msgid "import from pocket completed"
507msgstr "importação do pocket completa"
508
509msgid "import from Readability completed. "
510msgstr "importação do Readability completa. "
511
512msgid "import from Poche completed. "
513msgstr "importação do Poche completa. "
514
515msgid "Unknown import provider."
516msgstr "Serviço de importação desconhecido."
517
518msgid "Incomplete inc/poche/define.inc.php file, please define \""
519msgstr "Arquivo inc/poche/define.inc.php incompleto, por favor defina \""
520
521msgid "Could not find required \""
522msgstr "Não foi possível encontrar o requerido \""
523
524msgid "Uh, there is a problem while generating feeds."
525msgstr "Uh, houve um problema ao gerar os feeds."
526
527msgid "Cache deleted."
528msgstr "Cache deletado."
529
530msgid "Oops, it seems you don't have PHP 5."
531msgstr "Oops, parece que você não tem o PHP 5."
532
533#~ msgid "poche it!"
534#~ msgstr "poche it!"
535
536#~ msgid "Updating poche"
537#~ msgstr "Updating poche"
538
539#~ msgid "create an issue"
540#~ msgstr "create an issue"
541
542#~ msgid "or"
543#~ msgstr "or"
544
545#~ msgid "contact us by mail"
546#~ msgstr "contact us by mail"
547
548#~ msgid "your poche version:"
549#~ msgstr "your poche version:"
diff --git a/locale/ru_RU.utf8/LC_MESSAGES/ru_RU.utf8.mo b/locale/ru_RU.utf8/LC_MESSAGES/ru_RU.utf8.mo
index c9cf1a55..5cbfad16 100755
--- a/locale/ru_RU.utf8/LC_MESSAGES/ru_RU.utf8.mo
+++ b/locale/ru_RU.utf8/LC_MESSAGES/ru_RU.utf8.mo
Binary files differ
diff --git a/locale/ru_RU.utf8/LC_MESSAGES/ru_RU.utf8.po b/locale/ru_RU.utf8/LC_MESSAGES/ru_RU.utf8.po
index aa1769cf..08f12b7c 100755
--- a/locale/ru_RU.utf8/LC_MESSAGES/ru_RU.utf8.po
+++ b/locale/ru_RU.utf8/LC_MESSAGES/ru_RU.utf8.po
@@ -2,7 +2,7 @@ msgid ""
2msgstr "" 2msgstr ""
3"Project-Id-Version: \n" 3"Project-Id-Version: \n"
4"Report-Msgid-Bugs-To: \n" 4"Report-Msgid-Bugs-To: \n"
5"POT-Creation-Date: 2014-02-07 12:40+0300\n" 5"POT-Creation-Date: 2014-02-25 15:09+0300\n"
6"PO-Revision-Date: \n" 6"PO-Revision-Date: \n"
7"Last-Translator: Maryana <mariroz@mr.lviv.ua>\n" 7"Last-Translator: Maryana <mariroz@mr.lviv.ua>\n"
8"Language-Team: \n" 8"Language-Team: \n"
@@ -14,135 +14,25 @@ msgstr ""
14"X-Poedit-Language: Russian\n" 14"X-Poedit-Language: Russian\n"
15"X-Poedit-Country: RUSSIA\n" 15"X-Poedit-Country: RUSSIA\n"
16"X-Poedit-SourceCharset: utf-8\n" 16"X-Poedit-SourceCharset: utf-8\n"
17"X-Poedit-SearchPath-0: /home/mariroz/_DEV/web/wallabag/wallabag\n" 17"X-Poedit-SearchPath-0: /home/mariroz/_DEV/web/wallabag/wallabag-master-testing\n"
18 18
19msgid "poche, a read it later open source system" 19msgid "wallabag, a read it later open source system"
20msgstr "poche, сервис отложенного чтения с открытым исходным кодом" 20msgstr "wallabag, сервис отложенного чтения с открытым исходным кодом"
21 21
22msgid "login failed: user doesn't exist" 22msgid "login failed: user doesn't exist"
23msgstr "войти не удалось: пользователь не существует" 23msgstr "войти не удалось: пользователь не существует"
24 24
25msgid "Return home"
26msgstr "На главную"
27
28msgid "Back to top"
29msgstr "Наверх"
30
31msgid "original"
32msgstr "источник"
33
34msgid "Mark as read"
35msgstr "Отметить как прочитанное"
36
37msgid "Toggle mark as read"
38msgstr "Изменить отметку 'прочитано'"
39
40msgid "Favorite"
41msgstr "Избранное"
42
43msgid "Toggle favorite"
44msgstr "Изменить метку избранного"
45
46msgid "Delete"
47msgstr "Удалить"
48
49msgid "Tweet"
50msgstr "Твитнуть"
51
52msgid "Email"
53msgstr "Отправить по почте"
54
55msgid "shaarli"
56msgstr "shaarli"
57
58msgid "flattr"
59msgstr "проспонсировать"
60
61msgid "Does this article appear wrong?"
62msgstr "Статья выглядит криво?"
63
64msgid "tags:"
65msgstr "теги:"
66
67msgid "Edit tags"
68msgstr "Редактировать теги"
69
70msgid "return home" 25msgid "return home"
71msgstr "на главную" 26msgstr "на главную"
72 27
73msgid "powered by"
74msgstr "при поддержке"
75
76msgid "debug mode is on so cache is off."
77msgstr "включён режим отладки - кеш выключен."
78
79msgid "your poche version:"
80msgstr "ваша версия poche:"
81
82msgid "storage:"
83msgstr "хранилище:"
84
85msgid "favoris"
86msgstr "избранное"
87
88msgid "archive"
89msgstr "архив"
90
91msgid "unread"
92msgstr "непрочитанное"
93
94msgid "by date asc"
95msgstr "по дате, сперва старые"
96
97msgid "by date"
98msgstr "по дате"
99
100msgid "by date desc"
101msgstr "по дате, сперва новые"
102
103msgid "by title asc"
104msgstr "по заголовку (прямой)"
105
106msgid "by title"
107msgstr "по заголовку"
108
109msgid "by title desc"
110msgstr "по заголовку (обратный)"
111
112msgid "No articles found."
113msgstr "Статей не найдено."
114
115msgid "toggle favorite"
116msgstr "изменить метку избранного"
117
118msgid "delete"
119msgstr "удалить"
120
121msgid "estimated reading time:"
122msgstr "ориентировочное время чтения:"
123
124msgid "results"
125msgstr "найдено"
126
127msgid "home"
128msgstr "главная"
129
130msgid "favorites"
131msgstr "избранное"
132
133msgid "tags"
134msgstr "теги"
135
136msgid "config" 28msgid "config"
137msgstr "настройки" 29msgstr "настройки"
138 30
139msgid "logout" 31msgid "Saving articles"
140msgstr "выход" 32msgstr "Сохранение статей"
141
142msgid "Poching links"
143msgstr "Сохранение ссылок"
144 33
145msgid "There are several ways to poche a link:" 34#, fuzzy
35msgid "There are several ways to save an article:"
146msgstr "Существует несколько способов сохранить ссылку:" 36msgstr "Существует несколько способов сохранить ссылку:"
147 37
148msgid "read the documentation" 38msgid "read the documentation"
@@ -166,14 +56,14 @@ msgstr "скачать приложение"
166msgid "By filling this field" 56msgid "By filling this field"
167msgstr "Заполнением этого поля" 57msgstr "Заполнением этого поля"
168 58
169msgid "poche it!" 59msgid "bag it!"
170msgstr "прикарманить!" 60msgstr "прикарманить!"
171 61
172msgid "Bookmarklet: drag & drop this link to your bookmarks bar" 62msgid "Bookmarklet: drag & drop this link to your bookmarks bar"
173msgstr "Закладка: перетащите и опустите ссылку на панель закладок" 63msgstr "Закладка: перетащите и опустите ссылку на панель закладок"
174 64
175msgid "Updating poche" 65msgid "Upgrading wallabag"
176msgstr "Обновления poche" 66msgstr "Обновление wallabag"
177 67
178msgid "Installed version" 68msgid "Installed version"
179msgstr "Установленная версия" 69msgstr "Установленная версия"
@@ -187,15 +77,14 @@ msgstr "Доступна новая стабильная версия."
187msgid "You are up to date." 77msgid "You are up to date."
188msgstr "У вас всё самое новое." 78msgstr "У вас всё самое новое."
189 79
190msgid "latest dev version" 80#, fuzzy
81msgid "Latest dev version"
191msgstr "последняя версия в разработке" 82msgstr "последняя версия в разработке"
192 83
193msgid "a more recent development version is available." 84#, fuzzy
85msgid "A more recent development version is available."
194msgstr "есть более свежая версия в разработке." 86msgstr "есть более свежая версия в разработке."
195 87
196msgid "you are up to date."
197msgstr "у вас всё самое новое."
198
199msgid "Feeds" 88msgid "Feeds"
200msgstr "Ленты (feeds)" 89msgstr "Ленты (feeds)"
201 90
@@ -253,7 +142,8 @@ msgstr "Импортировать"
253msgid "Please execute the import script locally as it can take a very long time." 142msgid "Please execute the import script locally as it can take a very long time."
254msgstr "Пожалуйста, выполните сценарий импорта локально - это может занять слишком много времени." 143msgstr "Пожалуйста, выполните сценарий импорта локально - это может занять слишком много времени."
255 144
256msgid "More info in the official docs:" 145#, fuzzy
146msgid "More info in the official documentation:"
257msgstr "Больше сведений в официальной документации:" 147msgstr "Больше сведений в официальной документации:"
258 148
259msgid "Import from Pocket" 149msgid "Import from Pocket"
@@ -269,11 +159,11 @@ msgstr "Импортировать из Readability"
269msgid "Import from Instapaper" 159msgid "Import from Instapaper"
270msgstr "Импортировать из Instapaper" 160msgstr "Импортировать из Instapaper"
271 161
272msgid "Import from poche" 162msgid "Import from wallabag"
273msgstr "Импортировать из poche" 163msgstr "Импортировать из wallabag"
274 164
275msgid "Export your poche data" 165msgid "Export your wallabag data"
276msgstr "Экспортировать данные poche" 166msgstr "Экспортировать данные wallabag"
277 167
278msgid "Click here" 168msgid "Click here"
279msgstr "Кликните здесь" 169msgstr "Кликните здесь"
@@ -281,17 +171,14 @@ msgstr "Кликните здесь"
281msgid "to download your database." 171msgid "to download your database."
282msgstr "чтобы скачать вашу базу данных" 172msgstr "чтобы скачать вашу базу данных"
283 173
284msgid "to export your poche data." 174msgid "to export your wallabag data."
285msgstr "чтобы экспортировать свои записи из poche." 175msgstr "чтобы экспортировать свои записи из wallabag."
286 176
287msgid "Tag" 177msgid "Cache"
288msgstr "Тег" 178msgstr "Кэш"
289
290msgid "No link available here!"
291msgstr "Здесь нет ссылки!"
292 179
293msgid "toggle mark as read" 180msgid "to delete cache."
294msgstr "измени� о����ку 'ро�ит��но'" 181msgstr "�т� сро�ить �эш."
295 182
296msgid "You can enter multiple tags, separated by commas." 183msgid "You can enter multiple tags, separated by commas."
297msgstr "Вы можете ввести несколько тегов, разделяя их запятой." 184msgstr "Вы можете ввести несколько тегов, разделяя их запятой."
@@ -305,6 +192,60 @@ msgstr "plop"
305msgid "You can <a href='wallabag_compatibility_test.php'>check your configuration here</a>." 192msgid "You can <a href='wallabag_compatibility_test.php'>check your configuration here</a>."
306msgstr "Вы можете <a href='wallabag_compatibility_test.php'>проверить конфигурацию здесь</a>." 193msgstr "Вы можете <a href='wallabag_compatibility_test.php'>проверить конфигурацию здесь</a>."
307 194
195msgid "favoris"
196msgstr "избранное"
197
198msgid "archive"
199msgstr "архив"
200
201msgid "unread"
202msgstr "непрочитанное"
203
204msgid "by date asc"
205msgstr "по дате, сперва старые"
206
207msgid "by date"
208msgstr "по дате"
209
210msgid "by date desc"
211msgstr "по дате, сперва новые"
212
213msgid "by title asc"
214msgstr "по заголовку (прямой)"
215
216msgid "by title"
217msgstr "по заголовку"
218
219msgid "by title desc"
220msgstr "по заголовку (обратный)"
221
222msgid "Tag"
223msgstr "Тег"
224
225msgid "No articles found."
226msgstr "Статей не найдено."
227
228msgid "Toggle mark as read"
229msgstr "Изменить отметку 'прочитано'"
230
231msgid "toggle favorite"
232msgstr "изменить метку избранного"
233
234msgid "delete"
235msgstr "удалить"
236
237msgid "original"
238msgstr "источник"
239
240msgid "estimated reading time:"
241msgstr "ориентировочное время чтения:"
242
243msgid "mark all the entries as read"
244msgstr "отметить все статьи как прочитанные "
245
246msgid "results"
247msgstr "найдено"
248
308msgid "installation" 249msgid "installation"
309msgstr "установка" 250msgstr "установка"
310 251
@@ -341,6 +282,159 @@ msgstr "Запомнить меня"
341msgid "(Do not check on public computers)" 282msgid "(Do not check on public computers)"
342msgstr "(Не отмечайте на чужих компьютерах)" 283msgstr "(Не отмечайте на чужих компьютерах)"
343 284
285msgid "Sign in"
286msgstr "Зарегистрироваться"
287
288msgid "favorites"
289msgstr "избранное"
290
291#, fuzzy
292msgid "estimated reading time :"
293msgstr "ориентировочное время чтения:"
294
295msgid "Mark all the entries as read"
296msgstr "Отметить все как прочитанное"
297
298msgid "Return home"
299msgstr "На главную"
300
301msgid "Back to top"
302msgstr "Наверх"
303
304msgid "Mark as read"
305msgstr "Отметить как прочитанное"
306
307msgid "Favorite"
308msgstr "Избранное"
309
310msgid "Toggle favorite"
311msgstr "Изменить метку избранного"
312
313msgid "Delete"
314msgstr "Удалить"
315
316msgid "Tweet"
317msgstr "Твитнуть"
318
319msgid "Email"
320msgstr "Отправить по почте"
321
322msgid "shaarli"
323msgstr "shaarli"
324
325msgid "flattr"
326msgstr "проспонсировать"
327
328msgid "Does this article appear wrong?"
329msgstr "Статья выглядит криво?"
330
331msgid "tags:"
332msgstr "теги:"
333
334msgid "Edit tags"
335msgstr "Редактировать теги"
336
337msgid "save link!"
338msgstr "сохранить ссылку!"
339
340msgid "home"
341msgstr "главная"
342
343msgid "tags"
344msgstr "теги"
345
346msgid "logout"
347msgstr "выход"
348
349msgid "powered by"
350msgstr "при поддержке"
351
352msgid "debug mode is on so cache is off."
353msgstr "включён режим отладки - кеш выключен."
354
355msgid "your wallabag version:"
356msgstr "Ваша версия wallabag:"
357
358msgid "storage:"
359msgstr "хранилище:"
360
361msgid "save a link"
362msgstr "сохранить ссылку"
363
364msgid "back to home"
365msgstr "домой"
366
367msgid "toggle mark as read"
368msgstr "изменить отметку 'прочитано'"
369
370msgid "tweet"
371msgstr "твитнуть"
372
373msgid "email"
374msgstr "email"
375
376#, fuzzy
377msgid "this article appears wrong?"
378msgstr "Статья выглядит криво?"
379
380msgid "No link available here!"
381msgstr "Здесь нет ссылки!"
382
383#, fuzzy
384msgid "Poching a link"
385msgstr "Сохранение ссылок"
386
387#, fuzzy
388msgid "by filling this field"
389msgstr "Заполнением этого поля"
390
391#, fuzzy
392msgid "bookmarklet: drag & drop this link to your bookmarks bar"
393msgstr "Закладка: перетащите и опустите ссылку на панель закладок"
394
395msgid "your version"
396msgstr "Ваша версия"
397
398#, fuzzy
399msgid "latest stable version"
400msgstr "Последняя стабильная версия"
401
402#, fuzzy
403msgid "a more recent stable version is available."
404msgstr "Доступна новая стабильная версия."
405
406msgid "you are up to date."
407msgstr "у вас всё самое новое."
408
409msgid "latest dev version"
410msgstr "последняя версия в разработке"
411
412msgid "a more recent development version is available."
413msgstr "есть более свежая версия в разработке."
414
415#, fuzzy
416msgid "Please execute the import script locally, it can take a very long time."
417msgstr "Пожалуйста, выполните сценарий импорта локально - это может занять слишком много времени."
418
419#, fuzzy
420msgid "More infos in the official doc:"
421msgstr "Больше сведений в официальной документации:"
422
423#, fuzzy
424msgid "import from Pocket"
425msgstr "Импортировать из Pocket"
426
427#, fuzzy
428msgid "import from Readability"
429msgstr "Импортировать из Readability"
430
431#, fuzzy
432msgid "import from Instapaper"
433msgstr "Импортировать из Instapaper"
434
435msgid "Tags"
436msgstr "Теги"
437
344msgid "Untitled" 438msgid "Untitled"
345msgstr "Без названия" 439msgstr "Без названия"
346 440
@@ -356,6 +450,9 @@ msgstr "ссылка успешно удалена"
356msgid "the link wasn't deleted" 450msgid "the link wasn't deleted"
357msgstr "ссылка не удалена" 451msgstr "ссылка не удалена"
358 452
453msgid "Article not found!"
454msgstr "Статью не найдено."
455
359msgid "previous" 456msgid "previous"
360msgstr "предыдущая" 457msgstr "предыдущая"
361 458
@@ -389,15 +486,12 @@ msgstr "вы изменили свои настройки языка"
389msgid "login failed: you have to fill all fields" 486msgid "login failed: you have to fill all fields"
390msgstr "войти не удалось: вы должны заполнить все поля" 487msgstr "войти не удалось: вы должны заполнить все поля"
391 488
392msgid "welcome to your poche" 489msgid "welcome to your wallabag"
393msgstr "добро пожаловать в ваш poche" 490msgstr "добро пожаловать в wallabag"
394 491
395msgid "login failed: bad login or password" 492msgid "login failed: bad login or password"
396msgstr "войти не удалось: неправильное имя пользователя или пароль" 493msgstr "войти не удалось: неправильное имя пользователя или пароль"
397 494
398msgid "see you soon!"
399msgstr "увидимся!"
400
401msgid "import from instapaper completed" 495msgid "import from instapaper completed"
402msgstr "импорт из instapaper завершен" 496msgstr "импорт из instapaper завершен"
403 497
@@ -422,14 +516,40 @@ msgstr "Не удалось найти требуемый \""
422msgid "Uh, there is a problem while generating feeds." 516msgid "Uh, there is a problem while generating feeds."
423msgstr "Ох, возникла проблема при создании ленты." 517msgstr "Ох, возникла проблема при создании ленты."
424 518
519msgid "Cache deleted."
520msgstr "Кэш очищен. "
521
425msgid "Oops, it seems you don't have PHP 5." 522msgid "Oops, it seems you don't have PHP 5."
426msgstr "Упс, кажется у вас не установлен PHP 5." 523msgstr "Упс, кажется у вас не установлен PHP 5."
427 524
428#~ msgid "your version" 525#~ msgid "You can poche a link by several methods:"
429#~ msgstr "Ваша версия" 526#~ msgstr "Вы можете сохранить ссылку несколькими путями:"
527
528#~ msgid "poche it!"
529#~ msgstr "прикарманить!"
530
531#~ msgid "Updating poche"
532#~ msgstr "Обновления poche"
533
534#, fuzzy
535#~ msgid "Export your poche datas"
536#~ msgstr "Экспортировать данные poche"
537
538#, fuzzy
539#~ msgid "to export your poche datas."
540#~ msgstr "чтобы экспортировать свои записи из poche."
430 541
431#~ msgid "back to home" 542#~ msgid "your poche version:"
432#~ msgstr "домой" 543#~ msgstr "ваша версия poche:"
544
545#~ msgid "Import from poche"
546#~ msgstr "Импортировать из poche"
547
548#~ msgid "welcome to your poche"
549#~ msgstr "добро пожаловать в ваш poche"
550
551#~ msgid "see you soon!"
552#~ msgstr "увидимся!"
433 553
434#~ msgid "create an issue" 554#~ msgid "create an issue"
435#~ msgstr "оповестить об ошибке" 555#~ msgstr "оповестить об ошибке"
@@ -439,6 +559,3 @@ msgstr "Упс, кажется у вас не установлен PHP 5."
439 559
440#~ msgid "contact us by mail" 560#~ msgid "contact us by mail"
441#~ msgstr "связаться по почте" 561#~ msgstr "связаться по почте"
442
443#~ msgid "Sign in"
444#~ msgstr "Зарегистрироваться"
diff --git a/locale/sl_SI.utf8/LC_MESSAGES/sl_SI.utf8.po b/locale/sl_SI.utf8/LC_MESSAGES/sl_SI.utf8.po
index 6eac8e01..8ad2eded 100644
--- a/locale/sl_SI.utf8/LC_MESSAGES/sl_SI.utf8.po
+++ b/locale/sl_SI.utf8/LC_MESSAGES/sl_SI.utf8.po
@@ -4,55 +4,138 @@
4msgid "" 4msgid ""
5msgstr "" 5msgstr ""
6"Project-Id-Version: wallabag\n" 6"Project-Id-Version: wallabag\n"
7"POT-Creation-Date: \n" 7"Report-Msgid-Bugs-To: \n"
8"PO-Revision-Date: 2014-02-21 15:09+0100\n" 8"POT-Creation-Date: 2014-02-25 15:12+0300\n"
9"Last-Translator: Nicolas Lœuillet <nicolas.loeuillet@gmail.com>\n" 9"PO-Revision-Date: 2014-02-25 15:12+0300\n"
10"Language-Team: Slovenian (Slovenia) (http://www.transifex.com/projects/p/" 10"Last-Translator: Maryana <mariroz@mr.lviv.ua>\n"
11"wallabag/language/sl_SI/)\n" 11"Language-Team: Slovenian (Slovenia) (http://www.transifex.com/projects/p/wallabag/language/sl_SI/)\n"
12"Language: sl_SI\n"
12"MIME-Version: 1.0\n" 13"MIME-Version: 1.0\n"
13"Content-Type: text/plain; charset=UTF-8\n" 14"Content-Type: text/plain; charset=UTF-8\n"
14"Content-Transfer-Encoding: 8bit\n" 15"Content-Transfer-Encoding: 8bit\n"
15"Language: sl_SI\n" 16"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n"
16"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n"
17"%100==4 ? 2 : 3);\n"
18"X-Generator: Poedit 1.5.4\n" 17"X-Generator: Poedit 1.5.4\n"
18"X-Poedit-Language: Slovenian\n"
19"X-Poedit-Country: SLOVENIA\n"
20"X-Poedit-Basepath: .\n"
21"X-Poedit-SearchPath-0: /home/mariroz/_DEV/web/wallabag/wallabag-master-testing\n"
22
23msgid "wallabag, a read it later open source system"
24msgstr ""
25
26msgid "login failed: user doesn't exist"
27msgstr ""
28
29msgid "return home"
30msgstr ""
19 31
20msgid "config" 32msgid "config"
21msgstr "nastavitve" 33msgstr "nastavitve"
22 34
23msgid "Poching a link" 35msgid "Saving articles"
24msgstr "Shrani povezavo" 36msgstr ""
37
38msgid "There are several ways to save an article:"
39msgstr ""
25 40
26msgid "read the documentation" 41msgid "read the documentation"
27msgstr "preberite dokumentacijo" 42msgstr "preberite dokumentacijo"
28 43
29msgid "by filling this field" 44msgid "download the extension"
45msgstr ""
46
47msgid "via F-Droid"
48msgstr ""
49
50msgid " or "
51msgstr ""
52
53msgid "via Google Play"
54msgstr ""
55
56msgid "download the application"
57msgstr ""
58
59#, fuzzy
60msgid "By filling this field"
30msgstr "z vnosom v to polje" 61msgstr "z vnosom v to polje"
31 62
32msgid "poche it!" 63msgid "bag it!"
33msgstr "shrani!" 64msgstr ""
34 65
35msgid "Updating poche" 66msgid "Bookmarklet: drag & drop this link to your bookmarks bar"
36msgstr "Posodabljam Poche" 67msgstr ""
37 68
38msgid "your version" 69msgid "Upgrading wallabag"
39msgstr "vaša različica" 70msgstr ""
40 71
41msgid "latest stable version" 72#, fuzzy
73msgid "Installed version"
42msgstr "zadnja stabilna različica" 74msgstr "zadnja stabilna različica"
43 75
44msgid "a more recent stable version is available." 76#, fuzzy
77msgid "Latest stable version"
78msgstr "zadnja stabilna različica"
79
80#, fuzzy
81msgid "A more recent stable version is available."
45msgstr "na voljo je nova stabilna različica." 82msgstr "na voljo je nova stabilna različica."
46 83
47msgid "you are up to date." 84#, fuzzy
85msgid "You are up to date."
48msgstr "imate najnovejšo različico." 86msgstr "imate najnovejšo različico."
49 87
50msgid "latest dev version" 88#, fuzzy
89msgid "Latest dev version"
51msgstr "zadnja razvojna različica" 90msgstr "zadnja razvojna različica"
52 91
53msgid "a more recent development version is available." 92#, fuzzy
93msgid "A more recent development version is available."
54msgstr "na voljo je nova razvojna različica." 94msgstr "na voljo je nova razvojna različica."
55 95
96msgid "Feeds"
97msgstr ""
98
99msgid "Your feed token is currently empty and must first be generated to enable feeds. Click <a href='?feed&amp;action=generate'>here to generate it</a>."
100msgstr ""
101
102msgid "Unread feed"
103msgstr ""
104
105#, fuzzy
106msgid "Favorites feed"
107msgstr "priljubljeni"
108
109#, fuzzy
110msgid "Archive feed"
111msgstr "arhiv"
112
113msgid "Your token:"
114msgstr ""
115
116msgid "Your user id:"
117msgstr ""
118
119msgid "You can regenerate your token: <a href='?feed&amp;action=generate'>generate!</a>."
120msgstr ""
121
122#, fuzzy
123msgid "Change your theme"
124msgstr "Zamenjava gesla"
125
126msgid "Theme:"
127msgstr ""
128
129msgid "Update"
130msgstr "Posodobi"
131
132#, fuzzy
133msgid "Change your language"
134msgstr "Zamenjava gesla"
135
136msgid "Language:"
137msgstr ""
138
56msgid "Change your password" 139msgid "Change your password"
57msgstr "Zamenjava gesla" 140msgstr "Zamenjava gesla"
58 141
@@ -65,67 +148,69 @@ msgstr "Geslo"
65msgid "Repeat your new password:" 148msgid "Repeat your new password:"
66msgstr "Ponovite novo geslo:" 149msgstr "Ponovite novo geslo:"
67 150
68msgid "Update"
69msgstr "Posodobi"
70
71msgid "Import" 151msgid "Import"
72msgstr "Uvozi" 152msgstr "Uvozi"
73 153
74msgid "Please execute the import script locally, it can take a very long time." 154#, fuzzy
75msgstr "" 155msgid "Please execute the import script locally as it can take a very long time."
76"Prosimo poženite skripto za uvoz lokalno, saj lahko postopek traja precej " 156msgstr "Prosimo poženite skripto za uvoz lokalno, saj lahko postopek traja precej časa."
77"časa."
78 157
79msgid "More infos in the official doc:" 158#, fuzzy
159msgid "More info in the official documentation:"
80msgstr "Več informacij v uradni dokumentaciji:" 160msgstr "Več informacij v uradni dokumentaciji:"
81 161
82msgid "import from Pocket" 162#, fuzzy
163msgid "Import from Pocket"
83msgstr "Uvoz iz aplikacije Pocket" 164msgstr "Uvoz iz aplikacije Pocket"
84 165
85msgid "import from Readability" 166#, php-format
167msgid "(you must have a %s file on your server)"
168msgstr ""
169
170#, fuzzy
171msgid "Import from Readability"
86msgstr "Uvoz iz aplikacije Readability" 172msgstr "Uvoz iz aplikacije Readability"
87 173
88msgid "import from Instapaper" 174#, fuzzy
175msgid "Import from Instapaper"
89msgstr "Uvoz iz aplikacije Instapaper" 176msgstr "Uvoz iz aplikacije Instapaper"
90 177
91msgid "Export your poche datas" 178#, fuzzy
179msgid "Import from wallabag"
180msgstr "Uvoz iz aplikacije Readability"
181
182#, fuzzy
183msgid "Export your wallabag data"
92msgstr "Izvoz vsebine" 184msgstr "Izvoz vsebine"
93 185
94msgid "Click here" 186msgid "Click here"
95msgstr "Kliknite tukaj" 187msgstr "Kliknite tukaj"
96 188
97msgid "to export your poche datas." 189#, fuzzy
190msgid "to download your database."
98msgstr "za izvoz vsebine aplikacije Poche." 191msgstr "za izvoz vsebine aplikacije Poche."
99 192
100msgid "back to home" 193#, fuzzy
101msgstr "Nazaj domov" 194msgid "to export your wallabag data."
102 195msgstr "za izvoz vsebine aplikacije Poche."
103msgid "installation"
104msgstr "Namestitev"
105 196
106msgid "install your poche" 197msgid "Cache"
107msgstr "Namestitev aplikacije Poche" 198msgstr ""
108 199
109msgid "" 200msgid "to delete cache."
110"poche is still not installed. Please fill the below form to install it. "
111"Don't hesitate to <a href='http://inthepoche.com/doc'>read the documentation "
112"on poche website</a>."
113msgstr "" 201msgstr ""
114"Poche še vedno ni nameščen. Za namestitev izpolnite spodnji obrazec. Za več "
115"informacij <a href='http://inthepoche.com/doc'>preberite dokumentacijo na "
116"spletni strani</a>."
117 202
118msgid "Login" 203msgid "You can enter multiple tags, separated by commas."
119msgstr "Prijava" 204msgstr ""
120 205
121msgid "Repeat your password" 206msgid "return to article"
122msgstr "Ponovite geslo" 207msgstr ""
123 208
124msgid "Install" 209msgid "plop"
125msgstr "Namesti" 210msgstr "štrbunk"
126 211
127msgid "back to top" 212msgid "You can <a href='wallabag_compatibility_test.php'>check your configuration here</a>."
128msgstr "nazaj na vrh" 213msgstr ""
129 214
130msgid "favoris" 215msgid "favoris"
131msgstr "priljubljeni" 216msgstr "priljubljeni"
@@ -154,10 +239,14 @@ msgstr "po naslovu"
154msgid "by title desc" 239msgid "by title desc"
155msgstr "po naslovu - padajoče" 240msgstr "po naslovu - padajoče"
156 241
157msgid "No link available here!" 242msgid "Tag"
158msgstr "Povezava ni na voljo!" 243msgstr ""
159 244
160msgid "toggle mark as read" 245msgid "No articles found."
246msgstr ""
247
248#, fuzzy
249msgid "Toggle mark as read"
161msgstr "označi kot prebrano" 250msgstr "označi kot prebrano"
162 251
163msgid "toggle favorite" 252msgid "toggle favorite"
@@ -169,13 +258,95 @@ msgstr "zavrzi"
169msgid "original" 258msgid "original"
170msgstr "izvirnik" 259msgstr "izvirnik"
171 260
261msgid "estimated reading time:"
262msgstr ""
263
264msgid "mark all the entries as read"
265msgstr ""
266
172msgid "results" 267msgid "results"
173msgstr "rezultati" 268msgstr "rezultati"
174 269
175msgid "tweet" 270msgid "installation"
271msgstr "Namestitev"
272
273#, fuzzy
274msgid "install your wallabag"
275msgstr "Namestitev aplikacije Poche"
276
277#, fuzzy
278msgid "wallabag is still not installed. Please fill the below form to install it. Don't hesitate to <a href='http://doc.wallabag.org/'>read the documentation on wallabag website</a>."
279msgstr "Poche še vedno ni nameščen. Za namestitev izpolnite spodnji obrazec. Za več informacij <a href='http://inthepoche.com/doc'>preberite dokumentacijo na spletni strani</a>."
280
281msgid "Login"
282msgstr "Prijava"
283
284msgid "Repeat your password"
285msgstr "Ponovite geslo"
286
287msgid "Install"
288msgstr "Namesti"
289
290#, fuzzy
291msgid "login to your wallabag"
292msgstr "prijavite se v svoj Poche"
293
294msgid "Login to wallabag"
295msgstr ""
296
297msgid "you are in demo mode, some features may be disabled."
298msgstr "uporabljate vzorčno različico programa, zato so lahko nekatere funkcije izklopljene."
299
300msgid "Username"
301msgstr ""
302
303msgid "Stay signed in"
304msgstr "Ostani prijavljen"
305
306msgid "(Do not check on public computers)"
307msgstr "(Ne označi na javnih napravah)"
308
309msgid "Sign in"
310msgstr "Prijava"
311
312msgid "favorites"
313msgstr "priljubljeni"
314
315msgid "estimated reading time :"
316msgstr ""
317
318msgid "Mark all the entries as read"
319msgstr ""
320
321msgid "Return home"
322msgstr ""
323
324#, fuzzy
325msgid "Back to top"
326msgstr "nazaj na vrh"
327
328#, fuzzy
329msgid "Mark as read"
330msgstr "označi kot prebrano"
331
332#, fuzzy
333msgid "Favorite"
334msgstr "priljubljeni"
335
336#, fuzzy
337msgid "Toggle favorite"
338msgstr "označi kot priljubljeno"
339
340#, fuzzy
341msgid "Delete"
342msgstr "zavrzi"
343
344#, fuzzy
345msgid "Tweet"
176msgstr "tvitni" 346msgstr "tvitni"
177 347
178msgid "email" 348#, fuzzy
349msgid "Email"
179msgstr "pošlji po e-pošti" 350msgstr "pošlji po e-pošti"
180 351
181msgid "shaarli" 352msgid "shaarli"
@@ -184,26 +355,24 @@ msgstr "shaarli"
184msgid "flattr" 355msgid "flattr"
185msgstr "flattr" 356msgstr "flattr"
186 357
187msgid "this article appears wrong?" 358#, fuzzy
359msgid "Does this article appear wrong?"
188msgstr "napaka?" 360msgstr "napaka?"
189 361
190msgid "create an issue" 362msgid "tags:"
191msgstr "prijavi napako" 363msgstr ""
192
193msgid "or"
194msgstr "ali"
195 364
196msgid "contact us by mail" 365msgid "Edit tags"
197msgstr "pošlji e-pošto razvijalcem" 366msgstr ""
198 367
199msgid "plop" 368msgid "save link!"
200msgstr "štrbunk" 369msgstr ""
201 370
202msgid "home" 371msgid "home"
203msgstr "domov" 372msgstr "domov"
204 373
205msgid "favorites" 374msgid "tags"
206msgstr "priljubljeni" 375msgstr ""
207 376
208msgid "logout" 377msgid "logout"
209msgstr "odjava" 378msgstr "odjava"
@@ -212,28 +381,188 @@ msgid "powered by"
212msgstr "stran poganja" 381msgstr "stran poganja"
213 382
214msgid "debug mode is on so cache is off." 383msgid "debug mode is on so cache is off."
215msgstr "" 384msgstr "vklopljen je način odpravljanja napak, zato je predpomnilnik izključen."
216"vklopljen je način odpravljanja napak, zato je predpomnilnik izključen."
217 385
218msgid "your poche version:" 386#, fuzzy
219msgstr "vaša verzija Poche:" 387msgid "your wallabag version:"
388msgstr "vaša različica"
220 389
221msgid "storage:" 390msgid "storage:"
222msgstr "pomnilnik:" 391msgstr "pomnilnik:"
223 392
224msgid "login to your poche" 393msgid "save a link"
225msgstr "prijavite se v svoj Poche" 394msgstr ""
226 395
227msgid "you are in demo mode, some features may be disabled." 396msgid "back to home"
397msgstr "Nazaj domov"
398
399msgid "toggle mark as read"
400msgstr "označi kot prebrano"
401
402msgid "tweet"
403msgstr "tvitni"
404
405msgid "email"
406msgstr "pošlji po e-pošti"
407
408msgid "this article appears wrong?"
409msgstr "napaka?"
410
411msgid "No link available here!"
412msgstr "Povezava ni na voljo!"
413
414msgid "Poching a link"
415msgstr "Shrani povezavo"
416
417msgid "by filling this field"
418msgstr "z vnosom v to polje"
419
420msgid "bookmarklet: drag & drop this link to your bookmarks bar"
228msgstr "" 421msgstr ""
229"uporabljate vzorčno različico programa, zato so lahko nekatere funkcije "
230"izklopljene."
231 422
232msgid "Stay signed in" 423msgid "your version"
233msgstr "Ostani prijavljen" 424msgstr "vaša različica"
234 425
235msgid "(Do not check on public computers)" 426msgid "latest stable version"
236msgstr "(Ne označi na javnih napravah)" 427msgstr "zadnja stabilna različica"
237 428
238msgid "Sign in" 429msgid "a more recent stable version is available."
239msgstr "Prijava" 430msgstr "na voljo je nova stabilna različica."
431
432msgid "you are up to date."
433msgstr "imate najnovejšo različico."
434
435msgid "latest dev version"
436msgstr "zadnja razvojna različica"
437
438msgid "a more recent development version is available."
439msgstr "na voljo je nova razvojna različica."
440
441msgid "Please execute the import script locally, it can take a very long time."
442msgstr "Prosimo poženite skripto za uvoz lokalno, saj lahko postopek traja precej časa."
443
444msgid "More infos in the official doc:"
445msgstr "Več informacij v uradni dokumentaciji:"
446
447msgid "import from Pocket"
448msgstr "Uvoz iz aplikacije Pocket"
449
450msgid "import from Readability"
451msgstr "Uvoz iz aplikacije Readability"
452
453msgid "import from Instapaper"
454msgstr "Uvoz iz aplikacije Instapaper"
455
456msgid "Tags"
457msgstr ""
458
459#, fuzzy
460msgid "Untitled"
461msgstr "po naslovu"
462
463msgid "the link has been added successfully"
464msgstr ""
465
466msgid "error during insertion : the link wasn't added"
467msgstr ""
468
469msgid "the link has been deleted successfully"
470msgstr ""
471
472msgid "the link wasn't deleted"
473msgstr ""
474
475msgid "Article not found!"
476msgstr ""
477
478msgid "previous"
479msgstr ""
480
481msgid "next"
482msgstr ""
483
484msgid "in demo mode, you can't update your password"
485msgstr ""
486
487msgid "your password has been updated"
488msgstr ""
489
490msgid "the two fields have to be filled & the password must be the same in the two fields"
491msgstr ""
492
493msgid "still using the \""
494msgstr ""
495
496msgid "that theme does not seem to be installed"
497msgstr ""
498
499msgid "you have changed your theme preferences"
500msgstr ""
501
502msgid "that language does not seem to be installed"
503msgstr ""
504
505msgid "you have changed your language preferences"
506msgstr ""
507
508msgid "login failed: you have to fill all fields"
509msgstr ""
510
511msgid "welcome to your wallabag"
512msgstr ""
513
514msgid "login failed: bad login or password"
515msgstr ""
516
517#, fuzzy
518msgid "import from instapaper completed"
519msgstr "Uvoz iz aplikacije Instapaper"
520
521#, fuzzy
522msgid "import from pocket completed"
523msgstr "Uvoz iz aplikacije Pocket"
524
525#, fuzzy
526msgid "import from Readability completed. "
527msgstr "Uvoz iz aplikacije Readability"
528
529#, fuzzy
530msgid "import from Poche completed. "
531msgstr "Uvoz iz aplikacije Pocket"
532
533msgid "Unknown import provider."
534msgstr ""
535
536msgid "Incomplete inc/poche/define.inc.php file, please define \""
537msgstr ""
538
539msgid "Could not find required \""
540msgstr ""
541
542msgid "Uh, there is a problem while generating feeds."
543msgstr ""
544
545#, fuzzy
546msgid "Cache deleted."
547msgstr "zavrzi"
548
549msgid "Oops, it seems you don't have PHP 5."
550msgstr ""
551
552#~ msgid "poche it!"
553#~ msgstr "shrani!"
554
555#~ msgid "Updating poche"
556#~ msgstr "Posodabljam Poche"
557
558#~ msgid "create an issue"
559#~ msgstr "prijavi napako"
560
561#~ msgid "or"
562#~ msgstr "ali"
563
564#~ msgid "contact us by mail"
565#~ msgstr "pošlji e-pošto razvijalcem"
566
567#~ msgid "your poche version:"
568#~ msgstr "vaša verzija Poche:"
diff --git a/locale/tools/fillCache.php b/locale/tools/fillCache.php
new file mode 100755
index 00000000..bdd9cc58
--- /dev/null
+++ b/locale/tools/fillCache.php
@@ -0,0 +1,59 @@
1<?php
2
3// this script compile all twig templates and put it in cahce to get Poedit (or xgettext) to extract phrases fron chached templates.
4
5// gettext command line tools:
6// msgunfmt - get po from mo
7// msgfmt - get mo from po
8// xgettext - extract phrases from files
9
10
11 $siteRoot = dirname(__FILE__) . '/../..';
12
13 require_once $siteRoot . '/vendor/twig/twig/lib/Twig/Autoloader.php';
14 Twig_Autoloader::register();
15
16 require_once $siteRoot . '/vendor/twig/extensions/lib/Twig/Extensions/Autoloader.php';
17 Twig_Extensions_Autoloader::register();
18
19 //$tplDir = $siteRoot.'/themes/default';
20 $tplDirRoot = $siteRoot.'/themes/';
21 $tmpDir = $siteRoot. '/cache/';
22
23 foreach (new IteratorIterator(new DirectoryIterator($tplDirRoot)) as $tplDir) {
24
25 if ($tplDir->isDir() and $tplDir!='.' and $tplDir!='..') {
26 echo "\n$tplDir\n";
27
28 $loader = new Twig_Loader_Filesystem($tplDirRoot.$tplDir);
29
30 // force auto-reload to always have the latest version of the template
31 $twig = new Twig_Environment($loader, array(
32 'cache' => $tmpDir,
33 'auto_reload' => true
34 ));
35
36 $twig->addExtension(new Twig_Extensions_Extension_I18n());
37
38 $filter = new Twig_SimpleFilter('getDomain', 'Tools::getDomain');
39 $twig->addFilter($filter);
40
41 $filter = new Twig_SimpleFilter('getReadingTime', 'Tools::getReadingTime');
42 $twig->addFilter($filter);
43
44 $filter = new Twig_SimpleFilter('getPrettyFilename', function($string) { return str_replace($siteRoot, '', $string); });
45 $twig->addFilter($filter);
46
47// // iterate over all your templates
48 foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($tplDirRoot.$tplDir), RecursiveIteratorIterator::LEAVES_ONLY) as $file) {
49 // force compilation
50 if ($file->isFile() and pathinfo($file, PATHINFO_EXTENSION)=='twig') {
51 echo "\t$file\n";
52 $twig->loadTemplate(str_replace($tplDirRoot.$tplDir.'/', '', $file));
53 }
54 }
55
56 }
57
58 }
59
diff --git a/locale/uk_UA.utf8/LC_MESSAGES/uk_UA.utf8.mo b/locale/uk_UA.utf8/LC_MESSAGES/uk_UA.utf8.mo
index 80972b65..4884abf5 100755
--- a/locale/uk_UA.utf8/LC_MESSAGES/uk_UA.utf8.mo
+++ b/locale/uk_UA.utf8/LC_MESSAGES/uk_UA.utf8.mo
Binary files differ
diff --git a/locale/uk_UA.utf8/LC_MESSAGES/uk_UA.utf8.po b/locale/uk_UA.utf8/LC_MESSAGES/uk_UA.utf8.po
index 6092cbab..08797705 100755
--- a/locale/uk_UA.utf8/LC_MESSAGES/uk_UA.utf8.po
+++ b/locale/uk_UA.utf8/LC_MESSAGES/uk_UA.utf8.po
@@ -2,8 +2,8 @@ msgid ""
2msgstr "" 2msgstr ""
3"Project-Id-Version: wballabag\n" 3"Project-Id-Version: wballabag\n"
4"Report-Msgid-Bugs-To: \n" 4"Report-Msgid-Bugs-To: \n"
5"POT-Creation-Date: 2014-02-06 19:23+0300\n" 5"POT-Creation-Date: 2014-02-25 15:06+0300\n"
6"PO-Revision-Date: 2014-02-06 19:24+0300\n" 6"PO-Revision-Date: 2014-02-25 15:08+0300\n"
7"Last-Translator: Maryana <mariroz@mr.lviv.ua>\n" 7"Last-Translator: Maryana <mariroz@mr.lviv.ua>\n"
8"Language-Team: \n" 8"Language-Team: \n"
9"Language: \n" 9"Language: \n"
@@ -15,52 +15,25 @@ msgstr ""
15"X-Poedit-Language: Ukrainian\n" 15"X-Poedit-Language: Ukrainian\n"
16"X-Poedit-Country: UKRAINE\n" 16"X-Poedit-Country: UKRAINE\n"
17"X-Poedit-SourceCharset: utf-8\n" 17"X-Poedit-SourceCharset: utf-8\n"
18"X-Poedit-SearchPath-0: /home/mariroz/_DEV/web/wallabag/wallabag\n" 18"X-Poedit-SearchPath-0: /home/mariroz/_DEV/web/wallabag/wallabag-master-testing\n"
19 19
20msgid "poche, a read it later open source system" 20msgid "wallabag, a read it later open source system"
21msgstr "poche, сервіс відкладеного читання з відкритим кодом" 21msgstr "wallabag, сервіс відкладеного читання з відкритим кодом"
22 22
23msgid "login failed: user doesn't exist" 23msgid "login failed: user doesn't exist"
24msgstr "увійти не вдалося: користувач не існує" 24msgstr "увійти не вдалося: користувач не існує"
25 25
26msgid "powered by" 26msgid "return home"
27msgstr "за підтримки" 27msgstr "повернутися на головну"
28
29msgid "debug mode is on so cache is off."
30msgstr "режим відладки включено, отже кеш виключено."
31
32msgid "your poche version:"
33msgstr "версія вашої poche:"
34
35msgid "storage:"
36msgstr "сховище:"
37
38msgid "home"
39msgstr "головна"
40
41msgid "favorites"
42msgstr "вибране"
43
44msgid "archive"
45msgstr "архів"
46
47msgid "tags"
48msgstr "теги"
49 28
50msgid "config" 29msgid "config"
51msgstr "налаштування" 30msgstr "налаштування"
52 31
53msgid "logout" 32msgid "Saving articles"
54msgstr "вихід"
55
56msgid "return home"
57msgstr "повернутися на головну"
58
59msgid "Poching links"
60msgstr "Зберігання посилань" 33msgstr "Зберігання посилань"
61 34
62msgid "There are several ways to poche a link:" 35msgid "There are several ways to save an article:"
63msgstr "Є кілька способів зберегти пос��л�нн:" 36msgstr "Є кілька способів зберегти ста��тю:"
64 37
65msgid "read the documentation" 38msgid "read the documentation"
66msgstr "читати документацію" 39msgstr "читати документацію"
@@ -83,14 +56,14 @@ msgstr "завантажити додаток"
83msgid "By filling this field" 56msgid "By filling this field"
84msgstr "Заповнивши це поле" 57msgstr "Заповнивши це поле"
85 58
86msgid "poche it!" 59msgid "bag it!"
87msgstr "зберегти!" 60msgstr "зберегти!"
88 61
89msgid "Bookmarklet: drag & drop this link to your bookmarks bar" 62msgid "Bookmarklet: drag & drop this link to your bookmarks bar"
90msgstr "З допомогою закладки: перетягніть і відпустіть посилання на панель закладок" 63msgstr "З допомогою закладки: перетягніть і відпустіть посилання на панель закладок"
91 64
92msgid "Updating poche" 65msgid "Upgrading wallabag"
93msgstr "Оновлення poche" 66msgstr "Оновлення wallabag"
94 67
95msgid "Installed version" 68msgid "Installed version"
96msgstr "Встановлено ​​версію" 69msgstr "Встановлено ​​версію"
@@ -104,14 +77,11 @@ msgstr "Є новіша стабільна версія."
104msgid "You are up to date." 77msgid "You are up to date."
105msgstr "У вас остання версія." 78msgstr "У вас остання версія."
106 79
107msgid "latest dev version" 80msgid "Latest dev version"
108msgstr "остання версія в розробці" 81msgstr "Остання версія в розробці"
109
110msgid "a more recent development version is available."
111msgstr "доступна новіша версія в розробці."
112 82
113msgid "you are up to date." 83msgid "A more recent development version is available."
114msgstr "у �с ��ст�нн� версія." 84msgstr "�остун�� �ов�ша версія в розробці."
115 85
116msgid "Feeds" 86msgid "Feeds"
117msgstr "Завантаження (feeds)" 87msgstr "Завантаження (feeds)"
@@ -170,8 +140,8 @@ msgstr "Імпортування"
170msgid "Please execute the import script locally as it can take a very long time." 140msgid "Please execute the import script locally as it can take a very long time."
171msgstr "Будь ласка, виконайте сценарій імпорту локально, оскільки це може тривати досить довго." 141msgstr "Будь ласка, виконайте сценарій імпорту локально, оскільки це може тривати досить довго."
172 142
173msgid "More info in the official docs:" 143msgid "More info in the official documentation:"
174msgstr "Більш ��тальна інформаці� в офіційній документації:" 144msgstr "Більше інформаці� в офіційній документації:"
175 145
176msgid "Import from Pocket" 146msgid "Import from Pocket"
177msgstr "Імпорт з Pocket-а" 147msgstr "Імпорт з Pocket-а"
@@ -186,11 +156,11 @@ msgstr "Імпорт з Readability"
186msgid "Import from Instapaper" 156msgid "Import from Instapaper"
187msgstr "Імпорт з Instapaper" 157msgstr "Імпорт з Instapaper"
188 158
189msgid "Import from poche" 159msgid "Import from wallabag"
190msgstr "Імпорт з poche" 160msgstr "Імпорт з wallabag"
191 161
192msgid "Export your poche data" 162msgid "Export your wallabag data"
193msgstr "Експортувати ваші дані з poche" 163msgstr "Експортувати ваші дані з wallabag"
194 164
195msgid "Click here" 165msgid "Click here"
196msgstr "Клікніть тут" 166msgstr "Клікніть тут"
@@ -198,32 +168,14 @@ msgstr "Клікніть тут"
198msgid "to download your database." 168msgid "to download your database."
199msgstr "щоб завантажити вашу базу даних." 169msgstr "щоб завантажити вашу базу даних."
200 170
201msgid "to export your poche data." 171msgid "to export your wallabag data."
202msgstr "щоб експортувати ваші дані poche." 172msgstr "щоб експортувати ваші дані wallabag."
203 173
204msgid "Tag" 174msgid "Cache"
205msgstr "�ег" 175msgstr "�еш"
206 176
207msgid "No link available here!" 177msgid "to delete cache."
208msgstr "Немає доступних посилань!" 178msgstr "щоб очистити кеш."
209
210msgid "toggle mark as read"
211msgstr "змінити мітку на прочитано"
212
213msgid "toggle favorite"
214msgstr "змінити мітку вибраного"
215
216msgid "delete"
217msgstr "видалити"
218
219msgid "original"
220msgstr "оригінал"
221
222msgid "estimated reading time:"
223msgstr "приблизний час читання:"
224
225msgid "results"
226msgstr "результат(ів)"
227 179
228msgid "You can enter multiple tags, separated by commas." 180msgid "You can enter multiple tags, separated by commas."
229msgstr "Ви можете ввести декілька тегів, розділених комами." 181msgstr "Ви можете ввести декілька тегів, розділених комами."
@@ -240,6 +192,9 @@ msgstr "Ви можете <a href='wallabag_compatibility_test.php'>переві
240msgid "favoris" 192msgid "favoris"
241msgstr "вибране" 193msgstr "вибране"
242 194
195msgid "archive"
196msgstr "архів"
197
243msgid "unread" 198msgid "unread"
244msgstr "непрочитане" 199msgstr "непрочитане"
245 200
@@ -261,12 +216,33 @@ msgstr "за назвою"
261msgid "by title desc" 216msgid "by title desc"
262msgstr "за назвою по спаданню" 217msgstr "за назвою по спаданню"
263 218
219msgid "Tag"
220msgstr "Тег"
221
264msgid "No articles found." 222msgid "No articles found."
265msgstr "Статей не знайдено." 223msgstr "Статей не знайдено."
266 224
267msgid "Toggle mark as read" 225msgid "Toggle mark as read"
268msgstr "змінити мітку прочитаного" 226msgstr "змінити мітку прочитаного"
269 227
228msgid "toggle favorite"
229msgstr "змінити мітку вибраного"
230
231msgid "delete"
232msgstr "видалити"
233
234msgid "original"
235msgstr "оригінал"
236
237msgid "estimated reading time:"
238msgstr "приблизний час читання:"
239
240msgid "mark all the entries as read"
241msgstr "відмітити всі статті як прочитані"
242
243msgid "results"
244msgstr "результат(ів)"
245
270msgid "installation" 246msgid "installation"
271msgstr "інсталяція" 247msgstr "інсталяція"
272 248
@@ -303,6 +279,18 @@ msgstr "Запам'ятати мене"
303msgid "(Do not check on public computers)" 279msgid "(Do not check on public computers)"
304msgstr "(Не відмічайте на загальнодоступних комп'ютерах)" 280msgstr "(Не відмічайте на загальнодоступних комп'ютерах)"
305 281
282msgid "Sign in"
283msgstr "Увійти"
284
285msgid "favorites"
286msgstr "вибране"
287
288msgid "estimated reading time :"
289msgstr "приблизний час читання:"
290
291msgid "Mark all the entries as read"
292msgstr "Відмітити все як прочитане"
293
306msgid "Return home" 294msgid "Return home"
307msgstr "Повернутися на головну" 295msgstr "Повернутися на головну"
308 296
@@ -342,11 +330,95 @@ msgstr "теги:"
342msgid "Edit tags" 330msgid "Edit tags"
343msgstr "Редагувати теги" 331msgstr "Редагувати теги"
344 332
345msgid "previous" 333msgid "save link!"
346msgstr "����ре�" 334msgstr "�ере��т� л�нк!"
347 335
348msgid "next" 336msgid "home"
349msgstr "наступна" 337msgstr "головна"
338
339msgid "tags"
340msgstr "теги"
341
342msgid "logout"
343msgstr "вихід"
344
345msgid "powered by"
346msgstr "за підтримки"
347
348msgid "debug mode is on so cache is off."
349msgstr "режим відладки включено, отже кеш виключено."
350
351msgid "your wallabag version:"
352msgstr "версія вашого wallabag:"
353
354msgid "storage:"
355msgstr "сховище:"
356
357msgid "save a link"
358msgstr "зберегти лінк"
359
360msgid "back to home"
361msgstr "назад на головну"
362
363msgid "toggle mark as read"
364msgstr "змінити мітку на прочитано"
365
366msgid "tweet"
367msgstr "твітнути"
368
369msgid "email"
370msgstr "email"
371
372msgid "this article appears wrong?"
373msgstr "ця стаття виглядає не так, як треба?"
374
375msgid "No link available here!"
376msgstr "Немає доступних посилань!"
377
378msgid "Poching a link"
379msgstr "Зберігання посилання"
380
381msgid "by filling this field"
382msgstr "заповнивши це поле"
383
384msgid "bookmarklet: drag & drop this link to your bookmarks bar"
385msgstr "з допомогою закладки: перетягніть і відпустіть посилання на панель закладок"
386
387msgid "your version"
388msgstr "ваша версія:"
389
390msgid "latest stable version"
391msgstr "остання стабільна версія"
392
393msgid "a more recent stable version is available."
394msgstr "є новіша стабільна версія."
395
396msgid "you are up to date."
397msgstr "у вас остання версія."
398
399msgid "latest dev version"
400msgstr "остання версія в розробці"
401
402msgid "a more recent development version is available."
403msgstr "доступна новіша версія в розробці."
404
405msgid "Please execute the import script locally, it can take a very long time."
406msgstr "Будь ласка, виконайте сценарій імпорту локально, оскільки це може тривати досить довго."
407
408msgid "More infos in the official doc:"
409msgstr "Більше інформації в офіційній документації:"
410
411msgid "import from Pocket"
412msgstr "імпорт з Pocket-а"
413
414msgid "import from Readability"
415msgstr "імпорт з Readability"
416
417msgid "import from Instapaper"
418msgstr "імпорт з Instapaper"
419
420msgid "Tags"
421msgstr "Теги"
350 422
351msgid "Untitled" 423msgid "Untitled"
352msgstr "Без назви" 424msgstr "Без назви"
@@ -363,6 +435,15 @@ msgstr "посилання успішно видалено"
363msgid "the link wasn't deleted" 435msgid "the link wasn't deleted"
364msgstr "посилання не було видалено" 436msgstr "посилання не було видалено"
365 437
438msgid "Article not found!"
439msgstr "Статтю не знайдено!"
440
441msgid "previous"
442msgstr "попередня"
443
444msgid "next"
445msgstr "наступна"
446
366msgid "in demo mode, you can't update your password" 447msgid "in demo mode, you can't update your password"
367msgstr "в демонстраційному режимі ви не можете змінювати свій пароль" 448msgstr "в демонстраційному режимі ви не можете змінювати свій пароль"
368 449
@@ -390,15 +471,12 @@ msgstr "ви змінили свої налаштування мови"
390msgid "login failed: you have to fill all fields" 471msgid "login failed: you have to fill all fields"
391msgstr "увійти не вдалося: ви повинні заповнити всі поля" 472msgstr "увійти не вдалося: ви повинні заповнити всі поля"
392 473
393msgid "welcome to your poche" 474msgid "welcome to your wallabag"
394msgstr "ласкаво просимо до вашого poche" 475msgstr "ласкаво просимо до вашого wallabag"
395 476
396msgid "login failed: bad login or password" 477msgid "login failed: bad login or password"
397msgstr "увійти не вдалося: не вірний логін або пароль" 478msgstr "увійти не вдалося: не вірний логін або пароль"
398 479
399msgid "see you soon!"
400msgstr "бувайте, ще побачимось!"
401
402msgid "import from instapaper completed" 480msgid "import from instapaper completed"
403msgstr "імпорт з instapaper-а завершено" 481msgstr "імпорт з instapaper-а завершено"
404 482
@@ -423,6 +501,34 @@ msgstr "Не вдалося знайти потрібний \""
423msgid "Uh, there is a problem while generating feeds." 501msgid "Uh, there is a problem while generating feeds."
424msgstr "Ох, є проблема при створенні завантажень (feeds)." 502msgstr "Ох, є проблема при створенні завантажень (feeds)."
425 503
504msgid "Cache deleted."
505msgstr "Кеш очищено."
506
426msgid "Oops, it seems you don't have PHP 5." 507msgid "Oops, it seems you don't have PHP 5."
427msgstr "Упс, здається, у вас немає PHP 5." 508msgstr "Упс, здається, у вас немає PHP 5."
428 509
510#~ msgid "You can poche a link by several methods:"
511#~ msgstr "Ви можете зберегти посилання кількома способами:"
512
513#~ msgid "poche it!"
514#~ msgstr "зберегти!"
515
516#~ msgid "Updating poche"
517#~ msgstr "Оновлення poche"
518
519#, fuzzy
520#~ msgid "Export your poche datas"
521#~ msgstr "Експортувати ваші дані з poche"
522
523#, fuzzy
524#~ msgid "to export your poche datas."
525#~ msgstr "щоб експортувати ваші дані poche."
526
527#~ msgid "Import from poche"
528#~ msgstr "Імпорт з poche"
529
530#~ msgid "welcome to your poche"
531#~ msgstr "ласкаво просимо до вашого poche"
532
533#~ msgid "see you soon!"
534#~ msgstr "бувайте, ще побачимось!"
diff --git a/themes/baggy/_display-mode.twig b/themes/baggy/_display-mode.twig
new file mode 100755
index 00000000..382dd5f1
--- /dev/null
+++ b/themes/baggy/_display-mode.twig
@@ -0,0 +1,5 @@
1<div id="display-mode">
2 <a href="javascript: void(null);" id="listmode" class="listmode">
3 <img src="{{ poche_url }}themes/{{ theme }}/img/{{ theme }}/blank.png" alt="{% trans "toggle view mode" %}" title="{% trans "toggle view mode" %}" width="16" height="16">
4 </a>
5</div>
diff --git a/themes/baggy/_head.twig b/themes/baggy/_head.twig
index 206d5aae..04898d85 100644..100755
--- a/themes/baggy/_head.twig
+++ b/themes/baggy/_head.twig
@@ -1,12 +1,15 @@
1 <link rel="shortcut icon" type="image/x-icon" href="{{ poche_url }}/themes/{{theme}}/img/favicon.ico" /> 1 <link rel="shortcut icon" type="image/x-icon" href="{{ poche_url }}themes/{{theme}}/img/favicon.ico" />
2 <link rel="apple-touch-icon-precomposed" sizes="144x144" href="{{ poche_url }}/themes/{{theme}}/img/apple-touch-icon-144x144-precomposed.png"> 2 <link rel="apple-touch-icon-precomposed" sizes="144x144" href="{{ poche_url }}themes/{{theme}}/img/apple-touch-icon-144x144-precomposed.png">
3 <link rel="apple-touch-icon-precomposed" sizes="72x72" href="{{ poche_url }}/themes/{{theme}}/img/apple-touch-icon-72x72-precomposed.png"> 3 <link rel="apple-touch-icon-precomposed" sizes="72x72" href="{{ poche_url }}themes/{{theme}}/img/apple-touch-icon-72x72-precomposed.png">
4 <link rel="apple-touch-icon-precomposed" href="{{ poche_url }}/themes/{{theme}}/img/apple-touch-icon-precomposed.png"> 4 <link rel="apple-touch-icon-precomposed" href="{{ poche_url }}themes/{{theme}}/img/apple-touch-icon-precomposed.png">
5 <link rel="stylesheet" href="{{ poche_url }}/themes/{{theme}}/css/ratatouille.css" media="all"> 5 <link rel="stylesheet" href="{{ poche_url }}themes/{{theme}}/css/ratatouille.css" media="all">
6 <link rel="stylesheet" href="{{ poche_url }}/themes/{{theme}}/css/font.css" media="all"> 6 <link rel="stylesheet" href="{{ poche_url }}themes/{{theme}}/css/font.css" media="all">
7 <link rel="stylesheet" href="{{ poche_url }}/themes/{{theme}}/css/main.css" media="all"> 7 <link rel="stylesheet" href="{{ poche_url }}themes/{{theme}}/css/main.css" media="all">
8 <link rel="stylesheet" href="{{ poche_url }}/themes/{{theme}}/css/messages.css" media="all"> 8 <link rel="stylesheet" href="{{ poche_url }}themes/{{theme}}/css/messages.css" media="all">
9 <link rel="stylesheet" href="{{ poche_url }}/themes/{{theme}}/css/print.css" media="print"> 9 <link rel="stylesheet" href="{{ poche_url }}themes/{{theme}}/css/print.css" media="print">
10 <script src="{{ poche_url }}/themes/{{theme}}/js/jquery-2.0.3.min.js"></script> 10 <script src="{{ poche_url }}themes/default/js/jquery-2.0.3.min.js"></script>
11 <script src="{{ poche_url }}/themes/{{theme}}/js/init.js"></script> 11 <script src="{{ poche_url }}themes/default/js/autoClose.js"></script>
12 <script src="{{ poche_url }}/themes/{{ constant('DEFAULT_THEME') }}/js/closeMessage.js"></script> 12 <script src="{{ poche_url }}themes/{{theme}}/js/jquery.cookie.js"></script>
13 <script src="{{ poche_url }}themes/{{theme}}/js/init.js"></script>
14 <script src="{{ poche_url }}themes/default/js/saveLink.js"></script>
15 <script src="{{ poche_url }}themes/{{theme}}/js/closeMessage.js"></script>
diff --git a/themes/baggy/_menu.twig b/themes/baggy/_menu.twig
index e9cd9d4a..f1b75cd5 100644
--- a/themes/baggy/_menu.twig
+++ b/themes/baggy/_menu.twig
@@ -4,9 +4,13 @@
4 <li><a href="./?view=fav" {% if view == 'fav' %}class="current"{% endif %}>{% trans "favorites" %}</a></li> 4 <li><a href="./?view=fav" {% if view == 'fav' %}class="current"{% endif %}>{% trans "favorites" %}</a></li>
5 <li><a href="./?view=archive" {% if view == 'archive' %}class="current"{% endif %}>{% trans "archive" %}</a></li> 5 <li><a href="./?view=archive" {% if view == 'archive' %}class="current"{% endif %}>{% trans "archive" %}</a></li>
6 <li><a href="./?view=tags" {% if view == 'tags' %}class="current"{% endif %}>{% trans "tags" %}</a></li> 6 <li><a href="./?view=tags" {% if view == 'tags' %}class="current"{% endif %}>{% trans "tags" %}</a></li>
7 <li><a href="javascript: void(null);" id="pocheit">{% trans "save a link" %}</a></li> 7 <li style="position: relative;"><a href="javascript: void(null);" id="bagit">{% trans "save a link" %}</a>
8 {% include '_pocheit-form.twig' %}
9 </li>
10 <li style="position: relative;"><a href="javascript: void(null);" id="search">{% trans "search" %}</a>
11 {% include '_search-form.twig' %}
12 </li>
8 <li><a href="./?view=config" {% if view == 'config' %}class="current"{% endif %}>{% trans "config" %}</a></li> 13 <li><a href="./?view=config" {% if view == 'config' %}class="current"{% endif %}>{% trans "config" %}</a></li>
9 <li><a class="icon icon-power" href="./?logout" title="{% trans "logout" %}">{% trans "logout" %}</a></li> 14 <li><a class="icon icon-power" href="./?logout" title="{% trans "logout" %}">{% trans "logout" %}</a></li>
10 </ul> 15 </ul>
11 16
12 {% include '_pocheit-form.twig' %}
diff --git a/themes/baggy/_pocheit-form.twig b/themes/baggy/_pocheit-form.twig
new file mode 100755
index 00000000..505ec368
--- /dev/null
+++ b/themes/baggy/_pocheit-form.twig
@@ -0,0 +1,10 @@
1<div id="bagit-form" class="messages info">
2 <form method="get" action="index.php" target="_blank" id="bagit-form-form">
3 <h2><a href="javascript: void(null);" id="bagit-form-close">X</a>
4 {% trans "Save a link" %}</h2>
5 <input type="hidden" name="autoclose" value="1" />
6 <input required placeholder="example.com/article" class="addurl" id="plainurl" name="plainurl" type="url" />
7 <input type="submit" value="{% trans "save link!" %}" />
8 <div id="add-link-result"></div>
9 </form>
10</div>
diff --git a/themes/baggy/_search-form.twig b/themes/baggy/_search-form.twig
new file mode 100644
index 00000000..1fd4154e
--- /dev/null
+++ b/themes/baggy/_search-form.twig
@@ -0,0 +1,21 @@
1<div id="search-form" class="messages info">
2<form method="get" action="index.php">
3 <input type="hidden" name="view" value="search"></input>
4 <label><a href="javascript: void(null);" id="search-form-close">X</a>{% trans "Search" %}</label> : <input type="text" name="search" />
5 <input id="submit-search" type="submit" value="{% trans "Search" %} !"></input>
6</form>
7</div>
8<script type="text/javascript">
9 $(document).ready(function() {
10
11 $("#search-form").hide();
12
13 $("#search").click(function(){
14 $("#search-form").toggle();
15 $("#search").toggleClass("current");
16 $("#search-arrow").toggleClass("arrow-down");
17 });
18
19
20 });
21</script> \ No newline at end of file
diff --git a/themes/baggy/_top.twig b/themes/baggy/_top.twig
index 4f476a37..a31c0925 100644..100755
--- a/themes/baggy/_top.twig
+++ b/themes/baggy/_top.twig
@@ -1,6 +1,6 @@
1 <header class="w600p center mbm"> 1 <header class="w600p center mbm">
2 <h1 class="logo"> 2 <h1 class="logo">
3 {% if view == 'home' %}{% block logo %}<img width="100" height="100" src="{{ poche_url }}/themes/{{theme}}/img/logo-w.png" alt="logo poche" />{% endblock %} 3 {% if view == 'home' %}{% block logo %}<img width="100" height="100" src="{{ poche_url }}themes/{{theme}}/img/logo-w.png" alt="wallabag logo" />{% endblock %}
4 {% else %}<a href="./" title="{% trans "return home" %}" >{{ block('logo') }}</a> 4 {% else %}<a href="./" title="{% trans "return home" %}" >{{ block('logo') }}</a>
5 {% endif %} 5 {% endif %}
6 </h1> 6 </h1>
diff --git a/themes/baggy/config.twig b/themes/baggy/config.twig
index b37ac115..d441de7c 100644..100755
--- a/themes/baggy/config.twig
+++ b/themes/baggy/config.twig
@@ -8,10 +8,11 @@
8 <h2>{% trans "Saving articles" %}</h2> 8 <h2>{% trans "Saving articles" %}</h2>
9 <p>{% trans "There are several ways to save an article:" %} (<a href="http://doc.wallabag.org/" title="{% trans "read the documentation" %}">?</a>)</p> 9 <p>{% trans "There are several ways to save an article:" %} (<a href="http://doc.wallabag.org/" title="{% trans "read the documentation" %}">?</a>)</p>
10 <ul> 10 <ul>
11 <li>Firefox: <a href="https://addons.mozilla.org/firefox/addon/poche/" title="download the firefox extension">{% trans "download the extension" %}</a></li> 11 <li>Firefox: <a href="https://addons.mozilla.org/firefox/addon/wallabag/" title="download the firefox extension">{% trans "download the extension" %}</a></li>
12 <li>Chrome: <a href="http://doc.wallabag.org/doku.php?id=users:chrome_extension" title="download the chrome extension">{% trans "download the extension" %}</a></li> 12 <li>Chrome: <a href="http://doc.wallabag.org/doku.php?id=users:chrome_extension" title="download the chrome extension">{% trans "download the extension" %}</a></li>
13 <li>Android: <a href="https://f-droid.org/repository/browse/?fdid=fr.gaulupeau.apps.Poche" title="download the application">{% trans "via F-Droid" %}</a> {% trans " or " %} <a href="https://play.google.com/store/apps/details?id=fr.gaulupeau.apps.InThePoche" title="download the application">{% trans "via Google Play" %}</a></li> 13 <li>Android: <a href="https://f-droid.org/app/fr.gaulupeau.apps.InThePoche" title="download the application">{% trans "via F-Droid" %}</a> {% trans " or " %} <a href="https://play.google.com/store/apps/details?id=fr.gaulupeau.apps.InThePoche" title="download the application">{% trans "via Google Play" %}</a></li>
14 <li>Windows Phone: <a href="https://www.windowsphone.com/en-us/store/app/poche/334de2f0-51b5-4826-8549-a3d805a37e83" title="download the window phone application">{% trans "download the application" %}</a></li> 14 <li>iOS: <a href="https://itunes.apple.com/app/wallabag/id828331015?mt=8" title="download the iOS application">{% trans "download the application" %}</a></li>
15 <li>Windows Phone: <a href="http://www.windowsphone.com/en-us/store/app/wallabag/ff890514-348c-4d0b-9b43-153fff3f7450" title="download the window phone application">{% trans "download the application" %}</a></li>
15 <li> 16 <li>
16 <form method="get" action="index.php"> 17 <form method="get" action="index.php">
17 <label class="addurl" for="config_plainurl">{% trans "By filling this field" %}:</label> 18 <label class="addurl" for="config_plainurl">{% trans "By filling this field" %}:</label>
@@ -25,9 +26,10 @@
25 <h2>{% trans "Upgrading wallabag" %}</h2> 26 <h2>{% trans "Upgrading wallabag" %}</h2>
26 <ul> 27 <ul>
27 <li>{% trans "Installed version" %} : <strong>{{ constant('POCHE') }}</strong></li> 28 <li>{% trans "Installed version" %} : <strong>{{ constant('POCHE') }}</strong></li>
28 <li>{% trans "Latest stable version" %} : {{ prod }}. {% if compare_prod == -1 %}<strong><a href="http://wallabag.org/">{% trans "A more recent stable version is available." %}</a></strong>{% else %}{% trans "You are up to date." %}{% endif %}</li> 29 <li>{% trans "Latest stable version" %} : {{ prod }}. {% if compare_prod == -1 %}<strong><a href="http://wallabag.org/">{% trans "A more recent stable version is available." %}</a></strong>{% else %}{% trans "You are up to date." %}{% endif %} ({% trans "Last check:" %} {{ check_time_prod }})</li>
29 {% if constant('DEBUG_POCHE') == 1 %}<li>{% trans "Latest dev version" %} : {{ dev }}. {% if compare_dev == -1 %}<strong><a href="http://wallabag.org/">{% trans "A more recent development version is available." %}</a></strong>{% else %}{% trans "You are up to date." %}{% endif %}</li>{% endif %} 30 {% if constant('DEBUG_POCHE') == 1 %}<li>{% trans "Latest dev version" %} : {{ dev }}. {% if compare_dev == -1 %}<strong><a href="http://wallabag.org/">{% trans "A more recent development version is available." %}</a></strong>{% else %}{% trans "You are up to date." %}{% endif %} ({% trans "Last check:" %} {{ check_time_dev }}){% endif %}</li>
30 </ul> 31 </ul>
32 <p>{% trans "You can clear cache to check the latest release." %}</p>
31 33
32 <h2>{% trans "Feeds" %}</h2> 34 <h2>{% trans "Feeds" %}</h2>
33 {% if token == '' %} 35 {% if token == '' %}
@@ -42,7 +44,7 @@
42 <p>{% trans "Your user id:" %} <strong>{{user_id}}</strong></p> 44 <p>{% trans "Your user id:" %} <strong>{{user_id}}</strong></p>
43 <p>{% trans "You can regenerate your token: <a href='?feed&amp;action=generate'>generate!</a>." %}</p> 45 <p>{% trans "You can regenerate your token: <a href='?feed&amp;action=generate'>generate!</a>." %}</p>
44 {% endif %} 46 {% endif %}
45 47
46 <h2>{% trans "Change your theme" %}</h2> 48 <h2>{% trans "Change your theme" %}</h2>
47 <form method="post" action="?updatetheme" name="changethemeform"> 49 <form method="post" action="?updatetheme" name="changethemeform">
48 <fieldset class="w500p inline"> 50 <fieldset class="w500p inline">
@@ -103,15 +105,21 @@
103 {% endif %} 105 {% endif %}
104 106
105 <h2>{% trans "Import" %}</h2> 107 <h2>{% trans "Import" %}</h2>
106 <p>{% trans "Please execute the import script locally as it can take a very long time." %}</p> 108 <p>{% trans "You can import your Pocket, Readability, Instapaper, Wallabag or any data in appropriate json or html format." %}</p>
107 <p>{% trans "More info in the official documentation:" %} <a href="http://doc.wallabag.org/doku.php?id=users:migrate">wallabag.org</a></p> 109 <p>{% trans "Please select export file on your computer and press \"Import\" button below.<br>Wallabag will parse your file, insert all URLs and start fetching of articles if required.<br>Fetching process is controlled by two constants in your config file: IMPORT_LIMIT (how many articles are fetched at once) and IMPORT_DELAY (delay between fetch of next batch of articles)." %}</p>
108 <ul> 110 <form method="post" action="?import" name="uploadfile" enctype="multipart/form-data">
109 <li><a href="./?import&amp;from=pocket">{% trans "Import from Pocket" %}</a> {{ '(you must have a %s file on your server)'|trans|format(constant('POCKET_FILE')) }}</li> 111 <fieldset class="w500p">
110 <li><a href="./?import&amp;from=readability">{% trans "Import from Readability" %}</a> {{ '(you must have a %s file on your server)'|trans|format(constant('READABILITY_FILE')) }}</li> 112 <div class="row">
111 <li><a href="./?import&amp;from=instapaper">{% trans "Import from Instapaper" %}</a> {{ '(you must have a %s file on your server)'|trans|format(constant('INSTAPAPER_FILE')) }}</li> 113 <label class="col w150p" for="file">{% trans "File:" %}</label>
112 <li><a href="./?import&amp;from=poche">{% trans "Import from wallabag" %}</a> {{ '(you must have a %s file on your server)'|trans|format(constant('POCHE_FILE')) }}</li> 114 <input class="col" type="file" id="file" name="file" tabindex="4">
113 </ul> 115 </div>
114 116 <div class="row mts txtcenter">
117 <button class="bouton" type="submit" tabindex="4">{% trans "Import" %}</button>
118 </div>
119 </fieldset>
120 </form>
121 <p><a href="?import">{% trans "You can click here to fetch content for articles with no content." %}</a></p>
122
115 <h2>{% trans "Export your wallabag data" %}</h2> 123 <h2>{% trans "Export your wallabag data" %}</h2>
116 {% if constant('STORAGE') == 'sqlite' %} 124 {% if constant('STORAGE') == 'sqlite' %}
117 <p><a href="?download" target="_blank">{% trans "Click here" %}</a> {% trans "to download your database." %}</p>{% endif %} 125 <p><a href="?download" target="_blank">{% trans "Click here" %}</a> {% trans "to download your database." %}</p>{% endif %}
diff --git a/themes/baggy/css/main.css b/themes/baggy/css/main.css
index 3e128b08..0dd552de 100755
--- a/themes/baggy/css/main.css
+++ b/themes/baggy/css/main.css
@@ -173,21 +173,22 @@ h2:after {
173#links { 173#links {
174 position: fixed; 174 position: fixed;
175 top: 0; 175 top: 0;
176 width: 9em; 176 width: 10em;
177 left: 0; 177 left: 0;
178 text-align: right; 178 text-align: right;
179 background: #333; 179 background: #333;
180 padding-top: 9em; 180 padding-top: 9.5em;
181 height: 100%; 181 height: 100%;
182 box-shadow:inset -4px 0 20px rgba(0,0,0,0.6); 182 box-shadow:inset -4px 0 20px rgba(0,0,0,0.6);
183 z-index: 10; 183 z-index: 10;
184} 184}
185 185
186#main { 186#main {
187 margin-left: 12em; 187 margin-left: 13em;
188 position: relative; 188 position: relative;
189 z-index: 10; 189 z-index: 10;
190 padding-right: 5%; 190 padding-right: 5%;
191 padding-bottom: 1em;
191} 192}
192 193
193 #links a { 194 #links a {
@@ -227,7 +228,7 @@ h2:after {
227 #links li:last-child { 228 #links li:last-child {
228 position: fixed; 229 position: fixed;
229 bottom: 1em; 230 bottom: 1em;
230 width: 10%; 231 width: 10em;
231 } 232 }
232 233
233 #links li:last-child a:before { 234 #links li:last-child a:before {
@@ -237,6 +238,61 @@ h2:after {
237 } 238 }
238 239
239 240
241#sort {
242 padding: 0;
243 list-style-type: none;
244 opacity: 0.5;
245 display: inline-block;
246}
247
248#sort li {
249 display: inline;
250 font-size: 0.9em;
251}
252
253#sort li + li {
254 margin-left: 10px;
255}
256
257#sort a {
258 padding: 2px 2px 0;
259 vertical-align: middle;
260}
261
262#sort img {
263 vertical-align: baseline;
264}
265#sort img:hover {
266 cursor: pointer;
267}
268
269#display-mode {
270 float: right;
271 vertical-align: middle;
272 margin-top: 10px;
273 margin-bottom: 10px;
274 opacity: 0.5;
275}
276#listmode {
277 width: 16px;
278 display: inline-block;
279 text-decoration: none;
280}
281#listmode a:hover {
282 opacity: 1;
283}
284.tablemode {
285 background-image: url("../img/baggy/table.png");
286 background-repeat: no-repeat;
287 background-position: bottom;
288}
289.listmode {
290 background-image: url("../img/baggy/list.png");
291 background-repeat: no-repeat;
292 background-position: bottom;
293}
294
295
240/* ========================================================================== 296/* ==========================================================================
241 2 = Layout 297 2 = Layout
242 ========================================================================== */ 298 ========================================================================== */
@@ -248,7 +304,7 @@ h2:after {
248 304
249footer { 305footer {
250 text-align: right; 306 text-align: right;
251 position: fixed; 307 position: relative;
252 bottom: 0; 308 bottom: 0;
253 right: 5em; 309 right: 5em;
254 color: #999; 310 color: #999;
@@ -266,6 +322,15 @@ footer a {
266 letter-spacing:-5px; 322 letter-spacing:-5px;
267} 323}
268 324
325.listmode .entrie {
326 width: 100%!important;
327 margin-left: 0!important;
328}
329
330.listmode .entrie p {
331 display: none;
332}
333
269.list-entries + .results { 334.list-entries + .results {
270 margin-bottom: 2em; 335 margin-bottom: 2em;
271} 336}
@@ -287,10 +352,10 @@ footer a {
287 letter-spacing:normal; 352 letter-spacing:normal;
288 box-shadow: 0 3px 7px rgba(0,0,0,0.3); 353 box-shadow: 0 3px 7px rgba(0,0,0,0.3);
289 display: inline-block; 354 display: inline-block;
290 width: 32%; 355 width: 32%!important;
291 margin-bottom: 1.5em; 356 margin-bottom: 1.5em;
292 vertical-align: top; 357 vertical-align: top;
293 margin-left: 1.5%; 358 margin-left: 1.5%!important;
294 position: relative; 359 position: relative;
295 overflow: hidden; 360 overflow: hidden;
296 padding: 1.5em 1.5em 3em 1.5em; 361 padding: 1.5em 1.5em 3em 1.5em;
@@ -359,6 +424,7 @@ footer a {
359 content: none; 424 content: none;
360 } 425 }
361 426
427
362.entrie h2 a { 428.entrie h2 a {
363 display: block; 429 display: block;
364 text-decoration: none; 430 text-decoration: none;
@@ -370,7 +436,7 @@ footer a {
370 -o-transition: all 0.5s ease; 436 -o-transition: all 0.5s ease;
371 transition: all 0.5s ease; 437 transition: all 0.5s ease;
372} 438}
373 439/*
374.entrie h2 a:after { 440.entrie h2 a:after {
375 content: ""; 441 content: "";
376 position: absolute; 442 position: absolute;
@@ -379,6 +445,7 @@ footer a {
379 height: 100%; 445 height: 100%;
380 left: 0; 446 left: 0;
381} 447}
448*/
382 449
383.entrie p { 450.entrie p {
384 color: #666; 451 color: #666;
@@ -425,7 +492,7 @@ footer a {
425 } 492 }
426 493
427.entrie:nth-child(3n+1) { 494.entrie:nth-child(3n+1) {
428 margin-left: 0; 495 margin-left: 0!important;
429} 496}
430 497
431.results { 498.results {
@@ -442,6 +509,7 @@ footer a {
442 509
443.pagination { 510.pagination {
444 text-align: right; 511 text-align: right;
512 margin-bottom:50px;
445} 513}
446 514
447.nb-results { 515.nb-results {
@@ -469,6 +537,134 @@ footer a {
469} 537}
470 538
471/* ========================================================================== 539/* ==========================================================================
540 2.1 = "save a link" popup div related styles
541 ========================================================================== */
542
543#bagit-form {
544 background: rgba(0,0,0,0.5);
545 position: absolute;
546 top: 0;
547 left: 10em;
548 z-index: 20;
549 height: 100%;
550 width: 100%;
551 margin: 0;
552 margin-top: -30%;
553 padding: 2em;
554 display: none;
555 border-left: 1px #EEE solid;
556}
557
558#bagit-form form {
559 background: #FFF;
560 position: absolute;
561 top: 0;
562 left: 0;
563 z-index: 20;
564 border: 10px solid #000;
565 width: 400px;
566 height: 200px;
567 /* margin: -150px 0 0 -300px; */
568 padding: 2em;
569}
570
571a#bagit-form-close {
572 background: #000;
573 color: #FFF;
574 padding: 0.2em 0.5em;
575 text-decoration: none;
576 display: inline-block;
577 float: right;
578 font-size: 0.6em;
579}
580a#bagit-form-close:hover {
581 background: #999;
582 color: #000;
583}
584
585.active-current {
586 background-color: #999;
587}
588
589.active-current:after {
590 content: "";
591 width: 0;
592 height: 0;
593 position: absolute;
594 border-style: solid;
595 border-width: 10px;
596 border-color: transparent #EEE transparent transparent;
597 right: 0;
598 top: 50%;
599 margin-top: -10px;
600}
601
602.opacity03 {
603 opacity: 0.3;
604}
605
606.add-to-wallabag-link-after {
607 background-color: #000;
608 color: #fff;
609 padding: 0 3px 2px 3px;
610}
611
612#add-link-result {
613 font-weight: bold;
614 margin-top: 10px;
615}
616
617/* ==========================================================================
618 2.2 = "search for articles" popup div related styles
619 ========================================================================== */
620#search-form {
621 background: rgba(0,0,0,0.5);
622 position: absolute;
623 top: 0;
624 left: 10em;
625 z-index: 20;
626 height: 100%;
627 width: 100%;
628 margin: 0;
629 margin-top: -30%;
630 padding: 2em;
631 display: none;
632 border-left: 1px #EEE solid;
633}
634
635#search-form form {
636 background: #FFF;
637 position: absolute;
638 top: 0;
639 left: 0;
640 z-index: 20;
641 border: 10px solid #000;
642 width: 400px;
643 height: 200px;
644 /* margin: -150px 0 0 -300px; */
645 padding: 2em;
646}
647
648a#search-form-close {
649 background: #000;
650 color: #FFF;
651 padding: 0.2em 0.5em;
652 text-decoration: none;
653 display: inline-block;
654 float: right;
655 font-size: 1.2em;
656}
657a#search-form-close:hover {
658 background: #999;
659 color: #000;
660}
661
662#submit-search{
663margin-left: 4em;
664margin-top:1em;
665}
666
667/* ==========================================================================
472 3 = Pictos 668 3 = Pictos
473 ========================================================================== */ 669 ========================================================================== */
474 670
@@ -583,7 +779,7 @@ footer a {
583 } 779 }
584 780
585.warning { 781.warning {
586 font-size: 3em; 782 /* font-size: 3em;
587 color: #999; 783 color: #999;
588 font-style: italic; 784 font-style: italic;
589 position: absolute; 785 position: absolute;
@@ -592,7 +788,10 @@ footer a {
592 width: 100%; 788 width: 100%;
593 text-align: center; 789 text-align: center;
594 padding-right: 5%; 790 padding-right: 5%;
595 margin-top: -2em; 791 margin-top: -2em;*/
792 font-weight: bold;
793 display: block;
794 width: 100%;
596} 795}
597 796
598/* ========================================================================== 797/* ==========================================================================
@@ -602,6 +801,7 @@ footer a {
602#article { 801#article {
603 width: 70%; 802 width: 70%;
604 margin-bottom: 3em; 803 margin-bottom: 3em;
804 text-align: justify;
605} 805}
606 806
607#article .tags { 807#article .tags {
@@ -731,6 +931,9 @@ blockquote {
731 width: 100%; 931 width: 100%;
732 margin-left: 0; 932 margin-left: 0;
733 } 933 }
934 #display-mode {
935 display: none;
936 }
734} 937}
735 938
736@media screen and (max-width: 500px) { 939@media screen and (max-width: 500px) {
@@ -820,4 +1023,12 @@ blockquote {
820 #article_toolbar a { 1023 #article_toolbar a {
821 padding: 0.3em 0.4em 0.2em; 1024 padding: 0.3em 0.4em 0.2em;
822 } 1025 }
1026
1027 #display-mode {
1028 display: none;
1029 }
1030
1031 #bagit-form {
1032 left: 0;
1033 }
823} 1034}
diff --git a/themes/baggy/edit-tags.twig b/themes/baggy/edit-tags.twig
index 9e9012ee..2113e964 100644..100755
--- a/themes/baggy/edit-tags.twig
+++ b/themes/baggy/edit-tags.twig
@@ -4,6 +4,11 @@
4{% include '_menu.twig' %} 4{% include '_menu.twig' %}
5{% endblock %} 5{% endblock %}
6{% block content %} 6{% block content %}
7
8<script src="{{ poche_url }}themes/default/js/jquery-ui-1.10.4.custom.min.js"></script>
9<script src="{{ poche_url }}themes/default/js/autoCompleteTags.js"></script>
10<link rel="stylesheet" href="{{ poche_url }}themes/default/css/jquery-ui-1.10.4.custom.min.css" media="all">
11
7<div id="article"> 12<div id="article">
8 <h2>{{ entry.title|raw }}</21> 13 <h2>{{ entry.title|raw }}</21>
9</div> 14</div>
@@ -17,7 +22,8 @@
17 <input type="hidden" name="entry_id" value="{{ entry_id }}" /> 22 <input type="hidden" name="entry_id" value="{{ entry_id }}" />
18 <label for="value">Add tags: </label><input type="text" placeholder="interview, editorial, video" id="value" name="value" required="required" /> 23 <label for="value">Add tags: </label><input type="text" placeholder="interview, editorial, video" id="value" name="value" required="required" />
19 <input type="submit" value="Tag" /> 24 <input type="submit" value="Tag" />
20 <p>{% trans "You can enter multiple tags, separated by commas." %}</p> 25 <p>{% trans "Start typing for auto complete." %}<br>
26 {% trans "You can enter multiple tags, separated by commas." %}</p>
21</form> 27</form>
22<a class="icon icon-reply return" href="./?view=view&id={{ entry_id }}">{% trans "return to article" %}</a> 28<a class="icon icon-reply return" href="./?view=view&id={{ entry_id }}">{% trans "return to article" %}</a>
23{% endblock %} 29{% endblock %}
diff --git a/themes/baggy/home.twig b/themes/baggy/home.twig
index 4f9db063..5dd91307 100644..100755
--- a/themes/baggy/home.twig
+++ b/themes/baggy/home.twig
@@ -18,17 +18,27 @@
18 {% if entries is empty %} 18 {% if entries is empty %}
19 <div class="messages warning"><p>{% trans "No articles found." %}</p></div> 19 <div class="messages warning"><p>{% trans "No articles found." %}</p></div>
20 {% else %} 20 {% else %}
21 <div>
22 {% include '_display-mode.twig' %}
23 {% include '_sorting.twig' %}
24 </div>
21 {% block pager %} 25 {% block pager %}
22 {% if nb_results > 1 %} 26 {% if nb_results > 1 %}
23 <div class="results"> 27 <div class="results">
24 <div class="nb-results">{{ nb_results }} {% trans "results" %}</div> 28 <div class="nb-results">{{ nb_results }} {% trans "results" %}{% if search_term is defined %}{% trans " found for « " %} {{ search_term }} »{% endif %}</div>
25 {{ page_links | raw }} 29 {{ page_links | raw }}
26 </div> 30 </div>
31 {% elseif nb_results == 1 %}
32 {% if search_term is defined %}
33 <div class="results">
34 <div class="nb-results">{% trans "Only one result found for " %} « {{ search_term }} »</div>
35 </div>
36 {% endif %}
27 {% endif %} 37 {% endif %}
28 {% endblock %} 38 {% endblock %}
29 <div class="list-entries"> 39 <div id="list-entries" class="list-entries">
30 {% for entry in entries %} 40 {% for entry in entries %}
31 <div id="entry-{{ entry.id|e }}" class="entrie"> 41 <div id="entry-{{ entry.id|e }}" class="entrie"{% if listmode %} style="width:100%; margin-left:0;"{% endif %}>
32 <h2><a href="index.php?view=view&amp;id={{ entry.id|e }}">{{ entry.title|raw }}</a></h2> 42 <h2><a href="index.php?view=view&amp;id={{ entry.id|e }}">{{ entry.title|raw }}</a></h2>
33 {% if entry.content| getReadingTime > 0 %} 43 {% if entry.content| getReadingTime > 0 %}
34 <div class="estimatedTime"><a target="_blank" title="{% trans "estimated reading time:" %} {{ entry.content| getReadingTime }} min" class="tool reading-time"><span>{% trans "estimated reading time :" %} {{ entry.content| getReadingTime }} min</span></div> 44 <div class="estimatedTime"><a target="_blank" title="{% trans "estimated reading time:" %} {{ entry.content| getReadingTime }} min" class="tool reading-time"><span>{% trans "estimated reading time :" %} {{ entry.content| getReadingTime }} min</span></div>
diff --git a/themes/baggy/img/baggy/blank.png b/themes/baggy/img/baggy/blank.png
new file mode 100755
index 00000000..63e09844
--- /dev/null
+++ b/themes/baggy/img/baggy/blank.png
Binary files differ
diff --git a/themes/baggy/img/baggy/down.png b/themes/baggy/img/baggy/down.png
new file mode 100644
index 00000000..b9d536a7
--- /dev/null
+++ b/themes/baggy/img/baggy/down.png
Binary files differ
diff --git a/themes/baggy/img/baggy/list.png b/themes/baggy/img/baggy/list.png
new file mode 100755
index 00000000..bd5aff5a
--- /dev/null
+++ b/themes/baggy/img/baggy/list.png
Binary files differ
diff --git a/themes/baggy/img/baggy/table.png b/themes/baggy/img/baggy/table.png
new file mode 100755
index 00000000..859c4cd8
--- /dev/null
+++ b/themes/baggy/img/baggy/table.png
Binary files differ
diff --git a/themes/baggy/img/baggy/top.png b/themes/baggy/img/baggy/top.png
new file mode 100644
index 00000000..954a8c0a
--- /dev/null
+++ b/themes/baggy/img/baggy/top.png
Binary files differ
diff --git a/themes/baggy/img/logo-other_themes.png b/themes/baggy/img/logo-other_themes.png
new file mode 100755
index 00000000..32543a44
--- /dev/null
+++ b/themes/baggy/img/logo-other_themes.png
Binary files differ
diff --git a/themes/baggy/js/autoClose.js b/themes/baggy/js/autoClose.js
deleted file mode 100644
index e9145b7e..00000000
--- a/themes/baggy/js/autoClose.js
+++ /dev/null
@@ -1,6 +0,0 @@
1$(document).ready(function() {
2 current_url = window.location.href
3 if (current_url.match("&closewin=true")) {
4 window.close();
5 }
6});
diff --git a/themes/baggy/js/init.js b/themes/baggy/js/init.js
index c1d3c0ec..00470fbf 100755
--- a/themes/baggy/js/init.js
+++ b/themes/baggy/js/init.js
@@ -1,12 +1,48 @@
1document.addEventListener('DOMContentLoaded', function() { 1$.fn.ready(function() {
2 var menu = document.getElementById('menu'); 2
3 3 var $listmode = $('#listmode'),
4 menu.addEventListener('click', function(){ 4 $listentries = $("#list-entries");
5 if(this.nextElementSibling.style.display === "block") { 5
6 this.nextElementSibling.style.display = "none"; 6 /* ==========================================================================
7 }else { 7 Menu
8 this.nextElementSibling.style.display = "block"; 8 ========================================================================== */
9
10 $("#menu").click(function(){
11 $("#links").toggle();
12 });
13
14 /* ==========================================================================
15 List mode or Table Mode
16 ========================================================================== */
17
18 $listmode.click(function(){
19 if ( $.cookie("listmode") == 1 ) {
20 // Cookie
21 $.removeCookie("listmode");
22
23 $listentries.removeClass("listmode");
24 $listmode.removeClass("tablemode");
25 $listmode.addClass("listmode");
9 } 26 }
10 27 else {
28 // Cookie
29 $.cookie("listmode", 1, {expires: 365});
30
31 $listentries.addClass("listmode");
32 $listmode.removeClass("listmode");
33 $listmode.addClass("tablemode");
34 }
35
11 }); 36 });
12}); \ No newline at end of file 37
38 /* ==========================================================================
39 Cookie listmode
40 ========================================================================== */
41
42 if ( $.cookie("listmode") == 1 ) {
43 $listentries.addClass("listmode");
44 $listmode.removeClass("listmode");
45 $listmode.addClass("tablemode");
46 }
47
48});
diff --git a/themes/baggy/js/jquery-2.0.3.min.js b/themes/baggy/js/jquery-2.0.3.min.js
deleted file mode 100644
index a4dd0a2f..00000000
--- a/themes/baggy/js/jquery-2.0.3.min.js
+++ /dev/null
@@ -1 +0,0 @@
1(function(e,undefined){var t,n,r=typeof undefined,i=e.location,o=e.document,s=o.documentElement,a=e.jQuery,u=e.$,l={},c=[],p="2.0.3",f=c.concat,h=c.push,d=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=p.trim,x=function(e,n){return new x.fn.init(e,n,t)},b=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,w=/\S+/g,T=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,k=/^-ms-/,N=/-([\da-z])/gi,E=function(e,t){return t.toUpperCase()},S=function(){o.removeEventListener("DOMContentLoaded",S,!1),e.removeEventListener("load",S,!1),x.ready()};x.fn=x.prototype={jquery:p,constructor:x,init:function(e,t,n){var r,i;if(!e)return this;if("string"==typeof e){if(r="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:T.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof x?t[0]:t,x.merge(this,x.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:o,!0)),C.test(r[1])&&x.isPlainObject(t))for(r in t)x.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return i=o.getElementById(r[2]),i&&i.parentNode&&(this.length=1,this[0]=i),this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?n.ready(e):(e.selector!==undefined&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return d.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,t,n,r,i,o,s=arguments[0]||{},a=1,u=arguments.length,l=!1;for("boolean"==typeof s&&(l=s,s=arguments[1]||{},a=2),"object"==typeof s||x.isFunction(s)||(s={}),u===a&&(s=this,--a);u>a;a++)if(null!=(e=arguments[a]))for(t in e)n=s[t],r=e[t],s!==r&&(l&&r&&(x.isPlainObject(r)||(i=x.isArray(r)))?(i?(i=!1,o=n&&x.isArray(n)?n:[]):o=n&&x.isPlainObject(n)?n:{},s[t]=x.extend(l,o,r)):r!==undefined&&(s[t]=r));return s},x.extend({expando:"jQuery"+(p+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=a),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){(e===!0?--x.readyWait:x.isReady)||(x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(o,[x]),x.fn.trigger&&x(o).trigger("ready").off("ready")))},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray,isWindow:function(e){return null!=e&&e===e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[m.call(e)]||"object":typeof e},isPlainObject:function(e){if("object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!y.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(t){return!1}return!0},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||o;var r=C.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:JSON.parse,parseXML:function(e){var t,n;if(!e||"string"!=typeof e)return null;try{n=new DOMParser,t=n.parseFromString(e,"text/xml")}catch(r){t=undefined}return(!t||t.getElementsByTagName("parsererror").length)&&x.error("Invalid XML: "+e),t},noop:function(){},globalEval:function(e){var t,n=eval;e=x.trim(e),e&&(1===e.indexOf("use strict")?(t=o.createElement("script"),t.text=e,o.head.appendChild(t).parentNode.removeChild(t)):n(e))},camelCase:function(e){return e.replace(k,"ms-").replace(N,E)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,s=j(e);if(n){if(s){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(s){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:function(e){return null==e?"":v.call(e)},makeArray:function(e,t){var n=t||[];return null!=e&&(j(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:g.call(t,e,n)},merge:function(e,t){var n=t.length,r=e.length,i=0;if("number"==typeof n)for(;n>i;i++)e[r++]=t[i];else while(t[i]!==undefined)e[r++]=t[i++];return e.length=r,e},grep:function(e,t,n){var r,i=[],o=0,s=e.length;for(n=!!n;s>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,s=j(e),a=[];if(s)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(a[a.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(a[a.length]=r);return f.apply([],a)},guid:1,proxy:function(e,t){var n,r,i;return"string"==typeof t&&(n=e[t],t=e,e=n),x.isFunction(e)?(r=d.call(arguments,2),i=function(){return e.apply(t||this,r.concat(d.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):undefined},access:function(e,t,n,r,i,o,s){var a=0,u=e.length,l=null==n;if("object"===x.type(n)){i=!0;for(a in n)x.access(e,t,a,n[a],!0,o,s)}else if(r!==undefined&&(i=!0,x.isFunction(r)||(s=!0),l&&(s?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(x(e),n)})),t))for(;u>a;a++)t(e[a],n,s?r:r.call(e[a],a,t(e[a],n)));return i?e:l?t.call(e):u?t(e[0],n):o},now:Date.now,swap:function(e,t,n,r){var i,o,s={};for(o in t)s[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=s[o];return i}}),x.ready.promise=function(t){return n||(n=x.Deferred(),"complete"===o.readyState?setTimeout(x.ready):(o.addEventListener("DOMContentLoaded",S,!1),e.addEventListener("load",S,!1))),n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function j(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}t=x(o),function(e,undefined){var t,n,r,i,o,s,a,u,l,c,p,f,h,d,g,m,y,v="sizzle"+-new Date,b=e.document,w=0,T=0,C=st(),k=st(),N=st(),E=!1,S=function(e,t){return e===t?(E=!0,0):0},j=typeof undefined,D=1<<31,A={}.hasOwnProperty,L=[],q=L.pop,H=L.push,O=L.push,F=L.slice,P=L.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",W="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",$=W.replace("w","w#"),B="\\["+M+"*("+W+")"+M+"*(?:([*^$|!~]?=)"+M+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+$+")|)|)"+M+"*\\]",I=":("+W+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+B.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=RegExp("^"+M+"*,"+M+"*"),X=RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=RegExp(M+"*[+~]"),Y=RegExp("="+M+"*([^\\]'\"]*)"+M+"*\\]","g"),V=RegExp(I),G=RegExp("^"+$+"$"),J={ID:RegExp("^#("+W+")"),CLASS:RegExp("^\\.("+W+")"),TAG:RegExp("^("+W.replace("w","w*")+")"),ATTR:RegExp("^"+B),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:RegExp("^(?:"+R+")$","i"),needsContext:RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Q=/^[^{]+\{\s*\[native \w/,K=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,Z=/^(?:input|select|textarea|button)$/i,et=/^h\d$/i,tt=/'|\\/g,nt=RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),rt=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{O.apply(L=F.call(b.childNodes),b.childNodes),L[b.childNodes.length].nodeType}catch(it){O={apply:L.length?function(e,t){H.apply(e,F.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function ot(e,t,r,i){var o,s,a,u,l,f,g,m,x,w;if((t?t.ownerDocument||t:b)!==p&&c(t),t=t||p,r=r||[],!e||"string"!=typeof e)return r;if(1!==(u=t.nodeType)&&9!==u)return[];if(h&&!i){if(o=K.exec(e))if(a=o[1]){if(9===u){if(s=t.getElementById(a),!s||!s.parentNode)return r;if(s.id===a)return r.push(s),r}else if(t.ownerDocument&&(s=t.ownerDocument.getElementById(a))&&y(t,s)&&s.id===a)return r.push(s),r}else{if(o[2])return O.apply(r,t.getElementsByTagName(e)),r;if((a=o[3])&&n.getElementsByClassName&&t.getElementsByClassName)return O.apply(r,t.getElementsByClassName(a)),r}if(n.qsa&&(!d||!d.test(e))){if(m=g=v,x=t,w=9===u&&e,1===u&&"object"!==t.nodeName.toLowerCase()){f=gt(e),(g=t.getAttribute("id"))?m=g.replace(tt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",l=f.length;while(l--)f[l]=m+mt(f[l]);x=U.test(e)&&t.parentNode||t,w=f.join(",")}if(w)try{return O.apply(r,x.querySelectorAll(w)),r}catch(T){}finally{g||t.removeAttribute("id")}}}return kt(e.replace(z,"$1"),t,r,i)}function st(){var e=[];function t(n,r){return e.push(n+=" ")>i.cacheLength&&delete t[e.shift()],t[n]=r}return t}function at(e){return e[v]=!0,e}function ut(e){var t=p.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function lt(e,t){var n=e.split("|"),r=e.length;while(r--)i.attrHandle[n[r]]=t}function ct(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function pt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function ft(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ht(e){return at(function(t){return t=+t,at(function(n,r){var i,o=e([],n.length,t),s=o.length;while(s--)n[i=o[s]]&&(n[i]=!(r[i]=n[i]))})})}s=ot.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},n=ot.support={},c=ot.setDocument=function(e){var t=e?e.ownerDocument||e:b,r=t.defaultView;return t!==p&&9===t.nodeType&&t.documentElement?(p=t,f=t.documentElement,h=!s(t),r&&r.attachEvent&&r!==r.top&&r.attachEvent("onbeforeunload",function(){c()}),n.attributes=ut(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=ut(function(e){return e.appendChild(t.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=ut(function(e){return e.innerHTML="<div class='a'></div><div class='a i'></div>",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),n.getById=ut(function(e){return f.appendChild(e).id=v,!t.getElementsByName||!t.getElementsByName(v).length}),n.getById?(i.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},i.filter.ID=function(e){var t=e.replace(nt,rt);return function(e){return e.getAttribute("id")===t}}):(delete i.find.ID,i.filter.ID=function(e){var t=e.replace(nt,rt);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),i.find.TAG=n.getElementsByTagName?function(e,t){return typeof t.getElementsByTagName!==j?t.getElementsByTagName(e):undefined}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},i.find.CLASS=n.getElementsByClassName&&function(e,t){return typeof t.getElementsByClassName!==j&&h?t.getElementsByClassName(e):undefined},g=[],d=[],(n.qsa=Q.test(t.querySelectorAll))&&(ut(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||d.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll(":checked").length||d.push(":checked")}),ut(function(e){var n=t.createElement("input");n.setAttribute("type","hidden"),e.appendChild(n).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&d.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||d.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),d.push(",.*:")})),(n.matchesSelector=Q.test(m=f.webkitMatchesSelector||f.mozMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&ut(function(e){n.disconnectedMatch=m.call(e,"div"),m.call(e,"[s!='']:x"),g.push("!=",I)}),d=d.length&&RegExp(d.join("|")),g=g.length&&RegExp(g.join("|")),y=Q.test(f.contains)||f.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},S=f.compareDocumentPosition?function(e,r){if(e===r)return E=!0,0;var i=r.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(r);return i?1&i||!n.sortDetached&&r.compareDocumentPosition(e)===i?e===t||y(b,e)?-1:r===t||y(b,r)?1:l?P.call(l,e)-P.call(l,r):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,n){var r,i=0,o=e.parentNode,s=n.parentNode,a=[e],u=[n];if(e===n)return E=!0,0;if(!o||!s)return e===t?-1:n===t?1:o?-1:s?1:l?P.call(l,e)-P.call(l,n):0;if(o===s)return ct(e,n);r=e;while(r=r.parentNode)a.unshift(r);r=n;while(r=r.parentNode)u.unshift(r);while(a[i]===u[i])i++;return i?ct(a[i],u[i]):a[i]===b?-1:u[i]===b?1:0},t):p},ot.matches=function(e,t){return ot(e,null,null,t)},ot.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&c(e),t=t.replace(Y,"='$1']"),!(!n.matchesSelector||!h||g&&g.test(t)||d&&d.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(i){}return ot(t,p,null,[e]).length>0},ot.contains=function(e,t){return(e.ownerDocument||e)!==p&&c(e),y(e,t)},ot.attr=function(e,t){(e.ownerDocument||e)!==p&&c(e);var r=i.attrHandle[t.toLowerCase()],o=r&&A.call(i.attrHandle,t.toLowerCase())?r(e,t,!h):undefined;return o===undefined?n.attributes||!h?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null:o},ot.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},ot.uniqueSort=function(e){var t,r=[],i=0,o=0;if(E=!n.detectDuplicates,l=!n.sortStable&&e.slice(0),e.sort(S),E){while(t=e[o++])t===e[o]&&(i=r.push(o));while(i--)e.splice(r[i],1)}return e},o=ot.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=o(t);return n},i=ot.selectors={cacheLength:50,createPseudo:at,match:J,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(nt,rt),e[3]=(e[4]||e[5]||"").replace(nt,rt),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||ot.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&ot.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return J.CHILD.test(e[0])?null:(e[3]&&e[4]!==undefined?e[2]=e[4]:n&&V.test(n)&&(t=gt(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(nt,rt).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=C[e+" "];return t||(t=RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&C(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=ot.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),s="last"!==e.slice(-4),a="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,p,f,h,d,g=o!==s?"nextSibling":"previousSibling",m=t.parentNode,y=a&&t.nodeName.toLowerCase(),x=!u&&!a;if(m){if(o){while(g){p=t;while(p=p[g])if(a?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;d=g="only"===e&&!d&&"nextSibling"}return!0}if(d=[s?m.firstChild:m.lastChild],s&&x){c=m[v]||(m[v]={}),l=c[e]||[],h=l[0]===w&&l[1],f=l[0]===w&&l[2],p=h&&m.childNodes[h];while(p=++h&&p&&p[g]||(f=h=0)||d.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[w,h,f];break}}else if(x&&(l=(t[v]||(t[v]={}))[e])&&l[0]===w)f=l[1];else while(p=++h&&p&&p[g]||(f=h=0)||d.pop())if((a?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(x&&((p[v]||(p[v]={}))[e]=[w,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||ot.error("unsupported pseudo: "+e);return r[v]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?at(function(e,n){var i,o=r(e,t),s=o.length;while(s--)i=P.call(e,o[s]),e[i]=!(n[i]=o[s])}):function(e){return r(e,0,n)}):r}},pseudos:{not:at(function(e){var t=[],n=[],r=a(e.replace(z,"$1"));return r[v]?at(function(e,t,n,i){var o,s=r(e,null,i,[]),a=e.length;while(a--)(o=s[a])&&(e[a]=!(t[a]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:at(function(e){return function(t){return ot(e,t).length>0}}),contains:at(function(e){return function(t){return(t.textContent||t.innerText||o(t)).indexOf(e)>-1}}),lang:at(function(e){return G.test(e||"")||ot.error("unsupported lang: "+e),e=e.replace(nt,rt).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===f},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!i.pseudos.empty(e)},header:function(e){return et.test(e.nodeName)},input:function(e){return Z.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:ht(function(){return[0]}),last:ht(function(e,t){return[t-1]}),eq:ht(function(e,t,n){return[0>n?n+t:n]}),even:ht(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:ht(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:ht(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:ht(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}},i.pseudos.nth=i.pseudos.eq;for(t in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})i.pseudos[t]=pt(t);for(t in{submit:!0,reset:!0})i.pseudos[t]=ft(t);function dt(){}dt.prototype=i.filters=i.pseudos,i.setFilters=new dt;function gt(e,t){var n,r,o,s,a,u,l,c=k[e+" "];if(c)return t?0:c.slice(0);a=e,u=[],l=i.preFilter;while(a){(!n||(r=_.exec(a)))&&(r&&(a=a.slice(r[0].length)||a),u.push(o=[])),n=!1,(r=X.exec(a))&&(n=r.shift(),o.push({value:n,type:r[0].replace(z," ")}),a=a.slice(n.length));for(s in i.filter)!(r=J[s].exec(a))||l[s]&&!(r=l[s](r))||(n=r.shift(),o.push({value:n,type:s,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?ot.error(e):k(e,u).slice(0)}function mt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function yt(e,t,n){var i=t.dir,o=n&&"parentNode"===i,s=T++;return t.first?function(t,n,r){while(t=t[i])if(1===t.nodeType||o)return e(t,n,r)}:function(t,n,a){var u,l,c,p=w+" "+s;if(a){while(t=t[i])if((1===t.nodeType||o)&&e(t,n,a))return!0}else while(t=t[i])if(1===t.nodeType||o)if(c=t[v]||(t[v]={}),(l=c[i])&&l[0]===p){if((u=l[1])===!0||u===r)return u===!0}else if(l=c[i]=[p],l[1]=e(t,n,a)||r,l[1]===!0)return!0}}function vt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xt(e,t,n,r,i){var o,s=[],a=0,u=e.length,l=null!=t;for(;u>a;a++)(o=e[a])&&(!n||n(o,r,i))&&(s.push(o),l&&t.push(a));return s}function bt(e,t,n,r,i,o){return r&&!r[v]&&(r=bt(r)),i&&!i[v]&&(i=bt(i,o)),at(function(o,s,a,u){var l,c,p,f=[],h=[],d=s.length,g=o||Ct(t||"*",a.nodeType?[a]:a,[]),m=!e||!o&&t?g:xt(g,f,e,a,u),y=n?i||(o?e:d||r)?[]:s:m;if(n&&n(m,y,a,u),r){l=xt(y,h),r(l,[],a,u),c=l.length;while(c--)(p=l[c])&&(y[h[c]]=!(m[h[c]]=p))}if(o){if(i||e){if(i){l=[],c=y.length;while(c--)(p=y[c])&&l.push(m[c]=p);i(null,y=[],l,u)}c=y.length;while(c--)(p=y[c])&&(l=i?P.call(o,p):f[c])>-1&&(o[l]=!(s[l]=p))}}else y=xt(y===s?y.splice(d,y.length):y),i?i(null,s,y,u):O.apply(s,y)})}function wt(e){var t,n,r,o=e.length,s=i.relative[e[0].type],a=s||i.relative[" "],l=s?1:0,c=yt(function(e){return e===t},a,!0),p=yt(function(e){return P.call(t,e)>-1},a,!0),f=[function(e,n,r){return!s&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;o>l;l++)if(n=i.relative[e[l].type])f=[yt(vt(f),n)];else{if(n=i.filter[e[l].type].apply(null,e[l].matches),n[v]){for(r=++l;o>r;r++)if(i.relative[e[r].type])break;return bt(l>1&&vt(f),l>1&&mt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&wt(e.slice(l,r)),o>r&&wt(e=e.slice(r)),o>r&&mt(e))}f.push(n)}return vt(f)}function Tt(e,t){var n=0,o=t.length>0,s=e.length>0,a=function(a,l,c,f,h){var d,g,m,y=[],v=0,x="0",b=a&&[],T=null!=h,C=u,k=a||s&&i.find.TAG("*",h&&l.parentNode||l),N=w+=null==C?1:Math.random()||.1;for(T&&(u=l!==p&&l,r=n);null!=(d=k[x]);x++){if(s&&d){g=0;while(m=e[g++])if(m(d,l,c)){f.push(d);break}T&&(w=N,r=++n)}o&&((d=!m&&d)&&v--,a&&b.push(d))}if(v+=x,o&&x!==v){g=0;while(m=t[g++])m(b,y,l,c);if(a){if(v>0)while(x--)b[x]||y[x]||(y[x]=q.call(f));y=xt(y)}O.apply(f,y),T&&!a&&y.length>0&&v+t.length>1&&ot.uniqueSort(f)}return T&&(w=N,u=C),b};return o?at(a):a}a=ot.compile=function(e,t){var n,r=[],i=[],o=N[e+" "];if(!o){t||(t=gt(e)),n=t.length;while(n--)o=wt(t[n]),o[v]?r.push(o):i.push(o);o=N(e,Tt(i,r))}return o};function Ct(e,t,n){var r=0,i=t.length;for(;i>r;r++)ot(e,t[r],n);return n}function kt(e,t,r,o){var s,u,l,c,p,f=gt(e);if(!o&&1===f.length){if(u=f[0]=f[0].slice(0),u.length>2&&"ID"===(l=u[0]).type&&n.getById&&9===t.nodeType&&h&&i.relative[u[1].type]){if(t=(i.find.ID(l.matches[0].replace(nt,rt),t)||[])[0],!t)return r;e=e.slice(u.shift().value.length)}s=J.needsContext.test(e)?0:u.length;while(s--){if(l=u[s],i.relative[c=l.type])break;if((p=i.find[c])&&(o=p(l.matches[0].replace(nt,rt),U.test(u[0].type)&&t.parentNode||t))){if(u.splice(s,1),e=o.length&&mt(u),!e)return O.apply(r,o),r;break}}}return a(e,f)(o,t,!h,r,U.test(e)),r}n.sortStable=v.split("").sort(S).join("")===v,n.detectDuplicates=E,c(),n.sortDetached=ut(function(e){return 1&e.compareDocumentPosition(p.createElement("div"))}),ut(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||lt("type|href|height|width",function(e,t,n){return n?undefined:e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),n.attributes&&ut(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||lt("value",function(e,t,n){return n||"input"!==e.nodeName.toLowerCase()?undefined:e.defaultValue}),ut(function(e){return null==e.getAttribute("disabled")})||lt(R,function(e,t,n){var r;return n?undefined:(r=e.getAttributeNode(t))&&r.specified?r.value:e[t]===!0?t.toLowerCase():null}),x.find=ot,x.expr=ot.selectors,x.expr[":"]=x.expr.pseudos,x.unique=ot.uniqueSort,x.text=ot.getText,x.isXMLDoc=ot.isXML,x.contains=ot.contains}(e);var D={};function A(e){var t=D[e]={};return x.each(e.match(w)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?D[e]||A(e):x.extend({},e);var t,n,r,i,o,s,a=[],u=!e.once&&[],l=function(p){for(t=e.memory&&p,n=!0,s=i||0,i=0,o=a.length,r=!0;a&&o>s;s++)if(a[s].apply(p[0],p[1])===!1&&e.stopOnFalse){t=!1;break}r=!1,a&&(u?u.length&&l(u.shift()):t?a=[]:c.disable())},c={add:function(){if(a){var n=a.length;(function s(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&c.has(n)||a.push(n):n&&n.length&&"string"!==r&&s(n)})})(arguments),r?o=a.length:t&&(i=n,l(t))}return this},remove:function(){return a&&x.each(arguments,function(e,t){var n;while((n=x.inArray(t,a,n))>-1)a.splice(n,1),r&&(o>=n&&o--,s>=n&&s--)}),this},has:function(e){return e?x.inArray(e,a)>-1:!(!a||!a.length)},empty:function(){return a=[],o=0,this},disable:function(){return a=u=t=undefined,this},disabled:function(){return!a},lock:function(){return u=undefined,t||c.disable(),this},locked:function(){return!u},fireWith:function(e,t){return!a||n&&!u||(t=t||[],t=[e,t.slice?t.slice():t],r?u.push(t):l(t)),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!n}};return c},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var s=o[0],a=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=a&&a.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[s+"With"](this===r?n.promise():this,a?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var s=o[2],a=o[3];r[o[1]]=s.add,a&&s.add(function(){n=a},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=s.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=d.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),s=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?d.call(arguments):r,n===a?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},a,u,l;if(r>1)for(a=Array(r),u=Array(r),l=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(s(t,l,n)).fail(o.reject).progress(s(t,u,a)):--i;return i||o.resolveWith(l,n),o.promise()}}),x.support=function(t){var n=o.createElement("input"),r=o.createDocumentFragment(),i=o.createElement("div"),s=o.createElement("select"),a=s.appendChild(o.createElement("option"));return n.type?(n.type="checkbox",t.checkOn=""!==n.value,t.optSelected=a.selected,t.reliableMarginRight=!0,t.boxSizingReliable=!0,t.pixelPosition=!1,n.checked=!0,t.noCloneChecked=n.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!a.disabled,n=o.createElement("input"),n.value="t",n.type="radio",t.radioValue="t"===n.value,n.setAttribute("checked","t"),n.setAttribute("name","t"),r.appendChild(n),t.checkClone=r.cloneNode(!0).cloneNode(!0).lastChild.checked,t.focusinBubbles="onfocusin"in e,i.style.backgroundClip="content-box",i.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===i.style.backgroundClip,x(function(){var n,r,s="padding:0;margin:0;border:0;display:block;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box",a=o.getElementsByTagName("body")[0];a&&(n=o.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",a.appendChild(n).appendChild(i),i.innerHTML="",i.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%",x.swap(a,null!=a.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===i.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(i,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(i,null)||{width:"4px"}).width,r=i.appendChild(o.createElement("div")),r.style.cssText=i.style.cssText=s,r.style.marginRight=r.style.width="0",i.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),a.removeChild(n))}),t):t}({});var L,q,H=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,O=/([A-Z])/g;function F(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=x.expando+Math.random()}F.uid=1,F.accepts=function(e){return e.nodeType?1===e.nodeType||9===e.nodeType:!0},F.prototype={key:function(e){if(!F.accepts(e))return 0;var t={},n=e[this.expando];if(!n){n=F.uid++;try{t[this.expando]={value:n},Object.defineProperties(e,t)}catch(r){t[this.expando]=n,x.extend(e,t)}}return this.cache[n]||(this.cache[n]={}),n},set:function(e,t,n){var r,i=this.key(e),o=this.cache[i];if("string"==typeof t)o[t]=n;else if(x.isEmptyObject(o))x.extend(this.cache[i],t);else for(r in t)o[r]=t[r];return o},get:function(e,t){var n=this.cache[this.key(e)];return t===undefined?n:n[t]},access:function(e,t,n){var r;return t===undefined||t&&"string"==typeof t&&n===undefined?(r=this.get(e,t),r!==undefined?r:this.get(e,x.camelCase(t))):(this.set(e,t,n),n!==undefined?n:t)},remove:function(e,t){var n,r,i,o=this.key(e),s=this.cache[o];if(t===undefined)this.cache[o]={};else{x.isArray(t)?r=t.concat(t.map(x.camelCase)):(i=x.camelCase(t),t in s?r=[t,i]:(r=i,r=r in s?[r]:r.match(w)||[])),n=r.length;while(n--)delete s[r[n]]}},hasData:function(e){return!x.isEmptyObject(this.cache[e[this.expando]]||{})},discard:function(e){e[this.expando]&&delete this.cache[e[this.expando]]}},L=new F,q=new F,x.extend({acceptData:F.accepts,hasData:function(e){return L.hasData(e)||q.hasData(e)},data:function(e,t,n){return L.access(e,t,n)},removeData:function(e,t){L.remove(e,t)},_data:function(e,t,n){return q.access(e,t,n)},_removeData:function(e,t){q.remove(e,t)}}),x.fn.extend({data:function(e,t){var n,r,i=this[0],o=0,s=null;if(e===undefined){if(this.length&&(s=L.get(i),1===i.nodeType&&!q.get(i,"hasDataAttrs"))){for(n=i.attributes;n.length>o;o++)r=n[o].name,0===r.indexOf("data-")&&(r=x.camelCase(r.slice(5)),P(i,r,s[r]));q.set(i,"hasDataAttrs",!0)}return s}return"object"==typeof e?this.each(function(){L.set(this,e)}):x.access(this,function(t){var n,r=x.camelCase(e);if(i&&t===undefined){if(n=L.get(i,e),n!==undefined)return n;if(n=L.get(i,r),n!==undefined)return n;if(n=P(i,r,undefined),n!==undefined)return n}else this.each(function(){var n=L.get(this,r);L.set(this,r,t),-1!==e.indexOf("-")&&n!==undefined&&L.set(this,e,t)})},null,t,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){L.remove(this,e)})}});function P(e,t,n){var r;if(n===undefined&&1===e.nodeType)if(r="data-"+t.replace(O,"-$1").toLowerCase(),n=e.getAttribute(r),"string"==typeof n){try{n="true"===n?!0:"false"===n?!1:"null"===n?null:+n+""===n?+n:H.test(n)?JSON.parse(n):n}catch(i){}L.set(e,t,n)}else n=undefined;return n}x.extend({queue:function(e,t,n){var r;return e?(t=(t||"fx")+"queue",r=q.get(e,t),n&&(!r||x.isArray(n)?r=q.access(e,t,x.makeArray(n)):r.push(n)),r||[]):undefined},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),s=function(){x.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,s,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return q.get(e,n)||q.access(e,n,{empty:x.Callbacks("once memory").add(function(){q.remove(e,[t+"queue",n])})})}}),x.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),n>arguments.length?x.queue(this[0],e):t===undefined?this:this.each(function(){var n=x.queue(this,e,t);x._queueHooks(this,e),"fx"===e&&"inprogress"!==n[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=x.Deferred(),o=this,s=this.length,a=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=undefined),e=e||"fx";while(s--)n=q.get(o[s],e+"queueHooks"),n&&n.empty&&(r++,n.empty.add(a));return a(),i.promise(t)}});var R,M,W=/[\t\r\n\f]/g,$=/\r/g,B=/^(?:input|select|textarea|button)$/i;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[x.propFix[e]||e]})},addClass:function(e){var t,n,r,i,o,s=0,a=this.length,u="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];a>s;s++)if(n=this[s],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(W," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,s=0,a=this.length,u=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];a>s;s++)if(n=this[s],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(W," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var t,i=0,o=x(this),s=e.match(w)||[];while(t=s[i++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else(n===r||"boolean"===n)&&(this.className&&q.set(this,"__className__",this.className),this.className=this.className||e===!1?"":q.get(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(W," ").indexOf(t)>=0)return!0;return!1},val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=x.isFunction(e),this.each(function(n){var i;1===this.nodeType&&(i=r?e.call(this,n,x(this).val()):e,null==i?i="":"number"==typeof i?i+="":x.isArray(i)&&(i=x.map(i,function(e){return null==e?"":e+""})),t=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],t&&"set"in t&&t.set(this,i,"value")!==undefined||(this.value=i))});if(i)return t=x.valHooks[i.type]||x.valHooks[i.nodeName.toLowerCase()],t&&"get"in t&&(n=t.get(i,"value"))!==undefined?n:(n=i.value,"string"==typeof n?n.replace($,""):null==n?"":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,s=o?null:[],a=o?i+1:r.length,u=0>i?a:o?i:0;for(;a>u;u++)if(n=r[u],!(!n.selected&&u!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),s=i.length;while(s--)r=i[s],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,t,n){var i,o,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===r?x.prop(e,t,n):(1===s&&x.isXMLDoc(e)||(t=t.toLowerCase(),i=x.attrHooks[t]||(x.expr.match.bool.test(t)?M:R)),n===undefined?i&&"get"in i&&null!==(o=i.get(e,t))?o:(o=x.find.attr(e,t),null==o?undefined:o):null!==n?i&&"set"in i&&(o=i.set(e,n,t))!==undefined?o:(e.setAttribute(t,n+""),n):(x.removeAttr(e,t),undefined))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(w);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)&&(e[r]=!1),e.removeAttribute(n)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,t,n){var r,i,o,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return o=1!==s||!x.isXMLDoc(e),o&&(t=x.propFix[t]||t,i=x.propHooks[t]),n!==undefined?i&&"set"in i&&(r=i.set(e,n,t))!==undefined?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){return e.hasAttribute("tabindex")||B.test(e.nodeName)||e.href?e.tabIndex:-1}}}}),M={set:function(e,t,n){return t===!1?x.removeAttr(e,n):e.setAttribute(n,n),n}},x.each(x.expr.match.bool.source.match(/\w+/g),function(e,t){var n=x.expr.attrHandle[t]||x.find.attr;x.expr.attrHandle[t]=function(e,t,r){var i=x.expr.attrHandle[t],o=r?undefined:(x.expr.attrHandle[t]=undefined)!=n(e,t,r)?t.toLowerCase():null;return x.expr.attrHandle[t]=i,o}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,t){return x.isArray(t)?e.checked=x.inArray(x(e).val(),t)>=0:undefined}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var I=/^key/,z=/^(?:mouse|contextmenu)|click/,_=/^(?:focusinfocus|focusoutblur)$/,X=/^([^.]*)(?:\.(.+)|)$/;function U(){return!0}function Y(){return!1}function V(){try{return o.activeElement}catch(e){}}x.event={global:{},add:function(e,t,n,i,o){var s,a,u,l,c,p,f,h,d,g,m,y=q.get(e);if(y){n.handler&&(s=n,n=s.handler,o=s.selector),n.guid||(n.guid=x.guid++),(l=y.events)||(l=y.events={}),(a=y.handle)||(a=y.handle=function(e){return typeof x===r||e&&x.event.triggered===e.type?undefined:x.event.dispatch.apply(a.elem,arguments)},a.elem=e),t=(t||"").match(w)||[""],c=t.length;while(c--)u=X.exec(t[c])||[],d=m=u[1],g=(u[2]||"").split(".").sort(),d&&(f=x.event.special[d]||{},d=(o?f.delegateType:f.bindType)||d,f=x.event.special[d]||{},p=x.extend({type:d,origType:m,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&x.expr.match.needsContext.test(o),namespace:g.join(".")},s),(h=l[d])||(h=l[d]=[],h.delegateCount=0,f.setup&&f.setup.call(e,i,g,a)!==!1||e.addEventListener&&e.addEventListener(d,a,!1)),f.add&&(f.add.call(e,p),p.handler.guid||(p.handler.guid=n.guid)),o?h.splice(h.delegateCount++,0,p):h.push(p),x.event.global[d]=!0);e=null}},remove:function(e,t,n,r,i){var o,s,a,u,l,c,p,f,h,d,g,m=q.hasData(e)&&q.get(e);if(m&&(u=m.events)){t=(t||"").match(w)||[""],l=t.length;while(l--)if(a=X.exec(t[l])||[],h=g=a[1],d=(a[2]||"").split(".").sort(),h){p=x.event.special[h]||{},h=(r?p.delegateType:p.bindType)||h,f=u[h]||[],a=a[2]&&RegExp("(^|\\.)"+d.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=o=f.length;while(o--)c=f[o],!i&&g!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(f.splice(o,1),c.selector&&f.delegateCount--,p.remove&&p.remove.call(e,c));s&&!f.length&&(p.teardown&&p.teardown.call(e,d,m.handle)!==!1||x.removeEvent(e,h,m.handle),delete u[h])}else for(h in u)x.event.remove(e,h+t[l],n,r,!0);x.isEmptyObject(u)&&(delete m.handle,q.remove(e,"events"))}},trigger:function(t,n,r,i){var s,a,u,l,c,p,f,h=[r||o],d=y.call(t,"type")?t.type:t,g=y.call(t,"namespace")?t.namespace.split("."):[];if(a=u=r=r||o,3!==r.nodeType&&8!==r.nodeType&&!_.test(d+x.event.triggered)&&(d.indexOf(".")>=0&&(g=d.split("."),d=g.shift(),g.sort()),c=0>d.indexOf(":")&&"on"+d,t=t[x.expando]?t:new x.Event(d,"object"==typeof t&&t),t.isTrigger=i?2:3,t.namespace=g.join("."),t.namespace_re=t.namespace?RegExp("(^|\\.)"+g.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=undefined,t.target||(t.target=r),n=null==n?[t]:x.makeArray(n,[t]),f=x.event.special[d]||{},i||!f.trigger||f.trigger.apply(r,n)!==!1)){if(!i&&!f.noBubble&&!x.isWindow(r)){for(l=f.delegateType||d,_.test(l+d)||(a=a.parentNode);a;a=a.parentNode)h.push(a),u=a;u===(r.ownerDocument||o)&&h.push(u.defaultView||u.parentWindow||e)}s=0;while((a=h[s++])&&!t.isPropagationStopped())t.type=s>1?l:f.bindType||d,p=(q.get(a,"events")||{})[t.type]&&q.get(a,"handle"),p&&p.apply(a,n),p=c&&a[c],p&&x.acceptData(a)&&p.apply&&p.apply(a,n)===!1&&t.preventDefault();return t.type=d,i||t.isDefaultPrevented()||f._default&&f._default.apply(h.pop(),n)!==!1||!x.acceptData(r)||c&&x.isFunction(r[d])&&!x.isWindow(r)&&(u=r[c],u&&(r[c]=null),x.event.triggered=d,r[d](),x.event.triggered=undefined,u&&(r[c]=u)),t.result}},dispatch:function(e){e=x.event.fix(e);var t,n,r,i,o,s=[],a=d.call(arguments),u=(q.get(this,"events")||{})[e.type]||[],l=x.event.special[e.type]||{};if(a[0]=e,e.delegateTarget=this,!l.preDispatch||l.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),t=0;while((i=s[t++])&&!e.isPropagationStopped()){e.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(o.namespace))&&(e.handleObj=o,e.data=o.data,r=((x.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,a),r!==undefined&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return l.postDispatch&&l.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,r,i,o,s=[],a=t.delegateCount,u=e.target;if(a&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!==this;u=u.parentNode||this)if(u.disabled!==!0||"click"!==e.type){for(r=[],n=0;a>n;n++)o=t[n],i=o.selector+" ",r[i]===undefined&&(r[i]=o.needsContext?x(i,this).index(u)>=0:x.find(i,this,null,[u]).length),r[i]&&r.push(o);r.length&&s.push({elem:u,handlers:r})}return t.length>a&&s.push({elem:this,handlers:t.slice(a)}),s},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,t){var n,r,i,s=t.button;return null==e.pageX&&null!=t.clientX&&(n=e.target.ownerDocument||o,r=n.documentElement,i=n.body,e.pageX=t.clientX+(r&&r.scrollLeft||i&&i.scrollLeft||0)-(r&&r.clientLeft||i&&i.clientLeft||0),e.pageY=t.clientY+(r&&r.scrollTop||i&&i.scrollTop||0)-(r&&r.clientTop||i&&i.clientTop||0)),e.which||s===undefined||(e.which=1&s?1:2&s?3:4&s?2:0),e}},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,s=e,a=this.fixHooks[i];a||(this.fixHooks[i]=a=z.test(i)?this.mouseHooks:I.test(i)?this.keyHooks:{}),r=a.props?this.props.concat(a.props):this.props,e=new x.Event(s),t=r.length;while(t--)n=r[t],e[n]=s[n];return e.target||(e.target=o),3===e.target.nodeType&&(e.target=e.target.parentNode),a.filter?a.filter(e,s):e},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==V()&&this.focus?(this.focus(),!1):undefined},delegateType:"focusin"},blur:{trigger:function(){return this===V()&&this.blur?(this.blur(),!1):undefined},delegateType:"focusout"},click:{trigger:function(){return"checkbox"===this.type&&this.click&&x.nodeName(this,"input")?(this.click(),!1):undefined},_default:function(e){return x.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==undefined&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)},x.Event=function(e,t){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.getPreventDefault&&e.getPreventDefault()?U:Y):this.type=e,t&&x.extend(this,t),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,undefined):new x.Event(e,t)},x.Event.prototype={isDefaultPrevented:Y,isPropagationStopped:Y,isImmediatePropagationStopped:Y,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=U,e&&e.preventDefault&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=U,e&&e.stopPropagation&&e.stopPropagation()},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=U,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,t,n,r,i){var o,s;if("object"==typeof e){"string"!=typeof t&&(n=n||t,t=undefined);for(s in e)this.on(s,t,n,e[s],i);return this}if(null==n&&null==r?(r=t,n=t=undefined):null==r&&("string"==typeof t?(r=n,n=undefined):(r=n,n=t,t=undefined)),r===!1)r=Y;else if(!r)return this;return 1===i&&(o=r,r=function(e){return x().off(e),o.apply(this,arguments)},r.guid=o.guid||(o.guid=x.guid++)),this.each(function(){x.event.add(this,e,r,n,t)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,x(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return(t===!1||"function"==typeof t)&&(n=t,t=undefined),n===!1&&(n=Y),this.each(function(){x.event.remove(this,e,n,t)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];return n?x.event.trigger(e,t,n,!0):undefined}});var G=/^.[^:#\[\.,]*$/,J=/^(?:parents|prev(?:Until|All))/,Q=x.expr.match.needsContext,K={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},has:function(e){var t=x(e,this),n=t.length;return this.filter(function(){var e=0;for(;n>e;e++)if(x.contains(this,t[e]))return!0})},not:function(e){return this.pushStack(et(this,e||[],!0))},filter:function(e){return this.pushStack(et(this,e||[],!1))},is:function(e){return!!et(this,"string"==typeof e&&Q.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],s=Q.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(s?s.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?g.call(x(e),this[0]):g.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function Z(e,t){while((e=e[t])&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return Z(e,"nextSibling")},prev:function(e){return Z(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return e.contentDocument||x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(K[e]||x.unique(i),J.test(e)&&i.reverse()),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,t,n){var r=[],i=n!==undefined;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&x(e).is(n))break;r.push(e)}return r},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function et(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(G.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return g.call(t,e)>=0!==n})}var tt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,nt=/<([\w:]+)/,rt=/<|&#?\w+;/,it=/<(?:script|style|link)/i,ot=/^(?:checkbox|radio)$/i,st=/checked\s*(?:[^=]|=\s*.checked.)/i,at=/^$|\/(?:java|ecma)script/i,ut=/^true\/(.*)/,lt=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,ct={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ct.optgroup=ct.option,ct.tbody=ct.tfoot=ct.colgroup=ct.caption=ct.thead,ct.th=ct.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===undefined?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=pt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=pt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(mt(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&dt(mt(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++)1===e.nodeType&&(x.cleanData(mt(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var t=this[0]||{},n=0,r=this.length;if(e===undefined&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!it.test(e)&&!ct[(nt.exec(e)||["",""])[1].toLowerCase()]){e=e.replace(tt,"<$1></$2>");try{for(;r>n;n++)t=this[n]||{},1===t.nodeType&&(x.cleanData(mt(t,!1)),t.innerHTML=e);t=0}catch(i){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=f.apply([],e);var r,i,o,s,a,u,l=0,c=this.length,p=this,h=c-1,d=e[0],g=x.isFunction(d);if(g||!(1>=c||"string"!=typeof d||x.support.checkClone)&&st.test(d))return this.each(function(r){var i=p.eq(r);g&&(e[0]=d.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(r=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),i=r.firstChild,1===r.childNodes.length&&(r=i),i)){for(o=x.map(mt(r,"script"),ft),s=o.length;c>l;l++)a=r,l!==h&&(a=x.clone(a,!0,!0),s&&x.merge(o,mt(a,"script"))),t.call(this[l],a,l);if(s)for(u=o[o.length-1].ownerDocument,x.map(o,ht),l=0;s>l;l++)a=o[l],at.test(a.type||"")&&!q.access(a,"globalEval")&&x.contains(u,a)&&(a.src?x._evalUrl(a.src):x.globalEval(a.textContent.replace(lt,"")))}return this}}),x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=[],i=x(e),o=i.length-1,s=0;for(;o>=s;s++)n=s===o?this:this.clone(!0),x(i[s])[t](n),h.apply(r,n.get());return this.pushStack(r)}}),x.extend({clone:function(e,t,n){var r,i,o,s,a=e.cloneNode(!0),u=x.contains(e.ownerDocument,e);if(!(x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(s=mt(a),o=mt(e),r=0,i=o.length;i>r;r++)yt(o[r],s[r]);if(t)if(n)for(o=o||mt(e),s=s||mt(a),r=0,i=o.length;i>r;r++)gt(o[r],s[r]);else gt(e,a);return s=mt(a,"script"),s.length>0&&dt(s,!u&&mt(e,"script")),a},buildFragment:function(e,t,n,r){var i,o,s,a,u,l,c=0,p=e.length,f=t.createDocumentFragment(),h=[];for(;p>c;c++)if(i=e[c],i||0===i)if("object"===x.type(i))x.merge(h,i.nodeType?[i]:i);else if(rt.test(i)){o=o||f.appendChild(t.createElement("div")),s=(nt.exec(i)||["",""])[1].toLowerCase(),a=ct[s]||ct._default,o.innerHTML=a[1]+i.replace(tt,"<$1></$2>")+a[2],l=a[0];while(l--)o=o.lastChild;x.merge(h,o.childNodes),o=f.firstChild,o.textContent=""}else h.push(t.createTextNode(i));f.textContent="",c=0;while(i=h[c++])if((!r||-1===x.inArray(i,r))&&(u=x.contains(i.ownerDocument,i),o=mt(f.appendChild(i),"script"),u&&dt(o),n)){l=0;while(i=o[l++])at.test(i.type||"")&&n.push(i)}return f},cleanData:function(e){var t,n,r,i,o,s,a=x.event.special,u=0;for(;(n=e[u])!==undefined;u++){if(F.accepts(n)&&(o=n[q.expando],o&&(t=q.cache[o]))){if(r=Object.keys(t.events||{}),r.length)for(s=0;(i=r[s])!==undefined;s++)a[i]?x.event.remove(n,i):x.removeEvent(n,i,t.handle);q.cache[o]&&delete q.cache[o]}delete L.cache[n[L.expando]]}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})}});function pt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function ft(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function ht(e){var t=ut.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function dt(e,t){var n=e.length,r=0;for(;n>r;r++)q.set(e[r],"globalEval",!t||q.get(t[r],"globalEval"))}function gt(e,t){var n,r,i,o,s,a,u,l;if(1===t.nodeType){if(q.hasData(e)&&(o=q.access(e),s=q.set(t,o),l=o.events)){delete s.handle,s.events={};for(i in l)for(n=0,r=l[i].length;r>n;n++)x.event.add(t,i,l[i][n])}L.hasData(e)&&(a=L.access(e),u=x.extend({},a),L.set(t,u))}}function mt(e,t){var n=e.getElementsByTagName?e.getElementsByTagName(t||"*"):e.querySelectorAll?e.querySelectorAll(t||"*"):[];return t===undefined||t&&x.nodeName(e,t)?x.merge([e],n):n}function yt(e,t){var n=t.nodeName.toLowerCase();"input"===n&&ot.test(e.type)?t.checked=e.checked:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}x.fn.extend({wrapAll:function(e){var t;return x.isFunction(e)?this.each(function(t){x(this).wrapAll(e.call(this,t))}):(this[0]&&(t=x(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this)},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var vt,xt,bt=/^(none|table(?!-c[ea]).+)/,wt=/^margin/,Tt=RegExp("^("+b+")(.*)$","i"),Ct=RegExp("^("+b+")(?!px)[a-z%]+$","i"),kt=RegExp("^([+-])=("+b+")","i"),Nt={BODY:"block"},Et={position:"absolute",visibility:"hidden",display:"block"},St={letterSpacing:0,fontWeight:400},jt=["Top","Right","Bottom","Left"],Dt=["Webkit","O","Moz","ms"];function At(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=Dt.length;while(i--)if(t=Dt[i]+n,t in e)return t;return r}function Lt(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function qt(t){return e.getComputedStyle(t,null)}function Ht(e,t){var n,r,i,o=[],s=0,a=e.length;for(;a>s;s++)r=e[s],r.style&&(o[s]=q.get(r,"olddisplay"),n=r.style.display,t?(o[s]||"none"!==n||(r.style.display=""),""===r.style.display&&Lt(r)&&(o[s]=q.access(r,"olddisplay",Rt(r.nodeName)))):o[s]||(i=Lt(r),(n&&"none"!==n||!i)&&q.set(r,"olddisplay",i?n:x.css(r,"display"))));for(s=0;a>s;s++)r=e[s],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[s]||"":"none"));return e}x.fn.extend({css:function(e,t){return x.access(this,function(e,t,n){var r,i,o={},s=0;if(x.isArray(t)){for(r=qt(e),i=t.length;i>s;s++)o[t[s]]=x.css(e,t[s],!1,r);return o}return n!==undefined?x.style(e,t,n):x.css(e,t)},e,t,arguments.length>1)},show:function(){return Ht(this,!0)},hide:function(){return Ht(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){Lt(this)?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=vt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,s,a=x.camelCase(t),u=e.style;return t=x.cssProps[a]||(x.cssProps[a]=At(u,a)),s=x.cssHooks[t]||x.cssHooks[a],n===undefined?s&&"get"in s&&(i=s.get(e,!1,r))!==undefined?i:u[t]:(o=typeof n,"string"===o&&(i=kt.exec(n))&&(n=(i[1]+1)*i[2]+parseFloat(x.css(e,t)),o="number"),null==n||"number"===o&&isNaN(n)||("number"!==o||x.cssNumber[a]||(n+="px"),x.support.clearCloneStyle||""!==n||0!==t.indexOf("background")||(u[t]="inherit"),s&&"set"in s&&(n=s.set(e,n,r))===undefined||(u[t]=n)),undefined)}},css:function(e,t,n,r){var i,o,s,a=x.camelCase(t);return t=x.cssProps[a]||(x.cssProps[a]=At(e.style,a)),s=x.cssHooks[t]||x.cssHooks[a],s&&"get"in s&&(i=s.get(e,!0,n)),i===undefined&&(i=vt(e,t,r)),"normal"===i&&t in St&&(i=St[t]),""===n||n?(o=parseFloat(i),n===!0||x.isNumeric(o)?o||0:i):i}}),vt=function(e,t,n){var r,i,o,s=n||qt(e),a=s?s.getPropertyValue(t)||s[t]:undefined,u=e.style;return s&&(""!==a||x.contains(e.ownerDocument,e)||(a=x.style(e,t)),Ct.test(a)&&wt.test(t)&&(r=u.width,i=u.minWidth,o=u.maxWidth,u.minWidth=u.maxWidth=u.width=a,a=s.width,u.width=r,u.minWidth=i,u.maxWidth=o)),a};function Ot(e,t,n){var r=Tt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function Ft(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,s=0;for(;4>o;o+=2)"margin"===n&&(s+=x.css(e,n+jt[o],!0,i)),r?("content"===n&&(s-=x.css(e,"padding"+jt[o],!0,i)),"margin"!==n&&(s-=x.css(e,"border"+jt[o]+"Width",!0,i))):(s+=x.css(e,"padding"+jt[o],!0,i),"padding"!==n&&(s+=x.css(e,"border"+jt[o]+"Width",!0,i)));return s}function Pt(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=qt(e),s=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=vt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Ct.test(i))return i;r=s&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+Ft(e,t,n||(s?"border":"content"),r,o)+"px"}function Rt(e){var t=o,n=Nt[e];return n||(n=Mt(e,t),"none"!==n&&n||(xt=(xt||x("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(xt[0].contentWindow||xt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=Mt(e,t),xt.detach()),Nt[e]=n),n}function Mt(e,t){var n=x(t.createElement(e)).appendTo(t.body),r=x.css(n[0],"display");return n.remove(),r}x.each(["height","width"],function(e,t){x.cssHooks[t]={get:function(e,n,r){return n?0===e.offsetWidth&&bt.test(x.css(e,"display"))?x.swap(e,Et,function(){return Pt(e,t,r)}):Pt(e,t,r):undefined},set:function(e,n,r){var i=r&&qt(e);return Ot(e,n,r?Ft(e,t,r,x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,i),i):0)}}}),x(function(){x.support.reliableMarginRight||(x.cssHooks.marginRight={get:function(e,t){return t?x.swap(e,{display:"inline-block"},vt,[e,"marginRight"]):undefined}}),!x.support.pixelPosition&&x.fn.position&&x.each(["top","left"],function(e,t){x.cssHooks[t]={get:function(e,n){return n?(n=vt(e,t),Ct.test(n)?x(e).position()[t]+"px":n):undefined}}})}),x.expr&&x.expr.filters&&(x.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight},x.expr.filters.visible=function(e){return!x.expr.filters.hidden(e)}),x.each({margin:"",padding:"",border:"Width"},function(e,t){x.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+jt[r]+t]=o[r]||o[r-2]||o[0];return i}},wt.test(e)||(x.cssHooks[e+t].set=Ot)});var Wt=/%20/g,$t=/\[\]$/,Bt=/\r?\n/g,It=/^(?:submit|button|image|reset|file)$/i,zt=/^(?:input|select|textarea|keygen)/i;x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=x.prop(this,"elements");return e?x.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!x(this).is(":disabled")&&zt.test(this.nodeName)&&!It.test(e)&&(this.checked||!ot.test(e))}).map(function(e,t){var n=x(this).val();return null==n?null:x.isArray(n)?x.map(n,function(e){return{name:t.name,value:e.replace(Bt,"\r\n")}}):{name:t.name,value:n.replace(Bt,"\r\n")}}).get()}}),x.param=function(e,t){var n,r=[],i=function(e,t){t=x.isFunction(t)?t():null==t?"":t,r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(t===undefined&&(t=x.ajaxSettings&&x.ajaxSettings.traditional),x.isArray(e)||e.jquery&&!x.isPlainObject(e))x.each(e,function(){i(this.name,this.value)});else for(n in e)_t(n,e[n],t,i);return r.join("&").replace(Wt,"+")};function _t(e,t,n,r){var i;if(x.isArray(t))x.each(t,function(t,i){n||$t.test(e)?r(e,i):_t(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==x.type(t))r(e,t);else for(i in t)_t(e+"["+i+"]",t[i],n,r)}x.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){x.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),x.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}});var Xt,Ut,Yt=x.now(),Vt=/\?/,Gt=/#.*$/,Jt=/([?&])_=[^&]*/,Qt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Kt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Zt=/^(?:GET|HEAD)$/,en=/^\/\//,tn=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,nn=x.fn.load,rn={},on={},sn="*/".concat("*");try{Ut=i.href}catch(an){Ut=o.createElement("a"),Ut.href="",Ut=Ut.href}Xt=tn.exec(Ut.toLowerCase())||[];function un(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(w)||[];if(x.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function ln(e,t,n,r){var i={},o=e===on;function s(a){var u;return i[a]=!0,x.each(e[a]||[],function(e,a){var l=a(t,n,r);return"string"!=typeof l||o||i[l]?o?!(u=l):undefined:(t.dataTypes.unshift(l),s(l),!1)}),u}return s(t.dataTypes[0])||!i["*"]&&s("*")}function cn(e,t){var n,r,i=x.ajaxSettings.flatOptions||{};for(n in t)t[n]!==undefined&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&x.extend(!0,e,r),e}x.fn.load=function(e,t,n){if("string"!=typeof e&&nn)return nn.apply(this,arguments);var r,i,o,s=this,a=e.indexOf(" ");return a>=0&&(r=e.slice(a),e=e.slice(0,a)),x.isFunction(t)?(n=t,t=undefined):t&&"object"==typeof t&&(i="POST"),s.length>0&&x.ajax({url:e,type:i,dataType:"html",data:t}).done(function(e){o=arguments,s.html(r?x("<div>").append(x.parseHTML(e)).find(r):e)}).complete(n&&function(e,t){s.each(n,o||[e.responseText,t,e])}),this},x.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){x.fn[t]=function(e){return this.on(t,e)}}),x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ut,type:"GET",isLocal:Kt.test(Xt[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":sn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":x.parseJSON,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?cn(cn(e,x.ajaxSettings),t):cn(x.ajaxSettings,e)},ajaxPrefilter:un(rn),ajaxTransport:un(on),ajax:function(e,t){"object"==typeof e&&(t=e,e=undefined),t=t||{};var n,r,i,o,s,a,u,l,c=x.ajaxSetup({},t),p=c.context||c,f=c.context&&(p.nodeType||p.jquery)?x(p):x.event,h=x.Deferred(),d=x.Callbacks("once memory"),g=c.statusCode||{},m={},y={},v=0,b="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(2===v){if(!o){o={};while(t=Qt.exec(i))o[t[1].toLowerCase()]=t[2]}t=o[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===v?i:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return v||(e=y[n]=y[n]||e,m[e]=t),this},overrideMimeType:function(e){return v||(c.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>v)for(t in e)g[t]=[g[t],e[t]];else T.always(e[T.status]);return this},abort:function(e){var t=e||b;return n&&n.abort(t),k(0,t),this}};if(h.promise(T).complete=d.add,T.success=T.done,T.error=T.fail,c.url=((e||c.url||Ut)+"").replace(Gt,"").replace(en,Xt[1]+"//"),c.type=t.method||t.type||c.method||c.type,c.dataTypes=x.trim(c.dataType||"*").toLowerCase().match(w)||[""],null==c.crossDomain&&(a=tn.exec(c.url.toLowerCase()),c.crossDomain=!(!a||a[1]===Xt[1]&&a[2]===Xt[2]&&(a[3]||("http:"===a[1]?"80":"443"))===(Xt[3]||("http:"===Xt[1]?"80":"443")))),c.data&&c.processData&&"string"!=typeof c.data&&(c.data=x.param(c.data,c.traditional)),ln(rn,c,t,T),2===v)return T;u=c.global,u&&0===x.active++&&x.event.trigger("ajaxStart"),c.type=c.type.toUpperCase(),c.hasContent=!Zt.test(c.type),r=c.url,c.hasContent||(c.data&&(r=c.url+=(Vt.test(r)?"&":"?")+c.data,delete c.data),c.cache===!1&&(c.url=Jt.test(r)?r.replace(Jt,"$1_="+Yt++):r+(Vt.test(r)?"&":"?")+"_="+Yt++)),c.ifModified&&(x.lastModified[r]&&T.setRequestHeader("If-Modified-Since",x.lastModified[r]),x.etag[r]&&T.setRequestHeader("If-None-Match",x.etag[r])),(c.data&&c.hasContent&&c.contentType!==!1||t.contentType)&&T.setRequestHeader("Content-Type",c.contentType),T.setRequestHeader("Accept",c.dataTypes[0]&&c.accepts[c.dataTypes[0]]?c.accepts[c.dataTypes[0]]+("*"!==c.dataTypes[0]?", "+sn+"; q=0.01":""):c.accepts["*"]);for(l in c.headers)T.setRequestHeader(l,c.headers[l]);if(c.beforeSend&&(c.beforeSend.call(p,T,c)===!1||2===v))return T.abort();b="abort";for(l in{success:1,error:1,complete:1})T[l](c[l]);if(n=ln(on,c,t,T)){T.readyState=1,u&&f.trigger("ajaxSend",[T,c]),c.async&&c.timeout>0&&(s=setTimeout(function(){T.abort("timeout")},c.timeout));try{v=1,n.send(m,k)}catch(C){if(!(2>v))throw C;k(-1,C)}}else k(-1,"No Transport");function k(e,t,o,a){var l,m,y,b,w,C=t;2!==v&&(v=2,s&&clearTimeout(s),n=undefined,i=a||"",T.readyState=e>0?4:0,l=e>=200&&300>e||304===e,o&&(b=pn(c,T,o)),b=fn(c,b,T,l),l?(c.ifModified&&(w=T.getResponseHeader("Last-Modified"),w&&(x.lastModified[r]=w),w=T.getResponseHeader("etag"),w&&(x.etag[r]=w)),204===e||"HEAD"===c.type?C="nocontent":304===e?C="notmodified":(C=b.state,m=b.data,y=b.error,l=!y)):(y=C,(e||!C)&&(C="error",0>e&&(e=0))),T.status=e,T.statusText=(t||C)+"",l?h.resolveWith(p,[m,C,T]):h.rejectWith(p,[T,C,y]),T.statusCode(g),g=undefined,u&&f.trigger(l?"ajaxSuccess":"ajaxError",[T,c,l?m:y]),d.fireWith(p,[T,C]),u&&(f.trigger("ajaxComplete",[T,c]),--x.active||x.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return x.get(e,t,n,"json")},getScript:function(e,t){return x.get(e,undefined,t,"script")}}),x.each(["get","post"],function(e,t){x[t]=function(e,n,r,i){return x.isFunction(n)&&(i=i||r,r=n,n=undefined),x.ajax({url:e,type:t,dataType:i,data:n,success:r})}});function pn(e,t,n){var r,i,o,s,a=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),r===undefined&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in a)if(a[i]&&a[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}s||(s=i)}o=o||s}return o?(o!==u[0]&&u.unshift(o),n[o]):undefined}function fn(e,t,n,r){var i,o,s,a,u,l={},c=e.dataTypes.slice();if(c[1])for(s in e.converters)l[s.toLowerCase()]=e.converters[s];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(s=l[u+" "+o]||l["* "+o],!s)for(i in l)if(a=i.split(" "),a[1]===o&&(s=l[u+" "+a[0]]||l["* "+a[0]])){s===!0?s=l[i]:l[i]!==!0&&(o=a[0],c.unshift(a[1]));break}if(s!==!0)if(s&&e["throws"])t=s(t);else try{t=s(t)}catch(p){return{state:"parsererror",error:s?p:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return x.globalEval(e),e}}}),x.ajaxPrefilter("script",function(e){e.cache===undefined&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),x.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(r,i){t=x("<script>").prop({async:!0,charset:e.scriptCharset,src:e.url}).on("load error",n=function(e){t.remove(),n=null,e&&i("error"===e.type?404:200,e.type)}),o.head.appendChild(t[0])},abort:function(){n&&n()}}}});var hn=[],dn=/(=)\?(?=&|$)|\?\?/;x.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=hn.pop()||x.expando+"_"+Yt++;return this[e]=!0,e}}),x.ajaxPrefilter("json jsonp",function(t,n,r){var i,o,s,a=t.jsonp!==!1&&(dn.test(t.url)?"url":"string"==typeof t.data&&!(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&dn.test(t.data)&&"data");return a||"jsonp"===t.dataTypes[0]?(i=t.jsonpCallback=x.isFunction(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,a?t[a]=t[a].replace(dn,"$1"+i):t.jsonp!==!1&&(t.url+=(Vt.test(t.url)?"&":"?")+t.jsonp+"="+i),t.converters["script json"]=function(){return s||x.error(i+" was not called"),s[0]},t.dataTypes[0]="json",o=e[i],e[i]=function(){s=arguments},r.always(function(){e[i]=o,t[i]&&(t.jsonpCallback=n.jsonpCallback,hn.push(i)),s&&x.isFunction(o)&&o(s[0]),s=o=undefined}),"script"):undefined}),x.ajaxSettings.xhr=function(){try{return new XMLHttpRequest}catch(e){}};var gn=x.ajaxSettings.xhr(),mn={0:200,1223:204},yn=0,vn={};e.ActiveXObject&&x(e).on("unload",function(){for(var e in vn)vn[e]();vn=undefined}),x.support.cors=!!gn&&"withCredentials"in gn,x.support.ajax=gn=!!gn,x.ajaxTransport(function(e){var t;return x.support.cors||gn&&!e.crossDomain?{send:function(n,r){var i,o,s=e.xhr();if(s.open(e.type,e.url,e.async,e.username,e.password),e.xhrFields)for(i in e.xhrFields)s[i]=e.xhrFields[i];e.mimeType&&s.overrideMimeType&&s.overrideMimeType(e.mimeType),e.crossDomain||n["X-Requested-With"]||(n["X-Requested-With"]="XMLHttpRequest");for(i in n)s.setRequestHeader(i,n[i]);t=function(e){return function(){t&&(delete vn[o],t=s.onload=s.onerror=null,"abort"===e?s.abort():"error"===e?r(s.status||404,s.statusText):r(mn[s.status]||s.status,s.statusText,"string"==typeof s.responseText?{text:s.responseText}:undefined,s.getAllResponseHeaders()))}},s.onload=t(),s.onerror=t("error"),t=vn[o=yn++]=t("abort"),s.send(e.hasContent&&e.data||null)},abort:function(){t&&t()}}:undefined});var xn,bn,wn=/^(?:toggle|show|hide)$/,Tn=RegExp("^(?:([+-])=|)("+b+")([a-z%]*)$","i"),Cn=/queueHooks$/,kn=[An],Nn={"*":[function(e,t){var n=this.createTween(e,t),r=n.cur(),i=Tn.exec(t),o=i&&i[3]||(x.cssNumber[e]?"":"px"),s=(x.cssNumber[e]||"px"!==o&&+r)&&Tn.exec(x.css(n.elem,e)),a=1,u=20;if(s&&s[3]!==o){o=o||s[3],i=i||[],s=+r||1;do a=a||".5",s/=a,x.style(n.elem,e,s+o);while(a!==(a=n.cur()/r)&&1!==a&&--u)}return i&&(s=n.start=+s||+r||0,n.unit=o,n.end=i[1]?s+(i[1]+1)*i[2]:+i[2]),n}]};function En(){return setTimeout(function(){xn=undefined}),xn=x.now()}function Sn(e,t,n){var r,i=(Nn[t]||[]).concat(Nn["*"]),o=0,s=i.length;for(;s>o;o++)if(r=i[o].call(n,t,e))return r}function jn(e,t,n){var r,i,o=0,s=kn.length,a=x.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;var t=xn||En(),n=Math.max(0,l.startTime+l.duration-t),r=n/l.duration||0,o=1-r,s=0,u=l.tweens.length;for(;u>s;s++)l.tweens[s].run(o);return a.notifyWith(e,[l,o,n]),1>o&&u?n:(a.resolveWith(e,[l]),!1)},l=a.promise({elem:e,props:x.extend({},t),opts:x.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:xn||En(),duration:n.duration,tweens:[],createTween:function(t,n){var r=x.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)l.tweens[n].run(1);return t?a.resolveWith(e,[l,t]):a.rejectWith(e,[l,t]),this}}),c=l.props;for(Dn(c,l.opts.specialEasing);s>o;o++)if(r=kn[o].call(l,e,c,l.opts))return r;return x.map(c,Sn,l),x.isFunction(l.opts.start)&&l.opts.start.call(e,l),x.fx.timer(x.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always)}function Dn(e,t){var n,r,i,o,s;for(n in e)if(r=x.camelCase(n),i=t[r],o=e[n],x.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),s=x.cssHooks[r],s&&"expand"in s){o=s.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}x.Animation=x.extend(jn,{tweener:function(e,t){x.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Nn[n]=Nn[n]||[],Nn[n].unshift(t)},prefilter:function(e,t){t?kn.unshift(e):kn.push(e)}});function An(e,t,n){var r,i,o,s,a,u,l=this,c={},p=e.style,f=e.nodeType&&Lt(e),h=q.get(e,"fxshow");n.queue||(a=x._queueHooks(e,"fx"),null==a.unqueued&&(a.unqueued=0,u=a.empty.fire,a.empty.fire=function(){a.unqueued||u()}),a.unqueued++,l.always(function(){l.always(function(){a.unqueued--,x.queue(e,"fx").length||a.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],"inline"===x.css(e,"display")&&"none"===x.css(e,"float")&&(p.display="inline-block")),n.overflow&&(p.overflow="hidden",l.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],wn.exec(i)){if(delete t[r],o=o||"toggle"===i,i===(f?"hide":"show")){if("show"!==i||!h||h[r]===undefined)continue;f=!0}c[r]=h&&h[r]||x.style(e,r)}if(!x.isEmptyObject(c)){h?"hidden"in h&&(f=h.hidden):h=q.access(e,"fxshow",{}),o&&(h.hidden=!f),f?x(e).show():l.done(function(){x(e).hide()}),l.done(function(){var t;q.remove(e,"fxshow");for(t in c)x.style(e,t,c[t])});for(r in c)s=Sn(f?h[r]:0,r,l),r in h||(h[r]=s.start,f&&(s.end=s.start,s.start="width"===r||"height"===r?1:0))}}function Ln(e,t,n,r,i){return new Ln.prototype.init(e,t,n,r,i)}x.Tween=Ln,Ln.prototype={constructor:Ln,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(x.cssNumber[n]?"":"px")},cur:function(){var e=Ln.propHooks[this.prop];return e&&e.get?e.get(this):Ln.propHooks._default.get(this)},run:function(e){var t,n=Ln.propHooks[this.prop];return this.pos=t=this.options.duration?x.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Ln.propHooks._default.set(this),this}},Ln.prototype.init.prototype=Ln.prototype,Ln.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=x.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){x.fx.step[e.prop]?x.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[x.cssProps[e.prop]]||x.cssHooks[e.prop])?x.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},Ln.propHooks.scrollTop=Ln.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},x.each(["toggle","show","hide"],function(e,t){var n=x.fn[t];x.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(qn(t,!0),e,r,i)}}),x.fn.extend({fadeTo:function(e,t,n,r){return this.filter(Lt).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=x.isEmptyObject(e),o=x.speed(t,n,r),s=function(){var t=jn(this,x.extend({},e),o);(i||q.get(this,"finish"))&&t.stop(!0)};return s.finish=s,i||o.queue===!1?this.each(s):this.queue(o.queue,s)},stop:function(e,t,n){var r=function(e){var t=e.stop;delete e.stop,t(n)};return"string"!=typeof e&&(n=t,t=e,e=undefined),t&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,i=null!=e&&e+"queueHooks",o=x.timers,s=q.get(this);if(i)s[i]&&s[i].stop&&r(s[i]);else for(i in s)s[i]&&s[i].stop&&Cn.test(i)&&r(s[i]);for(i=o.length;i--;)o[i].elem!==this||null!=e&&o[i].queue!==e||(o[i].anim.stop(n),t=!1,o.splice(i,1));(t||!n)&&x.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=q.get(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=x.timers,s=r?r.length:0;for(n.finish=!0,x.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;s>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function qn(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=jt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}x.each({slideDown:qn("show"),slideUp:qn("hide"),slideToggle:qn("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){x.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),x.speed=function(e,t,n){var r=e&&"object"==typeof e?x.extend({},e):{complete:n||!n&&t||x.isFunction(e)&&e,duration:e,easing:n&&t||t&&!x.isFunction(t)&&t};return r.duration=x.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in x.fx.speeds?x.fx.speeds[r.duration]:x.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){x.isFunction(r.old)&&r.old.call(this),r.queue&&x.dequeue(this,r.queue)},r},x.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},x.timers=[],x.fx=Ln.prototype.init,x.fx.tick=function(){var e,t=x.timers,n=0;for(xn=x.now();t.length>n;n++)e=t[n],e()||t[n]!==e||t.splice(n--,1);t.length||x.fx.stop(),xn=undefined},x.fx.timer=function(e){e()&&x.timers.push(e)&&x.fx.start()},x.fx.interval=13,x.fx.start=function(){bn||(bn=setInterval(x.fx.tick,x.fx.interval))},x.fx.stop=function(){clearInterval(bn),bn=null},x.fx.speeds={slow:600,fast:200,_default:400},x.fx.step={},x.expr&&x.expr.filters&&(x.expr.filters.animated=function(e){return x.grep(x.timers,function(t){return e===t.elem}).length}),x.fn.offset=function(e){if(arguments.length)return e===undefined?this:this.each(function(t){x.offset.setOffset(this,e,t)});var t,n,i=this[0],o={top:0,left:0},s=i&&i.ownerDocument;if(s)return t=s.documentElement,x.contains(t,i)?(typeof i.getBoundingClientRect!==r&&(o=i.getBoundingClientRect()),n=Hn(s),{top:o.top+n.pageYOffset-t.clientTop,left:o.left+n.pageXOffset-t.clientLeft}):o},x.offset={setOffset:function(e,t,n){var r,i,o,s,a,u,l,c=x.css(e,"position"),p=x(e),f={};"static"===c&&(e.style.position="relative"),a=p.offset(),o=x.css(e,"top"),u=x.css(e,"left"),l=("absolute"===c||"fixed"===c)&&(o+u).indexOf("auto")>-1,l?(r=p.position(),s=r.top,i=r.left):(s=parseFloat(o)||0,i=parseFloat(u)||0),x.isFunction(t)&&(t=t.call(e,n,a)),null!=t.top&&(f.top=t.top-a.top+s),null!=t.left&&(f.left=t.left-a.left+i),"using"in t?t.using.call(e,f):p.css(f)}},x.fn.extend({position:function(){if(this[0]){var e,t,n=this[0],r={top:0,left:0};return"fixed"===x.css(n,"position")?t=n.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),x.nodeName(e[0],"html")||(r=e.offset()),r.top+=x.css(e[0],"borderTopWidth",!0),r.left+=x.css(e[0],"borderLeftWidth",!0)),{top:t.top-r.top-x.css(n,"marginTop",!0),left:t.left-r.left-x.css(n,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||s;while(e&&!x.nodeName(e,"html")&&"static"===x.css(e,"position"))e=e.offsetParent;return e||s})}}),x.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,n){var r="pageYOffset"===n;x.fn[t]=function(i){return x.access(this,function(t,i,o){var s=Hn(t);return o===undefined?s?s[n]:t[i]:(s?s.scrollTo(r?e.pageXOffset:o,r?o:e.pageYOffset):t[i]=o,undefined)},t,i,arguments.length,null)}});function Hn(e){return x.isWindow(e)?e:9===e.nodeType&&e.defaultView}x.each({Height:"height",Width:"width"},function(e,t){x.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,r){x.fn[r]=function(r,i){var o=arguments.length&&(n||"boolean"!=typeof r),s=n||(r===!0||i===!0?"margin":"border");return x.access(this,function(t,n,r){var i;return x.isWindow(t)?t.document.documentElement["client"+e]:9===t.nodeType?(i=t.documentElement,Math.max(t.body["scroll"+e],i["scroll"+e],t.body["offset"+e],i["offset"+e],i["client"+e])):r===undefined?x.css(t,n,s):x.style(t,n,r,s)},t,o?r:undefined,o,null)}})}),x.fn.size=function(){return this.length},x.fn.andSelf=x.fn.addBack,"object"==typeof module&&module&&"object"==typeof module.exports?module.exports=x:"function"==typeof define&&define.amd&&define("jquery",[],function(){return x}),"object"==typeof e&&"object"==typeof e.document&&(e.jQuery=e.$=x)})(window); \ No newline at end of file
diff --git a/themes/baggy/js/jquery.cookie.js b/themes/baggy/js/jquery.cookie.js
new file mode 100755
index 00000000..92719000
--- /dev/null
+++ b/themes/baggy/js/jquery.cookie.js
@@ -0,0 +1,117 @@
1/*!
2 * jQuery Cookie Plugin v1.4.0
3 * https://github.com/carhartl/jquery-cookie
4 *
5 * Copyright 2013 Klaus Hartl
6 * Released under the MIT license
7 */
8(function (factory) {
9 if (typeof define === 'function' && define.amd) {
10 // AMD. Register as anonymous module.
11 define(['jquery'], factory);
12 } else {
13 // Browser globals.
14 factory(jQuery);
15 }
16}(function ($) {
17
18 var pluses = /\+/g;
19
20 function encode(s) {
21 return config.raw ? s : encodeURIComponent(s);
22 }
23
24 function decode(s) {
25 return config.raw ? s : decodeURIComponent(s);
26 }
27
28 function stringifyCookieValue(value) {
29 return encode(config.json ? JSON.stringify(value) : String(value));
30 }
31
32 function parseCookieValue(s) {
33 if (s.indexOf('"') === 0) {
34 // This is a quoted cookie as according to RFC2068, unescape...
35 s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\');
36 }
37
38 try {
39 // Replace server-side written pluses with spaces.
40 // If we can't decode the cookie, ignore it, it's unusable.
41 s = decodeURIComponent(s.replace(pluses, ' '));
42 } catch(e) {
43 return;
44 }
45
46 try {
47 // If we can't parse the cookie, ignore it, it's unusable.
48 return config.json ? JSON.parse(s) : s;
49 } catch(e) {}
50 }
51
52 function read(s, converter) {
53 var value = config.raw ? s : parseCookieValue(s);
54 return $.isFunction(converter) ? converter(value) : value;
55 }
56
57 var config = $.cookie = function (key, value, options) {
58
59 // Write
60 if (value !== undefined && !$.isFunction(value)) {
61 options = $.extend({}, config.defaults, options);
62
63 if (typeof options.expires === 'number') {
64 var days = options.expires, t = options.expires = new Date();
65 t.setDate(t.getDate() + days);
66 }
67
68 return (document.cookie = [
69 encode(key), '=', stringifyCookieValue(value),
70 options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
71 options.path ? '; path=' + options.path : '',
72 options.domain ? '; domain=' + options.domain : '',
73 options.secure ? '; secure' : ''
74 ].join(''));
75 }
76
77 // Read
78
79 var result = key ? undefined : {};
80
81 // To prevent the for loop in the first place assign an empty array
82 // in case there are no cookies at all. Also prevents odd result when
83 // calling $.cookie().
84 var cookies = document.cookie ? document.cookie.split('; ') : [];
85
86 for (var i = 0, l = cookies.length; i < l; i++) {
87 var parts = cookies[i].split('=');
88 var name = decode(parts.shift());
89 var cookie = parts.join('=');
90
91 if (key && key === name) {
92 // If second argument (value) is a function it's a converter...
93 result = read(cookie, value);
94 break;
95 }
96
97 // Prevent storing a cookie that we couldn't decode.
98 if (!key && (cookie = read(cookie)) !== undefined) {
99 result[name] = cookie;
100 }
101 }
102
103 return result;
104 };
105
106 config.defaults = {};
107
108 $.removeCookie = function (key, options) {
109 if ($.cookie(key) !== undefined) {
110 // Must not alter options, thus extending a fresh object...
111 $.cookie(key, '', $.extend({}, options, { expires: -1 }));
112 return true;
113 }
114 return false;
115 };
116
117}));
diff --git a/themes/baggy/layout.twig b/themes/baggy/layout.twig
index dfebc3ea..8de12749 100644..100755
--- a/themes/baggy/layout.twig
+++ b/themes/baggy/layout.twig
@@ -21,6 +21,9 @@
21 {% block precontent %}{% endblock %} 21 {% block precontent %}{% endblock %}
22 {% block messages %} 22 {% block messages %}
23 {% include '_messages.twig' %} 23 {% include '_messages.twig' %}
24 {% if includeImport %}
25 {% include '_import.twig' %}
26 {% endif %}
24 {% endblock %} 27 {% endblock %}
25 <div id="content" class="w600p center"> 28 <div id="content" class="w600p center">
26 {% block content %}{% endblock %} 29 {% block content %}{% endblock %}
diff --git a/themes/baggy/tags.twig b/themes/baggy/tags.twig
index 9df44bb7..9bb93a45 100644..100755
--- a/themes/baggy/tags.twig
+++ b/themes/baggy/tags.twig
@@ -6,7 +6,7 @@
6{% block content %} 6{% block content %}
7<h2>{% trans "Tags" %}</h2> 7<h2>{% trans "Tags" %}</h2>
8<ul class="list-tags"> 8<ul class="list-tags">
9{% for tag in tags %}<li>{% if token != '' %}<a class="icon icon-rss" href="?feed&amp;type=tag&amp;user_id={{ user_id }}&amp;tag_id={{ tag.id }}&amp;token={{ token }}" target="_blank"><span>rss</span></a>{% endif %} <a href="./?view=tag&amp;id={{ tag.id }}">{{ tag.value }}</a> 9{% for tag in tags %}<li>{% if token != '' %}<a class="icon icon-rss" href="?feed&amp;type=tag&amp;user_id={{ user_id }}&amp;tag_id={{ tag.id }}&amp;token={{ token }}" target="_blank"><span>rss</span></a>{% endif %} <a href="./?view=tag&amp;id={{ tag.id }}">{{ tag.value }}</a> ({{ tag.entriescount }})
10</li> 10</li>
11{% endfor %} 11{% endfor %}
12</ul> 12</ul>
diff --git a/themes/baggy/view.twig b/themes/baggy/view.twig
index 4751c4cb..ffb512a3 100644..100755
--- a/themes/baggy/view.twig
+++ b/themes/baggy/view.twig
@@ -14,7 +14,7 @@
14 {% if constant('SHARE_TWITTER') == 1 %}<li><a href="https://twitter.com/home?status={{entry.title|url_encode}}%20{{ entry.url|url_encode }}%20via%20@wallabagapp" target="_blank" class="tool twitter icon icon-twitter" title="{% trans "Tweet" %}"><span>{% trans "Tweet" %}</span></a></li>{% endif %} 14 {% if constant('SHARE_TWITTER') == 1 %}<li><a href="https://twitter.com/home?status={{entry.title|url_encode}}%20{{ entry.url|url_encode }}%20via%20@wallabagapp" target="_blank" class="tool twitter icon icon-twitter" title="{% trans "Tweet" %}"><span>{% trans "Tweet" %}</span></a></li>{% endif %}
15 {% if constant('SHARE_MAIL') == 1 %}<li><a href="mailto:?subject={{ entry.title|url_encode }}&amp;body={{ entry.url|url_encode }}%20via%20@wallabagapp" class="tool email icon icon-mail" title="{% trans "Email" %}"><span>{% trans "Email" %}</span></a></li>{% endif %} 15 {% if constant('SHARE_MAIL') == 1 %}<li><a href="mailto:?subject={{ entry.title|url_encode }}&amp;body={{ entry.url|url_encode }}%20via%20@wallabagapp" class="tool email icon icon-mail" title="{% trans "Email" %}"><span>{% trans "Email" %}</span></a></li>{% endif %}
16 {% if constant('SHARE_SHAARLI') == 1 %}<li><a href="{{ constant('SHAARLI_URL') }}/index.php?post={{ entry.url|url_encode }}&amp;title={{ entry.title|url_encode }}" target="_blank" class="tool shaarli" title="{% trans "shaarli" %}"><span>{% trans "shaarli" %}</span></a></li>{% endif %} 16 {% if constant('SHARE_SHAARLI') == 1 %}<li><a href="{{ constant('SHAARLI_URL') }}/index.php?post={{ entry.url|url_encode }}&amp;title={{ entry.title|url_encode }}" target="_blank" class="tool shaarli" title="{% trans "shaarli" %}"><span>{% trans "shaarli" %}</span></a></li>{% endif %}
17 {% if constant('FLATTR') == 1 %}{% if flattr.status == constant('FLATTRABLE') %}<li><a href="http://flattr.com/submit/auto?url={{ entry.url }}" class="tool flattr icon icon-flattr" target="_blank" title="{% trans "flattr" %}"><span>{% trans "flattr" %}</span></a></li>{% elseif flattr.status == constant('FLATTRED') %}<li><a href="{{ flattr.flattrItemURL }}" class="tool flattr" target="_blank" title="{% trans "flattr" %}"><span>{% trans "flattr" %}</span> ({{ flattr.numflattrs }})</a></li>{% endif %}{% endif %} 17 {% if constant('FLATTR') == 1 %}{% if flattr.status == constant('FLATTRABLE') %}<li><a href="http://flattr.com/submit/auto?url={{ entry.url }}" class="tool flattr icon icon-flattr" target="_blank" title="{% trans "flattr" %}"><span>{% trans "flattr" %}</span></a></li>{% elseif flattr.status == constant('FLATTRED') %}<li><a href="{{ flattr.flattrItemURL }}" class="tool flattr icon icon-flattr" target="_blank" title="{% trans "flattr" %}"><span>{% trans "flattr" %}</span> ({{ flattr.numflattrs }})</a></li>{% endif %}{% endif %}
18 <li><a href="mailto:hello@wallabag.org?subject=Wrong%20display%20in%20wallabag&amp;body={{ entry.url|url_encode }}" title="{% trans "Does this article appear wrong?" %}" class="tool bad-display icon icon-delete"><span>{% trans "Does this article appear wrong?" %}</span></a></li> 18 <li><a href="mailto:hello@wallabag.org?subject=Wrong%20display%20in%20wallabag&amp;body={{ entry.url|url_encode }}" title="{% trans "Does this article appear wrong?" %}" class="tool bad-display icon icon-delete"><span>{% trans "Does this article appear wrong?" %}</span></a></li>
19 </ul> 19 </ul>
20 </div> 20 </div>
@@ -29,4 +29,23 @@
29 {{ content | raw }} 29 {{ content | raw }}
30 </article> 30 </article>
31 </div> 31 </div>
32 <script src="{{ poche_url }}themes/{{theme}}/js/restoreScroll.js"></script>
33 <script type="text/javascript">
34 $(document).ready(function() {
35
36 $(window).scroll(function(e){
37 var scrollTop = $(window).scrollTop();
38 var docHeight = $(document).height();
39 var scrollPercent = (scrollTop) / (docHeight);
40 var scrollPercentRounded = Math.round(scrollPercent*100)/100;
41 savePercent({{ entry.id|e }}, scrollPercentRounded);
42 });
43
44 retrievePercent({{ entry.id|e }});
45
46 $(window).resize(function(){
47 retrievePercent({{ entry.id|e }});
48 });
49 });
50 </script>
32{% endblock %} 51{% endblock %}
diff --git a/themes/courgette/_head.twig b/themes/courgette/_head.twig
index 57b40f41..059936d9 100755
--- a/themes/courgette/_head.twig
+++ b/themes/courgette/_head.twig
@@ -1,11 +1,11 @@
1 <link rel="shortcut icon" type="image/x-icon" href="{{ poche_url }}/themes/{{theme}}/img/favicon.ico" /> 1 <link rel="shortcut icon" type="image/x-icon" href="{{ poche_url }}themes/{{theme}}/img/favicon.ico" />
2 <link rel="apple-touch-icon-precomposed" sizes="144x144" href="{{ poche_url }}/themes/{{theme}}/img/apple-touch-icon-144x144-precomposed.png"> 2 <link rel="apple-touch-icon-precomposed" sizes="144x144" href="{{ poche_url }}themes/{{theme}}/img/apple-touch-icon-144x144-precomposed.png">
3 <link rel="apple-touch-icon-precomposed" sizes="72x72" href="{{ poche_url }}/themes/{{theme}}/img/apple-touch-icon-72x72-precomposed.png"> 3 <link rel="apple-touch-icon-precomposed" sizes="72x72" href="{{ poche_url }}themes/{{theme}}/img/apple-touch-icon-72x72-precomposed.png">
4 <link rel="apple-touch-icon-precomposed" href="{{ poche_url }}/themes/{{theme}}/img/apple-touch-icon-precomposed.png"> 4 <link rel="apple-touch-icon-precomposed" href="{{ poche_url }}themes/{{theme}}/img/apple-touch-icon-precomposed.png">
5 <link rel="stylesheet" href="{{ poche_url }}/themes/{{theme}}/css/font.css" media="all"> 5 <link rel="stylesheet" href="{{ poche_url }}themes/{{theme}}/css/font.css" media="all">
6 <link rel="stylesheet" href="{{ poche_url }}/themes/{{theme}}/css/style.css" media="all"> 6 <link rel="stylesheet" href="{{ poche_url }}themes/{{theme}}/css/style.css" media="all">
7 <link rel="stylesheet" href="{{ poche_url }}/themes/{{theme}}/css/messages.css" media="all"> 7 <link rel="stylesheet" href="{{ poche_url }}themes/{{theme}}/css/messages.css" media="all">
8 <link rel="stylesheet" href="{{ poche_url }}/themes/{{theme}}/css/print.css" media="print"> 8 <link rel="stylesheet" href="{{ poche_url }}themes/{{theme}}/css/print.css" media="print">
9 <link href='//fonts.googleapis.com/css?family=Roboto' rel='stylesheet' type='text/css'> 9 <link href='//fonts.googleapis.com/css?family=Roboto' rel='stylesheet' type='text/css'>
10 <script src="//codeorigin.jquery.com/jquery-2.0.3.min.js"></script> 10 <script src="//codeorigin.jquery.com/jquery-2.0.3.min.js"></script>
11 <script src="{{ poche_url }}/themes/{{theme}}/js/init.js"></script> 11 <script src="{{ poche_url }}themes/{{theme}}/js/init.js"></script>
diff --git a/themes/courgette/_top.twig b/themes/courgette/_top.twig
index 792687c0..2d41db17 100755
--- a/themes/courgette/_top.twig
+++ b/themes/courgette/_top.twig
@@ -1,6 +1,6 @@
1 <header> 1 <header>
2 <h1> 2 <h1>
3 {% if view == 'home' %}{% block logo %}<img src="{{ poche_url }}/themes/{{ constant('DEFAULT_THEME') }}/img/logo.svg" alt="logo poche" />{% endblock %} 3 {% if view == 'home' %}{% block logo %}<img src="{{ poche_url }}themes/{{theme}}/img/logo.svg" alt="wallabag logo" />{% endblock %}
4 {% elseif view == 'fav' %}<a href="./" title="{% trans "back to home" %}" >{{ block('logo') }} <span>Favoris</span></a> 4 {% elseif view == 'fav' %}<a href="./" title="{% trans "back to home" %}" >{{ block('logo') }} <span>Favoris</span></a>
5 {% elseif view == 'archive' %}<a href="./" title="{% trans "back to home" %}" >{{ block('logo') }} <span>Archive</span></a> 5 {% elseif view == 'archive' %}<a href="./" title="{% trans "back to home" %}" >{{ block('logo') }} <span>Archive</span></a>
6 {% else %}<a href="./" title="{% trans "back to home" %}" >{{ block('logo') }}</a> 6 {% else %}<a href="./" title="{% trans "back to home" %}" >{{ block('logo') }}</a>
diff --git a/themes/courgette/_view.twig b/themes/courgette/_view.twig
index e80829ef..9f9ea4f6 100755
--- a/themes/courgette/_view.twig
+++ b/themes/courgette/_view.twig
@@ -23,7 +23,7 @@
23 {{ content | raw }} 23 {{ content | raw }}
24 </article> 24 </article>
25 </div> 25 </div>
26 <script src="{{ poche_url }}/themes/{{ constant('DEFAULT_THEME') }}/js/restoreScroll.js"></script> 26 <script src="{{ poche_url }}themes/{{theme}}/js/restoreScroll.js"></script>
27 <script type="text/javascript"> 27 <script type="text/javascript">
28 $(document).ready(function() { 28 $(document).ready(function() {
29 29
diff --git a/themes/courgette/config.twig b/themes/courgette/config.twig
index 26da7289..5c0aa4b1 100755
--- a/themes/courgette/config.twig
+++ b/themes/courgette/config.twig
@@ -7,7 +7,7 @@
7{% block content %} 7{% block content %}
8 <div id="config"> 8 <div id="config">
9 <h2>{% trans "Poching a link" %}</h2> 9 <h2>{% trans "Poching a link" %}</h2>
10 <p>{% trans "You can poche a link by several methods:" %} (<a class="special" href="http://doc.wallabag.org" title="{% trans "read the documentation" %}">?</a>)</p> 10 <p>{% trans "There are several ways to save an article:" %} (<a class="special" href="http://doc.wallabag.org" title="{% trans "read the documentation" %}">?</a>)</p>
11 <ul> 11 <ul>
12 <li>firefox: <a href="https://bitbucket.org/jogaulupeau/poche/downloads/poche.xpi" title="download the firefox extension">{% trans "download the extension" %}</a></li> 12 <li>firefox: <a href="https://bitbucket.org/jogaulupeau/poche/downloads/poche.xpi" title="download the firefox extension">{% trans "download the extension" %}</a></li>
13 <li>chrome: <a href="https://bitbucket.org/jogaulupeau/poche/downloads/poche.crx" title="download the chrome extension">{% trans "download the extension" %}</a></li> 13 <li>chrome: <a href="https://bitbucket.org/jogaulupeau/poche/downloads/poche.crx" title="download the chrome extension">{% trans "download the extension" %}</a></li>
@@ -16,13 +16,13 @@
16 <form method="get" action="index.php"> 16 <form method="get" action="index.php">
17 <label class="addurl" for="plainurl">{% trans "by filling this field" %}:</label> 17 <label class="addurl" for="plainurl">{% trans "by filling this field" %}:</label>
18 <input required placeholder="Ex:mywebsite.com/article" class="addurl" id="plainurl" name="plainurl" type="url" /> 18 <input required placeholder="Ex:mywebsite.com/article" class="addurl" id="plainurl" name="plainurl" type="url" />
19 <input type="submit" value="{% trans "poche it!" %}" /> 19 <input type="submit" value="{% trans "bag it!" %}" />
20 </form> 20 </form>
21 </li> 21 </li>
22 <li>{% trans "bookmarklet: drag & drop this link to your bookmarks bar" %} <a id="bookmarklet" ondragend="this.click();" title="i am a bookmarklet, use me !" href="javascript:if(top['bookmarklet-url@wallabag.org']){top['bookmarklet-url@wallabag.org'];}else{(function(){var%20url%20=%20location.href%20||%20url;window.open('{{ poche_url }}?action=add&url='%20+%20btoa(url),'_self');})();void(0);}">{% trans "poche it!" %}</a></li> 22 <li>{% trans "bookmarklet: drag & drop this link to your bookmarks bar" %} <a id="bookmarklet" ondragend="this.click();" title="i am a bookmarklet, use me !" href="javascript:if(top['bookmarklet-url@wallabag.org']){top['bookmarklet-url@wallabag.org'];}else{(function(){var%20url%20=%20location.href%20||%20url;window.open('{{ poche_url }}?action=add&url='%20+%20btoa(url),'_self');})();void(0);}">{% trans "bag it!" %}</a></li>
23 </ul> 23 </ul>
24 24
25 <h2>{% trans "Updating poche" %}</h2> 25 <h2>{% trans "Upgrading wallabag" %}</h2>
26 <ul> 26 <ul>
27 <li>{% trans "your version" %} : <strong>{{ constant('POCHE') }}</strong></li> 27 <li>{% trans "your version" %} : <strong>{{ constant('POCHE') }}</strong></li>
28 <li>{% trans "latest stable version" %} : {{ prod }}. {% if compare_prod == -1 %}<strong><a href="http://wallabag.org/">{% trans "a more recent stable version is available." %}</a></strong>{% else %}{% trans "you are up to date." %}{% endif %}</li> 28 <li>{% trans "latest stable version" %} : {{ prod }}. {% if compare_prod == -1 %}<strong><a href="http://wallabag.org/">{% trans "a more recent stable version is available." %}</a></strong>{% else %}{% trans "you are up to date." %}{% endif %}</li>
@@ -76,7 +76,7 @@
76 <li><a href="./?import&amp;from=instapaper">{% trans "import from Instapaper" %}</a> {{ '(you must have a %s file on your server)'|trans|format(constant('INSTAPAPER_FILE')) }}</li> 76 <li><a href="./?import&amp;from=instapaper">{% trans "import from Instapaper" %}</a> {{ '(you must have a %s file on your server)'|trans|format(constant('INSTAPAPER_FILE')) }}</li>
77 </ul> 77 </ul>
78 78
79 <h2>{% trans "Export your poche datas" %}</h2> 79 <h2>{% trans "Export your wallabag data" %}</h2>
80 <p><a href="./?export" target="_blank">{% trans "Click here" %}</a> {% trans "to export your poche datas." %}</p> 80 <p><a href="./?export" target="_blank">{% trans "Click here" %}</a> {% trans "to export your wallabag data." %}</p>
81 </div> 81 </div>
82{% endblock %} \ No newline at end of file 82{% endblock %} \ No newline at end of file
diff --git a/themes/courgette/home.twig b/themes/courgette/home.twig
index 416cfa43..6ba72d35 100755
--- a/themes/courgette/home.twig
+++ b/themes/courgette/home.twig
@@ -14,8 +14,8 @@
14{% block precontent %} 14{% block precontent %}
15 {% if entries|length > 1 %} 15 {% if entries|length > 1 %}
16 <ul id="sort"> 16 <ul id="sort">
17 <li><a href="./?sort=ia&amp;view={{ view }}&amp;id={{ id }}"><img src="{{ poche_url }}/themes/{{ theme }}/img/{{ theme }}/top.png" alt="{% trans "by date asc" %}" title="{% trans "by date asc" %}" /></a> {% trans "by date" %} <a href="./?sort=id&amp;view={{ view }}&amp;id={{ id }}"><img src="{{ poche_url }}/themes/{{ theme }}/img/{{ theme }}/down.png" alt="{% trans "by date desc" %}" title="{% trans "by date desc" %}" /></a></li> 17 <li><a href="./?sort=ia&amp;view={{ view }}&amp;id={{ id }}"><img src="{{ poche_url }}themes/{{ theme }}/img/{{ theme }}/top.png" alt="{% trans "by date asc" %}" title="{% trans "by date asc" %}" /></a> {% trans "by date" %} <a href="./?sort=id&amp;view={{ view }}&amp;id={{ id }}"><img src="{{ poche_url }}themes/{{ theme }}/img/{{ theme }}/down.png" alt="{% trans "by date desc" %}" title="{% trans "by date desc" %}" /></a></li>
18 <li><a href="./?sort=ta&amp;view={{ view }}&amp;id={{ id }}"><img src="{{ poche_url }}/themes/{{ theme }}/img/{{ theme }}/top.png" alt="{% trans "by title asc" %}" title="{% trans "by title asc" %}" /></a> {% trans "by title" %} <a href="./?sort=td&amp;view={{ view }}&amp;id={{ id }}"><img src="{{ poche_url }}/themes/{{ theme }}/img/{{ theme }}/down.png" alt="{% trans "by title desc" %}" title="{% trans "by title desc" %}" /></a></li> 18 <li><a href="./?sort=ta&amp;view={{ view }}&amp;id={{ id }}"><img src="{{ poche_url }}themes/{{ theme }}/img/{{ theme }}/top.png" alt="{% trans "by title asc" %}" title="{% trans "by title asc" %}" /></a> {% trans "by title" %} <a href="./?sort=td&amp;view={{ view }}&amp;id={{ id }}"><img src="{{ poche_url }}themes/{{ theme }}/img/{{ theme }}/down.png" alt="{% trans "by title desc" %}" title="{% trans "by title desc" %}" /></a></li>
19 </ul> 19 </ul>
20 {% endif %} 20 {% endif %}
21{% endblock %} 21{% endblock %}
@@ -26,9 +26,15 @@
26 {% block pager %} 26 {% block pager %}
27 {% if nb_results > 1 %} 27 {% if nb_results > 1 %}
28 <div class="results"> 28 <div class="results">
29 <div class="nb-results">{{ nb_results }} {% trans "results" %}</div> 29 <div class="nb-results">{{ nb_results }} {% trans "results" %}{% if search_term is defined %}{% trans " found for « " %} {{ search_term }} »{% endif %}</div>
30 {{ page_links | raw }} 30 {{ page_links | raw }}
31 </div> 31 </div>
32 {% elseif nb_results == 1 %}
33 {% if search_term is defined %}
34 <div class="results">
35 <div class="nb-results">{% trans "Only one result found for " %} « {{ search_term }} »</div>
36 </div>
37 {% endif %}
32 {% endif %} 38 {% endif %}
33 {% endblock %} 39 {% endblock %}
34 {% for entry in entries %} 40 {% for entry in entries %}
diff --git a/themes/courgette/tags.twig b/themes/courgette/tags.twig
index 9dfdab52..b11dce28 100644..100755
--- a/themes/courgette/tags.twig
+++ b/themes/courgette/tags.twig
@@ -4,5 +4,5 @@
4{% include '_menu.twig' %} 4{% include '_menu.twig' %}
5{% endblock %} 5{% endblock %}
6{% block content %} 6{% block content %}
7{% for tag in tags %}<a class="tag" href="./?view=tag&amp;id={{ tag.id }}">{{ tag.value }}</a> {% if token != '' %}<a href="?feed&amp;type=tag&amp;user_id={{ user_id }}&amp;tag_id={{ tag.id }}&amp;token={{ token }}" target="_blank"><img src="{{ poche_url }}/themes/{{ theme }}/img/{{ theme }}/rss.png" /></a>{% endif %} {% endfor %} 7{% for tag in tags %}<a class="tag" href="./?view=tag&amp;id={{ tag.id }}">{{ tag.value }}</a> {% if token != '' %}<a href="?feed&amp;type=tag&amp;user_id={{ user_id }}&amp;tag_id={{ tag.id }}&amp;token={{ token }}" target="_blank"><img src="{{ poche_url }}themes/{{ theme }}/img/{{ theme }}/rss.png" /></a>{% endif %} {% endfor %}
8{% endblock %} \ No newline at end of file 8{% endblock %} \ No newline at end of file
diff --git a/themes/default/_bookmarklet.twig b/themes/default/_bookmarklet.twig
index 2e3071ad..61996353 100644
--- a/themes/default/_bookmarklet.twig
+++ b/themes/default/_bookmarklet.twig
@@ -1,3 +1,3 @@
1 <script type="text/javascript"> 1 <script type="text/javascript">
2 top["bookmarklet-url@wallabag.org"]=""+"<!DOCTYPE html>"+"<html>"+"<head>"+"<title>poche it !</title>"+'<link rel="icon" href="{{poche_url}}tpl/img/favicon.ico" />'+"</head>"+"<body>"+"<script>"+"window.onload=function(){"+"window.setTimeout(function(){"+"history.back();"+"},250);"+"};"+"</scr"+"ipt>"+"</body>"+"</html>" 2 top["bookmarklet-url@wallabag.org"]=""+"<!DOCTYPE html>"+"<html>"+"<head>"+"<title>bag it!</title>"+'<link rel="icon" href="{{poche_url}}tpl/img/favicon.ico" />'+"</head>"+"<body>"+"<script>"+"window.onload=function(){"+"window.setTimeout(function(){"+"history.back();"+"},250);"+"};"+"</scr"+"ipt>"+"</body>"+"</html>"
3 </script> \ No newline at end of file 3 </script> \ No newline at end of file
diff --git a/themes/default/_head.twig b/themes/default/_head.twig
index f310e420..ffbfc22e 100644..100755
--- a/themes/default/_head.twig
+++ b/themes/default/_head.twig
@@ -1,12 +1,13 @@
1 <link rel="shortcut icon" type="image/x-icon" href="{{ poche_url }}/themes/default/img/favicon.ico" /> 1 <link rel="shortcut icon" type="image/x-icon" href="{{ poche_url }}themes/default/img/favicon.ico" />
2 <link rel="apple-touch-icon-precomposed" sizes="144x144" href="{{ poche_url }}/themes/default/img/apple-touch-icon-144x144-precomposed.png"> 2 <link rel="apple-touch-icon-precomposed" sizes="144x144" href="{{ poche_url }}themes/default/img/apple-touch-icon-144x144-precomposed.png">
3 <link rel="apple-touch-icon-precomposed" sizes="72x72" href="{{ poche_url }}/themes/default/img/apple-touch-icon-72x72-precomposed.png"> 3 <link rel="apple-touch-icon-precomposed" sizes="72x72" href="{{ poche_url }}themes/default/img/apple-touch-icon-72x72-precomposed.png">
4 <link rel="apple-touch-icon-precomposed" href="{{ poche_url }}/themes/default/img/apple-touch-icon-precomposed.png"> 4 <link rel="apple-touch-icon-precomposed" href="{{ poche_url }}themes/default/img/apple-touch-icon-precomposed.png">
5 <link rel="stylesheet" href="{{ poche_url }}/themes/default/css/knacss.css" media="all"> 5 <link rel="stylesheet" href="{{ poche_url }}themes/default/css/knacss.css" media="all">
6 <link rel="stylesheet" href="{{ poche_url }}/themes/default/css/style.css" media="all"> 6 <link rel="stylesheet" href="{{ poche_url }}themes/default/css/style.css" media="all">
7 <link rel="stylesheet" href="{{ poche_url }}/themes/{{ theme }}/css/style-{{ theme }}.css" media="all" title="{{ theme }} theme"> 7 <link rel="stylesheet" href="{{ poche_url }}themes/{{ theme }}/css/style-{{ theme }}.css" media="all" title="{{ theme }} theme">
8 <link rel="stylesheet" href="{{ poche_url }}/themes/default/css/messages.css" media="all"> 8 <link rel="stylesheet" href="{{ poche_url }}themes/default/css/messages.css" media="all">
9 <link rel="stylesheet" href="{{ poche_url }}/themes/default/css/print.css" media="print"> 9 <link rel="stylesheet" href="{{ poche_url }}themes/default/css/print.css" media="print">
10 <script src="{{ poche_url }}/themes/default/js/jquery-2.0.3.min.js"></script> 10 <script src="{{ poche_url }}themes/default/js/jquery-2.0.3.min.js"></script>
11 <script src="{{ poche_url }}/themes/default/js/autoClose.js"></script> 11 <script src="{{ poche_url }}themes/default/js/autoClose.js"></script>
12 <script src="{{ poche_url }}/themes/default/js/closeMessage.js"></script> \ No newline at end of file 12 <script src="{{ poche_url }}themes/default/js/closeMessage.js"></script>
13 <script src="{{ poche_url }}themes/default/js/saveLink.js"></script>
diff --git a/themes/default/_import.twig b/themes/default/_import.twig
new file mode 100755
index 00000000..c59b7a15
--- /dev/null
+++ b/themes/default/_import.twig
@@ -0,0 +1,15 @@
1<script type="text/javascript">
2<!--
3 $(document).ready(function() {
4 $("body").css("cursor", "wait");
5
6 setTimeout(function(){
7 window.location = './?import';
8 }, {{ import.delay }} );
9 });
10//-->
11</script>
12<div class="messages warning">
13 <p>{% trans "Download required for " %} {{ import.recordsDownloadRequired }} {% trans "records" %}.</p>
14 <p>{% trans "Downloading next " %} {{ import.recordsUnderDownload }} {% trans "articles, please wait" %}...</p>
15</div>
diff --git a/themes/default/_menu.twig b/themes/default/_menu.twig
index 55583b3d..0daa0b03 100644
--- a/themes/default/_menu.twig
+++ b/themes/default/_menu.twig
@@ -3,9 +3,11 @@
3 <li><a href="./?view=fav" {% if view == 'fav' %}class="current"{% endif %}>{% trans "favorites" %}</a></li> 3 <li><a href="./?view=fav" {% if view == 'fav' %}class="current"{% endif %}>{% trans "favorites" %}</a></li>
4 <li><a href="./?view=archive" {% if view == 'archive' %}class="current"{% endif %}>{% trans "archive" %}</a></li> 4 <li><a href="./?view=archive" {% if view == 'archive' %}class="current"{% endif %}>{% trans "archive" %}</a></li>
5 <li><a href="./?view=tags" {% if view == 'tags' %}class="current"{% endif %}>{% trans "tags" %}</a></li> 5 <li><a href="./?view=tags" {% if view == 'tags' %}class="current"{% endif %}>{% trans "tags" %}</a></li>
6 <li><a href="javascript: void(null);" id="pocheit">{% trans "save a link" %}</a><span id="pocheit-arrow"></span></li> 6 <li><a href="javascript: void(null);" id="bagit">{% trans "save a link" %}</a><span id="bagit-arrow"></span></li>
7 <li><a href="javascript: void(null);" id="search">{% trans "search" %}</a><span id="search-arrow"></span></li>
7 <li><a href="./?view=config" {% if view == 'config' %}class="current"{% endif %}>{% trans "config" %}</a></li> 8 <li><a href="./?view=config" {% if view == 'config' %}class="current"{% endif %}>{% trans "config" %}</a></li>
8 <li><a href="./?logout" title="{% trans "logout" %}">{% trans "logout" %}</a></li> 9 <li><a href="./?logout" title="{% trans "logout" %}">{% trans "logout" %}</a></li>
9 </ul> 10 </ul>
10 {% include '_pocheit-form.twig' %} 11 {% include '_pocheit-form.twig' %}
12 {% include '_search-form.twig' %}
11 13
diff --git a/themes/default/_pocheit-form.twig b/themes/default/_pocheit-form.twig
index 13096159..8c982db0 100755
--- a/themes/default/_pocheit-form.twig
+++ b/themes/default/_pocheit-form.twig
@@ -1,22 +1,8 @@
1<div id="pocheit-form" class="messages info"> 1<div id="bagit-form" class="messages info">
2 <center> 2 <a href="javascript: void(null);" id="bagit-form-close">&nbsp;</a>
3 <form method="get" action="index.php"> 3 <form method="get" action="index.php" id="bagit-form-form">
4 <input required placeholder="example.com/article" class="addurl" id="plainurl" name="plainurl" type="url" /> 4 <input required placeholder="example.com/article" class="addurl" id="plainurl" name="plainurl" type="url" />
5 <input type="submit" value="{% trans "save link!" %}" /> 5 <input type="submit" value="{% trans "save link!" %}" />
6 <div id="add-link-result"></div>
6 </form> 7 </form>
7 </center>
8</div> 8</div>
9<script type="text/javascript">
10 $(document).ready(function() {
11
12 $("#pocheit-form").hide();
13
14 $("#pocheit").click(function(){
15 $("#pocheit-form").toggle();
16 $("#pocheit").toggleClass("current");
17 $("#pocheit-arrow").toggleClass("arrow-down");
18 });
19
20
21 });
22</script>
diff --git a/themes/default/_search-form.twig b/themes/default/_search-form.twig
new file mode 100644
index 00000000..74f420d0
--- /dev/null
+++ b/themes/default/_search-form.twig
@@ -0,0 +1,23 @@
1<div id="search-form" class="messages info">
2<form method="get" action="index.php">
3 <p>
4 <input type="hidden" name="view" value="search"></input>
5 <label>{% trans "Search" %}</label> : <input type="text" placeholder="{% trans "Enter your search here" %}" name="search" />
6 <input type="submit" value="{% trans "Search" %} !"></input>
7 </p>
8</form>
9</div>
10<script type="text/javascript">
11 $(document).ready(function() {
12
13 $("#search-form").hide();
14
15 $("#search").click(function(){
16 $("#search-form").toggle();
17 $("#search").toggleClass("current");
18 $("#search-arrow").toggleClass("arrow-down");
19 });
20
21
22 });
23</script> \ No newline at end of file
diff --git a/themes/default/_sorting.twig b/themes/default/_sorting.twig
new file mode 100755
index 00000000..ce3d38bc
--- /dev/null
+++ b/themes/default/_sorting.twig
@@ -0,0 +1,6 @@
1{% if entries|length > 1 %}
2 <ul id="sort">
3 <li><a href="./?sort=ia&amp;view={{ view }}{% if search_term is defined %}&amp;search={{ search_term }}{% endif %}&amp;id={{ id }}"><img src="{{ poche_url }}themes/{{ theme }}/img/{{ theme }}/top.png" alt="{% trans "by date asc" %}" title="{% trans "by date asc" %}" /></a> {% trans "by date" %} <a href="./?sort=id&amp;view={{ view }}{% if search_term is defined %}&amp;search={{ search_term }}{% endif %}&amp;id={{ id }}"><img src="{{ poche_url }}themes/{{ theme }}/img/{{ theme }}/down.png" alt="{% trans "by date desc" %}" title="{% trans "by date desc" %}" /></a></li>
4 <li><a href="./?sort=ta&amp;view={{ view }}{% if search_term is defined %}&amp;search={{ search_term }}{% endif %}&amp;id={{ id }}"><img src="{{ poche_url }}themes/{{ theme }}/img/{{ theme }}/top.png" alt="{% trans "by title asc" %}" title="{% trans "by title asc" %}" /></a> {% trans "by title" %} <a href="./?sort=td&amp;view={{ view }}{% if search_term is defined %}&amp;search={{ search_term }}{% endif %}&amp;id={{ id }}"><img src="{{ poche_url }}themes/{{ theme }}/img/{{ theme }}/down.png" alt="{% trans "by title desc" %}" title="{% trans "by title desc" %}" /></a></li>
5 </ul>
6{% endif %}
diff --git a/themes/default/_top.twig b/themes/default/_top.twig
index 083be152..45806f01 100644..100755
--- a/themes/default/_top.twig
+++ b/themes/default/_top.twig
@@ -1,6 +1,6 @@
1 <header class="w600p center mbm"> 1 <header class="w600p center mbm">
2 <h1> 2 <h1>
3 {% if view == 'home' %}{% block logo %}<img src="{{ poche_url }}/themes/{{ constant('DEFAULT_THEME') }}/img/logo.svg" alt="logo poche" />{% endblock %} 3 {% if view == 'home' %}{% block logo %}<img width="100" height="100" src="{{ poche_url }}themes/baggy/img/logo-other_themes.png" alt="wallabag logo" />{% endblock %}
4 {% else %}<a href="./" title="{% trans "return home" %}" >{{ block('logo') }}</a> 4 {% else %}<a href="./" title="{% trans "return home" %}" >{{ block('logo') }}</a>
5 {% endif %} 5 {% endif %}
6 </h1> 6 </h1>
diff --git a/themes/default/config.twig b/themes/default/config.twig
index cd4d074d..bb39dea2 100644..100755
--- a/themes/default/config.twig
+++ b/themes/default/config.twig
@@ -8,10 +8,11 @@
8 <h2>{% trans "Saving articles" %}</h2> 8 <h2>{% trans "Saving articles" %}</h2>
9 <p>{% trans "There are several ways to save an article:" %} (<a href="http://doc.wallabag.org/" title="{% trans "read the documentation" %}">?</a>)</p> 9 <p>{% trans "There are several ways to save an article:" %} (<a href="http://doc.wallabag.org/" title="{% trans "read the documentation" %}">?</a>)</p>
10 <ul> 10 <ul>
11 <li>Firefox: <a href="https://addons.mozilla.org/firefox/addon/poche/" title="download the firefox extension">{% trans "download the extension" %}</a></li> 11 <li>Firefox: <a href="https://addons.mozilla.org/firefox/addon/wallabag/" title="download the firefox extension">{% trans "download the extension" %}</a></li>
12 <li>Chrome: <a href="http://doc.wallabag.org/doku.php?id=users:chrome_extension" title="download the chrome extension">{% trans "download the extension" %}</a></li> 12 <li>Chrome: <a href="http://doc.wallabag.org/doku.php?id=users:chrome_extension" title="download the chrome extension">{% trans "download the extension" %}</a></li>
13 <li>Android: <a href="https://f-droid.org/repository/browse/?fdid=fr.gaulupeau.apps.Poche" title="download the application">{% trans "via F-Droid" %}</a> {% trans " or " %} <a href="https://play.google.com/store/apps/details?id=fr.gaulupeau.apps.InThePoche" title="download the application">{% trans "via Google Play" %}</a></li> 13 <li>Android: <a href="https://f-droid.org/app/fr.gaulupeau.apps.InThePoche" title="download the application">{% trans "via F-Droid" %}</a> {% trans " or " %} <a href="https://play.google.com/store/apps/details?id=fr.gaulupeau.apps.InThePoche" title="download the application">{% trans "via Google Play" %}</a></li>
14 <li>Windows Phone: <a href="https://www.windowsphone.com/en-us/store/app/poche/334de2f0-51b5-4826-8549-a3d805a37e83" title="download the window phone application">{% trans "download the application" %}</a></li> 14 <li>iOS: <a href="https://itunes.apple.com/app/wallabag/id828331015?mt=8" title="download the iOS application">{% trans "download the application" %}</a></li>
15 <li>Windows Phone: <a href="http://www.windowsphone.com/en-us/store/app/wallabag/ff890514-348c-4d0b-9b43-153fff3f7450" title="download the window phone application">{% trans "download the application" %}</a></li>
15 <li> 16 <li>
16 <form method="get" action="index.php"> 17 <form method="get" action="index.php">
17 <label class="addurl" for="config_plainurl">{% trans "By filling this field" %}:</label> 18 <label class="addurl" for="config_plainurl">{% trans "By filling this field" %}:</label>
@@ -103,14 +104,20 @@
103 {% endif %} 104 {% endif %}
104 105
105 <h2>{% trans "Import" %}</h2> 106 <h2>{% trans "Import" %}</h2>
106 <p>{% trans "Please execute the import script locally as it can take a very long time." %}</p> 107 <p>{% trans "You can import your Pocket, Readability, Instapaper, Wallabag or any data in appropriate json or html format." %}</p>
107 <p>{% trans "More info in the official documentation:" %} <a href="http://doc.wallabag.org/doku.php?id=users:migrate">wallabag.org</a></p> 108 <p>{% trans "Please select export file on your computer and press \"Import\" button below.<br>Wallabag will parse your file, insert all URLs and start fetching of articles if required.<br>Fetching process is controlled by two constants in your config file: IMPORT_LIMIT (how many articles are fetched at once) and IMPORT_DELAY (delay between fetch of next batch of articles)." %}</p>
108 <ul> 109 <form method="post" action="?import" name="uploadfile" enctype="multipart/form-data">
109 <li><a href="./?import&amp;from=pocket">{% trans "Import from Pocket" %}</a> {{ '(you must have a %s file on your server)'|trans|format(constant('POCKET_FILE')) }}</li> 110 <fieldset class="w500p">
110 <li><a href="./?import&amp;from=readability">{% trans "Import from Readability" %}</a> {{ '(you must have a %s file on your server)'|trans|format(constant('READABILITY_FILE')) }}</li> 111 <div class="row">
111 <li><a href="./?import&amp;from=instapaper">{% trans "Import from Instapaper" %}</a> {{ '(you must have a %s file on your server)'|trans|format(constant('INSTAPAPER_FILE')) }}</li> 112 <label class="col w150p" for="file">{% trans "File:" %}</label>
112 <li><a href="./?import&amp;from=poche">{% trans "Import from wallabag" %}</a> {{ '(you must have a %s file on your server)'|trans|format(constant('POCHE_FILE')) }}</li> 113 <input class="col" type="file" id="file" name="file" tabindex="4">
113 </ul> 114 </div>
115 <div class="row mts txtcenter">
116 <button class="bouton" type="submit" tabindex="4">{% trans "Import" %}</button>
117 </div>
118 </fieldset>
119 </form>
120 <p><a href="?import">{% trans "You can click here to fetch content for articles with no content." %}</a></p>
114 121
115 <h2>{% trans "Export your wallabag data" %}</h2> 122 <h2>{% trans "Export your wallabag data" %}</h2>
116 {% if constant('STORAGE') == 'sqlite' %} 123 {% if constant('STORAGE') == 'sqlite' %}
diff --git a/themes/default/css/images/animated-overlay.gif b/themes/default/css/images/animated-overlay.gif
new file mode 100644
index 00000000..d441f75e
--- /dev/null
+++ b/themes/default/css/images/animated-overlay.gif
Binary files differ
diff --git a/themes/default/css/images/ui-bg_flat_0_aaaaaa_40x100.png b/themes/default/css/images/ui-bg_flat_0_aaaaaa_40x100.png
new file mode 100644
index 00000000..9f10cb65
--- /dev/null
+++ b/themes/default/css/images/ui-bg_flat_0_aaaaaa_40x100.png
Binary files differ
diff --git a/themes/default/css/images/ui-bg_flat_75_ffffff_40x100.png b/themes/default/css/images/ui-bg_flat_75_ffffff_40x100.png
new file mode 100644
index 00000000..b89b914b
--- /dev/null
+++ b/themes/default/css/images/ui-bg_flat_75_ffffff_40x100.png
Binary files differ
diff --git a/themes/default/css/images/ui-bg_glass_55_fbf9ee_1x400.png b/themes/default/css/images/ui-bg_glass_55_fbf9ee_1x400.png
new file mode 100644
index 00000000..780d3ffd
--- /dev/null
+++ b/themes/default/css/images/ui-bg_glass_55_fbf9ee_1x400.png
Binary files differ
diff --git a/themes/default/css/images/ui-bg_glass_65_ffffff_1x400.png b/themes/default/css/images/ui-bg_glass_65_ffffff_1x400.png
new file mode 100644
index 00000000..da53255b
--- /dev/null
+++ b/themes/default/css/images/ui-bg_glass_65_ffffff_1x400.png
Binary files differ
diff --git a/themes/default/css/images/ui-bg_glass_75_dadada_1x400.png b/themes/default/css/images/ui-bg_glass_75_dadada_1x400.png
new file mode 100644
index 00000000..f6306608
--- /dev/null
+++ b/themes/default/css/images/ui-bg_glass_75_dadada_1x400.png
Binary files differ
diff --git a/themes/default/css/images/ui-bg_glass_75_e6e6e6_1x400.png b/themes/default/css/images/ui-bg_glass_75_e6e6e6_1x400.png
new file mode 100644
index 00000000..7d347065
--- /dev/null
+++ b/themes/default/css/images/ui-bg_glass_75_e6e6e6_1x400.png
Binary files differ
diff --git a/themes/default/css/images/ui-bg_glass_95_fef1ec_1x400.png b/themes/default/css/images/ui-bg_glass_95_fef1ec_1x400.png
new file mode 100644
index 00000000..533c4900
--- /dev/null
+++ b/themes/default/css/images/ui-bg_glass_95_fef1ec_1x400.png
Binary files differ
diff --git a/themes/default/css/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/themes/default/css/images/ui-bg_highlight-soft_75_cccccc_1x100.png
new file mode 100644
index 00000000..bf3a9481
--- /dev/null
+++ b/themes/default/css/images/ui-bg_highlight-soft_75_cccccc_1x100.png
Binary files differ
diff --git a/themes/default/css/images/ui-icons_222222_256x240.png b/themes/default/css/images/ui-icons_222222_256x240.png
new file mode 100644
index 00000000..c1cb1170
--- /dev/null
+++ b/themes/default/css/images/ui-icons_222222_256x240.png
Binary files differ
diff --git a/themes/default/css/images/ui-icons_2e83ff_256x240.png b/themes/default/css/images/ui-icons_2e83ff_256x240.png
new file mode 100644
index 00000000..84b601bf
--- /dev/null
+++ b/themes/default/css/images/ui-icons_2e83ff_256x240.png
Binary files differ
diff --git a/themes/default/css/images/ui-icons_454545_256x240.png b/themes/default/css/images/ui-icons_454545_256x240.png
new file mode 100644
index 00000000..b6db1acd
--- /dev/null
+++ b/themes/default/css/images/ui-icons_454545_256x240.png
Binary files differ
diff --git a/themes/default/css/images/ui-icons_888888_256x240.png b/themes/default/css/images/ui-icons_888888_256x240.png
new file mode 100644
index 00000000..feea0e20
--- /dev/null
+++ b/themes/default/css/images/ui-icons_888888_256x240.png
Binary files differ
diff --git a/themes/default/css/images/ui-icons_cd0a0a_256x240.png b/themes/default/css/images/ui-icons_cd0a0a_256x240.png
new file mode 100644
index 00000000..ed5b6b09
--- /dev/null
+++ b/themes/default/css/images/ui-icons_cd0a0a_256x240.png
Binary files differ
diff --git a/themes/default/css/jquery-ui-1.10.4.custom.css b/themes/default/css/jquery-ui-1.10.4.custom.css
new file mode 100644
index 00000000..5690172f
--- /dev/null
+++ b/themes/default/css/jquery-ui-1.10.4.custom.css
@@ -0,0 +1,560 @@
1/*! jQuery UI - v1.10.4 - 2014-03-09
2* http://jqueryui.com
3* Includes: jquery.ui.core.css, jquery.ui.autocomplete.css, jquery.ui.menu.css, jquery.ui.theme.css
4* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=highlight_soft&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=glass&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
5* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
6
7/* Layout helpers
8----------------------------------*/
9.ui-helper-hidden {
10 display: none;
11}
12.ui-helper-hidden-accessible {
13 border: 0;
14 clip: rect(0 0 0 0);
15 height: 1px;
16 margin: -1px;
17 overflow: hidden;
18 padding: 0;
19 position: absolute;
20 width: 1px;
21}
22.ui-helper-reset {
23 margin: 0;
24 padding: 0;
25 border: 0;
26 outline: 0;
27 line-height: 1.3;
28 text-decoration: none;
29 font-size: 100%;
30 list-style: none;
31}
32.ui-helper-clearfix:before,
33.ui-helper-clearfix:after {
34 content: "";
35 display: table;
36 border-collapse: collapse;
37}
38.ui-helper-clearfix:after {
39 clear: both;
40}
41.ui-helper-clearfix {
42 min-height: 0; /* support: IE7 */
43}
44.ui-helper-zfix {
45 width: 100%;
46 height: 100%;
47 top: 0;
48 left: 0;
49 position: absolute;
50 opacity: 0;
51 filter:Alpha(Opacity=0);
52}
53
54.ui-front {
55 z-index: 100;
56}
57
58
59/* Interaction Cues
60----------------------------------*/
61.ui-state-disabled {
62 cursor: default !important;
63}
64
65
66/* Icons
67----------------------------------*/
68
69/* states and images */
70.ui-icon {
71 display: block;
72 text-indent: -99999px;
73 overflow: hidden;
74 background-repeat: no-repeat;
75}
76
77
78/* Misc visuals
79----------------------------------*/
80
81/* Overlays */
82.ui-widget-overlay {
83 position: fixed;
84 top: 0;
85 left: 0;
86 width: 100%;
87 height: 100%;
88}
89.ui-autocomplete {
90 position: absolute;
91 top: 0;
92 left: 0;
93 cursor: default;
94}
95.ui-menu {
96 list-style: none;
97 padding: 2px;
98 margin: 0;
99 display: block;
100 outline: none;
101}
102.ui-menu .ui-menu {
103 margin-top: -3px;
104 position: absolute;
105}
106.ui-menu .ui-menu-item {
107 margin: 0;
108 padding: 0;
109 width: 100%;
110 /* support: IE10, see #8844 */
111 list-style-image: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);
112}
113.ui-menu .ui-menu-divider {
114 margin: 5px -2px 5px -2px;
115 height: 0;
116 font-size: 0;
117 line-height: 0;
118 border-width: 1px 0 0 0;
119}
120.ui-menu .ui-menu-item a {
121 text-decoration: none;
122 display: block;
123 padding: 2px .4em;
124 line-height: 1.5;
125 min-height: 0; /* support: IE7 */
126 font-weight: normal;
127}
128.ui-menu .ui-menu-item a.ui-state-focus,
129.ui-menu .ui-menu-item a.ui-state-active {
130 font-weight: normal;
131 margin: -1px;
132}
133
134.ui-menu .ui-state-disabled {
135 font-weight: normal;
136 margin: .4em 0 .2em;
137 line-height: 1.5;
138}
139.ui-menu .ui-state-disabled a {
140 cursor: default;
141}
142
143/* icon support */
144.ui-menu-icons {
145 position: relative;
146}
147.ui-menu-icons .ui-menu-item a {
148 position: relative;
149 padding-left: 2em;
150}
151
152/* left-aligned */
153.ui-menu .ui-icon {
154 position: absolute;
155 top: .2em;
156 left: .2em;
157}
158
159/* right-aligned */
160.ui-menu .ui-menu-icon {
161 position: static;
162 float: right;
163}
164
165/* Component containers
166----------------------------------*/
167.ui-widget {
168 font-family: Verdana,Arial,sans-serif;
169 font-size: 1.1em;
170}
171.ui-widget .ui-widget {
172 font-size: 1em;
173}
174.ui-widget input,
175.ui-widget select,
176.ui-widget textarea,
177.ui-widget button {
178 font-family: Verdana,Arial,sans-serif;
179 font-size: 1em;
180}
181.ui-widget-content {
182 border: 1px solid #aaaaaa;
183 background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x;
184 color: #222222;
185}
186.ui-widget-content a {
187 color: #222222;
188}
189.ui-widget-header {
190 border: 1px solid #aaaaaa;
191 background: #cccccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x;
192 color: #222222;
193 font-weight: bold;
194}
195.ui-widget-header a {
196 color: #222222;
197}
198
199/* Interaction states
200----------------------------------*/
201.ui-state-default,
202.ui-widget-content .ui-state-default,
203.ui-widget-header .ui-state-default {
204 border: 1px solid #d3d3d3;
205 background: #e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x;
206 font-weight: normal;
207 color: #555555;
208}
209.ui-state-default a,
210.ui-state-default a:link,
211.ui-state-default a:visited {
212 color: #555555;
213 text-decoration: none;
214}
215.ui-state-hover,
216.ui-widget-content .ui-state-hover,
217.ui-widget-header .ui-state-hover,
218.ui-state-focus,
219.ui-widget-content .ui-state-focus,
220.ui-widget-header .ui-state-focus {
221 border: 1px solid #999999;
222 background: #dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x;
223 font-weight: normal;
224 color: #212121;
225}
226.ui-state-hover a,
227.ui-state-hover a:hover,
228.ui-state-hover a:link,
229.ui-state-hover a:visited,
230.ui-state-focus a,
231.ui-state-focus a:hover,
232.ui-state-focus a:link,
233.ui-state-focus a:visited {
234 color: #212121;
235 text-decoration: none;
236}
237.ui-state-active,
238.ui-widget-content .ui-state-active,
239.ui-widget-header .ui-state-active {
240 border: 1px solid #aaaaaa;
241 background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x;
242 font-weight: normal;
243 color: #212121;
244}
245.ui-state-active a,
246.ui-state-active a:link,
247.ui-state-active a:visited {
248 color: #212121;
249 text-decoration: none;
250}
251
252/* Interaction Cues
253----------------------------------*/
254.ui-state-highlight,
255.ui-widget-content .ui-state-highlight,
256.ui-widget-header .ui-state-highlight {
257 border: 1px solid #fcefa1;
258 background: #fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x;
259 color: #363636;
260}
261.ui-state-highlight a,
262.ui-widget-content .ui-state-highlight a,
263.ui-widget-header .ui-state-highlight a {
264 color: #363636;
265}
266.ui-state-error,
267.ui-widget-content .ui-state-error,
268.ui-widget-header .ui-state-error {
269 border: 1px solid #cd0a0a;
270 background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x;
271 color: #cd0a0a;
272}
273.ui-state-error a,
274.ui-widget-content .ui-state-error a,
275.ui-widget-header .ui-state-error a {
276 color: #cd0a0a;
277}
278.ui-state-error-text,
279.ui-widget-content .ui-state-error-text,
280.ui-widget-header .ui-state-error-text {
281 color: #cd0a0a;
282}
283.ui-priority-primary,
284.ui-widget-content .ui-priority-primary,
285.ui-widget-header .ui-priority-primary {
286 font-weight: bold;
287}
288.ui-priority-secondary,
289.ui-widget-content .ui-priority-secondary,
290.ui-widget-header .ui-priority-secondary {
291 opacity: .7;
292 filter:Alpha(Opacity=70);
293 font-weight: normal;
294}
295.ui-state-disabled,
296.ui-widget-content .ui-state-disabled,
297.ui-widget-header .ui-state-disabled {
298 opacity: .35;
299 filter:Alpha(Opacity=35);
300 background-image: none;
301}
302.ui-state-disabled .ui-icon {
303 filter:Alpha(Opacity=35); /* For IE8 - See #6059 */
304}
305
306/* Icons
307----------------------------------*/
308
309/* states and images */
310.ui-icon {
311 width: 16px;
312 height: 16px;
313}
314.ui-icon,
315.ui-widget-content .ui-icon {
316 background-image: url(images/ui-icons_222222_256x240.png);
317}
318.ui-widget-header .ui-icon {
319 background-image: url(images/ui-icons_222222_256x240.png);
320}
321.ui-state-default .ui-icon {
322 background-image: url(images/ui-icons_888888_256x240.png);
323}
324.ui-state-hover .ui-icon,
325.ui-state-focus .ui-icon {
326 background-image: url(images/ui-icons_454545_256x240.png);
327}
328.ui-state-active .ui-icon {
329 background-image: url(images/ui-icons_454545_256x240.png);
330}
331.ui-state-highlight .ui-icon {
332 background-image: url(images/ui-icons_2e83ff_256x240.png);
333}
334.ui-state-error .ui-icon,
335.ui-state-error-text .ui-icon {
336 background-image: url(images/ui-icons_cd0a0a_256x240.png);
337}
338
339/* positioning */
340.ui-icon-blank { background-position: 16px 16px; }
341.ui-icon-carat-1-n { background-position: 0 0; }
342.ui-icon-carat-1-ne { background-position: -16px 0; }
343.ui-icon-carat-1-e { background-position: -32px 0; }
344.ui-icon-carat-1-se { background-position: -48px 0; }
345.ui-icon-carat-1-s { background-position: -64px 0; }
346.ui-icon-carat-1-sw { background-position: -80px 0; }
347.ui-icon-carat-1-w { background-position: -96px 0; }
348.ui-icon-carat-1-nw { background-position: -112px 0; }
349.ui-icon-carat-2-n-s { background-position: -128px 0; }
350.ui-icon-carat-2-e-w { background-position: -144px 0; }
351.ui-icon-triangle-1-n { background-position: 0 -16px; }
352.ui-icon-triangle-1-ne { background-position: -16px -16px; }
353.ui-icon-triangle-1-e { background-position: -32px -16px; }
354.ui-icon-triangle-1-se { background-position: -48px -16px; }
355.ui-icon-triangle-1-s { background-position: -64px -16px; }
356.ui-icon-triangle-1-sw { background-position: -80px -16px; }
357.ui-icon-triangle-1-w { background-position: -96px -16px; }
358.ui-icon-triangle-1-nw { background-position: -112px -16px; }
359.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
360.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
361.ui-icon-arrow-1-n { background-position: 0 -32px; }
362.ui-icon-arrow-1-ne { background-position: -16px -32px; }
363.ui-icon-arrow-1-e { background-position: -32px -32px; }
364.ui-icon-arrow-1-se { background-position: -48px -32px; }
365.ui-icon-arrow-1-s { background-position: -64px -32px; }
366.ui-icon-arrow-1-sw { background-position: -80px -32px; }
367.ui-icon-arrow-1-w { background-position: -96px -32px; }
368.ui-icon-arrow-1-nw { background-position: -112px -32px; }
369.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
370.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
371.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
372.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
373.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
374.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
375.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
376.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
377.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
378.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
379.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
380.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
381.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
382.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
383.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
384.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
385.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
386.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
387.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
388.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
389.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
390.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
391.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
392.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
393.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
394.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
395.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
396.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
397.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
398.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
399.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
400.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
401.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
402.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
403.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
404.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
405.ui-icon-arrow-4 { background-position: 0 -80px; }
406.ui-icon-arrow-4-diag { background-position: -16px -80px; }
407.ui-icon-extlink { background-position: -32px -80px; }
408.ui-icon-newwin { background-position: -48px -80px; }
409.ui-icon-refresh { background-position: -64px -80px; }
410.ui-icon-shuffle { background-position: -80px -80px; }
411.ui-icon-transfer-e-w { background-position: -96px -80px; }
412.ui-icon-transferthick-e-w { background-position: -112px -80px; }
413.ui-icon-folder-collapsed { background-position: 0 -96px; }
414.ui-icon-folder-open { background-position: -16px -96px; }
415.ui-icon-document { background-position: -32px -96px; }
416.ui-icon-document-b { background-position: -48px -96px; }
417.ui-icon-note { background-position: -64px -96px; }
418.ui-icon-mail-closed { background-position: -80px -96px; }
419.ui-icon-mail-open { background-position: -96px -96px; }
420.ui-icon-suitcase { background-position: -112px -96px; }
421.ui-icon-comment { background-position: -128px -96px; }
422.ui-icon-person { background-position: -144px -96px; }
423.ui-icon-print { background-position: -160px -96px; }
424.ui-icon-trash { background-position: -176px -96px; }
425.ui-icon-locked { background-position: -192px -96px; }
426.ui-icon-unlocked { background-position: -208px -96px; }
427.ui-icon-bookmark { background-position: -224px -96px; }
428.ui-icon-tag { background-position: -240px -96px; }
429.ui-icon-home { background-position: 0 -112px; }
430.ui-icon-flag { background-position: -16px -112px; }
431.ui-icon-calendar { background-position: -32px -112px; }
432.ui-icon-cart { background-position: -48px -112px; }
433.ui-icon-pencil { background-position: -64px -112px; }
434.ui-icon-clock { background-position: -80px -112px; }
435.ui-icon-disk { background-position: -96px -112px; }
436.ui-icon-calculator { background-position: -112px -112px; }
437.ui-icon-zoomin { background-position: -128px -112px; }
438.ui-icon-zoomout { background-position: -144px -112px; }
439.ui-icon-search { background-position: -160px -112px; }
440.ui-icon-wrench { background-position: -176px -112px; }
441.ui-icon-gear { background-position: -192px -112px; }
442.ui-icon-heart { background-position: -208px -112px; }
443.ui-icon-star { background-position: -224px -112px; }
444.ui-icon-link { background-position: -240px -112px; }
445.ui-icon-cancel { background-position: 0 -128px; }
446.ui-icon-plus { background-position: -16px -128px; }
447.ui-icon-plusthick { background-position: -32px -128px; }
448.ui-icon-minus { background-position: -48px -128px; }
449.ui-icon-minusthick { background-position: -64px -128px; }
450.ui-icon-close { background-position: -80px -128px; }
451.ui-icon-closethick { background-position: -96px -128px; }
452.ui-icon-key { background-position: -112px -128px; }
453.ui-icon-lightbulb { background-position: -128px -128px; }
454.ui-icon-scissors { background-position: -144px -128px; }
455.ui-icon-clipboard { background-position: -160px -128px; }
456.ui-icon-copy { background-position: -176px -128px; }
457.ui-icon-contact { background-position: -192px -128px; }
458.ui-icon-image { background-position: -208px -128px; }
459.ui-icon-video { background-position: -224px -128px; }
460.ui-icon-script { background-position: -240px -128px; }
461.ui-icon-alert { background-position: 0 -144px; }
462.ui-icon-info { background-position: -16px -144px; }
463.ui-icon-notice { background-position: -32px -144px; }
464.ui-icon-help { background-position: -48px -144px; }
465.ui-icon-check { background-position: -64px -144px; }
466.ui-icon-bullet { background-position: -80px -144px; }
467.ui-icon-radio-on { background-position: -96px -144px; }
468.ui-icon-radio-off { background-position: -112px -144px; }
469.ui-icon-pin-w { background-position: -128px -144px; }
470.ui-icon-pin-s { background-position: -144px -144px; }
471.ui-icon-play { background-position: 0 -160px; }
472.ui-icon-pause { background-position: -16px -160px; }
473.ui-icon-seek-next { background-position: -32px -160px; }
474.ui-icon-seek-prev { background-position: -48px -160px; }
475.ui-icon-seek-end { background-position: -64px -160px; }
476.ui-icon-seek-start { background-position: -80px -160px; }
477/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
478.ui-icon-seek-first { background-position: -80px -160px; }
479.ui-icon-stop { background-position: -96px -160px; }
480.ui-icon-eject { background-position: -112px -160px; }
481.ui-icon-volume-off { background-position: -128px -160px; }
482.ui-icon-volume-on { background-position: -144px -160px; }
483.ui-icon-power { background-position: 0 -176px; }
484.ui-icon-signal-diag { background-position: -16px -176px; }
485.ui-icon-signal { background-position: -32px -176px; }
486.ui-icon-battery-0 { background-position: -48px -176px; }
487.ui-icon-battery-1 { background-position: -64px -176px; }
488.ui-icon-battery-2 { background-position: -80px -176px; }
489.ui-icon-battery-3 { background-position: -96px -176px; }
490.ui-icon-circle-plus { background-position: 0 -192px; }
491.ui-icon-circle-minus { background-position: -16px -192px; }
492.ui-icon-circle-close { background-position: -32px -192px; }
493.ui-icon-circle-triangle-e { background-position: -48px -192px; }
494.ui-icon-circle-triangle-s { background-position: -64px -192px; }
495.ui-icon-circle-triangle-w { background-position: -80px -192px; }
496.ui-icon-circle-triangle-n { background-position: -96px -192px; }
497.ui-icon-circle-arrow-e { background-position: -112px -192px; }
498.ui-icon-circle-arrow-s { background-position: -128px -192px; }
499.ui-icon-circle-arrow-w { background-position: -144px -192px; }
500.ui-icon-circle-arrow-n { background-position: -160px -192px; }
501.ui-icon-circle-zoomin { background-position: -176px -192px; }
502.ui-icon-circle-zoomout { background-position: -192px -192px; }
503.ui-icon-circle-check { background-position: -208px -192px; }
504.ui-icon-circlesmall-plus { background-position: 0 -208px; }
505.ui-icon-circlesmall-minus { background-position: -16px -208px; }
506.ui-icon-circlesmall-close { background-position: -32px -208px; }
507.ui-icon-squaresmall-plus { background-position: -48px -208px; }
508.ui-icon-squaresmall-minus { background-position: -64px -208px; }
509.ui-icon-squaresmall-close { background-position: -80px -208px; }
510.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
511.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
512.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
513.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
514.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
515.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
516
517
518/* Misc visuals
519----------------------------------*/
520
521/* Corner radius */
522.ui-corner-all,
523.ui-corner-top,
524.ui-corner-left,
525.ui-corner-tl {
526 border-top-left-radius: 4px;
527}
528.ui-corner-all,
529.ui-corner-top,
530.ui-corner-right,
531.ui-corner-tr {
532 border-top-right-radius: 4px;
533}
534.ui-corner-all,
535.ui-corner-bottom,
536.ui-corner-left,
537.ui-corner-bl {
538 border-bottom-left-radius: 4px;
539}
540.ui-corner-all,
541.ui-corner-bottom,
542.ui-corner-right,
543.ui-corner-br {
544 border-bottom-right-radius: 4px;
545}
546
547/* Overlays */
548.ui-widget-overlay {
549 background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;
550 opacity: .3;
551 filter: Alpha(Opacity=30);
552}
553.ui-widget-shadow {
554 margin: -8px 0 0 -8px;
555 padding: 8px;
556 background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;
557 opacity: .3;
558 filter: Alpha(Opacity=30);
559 border-radius: 8px;
560}
diff --git a/themes/default/css/jquery-ui-1.10.4.custom.min.css b/themes/default/css/jquery-ui-1.10.4.custom.min.css
new file mode 100644
index 00000000..4dba92a8
--- /dev/null
+++ b/themes/default/css/jquery-ui-1.10.4.custom.min.css
@@ -0,0 +1,7 @@
1/*! jQuery UI - v1.10.4 - 2014-03-09
2* http://jqueryui.com
3* Includes: jquery.ui.core.css, jquery.ui.autocomplete.css, jquery.ui.menu.css, jquery.ui.theme.css
4* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=highlight_soft&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=glass&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
5* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
6
7.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width: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:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:2px;margin:0;display:block;outline:none}.ui-menu .ui-menu{margin-top:-3px;position:absolute}.ui-menu .ui-menu-item{margin:0;padding:0;width:100%;list-style-image:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)}.ui-menu .ui-menu-divider{margin:5px -2px 5px -2px;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-menu-item a{text-decoration:none;display:block;padding:2px .4em;line-height:1.5;min-height:0;font-weight:normal}.ui-menu .ui-menu-item a.ui-state-focus,.ui-menu .ui-menu-item a.ui-state-active{font-weight:normal;margin:-1px}.ui-menu .ui-state-disabled{font-weight:normal;margin:.4em 0 .2em;line-height:1.5}.ui-menu .ui-state-disabled a{cursor:default}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item a{position:relative;padding-left:2em}.ui-menu .ui-icon{position:absolute;top:.2em;left:.2em}.ui-menu .ui-menu-icon{position:static;float:right}.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 #aaa;background:#fff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x;color:#222}.ui-widget-content a{color:#222}.ui-widget-header{border:1px solid #aaa;background:#ccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x;color:#222;font-weight:bold}.ui-widget-header a{color:#222}.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:#555}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#555;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 #999;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,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited{color:#212121;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #aaa;background:#fff 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-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}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.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)}.ui-icon-blank{background-position:16px 16px}.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-on{background-position:-96px -144px}.ui-icon-radio-off{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{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}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:4px}.ui-widget-overlay{background:#aaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{margin:-8px 0 0 -8px;padding:8px;background:#aaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30);border-radius:8px} \ No newline at end of file
diff --git a/themes/default/css/style.css b/themes/default/css/style.css
index 28675907..e536ac6b 100644..100755
--- a/themes/default/css/style.css
+++ b/themes/default/css/style.css
@@ -347,3 +347,58 @@ a.reading-time span {
347 margin-left: -30px; 347 margin-left: -30px;
348} 348}
349 349
350.two-column {
351 display: block;
352 width: 50%;
353 paddig-right: 20px;
354 float: left;
355 vertical-align: top;
356}
357
358
359/* ==========================================================================
360 "save a link" popup div related styles
361 ========================================================================== */
362
363#bagit-form {
364 display: none;
365 padding-left: 30px;
366 width: 450px;
367
368}
369
370a#bagit-form-close {
371 color: #FFF;
372 display: inline-block;
373 float: right;
374 background: url("../img/messages/close.png") no-repeat scroll 0 0 rgba(0, 0, 0, 0);
375 height: 16px;
376 margin: -14px -8px 0 0;
377 width: 16px;
378 text-decoration: none;
379}
380
381
382.add-to-wallabag-link-after {
383 background-color: #000;
384 color: #fff;
385 padding: 0 4px 1px 3px;
386 font-weight: bold;
387 font-size: 0.7em;
388 border-radius: 4px;
389}
390.add-to-wallabag-link-after:hover, .add-to-wallabag-link-after:active {
391 color: #fff;
392}
393.add-to-wallabag-link-after:visited {
394 color: #999;
395}
396
397#add-link-result {
398 display: inline;
399 padding-left: 10px;
400}
401
402.opacity03 {
403 /*opacity: 0.3;*/
404}
diff --git a/themes/default/edit-tags.twig b/themes/default/edit-tags.twig
index 83f04aa0..bd498d26 100644..100755
--- a/themes/default/edit-tags.twig
+++ b/themes/default/edit-tags.twig
@@ -5,6 +5,10 @@
5{% endblock %} 5{% endblock %}
6{% block content %} 6{% block content %}
7 7
8<script src="{{ poche_url }}themes/default/js/jquery-ui-1.10.4.custom.min.js"></script>
9<script src="{{ poche_url }}themes/default/js/autoCompleteTags.js"></script>
10<link rel="stylesheet" href="{{ poche_url }}themes/default/css/jquery-ui-1.10.4.custom.min.css" media="all">
11
8<div id="article"> 12<div id="article">
9 <header class="mbm"> 13 <header class="mbm">
10 <h1>{{ entry.title|raw }}</h1> 14 <h1>{{ entry.title|raw }}</h1>
@@ -17,13 +21,15 @@ no tags
17<ul> 21<ul>
18{% for tag in tags %}<li>{{ tag.value }} <a href="./?action=remove_tag&amp;tag_id={{ tag.id }}&amp;id={{ entry_id }}">✘</a></li>{% endfor %} 22{% for tag in tags %}<li>{{ tag.value }} <a href="./?action=remove_tag&amp;tag_id={{ tag.id }}&amp;id={{ entry_id }}">✘</a></li>{% endfor %}
19</ul> 23</ul>
20<form method="post" action="./?action=add_tag"> 24<form method="post" action="./?action=add_tag" id="editTags">
21 <input type="hidden" name="entry_id" value="{{ entry_id }}" /> 25 <input type="hidden" name="entry_id" value="{{ entry_id }}" />
22 <label for="value">Add tags: </label> 26 <label for="value">Add tags: </label>
23 <input type="text" placeholder="interview, editorial, video" id="value" name="value" required="required" /> 27 <input type="text" placeholder="interview, editorial, video" id="value" name="value" required="required" />
24 <input type="submit" value="Tag" /> 28 <input type="submit" value="Tag" />
25 <p>{% trans "You can enter multiple tags, separated by commas." %}</p> 29 <p>{% trans "Start typing for auto complete." %}<br>
30 {% trans "You can enter multiple tags, separated by commas." %}</p>
26 31
27</form> 32</form>
33<br>
28<a href="./?view=view&id={{ entry_id }}">&laquo; {% trans "return to article" %}</a> 34<a href="./?view=view&id={{ entry_id }}">&laquo; {% trans "return to article" %}</a>
29{% endblock %} 35{% endblock %}
diff --git a/themes/default/home.twig b/themes/default/home.twig
index 165fecc6..d6cb98e8 100644..100755
--- a/themes/default/home.twig
+++ b/themes/default/home.twig
@@ -12,14 +12,15 @@
12{% include '_menu.twig' %} 12{% include '_menu.twig' %}
13{% endblock %} 13{% endblock %}
14{% block precontent %} 14{% block precontent %}
15 {% if entries|length > 1 %} 15
16 <ul id="sort"> 16{% include '_sorting.twig' %}
17 <li><a href="./?sort=ia&amp;view={{ view }}&amp;id={{ id }}"><img src="{{ poche_url }}/themes/{{ theme }}/img/{{ theme }}/top.png" alt="{% trans "by date asc" %}" title="{% trans "by date asc" %}" /></a> {% trans "by date" %} <a href="./?sort=id&amp;view={{ view }}&amp;id={{ id }}"><img src="{{ poche_url }}/themes/{{ theme }}/img/{{ theme }}/down.png" alt="{% trans "by date desc" %}" title="{% trans "by date desc" %}" /></a></li>
18 <li><a href="./?sort=ta&amp;view={{ view }}&amp;id={{ id }}"><img src="{{ poche_url }}/themes/{{ theme }}/img/{{ theme }}/top.png" alt="{% trans "by title asc" %}" title="{% trans "by title asc" %}" /></a> {% trans "by title" %} <a href="./?sort=td&amp;view={{ view }}&amp;id={{ id }}"><img src="{{ poche_url }}/themes/{{ theme }}/img/{{ theme }}/down.png" alt="{% trans "by title desc" %}" title="{% trans "by title desc" %}" /></a></li>
19 </ul>
20 {% endif %}
21{% endblock %} 17{% endblock %}
22{% block content %} 18{% block content %}
19
20 {% if includeImport %}
21 {% include '_import.twig' %}
22 {% endif %}
23
23 {% if tag %} 24 {% if tag %}
24 <h3>{% trans "Tag" %}: <b>{{ tag.value }}</b></h3> 25 <h3>{% trans "Tag" %}: <b>{{ tag.value }}</b></h3>
25 {% endif %} 26 {% endif %}
@@ -30,9 +31,15 @@
30 {% block pager %} 31 {% block pager %}
31 {% if nb_results > 1 %} 32 {% if nb_results > 1 %}
32 <div class="results"> 33 <div class="results">
33 <div class="nb-results">{{ nb_results }} {% trans "results" %}</div> 34 <div class="nb-results">{{ nb_results }} {% trans "results" %}{% if search_term is defined %}{% trans " found for « " %} {{ search_term }} »{% endif %}</div>
34 {{ page_links | raw }} 35 {{ page_links | raw }}
35 </div> 36 </div>
37 {% elseif nb_results == 1 %}
38 {% if search_term is defined %}
39 <div class="results">
40 <div class="nb-results">{% trans "Only one result found for " %} « {{ search_term }} »</div>
41 </div>
42 {% endif %}
36 {% endif %} 43 {% endif %}
37 {% endblock %} 44 {% endblock %}
38 {% for entry in entries %} 45 {% for entry in entries %}
diff --git a/themes/default/js/autoCompleteTags.js b/themes/default/js/autoCompleteTags.js
new file mode 100755
index 00000000..90bc982c
--- /dev/null
+++ b/themes/default/js/autoCompleteTags.js
@@ -0,0 +1,47 @@
1jQuery(function($) {
2
3 function split( val ) {
4 return val.split( /,\s*/ );
5 }
6 function extractLast( term ) {
7 return split( term ).pop();
8 }
9
10
11 $("#value").bind("keydown", function(event) {
12 if (event.keyCode === $.ui.keyCode.TAB && $(this).data("ui-autocomplete").menu.active) {
13 event.preventDefault();
14 }
15 }).autocomplete({
16 source : function(request, response) {
17 $.getJSON("./?view=tags", {
18 term : extractLast(request.term),
19 //id: $(':hidden#entry_id').val()
20 }, response);
21 },
22 search : function() {
23 // custom minLength
24 var term = extractLast(this.value);
25 if (term.length < 1) {
26 return false;
27 }
28 },
29 focus : function() {
30 // prevent value inserted on focus
31 return false;
32 },
33 select : function(event, ui) {
34 var terms = split(this.value);
35 // remove the current input
36 terms.pop();
37 // add the selected item
38 terms.push(ui.item.value);
39 // add placeholder to get the comma-and-space at the end
40 terms.push("");
41 this.value = terms.join(", ");
42 return false;
43 }
44 });
45
46
47});
diff --git a/themes/default/js/jquery-ui-1.10.4.custom.js b/themes/default/js/jquery-ui-1.10.4.custom.js
new file mode 100644
index 00000000..6f599fca
--- /dev/null
+++ b/themes/default/js/jquery-ui-1.10.4.custom.js
@@ -0,0 +1,2519 @@
1/*! jQuery UI - v1.10.4 - 2014-03-08
2* http://jqueryui.com
3* Includes: jquery.ui.core.js, jquery.ui.widget.js, jquery.ui.position.js, jquery.ui.autocomplete.js, jquery.ui.menu.js
4* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
5
6(function( $, undefined ) {
7
8var uuid = 0,
9 runiqueId = /^ui-id-\d+$/;
10
11// $.ui might exist from components with no dependencies, e.g., $.ui.position
12$.ui = $.ui || {};
13
14$.extend( $.ui, {
15 version: "1.10.4",
16
17 keyCode: {
18 BACKSPACE: 8,
19 COMMA: 188,
20 DELETE: 46,
21 DOWN: 40,
22 END: 35,
23 ENTER: 13,
24 ESCAPE: 27,
25 HOME: 36,
26 LEFT: 37,
27 NUMPAD_ADD: 107,
28 NUMPAD_DECIMAL: 110,
29 NUMPAD_DIVIDE: 111,
30 NUMPAD_ENTER: 108,
31 NUMPAD_MULTIPLY: 106,
32 NUMPAD_SUBTRACT: 109,
33 PAGE_DOWN: 34,
34 PAGE_UP: 33,
35 PERIOD: 190,
36 RIGHT: 39,
37 SPACE: 32,
38 TAB: 9,
39 UP: 38
40 }
41});
42
43// plugins
44$.fn.extend({
45 focus: (function( orig ) {
46 return function( delay, fn ) {
47 return typeof delay === "number" ?
48 this.each(function() {
49 var elem = this;
50 setTimeout(function() {
51 $( elem ).focus();
52 if ( fn ) {
53 fn.call( elem );
54 }
55 }, delay );
56 }) :
57 orig.apply( this, arguments );
58 };
59 })( $.fn.focus ),
60
61 scrollParent: function() {
62 var scrollParent;
63 if (($.ui.ie && (/(static|relative)/).test(this.css("position"))) || (/absolute/).test(this.css("position"))) {
64 scrollParent = this.parents().filter(function() {
65 return (/(relative|absolute|fixed)/).test($.css(this,"position")) && (/(auto|scroll)/).test($.css(this,"overflow")+$.css(this,"overflow-y")+$.css(this,"overflow-x"));
66 }).eq(0);
67 } else {
68 scrollParent = this.parents().filter(function() {
69 return (/(auto|scroll)/).test($.css(this,"overflow")+$.css(this,"overflow-y")+$.css(this,"overflow-x"));
70 }).eq(0);
71 }
72
73 return (/fixed/).test(this.css("position")) || !scrollParent.length ? $(document) : scrollParent;
74 },
75
76 zIndex: function( zIndex ) {
77 if ( zIndex !== undefined ) {
78 return this.css( "zIndex", zIndex );
79 }
80
81 if ( this.length ) {
82 var elem = $( this[ 0 ] ), position, value;
83 while ( elem.length && elem[ 0 ] !== document ) {
84 // Ignore z-index if position is set to a value where z-index is ignored by the browser
85 // This makes behavior of this function consistent across browsers
86 // WebKit always returns auto if the element is positioned
87 position = elem.css( "position" );
88 if ( position === "absolute" || position === "relative" || position === "fixed" ) {
89 // IE returns 0 when zIndex is not specified
90 // other browsers return a string
91 // we ignore the case of nested elements with an explicit value of 0
92 // <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
93 value = parseInt( elem.css( "zIndex" ), 10 );
94 if ( !isNaN( value ) && value !== 0 ) {
95 return value;
96 }
97 }
98 elem = elem.parent();
99 }
100 }
101
102 return 0;
103 },
104
105 uniqueId: function() {
106 return this.each(function() {
107 if ( !this.id ) {
108 this.id = "ui-id-" + (++uuid);
109 }
110 });
111 },
112
113 removeUniqueId: function() {
114 return this.each(function() {
115 if ( runiqueId.test( this.id ) ) {
116 $( this ).removeAttr( "id" );
117 }
118 });
119 }
120});
121
122// selectors
123function focusable( element, isTabIndexNotNaN ) {
124 var map, mapName, img,
125 nodeName = element.nodeName.toLowerCase();
126 if ( "area" === nodeName ) {
127 map = element.parentNode;
128 mapName = map.name;
129 if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
130 return false;
131 }
132 img = $( "img[usemap=#" + mapName + "]" )[0];
133 return !!img && visible( img );
134 }
135 return ( /input|select|textarea|button|object/.test( nodeName ) ?
136 !element.disabled :
137 "a" === nodeName ?
138 element.href || isTabIndexNotNaN :
139 isTabIndexNotNaN) &&
140 // the element and all of its ancestors must be visible
141 visible( element );
142}
143
144function visible( element ) {
145 return $.expr.filters.visible( element ) &&
146 !$( element ).parents().addBack().filter(function() {
147 return $.css( this, "visibility" ) === "hidden";
148 }).length;
149}
150
151$.extend( $.expr[ ":" ], {
152 data: $.expr.createPseudo ?
153 $.expr.createPseudo(function( dataName ) {
154 return function( elem ) {
155 return !!$.data( elem, dataName );
156 };
157 }) :
158 // support: jQuery <1.8
159 function( elem, i, match ) {
160 return !!$.data( elem, match[ 3 ] );
161 },
162
163 focusable: function( element ) {
164 return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) );
165 },
166
167 tabbable: function( element ) {
168 var tabIndex = $.attr( element, "tabindex" ),
169 isTabIndexNaN = isNaN( tabIndex );
170 return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN );
171 }
172});
173
174// support: jQuery <1.8
175if ( !$( "<a>" ).outerWidth( 1 ).jquery ) {
176 $.each( [ "Width", "Height" ], function( i, name ) {
177 var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ],
178 type = name.toLowerCase(),
179 orig = {
180 innerWidth: $.fn.innerWidth,
181 innerHeight: $.fn.innerHeight,
182 outerWidth: $.fn.outerWidth,
183 outerHeight: $.fn.outerHeight
184 };
185
186 function reduce( elem, size, border, margin ) {
187 $.each( side, function() {
188 size -= parseFloat( $.css( elem, "padding" + this ) ) || 0;
189 if ( border ) {
190 size -= parseFloat( $.css( elem, "border" + this + "Width" ) ) || 0;
191 }
192 if ( margin ) {
193 size -= parseFloat( $.css( elem, "margin" + this ) ) || 0;
194 }
195 });
196 return size;
197 }
198
199 $.fn[ "inner" + name ] = function( size ) {
200 if ( size === undefined ) {
201 return orig[ "inner" + name ].call( this );
202 }
203
204 return this.each(function() {
205 $( this ).css( type, reduce( this, size ) + "px" );
206 });
207 };
208
209 $.fn[ "outer" + name] = function( size, margin ) {
210 if ( typeof size !== "number" ) {
211 return orig[ "outer" + name ].call( this, size );
212 }
213
214 return this.each(function() {
215 $( this).css( type, reduce( this, size, true, margin ) + "px" );
216 });
217 };
218 });
219}
220
221// support: jQuery <1.8
222if ( !$.fn.addBack ) {
223 $.fn.addBack = function( selector ) {
224 return this.add( selector == null ?
225 this.prevObject : this.prevObject.filter( selector )
226 );
227 };
228}
229
230// support: jQuery 1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413)
231if ( $( "<a>" ).data( "a-b", "a" ).removeData( "a-b" ).data( "a-b" ) ) {
232 $.fn.removeData = (function( removeData ) {
233 return function( key ) {
234 if ( arguments.length ) {
235 return removeData.call( this, $.camelCase( key ) );
236 } else {
237 return removeData.call( this );
238 }
239 };
240 })( $.fn.removeData );
241}
242
243
244
245
246
247// deprecated
248$.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() );
249
250$.support.selectstart = "onselectstart" in document.createElement( "div" );
251$.fn.extend({
252 disableSelection: function() {
253 return this.bind( ( $.support.selectstart ? "selectstart" : "mousedown" ) +
254 ".ui-disableSelection", function( event ) {
255 event.preventDefault();
256 });
257 },
258
259 enableSelection: function() {
260 return this.unbind( ".ui-disableSelection" );
261 }
262});
263
264$.extend( $.ui, {
265 // $.ui.plugin is deprecated. Use $.widget() extensions instead.
266 plugin: {
267 add: function( module, option, set ) {
268 var i,
269 proto = $.ui[ module ].prototype;
270 for ( i in set ) {
271 proto.plugins[ i ] = proto.plugins[ i ] || [];
272 proto.plugins[ i ].push( [ option, set[ i ] ] );
273 }
274 },
275 call: function( instance, name, args ) {
276 var i,
277 set = instance.plugins[ name ];
278 if ( !set || !instance.element[ 0 ].parentNode || instance.element[ 0 ].parentNode.nodeType === 11 ) {
279 return;
280 }
281
282 for ( i = 0; i < set.length; i++ ) {
283 if ( instance.options[ set[ i ][ 0 ] ] ) {
284 set[ i ][ 1 ].apply( instance.element, args );
285 }
286 }
287 }
288 },
289
290 // only used by resizable
291 hasScroll: function( el, a ) {
292
293 //If overflow is hidden, the element might have extra content, but the user wants to hide it
294 if ( $( el ).css( "overflow" ) === "hidden") {
295 return false;
296 }
297
298 var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop",
299 has = false;
300
301 if ( el[ scroll ] > 0 ) {
302 return true;
303 }
304
305 // TODO: determine which cases actually cause this to happen
306 // if the element doesn't have the scroll set, see if it's possible to
307 // set the scroll
308 el[ scroll ] = 1;
309 has = ( el[ scroll ] > 0 );
310 el[ scroll ] = 0;
311 return has;
312 }
313});
314
315})( jQuery );
316(function( $, undefined ) {
317
318var uuid = 0,
319 slice = Array.prototype.slice,
320 _cleanData = $.cleanData;
321$.cleanData = function( elems ) {
322 for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
323 try {
324 $( elem ).triggerHandler( "remove" );
325 // http://bugs.jquery.com/ticket/8235
326 } catch( e ) {}
327 }
328 _cleanData( elems );
329};
330
331$.widget = function( name, base, prototype ) {
332 var fullName, existingConstructor, constructor, basePrototype,
333 // proxiedPrototype allows the provided prototype to remain unmodified
334 // so that it can be used as a mixin for multiple widgets (#8876)
335 proxiedPrototype = {},
336 namespace = name.split( "." )[ 0 ];
337
338 name = name.split( "." )[ 1 ];
339 fullName = namespace + "-" + name;
340
341 if ( !prototype ) {
342 prototype = base;
343 base = $.Widget;
344 }
345
346 // create selector for plugin
347 $.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) {
348 return !!$.data( elem, fullName );
349 };
350
351 $[ namespace ] = $[ namespace ] || {};
352 existingConstructor = $[ namespace ][ name ];
353 constructor = $[ namespace ][ name ] = function( options, element ) {
354 // allow instantiation without "new" keyword
355 if ( !this._createWidget ) {
356 return new constructor( options, element );
357 }
358
359 // allow instantiation without initializing for simple inheritance
360 // must use "new" keyword (the code above always passes args)
361 if ( arguments.length ) {
362 this._createWidget( options, element );
363 }
364 };
365 // extend with the existing constructor to carry over any static properties
366 $.extend( constructor, existingConstructor, {
367 version: prototype.version,
368 // copy the object used to create the prototype in case we need to
369 // redefine the widget later
370 _proto: $.extend( {}, prototype ),
371 // track widgets that inherit from this widget in case this widget is
372 // redefined after a widget inherits from it
373 _childConstructors: []
374 });
375
376 basePrototype = new base();
377 // we need to make the options hash a property directly on the new instance
378 // otherwise we'll modify the options hash on the prototype that we're
379 // inheriting from
380 basePrototype.options = $.widget.extend( {}, basePrototype.options );
381 $.each( prototype, function( prop, value ) {
382 if ( !$.isFunction( value ) ) {
383 proxiedPrototype[ prop ] = value;
384 return;
385 }
386 proxiedPrototype[ prop ] = (function() {
387 var _super = function() {
388 return base.prototype[ prop ].apply( this, arguments );
389 },
390 _superApply = function( args ) {
391 return base.prototype[ prop ].apply( this, args );
392 };
393 return function() {
394 var __super = this._super,
395 __superApply = this._superApply,
396 returnValue;
397
398 this._super = _super;
399 this._superApply = _superApply;
400
401 returnValue = value.apply( this, arguments );
402
403 this._super = __super;
404 this._superApply = __superApply;
405
406 return returnValue;
407 };
408 })();
409 });
410 constructor.prototype = $.widget.extend( basePrototype, {
411 // TODO: remove support for widgetEventPrefix
412 // always use the name + a colon as the prefix, e.g., draggable:start
413 // don't prefix for widgets that aren't DOM-based
414 widgetEventPrefix: existingConstructor ? (basePrototype.widgetEventPrefix || name) : name
415 }, proxiedPrototype, {
416 constructor: constructor,
417 namespace: namespace,
418 widgetName: name,
419 widgetFullName: fullName
420 });
421
422 // If this widget is being redefined then we need to find all widgets that
423 // are inheriting from it and redefine all of them so that they inherit from
424 // the new version of this widget. We're essentially trying to replace one
425 // level in the prototype chain.
426 if ( existingConstructor ) {
427 $.each( existingConstructor._childConstructors, function( i, child ) {
428 var childPrototype = child.prototype;
429
430 // redefine the child widget using the same prototype that was
431 // originally used, but inherit from the new version of the base
432 $.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto );
433 });
434 // remove the list of existing child constructors from the old constructor
435 // so the old child constructors can be garbage collected
436 delete existingConstructor._childConstructors;
437 } else {
438 base._childConstructors.push( constructor );
439 }
440
441 $.widget.bridge( name, constructor );
442};
443
444$.widget.extend = function( target ) {
445 var input = slice.call( arguments, 1 ),
446 inputIndex = 0,
447 inputLength = input.length,
448 key,
449 value;
450 for ( ; inputIndex < inputLength; inputIndex++ ) {
451 for ( key in input[ inputIndex ] ) {
452 value = input[ inputIndex ][ key ];
453 if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {
454 // Clone objects
455 if ( $.isPlainObject( value ) ) {
456 target[ key ] = $.isPlainObject( target[ key ] ) ?
457 $.widget.extend( {}, target[ key ], value ) :
458 // Don't extend strings, arrays, etc. with objects
459 $.widget.extend( {}, value );
460 // Copy everything else by reference
461 } else {
462 target[ key ] = value;
463 }
464 }
465 }
466 }
467 return target;
468};
469
470$.widget.bridge = function( name, object ) {
471 var fullName = object.prototype.widgetFullName || name;
472 $.fn[ name ] = function( options ) {
473 var isMethodCall = typeof options === "string",
474 args = slice.call( arguments, 1 ),
475 returnValue = this;
476
477 // allow multiple hashes to be passed on init
478 options = !isMethodCall && args.length ?
479 $.widget.extend.apply( null, [ options ].concat(args) ) :
480 options;
481
482 if ( isMethodCall ) {
483 this.each(function() {
484 var methodValue,
485 instance = $.data( this, fullName );
486 if ( !instance ) {
487 return $.error( "cannot call methods on " + name + " prior to initialization; " +
488 "attempted to call method '" + options + "'" );
489 }
490 if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) {
491 return $.error( "no such method '" + options + "' for " + name + " widget instance" );
492 }
493 methodValue = instance[ options ].apply( instance, args );
494 if ( methodValue !== instance && methodValue !== undefined ) {
495 returnValue = methodValue && methodValue.jquery ?
496 returnValue.pushStack( methodValue.get() ) :
497 methodValue;
498 return false;
499 }
500 });
501 } else {
502 this.each(function() {
503 var instance = $.data( this, fullName );
504 if ( instance ) {
505 instance.option( options || {} )._init();
506 } else {
507 $.data( this, fullName, new object( options, this ) );
508 }
509 });
510 }
511
512 return returnValue;
513 };
514};
515
516$.Widget = function( /* options, element */ ) {};
517$.Widget._childConstructors = [];
518
519$.Widget.prototype = {
520 widgetName: "widget",
521 widgetEventPrefix: "",
522 defaultElement: "<div>",
523 options: {
524 disabled: false,
525
526 // callbacks
527 create: null
528 },
529 _createWidget: function( options, element ) {
530 element = $( element || this.defaultElement || this )[ 0 ];
531 this.element = $( element );
532 this.uuid = uuid++;
533 this.eventNamespace = "." + this.widgetName + this.uuid;
534 this.options = $.widget.extend( {},
535 this.options,
536 this._getCreateOptions(),
537 options );
538
539 this.bindings = $();
540 this.hoverable = $();
541 this.focusable = $();
542
543 if ( element !== this ) {
544 $.data( element, this.widgetFullName, this );
545 this._on( true, this.element, {
546 remove: function( event ) {
547 if ( event.target === element ) {
548 this.destroy();
549 }
550 }
551 });
552 this.document = $( element.style ?
553 // element within the document
554 element.ownerDocument :
555 // element is window or document
556 element.document || element );
557 this.window = $( this.document[0].defaultView || this.document[0].parentWindow );
558 }
559
560 this._create();
561 this._trigger( "create", null, this._getCreateEventData() );
562 this._init();
563 },
564 _getCreateOptions: $.noop,
565 _getCreateEventData: $.noop,
566 _create: $.noop,
567 _init: $.noop,
568
569 destroy: function() {
570 this._destroy();
571 // we can probably remove the unbind calls in 2.0
572 // all event bindings should go through this._on()
573 this.element
574 .unbind( this.eventNamespace )
575 // 1.9 BC for #7810
576 // TODO remove dual storage
577 .removeData( this.widgetName )
578 .removeData( this.widgetFullName )
579 // support: jquery <1.6.3
580 // http://bugs.jquery.com/ticket/9413
581 .removeData( $.camelCase( this.widgetFullName ) );
582 this.widget()
583 .unbind( this.eventNamespace )
584 .removeAttr( "aria-disabled" )
585 .removeClass(
586 this.widgetFullName + "-disabled " +
587 "ui-state-disabled" );
588
589 // clean up events and states
590 this.bindings.unbind( this.eventNamespace );
591 this.hoverable.removeClass( "ui-state-hover" );
592 this.focusable.removeClass( "ui-state-focus" );
593 },
594 _destroy: $.noop,
595
596 widget: function() {
597 return this.element;
598 },
599
600 option: function( key, value ) {
601 var options = key,
602 parts,
603 curOption,
604 i;
605
606 if ( arguments.length === 0 ) {
607 // don't return a reference to the internal hash
608 return $.widget.extend( {}, this.options );
609 }
610
611 if ( typeof key === "string" ) {
612 // handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
613 options = {};
614 parts = key.split( "." );
615 key = parts.shift();
616 if ( parts.length ) {
617 curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );
618 for ( i = 0; i < parts.length - 1; i++ ) {
619 curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};
620 curOption = curOption[ parts[ i ] ];
621 }
622 key = parts.pop();
623 if ( arguments.length === 1 ) {
624 return curOption[ key ] === undefined ? null : curOption[ key ];
625 }
626 curOption[ key ] = value;
627 } else {
628 if ( arguments.length === 1 ) {
629 return this.options[ key ] === undefined ? null : this.options[ key ];
630 }
631 options[ key ] = value;
632 }
633 }
634
635 this._setOptions( options );
636
637 return this;
638 },
639 _setOptions: function( options ) {
640 var key;
641
642 for ( key in options ) {
643 this._setOption( key, options[ key ] );
644 }
645
646 return this;
647 },
648 _setOption: function( key, value ) {
649 this.options[ key ] = value;
650
651 if ( key === "disabled" ) {
652 this.widget()
653 .toggleClass( this.widgetFullName + "-disabled ui-state-disabled", !!value )
654 .attr( "aria-disabled", value );
655 this.hoverable.removeClass( "ui-state-hover" );
656 this.focusable.removeClass( "ui-state-focus" );
657 }
658
659 return this;
660 },
661
662 enable: function() {
663 return this._setOption( "disabled", false );
664 },
665 disable: function() {
666 return this._setOption( "disabled", true );
667 },
668
669 _on: function( suppressDisabledCheck, element, handlers ) {
670 var delegateElement,
671 instance = this;
672
673 // no suppressDisabledCheck flag, shuffle arguments
674 if ( typeof suppressDisabledCheck !== "boolean" ) {
675 handlers = element;
676 element = suppressDisabledCheck;
677 suppressDisabledCheck = false;
678 }
679
680 // no element argument, shuffle and use this.element
681 if ( !handlers ) {
682 handlers = element;
683 element = this.element;
684 delegateElement = this.widget();
685 } else {
686 // accept selectors, DOM elements
687 element = delegateElement = $( element );
688 this.bindings = this.bindings.add( element );
689 }
690
691 $.each( handlers, function( event, handler ) {
692 function handlerProxy() {
693 // allow widgets to customize the disabled handling
694 // - disabled as an array instead of boolean
695 // - disabled class as method for disabling individual parts
696 if ( !suppressDisabledCheck &&
697 ( instance.options.disabled === true ||
698 $( this ).hasClass( "ui-state-disabled" ) ) ) {
699 return;
700 }
701 return ( typeof handler === "string" ? instance[ handler ] : handler )
702 .apply( instance, arguments );
703 }
704
705 // copy the guid so direct unbinding works
706 if ( typeof handler !== "string" ) {
707 handlerProxy.guid = handler.guid =
708 handler.guid || handlerProxy.guid || $.guid++;
709 }
710
711 var match = event.match( /^(\w+)\s*(.*)$/ ),
712 eventName = match[1] + instance.eventNamespace,
713 selector = match[2];
714 if ( selector ) {
715 delegateElement.delegate( selector, eventName, handlerProxy );
716 } else {
717 element.bind( eventName, handlerProxy );
718 }
719 });
720 },
721
722 _off: function( element, eventName ) {
723 eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) + this.eventNamespace;
724 element.unbind( eventName ).undelegate( eventName );
725 },
726
727 _delay: function( handler, delay ) {
728 function handlerProxy() {
729 return ( typeof handler === "string" ? instance[ handler ] : handler )
730 .apply( instance, arguments );
731 }
732 var instance = this;
733 return setTimeout( handlerProxy, delay || 0 );
734 },
735
736 _hoverable: function( element ) {
737 this.hoverable = this.hoverable.add( element );
738 this._on( element, {
739 mouseenter: function( event ) {
740 $( event.currentTarget ).addClass( "ui-state-hover" );
741 },
742 mouseleave: function( event ) {
743 $( event.currentTarget ).removeClass( "ui-state-hover" );
744 }
745 });
746 },
747
748 _focusable: function( element ) {
749 this.focusable = this.focusable.add( element );
750 this._on( element, {
751 focusin: function( event ) {
752 $( event.currentTarget ).addClass( "ui-state-focus" );
753 },
754 focusout: function( event ) {
755 $( event.currentTarget ).removeClass( "ui-state-focus" );
756 }
757 });
758 },
759
760 _trigger: function( type, event, data ) {
761 var prop, orig,
762 callback = this.options[ type ];
763
764 data = data || {};
765 event = $.Event( event );
766 event.type = ( type === this.widgetEventPrefix ?
767 type :
768 this.widgetEventPrefix + type ).toLowerCase();
769 // the original event may come from any element
770 // so we need to reset the target on the new event
771 event.target = this.element[ 0 ];
772
773 // copy original event properties over to the new event
774 orig = event.originalEvent;
775 if ( orig ) {
776 for ( prop in orig ) {
777 if ( !( prop in event ) ) {
778 event[ prop ] = orig[ prop ];
779 }
780 }
781 }
782
783 this.element.trigger( event, data );
784 return !( $.isFunction( callback ) &&
785 callback.apply( this.element[0], [ event ].concat( data ) ) === false ||
786 event.isDefaultPrevented() );
787 }
788};
789
790$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) {
791 $.Widget.prototype[ "_" + method ] = function( element, options, callback ) {
792 if ( typeof options === "string" ) {
793 options = { effect: options };
794 }
795 var hasOptions,
796 effectName = !options ?
797 method :
798 options === true || typeof options === "number" ?
799 defaultEffect :
800 options.effect || defaultEffect;
801 options = options || {};
802 if ( typeof options === "number" ) {
803 options = { duration: options };
804 }
805 hasOptions = !$.isEmptyObject( options );
806 options.complete = callback;
807 if ( options.delay ) {
808 element.delay( options.delay );
809 }
810 if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {
811 element[ method ]( options );
812 } else if ( effectName !== method && element[ effectName ] ) {
813 element[ effectName ]( options.duration, options.easing, callback );
814 } else {
815 element.queue(function( next ) {
816 $( this )[ method ]();
817 if ( callback ) {
818 callback.call( element[ 0 ] );
819 }
820 next();
821 });
822 }
823 };
824});
825
826})( jQuery );
827(function( $, undefined ) {
828
829$.ui = $.ui || {};
830
831var cachedScrollbarWidth,
832 max = Math.max,
833 abs = Math.abs,
834 round = Math.round,
835 rhorizontal = /left|center|right/,
836 rvertical = /top|center|bottom/,
837 roffset = /[\+\-]\d+(\.[\d]+)?%?/,
838 rposition = /^\w+/,
839 rpercent = /%$/,
840 _position = $.fn.position;
841
842function getOffsets( offsets, width, height ) {
843 return [
844 parseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ),
845 parseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 )
846 ];
847}
848
849function parseCss( element, property ) {
850 return parseInt( $.css( element, property ), 10 ) || 0;
851}
852
853function getDimensions( elem ) {
854 var raw = elem[0];
855 if ( raw.nodeType === 9 ) {
856 return {
857 width: elem.width(),
858 height: elem.height(),
859 offset: { top: 0, left: 0 }
860 };
861 }
862 if ( $.isWindow( raw ) ) {
863 return {
864 width: elem.width(),
865 height: elem.height(),
866 offset: { top: elem.scrollTop(), left: elem.scrollLeft() }
867 };
868 }
869 if ( raw.preventDefault ) {
870 return {
871 width: 0,
872 height: 0,
873 offset: { top: raw.pageY, left: raw.pageX }
874 };
875 }
876 return {
877 width: elem.outerWidth(),
878 height: elem.outerHeight(),
879 offset: elem.offset()
880 };
881}
882
883$.position = {
884 scrollbarWidth: function() {
885 if ( cachedScrollbarWidth !== undefined ) {
886 return cachedScrollbarWidth;
887 }
888 var w1, w2,
889 div = $( "<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>" ),
890 innerDiv = div.children()[0];
891
892 $( "body" ).append( div );
893 w1 = innerDiv.offsetWidth;
894 div.css( "overflow", "scroll" );
895
896 w2 = innerDiv.offsetWidth;
897
898 if ( w1 === w2 ) {
899 w2 = div[0].clientWidth;
900 }
901
902 div.remove();
903
904 return (cachedScrollbarWidth = w1 - w2);
905 },
906 getScrollInfo: function( within ) {
907 var overflowX = within.isWindow || within.isDocument ? "" :
908 within.element.css( "overflow-x" ),
909 overflowY = within.isWindow || within.isDocument ? "" :
910 within.element.css( "overflow-y" ),
911 hasOverflowX = overflowX === "scroll" ||
912 ( overflowX === "auto" && within.width < within.element[0].scrollWidth ),
913 hasOverflowY = overflowY === "scroll" ||
914 ( overflowY === "auto" && within.height < within.element[0].scrollHeight );
915 return {
916 width: hasOverflowY ? $.position.scrollbarWidth() : 0,
917 height: hasOverflowX ? $.position.scrollbarWidth() : 0
918 };
919 },
920 getWithinInfo: function( element ) {
921 var withinElement = $( element || window ),
922 isWindow = $.isWindow( withinElement[0] ),
923 isDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9;
924 return {
925 element: withinElement,
926 isWindow: isWindow,
927 isDocument: isDocument,
928 offset: withinElement.offset() || { left: 0, top: 0 },
929 scrollLeft: withinElement.scrollLeft(),
930 scrollTop: withinElement.scrollTop(),
931 width: isWindow ? withinElement.width() : withinElement.outerWidth(),
932 height: isWindow ? withinElement.height() : withinElement.outerHeight()
933 };
934 }
935};
936
937$.fn.position = function( options ) {
938 if ( !options || !options.of ) {
939 return _position.apply( this, arguments );
940 }
941
942 // make a copy, we don't want to modify arguments
943 options = $.extend( {}, options );
944
945 var atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions,
946 target = $( options.of ),
947 within = $.position.getWithinInfo( options.within ),
948 scrollInfo = $.position.getScrollInfo( within ),
949 collision = ( options.collision || "flip" ).split( " " ),
950 offsets = {};
951
952 dimensions = getDimensions( target );
953 if ( target[0].preventDefault ) {
954 // force left top to allow flipping
955 options.at = "left top";
956 }
957 targetWidth = dimensions.width;
958 targetHeight = dimensions.height;
959 targetOffset = dimensions.offset;
960 // clone to reuse original targetOffset later
961 basePosition = $.extend( {}, targetOffset );
962
963 // force my and at to have valid horizontal and vertical positions
964 // if a value is missing or invalid, it will be converted to center
965 $.each( [ "my", "at" ], function() {
966 var pos = ( options[ this ] || "" ).split( " " ),
967 horizontalOffset,
968 verticalOffset;
969
970 if ( pos.length === 1) {
971 pos = rhorizontal.test( pos[ 0 ] ) ?
972 pos.concat( [ "center" ] ) :
973 rvertical.test( pos[ 0 ] ) ?
974 [ "center" ].concat( pos ) :
975 [ "center", "center" ];
976 }
977 pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center";
978 pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center";
979
980 // calculate offsets
981 horizontalOffset = roffset.exec( pos[ 0 ] );
982 verticalOffset = roffset.exec( pos[ 1 ] );
983 offsets[ this ] = [
984 horizontalOffset ? horizontalOffset[ 0 ] : 0,
985 verticalOffset ? verticalOffset[ 0 ] : 0
986 ];
987
988 // reduce to just the positions without the offsets
989 options[ this ] = [
990 rposition.exec( pos[ 0 ] )[ 0 ],
991 rposition.exec( pos[ 1 ] )[ 0 ]
992 ];
993 });
994
995 // normalize collision option
996 if ( collision.length === 1 ) {
997 collision[ 1 ] = collision[ 0 ];
998 }
999
1000 if ( options.at[ 0 ] === "right" ) {
1001 basePosition.left += targetWidth;
1002 } else if ( options.at[ 0 ] === "center" ) {
1003 basePosition.left += targetWidth / 2;
1004 }
1005
1006 if ( options.at[ 1 ] === "bottom" ) {
1007 basePosition.top += targetHeight;
1008 } else if ( options.at[ 1 ] === "center" ) {
1009 basePosition.top += targetHeight / 2;
1010 }
1011
1012 atOffset = getOffsets( offsets.at, targetWidth, targetHeight );
1013 basePosition.left += atOffset[ 0 ];
1014 basePosition.top += atOffset[ 1 ];
1015
1016 return this.each(function() {
1017 var collisionPosition, using,
1018 elem = $( this ),
1019 elemWidth = elem.outerWidth(),
1020 elemHeight = elem.outerHeight(),
1021 marginLeft = parseCss( this, "marginLeft" ),
1022 marginTop = parseCss( this, "marginTop" ),
1023 collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) + scrollInfo.width,
1024 collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" ) + scrollInfo.height,
1025 position = $.extend( {}, basePosition ),
1026 myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() );
1027
1028 if ( options.my[ 0 ] === "right" ) {
1029 position.left -= elemWidth;
1030 } else if ( options.my[ 0 ] === "center" ) {
1031 position.left -= elemWidth / 2;
1032 }
1033
1034 if ( options.my[ 1 ] === "bottom" ) {
1035 position.top -= elemHeight;
1036 } else if ( options.my[ 1 ] === "center" ) {
1037 position.top -= elemHeight / 2;
1038 }
1039
1040 position.left += myOffset[ 0 ];
1041 position.top += myOffset[ 1 ];
1042
1043 // if the browser doesn't support fractions, then round for consistent results
1044 if ( !$.support.offsetFractions ) {
1045 position.left = round( position.left );
1046 position.top = round( position.top );
1047 }
1048
1049 collisionPosition = {
1050 marginLeft: marginLeft,
1051 marginTop: marginTop
1052 };
1053
1054 $.each( [ "left", "top" ], function( i, dir ) {
1055 if ( $.ui.position[ collision[ i ] ] ) {
1056 $.ui.position[ collision[ i ] ][ dir ]( position, {
1057 targetWidth: targetWidth,
1058 targetHeight: targetHeight,
1059 elemWidth: elemWidth,
1060 elemHeight: elemHeight,
1061 collisionPosition: collisionPosition,
1062 collisionWidth: collisionWidth,
1063 collisionHeight: collisionHeight,
1064 offset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ],
1065 my: options.my,
1066 at: options.at,
1067 within: within,
1068 elem : elem
1069 });
1070 }
1071 });
1072
1073 if ( options.using ) {
1074 // adds feedback as second argument to using callback, if present
1075 using = function( props ) {
1076 var left = targetOffset.left - position.left,
1077 right = left + targetWidth - elemWidth,
1078 top = targetOffset.top - position.top,
1079 bottom = top + targetHeight - elemHeight,
1080 feedback = {
1081 target: {
1082 element: target,
1083 left: targetOffset.left,
1084 top: targetOffset.top,
1085 width: targetWidth,
1086 height: targetHeight
1087 },
1088 element: {
1089 element: elem,
1090 left: position.left,
1091 top: position.top,
1092 width: elemWidth,
1093 height: elemHeight
1094 },
1095 horizontal: right < 0 ? "left" : left > 0 ? "right" : "center",
1096 vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle"
1097 };
1098 if ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) {
1099 feedback.horizontal = "center";
1100 }
1101 if ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) {
1102 feedback.vertical = "middle";
1103 }
1104 if ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) {
1105 feedback.important = "horizontal";
1106 } else {
1107 feedback.important = "vertical";
1108 }
1109 options.using.call( this, props, feedback );
1110 };
1111 }
1112
1113 elem.offset( $.extend( position, { using: using } ) );
1114 });
1115};
1116
1117$.ui.position = {
1118 fit: {
1119 left: function( position, data ) {
1120 var within = data.within,
1121 withinOffset = within.isWindow ? within.scrollLeft : within.offset.left,
1122 outerWidth = within.width,
1123 collisionPosLeft = position.left - data.collisionPosition.marginLeft,
1124 overLeft = withinOffset - collisionPosLeft,
1125 overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset,
1126 newOverRight;
1127
1128 // element is wider than within
1129 if ( data.collisionWidth > outerWidth ) {
1130 // element is initially over the left side of within
1131 if ( overLeft > 0 && overRight <= 0 ) {
1132 newOverRight = position.left + overLeft + data.collisionWidth - outerWidth - withinOffset;
1133 position.left += overLeft - newOverRight;
1134 // element is initially over right side of within
1135 } else if ( overRight > 0 && overLeft <= 0 ) {
1136 position.left = withinOffset;
1137 // element is initially over both left and right sides of within
1138 } else {
1139 if ( overLeft > overRight ) {
1140 position.left = withinOffset + outerWidth - data.collisionWidth;
1141 } else {
1142 position.left = withinOffset;
1143 }
1144 }
1145 // too far left -> align with left edge
1146 } else if ( overLeft > 0 ) {
1147 position.left += overLeft;
1148 // too far right -> align with right edge
1149 } else if ( overRight > 0 ) {
1150 position.left -= overRight;
1151 // adjust based on position and margin
1152 } else {
1153 position.left = max( position.left - collisionPosLeft, position.left );
1154 }
1155 },
1156 top: function( position, data ) {
1157 var within = data.within,
1158 withinOffset = within.isWindow ? within.scrollTop : within.offset.top,
1159 outerHeight = data.within.height,
1160 collisionPosTop = position.top - data.collisionPosition.marginTop,
1161 overTop = withinOffset - collisionPosTop,
1162 overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset,
1163 newOverBottom;
1164
1165 // element is taller than within
1166 if ( data.collisionHeight > outerHeight ) {
1167 // element is initially over the top of within
1168 if ( overTop > 0 && overBottom <= 0 ) {
1169 newOverBottom = position.top + overTop + data.collisionHeight - outerHeight - withinOffset;
1170 position.top += overTop - newOverBottom;
1171 // element is initially over bottom of within
1172 } else if ( overBottom > 0 && overTop <= 0 ) {
1173 position.top = withinOffset;
1174 // element is initially over both top and bottom of within
1175 } else {
1176 if ( overTop > overBottom ) {
1177 position.top = withinOffset + outerHeight - data.collisionHeight;
1178 } else {
1179 position.top = withinOffset;
1180 }
1181 }
1182 // too far up -> align with top
1183 } else if ( overTop > 0 ) {
1184 position.top += overTop;
1185 // too far down -> align with bottom edge
1186 } else if ( overBottom > 0 ) {
1187 position.top -= overBottom;
1188 // adjust based on position and margin
1189 } else {
1190 position.top = max( position.top - collisionPosTop, position.top );
1191 }
1192 }
1193 },
1194 flip: {
1195 left: function( position, data ) {
1196 var within = data.within,
1197 withinOffset = within.offset.left + within.scrollLeft,
1198 outerWidth = within.width,
1199 offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left,
1200 collisionPosLeft = position.left - data.collisionPosition.marginLeft,
1201 overLeft = collisionPosLeft - offsetLeft,
1202 overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft,
1203 myOffset = data.my[ 0 ] === "left" ?
1204 -data.elemWidth :
1205 data.my[ 0 ] === "right" ?
1206 data.elemWidth :
1207 0,
1208 atOffset = data.at[ 0 ] === "left" ?
1209 data.targetWidth :
1210 data.at[ 0 ] === "right" ?
1211 -data.targetWidth :
1212 0,
1213 offset = -2 * data.offset[ 0 ],
1214 newOverRight,
1215 newOverLeft;
1216
1217 if ( overLeft < 0 ) {
1218 newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth - outerWidth - withinOffset;
1219 if ( newOverRight < 0 || newOverRight < abs( overLeft ) ) {
1220 position.left += myOffset + atOffset + offset;
1221 }
1222 }
1223 else if ( overRight > 0 ) {
1224 newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset + atOffset + offset - offsetLeft;
1225 if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) {
1226 position.left += myOffset + atOffset + offset;
1227 }
1228 }
1229 },
1230 top: function( position, data ) {
1231 var within = data.within,
1232 withinOffset = within.offset.top + within.scrollTop,
1233 outerHeight = within.height,
1234 offsetTop = within.isWindow ? within.scrollTop : within.offset.top,
1235 collisionPosTop = position.top - data.collisionPosition.marginTop,
1236 overTop = collisionPosTop - offsetTop,
1237 overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop,
1238 top = data.my[ 1 ] === "top",
1239 myOffset = top ?
1240 -data.elemHeight :
1241 data.my[ 1 ] === "bottom" ?
1242 data.elemHeight :
1243 0,
1244 atOffset = data.at[ 1 ] === "top" ?
1245 data.targetHeight :
1246 data.at[ 1 ] === "bottom" ?
1247 -data.targetHeight :
1248 0,
1249 offset = -2 * data.offset[ 1 ],
1250 newOverTop,
1251 newOverBottom;
1252 if ( overTop < 0 ) {
1253 newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight - outerHeight - withinOffset;
1254 if ( ( position.top + myOffset + atOffset + offset) > overTop && ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) ) {
1255 position.top += myOffset + atOffset + offset;
1256 }
1257 }
1258 else if ( overBottom > 0 ) {
1259 newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset + offset - offsetTop;
1260 if ( ( position.top + myOffset + atOffset + offset) > overBottom && ( newOverTop > 0 || abs( newOverTop ) < overBottom ) ) {
1261 position.top += myOffset + atOffset + offset;
1262 }
1263 }
1264 }
1265 },
1266 flipfit: {
1267 left: function() {
1268 $.ui.position.flip.left.apply( this, arguments );
1269 $.ui.position.fit.left.apply( this, arguments );
1270 },
1271 top: function() {
1272 $.ui.position.flip.top.apply( this, arguments );
1273 $.ui.position.fit.top.apply( this, arguments );
1274 }
1275 }
1276};
1277
1278// fraction support test
1279(function () {
1280 var testElement, testElementParent, testElementStyle, offsetLeft, i,
1281 body = document.getElementsByTagName( "body" )[ 0 ],
1282 div = document.createElement( "div" );
1283
1284 //Create a "fake body" for testing based on method used in jQuery.support
1285 testElement = document.createElement( body ? "div" : "body" );
1286 testElementStyle = {
1287 visibility: "hidden",
1288 width: 0,
1289 height: 0,
1290 border: 0,
1291 margin: 0,
1292 background: "none"
1293 };
1294 if ( body ) {
1295 $.extend( testElementStyle, {
1296 position: "absolute",
1297 left: "-1000px",
1298 top: "-1000px"
1299 });
1300 }
1301 for ( i in testElementStyle ) {
1302 testElement.style[ i ] = testElementStyle[ i ];
1303 }
1304 testElement.appendChild( div );
1305 testElementParent = body || document.documentElement;
1306 testElementParent.insertBefore( testElement, testElementParent.firstChild );
1307
1308 div.style.cssText = "position: absolute; left: 10.7432222px;";
1309
1310 offsetLeft = $( div ).offset().left;
1311 $.support.offsetFractions = offsetLeft > 10 && offsetLeft < 11;
1312
1313 testElement.innerHTML = "";
1314 testElementParent.removeChild( testElement );
1315})();
1316
1317}( jQuery ) );
1318(function( $, undefined ) {
1319
1320$.widget( "ui.autocomplete", {
1321 version: "1.10.4",
1322 defaultElement: "<input>",
1323 options: {
1324 appendTo: null,
1325 autoFocus: false,
1326 delay: 300,
1327 minLength: 1,
1328 position: {
1329 my: "left top",
1330 at: "left bottom",
1331 collision: "none"
1332 },
1333 source: null,
1334
1335 // callbacks
1336 change: null,
1337 close: null,
1338 focus: null,
1339 open: null,
1340 response: null,
1341 search: null,
1342 select: null
1343 },
1344
1345 requestIndex: 0,
1346 pending: 0,
1347
1348 _create: function() {
1349 // Some browsers only repeat keydown events, not keypress events,
1350 // so we use the suppressKeyPress flag to determine if we've already
1351 // handled the keydown event. #7269
1352 // Unfortunately the code for & in keypress is the same as the up arrow,
1353 // so we use the suppressKeyPressRepeat flag to avoid handling keypress
1354 // events when we know the keydown event was used to modify the
1355 // search term. #7799
1356 var suppressKeyPress, suppressKeyPressRepeat, suppressInput,
1357 nodeName = this.element[0].nodeName.toLowerCase(),
1358 isTextarea = nodeName === "textarea",
1359 isInput = nodeName === "input";
1360
1361 this.isMultiLine =
1362 // Textareas are always multi-line
1363 isTextarea ? true :
1364 // Inputs are always single-line, even if inside a contentEditable element
1365 // IE also treats inputs as contentEditable
1366 isInput ? false :
1367 // All other element types are determined by whether or not they're contentEditable
1368 this.element.prop( "isContentEditable" );
1369
1370 this.valueMethod = this.element[ isTextarea || isInput ? "val" : "text" ];
1371 this.isNewMenu = true;
1372
1373 this.element
1374 .addClass( "ui-autocomplete-input" )
1375 .attr( "autocomplete", "off" );
1376
1377 this._on( this.element, {
1378 keydown: function( event ) {
1379 if ( this.element.prop( "readOnly" ) ) {
1380 suppressKeyPress = true;
1381 suppressInput = true;
1382 suppressKeyPressRepeat = true;
1383 return;
1384 }
1385
1386 suppressKeyPress = false;
1387 suppressInput = false;
1388 suppressKeyPressRepeat = false;
1389 var keyCode = $.ui.keyCode;
1390 switch( event.keyCode ) {
1391 case keyCode.PAGE_UP:
1392 suppressKeyPress = true;
1393 this._move( "previousPage", event );
1394 break;
1395 case keyCode.PAGE_DOWN:
1396 suppressKeyPress = true;
1397 this._move( "nextPage", event );
1398 break;
1399 case keyCode.UP:
1400 suppressKeyPress = true;
1401 this._keyEvent( "previous", event );
1402 break;
1403 case keyCode.DOWN:
1404 suppressKeyPress = true;
1405 this._keyEvent( "next", event );
1406 break;
1407 case keyCode.ENTER:
1408 case keyCode.NUMPAD_ENTER:
1409 // when menu is open and has focus
1410 if ( this.menu.active ) {
1411 // #6055 - Opera still allows the keypress to occur
1412 // which causes forms to submit
1413 suppressKeyPress = true;
1414 event.preventDefault();
1415 this.menu.select( event );
1416 }
1417 break;
1418 case keyCode.TAB:
1419 if ( this.menu.active ) {
1420 this.menu.select( event );
1421 }
1422 break;
1423 case keyCode.ESCAPE:
1424 if ( this.menu.element.is( ":visible" ) ) {
1425 this._value( this.term );
1426 this.close( event );
1427 // Different browsers have different default behavior for escape
1428 // Single press can mean undo or clear
1429 // Double press in IE means clear the whole form
1430 event.preventDefault();
1431 }
1432 break;
1433 default:
1434 suppressKeyPressRepeat = true;
1435 // search timeout should be triggered before the input value is changed
1436 this._searchTimeout( event );
1437 break;
1438 }
1439 },
1440 keypress: function( event ) {
1441 if ( suppressKeyPress ) {
1442 suppressKeyPress = false;
1443 if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
1444 event.preventDefault();
1445 }
1446 return;
1447 }
1448 if ( suppressKeyPressRepeat ) {
1449 return;
1450 }
1451
1452 // replicate some key handlers to allow them to repeat in Firefox and Opera
1453 var keyCode = $.ui.keyCode;
1454 switch( event.keyCode ) {
1455 case keyCode.PAGE_UP:
1456 this._move( "previousPage", event );
1457 break;
1458 case keyCode.PAGE_DOWN:
1459 this._move( "nextPage", event );
1460 break;
1461 case keyCode.UP:
1462 this._keyEvent( "previous", event );
1463 break;
1464 case keyCode.DOWN:
1465 this._keyEvent( "next", event );
1466 break;
1467 }
1468 },
1469 input: function( event ) {
1470 if ( suppressInput ) {
1471 suppressInput = false;
1472 event.preventDefault();
1473 return;
1474 }
1475 this._searchTimeout( event );
1476 },
1477 focus: function() {
1478 this.selectedItem = null;
1479 this.previous = this._value();
1480 },
1481 blur: function( event ) {
1482 if ( this.cancelBlur ) {
1483 delete this.cancelBlur;
1484 return;
1485 }
1486
1487 clearTimeout( this.searching );
1488 this.close( event );
1489 this._change( event );
1490 }
1491 });
1492
1493 this._initSource();
1494 this.menu = $( "<ul>" )
1495 .addClass( "ui-autocomplete ui-front" )
1496 .appendTo( this._appendTo() )
1497 .menu({
1498 // disable ARIA support, the live region takes care of that
1499 role: null
1500 })
1501 .hide()
1502 .data( "ui-menu" );
1503
1504 this._on( this.menu.element, {
1505 mousedown: function( event ) {
1506 // prevent moving focus out of the text field
1507 event.preventDefault();
1508
1509 // IE doesn't prevent moving focus even with event.preventDefault()
1510 // so we set a flag to know when we should ignore the blur event
1511 this.cancelBlur = true;
1512 this._delay(function() {
1513 delete this.cancelBlur;
1514 });
1515
1516 // clicking on the scrollbar causes focus to shift to the body
1517 // but we can't detect a mouseup or a click immediately afterward
1518 // so we have to track the next mousedown and close the menu if
1519 // the user clicks somewhere outside of the autocomplete
1520 var menuElement = this.menu.element[ 0 ];
1521 if ( !$( event.target ).closest( ".ui-menu-item" ).length ) {
1522 this._delay(function() {
1523 var that = this;
1524 this.document.one( "mousedown", function( event ) {
1525 if ( event.target !== that.element[ 0 ] &&
1526 event.target !== menuElement &&
1527 !$.contains( menuElement, event.target ) ) {
1528 that.close();
1529 }
1530 });
1531 });
1532 }
1533 },
1534 menufocus: function( event, ui ) {
1535 // support: Firefox
1536 // Prevent accidental activation of menu items in Firefox (#7024 #9118)
1537 if ( this.isNewMenu ) {
1538 this.isNewMenu = false;
1539 if ( event.originalEvent && /^mouse/.test( event.originalEvent.type ) ) {
1540 this.menu.blur();
1541
1542 this.document.one( "mousemove", function() {
1543 $( event.target ).trigger( event.originalEvent );
1544 });
1545
1546 return;
1547 }
1548 }
1549
1550 var item = ui.item.data( "ui-autocomplete-item" );
1551 if ( false !== this._trigger( "focus", event, { item: item } ) ) {
1552 // use value to match what will end up in the input, if it was a key event
1553 if ( event.originalEvent && /^key/.test( event.originalEvent.type ) ) {
1554 this._value( item.value );
1555 }
1556 } else {
1557 // Normally the input is populated with the item's value as the
1558 // menu is navigated, causing screen readers to notice a change and
1559 // announce the item. Since the focus event was canceled, this doesn't
1560 // happen, so we update the live region so that screen readers can
1561 // still notice the change and announce it.
1562 this.liveRegion.text( item.value );
1563 }
1564 },
1565 menuselect: function( event, ui ) {
1566 var item = ui.item.data( "ui-autocomplete-item" ),
1567 previous = this.previous;
1568
1569 // only trigger when focus was lost (click on menu)
1570 if ( this.element[0] !== this.document[0].activeElement ) {
1571 this.element.focus();
1572 this.previous = previous;
1573 // #6109 - IE triggers two focus events and the second
1574 // is asynchronous, so we need to reset the previous
1575 // term synchronously and asynchronously :-(
1576 this._delay(function() {
1577 this.previous = previous;
1578 this.selectedItem = item;
1579 });
1580 }
1581
1582 if ( false !== this._trigger( "select", event, { item: item } ) ) {
1583 this._value( item.value );
1584 }
1585 // reset the term after the select event
1586 // this allows custom select handling to work properly
1587 this.term = this._value();
1588
1589 this.close( event );
1590 this.selectedItem = item;
1591 }
1592 });
1593
1594 this.liveRegion = $( "<span>", {
1595 role: "status",
1596 "aria-live": "polite"
1597 })
1598 .addClass( "ui-helper-hidden-accessible" )
1599 .insertBefore( this.element );
1600
1601 // turning off autocomplete prevents the browser from remembering the
1602 // value when navigating through history, so we re-enable autocomplete
1603 // if the page is unloaded before the widget is destroyed. #7790
1604 this._on( this.window, {
1605 beforeunload: function() {
1606 this.element.removeAttr( "autocomplete" );
1607 }
1608 });
1609 },
1610
1611 _destroy: function() {
1612 clearTimeout( this.searching );
1613 this.element
1614 .removeClass( "ui-autocomplete-input" )
1615 .removeAttr( "autocomplete" );
1616 this.menu.element.remove();
1617 this.liveRegion.remove();
1618 },
1619
1620 _setOption: function( key, value ) {
1621 this._super( key, value );
1622 if ( key === "source" ) {
1623 this._initSource();
1624 }
1625 if ( key === "appendTo" ) {
1626 this.menu.element.appendTo( this._appendTo() );
1627 }
1628 if ( key === "disabled" && value && this.xhr ) {
1629 this.xhr.abort();
1630 }
1631 },
1632
1633 _appendTo: function() {
1634 var element = this.options.appendTo;
1635
1636 if ( element ) {
1637 element = element.jquery || element.nodeType ?
1638 $( element ) :
1639 this.document.find( element ).eq( 0 );
1640 }
1641
1642 if ( !element ) {
1643 element = this.element.closest( ".ui-front" );
1644 }
1645
1646 if ( !element.length ) {
1647 element = this.document[0].body;
1648 }
1649
1650 return element;
1651 },
1652
1653 _initSource: function() {
1654 var array, url,
1655 that = this;
1656 if ( $.isArray(this.options.source) ) {
1657 array = this.options.source;
1658 this.source = function( request, response ) {
1659 response( $.ui.autocomplete.filter( array, request.term ) );
1660 };
1661 } else if ( typeof this.options.source === "string" ) {
1662 url = this.options.source;
1663 this.source = function( request, response ) {
1664 if ( that.xhr ) {
1665 that.xhr.abort();
1666 }
1667 that.xhr = $.ajax({
1668 url: url,
1669 data: request,
1670 dataType: "json",
1671 success: function( data ) {
1672 response( data );
1673 },
1674 error: function() {
1675 response( [] );
1676 }
1677 });
1678 };
1679 } else {
1680 this.source = this.options.source;
1681 }
1682 },
1683
1684 _searchTimeout: function( event ) {
1685 clearTimeout( this.searching );
1686 this.searching = this._delay(function() {
1687 // only search if the value has changed
1688 if ( this.term !== this._value() ) {
1689 this.selectedItem = null;
1690 this.search( null, event );
1691 }
1692 }, this.options.delay );
1693 },
1694
1695 search: function( value, event ) {
1696 value = value != null ? value : this._value();
1697
1698 // always save the actual value, not the one passed as an argument
1699 this.term = this._value();
1700
1701 if ( value.length < this.options.minLength ) {
1702 return this.close( event );
1703 }
1704
1705 if ( this._trigger( "search", event ) === false ) {
1706 return;
1707 }
1708
1709 return this._search( value );
1710 },
1711
1712 _search: function( value ) {
1713 this.pending++;
1714 this.element.addClass( "ui-autocomplete-loading" );
1715 this.cancelSearch = false;
1716
1717 this.source( { term: value }, this._response() );
1718 },
1719
1720 _response: function() {
1721 var index = ++this.requestIndex;
1722
1723 return $.proxy(function( content ) {
1724 if ( index === this.requestIndex ) {
1725 this.__response( content );
1726 }
1727
1728 this.pending--;
1729 if ( !this.pending ) {
1730 this.element.removeClass( "ui-autocomplete-loading" );
1731 }
1732 }, this );
1733 },
1734
1735 __response: function( content ) {
1736 if ( content ) {
1737 content = this._normalize( content );
1738 }
1739 this._trigger( "response", null, { content: content } );
1740 if ( !this.options.disabled && content && content.length && !this.cancelSearch ) {
1741 this._suggest( content );
1742 this._trigger( "open" );
1743 } else {
1744 // use ._close() instead of .close() so we don't cancel future searches
1745 this._close();
1746 }
1747 },
1748
1749 close: function( event ) {
1750 this.cancelSearch = true;
1751 this._close( event );
1752 },
1753
1754 _close: function( event ) {
1755 if ( this.menu.element.is( ":visible" ) ) {
1756 this.menu.element.hide();
1757 this.menu.blur();
1758 this.isNewMenu = true;
1759 this._trigger( "close", event );
1760 }
1761 },
1762
1763 _change: function( event ) {
1764 if ( this.previous !== this._value() ) {
1765 this._trigger( "change", event, { item: this.selectedItem } );
1766 }
1767 },
1768
1769 _normalize: function( items ) {
1770 // assume all items have the right format when the first item is complete
1771 if ( items.length && items[0].label && items[0].value ) {
1772 return items;
1773 }
1774 return $.map( items, function( item ) {
1775 if ( typeof item === "string" ) {
1776 return {
1777 label: item,
1778 value: item
1779 };
1780 }
1781 return $.extend({
1782 label: item.label || item.value,
1783 value: item.value || item.label
1784 }, item );
1785 });
1786 },
1787
1788 _suggest: function( items ) {
1789 var ul = this.menu.element.empty();
1790 this._renderMenu( ul, items );
1791 this.isNewMenu = true;
1792 this.menu.refresh();
1793
1794 // size and position menu
1795 ul.show();
1796 this._resizeMenu();
1797 ul.position( $.extend({
1798 of: this.element
1799 }, this.options.position ));
1800
1801 if ( this.options.autoFocus ) {
1802 this.menu.next();
1803 }
1804 },
1805
1806 _resizeMenu: function() {
1807 var ul = this.menu.element;
1808 ul.outerWidth( Math.max(
1809 // Firefox wraps long text (possibly a rounding bug)
1810 // so we add 1px to avoid the wrapping (#7513)
1811 ul.width( "" ).outerWidth() + 1,
1812 this.element.outerWidth()
1813 ) );
1814 },
1815
1816 _renderMenu: function( ul, items ) {
1817 var that = this;
1818 $.each( items, function( index, item ) {
1819 that._renderItemData( ul, item );
1820 });
1821 },
1822
1823 _renderItemData: function( ul, item ) {
1824 return this._renderItem( ul, item ).data( "ui-autocomplete-item", item );
1825 },
1826
1827 _renderItem: function( ul, item ) {
1828 return $( "<li>" )
1829 .append( $( "<a>" ).text( item.label ) )
1830 .appendTo( ul );
1831 },
1832
1833 _move: function( direction, event ) {
1834 if ( !this.menu.element.is( ":visible" ) ) {
1835 this.search( null, event );
1836 return;
1837 }
1838 if ( this.menu.isFirstItem() && /^previous/.test( direction ) ||
1839 this.menu.isLastItem() && /^next/.test( direction ) ) {
1840 this._value( this.term );
1841 this.menu.blur();
1842 return;
1843 }
1844 this.menu[ direction ]( event );
1845 },
1846
1847 widget: function() {
1848 return this.menu.element;
1849 },
1850
1851 _value: function() {
1852 return this.valueMethod.apply( this.element, arguments );
1853 },
1854
1855 _keyEvent: function( keyEvent, event ) {
1856 if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
1857 this._move( keyEvent, event );
1858
1859 // prevents moving cursor to beginning/end of the text field in some browsers
1860 event.preventDefault();
1861 }
1862 }
1863});
1864
1865$.extend( $.ui.autocomplete, {
1866 escapeRegex: function( value ) {
1867 return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&");
1868 },
1869 filter: function(array, term) {
1870 var matcher = new RegExp( $.ui.autocomplete.escapeRegex(term), "i" );
1871 return $.grep( array, function(value) {
1872 return matcher.test( value.label || value.value || value );
1873 });
1874 }
1875});
1876
1877
1878// live region extension, adding a `messages` option
1879// NOTE: This is an experimental API. We are still investigating
1880// a full solution for string manipulation and internationalization.
1881$.widget( "ui.autocomplete", $.ui.autocomplete, {
1882 options: {
1883 messages: {
1884 noResults: "No search results.",
1885 results: function( amount ) {
1886 return amount + ( amount > 1 ? " results are" : " result is" ) +
1887 " available, use up and down arrow keys to navigate.";
1888 }
1889 }
1890 },
1891
1892 __response: function( content ) {
1893 var message;
1894 this._superApply( arguments );
1895 if ( this.options.disabled || this.cancelSearch ) {
1896 return;
1897 }
1898 if ( content && content.length ) {
1899 message = this.options.messages.results( content.length );
1900 } else {
1901 message = this.options.messages.noResults;
1902 }
1903 this.liveRegion.text( message );
1904 }
1905});
1906
1907}( jQuery ));
1908(function( $, undefined ) {
1909
1910$.widget( "ui.menu", {
1911 version: "1.10.4",
1912 defaultElement: "<ul>",
1913 delay: 300,
1914 options: {
1915 icons: {
1916 submenu: "ui-icon-carat-1-e"
1917 },
1918 menus: "ul",
1919 position: {
1920 my: "left top",
1921 at: "right top"
1922 },
1923 role: "menu",
1924
1925 // callbacks
1926 blur: null,
1927 focus: null,
1928 select: null
1929 },
1930
1931 _create: function() {
1932 this.activeMenu = this.element;
1933 // flag used to prevent firing of the click handler
1934 // as the event bubbles up through nested menus
1935 this.mouseHandled = false;
1936 this.element
1937 .uniqueId()
1938 .addClass( "ui-menu ui-widget ui-widget-content ui-corner-all" )
1939 .toggleClass( "ui-menu-icons", !!this.element.find( ".ui-icon" ).length )
1940 .attr({
1941 role: this.options.role,
1942 tabIndex: 0
1943 })
1944 // need to catch all clicks on disabled menu
1945 // not possible through _on
1946 .bind( "click" + this.eventNamespace, $.proxy(function( event ) {
1947 if ( this.options.disabled ) {
1948 event.preventDefault();
1949 }
1950 }, this ));
1951
1952 if ( this.options.disabled ) {
1953 this.element
1954 .addClass( "ui-state-disabled" )
1955 .attr( "aria-disabled", "true" );
1956 }
1957
1958 this._on({
1959 // Prevent focus from sticking to links inside menu after clicking
1960 // them (focus should always stay on UL during navigation).
1961 "mousedown .ui-menu-item > a": function( event ) {
1962 event.preventDefault();
1963 },
1964 "click .ui-state-disabled > a": function( event ) {
1965 event.preventDefault();
1966 },
1967 "click .ui-menu-item:has(a)": function( event ) {
1968 var target = $( event.target ).closest( ".ui-menu-item" );
1969 if ( !this.mouseHandled && target.not( ".ui-state-disabled" ).length ) {
1970 this.select( event );
1971
1972 // Only set the mouseHandled flag if the event will bubble, see #9469.
1973 if ( !event.isPropagationStopped() ) {
1974 this.mouseHandled = true;
1975 }
1976
1977 // Open submenu on click
1978 if ( target.has( ".ui-menu" ).length ) {
1979 this.expand( event );
1980 } else if ( !this.element.is( ":focus" ) && $( this.document[ 0 ].activeElement ).closest( ".ui-menu" ).length ) {
1981
1982 // Redirect focus to the menu
1983 this.element.trigger( "focus", [ true ] );
1984
1985 // If the active item is on the top level, let it stay active.
1986 // Otherwise, blur the active item since it is no longer visible.
1987 if ( this.active && this.active.parents( ".ui-menu" ).length === 1 ) {
1988 clearTimeout( this.timer );
1989 }
1990 }
1991 }
1992 },
1993 "mouseenter .ui-menu-item": function( event ) {
1994 var target = $( event.currentTarget );
1995 // Remove ui-state-active class from siblings of the newly focused menu item
1996 // to avoid a jump caused by adjacent elements both having a class with a border
1997 target.siblings().children( ".ui-state-active" ).removeClass( "ui-state-active" );
1998 this.focus( event, target );
1999 },
2000 mouseleave: "collapseAll",
2001 "mouseleave .ui-menu": "collapseAll",
2002 focus: function( event, keepActiveItem ) {
2003 // If there's already an active item, keep it active
2004 // If not, activate the first item
2005 var item = this.active || this.element.children( ".ui-menu-item" ).eq( 0 );
2006
2007 if ( !keepActiveItem ) {
2008 this.focus( event, item );
2009 }
2010 },
2011 blur: function( event ) {
2012 this._delay(function() {
2013 if ( !$.contains( this.element[0], this.document[0].activeElement ) ) {
2014 this.collapseAll( event );
2015 }
2016 });
2017 },
2018 keydown: "_keydown"
2019 });
2020
2021 this.refresh();
2022
2023 // Clicks outside of a menu collapse any open menus
2024 this._on( this.document, {
2025 click: function( event ) {
2026 if ( !$( event.target ).closest( ".ui-menu" ).length ) {
2027 this.collapseAll( event );
2028 }
2029
2030 // Reset the mouseHandled flag
2031 this.mouseHandled = false;
2032 }
2033 });
2034 },
2035
2036 _destroy: function() {
2037 // Destroy (sub)menus
2038 this.element
2039 .removeAttr( "aria-activedescendant" )
2040 .find( ".ui-menu" ).addBack()
2041 .removeClass( "ui-menu ui-widget ui-widget-content ui-corner-all ui-menu-icons" )
2042 .removeAttr( "role" )
2043 .removeAttr( "tabIndex" )
2044 .removeAttr( "aria-labelledby" )
2045 .removeAttr( "aria-expanded" )
2046 .removeAttr( "aria-hidden" )
2047 .removeAttr( "aria-disabled" )
2048 .removeUniqueId()
2049 .show();
2050
2051 // Destroy menu items
2052 this.element.find( ".ui-menu-item" )
2053 .removeClass( "ui-menu-item" )
2054 .removeAttr( "role" )
2055 .removeAttr( "aria-disabled" )
2056 .children( "a" )
2057 .removeUniqueId()
2058 .removeClass( "ui-corner-all ui-state-hover" )
2059 .removeAttr( "tabIndex" )
2060 .removeAttr( "role" )
2061 .removeAttr( "aria-haspopup" )
2062 .children().each( function() {
2063 var elem = $( this );
2064 if ( elem.data( "ui-menu-submenu-carat" ) ) {
2065 elem.remove();
2066 }
2067 });
2068
2069 // Destroy menu dividers
2070 this.element.find( ".ui-menu-divider" ).removeClass( "ui-menu-divider ui-widget-content" );
2071 },
2072
2073 _keydown: function( event ) {
2074 var match, prev, character, skip, regex,
2075 preventDefault = true;
2076
2077 function escape( value ) {
2078 return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" );
2079 }
2080
2081 switch ( event.keyCode ) {
2082 case $.ui.keyCode.PAGE_UP:
2083 this.previousPage( event );
2084 break;
2085 case $.ui.keyCode.PAGE_DOWN:
2086 this.nextPage( event );
2087 break;
2088 case $.ui.keyCode.HOME:
2089 this._move( "first", "first", event );
2090 break;
2091 case $.ui.keyCode.END:
2092 this._move( "last", "last", event );
2093 break;
2094 case $.ui.keyCode.UP:
2095 this.previous( event );
2096 break;
2097 case $.ui.keyCode.DOWN:
2098 this.next( event );
2099 break;
2100 case $.ui.keyCode.LEFT:
2101 this.collapse( event );
2102 break;
2103 case $.ui.keyCode.RIGHT:
2104 if ( this.active && !this.active.is( ".ui-state-disabled" ) ) {
2105 this.expand( event );
2106 }
2107 break;
2108 case $.ui.keyCode.ENTER:
2109 case $.ui.keyCode.SPACE:
2110 this._activate( event );
2111 break;
2112 case $.ui.keyCode.ESCAPE:
2113 this.collapse( event );
2114 break;
2115 default:
2116 preventDefault = false;
2117 prev = this.previousFilter || "";
2118 character = String.fromCharCode( event.keyCode );
2119 skip = false;
2120
2121 clearTimeout( this.filterTimer );
2122
2123 if ( character === prev ) {
2124 skip = true;
2125 } else {
2126 character = prev + character;
2127 }
2128
2129 regex = new RegExp( "^" + escape( character ), "i" );
2130 match = this.activeMenu.children( ".ui-menu-item" ).filter(function() {
2131 return regex.test( $( this ).children( "a" ).text() );
2132 });
2133 match = skip && match.index( this.active.next() ) !== -1 ?
2134 this.active.nextAll( ".ui-menu-item" ) :
2135 match;
2136
2137 // If no matches on the current filter, reset to the last character pressed
2138 // to move down the menu to the first item that starts with that character
2139 if ( !match.length ) {
2140 character = String.fromCharCode( event.keyCode );
2141 regex = new RegExp( "^" + escape( character ), "i" );
2142 match = this.activeMenu.children( ".ui-menu-item" ).filter(function() {
2143 return regex.test( $( this ).children( "a" ).text() );
2144 });
2145 }
2146
2147 if ( match.length ) {
2148 this.focus( event, match );
2149 if ( match.length > 1 ) {
2150 this.previousFilter = character;
2151 this.filterTimer = this._delay(function() {
2152 delete this.previousFilter;
2153 }, 1000 );
2154 } else {
2155 delete this.previousFilter;
2156 }
2157 } else {
2158 delete this.previousFilter;
2159 }
2160 }
2161
2162 if ( preventDefault ) {
2163 event.preventDefault();
2164 }
2165 },
2166
2167 _activate: function( event ) {
2168 if ( !this.active.is( ".ui-state-disabled" ) ) {
2169 if ( this.active.children( "a[aria-haspopup='true']" ).length ) {
2170 this.expand( event );
2171 } else {
2172 this.select( event );
2173 }
2174 }
2175 },
2176
2177 refresh: function() {
2178 var menus,
2179 icon = this.options.icons.submenu,
2180 submenus = this.element.find( this.options.menus );
2181
2182 this.element.toggleClass( "ui-menu-icons", !!this.element.find( ".ui-icon" ).length );
2183
2184 // Initialize nested menus
2185 submenus.filter( ":not(.ui-menu)" )
2186 .addClass( "ui-menu ui-widget ui-widget-content ui-corner-all" )
2187 .hide()
2188 .attr({
2189 role: this.options.role,
2190 "aria-hidden": "true",
2191 "aria-expanded": "false"
2192 })
2193 .each(function() {
2194 var menu = $( this ),
2195 item = menu.prev( "a" ),
2196 submenuCarat = $( "<span>" )
2197 .addClass( "ui-menu-icon ui-icon " + icon )
2198 .data( "ui-menu-submenu-carat", true );
2199
2200 item
2201 .attr( "aria-haspopup", "true" )
2202 .prepend( submenuCarat );
2203 menu.attr( "aria-labelledby", item.attr( "id" ) );
2204 });
2205
2206 menus = submenus.add( this.element );
2207
2208 // Don't refresh list items that are already adapted
2209 menus.children( ":not(.ui-menu-item):has(a)" )
2210 .addClass( "ui-menu-item" )
2211 .attr( "role", "presentation" )
2212 .children( "a" )
2213 .uniqueId()
2214 .addClass( "ui-corner-all" )
2215 .attr({
2216 tabIndex: -1,
2217 role: this._itemRole()
2218 });
2219
2220 // Initialize unlinked menu-items containing spaces and/or dashes only as dividers
2221 menus.children( ":not(.ui-menu-item)" ).each(function() {
2222 var item = $( this );
2223 // hyphen, em dash, en dash
2224 if ( !/[^\-\u2014\u2013\s]/.test( item.text() ) ) {
2225 item.addClass( "ui-widget-content ui-menu-divider" );
2226 }
2227 });
2228
2229 // Add aria-disabled attribute to any disabled menu item
2230 menus.children( ".ui-state-disabled" ).attr( "aria-disabled", "true" );
2231
2232 // If the active item has been removed, blur the menu
2233 if ( this.active && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {
2234 this.blur();
2235 }
2236 },
2237
2238 _itemRole: function() {
2239 return {
2240 menu: "menuitem",
2241 listbox: "option"
2242 }[ this.options.role ];
2243 },
2244
2245 _setOption: function( key, value ) {
2246 if ( key === "icons" ) {
2247 this.element.find( ".ui-menu-icon" )
2248 .removeClass( this.options.icons.submenu )
2249 .addClass( value.submenu );
2250 }
2251 this._super( key, value );
2252 },
2253
2254 focus: function( event, item ) {
2255 var nested, focused;
2256 this.blur( event, event && event.type === "focus" );
2257
2258 this._scrollIntoView( item );
2259
2260 this.active = item.first();
2261 focused = this.active.children( "a" ).addClass( "ui-state-focus" );
2262 // Only update aria-activedescendant if there's a role
2263 // otherwise we assume focus is managed elsewhere
2264 if ( this.options.role ) {
2265 this.element.attr( "aria-activedescendant", focused.attr( "id" ) );
2266 }
2267
2268 // Highlight active parent menu item, if any
2269 this.active
2270 .parent()
2271 .closest( ".ui-menu-item" )
2272 .children( "a:first" )
2273 .addClass( "ui-state-active" );
2274
2275 if ( event && event.type === "keydown" ) {
2276 this._close();
2277 } else {
2278 this.timer = this._delay(function() {
2279 this._close();
2280 }, this.delay );
2281 }
2282
2283 nested = item.children( ".ui-menu" );
2284 if ( nested.length && event && ( /^mouse/.test( event.type ) ) ) {
2285 this._startOpening(nested);
2286 }
2287 this.activeMenu = item.parent();
2288
2289 this._trigger( "focus", event, { item: item } );
2290 },
2291
2292 _scrollIntoView: function( item ) {
2293 var borderTop, paddingTop, offset, scroll, elementHeight, itemHeight;
2294 if ( this._hasScroll() ) {
2295 borderTop = parseFloat( $.css( this.activeMenu[0], "borderTopWidth" ) ) || 0;
2296 paddingTop = parseFloat( $.css( this.activeMenu[0], "paddingTop" ) ) || 0;
2297 offset = item.offset().top - this.activeMenu.offset().top - borderTop - paddingTop;
2298 scroll = this.activeMenu.scrollTop();
2299 elementHeight = this.activeMenu.height();
2300 itemHeight = item.height();
2301
2302 if ( offset < 0 ) {
2303 this.activeMenu.scrollTop( scroll + offset );
2304 } else if ( offset + itemHeight > elementHeight ) {
2305 this.activeMenu.scrollTop( scroll + offset - elementHeight + itemHeight );
2306 }
2307 }
2308 },
2309
2310 blur: function( event, fromFocus ) {
2311 if ( !fromFocus ) {
2312 clearTimeout( this.timer );
2313 }
2314
2315 if ( !this.active ) {
2316 return;
2317 }
2318
2319 this.active.children( "a" ).removeClass( "ui-state-focus" );
2320 this.active = null;
2321
2322 this._trigger( "blur", event, { item: this.active } );
2323 },
2324
2325 _startOpening: function( submenu ) {
2326 clearTimeout( this.timer );
2327
2328 // Don't open if already open fixes a Firefox bug that caused a .5 pixel
2329 // shift in the submenu position when mousing over the carat icon
2330 if ( submenu.attr( "aria-hidden" ) !== "true" ) {
2331 return;
2332 }
2333
2334 this.timer = this._delay(function() {
2335 this._close();
2336 this._open( submenu );
2337 }, this.delay );
2338 },
2339
2340 _open: function( submenu ) {
2341 var position = $.extend({
2342 of: this.active
2343 }, this.options.position );
2344
2345 clearTimeout( this.timer );
2346 this.element.find( ".ui-menu" ).not( submenu.parents( ".ui-menu" ) )
2347 .hide()
2348 .attr( "aria-hidden", "true" );
2349
2350 submenu
2351 .show()
2352 .removeAttr( "aria-hidden" )
2353 .attr( "aria-expanded", "true" )
2354 .position( position );
2355 },
2356
2357 collapseAll: function( event, all ) {
2358 clearTimeout( this.timer );
2359 this.timer = this._delay(function() {
2360 // If we were passed an event, look for the submenu that contains the event
2361 var currentMenu = all ? this.element :
2362 $( event && event.target ).closest( this.element.find( ".ui-menu" ) );
2363
2364 // If we found no valid submenu ancestor, use the main menu to close all sub menus anyway
2365 if ( !currentMenu.length ) {
2366 currentMenu = this.element;
2367 }
2368
2369 this._close( currentMenu );
2370
2371 this.blur( event );
2372 this.activeMenu = currentMenu;
2373 }, this.delay );
2374 },
2375
2376 // With no arguments, closes the currently active menu - if nothing is active
2377 // it closes all menus. If passed an argument, it will search for menus BELOW
2378 _close: function( startMenu ) {
2379 if ( !startMenu ) {
2380 startMenu = this.active ? this.active.parent() : this.element;
2381 }
2382
2383 startMenu
2384 .find( ".ui-menu" )
2385 .hide()
2386 .attr( "aria-hidden", "true" )
2387 .attr( "aria-expanded", "false" )
2388 .end()
2389 .find( "a.ui-state-active" )
2390 .removeClass( "ui-state-active" );
2391 },
2392
2393 collapse: function( event ) {
2394 var newItem = this.active &&
2395 this.active.parent().closest( ".ui-menu-item", this.element );
2396 if ( newItem && newItem.length ) {
2397 this._close();
2398 this.focus( event, newItem );
2399 }
2400 },
2401
2402 expand: function( event ) {
2403 var newItem = this.active &&
2404 this.active
2405 .children( ".ui-menu " )
2406 .children( ".ui-menu-item" )
2407 .first();
2408
2409 if ( newItem && newItem.length ) {
2410 this._open( newItem.parent() );
2411
2412 // Delay so Firefox will not hide activedescendant change in expanding submenu from AT
2413 this._delay(function() {
2414 this.focus( event, newItem );
2415 });
2416 }
2417 },
2418
2419 next: function( event ) {
2420 this._move( "next", "first", event );
2421 },
2422
2423 previous: function( event ) {
2424 this._move( "prev", "last", event );
2425 },
2426
2427 isFirstItem: function() {
2428 return this.active && !this.active.prevAll( ".ui-menu-item" ).length;
2429 },
2430
2431 isLastItem: function() {
2432 return this.active && !this.active.nextAll( ".ui-menu-item" ).length;
2433 },
2434
2435 _move: function( direction, filter, event ) {
2436 var next;
2437 if ( this.active ) {
2438 if ( direction === "first" || direction === "last" ) {
2439 next = this.active
2440 [ direction === "first" ? "prevAll" : "nextAll" ]( ".ui-menu-item" )
2441 .eq( -1 );
2442 } else {
2443 next = this.active
2444 [ direction + "All" ]( ".ui-menu-item" )
2445 .eq( 0 );
2446 }
2447 }
2448 if ( !next || !next.length || !this.active ) {
2449 next = this.activeMenu.children( ".ui-menu-item" )[ filter ]();
2450 }
2451
2452 this.focus( event, next );
2453 },
2454
2455 nextPage: function( event ) {
2456 var item, base, height;
2457
2458 if ( !this.active ) {
2459 this.next( event );
2460 return;
2461 }
2462 if ( this.isLastItem() ) {
2463 return;
2464 }
2465 if ( this._hasScroll() ) {
2466 base = this.active.offset().top;
2467 height = this.element.height();
2468 this.active.nextAll( ".ui-menu-item" ).each(function() {
2469 item = $( this );
2470 return item.offset().top - base - height < 0;
2471 });
2472
2473 this.focus( event, item );
2474 } else {
2475 this.focus( event, this.activeMenu.children( ".ui-menu-item" )
2476 [ !this.active ? "first" : "last" ]() );
2477 }
2478 },
2479
2480 previousPage: function( event ) {
2481 var item, base, height;
2482 if ( !this.active ) {
2483 this.next( event );
2484 return;
2485 }
2486 if ( this.isFirstItem() ) {
2487 return;
2488 }
2489 if ( this._hasScroll() ) {
2490 base = this.active.offset().top;
2491 height = this.element.height();
2492 this.active.prevAll( ".ui-menu-item" ).each(function() {
2493 item = $( this );
2494 return item.offset().top - base + height > 0;
2495 });
2496
2497 this.focus( event, item );
2498 } else {
2499 this.focus( event, this.activeMenu.children( ".ui-menu-item" ).first() );
2500 }
2501 },
2502
2503 _hasScroll: function() {
2504 return this.element.outerHeight() < this.element.prop( "scrollHeight" );
2505 },
2506
2507 select: function( event ) {
2508 // TODO: It should never be possible to not have an active item at this
2509 // point, but the tests don't trigger mouseenter before click.
2510 this.active = this.active || $( event.target ).closest( ".ui-menu-item" );
2511 var ui = { item: this.active };
2512 if ( !this.active.has( ".ui-menu" ).length ) {
2513 this.collapseAll( event, true );
2514 }
2515 this._trigger( "select", event, ui );
2516 }
2517});
2518
2519}( jQuery ));
diff --git a/themes/default/js/jquery-ui-1.10.4.custom.min.js b/themes/default/js/jquery-ui-1.10.4.custom.min.js
new file mode 100644
index 00000000..31635026
--- /dev/null
+++ b/themes/default/js/jquery-ui-1.10.4.custom.min.js
@@ -0,0 +1,6 @@
1/*! jQuery UI - v1.10.4 - 2014-03-08
2* http://jqueryui.com
3* Includes: jquery.ui.core.js, jquery.ui.widget.js, jquery.ui.position.js, jquery.ui.autocomplete.js, jquery.ui.menu.js
4* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
5
6(function(e,t){function i(t,i){var s,a,o,r=t.nodeName.toLowerCase();return"area"===r?(s=t.parentNode,a=s.name,t.href&&a&&"map"===s.nodeName.toLowerCase()?(o=e("img[usemap=#"+a+"]")[0],!!o&&n(o)):!1):(/input|select|textarea|button|object/.test(r)?!t.disabled:"a"===r?t.href||i:i)&&n(t)}function n(t){return e.expr.filters.visible(t)&&!e(t).parents().addBack().filter(function(){return"hidden"===e.css(this,"visibility")}).length}var s=0,a=/^ui-id-\d+$/;e.ui=e.ui||{},e.extend(e.ui,{version:"1.10.4",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,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,SPACE:32,TAB:9,UP:38}}),e.fn.extend({focus:function(t){return function(i,n){return"number"==typeof i?this.each(function(){var t=this;setTimeout(function(){e(t).focus(),n&&n.call(t)},i)}):t.apply(this,arguments)}}(e.fn.focus),scrollParent:function(){var t;return t=e.ui.ie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(e.css(this,"position"))&&/(auto|scroll)/.test(e.css(this,"overflow")+e.css(this,"overflow-y")+e.css(this,"overflow-x"))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(e.css(this,"overflow")+e.css(this,"overflow-y")+e.css(this,"overflow-x"))}).eq(0),/fixed/.test(this.css("position"))||!t.length?e(document):t},zIndex:function(i){if(i!==t)return this.css("zIndex",i);if(this.length)for(var n,s,a=e(this[0]);a.length&&a[0]!==document;){if(n=a.css("position"),("absolute"===n||"relative"===n||"fixed"===n)&&(s=parseInt(a.css("zIndex"),10),!isNaN(s)&&0!==s))return s;a=a.parent()}return 0},uniqueId:function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++s)})},removeUniqueId:function(){return this.each(function(){a.test(this.id)&&e(this).removeAttr("id")})}}),e.extend(e.expr[":"],{data:e.expr.createPseudo?e.expr.createPseudo(function(t){return function(i){return!!e.data(i,t)}}):function(t,i,n){return!!e.data(t,n[3])},focusable:function(t){return i(t,!isNaN(e.attr(t,"tabindex")))},tabbable:function(t){var n=e.attr(t,"tabindex"),s=isNaN(n);return(s||n>=0)&&i(t,!s)}}),e("<a>").outerWidth(1).jquery||e.each(["Width","Height"],function(i,n){function s(t,i,n,s){return e.each(a,function(){i-=parseFloat(e.css(t,"padding"+this))||0,n&&(i-=parseFloat(e.css(t,"border"+this+"Width"))||0),s&&(i-=parseFloat(e.css(t,"margin"+this))||0)}),i}var a="Width"===n?["Left","Right"]:["Top","Bottom"],o=n.toLowerCase(),r={innerWidth:e.fn.innerWidth,innerHeight:e.fn.innerHeight,outerWidth:e.fn.outerWidth,outerHeight:e.fn.outerHeight};e.fn["inner"+n]=function(i){return i===t?r["inner"+n].call(this):this.each(function(){e(this).css(o,s(this,i)+"px")})},e.fn["outer"+n]=function(t,i){return"number"!=typeof t?r["outer"+n].call(this,t):this.each(function(){e(this).css(o,s(this,t,!0,i)+"px")})}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}),e("<a>").data("a-b","a").removeData("a-b").data("a-b")&&(e.fn.removeData=function(t){return function(i){return arguments.length?t.call(this,e.camelCase(i)):t.call(this)}}(e.fn.removeData)),e.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase()),e.support.selectstart="onselectstart"in document.createElement("div"),e.fn.extend({disableSelection:function(){return this.bind((e.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}}),e.extend(e.ui,{plugin:{add:function(t,i,n){var s,a=e.ui[t].prototype;for(s in n)a.plugins[s]=a.plugins[s]||[],a.plugins[s].push([i,n[s]])},call:function(e,t,i){var n,s=e.plugins[t];if(s&&e.element[0].parentNode&&11!==e.element[0].parentNode.nodeType)for(n=0;s.length>n;n++)e.options[s[n][0]]&&s[n][1].apply(e.element,i)}},hasScroll:function(t,i){if("hidden"===e(t).css("overflow"))return!1;var n=i&&"left"===i?"scrollLeft":"scrollTop",s=!1;return t[n]>0?!0:(t[n]=1,s=t[n]>0,t[n]=0,s)}})})(jQuery);(function(t,e){var i=0,s=Array.prototype.slice,n=t.cleanData;t.cleanData=function(e){for(var i,s=0;null!=(i=e[s]);s++)try{t(i).triggerHandler("remove")}catch(o){}n(e)},t.widget=function(i,s,n){var o,a,r,h,l={},c=i.split(".")[0];i=i.split(".")[1],o=c+"-"+i,n||(n=s,s=t.Widget),t.expr[":"][o.toLowerCase()]=function(e){return!!t.data(e,o)},t[c]=t[c]||{},a=t[c][i],r=t[c][i]=function(t,i){return this._createWidget?(arguments.length&&this._createWidget(t,i),e):new r(t,i)},t.extend(r,a,{version:n.version,_proto:t.extend({},n),_childConstructors:[]}),h=new s,h.options=t.widget.extend({},h.options),t.each(n,function(i,n){return t.isFunction(n)?(l[i]=function(){var t=function(){return s.prototype[i].apply(this,arguments)},e=function(t){return s.prototype[i].apply(this,t)};return function(){var i,s=this._super,o=this._superApply;return this._super=t,this._superApply=e,i=n.apply(this,arguments),this._super=s,this._superApply=o,i}}(),e):(l[i]=n,e)}),r.prototype=t.widget.extend(h,{widgetEventPrefix:a?h.widgetEventPrefix||i:i},l,{constructor:r,namespace:c,widgetName:i,widgetFullName:o}),a?(t.each(a._childConstructors,function(e,i){var s=i.prototype;t.widget(s.namespace+"."+s.widgetName,r,i._proto)}),delete a._childConstructors):s._childConstructors.push(r),t.widget.bridge(i,r)},t.widget.extend=function(i){for(var n,o,a=s.call(arguments,1),r=0,h=a.length;h>r;r++)for(n in a[r])o=a[r][n],a[r].hasOwnProperty(n)&&o!==e&&(i[n]=t.isPlainObject(o)?t.isPlainObject(i[n])?t.widget.extend({},i[n],o):t.widget.extend({},o):o);return i},t.widget.bridge=function(i,n){var o=n.prototype.widgetFullName||i;t.fn[i]=function(a){var r="string"==typeof a,h=s.call(arguments,1),l=this;return a=!r&&h.length?t.widget.extend.apply(null,[a].concat(h)):a,r?this.each(function(){var s,n=t.data(this,o);return n?t.isFunction(n[a])&&"_"!==a.charAt(0)?(s=n[a].apply(n,h),s!==n&&s!==e?(l=s&&s.jquery?l.pushStack(s.get()):s,!1):e):t.error("no such method '"+a+"' for "+i+" widget instance"):t.error("cannot call methods on "+i+" prior to initialization; "+"attempted to call method '"+a+"'")}):this.each(function(){var e=t.data(this,o);e?e.option(a||{})._init():t.data(this,o,new n(a,this))}),l}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this.bindings=t(),this.hoverable=t(),this.focusable=t(),s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:t.noop,_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetName).removeData(this.widgetFullName).removeData(t.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled "+"ui-state-disabled"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")},_destroy:t.noop,widget:function(){return this.element},option:function(i,s){var n,o,a,r=i;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof i)if(r={},n=i.split("."),i=n.shift(),n.length){for(o=r[i]=t.widget.extend({},this.options[i]),a=0;n.length-1>a;a++)o[n[a]]=o[n[a]]||{},o=o[n[a]];if(i=n.pop(),1===arguments.length)return o[i]===e?null:o[i];o[i]=s}else{if(1===arguments.length)return this.options[i]===e?null:this.options[i];r[i]=s}return this._setOptions(r),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return this.options[t]=e,"disabled"===t&&(this.widget().toggleClass(this.widgetFullName+"-disabled ui-state-disabled",!!e).attr("aria-disabled",e),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")),this},enable:function(){return this._setOption("disabled",!1)},disable:function(){return this._setOption("disabled",!0)},_on:function(i,s,n){var o,a=this;"boolean"!=typeof i&&(n=s,s=i,i=!1),n?(s=o=t(s),this.bindings=this.bindings.add(s)):(n=s,s=this.element,o=this.widget()),t.each(n,function(n,r){function h(){return i||a.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof r?a[r]:r).apply(a,arguments):e}"string"!=typeof r&&(h.guid=r.guid=r.guid||h.guid||t.guid++);var l=n.match(/^(\w+)\s*(.*)$/),c=l[1]+a.eventNamespace,u=l[2];u?o.delegate(u,c,h):s.bind(c,h)})},_off:function(t,e){e=(e||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,t.unbind(e).undelegate(e)},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){t(e.currentTarget).addClass("ui-state-hover")},mouseleave:function(e){t(e.currentTarget).removeClass("ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){t(e.currentTarget).addClass("ui-state-focus")},focusout:function(e){t(e.currentTarget).removeClass("ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}})})(jQuery);(function(t,e){function i(t,e,i){return[parseFloat(t[0])*(p.test(t[0])?e/100:1),parseFloat(t[1])*(p.test(t[1])?i/100:1)]}function s(e,i){return parseInt(t.css(e,i),10)||0}function n(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}t.ui=t.ui||{};var a,o=Math.max,r=Math.abs,l=Math.round,h=/left|center|right/,c=/top|center|bottom/,u=/[\+\-]\d+(\.[\d]+)?%?/,d=/^\w+/,p=/%$/,f=t.fn.position;t.position={scrollbarWidth:function(){if(a!==e)return a;var i,s,n=t("<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>"),o=n.children()[0];return t("body").append(n),i=o.offsetWidth,n.css("overflow","scroll"),s=o.offsetWidth,i===s&&(s=n[0].clientWidth),n.remove(),a=i-s},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.width<e.element[0].scrollWidth,a="scroll"===s||"auto"===s&&e.height<e.element[0].scrollHeight;return{width:a?t.position.scrollbarWidth():0,height:n?t.position.scrollbarWidth():0}},getWithinInfo:function(e){var i=t(e||window),s=t.isWindow(i[0]),n=!!i[0]&&9===i[0].nodeType;return{element:i,isWindow:s,isDocument:n,offset:i.offset()||{left:0,top:0},scrollLeft:i.scrollLeft(),scrollTop:i.scrollTop(),width:s?i.width():i.outerWidth(),height:s?i.height():i.outerHeight()}}},t.fn.position=function(e){if(!e||!e.of)return f.apply(this,arguments);e=t.extend({},e);var a,p,g,m,v,_,b=t(e.of),y=t.position.getWithinInfo(e.within),k=t.position.getScrollInfo(y),w=(e.collision||"flip").split(" "),D={};return _=n(b),b[0].preventDefault&&(e.at="left top"),p=_.width,g=_.height,m=_.offset,v=t.extend({},m),t.each(["my","at"],function(){var t,i,s=(e[this]||"").split(" ");1===s.length&&(s=h.test(s[0])?s.concat(["center"]):c.test(s[0])?["center"].concat(s):["center","center"]),s[0]=h.test(s[0])?s[0]:"center",s[1]=c.test(s[1])?s[1]:"center",t=u.exec(s[0]),i=u.exec(s[1]),D[this]=[t?t[0]:0,i?i[0]:0],e[this]=[d.exec(s[0])[0],d.exec(s[1])[0]]}),1===w.length&&(w[1]=w[0]),"right"===e.at[0]?v.left+=p:"center"===e.at[0]&&(v.left+=p/2),"bottom"===e.at[1]?v.top+=g:"center"===e.at[1]&&(v.top+=g/2),a=i(D.at,p,g),v.left+=a[0],v.top+=a[1],this.each(function(){var n,h,c=t(this),u=c.outerWidth(),d=c.outerHeight(),f=s(this,"marginLeft"),_=s(this,"marginTop"),x=u+f+s(this,"marginRight")+k.width,C=d+_+s(this,"marginBottom")+k.height,M=t.extend({},v),T=i(D.my,c.outerWidth(),c.outerHeight());"right"===e.my[0]?M.left-=u:"center"===e.my[0]&&(M.left-=u/2),"bottom"===e.my[1]?M.top-=d:"center"===e.my[1]&&(M.top-=d/2),M.left+=T[0],M.top+=T[1],t.support.offsetFractions||(M.left=l(M.left),M.top=l(M.top)),n={marginLeft:f,marginTop:_},t.each(["left","top"],function(i,s){t.ui.position[w[i]]&&t.ui.position[w[i]][s](M,{targetWidth:p,targetHeight:g,elemWidth:u,elemHeight:d,collisionPosition:n,collisionWidth:x,collisionHeight:C,offset:[a[0]+T[0],a[1]+T[1]],my:e.my,at:e.at,within:y,elem:c})}),e.using&&(h=function(t){var i=m.left-M.left,s=i+p-u,n=m.top-M.top,a=n+g-d,l={target:{element:b,left:m.left,top:m.top,width:p,height:g},element:{element:c,left:M.left,top:M.top,width:u,height:d},horizontal:0>s?"left":i>0?"right":"center",vertical:0>a?"top":n>0?"bottom":"middle"};u>p&&p>r(i+s)&&(l.horizontal="center"),d>g&&g>r(n+a)&&(l.vertical="middle"),l.important=o(r(i),r(s))>o(r(n),r(a))?"horizontal":"vertical",e.using.call(this,t,l)}),c.offset(t.extend(M,{using:h}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,l=n-r,h=r+e.collisionWidth-a-n;e.collisionWidth>a?l>0&&0>=h?(i=t.left+l+e.collisionWidth-a-n,t.left+=l-i):t.left=h>0&&0>=l?n:l>h?n+a-e.collisionWidth:n:l>0?t.left+=l:h>0?t.left-=h:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,l=n-r,h=r+e.collisionHeight-a-n;e.collisionHeight>a?l>0&&0>=h?(i=t.top+l+e.collisionHeight-a-n,t.top+=l-i):t.top=h>0&&0>=l?n:l>h?n+a-e.collisionHeight:n:l>0?t.top+=l:h>0?t.top-=h:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,a=n.offset.left+n.scrollLeft,o=n.width,l=n.isWindow?n.scrollLeft:n.offset.left,h=t.left-e.collisionPosition.marginLeft,c=h-l,u=h+e.collisionWidth-o-l,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-o-a,(0>i||r(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-l,(s>0||u>r(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,a=n.offset.top+n.scrollTop,o=n.height,l=n.isWindow?n.scrollTop:n.offset.top,h=t.top-e.collisionPosition.marginTop,c=h-l,u=h+e.collisionHeight-o-l,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,g=-2*e.offset[1];0>c?(s=t.top+p+f+g+e.collisionHeight-o-a,t.top+p+f+g>c&&(0>s||r(c)>s)&&(t.top+=p+f+g)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+g-l,t.top+p+f+g>u&&(i>0||u>r(i))&&(t.top+=p+f+g))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}},function(){var e,i,s,n,a,o=document.getElementsByTagName("body")[0],r=document.createElement("div");e=document.createElement(o?"div":"body"),s={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},o&&t.extend(s,{position:"absolute",left:"-1000px",top:"-1000px"});for(a in s)e.style[a]=s[a];e.appendChild(r),i=o||document.documentElement,i.insertBefore(e,i.firstChild),r.style.cssText="position: absolute; left: 10.7432222px;",n=t(r).offset().left,t.support.offsetFractions=n>10&&11>n,e.innerHTML="",i.removeChild(e)}()})(jQuery);(function(e){e.widget("ui.autocomplete",{version:"1.10.4",defaultElement:"<input>",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,_create:function(){var t,i,s,n=this.element[0].nodeName.toLowerCase(),a="textarea"===n,o="input"===n;this.isMultiLine=a?!0:o?!1:this.element.prop("isContentEditable"),this.valueMethod=this.element[a||o?"val":"text"],this.isNewMenu=!0,this.element.addClass("ui-autocomplete-input").attr("autocomplete","off"),this._on(this.element,{keydown:function(n){if(this.element.prop("readOnly"))return t=!0,s=!0,i=!0,undefined;t=!1,s=!1,i=!1;var a=e.ui.keyCode;switch(n.keyCode){case a.PAGE_UP:t=!0,this._move("previousPage",n);break;case a.PAGE_DOWN:t=!0,this._move("nextPage",n);break;case a.UP:t=!0,this._keyEvent("previous",n);break;case a.DOWN:t=!0,this._keyEvent("next",n);break;case a.ENTER:case a.NUMPAD_ENTER:this.menu.active&&(t=!0,n.preventDefault(),this.menu.select(n));break;case a.TAB:this.menu.active&&this.menu.select(n);break;case a.ESCAPE:this.menu.element.is(":visible")&&(this._value(this.term),this.close(n),n.preventDefault());break;default:i=!0,this._searchTimeout(n)}},keypress:function(s){if(t)return t=!1,(!this.isMultiLine||this.menu.element.is(":visible"))&&s.preventDefault(),undefined;if(!i){var n=e.ui.keyCode;switch(s.keyCode){case n.PAGE_UP:this._move("previousPage",s);break;case n.PAGE_DOWN:this._move("nextPage",s);break;case n.UP:this._keyEvent("previous",s);break;case n.DOWN:this._keyEvent("next",s)}}},input:function(e){return s?(s=!1,e.preventDefault(),undefined):(this._searchTimeout(e),undefined)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(e){return this.cancelBlur?(delete this.cancelBlur,undefined):(clearTimeout(this.searching),this.close(e),this._change(e),undefined)}}),this._initSource(),this.menu=e("<ul>").addClass("ui-autocomplete ui-front").appendTo(this._appendTo()).menu({role:null}).hide().data("ui-menu"),this._on(this.menu.element,{mousedown:function(t){t.preventDefault(),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur});var i=this.menu.element[0];e(t.target).closest(".ui-menu-item").length||this._delay(function(){var t=this;this.document.one("mousedown",function(s){s.target===t.element[0]||s.target===i||e.contains(i,s.target)||t.close()})})},menufocus:function(t,i){if(this.isNewMenu&&(this.isNewMenu=!1,t.originalEvent&&/^mouse/.test(t.originalEvent.type)))return this.menu.blur(),this.document.one("mousemove",function(){e(t.target).trigger(t.originalEvent)}),undefined;var s=i.item.data("ui-autocomplete-item");!1!==this._trigger("focus",t,{item:s})?t.originalEvent&&/^key/.test(t.originalEvent.type)&&this._value(s.value):this.liveRegion.text(s.value)},menuselect:function(e,t){var i=t.item.data("ui-autocomplete-item"),s=this.previous;this.element[0]!==this.document[0].activeElement&&(this.element.focus(),this.previous=s,this._delay(function(){this.previous=s,this.selectedItem=i})),!1!==this._trigger("select",e,{item:i})&&this._value(i.value),this.term=this._value(),this.close(e),this.selectedItem=i}}),this.liveRegion=e("<span>",{role:"status","aria-live":"polite"}).addClass("ui-helper-hidden-accessible").insertBefore(this.element),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_destroy:function(){clearTimeout(this.searching),this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete"),this.menu.element.remove(),this.liveRegion.remove()},_setOption:function(e,t){this._super(e,t),"source"===e&&this._initSource(),"appendTo"===e&&this.menu.element.appendTo(this._appendTo()),"disabled"===e&&t&&this.xhr&&this.xhr.abort()},_appendTo:function(){var t=this.options.appendTo;return t&&(t=t.jquery||t.nodeType?e(t):this.document.find(t).eq(0)),t||(t=this.element.closest(".ui-front")),t.length||(t=this.document[0].body),t},_initSource:function(){var t,i,s=this;e.isArray(this.options.source)?(t=this.options.source,this.source=function(i,s){s(e.ui.autocomplete.filter(t,i.term))}):"string"==typeof this.options.source?(i=this.options.source,this.source=function(t,n){s.xhr&&s.xhr.abort(),s.xhr=e.ajax({url:i,data:t,dataType:"json",success:function(e){n(e)},error:function(){n([])}})}):this.source=this.options.source},_searchTimeout:function(e){clearTimeout(this.searching),this.searching=this._delay(function(){this.term!==this._value()&&(this.selectedItem=null,this.search(null,e))},this.options.delay)},search:function(e,t){return e=null!=e?e:this._value(),this.term=this._value(),e.length<this.options.minLength?this.close(t):this._trigger("search",t)!==!1?this._search(e):undefined},_search:function(e){this.pending++,this.element.addClass("ui-autocomplete-loading"),this.cancelSearch=!1,this.source({term:e},this._response())},_response:function(){var t=++this.requestIndex;return e.proxy(function(e){t===this.requestIndex&&this.__response(e),this.pending--,this.pending||this.element.removeClass("ui-autocomplete-loading")},this)},__response:function(e){e&&(e=this._normalize(e)),this._trigger("response",null,{content:e}),!this.options.disabled&&e&&e.length&&!this.cancelSearch?(this._suggest(e),this._trigger("open")):this._close()},close:function(e){this.cancelSearch=!0,this._close(e)},_close:function(e){this.menu.element.is(":visible")&&(this.menu.element.hide(),this.menu.blur(),this.isNewMenu=!0,this._trigger("close",e))},_change:function(e){this.previous!==this._value()&&this._trigger("change",e,{item:this.selectedItem})},_normalize:function(t){return t.length&&t[0].label&&t[0].value?t:e.map(t,function(t){return"string"==typeof t?{label:t,value:t}:e.extend({label:t.label||t.value,value:t.value||t.label},t)})},_suggest:function(t){var i=this.menu.element.empty();this._renderMenu(i,t),this.isNewMenu=!0,this.menu.refresh(),i.show(),this._resizeMenu(),i.position(e.extend({of:this.element},this.options.position)),this.options.autoFocus&&this.menu.next()},_resizeMenu:function(){var e=this.menu.element;e.outerWidth(Math.max(e.width("").outerWidth()+1,this.element.outerWidth()))},_renderMenu:function(t,i){var s=this;e.each(i,function(e,i){s._renderItemData(t,i)})},_renderItemData:function(e,t){return this._renderItem(e,t).data("ui-autocomplete-item",t)},_renderItem:function(t,i){return e("<li>").append(e("<a>").text(i.label)).appendTo(t)},_move:function(e,t){return this.menu.element.is(":visible")?this.menu.isFirstItem()&&/^previous/.test(e)||this.menu.isLastItem()&&/^next/.test(e)?(this._value(this.term),this.menu.blur(),undefined):(this.menu[e](t),undefined):(this.search(null,t),undefined)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)},_keyEvent:function(e,t){(!this.isMultiLine||this.menu.element.is(":visible"))&&(this._move(e,t),t.preventDefault())}}),e.extend(e.ui.autocomplete,{escapeRegex:function(e){return e.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")},filter:function(t,i){var s=RegExp(e.ui.autocomplete.escapeRegex(i),"i");return e.grep(t,function(e){return s.test(e.label||e.value||e)})}}),e.widget("ui.autocomplete",e.ui.autocomplete,{options:{messages:{noResults:"No search results.",results:function(e){return e+(e>1?" results are":" result is")+" available, use up and down arrow keys to navigate."}}},__response:function(e){var t;this._superApply(arguments),this.options.disabled||this.cancelSearch||(t=e&&e.length?this.options.messages.results(e.length):this.options.messages.noResults,this.liveRegion.text(t))}})})(jQuery);(function(t){t.widget("ui.menu",{version:"1.10.4",defaultElement:"<ul>",delay:300,options:{icons:{submenu:"ui-icon-carat-1-e"},menus:"ul",position:{my:"left top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.element.uniqueId().addClass("ui-menu ui-widget ui-widget-content ui-corner-all").toggleClass("ui-menu-icons",!!this.element.find(".ui-icon").length).attr({role:this.options.role,tabIndex:0}).bind("click"+this.eventNamespace,t.proxy(function(t){this.options.disabled&&t.preventDefault()},this)),this.options.disabled&&this.element.addClass("ui-state-disabled").attr("aria-disabled","true"),this._on({"mousedown .ui-menu-item > a":function(t){t.preventDefault()},"click .ui-state-disabled > a":function(t){t.preventDefault()},"click .ui-menu-item:has(a)":function(e){var i=t(e.target).closest(".ui-menu-item");!this.mouseHandled&&i.not(".ui-state-disabled").length&&(this.select(e),e.isPropagationStopped()||(this.mouseHandled=!0),i.has(".ui-menu").length?this.expand(e):!this.element.is(":focus")&&t(this.document[0].activeElement).closest(".ui-menu").length&&(this.element.trigger("focus",[!0]),this.active&&1===this.active.parents(".ui-menu").length&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":function(e){var i=t(e.currentTarget);i.siblings().children(".ui-state-active").removeClass("ui-state-active"),this.focus(e,i)},mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(t,e){var i=this.active||this.element.children(".ui-menu-item").eq(0);e||this.focus(t,i)},blur:function(e){this._delay(function(){t.contains(this.element[0],this.document[0].activeElement)||this.collapseAll(e)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(e){t(e.target).closest(".ui-menu").length||this.collapseAll(e),this.mouseHandled=!1}})},_destroy:function(){this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeClass("ui-menu ui-widget ui-widget-content ui-corner-all ui-menu-icons").removeAttr("role").removeAttr("tabIndex").removeAttr("aria-labelledby").removeAttr("aria-expanded").removeAttr("aria-hidden").removeAttr("aria-disabled").removeUniqueId().show(),this.element.find(".ui-menu-item").removeClass("ui-menu-item").removeAttr("role").removeAttr("aria-disabled").children("a").removeUniqueId().removeClass("ui-corner-all ui-state-hover").removeAttr("tabIndex").removeAttr("role").removeAttr("aria-haspopup").children().each(function(){var e=t(this);e.data("ui-menu-submenu-carat")&&e.remove()}),this.element.find(".ui-menu-divider").removeClass("ui-menu-divider ui-widget-content")},_keydown:function(e){function i(t){return t.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")}var s,n,a,o,r,l=!0;switch(e.keyCode){case t.ui.keyCode.PAGE_UP:this.previousPage(e);break;case t.ui.keyCode.PAGE_DOWN:this.nextPage(e);break;case t.ui.keyCode.HOME:this._move("first","first",e);break;case t.ui.keyCode.END:this._move("last","last",e);break;case t.ui.keyCode.UP:this.previous(e);break;case t.ui.keyCode.DOWN:this.next(e);break;case t.ui.keyCode.LEFT:this.collapse(e);break;case t.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(e);break;case t.ui.keyCode.ENTER:case t.ui.keyCode.SPACE:this._activate(e);break;case t.ui.keyCode.ESCAPE:this.collapse(e);break;default:l=!1,n=this.previousFilter||"",a=String.fromCharCode(e.keyCode),o=!1,clearTimeout(this.filterTimer),a===n?o=!0:a=n+a,r=RegExp("^"+i(a),"i"),s=this.activeMenu.children(".ui-menu-item").filter(function(){return r.test(t(this).children("a").text())}),s=o&&-1!==s.index(this.active.next())?this.active.nextAll(".ui-menu-item"):s,s.length||(a=String.fromCharCode(e.keyCode),r=RegExp("^"+i(a),"i"),s=this.activeMenu.children(".ui-menu-item").filter(function(){return r.test(t(this).children("a").text())})),s.length?(this.focus(e,s),s.length>1?(this.previousFilter=a,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter):delete this.previousFilter}l&&e.preventDefault()},_activate:function(t){this.active.is(".ui-state-disabled")||(this.active.children("a[aria-haspopup='true']").length?this.expand(t):this.select(t))},refresh:function(){var e,i=this.options.icons.submenu,s=this.element.find(this.options.menus);this.element.toggleClass("ui-menu-icons",!!this.element.find(".ui-icon").length),s.filter(":not(.ui-menu)").addClass("ui-menu ui-widget ui-widget-content ui-corner-all").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var e=t(this),s=e.prev("a"),n=t("<span>").addClass("ui-menu-icon ui-icon "+i).data("ui-menu-submenu-carat",!0);s.attr("aria-haspopup","true").prepend(n),e.attr("aria-labelledby",s.attr("id"))}),e=s.add(this.element),e.children(":not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","presentation").children("a").uniqueId().addClass("ui-corner-all").attr({tabIndex:-1,role:this._itemRole()}),e.children(":not(.ui-menu-item)").each(function(){var e=t(this);/[^\-\u2014\u2013\s]/.test(e.text())||e.addClass("ui-widget-content ui-menu-divider")}),e.children(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!t.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(t,e){"icons"===t&&this.element.find(".ui-menu-icon").removeClass(this.options.icons.submenu).addClass(e.submenu),this._super(t,e)},focus:function(t,e){var i,s;this.blur(t,t&&"focus"===t.type),this._scrollIntoView(e),this.active=e.first(),s=this.active.children("a").addClass("ui-state-focus"),this.options.role&&this.element.attr("aria-activedescendant",s.attr("id")),this.active.parent().closest(".ui-menu-item").children("a:first").addClass("ui-state-active"),t&&"keydown"===t.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),i=e.children(".ui-menu"),i.length&&t&&/^mouse/.test(t.type)&&this._startOpening(i),this.activeMenu=e.parent(),this._trigger("focus",t,{item:e})},_scrollIntoView:function(e){var i,s,n,a,o,r;this._hasScroll()&&(i=parseFloat(t.css(this.activeMenu[0],"borderTopWidth"))||0,s=parseFloat(t.css(this.activeMenu[0],"paddingTop"))||0,n=e.offset().top-this.activeMenu.offset().top-i-s,a=this.activeMenu.scrollTop(),o=this.activeMenu.height(),r=e.height(),0>n?this.activeMenu.scrollTop(a+n):n+r>o&&this.activeMenu.scrollTop(a+n-o+r))},blur:function(t,e){e||clearTimeout(this.timer),this.active&&(this.active.children("a").removeClass("ui-state-focus"),this.active=null,this._trigger("blur",t,{item:this.active}))},_startOpening:function(t){clearTimeout(this.timer),"true"===t.attr("aria-hidden")&&(this.timer=this._delay(function(){this._close(),this._open(t)},this.delay))},_open:function(e){var i=t.extend({of:this.active},this.options.position);clearTimeout(this.timer),this.element.find(".ui-menu").not(e.parents(".ui-menu")).hide().attr("aria-hidden","true"),e.show().removeAttr("aria-hidden").attr("aria-expanded","true").position(i)},collapseAll:function(e,i){clearTimeout(this.timer),this.timer=this._delay(function(){var s=i?this.element:t(e&&e.target).closest(this.element.find(".ui-menu"));s.length||(s=this.element),this._close(s),this.blur(e),this.activeMenu=s},this.delay)},_close:function(t){t||(t=this.active?this.active.parent():this.element),t.find(".ui-menu").hide().attr("aria-hidden","true").attr("aria-expanded","false").end().find("a.ui-state-active").removeClass("ui-state-active")},collapse:function(t){var e=this.active&&this.active.parent().closest(".ui-menu-item",this.element);e&&e.length&&(this._close(),this.focus(t,e))},expand:function(t){var e=this.active&&this.active.children(".ui-menu ").children(".ui-menu-item").first();e&&e.length&&(this._open(e.parent()),this._delay(function(){this.focus(t,e)}))},next:function(t){this._move("next","first",t)},previous:function(t){this._move("prev","last",t)},isFirstItem:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},isLastItem:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},_move:function(t,e,i){var s;this.active&&(s="first"===t||"last"===t?this.active["first"===t?"prevAll":"nextAll"](".ui-menu-item").eq(-1):this.active[t+"All"](".ui-menu-item").eq(0)),s&&s.length&&this.active||(s=this.activeMenu.children(".ui-menu-item")[e]()),this.focus(i,s)},nextPage:function(e){var i,s,n;return this.active?(this.isLastItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.nextAll(".ui-menu-item").each(function(){return i=t(this),0>i.offset().top-s-n}),this.focus(e,i)):this.focus(e,this.activeMenu.children(".ui-menu-item")[this.active?"last":"first"]())),undefined):(this.next(e),undefined)},previousPage:function(e){var i,s,n;return this.active?(this.isFirstItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.prevAll(".ui-menu-item").each(function(){return i=t(this),i.offset().top-s+n>0}),this.focus(e,i)):this.focus(e,this.activeMenu.children(".ui-menu-item").first())),undefined):(this.next(e),undefined)},_hasScroll:function(){return this.element.outerHeight()<this.element.prop("scrollHeight")},select:function(e){this.active=this.active||t(e.target).closest(".ui-menu-item");var i={item:this.active};this.active.has(".ui-menu").length||this.collapseAll(e,!0),this._trigger("select",e,i)}})})(jQuery); \ No newline at end of file
diff --git a/themes/default/js/saveLink.js b/themes/default/js/saveLink.js
new file mode 100755
index 00000000..ccc00d1e
--- /dev/null
+++ b/themes/default/js/saveLink.js
@@ -0,0 +1,101 @@
1$.fn.ready(function() {
2
3 var $bagit = $('#bagit'),
4 $bagitForm = $('#bagit-form'),
5 $bagitFormForm = $('#bagit-form-form');
6
7 /* ==========================================================================
8 bag it link and close button
9 ========================================================================== */
10
11 function toggleSaveLinkForm(url, event) {
12 $("#add-link-result").empty();
13
14 $bagit.toggleClass("active-current");
15
16 //only if bagiti link is not presented on page
17 if ( $bagit.length === 0 ) {
18 if ( event !== 'undefined' && event ) {
19 $bagitForm.css( {position:"absolute", top:event.pageY, left:event.pageX-200});
20 }
21 else {
22 $bagitForm.css( {position:"relative", top:"auto", left:"auto"});
23 }
24 }
25
26 $bagitForm.toggle();
27 $('#content').toggleClass("opacity03");
28 if (url !== 'undefined' && url) {
29 $('#plainurl').val(url);
30 }
31 $('#plainurl').focus();
32 }
33
34
35 $bagit.click(function(){
36 $bagit.toggleClass("current");
37 $("#bagit-arrow").toggleClass("arrow-down");
38 toggleSaveLinkForm();
39 });
40
41 $("#bagit-form-close").click(function(){
42 $bagit.removeClass("current");
43 $("#bagit-arrow").removeClass("arrow-down");
44 toggleSaveLinkForm();
45 });
46
47
48 //send "bag it link" form request via ajax
49 $bagitFormForm.submit( function(event) {
50 $("body").css("cursor", "wait");
51 $("#add-link-result").empty();
52
53 $.ajax({
54 type: $bagitFormForm.attr('method'),
55 url: $bagitFormForm.attr('action'),
56 data: $bagitFormForm.serialize(),
57 success: function(data) {
58 $('#add-link-result').html("Done!");
59 $('#plainurl').val('');
60 $('#plainurl').blur('');
61 $("body").css("cursor", "auto");
62 //setTimeout( function() { toggleSaveLinkForm(); }, 1000); //close form after 1000 delay
63 },
64 error: function(data) {
65 $('#add-link-result').html("Failed!");
66 $("body").css("cursor", "auto");
67 }
68 });
69
70 event.preventDefault();
71 });
72
73 /* ==========================================================================
74 Keyboard gestion
75 ========================================================================== */
76
77 $(window).keydown(function(e){
78 if ( ( e.target.tagName.toLowerCase() !== 'input' && e.keyCode == 83 ) || e.keyCode == 27 ) {
79 $bagit.removeClass("current");
80 $("#bagit-arrow").removeClass("arrow-down");
81 toggleSaveLinkForm();
82 return false;
83 }
84 });
85
86 /* ==========================================================================
87 Process all links inside an article
88 ========================================================================== */
89
90 $("article a[href^='http']").after(function() {
91 return " <a href=\"" + $(this).attr('href') + "\" class=\"add-to-wallabag-link-after\" alt=\"add to wallabag\" title=\"add to wallabag\">w</a> ";
92 });
93
94 $(".add-to-wallabag-link-after").click(function(event){
95 toggleSaveLinkForm($(this).attr('href'), event);
96 event.preventDefault();
97 });
98
99});
100
101
diff --git a/themes/default/tags.twig b/themes/default/tags.twig
index cff6b1d7..e5be748e 100644..100755
--- a/themes/default/tags.twig
+++ b/themes/default/tags.twig
@@ -4,5 +4,15 @@
4{% include '_menu.twig' %} 4{% include '_menu.twig' %}
5{% endblock %} 5{% endblock %}
6{% block content %} 6{% block content %}
7{% for tag in tags %}<a href="./?view=tag&amp;id={{ tag.id }}">{{ tag.value }}</a> {% if token != '' %}<a href="?feed&amp;type=tag&amp;user_id={{ user_id }}&amp;tag_id={{ tag.id }}&amp;token={{ token }}" target="_blank"><img src="{{ poche_url }}/themes/{{ theme }}/img/{{ theme }}/rss.png" /></a>{% endif %} {% endfor %} 7 <div class="two-column">
8 {% for tag in tags %}
9 <a href="./?view=tag&amp;id={{ tag.id }}">{{ tag.value }}</a> ({{ tag.entriescount }}) {% if token != '' %}<a href="?feed&amp;type=tag&amp;user_id={{ user_id }}&amp;tag_id={{ tag.id }}&amp;token={{ token }}" target="_blank"><img src="{{ poche_url }}themes/{{ theme }}/img/{{ theme }}/rss.png" /></a>{% endif %}
10 <br>
11
12 {% if loop.index == '%d'|format(loop.length/2 + 0.5) %}
13 </div><div class="two-column">
14 {% endif %}
15
16 {% endfor %}
17 </div>
8{% endblock %} \ No newline at end of file 18{% endblock %} \ No newline at end of file
diff --git a/themes/default/view.twig b/themes/default/view.twig
index 916abe0d..cc491c77 100644..100755
--- a/themes/default/view.twig
+++ b/themes/default/view.twig
@@ -1,6 +1,7 @@
1{% extends "layout.twig" %} 1{% extends "layout.twig" %}
2{% block title %}{{ entry.title|raw }} ({{ entry.url | e | getDomain }}){% endblock %} 2{% block title %}{{ entry.title|raw }} ({{ entry.url | e | getDomain }}){% endblock %}
3{% block content %} 3{% block content %}
4 {% include '_pocheit-form.twig' %}
4 <div id="article_toolbar"> 5 <div id="article_toolbar">
5 <ul> 6 <ul>
6 <li><a href="./" title="{% trans "Return home" %}" class="tool back"><span>{% trans "Return home" %}</span></a></li> 7 <li><a href="./" title="{% trans "Return home" %}" class="tool back"><span>{% trans "Return home" %}</span></a></li>
@@ -30,7 +31,7 @@
30 </article> 31 </article>
31 {{ block('tags') }} 32 {{ block('tags') }}
32 </div> 33 </div>
33 <script src="{{ poche_url }}/themes/{{ constant('DEFAULT_THEME') }}/js/restoreScroll.js"></script> 34 <script src="{{ poche_url }}themes/{{theme}}/js/restoreScroll.js"></script>
34 <script type="text/javascript"> 35 <script type="text/javascript">
35 $(document).ready(function() { 36 $(document).ready(function() {
36 37
@@ -55,3 +56,4 @@
55 }); 56 });
56 </script> 57 </script>
57{% endblock %} 58{% endblock %}
59
diff --git a/wallabag_compatibility_test.php b/wallabag_compatibility_test.php
index 26dce018..7a52767c 100644
--- a/wallabag_compatibility_test.php
+++ b/wallabag_compatibility_test.php
@@ -1,5 +1,5 @@
1<?php 1<?php
2$app_name = 'wallabag 1'; 2$app_name = 'wallabag';
3 3
4$php_ok = (function_exists('version_compare') && version_compare(phpversion(), '5.3.3', '>=')); 4$php_ok = (function_exists('version_compare') && version_compare(phpversion(), '5.3.3', '>='));
5$pcre_ok = extension_loaded('pcre'); 5$pcre_ok = extension_loaded('pcre');
@@ -11,6 +11,7 @@ $curl_ok = function_exists('curl_exec');
11$parallel_ok = ((extension_loaded('http') && class_exists('HttpRequestPool')) || ($curl_ok && function_exists('curl_multi_init'))); 11$parallel_ok = ((extension_loaded('http') && class_exists('HttpRequestPool')) || ($curl_ok && function_exists('curl_multi_init')));
12$allow_url_fopen_ok = (bool)ini_get('allow_url_fopen'); 12$allow_url_fopen_ok = (bool)ini_get('allow_url_fopen');
13$filter_ok = extension_loaded('filter'); 13$filter_ok = extension_loaded('filter');
14$gettext_ok = function_exists("gettext");
14 15
15if (extension_loaded('xmlreader')) { 16if (extension_loaded('xmlreader')) {
16 $xml_ok = true; 17 $xml_ok = true;
@@ -130,8 +131,6 @@ table#chart tr.enabled td {
130 131
131table#chart tr.disabled td, 132table#chart tr.disabled td,
132table#chart tr.disabled td a { 133table#chart tr.disabled td a {
133 color:#999;
134 font-style:italic;
135} 134}
136 135
137table#chart tr.disabled td a { 136table#chart tr.disabled td a {
@@ -154,12 +153,31 @@ div.chunk {
154 background-color:transparent; 153 background-color:transparent;
155 font-style:italic; 154 font-style:italic;
156} 155}
156
157.good{
158background-color:#52CC5B;
159}
160.bad{
161background-color:#F74343;
162font-style:italic;
163font-weight: bold;
164}
165.pass{
166background-color:#FF9500;
167}
168
157</style> 169</style>
158 170
159</head> 171</head>
160 172
161<body> 173<body>
162 174<?php
175$frominstall = false;
176if (isset($_GET['from'])){
177 if ($_GET['from'] == 'install'){
178 $frominstall = true;
179 }}
180?>
163<div id="site"> 181<div id="site">
164 <div id="content"> 182 <div id="content">
165 183
@@ -177,58 +195,63 @@ div.chunk {
177 <tr class="<?php echo ($php_ok) ? 'enabled' : 'disabled'; ?>"> 195 <tr class="<?php echo ($php_ok) ? 'enabled' : 'disabled'; ?>">
178 <td>PHP</td> 196 <td>PHP</td>
179 <td>5.3.3 or higher</td> 197 <td>5.3.3 or higher</td>
180 <td><?php echo phpversion(); ?></td> 198 <td class="<?php echo ($php_ok) ? 'good' : 'disabled'; ?>"><?php echo phpversion(); ?></td>
181 </tr> 199 </tr>
182 <tr class="<?php echo ($xml_ok) ? 'enabled, and sane' : 'disabled, or broken'; ?>"> 200 <tr class="<?php echo ($xml_ok) ? 'enabled' : 'disabled'; ?>">
183 <td><a href="http://php.net/xml">XML</a></td> 201 <td><a href="http://php.net/xml">XML</a></td>
184 <td>Enabled</td> 202 <td>Enabled</td>
185 <td><?php echo ($xml_ok) ? 'Enabled, and sane' : 'Disabled, or broken'; ?></td> 203 <?php echo ($xml_ok) ? '<td class="good">Enabled, and sane</span>' : '<td class="bad">Disabled, or broken'; ?></td>
186 </tr> 204 </tr>
187 <tr class="<?php echo ($pcre_ok) ? 'enabled' : 'disabled'; ?>"> 205 <tr class="<?php echo ($pcre_ok) ? 'enabled' : 'disabled'; ?>">
188 <td><a href="http://php.net/pcre">PCRE</a></td> 206 <td><a href="http://php.net/pcre">PCRE</a></td>
189 <td>Enabled</td> 207 <td>Enabled</td>
190 <td><?php echo ($pcre_ok) ? 'Enabled' : 'Disabled'; ?></td> 208 <?php echo ($pcre_ok) ? '<td class="good">Enabled' : '<td class="bad">Disabled'; ?></td>
191 </tr> 209 </tr>
192<!-- <tr class="<?php echo ($zlib_ok) ? 'enabled' : 'disabled'; ?>"> 210<!-- <tr class="<?php echo ($zlib_ok) ? 'enabled' : 'disabled'; ?>">
193 <td><a href="http://php.net/zlib">Zlib</a></td> 211 <td><a href="http://php.net/zlib">Zlib</a></td>
194 <td>Enabled</td> 212 <td>Enabled</td>
195 <td><?php echo ($zlib_ok) ? 'Enabled' : 'Disabled'; ?></td> 213 <?php echo ($zlib_ok) ? '<td class="good">Enabled' : '<td class="bad">Disabled'; ?></td>
196 </tr> --> 214 </tr> -->
197<!-- <tr class="<?php echo ($mbstring_ok) ? 'enabled' : 'disabled'; ?>"> 215<!-- <tr class="<?php echo ($mbstring_ok) ? 'enabled' : 'disabled'; ?>">
198 <td><a href="http://php.net/mbstring">mbstring</a></td> 216 <td><a href="http://php.net/mbstring">mbstring</a></td>
199 <td>Enabled</td> 217 <td>Enabled</td>
200 <td><?php echo ($mbstring_ok) ? 'Enabled' : 'Disabled'; ?></td> 218 <?php echo ($mbstring_ok) ? '<td class="good">Enabled' : '<td class="bad">Disabled'; ?></td>
201 </tr> --> 219 </tr> -->
202<!-- <tr class="<?php echo ($iconv_ok) ? 'enabled' : 'disabled'; ?>"> 220<!-- <tr class="<?php echo ($iconv_ok) ? 'enabled' : 'disabled'; ?>">
203 <td><a href="http://php.net/iconv">iconv</a></td> 221 <td><a href="http://php.net/iconv">iconv</a></td>
204 <td>Enabled</td> 222 <td>Enabled</td>
205 <td><?php echo ($iconv_ok) ? 'Enabled' : 'Disabled'; ?></td> 223 <?php echo ($iconv_ok) ? '<td class="good">Enabled' : '<td class="bad">Disabled'; ?></td>
206 </tr> --> 224 </tr> -->
207 <tr class="<?php echo ($filter_ok) ? 'enabled' : 'disabled'; ?>"> 225 <tr class="<?php echo ($filter_ok) ? 'enabled' : 'disabled'; ?>">
208 <td><a href="http://uk.php.net/manual/en/book.filter.php">Data filtering</a></td> 226 <td><a href="http://uk.php.net/manual/en/book.filter.php">Data filtering</a></td>
209 <td>Enabled</td> 227 <td>Enabled</td>
210 <td><?php echo ($filter_ok) ? 'Enabled' : 'Disabled'; ?></td> 228 <?php echo ($filter_ok) ? '<td class="good">Enabled' : '<td class="pass">Disabled'; ?></td>
211 </tr> 229 </tr>
212 <tr class="<?php echo ($tidy_ok) ? 'enabled' : 'disabled'; ?>"> 230 <tr class="<?php echo ($tidy_ok) ? 'enabled' : 'disabled'; ?>">
213 <td><a href="http://php.net/tidy">Tidy</a></td> 231 <td><a href="http://php.net/tidy">Tidy</a></td>
214 <td>Enabled</td> 232 <td>Enabled</td>
215 <td><?php echo ($tidy_ok) ? 'Enabled' : 'Disabled'; ?></td> 233 <?php echo ($tidy_ok) ? '<td class="good">Enabled' : '<td class="pass">Disabled'; ?></td>
216 </tr> 234 </tr>
217 <tr class="<?php echo ($curl_ok) ? 'enabled' : 'disabled'; ?>"> 235 <tr class="<?php echo ($curl_ok) ? 'enabled' : 'disabled'; ?>">
218 <td><a href="http://php.net/curl">cURL</a></td> 236 <td><a href="http://php.net/curl">cURL</a></td>
219 <td>Enabled</td> 237 <td>Enabled</td>
220 <td><?php echo (extension_loaded('curl')) ? 'Enabled' : 'Disabled'; ?></td> 238 <?php echo (extension_loaded('curl')) ? '<td class="good">Enabled' : '<td class="pass">Disabled'; ?></td>
221 </tr> 239 </tr>
222 <tr class="<?php echo ($parallel_ok) ? 'enabled' : 'disabled'; ?>"> 240 <tr class="<?php echo ($parallel_ok) ? 'enabled' : 'disabled'; ?>">
223 <td>Parallel URL fetching</td> 241 <td>Parallel URL fetching</td>
224 <td>Enabled</td> 242 <td>Enabled</td>
225 <td><?php echo ($parallel_ok) ? 'Enabled' : 'Disabled'; ?></td> 243 <?php echo ($parallel_ok) ? '<td class="good">Enabled' : '<td class="pass">Disabled'; ?></td>
226 </tr> 244 </tr>
227 <tr class="<?php echo ($allow_url_fopen_ok) ? 'enabled' : 'disabled'; ?>"> 245 <tr class="<?php echo ($allow_url_fopen_ok) ? 'enabled' : 'disabled'; ?>">
228 <td><a href="http://www.php.net/manual/en/filesystem.configuration.php#ini.allow-url-fopen">allow_url_fopen</a></td> 246 <td><a href="http://www.php.net/manual/en/filesystem.configuration.php#ini.allow-url-fopen">allow_url_fopen</a></td>
229 <td>Enabled</td> 247 <td>Enabled</td>
230 <td><?php echo ($allow_url_fopen_ok) ? 'Enabled' : 'Disabled'; ?></td> 248 <?php echo ($allow_url_fopen_ok) ? '<td class="good">Enabled' : '<td class="bad">Disabled'; ?></td>
231 </tr> 249 </tr>
250 <tr class="<?php echo ($gettext_ok) ? 'enabled' : 'disabled'; ?>">
251 <td><a href="http://php.net/manual/en/book.gettext.php">gettext</a></td>
252 <td>Enabled</td>
253 <?php echo ($gettext_ok) ? '<td class="good">Enabled' : '<td class="bad">Disabled'; ?></td>
254 </tr>
232 </tbody> 255 </tbody>
233 </table> 256 </table>
234 </div> 257 </div>
@@ -237,7 +260,7 @@ div.chunk {
237 <h3>What does this mean?</h3> 260 <h3>What does this mean?</h3>
238 <ol> 261 <ol>
239 <?php //if ($php_ok && $xml_ok && $pcre_ok && $mbstring_ok && $iconv_ok && $filter_ok && $zlib_ok && $tidy_ok && $curl_ok && $parallel_ok && $allow_url_fopen_ok): ?> 262 <?php //if ($php_ok && $xml_ok && $pcre_ok && $mbstring_ok && $iconv_ok && $filter_ok && $zlib_ok && $tidy_ok && $curl_ok && $parallel_ok && $allow_url_fopen_ok): ?>
240 <?php if ($php_ok && $xml_ok && $pcre_ok && $filter_ok && $tidy_ok && $curl_ok && $parallel_ok && $allow_url_fopen_ok): ?> 263 <?php if ($php_ok && $xml_ok && $pcre_ok && $filter_ok && $tidy_ok && $curl_ok && $parallel_ok && $allow_url_fopen_ok && $gettext_ok): ?>
241 <li><em>You have everything you need to run <?php echo $app_name; ?> properly! Congratulations!</em></li> 264 <li><em>You have everything you need to run <?php echo $app_name; ?> properly! Congratulations!</em></li>
242 <?php else: ?> 265 <?php else: ?>
243 <?php if ($php_ok): ?> 266 <?php if ($php_ok): ?>
@@ -250,59 +273,66 @@ div.chunk {
250 <?php if ($allow_url_fopen_ok): ?> 273 <?php if ($allow_url_fopen_ok): ?>
251 <li><strong>allow_url_fopen:</strong> You have allow_url_fopen enabled. <em>No problems here.</em></li> 274 <li><strong>allow_url_fopen:</strong> You have allow_url_fopen enabled. <em>No problems here.</em></li>
252 275
253 <?php if ($filter_ok): ?> 276 <?php if ($gettext_ok): ?>
254 <li><strong>Data filtering:</strong> You have the PHP filter extension enabled. <em>No problems here.</em></li> 277 <li><strong>Gettext:</strong> You have <code>gettext</code> enabled. <em>No problems here.</em></li>
278
279 <?php if ($filter_ok): ?>
280 <li><strong>Data filtering:</strong> You have the PHP filter extension enabled. <em>No problems here.</em></li>
255 281
256 <?php if ($zlib_ok): ?> 282 <?php if ($zlib_ok): ?>
257 <li><strong>Zlib:</strong> You have <code>Zlib</code> enabled. This allows SimplePie to support GZIP-encoded feeds. <em>No problems here.</em></li> 283 <li><strong>Zlib:</strong> You have <code>Zlib</code> enabled. This allows SimplePie to support GZIP-encoded feeds. <em>No problems here.</em></li>
258 <?php else: ?> 284 <?php else: ?>
259 <li><strong>Zlib:</strong> The <code>Zlib</code> extension is not available. SimplePie will ignore any GZIP-encoding, and instead handle feeds as uncompressed text.</li> 285 <li><strong>Zlib:</strong> The <code>Zlib</code> extension is not available. SimplePie will ignore any GZIP-encoding, and instead handle feeds as uncompressed text.</li>
260 <?php endif; ?> 286 <?php endif; ?>
287
288 <?php if ($mbstring_ok && $iconv_ok): ?>
289 <li><strong>mbstring and iconv:</strong> You have both <code>mbstring</code> and <code>iconv</code> installed! This will allow <?php echo $app_name; ?> to handle the greatest number of languages. <em>No problems here.</em></li>
290 <?php elseif ($mbstring_ok): ?>
291 <li><strong>mbstring:</strong> <code>mbstring</code> is installed, but <code>iconv</code> is not.</li>
292 <?php elseif ($iconv_ok): ?>
293 <li><strong>iconv:</strong> <code>iconv</code> is installed, but <code>mbstring</code> is not.</li>
294 <?php else: ?>
295 <li><strong>mbstring and iconv:</strong> <em>You do not have either of the extensions installed.</em> This will significantly impair your ability to read non-English feeds, as well as even some English ones.</li>
296 <?php endif; ?>
297
298 <?php if ($tidy_ok): ?>
299 <li><strong>Tidy:</strong> You have <code>Tidy</code> support installed. <em>No problems here.</em></li>
300 <?php else: ?>
301 <li><strong>Tidy:</strong> The <code>Tidy</code> extension is not available. <?php echo $app_name; ?> should still work with most feeds, but you may experience problems with some.</li>
302 <?php endif; ?>
303
304 <?php if ($curl_ok): ?>
305 <li><strong>cURL:</strong> You have <code>cURL</code> support installed. <em>No problems here.</em></li>
306 <?php else: ?>
307 <li><strong>cURL:</strong> The <code>cURL</code> extension is not available. SimplePie will use <code>fsockopen()</code> instead.</li>
308 <?php endif; ?>
261 309
262 <?php if ($mbstring_ok && $iconv_ok): ?> 310 <?php if ($parallel_ok): ?>
263 <li><strong>mbstring and iconv:</strong> You have both <code>mbstring</code> and <code>iconv</code> installed! This will allow <?php echo $app_name; ?> to handle the greatest number of languages. <em>No problems here.</em></li> 311 <li><strong>Parallel URL fetching:</strong> You have <code>HttpRequestPool</code> or <code>curl_multi</code> support installed. <em>No problems here.</em></li>
264 <?php elseif ($mbstring_ok): ?> 312 <?php else: ?>
265 <li><strong>mbstring:</strong> <code>mbstring</code> is installed, but <code>iconv</code> is not.</li> 313 <li><strong>Parallel URL fetching:</strong> <code>HttpRequestPool</code> or <code>curl_multi</code> support is not available. <?php echo $app_name; ?> will use <code>file_get_contents()</code> instead to fetch URLs sequentially rather than in parallel.</li>
266 <?php elseif ($iconv_ok): ?> 314 <?php endif; ?>
267 <li><strong>iconv:</strong> <code>iconv</code> is installed, but <code>mbstring</code> is not.</li>
268 <?php else: ?>
269 <li><strong>mbstring and iconv:</strong> <em>You do not have either of the extensions installed.</em> This will significantly impair your ability to read non-English feeds, as well as even some English ones.</li>
270 <?php endif; ?>
271 315
272 <?php if ($tidy_ok): ?>
273 <li><strong>Tidy:</strong> You have <code>Tidy</code> support installed. <em>No problems here.</em></li>
274 <?php else: ?> 316 <?php else: ?>
275 <li><strong>Tidy:</strong> The <code>Tidy</code> extension is not available. <?php echo $app_name; ?> should still work with most feeds, but you may experience problems with some.</li> 317 <li><strong>Data filtering:</strong> Your PHP configuration has the filter extension disabled. <strong><?php echo $app_name; ?> will not work here.</strong></li>
276 <?php endif; ?> 318 <?php endif; ?>
277 319
278 <?php if ($curl_ok): ?>
279 <li><strong>cURL:</strong> You have <code>cURL</code> support installed. <em>No problems here.</em></li>
280 <?php else: ?>
281 <li><strong>cURL:</strong> The <code>cURL</code> extension is not available. SimplePie will use <code>fsockopen()</code> instead.</li>
282 <?php endif; ?>
283
284 <?php if ($parallel_ok): ?>
285 <li><strong>Parallel URL fetching:</strong> You have <code>HttpRequestPool</code> or <code>curl_multi</code> support installed. <em>No problems here.</em></li>
286 <?php else: ?>
287 <li><strong>Parallel URL fetching:</strong> <code>HttpRequestPool</code> or <code>curl_multi</code> support is not available. <?php echo $app_name; ?> will use <code>file_get_contents()</code> instead to fetch URLs sequentially rather than in parallel.</li>
288 <?php endif; ?>
289
290 <?php else: ?> 320 <?php else: ?>
291 <li><strong>Data filtering:</strong> Your PHP configuration has the filter extension disabled. <em><?php echo $app_name; ?> will not work here.</em></li> 321 <li><strong>GetText:</strong> The <code>gettext</code> extension is not available. The system we use to display wallabag in various languages is not available. <strong><?php echo $app_name; ?> will not work here.</strong></li>
292 <?php endif; ?> 322 <?php endif; ?>
293 323
294 <?php else: ?> 324 <?php else: ?>
295 <li><strong>allow_url_fopen:</strong> Your PHP configuration has allow_url_fopen disabled. <em><?php echo $app_name; ?> will not work here.</em></li> 325 <li><strong>allow_url_fopen:</strong> Your PHP configuration has allow_url_fopen disabled. <strong><?php echo $app_name; ?> will not work here.</strong></li>
296 <?php endif; ?> 326 <?php endif; ?>
297 327
298 <?php else: ?> 328 <?php else: ?>
299 <li><strong>PCRE:</strong> Your PHP installation doesn't support Perl-Compatible Regular Expressions. <em><?php echo $app_name; ?> will not work here.</em></li> 329 <li><strong>PCRE:</strong> Your PHP installation doesn't support Perl-Compatible Regular Expressions. <strong><?php echo $app_name; ?> will not work here.</strong></li>
300 <?php endif; ?> 330 <?php endif; ?>
301 <?php else: ?> 331 <?php else: ?>
302 <li><strong>XML:</strong> Your PHP installation doesn't support XML parsing. <em><?php echo $app_name; ?> will not work here.</em></li> 332 <li><strong>XML:</strong> Your PHP installation doesn't support XML parsing. <strong><?php echo $app_name; ?> will not work here.</strong></li>
303 <?php endif; ?> 333 <?php endif; ?>
304 <?php else: ?> 334 <?php else: ?>
305 <li><strong>PHP:</strong> You are running an unsupported version of PHP. <em><?php echo $app_name; ?> will not work here.</em></li> 335 <li><strong>PHP:</strong> You are running an unsupported version of PHP. <strong><?php echo $app_name; ?> will not work here.</strong></li>
306 <?php endif; ?> 336 <?php endif; ?>
307 <?php endif; ?> 337 <?php endif; ?>
308 </ol> 338 </ol>
@@ -310,16 +340,26 @@ div.chunk {
310 340
311 <div class="chunk"> 341 <div class="chunk">
312 <?php //if ($php_ok && $xml_ok && $pcre_ok && $mbstring_ok && $iconv_ok && $filter_ok && $allow_url_fopen_ok) { ?> 342 <?php //if ($php_ok && $xml_ok && $pcre_ok && $mbstring_ok && $iconv_ok && $filter_ok && $allow_url_fopen_ok) { ?>
313 <?php if ($php_ok && $xml_ok && $pcre_ok && $filter_ok && $allow_url_fopen_ok) { ?> 343 <?php if ($php_ok && $xml_ok && $pcre_ok && $filter_ok && $allow_url_fopen_ok && $gettext_ok) { ?>
314 <h3>Bottom Line: Yes, you can!</h3> 344 <h3>Bottom Line: Yes, you can!</h3>
315 <p><em>Your webhost has its act together!</em></p> 345 <p><em>Your webhost has its act together!</em></p>
346 <?php if (!$frominstall) { ?>
316 <p>You can download the latest version of <?php echo $app_name; ?> from <a href="http://wallabag.org/download">wallabag.org</a>.</p> 347 <p>You can download the latest version of <?php echo $app_name; ?> from <a href="http://wallabag.org/download">wallabag.org</a>.</p>
348 <p>If you already have done that, you should access <a href="index.php">the index.php file</a> of your installation to configure and/or start using wallabag</p>
349 <?php } else { ?>
350 <p>You can now <a href="index.php">return to the installation section</a>.</p>
351 <?php } ?>
317 <p><strong>Note</strong>: Passing this test does not guarantee that <?php echo $app_name; ?> will run on your webhost &mdash; it only ensures that the basic requirements have been addressed. If you experience any problems, please let us know.</p> 352 <p><strong>Note</strong>: Passing this test does not guarantee that <?php echo $app_name; ?> will run on your webhost &mdash; it only ensures that the basic requirements have been addressed. If you experience any problems, please let us know.</p>
318 <?php //} else if ($php_ok && $xml_ok && $pcre_ok && $mbstring_ok && $allow_url_fopen_ok && $filter_ok) { ?> 353 <?php //} else if ($php_ok && $xml_ok && $pcre_ok && $mbstring_ok && $allow_url_fopen_ok && $filter_ok) { ?>
319 <?php } else if ($php_ok && $xml_ok && $pcre_ok && $allow_url_fopen_ok && $filter_ok) { ?> 354 <?php } else if ($php_ok && $xml_ok && $pcre_ok && $allow_url_fopen_ok && $filter_ok && $gettext_ok) { ?>
320 <h3>Bottom Line: Yes, you can!</h3> 355 <h3>Bottom Line: Yes, you can!</h3>
321 <p><em>For most feeds, it'll run with no problems.</em> There are certain languages that you might have a hard time with though.</p> 356 <p><em>For most feeds, it'll run with no problems.</em> There are certain languages that you might have a hard time with though.</p>
357 <?php if (!$frominstall) { ?>
322 <p>You can download the latest version of <?php echo $app_name; ?> from <a href="http://wallabag.org/download">wallabag.org</a>.</p> 358 <p>You can download the latest version of <?php echo $app_name; ?> from <a href="http://wallabag.org/download">wallabag.org</a>.</p>
359 <p>If you already have done that, you should access <a href="index.php">the index.php file</a> of your installation to configure and/or start using wallabag</p>
360 <?php } else { ?>
361 <p>You can now <a href="index.php">return to the installation section</a>.</p>
362 <?php } ?>
323 <p><strong>Note</strong>: Passing this test does not guarantee that <?php echo $app_name; ?> will run on your webhost &mdash; it only ensures that the basic requirements have been addressed. If you experience any problems, please let us know.</p> 363 <p><strong>Note</strong>: Passing this test does not guarantee that <?php echo $app_name; ?> will run on your webhost &mdash; it only ensures that the basic requirements have been addressed. If you experience any problems, please let us know.</p>
324 <?php } else { ?> 364 <?php } else { ?>
325 <h3>Bottom Line: We're sorry…</h3> 365 <h3>Bottom Line: We're sorry…</h3>