NextGEN Gallery – WordPress Gallery Plugin - Version 3.29

Version Description

  • 09.28.2022 =
  • Fixed: Added nonce verification to some legacy XHR handlers.
Download this release

Release Info

Developer photocrati
Plugin Icon 128x128 NextGEN Gallery – WordPress Gallery Plugin
Version 3.29
Comparing to
See all releases

Code changes from version 3.28 to 3.29

Files changed (100) hide show
  1. changelog.txt +4 -1
  2. composer.lock +26 -16
  3. nextgen-gallery/LICENSE +674 -0
  4. nextgen-gallery/changelog.txt +2063 -0
  5. nextgen-gallery/composer.json +20 -0
  6. nextgen-gallery/composer.lock +187 -0
  7. nextgen-gallery/index.html +0 -0
  8. nextgen-gallery/license.txt +340 -0
  9. nextgen-gallery/nggallery.php +813 -0
  10. nextgen-gallery/non_pope/class.nextgen_serializable.php +86 -0
  11. nextgen-gallery/non_pope/class.nextgen_settings.php +29 -0
  12. nextgen-gallery/non_pope/class.nextgen_shortcode_manager.php +342 -0
  13. nextgen-gallery/non_pope/class.photocrati_installer.php +309 -0
  14. nextgen-gallery/non_pope/class.photocrati_resource_manager.php +270 -0
  15. nextgen-gallery/non_pope/class.photocrati_settings_manager.php +315 -0
  16. nextgen-gallery/non_pope/class.photocrati_transient_manager.php +250 -0
  17. nextgen-gallery/products/photocrati_nextgen/class.nextgen_product_installer.php +103 -0
  18. nextgen-gallery/products/photocrati_nextgen/modules/ajax/README.txt +30 -0
  19. nextgen-gallery/products/photocrati_nextgen/modules/ajax/module.ajax.php +140 -0
  20. nextgen-gallery/products/photocrati_nextgen/modules/ajax/package.module.ajax.php +69 -0
  21. nextgen-gallery/products/photocrati_nextgen/modules/ajax/static/ajax.min.js +53 -0
  22. nextgen-gallery/products/photocrati_nextgen/modules/ajax/static/persist.swf +0 -0
  23. nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/module.attach_to_post.php +605 -0
  24. nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/package.module.attach_to_post.php +853 -0
  25. nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/atp_button.png +0 -0
  26. nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/attach_to_post.css +832 -0
  27. nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/attach_to_post.js +259 -0
  28. nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/attach_to_post.min.css +1 -0
  29. nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/attach_to_post.min.js +1 -0
  30. nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/attach_to_post_dialog.css +213 -0
  31. nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/attach_to_post_dialog.min.css +1 -0
  32. nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/base64.js +231 -0
  33. nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/base64.min.js +1 -0
  34. nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/display_tab.js +1766 -0
  35. nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/display_tab.min.js +1 -0
  36. nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/iframely.css +209 -0
  37. nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/iframely.js +55 -0
  38. nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/iframely.min.css +1 -0
  39. nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/iframely.min.js +1 -0
  40. nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/igw.js +53 -0
  41. nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/igw.min.js +1 -0
  42. nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/igw_button.png +0 -0
  43. nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/invalid_image.png +0 -0
  44. nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/nextgen.gif +0 -0
  45. nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/ngg_attach_to_post_tinymce_plugin.css +64 -0
  46. nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/ngg_attach_to_post_tinymce_plugin.js +300 -0
  47. nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/ngg_attach_to_post_tinymce_plugin.min.css +1 -0
  48. nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/ngg_attach_to_post_tinymce_plugin.min.js +1 -0
  49. nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/ngg_tabs.js +70 -0
  50. nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/ngg_tabs.min.js +1 -0
  51. nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/spinner.gif +0 -0
  52. nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/uploader-icons-2x.png +0 -0
  53. nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/uploader-icons.png +0 -0
  54. nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/templates/attach_to_post.php +33 -0
  55. nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/templates/display_settings_form.php +7 -0
  56. nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/templates/display_tab.php +34 -0
  57. nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/templates/display_tab_source.php +3 -0
  58. nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/templates/display_tab_type.php +3 -0
  59. nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/templates/no_display_type_selected.php +3 -0
  60. nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/templates/preview_tab.php +3 -0
  61. nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/templates/tinymce_placeholder.php +16 -0
  62. nextgen-gallery/products/photocrati_nextgen/modules/cache/module.cache.php +46 -0
  63. nextgen-gallery/products/photocrati_nextgen/modules/cache/package.module.cache.php +74 -0
  64. nextgen-gallery/products/photocrati_nextgen/modules/datamapper/README.txt +1 -0
  65. nextgen-gallery/products/photocrati_nextgen/modules/datamapper/module.datamapper.php +247 -0
  66. nextgen-gallery/products/photocrati_nextgen/modules/datamapper/package.module.datamapper.php +1926 -0
  67. nextgen-gallery/products/photocrati_nextgen/modules/dynamic_stylesheet/module.dynamic_stylesheet.php +88 -0
  68. nextgen-gallery/products/photocrati_nextgen/modules/dynamic_stylesheet/package.module.dynamic_stylesheet.php +126 -0
  69. nextgen-gallery/products/photocrati_nextgen/modules/dynamic_stylesheet/static/blank.css +1 -0
  70. nextgen-gallery/products/photocrati_nextgen/modules/dynamic_stylesheet/static/blank.min.css +0 -0
  71. nextgen-gallery/products/photocrati_nextgen/modules/dynamic_thumbnails/module.dynamic_thumbnails.php +79 -0
  72. nextgen-gallery/products/photocrati_nextgen/modules/dynamic_thumbnails/package.module.dynamic_thumbnails.php +66 -0
  73. nextgen-gallery/products/photocrati_nextgen/modules/dynamic_thumbnails/static/invalid_image.png +0 -0
  74. nextgen-gallery/products/photocrati_nextgen/modules/frame_communication/module.frame_communication.php +104 -0
  75. nextgen-gallery/products/photocrati_nextgen/modules/frame_communication/package.module.frame_communication.php +74 -0
  76. nextgen-gallery/products/photocrati_nextgen/modules/frame_communication/static/frame_event_publisher.js +191 -0
  77. nextgen-gallery/products/photocrati_nextgen/modules/frame_communication/static/frame_event_publisher.min.js +1 -0
  78. nextgen-gallery/products/photocrati_nextgen/modules/fs/module.fs.php +42 -0
  79. nextgen-gallery/products/photocrati_nextgen/modules/fs/package.module.fs.php +335 -0
  80. nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery-bs_BA.mo +0 -0
  81. nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery-cs_CZ.mo +0 -0
  82. nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery-da_DK.mo +0 -0
  83. nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery-da_DK.po +3981 -0
  84. nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery-de_DE.mo +0 -0
  85. nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery-el.mo +0 -0
  86. nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery-es_ES.mo +0 -0
  87. nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery-fi.mo +0 -0
  88. nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery-fil.mo +0 -0
  89. nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery-fr_FR.mo +0 -0
  90. nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery-hu_HU.mo +0 -0
  91. nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery-it_IT.mo +0 -0
  92. nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery-nl_NL.mo +0 -0
  93. nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery-pl_PL.mo +0 -0
  94. nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery-ru_RU.mo +0 -0
  95. nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery-sk_SK.mo +0 -0
  96. nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery-sv_SE.mo +0 -0
  97. nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery-sv_SE.po +3234 -0
  98. nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery-uk.mo +0 -0
  99. nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery-zh_CN.mo +0 -0
  100. nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery.pot +1341 -0
changelog.txt CHANGED
@@ -1,8 +1,11 @@
1
  NextGEN Gallery
2
  by Imagely
3
 
 
 
 
4
  = V3.28 - 07.20.2022 =
5
- * NEW: Added NGG_DISABLE_IMAGICK constant to disable use of ImageMagick
6
 
7
  = V3.27 - 05.25.2022 =
8
  * Fixed: A possible PHP warning in the third party compatibility warning.
1
  NextGEN Gallery
2
  by Imagely
3
 
4
+ = V3.29 - 09.28.2022 =
5
+ * Fixed: Added nonce verification to some legacy XHR handlers.
6
+
7
  = V3.28 - 07.20.2022 =
8
+ * NEW: Added NGG_DISABLE_IMAGICK constant to disable use of ImageMagick.
9
 
10
  = V3.27 - 05.25.2022 =
11
  * Fixed: A possible PHP warning in the third party compatibility warning.
composer.lock CHANGED
@@ -8,16 +8,16 @@
8
  "packages": [
9
  {
10
  "name": "ezyang/htmlpurifier",
11
- "version": "v4.14.0",
12
  "source": {
13
  "type": "git",
14
  "url": "https://github.com/ezyang/htmlpurifier.git",
15
- "reference": "12ab42bd6e742c70c0a52f7b82477fcd44e64b75"
16
  },
17
  "dist": {
18
  "type": "zip",
19
- "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/12ab42bd6e742c70c0a52f7b82477fcd44e64b75",
20
- "reference": "12ab42bd6e742c70c0a52f7b82477fcd44e64b75",
21
  "shasum": "",
22
  "mirrors": [
23
  {
@@ -27,16 +27,26 @@
27
  ]
28
  },
29
  "require": {
30
- "php": ">=5.2"
 
 
 
 
 
 
 
 
 
 
31
  },
32
  "type": "library",
33
  "autoload": {
34
- "psr-0": {
35
- "HTMLPurifier": "library/"
36
- },
37
  "files": [
38
  "library/HTMLPurifier.composer.php"
39
  ],
 
 
 
40
  "exclude-from-classmap": [
41
  "/library/HTMLPurifier/Language/"
42
  ]
@@ -59,9 +69,9 @@
59
  ],
60
  "support": {
61
  "issues": "https://github.com/ezyang/htmlpurifier/issues",
62
- "source": "https://github.com/ezyang/htmlpurifier/tree/v4.14.0"
63
  },
64
- "time": "2021-12-25T01:21:49+00:00"
65
  },
66
  {
67
  "name": "imagely/pope-framework",
@@ -105,16 +115,16 @@
105
  "packages-dev": [
106
  {
107
  "name": "nikic/php-parser",
108
- "version": "v4.14.0",
109
  "source": {
110
  "type": "git",
111
  "url": "https://github.com/nikic/PHP-Parser.git",
112
- "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1"
113
  },
114
  "dist": {
115
  "type": "zip",
116
- "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/34bea19b6e03d8153165d8f30bba4c3be86184c1",
117
- "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1",
118
  "shasum": "",
119
  "mirrors": [
120
  {
@@ -161,9 +171,9 @@
161
  ],
162
  "support": {
163
  "issues": "https://github.com/nikic/PHP-Parser/issues",
164
- "source": "https://github.com/nikic/PHP-Parser/tree/v4.14.0"
165
  },
166
- "time": "2022-05-31T20:59:12+00:00"
167
  }
168
  ],
169
  "aliases": [],
8
  "packages": [
9
  {
10
  "name": "ezyang/htmlpurifier",
11
+ "version": "v4.16.0",
12
  "source": {
13
  "type": "git",
14
  "url": "https://github.com/ezyang/htmlpurifier.git",
15
+ "reference": "523407fb06eb9e5f3d59889b3978d5bfe94299c8"
16
  },
17
  "dist": {
18
  "type": "zip",
19
+ "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/523407fb06eb9e5f3d59889b3978d5bfe94299c8",
20
+ "reference": "523407fb06eb9e5f3d59889b3978d5bfe94299c8",
21
  "shasum": "",
22
  "mirrors": [
23
  {
27
  ]
28
  },
29
  "require": {
30
+ "php": "~5.6.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0"
31
+ },
32
+ "require-dev": {
33
+ "cerdic/css-tidy": "^1.7 || ^2.0",
34
+ "simpletest/simpletest": "dev-master"
35
+ },
36
+ "suggest": {
37
+ "cerdic/css-tidy": "If you want to use the filter 'Filter.ExtractStyleBlocks'.",
38
+ "ext-bcmath": "Used for unit conversion and imagecrash protection",
39
+ "ext-iconv": "Converts text to and from non-UTF-8 encodings",
40
+ "ext-tidy": "Used for pretty-printing HTML"
41
  },
42
  "type": "library",
43
  "autoload": {
 
 
 
44
  "files": [
45
  "library/HTMLPurifier.composer.php"
46
  ],
47
+ "psr-0": {
48
+ "HTMLPurifier": "library/"
49
+ },
50
  "exclude-from-classmap": [
51
  "/library/HTMLPurifier/Language/"
52
  ]
69
  ],
70
  "support": {
71
  "issues": "https://github.com/ezyang/htmlpurifier/issues",
72
+ "source": "https://github.com/ezyang/htmlpurifier/tree/v4.16.0"
73
  },
74
+ "time": "2022-09-18T07:06:19+00:00"
75
  },
76
  {
77
  "name": "imagely/pope-framework",
115
  "packages-dev": [
116
  {
117
  "name": "nikic/php-parser",
118
+ "version": "v4.15.1",
119
  "source": {
120
  "type": "git",
121
  "url": "https://github.com/nikic/PHP-Parser.git",
122
+ "reference": "0ef6c55a3f47f89d7a374e6f835197a0b5fcf900"
123
  },
124
  "dist": {
125
  "type": "zip",
126
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/0ef6c55a3f47f89d7a374e6f835197a0b5fcf900",
127
+ "reference": "0ef6c55a3f47f89d7a374e6f835197a0b5fcf900",
128
  "shasum": "",
129
  "mirrors": [
130
  {
171
  ],
172
  "support": {
173
  "issues": "https://github.com/nikic/PHP-Parser/issues",
174
+ "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.1"
175
  },
176
+ "time": "2022-09-04T07:30:47+00:00"
177
  }
178
  ],
179
  "aliases": [],
nextgen-gallery/LICENSE ADDED
@@ -0,0 +1,674 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ GNU GENERAL PUBLIC LICENSE
2
+ Version 3, 29 June 2007
3
+
4
+ Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
5
+ Everyone is permitted to copy and distribute verbatim copies
6
+ of this license document, but changing it is not allowed.
7
+
8
+ Preamble
9
+
10
+ The GNU General Public License is a free, copyleft license for
11
+ software and other kinds of works.
12
+
13
+ The licenses for most software and other practical works are designed
14
+ to take away your freedom to share and change the works. By contrast,
15
+ the GNU General Public License is intended to guarantee your freedom to
16
+ share and change all versions of a program--to make sure it remains free
17
+ software for all its users. We, the Free Software Foundation, use the
18
+ GNU General Public License for most of our software; it applies also to
19
+ any other work released this way by its authors. You can apply it to
20
+ your programs, too.
21
+
22
+ When we speak of free software, we are referring to freedom, not
23
+ price. Our General Public Licenses are designed to make sure that you
24
+ have the freedom to distribute copies of free software (and charge for
25
+ them if you wish), that you receive source code or can get it if you
26
+ want it, that you can change the software or use pieces of it in new
27
+ free programs, and that you know you can do these things.
28
+
29
+ To protect your rights, we need to prevent others from denying you
30
+ these rights or asking you to surrender the rights. Therefore, you have
31
+ certain responsibilities if you distribute copies of the software, or if
32
+ you modify it: responsibilities to respect the freedom of others.
33
+
34
+ For example, if you distribute copies of such a program, whether
35
+ gratis or for a fee, you must pass on to the recipients the same
36
+ freedoms that you received. You must make sure that they, too, receive
37
+ or can get the source code. And you must show them these terms so they
38
+ know their rights.
39
+
40
+ Developers that use the GNU GPL protect your rights with two steps:
41
+ (1) assert copyright on the software, and (2) offer you this License
42
+ giving you legal permission to copy, distribute and/or modify it.
43
+
44
+ For the developers' and authors' protection, the GPL clearly explains
45
+ that there is no warranty for this free software. For both users' and
46
+ authors' sake, the GPL requires that modified versions be marked as
47
+ changed, so that their problems will not be attributed erroneously to
48
+ authors of previous versions.
49
+
50
+ Some devices are designed to deny users access to install or run
51
+ modified versions of the software inside them, although the manufacturer
52
+ can do so. This is fundamentally incompatible with the aim of
53
+ protecting users' freedom to change the software. The systematic
54
+ pattern of such abuse occurs in the area of products for individuals to
55
+ use, which is precisely where it is most unacceptable. Therefore, we
56
+ have designed this version of the GPL to prohibit the practice for those
57
+ products. If such problems arise substantially in other domains, we
58
+ stand ready to extend this provision to those domains in future versions
59
+ of the GPL, as needed to protect the freedom of users.
60
+
61
+ Finally, every program is threatened constantly by software patents.
62
+ States should not allow patents to restrict development and use of
63
+ software on general-purpose computers, but in those that do, we wish to
64
+ avoid the special danger that patents applied to a free program could
65
+ make it effectively proprietary. To prevent this, the GPL assures that
66
+ patents cannot be used to render the program non-free.
67
+
68
+ The precise terms and conditions for copying, distribution and
69
+ modification follow.
70
+
71
+ TERMS AND CONDITIONS
72
+
73
+ 0. Definitions.
74
+
75
+ "This License" refers to version 3 of the GNU General Public License.
76
+
77
+ "Copyright" also means copyright-like laws that apply to other kinds of
78
+ works, such as semiconductor masks.
79
+
80
+ "The Program" refers to any copyrightable work licensed under this
81
+ License. Each licensee is addressed as "you". "Licensees" and
82
+ "recipients" may be individuals or organizations.
83
+
84
+ To "modify" a work means to copy from or adapt all or part of the work
85
+ in a fashion requiring copyright permission, other than the making of an
86
+ exact copy. The resulting work is called a "modified version" of the
87
+ earlier work or a work "based on" the earlier work.
88
+
89
+ A "covered work" means either the unmodified Program or a work based
90
+ on the Program.
91
+
92
+ To "propagate" a work means to do anything with it that, without
93
+ permission, would make you directly or secondarily liable for
94
+ infringement under applicable copyright law, except executing it on a
95
+ computer or modifying a private copy. Propagation includes copying,
96
+ distribution (with or without modification), making available to the
97
+ public, and in some countries other activities as well.
98
+
99
+ To "convey" a work means any kind of propagation that enables other
100
+ parties to make or receive copies. Mere interaction with a user through
101
+ a computer network, with no transfer of a copy, is not conveying.
102
+
103
+ An interactive user interface displays "Appropriate Legal Notices"
104
+ to the extent that it includes a convenient and prominently visible
105
+ feature that (1) displays an appropriate copyright notice, and (2)
106
+ tells the user that there is no warranty for the work (except to the
107
+ extent that warranties are provided), that licensees may convey the
108
+ work under this License, and how to view a copy of this License. If
109
+ the interface presents a list of user commands or options, such as a
110
+ menu, a prominent item in the list meets this criterion.
111
+
112
+ 1. Source Code.
113
+
114
+ The "source code" for a work means the preferred form of the work
115
+ for making modifications to it. "Object code" means any non-source
116
+ form of a work.
117
+
118
+ A "Standard Interface" means an interface that either is an official
119
+ standard defined by a recognized standards body, or, in the case of
120
+ interfaces specified for a particular programming language, one that
121
+ is widely used among developers working in that language.
122
+
123
+ The "System Libraries" of an executable work include anything, other
124
+ than the work as a whole, that (a) is included in the normal form of
125
+ packaging a Major Component, but which is not part of that Major
126
+ Component, and (b) serves only to enable use of the work with that
127
+ Major Component, or to implement a Standard Interface for which an
128
+ implementation is available to the public in source code form. A
129
+ "Major Component", in this context, means a major essential component
130
+ (kernel, window system, and so on) of the specific operating system
131
+ (if any) on which the executable work runs, or a compiler used to
132
+ produce the work, or an object code interpreter used to run it.
133
+
134
+ The "Corresponding Source" for a work in object code form means all
135
+ the source code needed to generate, install, and (for an executable
136
+ work) run the object code and to modify the work, including scripts to
137
+ control those activities. However, it does not include the work's
138
+ System Libraries, or general-purpose tools or generally available free
139
+ programs which are used unmodified in performing those activities but
140
+ which are not part of the work. For example, Corresponding Source
141
+ includes interface definition files associated with source files for
142
+ the work, and the source code for shared libraries and dynamically
143
+ linked subprograms that the work is specifically designed to require,
144
+ such as by intimate data communication or control flow between those
145
+ subprograms and other parts of the work.
146
+
147
+ The Corresponding Source need not include anything that users
148
+ can regenerate automatically from other parts of the Corresponding
149
+ Source.
150
+
151
+ The Corresponding Source for a work in source code form is that
152
+ same work.
153
+
154
+ 2. Basic Permissions.
155
+
156
+ All rights granted under this License are granted for the term of
157
+ copyright on the Program, and are irrevocable provided the stated
158
+ conditions are met. This License explicitly affirms your unlimited
159
+ permission to run the unmodified Program. The output from running a
160
+ covered work is covered by this License only if the output, given its
161
+ content, constitutes a covered work. This License acknowledges your
162
+ rights of fair use or other equivalent, as provided by copyright law.
163
+
164
+ You may make, run and propagate covered works that you do not
165
+ convey, without conditions so long as your license otherwise remains
166
+ in force. You may convey covered works to others for the sole purpose
167
+ of having them make modifications exclusively for you, or provide you
168
+ with facilities for running those works, provided that you comply with
169
+ the terms of this License in conveying all material for which you do
170
+ not control copyright. Those thus making or running the covered works
171
+ for you must do so exclusively on your behalf, under your direction
172
+ and control, on terms that prohibit them from making any copies of
173
+ your copyrighted material outside their relationship with you.
174
+
175
+ Conveying under any other circumstances is permitted solely under
176
+ the conditions stated below. Sublicensing is not allowed; section 10
177
+ makes it unnecessary.
178
+
179
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
180
+
181
+ No covered work shall be deemed part of an effective technological
182
+ measure under any applicable law fulfilling obligations under article
183
+ 11 of the WIPO copyright treaty adopted on 20 December 1996, or
184
+ similar laws prohibiting or restricting circumvention of such
185
+ measures.
186
+
187
+ When you convey a covered work, you waive any legal power to forbid
188
+ circumvention of technological measures to the extent such circumvention
189
+ is effected by exercising rights under this License with respect to
190
+ the covered work, and you disclaim any intention to limit operation or
191
+ modification of the work as a means of enforcing, against the work's
192
+ users, your or third parties' legal rights to forbid circumvention of
193
+ technological measures.
194
+
195
+ 4. Conveying Verbatim Copies.
196
+
197
+ You may convey verbatim copies of the Program's source code as you
198
+ receive it, in any medium, provided that you conspicuously and
199
+ appropriately publish on each copy an appropriate copyright notice;
200
+ keep intact all notices stating that this License and any
201
+ non-permissive terms added in accord with section 7 apply to the code;
202
+ keep intact all notices of the absence of any warranty; and give all
203
+ recipients a copy of this License along with the Program.
204
+
205
+ You may charge any price or no price for each copy that you convey,
206
+ and you may offer support or warranty protection for a fee.
207
+
208
+ 5. Conveying Modified Source Versions.
209
+
210
+ You may convey a work based on the Program, or the modifications to
211
+ produce it from the Program, in the form of source code under the
212
+ terms of section 4, provided that you also meet all of these conditions:
213
+
214
+ a) The work must carry prominent notices stating that you modified
215
+ it, and giving a relevant date.
216
+
217
+ b) The work must carry prominent notices stating that it is
218
+ released under this License and any conditions added under section
219
+ 7. This requirement modifies the requirement in section 4 to
220
+ "keep intact all notices".
221
+
222
+ c) You must license the entire work, as a whole, under this
223
+ License to anyone who comes into possession of a copy. This
224
+ License will therefore apply, along with any applicable section 7
225
+ additional terms, to the whole of the work, and all its parts,
226
+ regardless of how they are packaged. This License gives no
227
+ permission to license the work in any other way, but it does not
228
+ invalidate such permission if you have separately received it.
229
+
230
+ d) If the work has interactive user interfaces, each must display
231
+ Appropriate Legal Notices; however, if the Program has interactive
232
+ interfaces that do not display Appropriate Legal Notices, your
233
+ work need not make them do so.
234
+
235
+ A compilation of a covered work with other separate and independent
236
+ works, which are not by their nature extensions of the covered work,
237
+ and which are not combined with it such as to form a larger program,
238
+ in or on a volume of a storage or distribution medium, is called an
239
+ "aggregate" if the compilation and its resulting copyright are not
240
+ used to limit the access or legal rights of the compilation's users
241
+ beyond what the individual works permit. Inclusion of a covered work
242
+ in an aggregate does not cause this License to apply to the other
243
+ parts of the aggregate.
244
+
245
+ 6. Conveying Non-Source Forms.
246
+
247
+ You may convey a covered work in object code form under the terms
248
+ of sections 4 and 5, provided that you also convey the
249
+ machine-readable Corresponding Source under the terms of this License,
250
+ in one of these ways:
251
+
252
+ a) Convey the object code in, or embodied in, a physical product
253
+ (including a physical distribution medium), accompanied by the
254
+ Corresponding Source fixed on a durable physical medium
255
+ customarily used for software interchange.
256
+
257
+ b) Convey the object code in, or embodied in, a physical product
258
+ (including a physical distribution medium), accompanied by a
259
+ written offer, valid for at least three years and valid for as
260
+ long as you offer spare parts or customer support for that product
261
+ model, to give anyone who possesses the object code either (1) a
262
+ copy of the Corresponding Source for all the software in the
263
+ product that is covered by this License, on a durable physical
264
+ medium customarily used for software interchange, for a price no
265
+ more than your reasonable cost of physically performing this
266
+ conveying of source, or (2) access to copy the
267
+ Corresponding Source from a network server at no charge.
268
+
269
+ c) Convey individual copies of the object code with a copy of the
270
+ written offer to provide the Corresponding Source. This
271
+ alternative is allowed only occasionally and noncommercially, and
272
+ only if you received the object code with such an offer, in accord
273
+ with subsection 6b.
274
+
275
+ d) Convey the object code by offering access from a designated
276
+ place (gratis or for a charge), and offer equivalent access to the
277
+ Corresponding Source in the same way through the same place at no
278
+ further charge. You need not require recipients to copy the
279
+ Corresponding Source along with the object code. If the place to
280
+ copy the object code is a network server, the Corresponding Source
281
+ may be on a different server (operated by you or a third party)
282
+ that supports equivalent copying facilities, provided you maintain
283
+ clear directions next to the object code saying where to find the
284
+ Corresponding Source. Regardless of what server hosts the
285
+ Corresponding Source, you remain obligated to ensure that it is
286
+ available for as long as needed to satisfy these requirements.
287
+
288
+ e) Convey the object code using peer-to-peer transmission, provided
289
+ you inform other peers where the object code and Corresponding
290
+ Source of the work are being offered to the general public at no
291
+ charge under subsection 6d.
292
+
293
+ A separable portion of the object code, whose source code is excluded
294
+ from the Corresponding Source as a System Library, need not be
295
+ included in conveying the object code work.
296
+
297
+ A "User Product" is either (1) a "consumer product", which means any
298
+ tangible personal property which is normally used for personal, family,
299
+ or household purposes, or (2) anything designed or sold for incorporation
300
+ into a dwelling. In determining whether a product is a consumer product,
301
+ doubtful cases shall be resolved in favor of coverage. For a particular
302
+ product received by a particular user, "normally used" refers to a
303
+ typical or common use of that class of product, regardless of the status
304
+ of the particular user or of the way in which the particular user
305
+ actually uses, or expects or is expected to use, the product. A product
306
+ is a consumer product regardless of whether the product has substantial
307
+ commercial, industrial or non-consumer uses, unless such uses represent
308
+ the only significant mode of use of the product.
309
+
310
+ "Installation Information" for a User Product means any methods,
311
+ procedures, authorization keys, or other information required to install
312
+ and execute modified versions of a covered work in that User Product from
313
+ a modified version of its Corresponding Source. The information must
314
+ suffice to ensure that the continued functioning of the modified object
315
+ code is in no case prevented or interfered with solely because
316
+ modification has been made.
317
+
318
+ If you convey an object code work under this section in, or with, or
319
+ specifically for use in, a User Product, and the conveying occurs as
320
+ part of a transaction in which the right of possession and use of the
321
+ User Product is transferred to the recipient in perpetuity or for a
322
+ fixed term (regardless of how the transaction is characterized), the
323
+ Corresponding Source conveyed under this section must be accompanied
324
+ by the Installation Information. But this requirement does not apply
325
+ if neither you nor any third party retains the ability to install
326
+ modified object code on the User Product (for example, the work has
327
+ been installed in ROM).
328
+
329
+ The requirement to provide Installation Information does not include a
330
+ requirement to continue to provide support service, warranty, or updates
331
+ for a work that has been modified or installed by the recipient, or for
332
+ the User Product in which it has been modified or installed. Access to a
333
+ network may be denied when the modification itself materially and
334
+ adversely affects the operation of the network or violates the rules and
335
+ protocols for communication across the network.
336
+
337
+ Corresponding Source conveyed, and Installation Information provided,
338
+ in accord with this section must be in a format that is publicly
339
+ documented (and with an implementation available to the public in
340
+ source code form), and must require no special password or key for
341
+ unpacking, reading or copying.
342
+
343
+ 7. Additional Terms.
344
+
345
+ "Additional permissions" are terms that supplement the terms of this
346
+ License by making exceptions from one or more of its conditions.
347
+ Additional permissions that are applicable to the entire Program shall
348
+ be treated as though they were included in this License, to the extent
349
+ that they are valid under applicable law. If additional permissions
350
+ apply only to part of the Program, that part may be used separately
351
+ under those permissions, but the entire Program remains governed by
352
+ this License without regard to the additional permissions.
353
+
354
+ When you convey a copy of a covered work, you may at your option
355
+ remove any additional permissions from that copy, or from any part of
356
+ it. (Additional permissions may be written to require their own
357
+ removal in certain cases when you modify the work.) You may place
358
+ additional permissions on material, added by you to a covered work,
359
+ for which you have or can give appropriate copyright permission.
360
+
361
+ Notwithstanding any other provision of this License, for material you
362
+ add to a covered work, you may (if authorized by the copyright holders of
363
+ that material) supplement the terms of this License with terms:
364
+
365
+ a) Disclaiming warranty or limiting liability differently from the
366
+ terms of sections 15 and 16 of this License; or
367
+
368
+ b) Requiring preservation of specified reasonable legal notices or
369
+ author attributions in that material or in the Appropriate Legal
370
+ Notices displayed by works containing it; or
371
+
372
+ c) Prohibiting misrepresentation of the origin of that material, or
373
+ requiring that modified versions of such material be marked in
374
+ reasonable ways as different from the original version; or
375
+
376
+ d) Limiting the use for publicity purposes of names of licensors or
377
+ authors of the material; or
378
+
379
+ e) Declining to grant rights under trademark law for use of some
380
+ trade names, trademarks, or service marks; or
381
+
382
+ f) Requiring indemnification of licensors and authors of that
383
+ material by anyone who conveys the material (or modified versions of
384
+ it) with contractual assumptions of liability to the recipient, for
385
+ any liability that these contractual assumptions directly impose on
386
+ those licensors and authors.
387
+
388
+ All other non-permissive additional terms are considered "further
389
+ restrictions" within the meaning of section 10. If the Program as you
390
+ received it, or any part of it, contains a notice stating that it is
391
+ governed by this License along with a term that is a further
392
+ restriction, you may remove that term. If a license document contains
393
+ a further restriction but permits relicensing or conveying under this
394
+ License, you may add to a covered work material governed by the terms
395
+ of that license document, provided that the further restriction does
396
+ not survive such relicensing or conveying.
397
+
398
+ If you add terms to a covered work in accord with this section, you
399
+ must place, in the relevant source files, a statement of the
400
+ additional terms that apply to those files, or a notice indicating
401
+ where to find the applicable terms.
402
+
403
+ Additional terms, permissive or non-permissive, may be stated in the
404
+ form of a separately written license, or stated as exceptions;
405
+ the above requirements apply either way.
406
+
407
+ 8. Termination.
408
+
409
+ You may not propagate or modify a covered work except as expressly
410
+ provided under this License. Any attempt otherwise to propagate or
411
+ modify it is void, and will automatically terminate your rights under
412
+ this License (including any patent licenses granted under the third
413
+ paragraph of section 11).
414
+
415
+ However, if you cease all violation of this License, then your
416
+ license from a particular copyright holder is reinstated (a)
417
+ provisionally, unless and until the copyright holder explicitly and
418
+ finally terminates your license, and (b) permanently, if the copyright
419
+ holder fails to notify you of the violation by some reasonable means
420
+ prior to 60 days after the cessation.
421
+
422
+ Moreover, your license from a particular copyright holder is
423
+ reinstated permanently if the copyright holder notifies you of the
424
+ violation by some reasonable means, this is the first time you have
425
+ received notice of violation of this License (for any work) from that
426
+ copyright holder, and you cure the violation prior to 30 days after
427
+ your receipt of the notice.
428
+
429
+ Termination of your rights under this section does not terminate the
430
+ licenses of parties who have received copies or rights from you under
431
+ this License. If your rights have been terminated and not permanently
432
+ reinstated, you do not qualify to receive new licenses for the same
433
+ material under section 10.
434
+
435
+ 9. Acceptance Not Required for Having Copies.
436
+
437
+ You are not required to accept this License in order to receive or
438
+ run a copy of the Program. Ancillary propagation of a covered work
439
+ occurring solely as a consequence of using peer-to-peer transmission
440
+ to receive a copy likewise does not require acceptance. However,
441
+ nothing other than this License grants you permission to propagate or
442
+ modify any covered work. These actions infringe copyright if you do
443
+ not accept this License. Therefore, by modifying or propagating a
444
+ covered work, you indicate your acceptance of this License to do so.
445
+
446
+ 10. Automatic Licensing of Downstream Recipients.
447
+
448
+ Each time you convey a covered work, the recipient automatically
449
+ receives a license from the original licensors, to run, modify and
450
+ propagate that work, subject to this License. You are not responsible
451
+ for enforcing compliance by third parties with this License.
452
+
453
+ An "entity transaction" is a transaction transferring control of an
454
+ organization, or substantially all assets of one, or subdividing an
455
+ organization, or merging organizations. If propagation of a covered
456
+ work results from an entity transaction, each party to that
457
+ transaction who receives a copy of the work also receives whatever
458
+ licenses to the work the party's predecessor in interest had or could
459
+ give under the previous paragraph, plus a right to possession of the
460
+ Corresponding Source of the work from the predecessor in interest, if
461
+ the predecessor has it or can get it with reasonable efforts.
462
+
463
+ You may not impose any further restrictions on the exercise of the
464
+ rights granted or affirmed under this License. For example, you may
465
+ not impose a license fee, royalty, or other charge for exercise of
466
+ rights granted under this License, and you may not initiate litigation
467
+ (including a cross-claim or counterclaim in a lawsuit) alleging that
468
+ any patent claim is infringed by making, using, selling, offering for
469
+ sale, or importing the Program or any portion of it.
470
+
471
+ 11. Patents.
472
+
473
+ A "contributor" is a copyright holder who authorizes use under this
474
+ License of the Program or a work on which the Program is based. The
475
+ work thus licensed is called the contributor's "contributor version".
476
+
477
+ A contributor's "essential patent claims" are all patent claims
478
+ owned or controlled by the contributor, whether already acquired or
479
+ hereafter acquired, that would be infringed by some manner, permitted
480
+ by this License, of making, using, or selling its contributor version,
481
+ but do not include claims that would be infringed only as a
482
+ consequence of further modification of the contributor version. For
483
+ purposes of this definition, "control" includes the right to grant
484
+ patent sublicenses in a manner consistent with the requirements of
485
+ this License.
486
+
487
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
488
+ patent license under the contributor's essential patent claims, to
489
+ make, use, sell, offer for sale, import and otherwise run, modify and
490
+ propagate the contents of its contributor version.
491
+
492
+ In the following three paragraphs, a "patent license" is any express
493
+ agreement or commitment, however denominated, not to enforce a patent
494
+ (such as an express permission to practice a patent or covenant not to
495
+ sue for patent infringement). To "grant" such a patent license to a
496
+ party means to make such an agreement or commitment not to enforce a
497
+ patent against the party.
498
+
499
+ If you convey a covered work, knowingly relying on a patent license,
500
+ and the Corresponding Source of the work is not available for anyone
501
+ to copy, free of charge and under the terms of this License, through a
502
+ publicly available network server or other readily accessible means,
503
+ then you must either (1) cause the Corresponding Source to be so
504
+ available, or (2) arrange to deprive yourself of the benefit of the
505
+ patent license for this particular work, or (3) arrange, in a manner
506
+ consistent with the requirements of this License, to extend the patent
507
+ license to downstream recipients. "Knowingly relying" means you have
508
+ actual knowledge that, but for the patent license, your conveying the
509
+ covered work in a country, or your recipient's use of the covered work
510
+ in a country, would infringe one or more identifiable patents in that
511
+ country that you have reason to believe are valid.
512
+
513
+ If, pursuant to or in connection with a single transaction or
514
+ arrangement, you convey, or propagate by procuring conveyance of, a
515
+ covered work, and grant a patent license to some of the parties
516
+ receiving the covered work authorizing them to use, propagate, modify
517
+ or convey a specific copy of the covered work, then the patent license
518
+ you grant is automatically extended to all recipients of the covered
519
+ work and works based on it.
520
+
521
+ A patent license is "discriminatory" if it does not include within
522
+ the scope of its coverage, prohibits the exercise of, or is
523
+ conditioned on the non-exercise of one or more of the rights that are
524
+ specifically granted under this License. You may not convey a covered
525
+ work if you are a party to an arrangement with a third party that is
526
+ in the business of distributing software, under which you make payment
527
+ to the third party based on the extent of your activity of conveying
528
+ the work, and under which the third party grants, to any of the
529
+ parties who would receive the covered work from you, a discriminatory
530
+ patent license (a) in connection with copies of the covered work
531
+ conveyed by you (or copies made from those copies), or (b) primarily
532
+ for and in connection with specific products or compilations that
533
+ contain the covered work, unless you entered into that arrangement,
534
+ or that patent license was granted, prior to 28 March 2007.
535
+
536
+ Nothing in this License shall be construed as excluding or limiting
537
+ any implied license or other defenses to infringement that may
538
+ otherwise be available to you under applicable patent law.
539
+
540
+ 12. No Surrender of Others' Freedom.
541
+
542
+ If conditions are imposed on you (whether by court order, agreement or
543
+ otherwise) that contradict the conditions of this License, they do not
544
+ excuse you from the conditions of this License. If you cannot convey a
545
+ covered work so as to satisfy simultaneously your obligations under this
546
+ License and any other pertinent obligations, then as a consequence you may
547
+ not convey it at all. For example, if you agree to terms that obligate you
548
+ to collect a royalty for further conveying from those to whom you convey
549
+ the Program, the only way you could satisfy both those terms and this
550
+ License would be to refrain entirely from conveying the Program.
551
+
552
+ 13. Use with the GNU Affero General Public License.
553
+
554
+ Notwithstanding any other provision of this License, you have
555
+ permission to link or combine any covered work with a work licensed
556
+ under version 3 of the GNU Affero General Public License into a single
557
+ combined work, and to convey the resulting work. The terms of this
558
+ License will continue to apply to the part which is the covered work,
559
+ but the special requirements of the GNU Affero General Public License,
560
+ section 13, concerning interaction through a network will apply to the
561
+ combination as such.
562
+
563
+ 14. Revised Versions of this License.
564
+
565
+ The Free Software Foundation may publish revised and/or new versions of
566
+ the GNU General Public License from time to time. Such new versions will
567
+ be similar in spirit to the present version, but may differ in detail to
568
+ address new problems or concerns.
569
+
570
+ Each version is given a distinguishing version number. If the
571
+ Program specifies that a certain numbered version of the GNU General
572
+ Public License "or any later version" applies to it, you have the
573
+ option of following the terms and conditions either of that numbered
574
+ version or of any later version published by the Free Software
575
+ Foundation. If the Program does not specify a version number of the
576
+ GNU General Public License, you may choose any version ever published
577
+ by the Free Software Foundation.
578
+
579
+ If the Program specifies that a proxy can decide which future
580
+ versions of the GNU General Public License can be used, that proxy's
581
+ public statement of acceptance of a version permanently authorizes you
582
+ to choose that version for the Program.
583
+
584
+ Later license versions may give you additional or different
585
+ permissions. However, no additional obligations are imposed on any
586
+ author or copyright holder as a result of your choosing to follow a
587
+ later version.
588
+
589
+ 15. Disclaimer of Warranty.
590
+
591
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
592
+ APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
593
+ HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
594
+ OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
595
+ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
596
+ PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
597
+ IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
598
+ ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
599
+
600
+ 16. Limitation of Liability.
601
+
602
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
603
+ WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
604
+ THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
605
+ GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
606
+ USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
607
+ DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
608
+ PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
609
+ EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
610
+ SUCH DAMAGES.
611
+
612
+ 17. Interpretation of Sections 15 and 16.
613
+
614
+ If the disclaimer of warranty and limitation of liability provided
615
+ above cannot be given local legal effect according to their terms,
616
+ reviewing courts shall apply local law that most closely approximates
617
+ an absolute waiver of all civil liability in connection with the
618
+ Program, unless a warranty or assumption of liability accompanies a
619
+ copy of the Program in return for a fee.
620
+
621
+ END OF TERMS AND CONDITIONS
622
+
623
+ How to Apply These Terms to Your New Programs
624
+
625
+ If you develop a new program, and you want it to be of the greatest
626
+ possible use to the public, the best way to achieve this is to make it
627
+ free software which everyone can redistribute and change under these terms.
628
+
629
+ To do so, attach the following notices to the program. It is safest
630
+ to attach them to the start of each source file to most effectively
631
+ state the exclusion of warranty; and each file should have at least
632
+ the "copyright" line and a pointer to where the full notice is found.
633
+
634
+ <one line to give the program's name and a brief idea of what it does.>
635
+ Copyright (C) <year> <name of author>
636
+
637
+ This program is free software: you can redistribute it and/or modify
638
+ it under the terms of the GNU General Public License as published by
639
+ the Free Software Foundation, either version 3 of the License, or
640
+ (at your option) any later version.
641
+
642
+ This program is distributed in the hope that it will be useful,
643
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
644
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
645
+ GNU General Public License for more details.
646
+
647
+ You should have received a copy of the GNU General Public License
648
+ along with this program. If not, see <https://www.gnu.org/licenses/>.
649
+
650
+ Also add information on how to contact you by electronic and paper mail.
651
+
652
+ If the program does terminal interaction, make it output a short
653
+ notice like this when it starts in an interactive mode:
654
+
655
+ <program> Copyright (C) <year> <name of author>
656
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
657
+ This is free software, and you are welcome to redistribute it
658
+ under certain conditions; type `show c' for details.
659
+
660
+ The hypothetical commands `show w' and `show c' should show the appropriate
661
+ parts of the General Public License. Of course, your program's commands
662
+ might be different; for a GUI interface, you would use an "about box".
663
+
664
+ You should also get your employer (if you work as a programmer) or school,
665
+ if any, to sign a "copyright disclaimer" for the program, if necessary.
666
+ For more information on this, and how to apply and follow the GNU GPL, see
667
+ <https://www.gnu.org/licenses/>.
668
+
669
+ The GNU General Public License does not permit incorporating your program
670
+ into proprietary programs. If your program is a subroutine library, you
671
+ may consider it more useful to permit linking proprietary applications with
672
+ the library. If this is what you want to do, use the GNU Lesser General
673
+ Public License instead of this License. But first, please read
674
+ <https://www.gnu.org/licenses/why-not-lgpl.html>.
nextgen-gallery/changelog.txt ADDED
@@ -0,0 +1,2063 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ NextGEN Gallery
2
+ by Imagely
3
+
4
+ = V3.29 - 09.28.2022 =
5
+ * Fixed: Added nonce verification to some legacy XHR handlers.
6
+
7
+ = V3.28 - 07.20.2022 =
8
+ * NEW: Added NGG_DISABLE_IMAGICK constant to disable use of ImageMagick.
9
+
10
+ = V3.27 - 05.25.2022 =
11
+ * Fixed: A possible PHP warning in the third party compatibility warning.
12
+ * Fixed: PHP 8 may emit a warning in the taxonomy controller when viewing the site frontpage while no posts or pages exist.
13
+ * Fixed: ThickBox's loadingAnimation.gif and tb-close.png URL were incorrect.
14
+
15
+ = V3.26 - 04.27.2022 =
16
+ * Fixed: A change in NextGEN 3.23 broke albums pagination.
17
+ * Fixed: Compatibility with TinyMCE editor used by Advanced Custom Fields.
18
+ * Fixed: Insert Gallery Window popup failed to load when Elementor is active.
19
+
20
+ = V3.24 - 03.23.2022 =
21
+ * Fixed: A possible PHP warning could be generated if the global $post->content is an integer or boolean.
22
+ * Fixed: Activating NextGEN for the first time generated a PHP warning when registering default settings.
23
+ * Fixed: NextGEN widgets JS/CSS was enqueued on all frontend pages.
24
+ * Fixed: Some errors generated while image uploading were not being displayed to the user.
25
+
26
+ = V3.23 - 02.09.2022 =
27
+ * Fixed: A potential PHP fatal error in C_Photocrati_Transient_Manager when using external object caching.
28
+ * Fixed: Manage Gallery page could create a javascript error if the page loads quickly enough.
29
+ * Fixed: Sorting images order was broken by WordPress 5.9
30
+ * Changed: Google Fonts is no longer used for fonts loaded in the admin.
31
+
32
+ = V3.22 - 01.20.2022 =
33
+ * Fixed: When viewing certain images NextGEN was using nggdb::get_unique_slug() on each viewing.
34
+
35
+ = V3.21 - 01.19.2022 =
36
+ * NEW: Introducing constant NGG_DISABLE_PHOTOCRATI_CACHE_TRACKER which tracks all NGG transients when using an external object cache.
37
+ * NEW: Adding an option to separate generated images with dashes instead of underscores for better SEO.
38
+ * Changed: Removed the "Custom styles" feature which was deprecated in December of 2020.
39
+ * Fixed: PHP 8.1 warnings of deprecations.
40
+
41
+ = V3.18 - 12.08.2021 =
42
+ * NEW: Added a constant "NGG_DISABLE_SHORTCODE_MANAGER" to disable content protection workarounds that can be a source of incompatibility itself.
43
+ * NEW: Added notice to users that ctypes methods are required by NextGEN Gallery.
44
+ * Fixed: Compatibility with EditorsKit invalidating NextGEN Gallery blocks.
45
+ * Fixed: In rare circumstances the "Open album images in Pro Lightbox" feature was not working.
46
+ * Fixed: PHP warnings about undefined array key access when using the XMLRPC API (Lightroom)
47
+ * Fixed: Searching for images on Manage Galleries could result in duplicates.
48
+
49
+ = V3.17 - 09.15.2021 =
50
+ * Fixed: NGG 3.16 created a problem with the Manage Gallery page's Edit Thumbnail, Rotate Image, and View Meta popups
51
+
52
+ = V3.16 - 09.08.2021 =
53
+ * Fixed: Links on "Extensions" page were incorrect
54
+ * Fixed: Incompatibility with WP User Manager caused Manage Gallery bulk actions to be unusable
55
+ * Fixed: Images that failed to upload would be treated as a success in the UI if the server HTTP response code is 200
56
+ * Changed: Removed the "Ambassadors" tab from the Overview page
57
+
58
+ = V3.15 - 08.23.2021 =
59
+ * Fixed: A warning was generated on every request for users of PHP 5.6
60
+
61
+ = V3.14 - 08.18.2021 =
62
+ * NEW: Added support for unanimated WebP images
63
+ * Fixed: PHP warning was generated when enqueueing frontend resources
64
+ * Fixed: "Scan folder for new images" was failing with PHP 8+
65
+
66
+ = V3.13 - 08.04.2021 =
67
+ * Fixed: All WP-Admin links had "/wp-admin/" removed for some users
68
+
69
+ = V3.12 - 07.13.2021 =
70
+ * Fixed: PHP warning generated for some Nimble Builder users
71
+ * Changed: Added 'ngg_marketing_parameters' filter
72
+
73
+ = V3.11 - 05.26.2021 =
74
+ * Fixed: Now compatible with NimbleBuilder
75
+ * Fixed: Importing images from the Media Library was broken due to a z-index issue
76
+
77
+ = V3.10 - 05.19.2021 =
78
+ * NEW: Added option under Misc Options to disable the /ngg_tag/ page feature
79
+ * Fixed: Misc performance improvements to NGG 3.9.0
80
+ * Fixed: Opening the rotate-image dialog a second time could show the incorrect image
81
+ * Fixed: Paginated galleries on paginated WP posts linked to the incorrect URL
82
+ * Fixed: Widgets were not rendering correctly with some third party page builders
83
+
84
+ = V3.9.3 - 04.20.2021 =
85
+ * Changed: Updated uppy.js
86
+ * Fixed: Conflict with Avada builder
87
+ * Fixed: ACG fields cannot be toggled
88
+ * Fixed: Activation issues with NextGEN Starter
89
+
90
+ = V3.9.2 - 04.07.2021 =
91
+ * Fixed: call_user_func() warning when rendering shortcodes in widgets (1168)
92
+ * Fixed: do_shortcode and legacy shortcodes (1170)
93
+ * Fixed: Incorrect use of wp_localize_script (1171)
94
+ * Fixed: Tooltips are illegible (1172)
95
+ * Fixed: PHP foreach warning (1173)
96
+
97
+ = V3.9.1 - 03.29.2021 =
98
+ * Fixed: C_Dynamic_Stylesheet_Controller error
99
+ * Fixed: Galleries not displaying
100
+
101
+ = V3.9.0 - 03.24.2021 =
102
+ * Changed: Resource manager disabled by default
103
+ * Changed: Remove ngg_load_frontend_logic filter
104
+ * Fixed: Refactored to resolve over 300 plugin & theme conflicts
105
+ * Fixed: Problem reported with taxonomy controller
106
+
107
+ = V3.8.0 - 02.24.2021 =
108
+ * NEW: NGG featured image support for custom post types (1076)
109
+ * Fixed: Compatibility with Custom Post Type UI plugin (1076)
110
+ * Fixed: Compatibility with Advanced Custom Fields plugin (1150)
111
+ * Fixed: Compatibility with Photo Station plugin (855)
112
+ * Fixed: Compatibility with Stackable (981)
113
+
114
+ = V3.7.0 - 02.17.2021 =
115
+ * Fixed: Added ellipsis to pagination to show pages skipped (1099) (1157)
116
+ * Fixed: Deleted images could still appear in 'random' image galleries (1129)
117
+ * Fixed: Galleries with only one page were causing pagination links to appear (1156)
118
+ * Fixed: Inability to change gallerypath on multisite networks (1150)
119
+ * Fixed: Overriding static resources (CSS & JS) through files in wp-content/ngg/ was not working (1144)
120
+
121
+ = V3.6.0 - 02.10.2021 =
122
+ * NEW: Added new 'Bulk actions' option to remove EXIF Orientation from existing images (1137)
123
+ * NEW: Allow maximum_entity_limit display setting regardless of source (1146)
124
+ * NEW: Provide hooks to customize Uppy settings (1139)
125
+ * NEW: Recreated legacy templates as modern "views" (1127)
126
+ * Fixed: A compatibility warning with NextGEN Plus would appear when users had NextGEN Starter (1097)
127
+ * Fixed: Compatibility issue with Topscorer Theme (344171)
128
+ * Fixed: Compatibility with Custom Post Types UI (1076)
129
+ * Fixed: Compatibility with jQuery.mmenu (1140)
130
+ * Fixed: Disable marketing additions for users with NextGEN Starter enabled
131
+ * Fixed: Error responses from the server when uploading images failed were not specific (1121)
132
+ * Fixed: Image rotation not reliable (1137)
133
+ * Fixed: Imagebrowser pagination broke on images with UTF8 characters in their title (1135)
134
+ * Fixed: Shortcodes displaying albums did not appear in the order listed (1128)
135
+ * Fixed: Transient tracker was calling update_option() on every page (1074)
136
+
137
+ = v3.5.0 - 12.17.2020 =
138
+ * Changed: Deprecated legacy template functionality
139
+ * Changed: Deprecated built-in custom style / CSS mechanism
140
+ * Fixed: Misc updates for PHP 8.0 compatibility
141
+
142
+ = v3.4.7 - 11.25.2020 =
143
+ * NEW: Replaced plupload with a new uppy.js based uploader for faster uploading
144
+ * Changed: Updated select2 and Gritter to the latest versions
145
+ * Changed: Several changes have been made for future jQuery 3.5 compatibility
146
+ * Fixed: Gutenberg Block and Featured Image features on wordpress.com hosting
147
+
148
+ = V3.3.20 - 10.13.2020 =
149
+ * NEW: PHP 5.6 is the minimum supported PHP version
150
+ * NEW: WordPress 5.2 is the minimum support PHP version
151
+ * Fixed: Block disappearing in Block Editor
152
+ * Fixed: Gutenberg block and featured image features were broken on wordpress.com hosting
153
+ * Note: NextGEN Gallery will soon be licensed under GPLv3.
154
+
155
+ = V3.3.17 - 08.18.2020 =
156
+ * Fixed: Override Thumbnail Settings not configurable
157
+ * Fixed: Broken gallery displays in WP 5.5 with Classic Editor
158
+ * Fixed: HTML in Gallery & Image fields
159
+ * Fixed: Inability to save Gallery Settings or Other Options
160
+
161
+ = V3.3.11 - 08.14.2020 =
162
+ * Fixed: Fancybox lightbox not working with WordPress 5.5
163
+ * Fixed: Inability to upload images or create galleries in WordPress 5.5
164
+ * Fixed: Cannot crop images from Manage Galleries page
165
+ * Fixed: Removed use of jquery.size() and jquery.browser
166
+ * Fixed: Fixed iterator_to_array() PHP warning
167
+
168
+ = V3.3.10 - 08.12.2020 =
169
+ * NEW: Added filter 'ngg_recent_images_sort_by_column' to control how recent images are sorted
170
+ * Fixed: Assigning a thumbnail to a custom post type page/post caused a fatal javsacript error
171
+ * Fixed: NextGEN would previously be completely unusable should it even once determine that it doesn't have the necessary roles it needs
172
+ * Fixed: Several SimpleLightbox issues caused by a recent version upgrade
173
+ * Changed: Admin user interface modifications
174
+ * Changed: Misc code improvements to take advantage of PHP 5.3+ features
175
+ * Changed: Removed NGG_FIX_JQUERY constant
176
+
177
+ = V3.3.6 - 06.24.2020 =
178
+ * NEW: Added a mechanism in Other Options > Misc to update page featured images assigned with NextGen version 1 that were broken by a WordPress 5.4 API change
179
+ * NEW: Added two filters (ngg_default_settings and ngg_default_global_settings) to allow control over default settings for new networks, sites and sub-sites
180
+ * NEW: Updated SimpleLightbox to the latest version. This fixes all gallery images appearing in the lightbox if more than one gallery was on the page.
181
+ * Fixed: Album routing was broken if the albums were named using a non-latin alphabet
182
+ * Fixed: Gallery path validation was broken on some IIS servers
183
+ * Fixed: NextGen was unable to serve AJAX requests on home.pl hosting
184
+ * Fixed: Removed the unused simple_html_dom module which was causing errors with PHP 7.3
185
+
186
+ = V3.3.5 - 04.09.2020 =
187
+ * Fixed: Broken dynamic images
188
+
189
+ = V3.3.2 - 04.07.2020 =
190
+ * Fixed: Gallery paths were calculated incorrectly on wordpress.com hosting
191
+ * Fixed: Insert Gallery Window could not edit an existing displayed gallery with a legacy template without breaking the displayed gallery
192
+ * Fixed: Manage Albums page could generate lengthy PHP warnings if galleries or other albums did not have a preview image assigned
193
+ * Fixed: NextGen was forcing the 'screen_options_show_screen' filter to always be true
194
+ * Fixed: Plugin would not load and would throw an error due to C_Component_Registry not being found
195
+ * Fixed: Removed last traces of javascript that were in display type templates
196
+
197
+ = V3.3.0 - 03.10.2020 =
198
+ * NEW: Added feature on Manage Galleries page to search gallery names
199
+ * NEW: Added filter 'ngg_disable_shortcodes_in_request_api' to disable rendering of NextGen shortcodes in REST
200
+ * NEW: Added option to automatically watermark images during upload
201
+ * Changed: Minimum PHP version supported is now 5.4
202
+ * Changed: Pope framework now included via Composer
203
+ * Changed: Removed use of 'contextual_help' filter which is deprecated
204
+ * Changed: Renamed nggallery.po to nggallery.pot for better compatibility with Loco Translate
205
+ * Fixed: Compatibility with Divi Booster
206
+ * Fixed: Copying images to another gallery caused a PHP warning
207
+ * Fixed: Featured Image feature was not working
208
+ * Fixed: Fixed PHP warning sometimes displayed with album breadcrumbs
209
+ * Fixed: Fixed PHP warning when displaying certain albums
210
+ * Fixed: No notification was given when moving or copying images on Manage Gallery
211
+ * Fixed: PHP warning would be displayed when MediaRSS feature was enabled
212
+ * Fixed: SimpleLightbox would not use image alttext attribute for titles
213
+ * Fixed: Uploading zip files containing images with uppercase file extensions would fail to extract any images
214
+ * Fixed: Uploading images with invalid EXIF would reject the image entirely
215
+
216
+ = V3.2.23 - 12.02.2019 =
217
+ * NEW: There is a new setting under Other Options > Misc to disable enqueueing FontAwesome entirely
218
+ * Changed: WP-CLI commands have been namespaced and numerous new commands have been added
219
+ * Fixed: Add Gallery / Images page would instruct users to upload zip files even if the multisite settings disallowed it
220
+ * Fixed: Conflict with Elementor breaking the Attach-To-Post window styling
221
+ * Fixed: Corrected PHP warnings generated when creating the template & static override directory ('ngg') inside WP_CONTENT_DIR if write access isn't available
222
+ * Fixed: Gallery slug generation was broken when the gallery name included special characters and broke those galleries as album children
223
+ * Fixed: Improved performance on Manage Galleries page by simplifying query to count images belonging to galleries
224
+ * Fixed: Manage Galleries could generate a PHP warning when listing galleries created by users that have since been deleted
225
+ * Fixed: Shutter Reloaded's navigation icons were always missing
226
+ * Fixed: Slideshow widget was enqueueing a file that no exists
227
+ * Fixed: Two basic slideshow displays on one page would cause a JS error that broke their display
228
+ * Fixed: URL resolution for paginated galleries and dynamic thumbnails was broken if WordPress was in a sub-directory of a sub-directory install (split home & site url)
229
+
230
+ = V3.2.21 - 11.20.2019 =
231
+ * Changed: Small branding and color update
232
+
233
+ = V3.2.19 - 10.30.2019 =
234
+ * Fixed: Conflict with Imagify and the Imagely Lightroom plugin
235
+ * Fixed: Ability to update image metadata from the Imagely Lightroom plugin
236
+
237
+ = V3.2.18 - 09.18.2019 =
238
+ * Fixed: Ability to sort images by random
239
+ * Fixed: Large images failed to upload on WP Engine
240
+ * Fixed: Plupload translations not working
241
+
242
+ = V3.2.15 - 09.10.2019 =
243
+ * NEW: Automatically retry loading dynamic thumbnail generation urls
244
+ * NEW: Use NGG_DISABLE_DYNAMIC_IMG_URLS constant to generate images in-process
245
+ * Changed: Dynamic thumbnails are generated in their own PHP processes/url
246
+ * Fixed: Distorted images and thumbnails
247
+ * Fixed: Timeout when viewing large galleries
248
+ * Fixed: Memory optimizations when generating images
249
+
250
+ = V3.2.11 - 08.27.2019 =
251
+ * Secured: IGW queries (reported by Tin Duong of Fortinet's FortiGuard Labs)
252
+
253
+ = V3.2.10 - 07.23.2019 =
254
+ * Changed: Updated branding for Freemius opt-in
255
+ * Fixed: IGW queries
256
+
257
+ = V3.2.8 - 07.16.2019 =
258
+ * NEW: Added support for the shortcode_atts_ngg filter
259
+ * NEW: Importing images from a folder now works recursively
260
+ * Fixed: 'Scan folder for new images' did not assign a gallery preview image
261
+ * Fixed: AJAX actions like image uploads were failing if the default request to '/' went to an index.html instead of index.php
262
+ * Fixed: Admin page controllers / templates were running twice
263
+ * Fixed: Compatibility with Delightful Downloads
264
+ * Fixed: Compatibility with Elementor
265
+ * Fixed: Copying images to the Media Library was broken if the server lacked the fileinfo extension
266
+ * Fixed: Disable Manage Gallery's move/copy images submit button to prevent multiple submissions
267
+ * Fixed: Made 'Recover image from backup' reset thumbnail crop settings
268
+ * Fixed: Minor error emitted from common.js
269
+ * Fixed: Move Images / Copy Images now also moves/copies dynamically generated versions
270
+ * Fixed: The uninstall routine handler was generating a PHP warning accessing an undeclared variable
271
+ * Fixed: Zip uploads from some macOS users was failing
272
+
273
+ = V3.2.4 - 06.04.2019 =
274
+ * NEW: Added some methods to the window.galleries object prototype for retrieving display settings
275
+ * Secured: Zip extraction process (thanks to Slavco Mihajloski / @mslavco)
276
+ * Changed: Removed the now-deprecated 'publish' link from the Manage Gallery image actions row
277
+ * Fixed: A PHP warning emitted on Gallery > Other Options if the current gallery path cannot be written to
278
+ * Fixed: Added compatibility check for the official FontAwesome plugin
279
+ * Fixed: Clicking a checkbox in the Insert Gallery Window's "Sort or exclude images" tab was not functioning
280
+ * Fixed: Resized images were becoming larger than the original in some circumstances
281
+ * Fixed: URL to static assets like JS and CSS files was incorrect when NextGen Gallery was a symlink
282
+
283
+ = V3.2.2 - 05.09.2019 =
284
+ * Changed: Updated video Links
285
+ * Changed: Branding updates in Readme.txt file
286
+
287
+ = V3.2.1 - 05.08.2019 =
288
+ * Fixed: Missing settings after Reset with NextGEN Plus
289
+ * Fixed: Small styling issues with WordPress 5.2
290
+
291
+ = V3.2.0 - 05.07.2019 =
292
+ * NEW: Branding update
293
+ * NEW: API methods for detecting NextGEN provided pages and custom post types
294
+ * Fixed: Missing menus after Reset
295
+ * Fixed: Ajax pagination with Simplelightbox
296
+ * Fixed: Datamapper query cache not purged after saving an entity
297
+ * Fixed: Gallery folder not created when using Manage Galleries -> New Gallery
298
+ * Fixed: Notifications not appearing on all Nextgen-provided pages
299
+ * Fixed: Gallery wizard conflicting with NextGEN Pro ecommerce wizard
300
+ * Fixed: Upgrade to pro button
301
+ * Fixed: NGG activation transient not given a time-to-live value
302
+
303
+ = V3.1.17 - 04.02.2019 =
304
+ * Fixed: Preview images for display types giving get_static_abspath error
305
+ * Fixed: Compatibility with the Imagely Lightroom plugin
306
+
307
+ = V3.1.14 - 03.26.2019 =
308
+ * Changed: Restored original behavior of ngg_after_new_images_added hook
309
+ * Changed: Images with EXIF rotation metadata are now rotated automatically at upload
310
+ * Changed: Moved confirmation message presented after editing a thumbnail
311
+ * Fixed: Ability to import zips of images
312
+ * Fixed: Gallery folder not created on filesystem after adding new gallery
313
+ * Fixed: IGW not working with Gutenberg / Block Editor
314
+ * Fixed: Compatibility with EWWW Image Optimizer
315
+ * Fixed: Compatibility with Elementor
316
+ * Fixed: Compatibility with Imagify
317
+ * Fixed: NextGen 3.1.11 passed an incorrect path to load_plugin_textdomain()
318
+ * Fixed: Simplelightbox initialization was opening more than once for certain images
319
+
320
+ = V3.1.11 - 03.20.2019 =
321
+ * NEW: Many performance enhancements
322
+ * Fixed: Broken Overview page on WordPress 5.1
323
+ * Fixed: Problem with notices not being dismissible
324
+ * Fixed: Recover images from backup generating errors
325
+ * Fixed: Manage Tags the only menu option after activating
326
+ * Fixed: Compatibility with environments which don't have mime_content_type function
327
+
328
+ = V3.1.7 - 02.26.2019 =
329
+ * Changed: Upgraded Freemius SDK to latest release
330
+
331
+ = V3.1.6 - 01.16.2019 =
332
+ * NEW: Option to control caching duration of random widget galleries
333
+ * Secured: DB record serialization
334
+ * Fixed: Compatibility with plugins that extend Gutenberg / Block Editor
335
+ * Fixed: Invalid regex causing warnings when viewing /ngg_tags/ pages
336
+ * Fixed: Misc grammatical and spelling mistakes
337
+
338
+ = V3.1.5 - 01.08.2019 =
339
+ * NEW: Added constant NGG_DISABLE_SHUTDOWN_EXCEPTION_HANDLER
340
+ * Secured: DB record serialization
341
+ * Changed: Added 185 character limit to filenames to prevent filesystem issues
342
+ * Changed: Removed caching of 'random' galleries; now only random widgets will be cached
343
+ * Changed: Removed dependency on underscore.string.js
344
+ * Changed: Updated base64.js library in attach-to-post module
345
+ * Changed: Updated jquery.waitforimages.js
346
+ * Fixed: Uploading of non-JPEG images and uploading of JPEG with invalid EXIF data
347
+
348
+ = V3.1.3 - 01.08.2018 =
349
+ * Fixed: Post thumbnail support for NextGEN Gallery when using Block Editor
350
+
351
+ = V3.1.4 - 12.21.2018 =
352
+ * Fixed: Visual shortcode not displaying in WP 5.0.2
353
+
354
+ = V3.1.2 - 12.18.2018 =
355
+ * Fixed: Variable mismatch error when using central gallery management pages
356
+
357
+ = V3.1.1 - 11.29.2018 =
358
+ * Fixed: Don't enqueue block editor assets on frontend.
359
+ * Fixed: Broken styling for column blocks
360
+
361
+ = V3.1.0 - 11.28.2018 =
362
+ * NEW: Gutengerg block for NextGEN Gallery
363
+ * Secured: Other options page
364
+ * Updated: Freemius SDK
365
+ * Fixed: Getting started wizard compatible with Gutenberg
366
+ * Fixed: WPML redirects
367
+ * Fixed: Missing descriptions and tags when re-importing image metadata
368
+
369
+ = V3.0.16 - 10.24.2018 =
370
+ * Fixed Fontawesome 4 compatibility
371
+
372
+ = v3.0.15 - 10.23.2018 =
373
+ * NEW: Added requirements notification manager
374
+ * Changed: Basic Thumbnails default setting from "[Show slideshow]" to "Show slideshow"
375
+ * Changed: Fixed order_by=rand and 'variations' system not working by storing random results in a transient for 24h
376
+ * Changed: How gallery directories are removed
377
+ * Changed: Improved memory use during thumbnail generation
378
+ * Changed: Manage Albums page now uses GET for editing navigation
379
+ * Changed: Upgrading FontAwesome to 5.0.13
380
+ * Fixed: Attribute 'target=_blank' not working in lightbox effects
381
+ * Fixed: Conflict with WP Social Widget
382
+ * Fixed: Corrected numerous phpdoc problems found by Phan
383
+ * Fixed: Editing of image attributes from search-galleries page
384
+ * Fixed: Gritter messages with long texts overlapped their close-notification icon
385
+ * Fixed: IGW gallery selections not persisting between edits
386
+ * Fixed: Orphaned entries being created and/or left in wp_postmeta
387
+ * Fixed: Repeated and missing images in featured images list
388
+
389
+ = V3.0.13 - 10.11.2018 =
390
+ * Changed: Added settings for basic slideshow
391
+
392
+ = V3.0.9 - 09.25.2018 =
393
+ * NEW: Added 2.0 template mechanism for basic galleries
394
+ * NEW: Simple Lightbox is the new default Lightbox
395
+ * Changed: Changed Javascript library and styling for basic slideshow
396
+ * Changed: New default template and styling for thumbnail galleries
397
+ * Changed: New default template and styling for imagebrowser galleries
398
+ * Changed: New default template and styling for compact albums
399
+ * Changed: New default template and styling for extended albums
400
+ * Changed: Changed implementation of "Number of Columns" setting
401
+ * Changed: Significantly simplified NextGEN default shortcodes
402
+
403
+ = V3.0.8 - 09.05.2018 =
404
+ * Fixed: IGW broken with Chrome 69+
405
+
406
+ = V3.0.6 - 07.24.2018 =
407
+ * NEW: Added 'ngg_gallery_title_select_field' filter
408
+ * NEW: Danish translations
409
+ * NEW: Slovakian translations
410
+ * Changed: Removed unused swfUpload setting key from ngg_options array
411
+ * Secured: Image attribute storage
412
+ * Fixed: Styling of upload notifications
413
+ * Fixed: Do not purge WPML tag/translation mapping when removing unused NGG tags
414
+ * Fixed: Don't invoke icl_translate() when the admin language matches the default language
415
+ * Fixed: Importing Media Library images inside the IGW window
416
+ * Fixed: NGG > Overview's "Upgrade to Pro" links were still present when NGG Plus/Pro were active
417
+ * Fixed: Patched PEL to catch a possible exception caused by malformed IFD
418
+ * Fixed: Removed unneeded wp_localize_script('wp-color-picker'...)
419
+ * Fixed: Sorting galleries with over 1k images did not work past image 999
420
+
421
+ = V3.0.1 - 05.17.2018 =
422
+ * Fixed: Prevent caching of display_tab.js which can break the IGW
423
+
424
+ = V3.0.0 - 05.16.2018 =
425
+ * NEW: Complete redesign of NextGEN Gallery backend interface
426
+ * Changed: Image descriptions may now include <img> elements with src, alt, title, id, class, name, rel, and style
427
+ * Changed: Upgraded Select2 to latest release (4.0.5)
428
+ * Changed: Updated link href to 'image delete' & 'recover' links
429
+ * Fixed: Gutenberg compatibility
430
+ * Fixed: Removed use of screen_icon() from plugin
431
+ * Fixed: Color selection widget keeping unsaved values between page refreshes
432
+
433
+ = V2.2.54 - 02.28.2018 =
434
+ * Fixed: Conflict with Gutenberg editor
435
+ * Fixed: Manage Albums' "Not linked" option wasn't selectable
436
+ * Fixed: Manage Galleries gallery path field was having extraneous slashes added on IIS servers
437
+
438
+ = V2.2.50 - 02.20.2018 =
439
+ * Secured: Gallery paths and the ability to manage tags
440
+ * Kudos: ElevenPaths (Telefonica cibersecurity Unit)
441
+
442
+ = V2.2.46 - 02.15.2018 =
443
+ * Fixed: Broken Manage Albums page
444
+
445
+ = V2.2.45 - 02.14.2018 =
446
+ * NEW: Partner page for Imagify image optimization
447
+ * Secured: Image property escaping case-sensitive
448
+ * Secured: Vulnerable to CVE-2017-2416 buffer overflows
449
+ * Kudos: Zhouyuan Yang of Fortinet's FortiGuard Labs
450
+ * Fixed: Incorrect CSS class format used in form generator text field
451
+ * Fixed: Clean exit in FastCGI environments
452
+ * Fixed: Use of deprecated functions in gallery plugin
453
+
454
+ = V2.2.33 - 12.24.2017 =
455
+ * Secured: Certain image attributes were not being validated correctly
456
+
457
+ = V2.2.30 - 12.13.2017 =
458
+ * Fixed: Segfaults on PHP 7.2, 7.1.12, and 7.0.26.
459
+ * Fixed: WordPress gallery plugin wizards initialized too early.
460
+ * Fixed: ImageBrowser display types generating warnings on PHP 7.2
461
+ * Fixed: Widgets causing WSOD on PHP 7.2
462
+ * Fixed: Removed create_function() calls (deprecated in PHP 7.2)
463
+
464
+ = V2.2.18 - 12.04.2017 =
465
+ * NEW: Include PHP 7.2.0 in the warning created by NextGen Gallery 2.2.16
466
+
467
+ = V2.2.17 - 12.01.2017 =
468
+ * NEW: Include PHP 7.2-RCs in the warning created by NextGen Gallery 2.2.16
469
+
470
+ = V2.2.16 - 11.30.2017 =
471
+ * NEW: Display an admin warning and disable NextGen Gallery when PHP 7.1.12 or 7.0.26 are in use
472
+
473
+ = V2.2.14 - 09.18.2017 =
474
+ * NEW: EXIF and IPTC metadata are copied to new images and photos when generating thumbnails, watermarks, or new sizes
475
+ * Fixed: Metadata is read and preserved when "Resized images after upload" feature is enabled
476
+
477
+ = V2.2.12 - 08.01.2017 =
478
+ * Secured: Disabled Flash backend in plupload
479
+ * Changed: Upgraded PHP-Parser version used when building plugin zips
480
+ * Changed: Added DESC as an option to nggTags::find_images_for_tags()
481
+ * Fixed: Fixed useage of parse_str for PHP 7 (thanks Bodo Graumann)
482
+ * Fixed: Made transients manager flush only expired transients
483
+ * Fixed: Compatibility with Spider Calendar
484
+ * Fixed: Problem with validation code of DataMapper Models
485
+ * Fixed: Convert script/style urls to arrays in the lightbox installer
486
+
487
+ = V2.2.10 - 06.14.2017 =
488
+ * Fixed: Ensure that the plugin works when PHP isn't compiled against libxml
489
+
490
+ = V2.2.9 - 06.14.2017 =
491
+ * Fixed: WSOD caused by setting $wp_query->is_page to false
492
+
493
+ = V2.2.8 - 06.13.2017 =
494
+ * Changed: Removed custom Freemius opt-in message
495
+ * Changed: New design and video for Upgrade to Pro page
496
+ * Changed: Added namespacing to NGG-generated transients
497
+ * Fixed: Better error reporting for the XML-RPC method, ngg.uploadImage
498
+ * Fixed: Thumbnail editing links missing when locale uses RTL language such as Hebrew
499
+ * Fixed: Roles and Capabilities discrepancy with displaying NextGEN Gallery UI elements
500
+ * Fixed: Fancybox lightbox effect not compatible with Pro Mosaic galleries
501
+ * Fixed: Basic Tagcloud does not honor display type setting when editing in Insert Gallery Window
502
+ * Fixed: Basic Tagcloud allows selection of Pro display types when NGG Pro is disabled
503
+ * Fixed: Limit display types available in "Display galleries as" setting for albums
504
+ * Fixed: Special characters in `show_slideshow_text` parameter causing inserted display to not be editable.
505
+ * Fixed: NGG Basic Slideshow not honoring transition effect setting
506
+ * Fixed: Image tags that are no longer should be removed from WordPress gallery plugin
507
+ * Fixed: Spacing preserved when our shortcodes are placed with other content
508
+ * Fixed: Breadcrumbs in albums when slug is shared between gallery and album
509
+ * Fixed: get_unique_slug() creating invalid SQL query when gallery name contains quote characters
510
+ * Fixed: /ngg_tags pages displaying comments from all posts
511
+ * Fixed: PHP warning when saving image meta data
512
+ * Fixed: Fix incompatibility with WPML pagination due to overriding $_SERVER['REQUEST_URI']
513
+
514
+ = V2.2.3 - 04.05.2017 =
515
+ * Fixed: E_WARNING on Gallery Settings page due to improper use of array_combine() on PHP <= 5.3
516
+
517
+ = V2.2.2 - 04.04.2017 =
518
+ * Fixed: Hyperlinks in image descriptions
519
+ * Fixed: WordPress SEO sitemap image count
520
+ * Fixed: Removed id parameter in shortcodes
521
+ * Fixed: Fatal error in Freemius code
522
+
523
+ = V2.2.1 - 03.13.2017 =
524
+ * NEW: Template mechanism for all display types
525
+ * NEW: WordPress gallery plugin review notices
526
+ * Changed: Updated WordPress gallery plugin branding to Imagely
527
+ * Changed: Added the ability to click on a gallery title and have it open direct to Pro Lightbox
528
+ * Fixed: Problems with activation after initial installation
529
+ * Fixed: Don't display legacy shortcodes after creating new galleries
530
+ * Fixed: false positive malware detection notices against 'eval'
531
+ * Fixed: Various PHP notices and warnings
532
+ * Fixed: Issue with dynamic container height for Imagebrowser display types
533
+
534
+ = V2.1.79 - 02.23.2017 =
535
+ * Secured: Resolved vulnerability with tag cloud displays
536
+
537
+ = V2.1.77 - 01.31.2017 =
538
+ * Changed: Corrected Facebook link
539
+ * Changed: Tags in readme.txt
540
+ * Fixed: Problem with deactivating other plugin
541
+
542
+ = V2.1.69 - 01.18.2017 =
543
+ * Fixed: Ensured compatibility with WordPress 4.7.1
544
+ * Fixed: Missing option names on setting pages when Wizard active
545
+ * Fixed: Ensure that NextGEN Gallery is always loaded after it's extension plugins in WP 4.7
546
+ * Fixed: Pope product uninstaller not running during activation
547
+
548
+ = V2.1.62 - 12.15.2016 =
549
+ * Fixed: Typo in notice for launching the gallery wizard
550
+ * Fixed: The ability to dismiss the gallery wizard notice
551
+
552
+ = V2.1.61 - 12.14.2016 =
553
+ * NEW: Gallery creation wizard for new users
554
+ * Fixed: Shortcodes in WordPress gallery plugin widgets not getting substituted in Divi
555
+ * Fixed: Ensure that NGG placeholder text doesn't get styled incorrectly by other themes
556
+ * Fixed: Various thickbox issues on custom post type pages
557
+ * Fixed: Hide Insert Gallery placeholder images in Yoast feed
558
+
559
+ = V2.1.60 - 11.22.2016 =
560
+ * Secured: Ensure that only .css files can be edited using Styles tab
561
+
562
+ = V2.1.59 - 11.22.2016 =
563
+ * Secured: Ability to customize CSS Styles
564
+ * Changed: readme.txt improvements
565
+ * Fixed: Compatibility with WordPress 4.7.0
566
+ * Fixed: Insert Gallery Window-inserted tagclouds are incorrect
567
+
568
+ = V2.1.57 - 11.14.2016 =
569
+ * Secured: Custom Styles may only be written to specific directories
570
+ * Secured: SQL injection vulnerability for gallery names
571
+ * Changed: Display type icons are now clickable in the Insert Gallery Window
572
+ * Changed: Include backup image files when coping/moving a gallery
573
+ * Changed: Show gallery name in upload notification
574
+ * Changed: Added placeholder text to gallery name field on Add Gallery / Upload Images page
575
+ * Fixed: Custom sortorder not preserved in shortcode
576
+ * Fixed: Shortcodes added via Insert Gallery Window displayed as []
577
+ * Fixed: Uncaught TypeError: Cannot read property 'replace' of undefined
578
+ * Fixed: Use of deprecated Yoast SEO (aka WPSEO) filter
579
+ * Fixed: Conflict with Easy Digital Downloads
580
+ * Fixed: Misc invalid HTML tags in admin pages (thanks to kniebremser)
581
+ * Fixed: Change display:hidden to visibility:hidden in various places
582
+ * Fixed: Escaping of quotes in gallery titles and urls
583
+ * Fixed: Untranslatable strings
584
+
585
+ = V2.1.56 - 10.27.2016 =
586
+ * Fixed: Shortcode parsing was affecting third-party shortcodes
587
+
588
+ = V2.1.54 - 10.25.2016 =
589
+ * NEW: Added php docblock directives for code hinting/completion
590
+ * NEW: Display types can have aliases
591
+ * NEW: Visual Shortcodes
592
+ * Changed: Now uses gulp for package compilation & JS/CSS minification
593
+ * Changed: Updated Freemius SDK to 1.2.1
594
+ * Fixed: Extraneous backslashes being added to gallery titles & descriptions
595
+ * Fixed: Import folder 'gallery title' field wasn't being used for new gallery titles
596
+ * Fixed: Settings reset will now redirect to /wp-admin/ to avoid potential activation-related errors
597
+ * Fixed: Table columns cache becomes out of date between versions
598
+ * Fixed: Various issues with WordPress gallery plugin shortcodes when used in widgets
599
+ * Fixed: Warnings caused by calls to non-existent module package files
600
+ * Fixed: nextgen_admin's jquery-ui breaking Elegant Themes admin pages
601
+
602
+ = V2.1.50 - 08.30-2016 =
603
+ * NEW: Added the ability to open galleries within albums using a lightbox
604
+ * Changed: Increased freemius opt-in to 100%
605
+ * Changed: Tamara Lackey's biography on the WordPress gallery plugin overview page
606
+ * Fixed: Images and photos not responsive for all display types
607
+ * Fixed: Compatibility with the Imagely Lightroom plugin
608
+ * Fixed: Removed Pope tests folder from WordPress gallery plugin
609
+ * Fixed: Maximum function nesting level fatal error when displaying two or more albums
610
+ * Fixed: Ensure Insert Gallery Window background stays white
611
+ * Fixed: PHP warning for C_NGG_Lightbox class using incompatible constructor
612
+
613
+ = V2.1.49 - 07.26.2016 =
614
+ * NEW: Add a "Default" template option to override ATP settings when a global setting is used
615
+ * NEW: Added "generic" error reporting back during image upload.
616
+ * NEW: Added notice for deprecating PHP 5.2
617
+ * NEW: Option to display child gallery and album descriptions when viewing albums
618
+ * Changed: ATP preview images are smaller with tighter margins to show more images
619
+ * Changed: Content of WordPress gallery plugin Upgrade to Pro page
620
+ * Changed: New Gallery plugin Overview page
621
+ * Changed: Replicate gallery name sanitation of NG legacy for gallery paths
622
+ * Fixed: Resolved all found PHP warnings/notices/deprecations and strict errors
623
+ * Fixed: Compatibility on Windows servers with network mounted document roots
624
+ * Fixed: Ensure EXIF meta data is loaded from the appropriate exif_data array instead of exif_array
625
+ * Fixed: Gallery Settings toggle not functioning
626
+ * Fixed: Uploading breaking when thumbnail or image resizing fails due to lack of specific format support for image libraries
627
+ * Fixed: Warning generated in nggallery.php checking useMediaRSS option
628
+
629
+ = V2.1.46 - 06.23.2016 =
630
+ * Fixed: Remove inner nextgen-gallery folder due to build issue
631
+
632
+ = V2.1.45 - 06.22.2016 =
633
+ * Fixed: Freemius assets should not be minified
634
+
635
+ = V2.1.44 - 06.22.2016 =
636
+ * NEW: "Add Gallery" button added next to "Add Media" button on Create/Edit Post screen
637
+ * NEW: Insert Gallery placeholder images are watermarked
638
+ * NEW: Added API for communicating with Lightroom plugin
639
+ * NEW: Gulp build system
640
+ * NEW: Added "ngg_igw_placeholder_line_2_settings" and "ngg_igw_placeholder_line_1_settings" filters
641
+ * NEW: Added "ngg_settings_during_image_generation" filter to adjust image generation
642
+ * NEW: Added "ngg_before_save_thumbnail" filter for image manipulation abilities
643
+ * NEW: Added the ability to apply GD filters during image generation
644
+ * NEW: Integrated with WordPress SEO sitemaps to show include NGG images and photos in image counts
645
+ * Changed: Links to manage a gallery after it's been created don't appear in the Insert Gallery Window
646
+ * Fixed: Freemius code shouldn't be minified
647
+ * Fixed: When a datamapper entity is saved, it's corresponding cache should be cleared
648
+ * Fixed: Insert Gallery Window placeholder images aren't used by WordPress SEO's OpenGraph analysis
649
+
650
+ = V2.1.43 - 05.25.2016 =
651
+ * NEW: Added Freemius integration
652
+ * NEW: Added actions actions ngg_updated_image_meta, ngg_recovered_image, ngg_generated_image, ngg_moved_images, and ngg_copied_images
653
+ * NEW: Added patch from WPML copyping ATP galleries to new language pages when duplicating a page to a new language
654
+ * Changed: Moved 'ngg_delete_picture' action to before the image has been removed
655
+ * Changed: Now prevent maximum_entity_count from being set to 0 or lower in Other Options
656
+ * Changed: Updated "Roots" relative url support to re-branded "Soil" relative url
657
+ * Changed: Updated branding so all publicly visible instances of "Photocrati" are now "Imagely"
658
+ * Changed: Upgraded FontAwesome to 4.6.1
659
+ * Fixed: Album breadcrumbs when used with WordPress gallery plugin legacy templates
660
+ * Fixed: Compatibility with added WP role objects without a remove_cap() method
661
+ * Fixed: Default watermark setting causing images to be watermarked by text even though "image" is shown chosen on "Other Options"
662
+ * Fixed: Navigating to albums with UTF8 characters in their name
663
+ * Fixed: Replaced use of get_currentuserinfo() with wp_get_current_user()
664
+
665
+ = V2.1.33 - 04.25.2016 =
666
+ * Fixed: Compatibility with themes and plugins which enqueue underscore.js in the head of the document
667
+ * Fixed: Ensure that shutter reloaded can find it's image assets
668
+
669
+ = V2.1.31 - 04.05.2016 =
670
+ * NEW: Added constant NGG_SCRIPT_VERSION that is either the plugin version or rand() should SCRIPT_DEBUG be on
671
+ * NEW: Added warning when saving galleries and refuse to automatically delete galleries with one or more "../" in their path.
672
+ * Changed: ATP slug field disallow several characters (spaces, ?, |, &, [, ]) by replacing them with dashes as they are typed
673
+ * Changed: Made get_static_url() look in the WP_CONTENT/ngg/(module_name)/static directory for CSS/JS overrides
674
+ * Fixed: Bug introduced in 2.1.24 allowing gallery paths & slugs to contain spaces; galleries must be "saved" once to correct them
675
+ * Fixed: Compatibility with WPML String Translation when uploading images without title or description
676
+ * Fixed: Made get_image_url() encode gallery directory names 'because%this%is' a valid directory
677
+ * Fixed: Manage Galleries > Search results not saving when edited
678
+ * Fixed: Provided imagebrowser legacy templates not using AJAX pagination when enabled
679
+ * Fixed: Resource manager breaking the layout of the Multisite Plugin Activation page
680
+ * Fixed: Static url generation when the nextgen-gallery directory is a symlink outside of the WordPress roots
681
+
682
+ = V2.1.27 - 03.16.2016 =
683
+ * Fixed: Formatting issues with changelog
684
+
685
+ = V2.1.26 - 03.15.2016 =
686
+ * Fixed: Removed unnecessary whitespace from "Related images" template that caused issues with some themes
687
+ * Fixed: Detection of parents from grand-child-albums when generating breadcrumbs
688
+ * Fixed: C_Router->initialize() generating warnings with WP-CLI or the WP-CLI-Cron
689
+ * Fixed: Added Roots-theme relative-url support to C_MVC_Router->get_static_url()
690
+ * Fixed: nggdb::get_unique_slug() not generating unique slugs
691
+ * Fixed: Album breadcrumbs CSS compatibility with certain themes
692
+ * Fixed: C_Gallery->validation() not working properly when sanitizing gallery title using UTF-8
693
+ * Fixed: NGG's cross-frame-communication cookies not being purged
694
+ * Fixed: Updated C_Dynamic_Thumbnails_Manager->get_uri_from_params() with user-submitted patch
695
+ * Fixed: Updated C_CustomPost_DataMapper_Driver->_save_entity() with user-submitted patch
696
+ * Fixed: Cleaned up overview.php's readability and removed some now-long-unused code from legacy's ajax.php
697
+
698
+ = V2.1.23 - 01.05.2015 =
699
+ * Secured: XSS vulnerabilities in Manage Gallery pages
700
+ * Secured: Ability to browse and import gallery folders
701
+
702
+ = V2.1.19 - 12.23.2015 =
703
+ * Fixed: PHP warning about incorrect usage of parse_url()
704
+
705
+ = V2.1.18 - 12.21.2015 =
706
+ * NEW: Added text domain and domain path to plugin header
707
+ * NEW: Add the ability to specify gallery title with import_gallery_from_fs() method
708
+ * NEW: Swedish (sv_SE) translation (thanks Anders O Johansson)
709
+ * Changed: Updated plugin's FontAwesome to version 4.5
710
+ * Changed: Handle for bundled version select2 is now called 'ngg_select2'
711
+ * Fixed: Removed redundant translatable strings (thanks Rene Wolf)
712
+ * Fixed: Loading non-WOFF fonts on IIS servers
713
+ * Fixed: Attempt to load non-existing minified translation files for Plupload
714
+ * Fixed: Order direction not honored on Manage Galleries page
715
+ * Fixed: _NGG_Galleries_List_Table compatibility with WordPress 4.3+
716
+ * Fixed: Double-UTF8-encoding of image metadata
717
+ * Fixed: Don't use interframe communication outside of the Insert Gallery Window
718
+ * Fixed: Problem deleting interframe communication cookies
719
+
720
+ = V2.1.15 - 09.09.2015 =
721
+ * Secured: Image uploads
722
+ * Fixed: Don't use esc_attr_e() to prevent translation issues
723
+ * Fixed: Ensure that deleting a gallery doesn't delete anything it shouldn't
724
+ * Fixed: get_gallery_abspath() should return NULL if the path doesn't exist
725
+
726
+ = V2.1.10 - 09.01.2015 =
727
+ * Secured: Escape output of parameters in templates to avoid XSS
728
+
729
+ = V2.1.9 - 08.25.2015 =
730
+ * NEW: Added ngg_manage_galleries_items_per_page filter
731
+ * NEW: Added ngg_manage_galleries_items_order filter
732
+ * NEW: ngg_manage_galleries_items_orderby
733
+ * Secured: Limit the ability to browse folders outside of NGG_IMPORT_ROOT
734
+
735
+ = V2.1.7 - 08.12.2015 =
736
+ * Changed: "Flush image cache" now removes images and photos from the database w/o a gallery
737
+ * Changed: "Show Meta" popup: parse date_format through date_i18n()
738
+ * Changed: Made Add Gallery/Images notifications a link to the gallery
739
+ * Changed: No longer cache displayed galleries as transients
740
+ * Changed: Updated widgets to use PHP5 parent::__construct() over $this->WP_Widget()
741
+ * Fixed: C_NextGen_Metadata->get_EXIF() was bugged with imagebrowser-exif template
742
+ * Fixed: Cornerstone/X compatibility with WordPress gallery plugin
743
+ * Fixed: Recovering images and photos was 'generating' from backup instead of copying
744
+ * Fixed: Setting post thumbnail more than once on a page/post
745
+ * Fixed: Permanently hide display types from ATP without an active POPE module
746
+
747
+ = V2.1.2 - 07.20.2015 =
748
+ * NEW: Ability to import from Media Library
749
+ * NEW: Added filter 'ngg_datamapper_table_name'
750
+ * NEW: Added filter `ngg_legacy_template_directories` for legacy template locator (thanks Ross McKay)
751
+ * NEW: Pagination available on Manage Images page
752
+ * NEW: Added filter ngg_manage_images_items_per_page_array to control pagination options
753
+ * NEW: Added filters 'ngg_load_frontend_logic' and 'ngg_get_modules_to_load'
754
+ * NEW: Added filter 'ngg_add_page_shortcode' to control Manage Galleries > 'Create new page' content
755
+ * NEW: Added filter 'ngg_manage_albums_items_order'
756
+ * Changed: Removed PHP4 support
757
+ * Fixed: Ability to set NextGEN Image as Featured Image
758
+ * Fixed: Don't use resource manager in download requests for WP Photo Shelter
759
+ * Fixed: Updated custom jQuery-UI styling to resemble WordPress postbox styling
760
+ * Fixed: Styled plupload buttons to resemble WordPress buttons
761
+ * Fixed: Removed 'fixed' class from manage galleries table. Allows columns to adjust to content
762
+ * Fixed: Removed note about flash support and fixed typoe (thanks Rene Wolf)
763
+ * Fixed: Fixed typo in nggallery.po
764
+ * Fixed: Cache results of lookup_columns() to avoid multiple identical queries; thanks go to Alex Bradaric
765
+ * Fixed: Better WP-CPI detection
766
+ * Fixed: Removed unnecessary calls to parent::initialize()
767
+ * Fixed: Adjusted album-compact template to always include p.ngg-album-gallery-image-counter
768
+ * Fixed: Replaced empty gallery rendering in is_feed() with a link
769
+ * Fixed: Removed default settings for imagerotator, which is no longer supported
770
+ * Fixed: Optimized scanning of images when importing a photo gallery
771
+ * Fixed: When a photo gallery is deleted, ensure that DB and filesystem are purged
772
+ * Fixed: Removed Insert Gallery Window box shadow
773
+ * Fixed: Ensure that file_exists() calls are prefixed with @
774
+
775
+ = V2.1.0 - 05.18.2015 =
776
+ * NEW: Album breadcrumbs and pagination
777
+ * NEW: Ability to override builtin MVC templates
778
+ * NEW: Robust transient management
779
+ * NEW: Added the ability to set post thumbnails via XML-RPC module
780
+ * NEW: Added 'ngg_get_image_size_params' filter to control image generation
781
+ * NEW: Added 'ngg_basic_tagcloud_title' and 'ngg_basic_tagcloud_excluded_display_types' filters
782
+ * NEW: Added ngg_manage_images_items_per_page filter
783
+ * NEW: Added "ngg_get_image_url" filter
784
+ * NEW: Including Ukranian and Polish translations
785
+ * NEW: The ability to set template in widgets
786
+ * Changed: Default thumbnail dimensions set to 240x160
787
+ * Changed: Product now adheres to Pope 0.12 and provides get_modules_to_load()
788
+ * Changed: Updated gallery plugin translations
789
+ * Changed: Removed link to capsman plugin in Roles accordion
790
+ * Changed: Taxnomies now use internationalized strings
791
+ * Changed: Image date/time meta data fields are stored as UNIX timestamps
792
+ * Secured: Uploading zips
793
+ * Fixed: Various PHP warnings and notices
794
+ * Fixed: Compatibility fixes for WPML
795
+ * Fixed: Ensure that backup image functionality fails gracefully
796
+ * Fixed: WP option 'ngg_do_upgrade' updated in every HTTP request
797
+ * Fixed; Empty $_SERVER['PATHINFO'] causing multiple routing issues
798
+ * Fixed: "Manage Galleries" display image alttext in the filename column
799
+ * Fixed: Various issues with the tag cloud display type
800
+ * Fixed: Integrity check when updating from 1.9.x
801
+ * Fixed: Image filenames substituting spaces for + which is only proper in the query string
802
+ * Fixed: Insert Gallery Window not working with nested levels of gzip compression
803
+ * Fixed: Imagebrowser as lightbox effect not working with pagination
804
+ * Fixed: Plugin compatibility with MultiVerso Advanced File Sharing
805
+ * Fixed: "Add page" button not displaying on the next immediate page load
806
+ * Fixed: Double-escaping of non-latin characters
807
+ * Fixed: Imagebrowser pagination with custom templates
808
+ * Fixed: Custom CSS is enqueued late to ensure it's one of the last stylesheets loaded
809
+ * Fixed: Fixed watermarking PNG images and photos
810
+ * Fixed: Using the "Import Metadata" bulk action overwrites existing data
811
+ * Fixed: Seconds were not retained from CaptureTime EXIF field
812
+ * Fixed: Conflicts created by our TinyMCE plugin
813
+ * Fixed: Image mapper setting gid to gallery name, not the unique ID
814
+ * Fixed: Restored nggdb->get_random_images(), nggdb->search_for_file, and nggdb->find_all_albums()
815
+ * Fixed: Allow gallery slug as parameter to nggdb::get_gallery()
816
+ * Fixed: Don't minify Plupload's i18n JavaScript
817
+ * Fixed: Custom template images not being given their full effect code attributes
818
+ * Fixed: When importing galleries from folders, allow symlinks
819
+ * Fixed: Use of C_Gallery_Mapper in C_Image_Wrapper
820
+ * Fixed: Properly handle themes that don't call wp_footer() or wp_print_footer_scripts()
821
+ * Fixed: Warning about missing style.php file on Network Admin -> Gallery page
822
+ * Fixed: Warning about getimagesize() failure when backing up an image
823
+
824
+ = v2.0.79 - 03.20.2015 =
825
+ * Secured: Sanitized C_Displayed_Gallery->_add_find_in_set_column() third parameter
826
+
827
+ = V2.0.78 - 03.12.2015 =
828
+ * Secured: AJAX actions for uploading images and importing folders now uses nonce checks
829
+
830
+ = V2.0.77 - 03.05.2015 =
831
+ * NEW: Added "ngg_get_image_url" filter
832
+ * Changed: Use a more reliable means of excluding Pro/Plus modules from using minified static resources
833
+ * Fixed: Imagebrowser pagination with custom templates
834
+ * Fixed: Custom CSS is enqueued late to ensure it's one of the last stylesheets loaded
835
+ * Fixed: Fixed watermarking PNG images and photos
836
+ * Fixed: Using the "Import Metadata" bulk action overwrites existing data
837
+ * Fixed: Seconds were not retained from CaptureTime EXIF field
838
+ * Fixed: Conflicts created by WordPress gallery plugin TinyMCE plugin
839
+ * Fixed: Image mapper setting gid to gallery name, not the unique ID
840
+ * Fixed: Restored nggdb->get_random_images(), nggdb->search_for_file, and nggdb->find_all_albums()
841
+ * Fixed: Allow gallery slug as parameter to nggdb::get_gallery()
842
+ * Fixed: Don't minify Plupload's i18n JavaScript
843
+ * Fixed: Custom template images not being given their full effect code attributes
844
+
845
+ = V2.0.76 - 02.24.2015 =
846
+ * Fixed: Compatibility checks for very old versions of NextGEN Pro plugin
847
+ * Fixed: Zero-byte downloads in WooCommerce and WPE-Commerce
848
+ * Fixed: Invalid URL being enqueued if a custom lightbox is selected with no URL provided
849
+ * Fixed: Restored a method to nggAdmin to fix compatibility with NextGen Public Uploader
850
+ * Fixed: Bug preventing source='recent' from displaying images in the correct order
851
+ * Fixed: Include more quotation symbols in our shortcode manager (foreign language shortcodes)
852
+ * Fixed: WPML/ATP compatibility issue
853
+ * Fixed: $nggdb->get_gallery() returning a different result than before
854
+
855
+ = V2.0.74 - 02.20.2015 =
856
+ * Changed: Removed jQuery Lightbox and Highslide due to incompatible licensing with GPL
857
+
858
+ = V2.0.71 - 02.19.2015 =
859
+ * NEW: Module files are compiled into a single package file to reduce disk I/O
860
+ * NEW: All CSS stylesheets and Javascript source files are minified to reduce latency
861
+ * NEW: All lightboxes are configured using an in-memory management class.
862
+ * NEW: Uses Pope 2.0, benefiting from the new caching capabilities
863
+ * NEW: NextGEN Gallery's functionality is disabled if NextGEN Pro is incompatible
864
+ * NEW: Added ngg_effect_code filter
865
+ * Changed: Updated plugin's FontAwesome to 4.3.0
866
+ * Changed: Updated plugin's select2 to 3.5.2
867
+ * Changed: Removed PicLens / CoolIris integration from WordPress gallery plugin
868
+ * Changed: Removed JSON API. Please use XML-RPC API instead
869
+ * Changed: For performance reasons, we cache FS & url lookups/calculations
870
+ * Changed: Greatly reduced the # of sql queries, and eliminated anything redundant
871
+ * Changed: For performance reasons, we cache datamapper and SQL queries
872
+ * Changed: Don't enqueue scripts or styles unless we require them
873
+ * Changed: Reduce the number of resources we enqueue for every HTTP request
874
+ * Changed: Ngg_Store now uses cookies instead of localStorage
875
+ * Changed: Insert Gallery Window is routed using wp-admin/admin_init
876
+ * Changed: Removed unused code from ngglegacy module. Created wrappers for commonly-used functions
877
+ * Changed: LZW module removed
878
+ * Changed: Legacy template drop-down selection now using select2
879
+ * Secured: Restrict folder browsing to NGG_IMPORT_ROOT constant
880
+ * Fixed: Compatibility issue with PHP's transparent ZLIB compression
881
+ * Fixed: Imagebrowser as lightbox effect not working when non-default permalink slug used
882
+ * Fixed: Angled quotations marks used in shortcode parameters
883
+ * Fixed: Compatibility between ImageBrowser display type and TwentyFifteen theme
884
+ * Fixed: Allow pagination to retain query string url parameters when linking to other pages
885
+ * Fixed: Fixed pagination issues with slideshow galleries displayed as thumbnails
886
+ * Fixed: Fix C_GalleryStorage_Driver_Base->import_gallery_from_fs() not checking imgBackup
887
+ * Fixed: Fixed problem with default settings being applied multiple times
888
+ * Fixed: Fallback to "full" image sizes if "backup" images aren't available
889
+ * Fixed: Use M_DataMapper's serialization methods throughout the codebase
890
+ * Fixed: Conflict with WordPress SEO and get_the_excerpt() call
891
+ * Fixed: Don't run Resource Manager on wp-login.php or wp-sign.php
892
+ * Fixed: TinyMCE Image Editor conflict with Insert Gallery Window placeholder images
893
+ * Fixed: Fix Shutter positioning when admin bar is displayed
894
+ * Fixed: Allow deselection of a WordPress gallery plugin legacy template
895
+ * Fixed: Prevent conflicts when using imagebrowser as a lightbox effect
896
+ * Fixed: Pagination not working for slideshows using thumbnail integration
897
+
898
+ = V2.0.66.33 - 11.24.2014 =
899
+ * Fixed: Broken NextGEN Pro ecommerce-related shortcodes
900
+ * Fixed: Spanish PO file
901
+
902
+ = V2.0.66.31 - 11.21.2014 =
903
+ * Fixed: Broken shortcodes with WordPress 4.0.1
904
+
905
+ = V2.0.66.29 - 09.17.2014 =
906
+ * NEW: Added skip_excluding_globally_excluded_images property to displayed gallery objects
907
+ * Fixed: SQL generation for random image selection
908
+ * Fixed: Adjust regex for replacing displayed gallery placeholder images
909
+ * Fixed: Removed filters to home_url needed previously for WMPL compatibility
910
+ * Fixed: Use canonical redirects when appropriate
911
+ * Fixed: Ability to override image files using XML-RPC
912
+
913
+ = V2.0.66.27 - 08.18.2014 =
914
+ * Fixed: Missing class.frame_communication_option_handler.php error
915
+
916
+ = V2.0.66.26 - 08.18.2014 =
917
+ * NEW: Added fault tolerance to bulk action AJAX requests
918
+ * Changed: Moved some WordPress gallery plugin settings from DB to in-memory
919
+ * Fixed: Compatibility with BuddyPress plugin in multisite environments
920
+ * Fixed: Ability to find static resources outside of WP_PLUGIN_DIR
921
+ * Fixed: Autoupdate conflict with Photocrati Theme
922
+ * Fixed: Workaround GoDaddy's throttling of consecutive AJAX requests
923
+ * Fixed: Issue with settings manager in multisite enviroments
924
+
925
+ = V2.0.66.17 - 08.08.2014 =
926
+ * NEW: Added French translations
927
+ * Secured: XSS vulnerability in jQuery Plupload Queue (thanks Codevigilant Team)
928
+ * Secured: XSS vulnerability in thumbnail/slideshow integration links
929
+ * Secured: XSS vulnerability on Manage Albums page
930
+
931
+ = V2.0.66.16 - 07.30.2014 =
932
+ * NEW: Added new "limit" setting to Slideshow widgets
933
+ * NEW: Added a "ngg_routes" action for other plugins to hook into to provide new routes
934
+ * NEW: Added NGG_SKIP_LOAD_SCRIPTS constant, which existed in 1.9.x
935
+ * NEW: Added NGG_GALLERY_ROOT_TYPE constant. Set to 'content' to load galleries from the content_dir / content_url
936
+ * NEW: Bosnian (bs_BA) language thanks to Nevesin Srdoc
937
+ * NEW: Chinese (zh_CN) language thanks to Vahi Chen, http://www.vahichen.com
938
+ * NEW: Dutch (nl_NL) language thanks to Taeke Kooiker
939
+ * NEW: Filipino (fil) language thanks to Find Hold, http://www.findhold.dk/
940
+ * NEW: French (fr_FR) language thanks to Jean-Yves Dumaine & Le Blog de Lise
941
+ * NEW: Hungarian (hu_HU) language thanks to Zoltán Varanka
942
+ * NEW: Italian (it_IT) language thanks to Jacopo Caggiano, @tizz
943
+ * NEW: Russian (ru_RU) language thanks to SnakeD3
944
+ * NEW: Spanish (es_ES) language thanks to Andrew Kurtis at WebHostingHub
945
+ * Changed: Updated Czech language thanks to Separatista; additional thanks to Martin Krizek for the original translation who was mistakenly unaccredited
946
+ * Changed: "Upgrade to Pro" page has new design, advertises for NextGEN Plus
947
+ * Changed: Basic Albums templates now given the image counter P element the class 'ngg-album-gallery-image-counter' (by user request)
948
+ * Changed: Gallery widgets now apply height:auto to their element; fixes compatibility with some themes
949
+ * Changed: Random galleries should be substantially faster now (1000% or more for large image tables)
950
+ * Fixed: Complete WPML compatibility
951
+ * Fixed: Disable Buddypress 'bp_do_redirect_canonical' filter as it ruins our routing system
952
+ * Fixed: Use plugins_url() content_url() when appropriate rather than just site_url() and home_url()
953
+ * Fixed: WP Cron job will remove not only displayed gallery transients, but rendering transients as well
954
+ * Fixed: NGG_RENDERING_CACHE_TTL constant is honored properly
955
+ * Fixed: If using the caption template for Basic Thumbnails, only show the image caption when appropriate
956
+ * Fixed: If NGG is uninstalled, so are it's custom capabilities
957
+ * Fixed: Translate "Attach NextGEN Gallery to Post" ATP icon alt text when translations are active
958
+ * Fixed: Multisite gallery path tooltip gave a wrong default setting
959
+ * Fixed: Flush 'all' caches when pope_module_list setting changes
960
+ * Fixed: Don't enqueue related images css in the admin
961
+ * Fixed: Basic Slideshows fixes WP creating extraneous P element above the slideshow display
962
+ * Fixed: Basic Singlepic will now display images marked 'excluded' in the admin
963
+ * Fixed: Admin pages can now update when the "Save" button text has been translated
964
+
965
+ = V2.0.66 - 05.20.2014 =
966
+ * Secured: Check mime type of image files using a variety of mechanisms
967
+
968
+ = V2.0.65 - 05.04.2014 =
969
+ * Secured: Limit uploads to images and zips
970
+
971
+ = V2.0.63 - 04.29.2014 =
972
+ * NEW: Translation ready
973
+ * NEW: Including German translation by Roland Stumpp
974
+ * NEW: Including Czech translation by Separatista
975
+ * NEW: Including Finnish translation by Vesa Tiirikainen
976
+ * NEW: WPML / qTranslate support
977
+ * NEW: Bundled Browser+ JavaScript library
978
+ * NEW: Added NGG_DISABLE_FILTER_THE_CONTENT constant to manage conflicts
979
+ * Changed: Moved jquery.nextgen_radio_toggle.js to NextGEN Admin Module
980
+ * Changed: Original display settings are passed to secondary display types
981
+ * Fixed: Thumbnail dimension calculations are inaccurate by 1px when maintaining aspect ratio
982
+ * Fixed: Copy IPTC data from original to new image when creating new sizes / thumbnails
983
+ * Fixed: Use correct absolute path when importing images in a multisite environment
984
+ * Fixed: Incorrect display of disk space quotas in multisite environments
985
+ * Fixed: Removed redundant roles form in multisite environments
986
+ * Fixed: Insert Gallery Window support for multisite environments
987
+ * Fixed: Incorrect handling of NextGEN Styles in multisite environments
988
+ * Fixed: WordPress gallery plugin not honouring NGG_IMPORT_ROOT constant
989
+ * Fixed: Fixed inability to edit gallery properties using XMLRPC's edit_gallery method
990
+ * Fixed: Alignment issues in Basic Compact Albums caused by subalbums not displaying image 'counter'
991
+ * Fixed: Display setting forms compatibility issue with WordPress 3.9
992
+ * Fixed; Compability with jQuery Dialogs in WordPress 3.9
993
+ * Fixed: Maximum entity code should be a displayed gallery property for recent/random sources only
994
+ * Fixed: Problems with zlib compression: https://core.trac.wordpress.org/ticket/18525
995
+ * Fixed: Support for web servers which use a document root of '//'
996
+ * Fixed: Compatibility with WPML Translation Management
997
+ * Fixed: use 'del' for function name in ngg_store.js, 'delete' is a reserved keyword
998
+ * Fixed: Enqueue fontawesome only when necessary
999
+ * Fixed: Suhosin compatibility issue when overriding PHP memory limit
1000
+ * Fixed: Handle images of wrong image type correctly when trying to create cropped thumbnails
1001
+ * Fixed: Datamapper entities not allowed to have properties with a value of 0
1002
+ * Fixed: Resource manager is manipulating feeds
1003
+ * Fixed: Convert absolute urls to relative urls for lightboxes
1004
+ * Fixed: Start the resource manager as early as we can within the init action
1005
+ * Fixed: Routing problem for galleries with images named 1.jpg, 2.jpg, 3.jpg, etc.
1006
+ * Fixed: Added tooltips to basic slideshow settings
1007
+ * Fixed: Remove CKEditor's NextGEN button, which is incompatible with NextGEN Gallery 2.x
1008
+
1009
+ = V2.0.61 - 04.01.2014 =
1010
+ * Fixed: Compatibility with WP 3.9
1011
+ * Fixed: Exception thrown when using Reset button
1012
+
1013
+ = V2.0.59 - 03.18.2014 =
1014
+ * Changed: Separated pope_module_list from ngg_options record in options table
1015
+ * Fixed: Removed code causing jQuery compatibility issues in WP Admin
1016
+ * Fixed: Allow third-parties to override jQuery with Google's CDN
1017
+ * Fixed: When resetting the 'jquery' handle, ensure that jquery-migrate is a dependency
1018
+ * Fixed: Silenced many PHP warnings in gallery plugin
1019
+ * Fixed: Datamapper->count() not returning the correct count
1020
+ * Fixed: Compatibility with Gravity Forms
1021
+
1022
+ = V2.0.58 - 03.10.2014 =
1023
+ * Fixed: Reset jQuery to WP defaults when modified by a third-party
1024
+ * Fixed: Compatibility with WP jQuery Lightbox plugin
1025
+ * Fixed: Compatibility with Peekaboo theme
1026
+
1027
+ = V2.0.57 - 03.05.2014 =
1028
+ * NEW: Re-introduced the Reset button to WordPress gallery plugin
1029
+ * NEW: Tooltip added for Page Link to functionality
1030
+ * NEW: Displayed Gallery Triggers moved from NextGEN Pro to NextGEN Gallery (not in use)
1031
+ * NEW: Added NGG_Store, a client-side persistence layer (not in use)
1032
+ * NEW: Added NGG_CRON_SCHEDULE constant. Set to the number of seconds between the execution of NextGEN Gallery cron jobs
1033
+ * NEW: Added NGG_RENDERING_CACHE_TTL constant. TTL measured in seconds.
1034
+ * NEW: Added NGG_DISPLAYED_GALLERY_CACHE_TTL constant. TTL measured in seconds.
1035
+ * NEW: Added NGG_DISABLE_LEGACY_SHORTCODES constant. When TRUE, [slideshow] becomes [nggslideshow].
1036
+ * NEW: Added Font Awesome, available for NextGEN Gallery extensions
1037
+ * Changed: Transients are removed every 30 minutes instead of 60 minutes
1038
+ * Changed: Admin Page & Form components refactored to allow custom POST processing
1039
+ * Changed: Default path for NEW multisite installations to wp-content/uploads/sites/%BLOG_ID%/nggallery/
1040
+ * Fixed: Ability to upload ZIP files on Windows hosts
1041
+ * Fixed: Support for filenames with non-ASCII characters
1042
+ * Fixed: Dynamic updates in the Insert Gallery interface (interframe communication)
1043
+ * Fixed: WordPress gallery plugin insert interface freezing in IE11
1044
+ * Fixed: Path issues on Windows Servers
1045
+ * Fixed: Module installer integrity
1046
+ * Fixed: Database query performance. No more joins to the WP options table
1047
+ * Fixed: Lightboxes storing absolute paths for static resources
1048
+ * Fixed: Displayed gallery cache not regularly flushed
1049
+ * Fixed: SQL query performance problems. Honor max_packet_allowed variable for MySQL
1050
+ * Fixed: Multiple database queries generated for determining next available image slug
1051
+ * Fixed: Corrupted MediaRSS feeds
1052
+ * Fixed: Padding on Gallery Settings and Other Options pages
1053
+ * Fixed: Routing issues on subdirectory installs
1054
+ * Fixed: Importing galleries using the Insert Gallery Interface
1055
+ * Fixed: Gallery path calculations on Windows web servers
1056
+ * Fixed: Sub-album urls not processed correctly
1057
+ * Fixed: Apply maximum entity count to existing displayed galleries
1058
+ * Fixed: NextGEN Gallery Thumbnail Widget shouldn't use ImageBrowser effect
1059
+ * Fixed: Ability to set shuffle parameter for ImageRotator slideshows
1060
+ * Fixed: PHP warning about HTMLDocument when displaying a SinglePic
1061
+ * Fixed: Sanitization of gallery title
1062
+ * Fixed: Home URL now used instead of Site URL in MediaRSS feed
1063
+ * Fixed: Insert Gallery interface broken when WPML is installed
1064
+ * Fixed: Insert Gallery interface instructing browser to cache the page
1065
+ * Fixed: Watermarking not working in low-memory environments
1066
+ * Fixed: Maximum images limit not being applied for galleries already created.
1067
+ * Fixed: Double forward slashes in static urls
1068
+ * Fixed: Don't sleep when checking if the installer is running
1069
+ * Fixed: Don't enforce Pope interface contracts
1070
+ * Fixed: Remove custom table extra records from wp_options table
1071
+ * Fixed: Scan folder for new images and photos not working
1072
+ * Fixed: Incorrect page permalink used for "Page Link To" functionality
1073
+ * Fixed: Pagination broken when Basic Thumbnail gallery on the same page as Basic Album
1074
+ * Fixed: parse_url() warnings generated for PHP 5.3.3 and earlier
1075
+ * Fixed: Compatibility with Headway Themes
1076
+ * Fixed: Compatibility with web servers which don't provide PHP a document root
1077
+ * Fixed: Third-party incompatibilities caused by the Photocrati Resource Manager
1078
+ * Fixed: Compatibility with the Flattr plugin
1079
+ * Fixed: Compatibility with the Weaver II theme
1080
+ * Fixed: Gallery plugin interface tweaks for WordPress 3.8
1081
+
1082
+ = V2.0.40 - 11.26.2013 =
1083
+ * NEW: Added the ability to apply lightbox effects to non-NGG images
1084
+ * NEW: Added NGG_HIDE_STRICT_ERRORS constant. Define and set to TRUE to hide strict errors
1085
+ * NEW: Added NEXTGEN_GALLERY_IMPORT_ROOT constant. Define and set to TRUE to browse from a custom directory
1086
+ * NEW: Added NGG_DEBUG constant. Define and set to TRUE to display helpful messages for debugging
1087
+ * NEW: Each custom table record will have an associated custom post record for expansion
1088
+ * NEW: Display helpful error messages when there's a problem uploading images and photos
1089
+ * NEW: Add data-(src|thumbnail|image-id|title|description) attribute to gallery image anchors
1090
+ * NEW: Variant support for displayed gallery sources. Random images is limited to 5 variations
1091
+ * Fixed: Excessive creation of transients for random galleries
1092
+ * Fixed: Issues prohibiting the ability to upload images and photos
1093
+ * Fixed: Compatibility with NextGEN Gallery Export Plugin for Adobe Lightroom (thanks Vladimir!)
1094
+ * Fixed: Sorting in the Insert Gallery interface
1095
+ * Fixed: HTML allowed in gallery/album descriptions
1096
+ * Fixed: Requests for galleries within albums that have numeric names are broken
1097
+ * Fixed: Call to a non-member function get() on WP_Query
1098
+ * Fixed: Ability to sort by Image ID in the Insert Gallery interface
1099
+ * Fixed: Isolate the Insert Gallery Window from implicit third-party script inclusion
1100
+ * Fixed: Check for the existance of thumbnails when generating urls, and if missing, generate new ones
1101
+ * Fixed: Compatibility with NextGEN Facebook OpenGraph+ plugin
1102
+ * Fixed: Various XML-RPC issues in WordPress gallery plugin
1103
+ * Fixed: Widgets stylesheet not included
1104
+ * Fixed: Issue with color not being pre-selected when previewing Watermark
1105
+ * Fixed: E_NOTICE emitted when cleaning up cached image files
1106
+ * Fixed: E_NOTICE emitted when viewing display type settings
1107
+ * Fixed: Typo adjusting pcre.backtrack_limit for shortcodes
1108
+ * Fixed: Content within the tabs of the Insert Gallery interface cut-off
1109
+ * Fixed: Routing problem which would cause conflicts with different display types on the same page
1110
+ * Fixed: Broken Dynamic CSS links on GoDaddy
1111
+ * Fixed: Ability to use HTML in gallery/album descriptions
1112
+ * Fixed: Sub-album requests conflicting with paginated galleries on the same page
1113
+ * Merged: Pull request from andreasE (https://bitbucket.org/photocrati/nextgen-gallery/pull-request/6/)
1114
+
1115
+ = V2.0.33 - 10.21.2013 =
1116
+ * NEW: Requests /ngg_tag/[tagname] will create a displayed gallery
1117
+ * NEW: Option added to "Import Gallery" tab to use original images
1118
+ * Fixed: Links are broken on the ngg_tags-sitemap.xml file by WordPress SEO
1119
+ * Fixed: PHP notice: Attempt to assign property of non-object
1120
+ * Fixed: Undefined property warnings when using NextGEN Basic Thumbnails
1121
+ * Fixed: Detect if an applying a transient to a displayed gallery was successful
1122
+ * Fixed: Compatibility issues with BJ-Lazy-Load and Colorbox
1123
+ * Fixed: Pagination conflicts for multiple Imagebrowsers on the same page
1124
+ * Fixed: Ability to display previous exception with debug mode
1125
+ * Fixed: Tagclouds not working in multisite instances
1126
+ * Fixed: Load widgets.css when a widget is being used
1127
+ * Fixed: Installer should remove all instances of the component factory
1128
+ * Fixed: WordPress gallery plugin widget settings interface not intuitive
1129
+ * Fixed: Inability to upload images and photos in some Windows host environments
1130
+ * Fixed: Sorting images/galleries using the Insert Gallery interface
1131
+ * Fixed: Fix detection of HTTPS (pull request by Leonhardt Wille)
1132
+ * Fixed: Compilation errors of regular expressions
1133
+ * Fixed: Pro galleries wouldn't display in environments using PHP 5.3.3 or less
1134
+ * Fixed: Scanning of router slug is now limited to the uri, not the url
1135
+ * Fixed: Show slideshow link isn't required for thumbnail/imagebrowser integration
1136
+ * Fixed: WordPress media-upload with 'singlepic' image size
1137
+ * Fixed: Use target=_blank when the link setting is provided for NextGEN Basic Singlepic
1138
+ * Fixed: Only display rendering errors if WP_DEBUG is enabled
1139
+
1140
+
1141
+ = V2.0.31 - 10.03.2013 =
1142
+ * NEW: Restored AJAX pagination for NextGEN Basic ImageBrowser display type
1143
+ * Fixed: Compatibility with WordPress Local SEO by Yoast
1144
+ * Fixed: Inability to upload images if image_slug field was missing in database
1145
+ * Fixed: Integration of NextGEN Basic Thumbnail and NextGEN Basic Slideshow display types
1146
+ * Fixed: Photocrati Resource Manager further adjusted to be third-party friendly
1147
+ * Fixed: Added the ability to find legacy templates in both the child/parent theme directories
1148
+ * Fixed: JavaScript errors in Attach to Post interface
1149
+ * Fixed: Router can handle port numbers in urls
1150
+ * Fixed: Carousel template was linking to NextGEN Basic ImageBrowser view
1151
+ * Fixed: SQL query generated for displayed galleries using tags as source
1152
+ * Fixed: 3rd party compat: raise & never lower pcre.backtrack_limit
1153
+
1154
+ = V2.0.30 - 09.25.2013 =
1155
+ * NEW: Restored the ability to use imagebrowser display type instead of a lightbox effect
1156
+ * Changed: Displayed galleries are no longer rendered in RSS feeds
1157
+ * Changed: Removed "Plugin Check" widget from WordPress gallery plugin overview page
1158
+ * Fixed: Silence PHP warnings/errors in an output buffer for AJAX actions
1159
+ * Fixed: Compatibility issue with WordPress SEO and broken site maps (and large error_logs)
1160
+ * Fixed: Compatibility issue with AJAX Event Calendar (and possibly others)
1161
+ * Fixed: Adjusted Photocrati Resource Manager to be third-party friendly
1162
+ * Fixed: Fixed empty result set for displayed galleries selecting 'All' tags
1163
+ * Fixed: URL generation for imagebrowser pagination links
1164
+ * Fixed: Ensure that image meta is imported on creation
1165
+ * Fixed: Ensure that transients are removed when an external object cache is used
1166
+ * Fixed: Don't load pluggable.php. This will fix plugin conflicts
1167
+ * Fixed: In Insert Gallery interface, galleries created in one tab weren't showing in another
1168
+ * Fixed: Don't output frame events cookie for XML-RPC requests
1169
+
1170
+ = V2.0.27 - 09.18.2013 =
1171
+ * Fixed: Reduce performance impact of purging displayed gallery transients
1172
+
1173
+ = V2.0.25 - 09.18.2013 =
1174
+ * Changed: Reverting to the 2.0.21 codebase, due to major performance issues in 2.0.23 and 2.0.24
1175
+
1176
+ = V2.0.24 - 09.18.2013 =
1177
+ * WARNING: Broken release. Uses wp_clear_scheduled_hooks() to purge cron records
1178
+
1179
+ = V2.0.23 - 09.12.2013 =
1180
+ * WARNING: Broken release. Major bug creates redundant cron jobs
1181
+ * NEW: WP-Cron job to periodically clean-up displayed gallery transients
1182
+ * NEW: Added "excluded_container_ids" as parameter for ngg_images shortcode
1183
+ * Fixed: Lightbox effect is honoured by all display types
1184
+ * Fixed: Highslide displays images and photos from the correct displayed galleries
1185
+ * Fixed: Ensure that sub-albums display correctly when the word "album" is part of a slug
1186
+ * Fixed: Ensure that sub-albums display correctly when numerical slugs are used
1187
+ * Fixed: Related images heading only added when Related Images functionality is enabled
1188
+ * Fixed: PHP Warning about undefined index when viewing basic albums
1189
+ * Fixed: AJAX handling is third-party compatible
1190
+ * Fixed: Image date is no longer overwritten when an image is modified
1191
+ * Fixed: Fixed issue with displayed galleries using source='tags'
1192
+ * Fixed: Problem with transient cache not getting flushed properly from Other Options page
1193
+ * Fixed: Use correct gallery/transient ID when ajax pagination is used
1194
+
1195
+ = V2.0.21 - 09.09.2013 =
1196
+ * NEW: Multisite support
1197
+ * Changed: Default image quality set to 100 for generated images and photos
1198
+ * Changed: Removed dependence on simplehtmldom library
1199
+ * Fixed: Related images functionality works as it did in 1.9.x
1200
+ * Fixed: Don't compress inline JavaScript in post/page content
1201
+ * Fixed: Click-to-advance slideshow behavior for slideshows
1202
+ * Fixed: Security warnings from VaultPress
1203
+ * Fixed: View as Slideshow link works with AJAX pagination
1204
+ * Fixed: Broken links on WordPress gallery plugin Overview page
1205
+ * Fixed: WordPress gallery plugin Backup images option
1206
+ * Fixed: Stylesheet url generated correctly for Windows hosts
1207
+ * Fixed: Compatibility with NextGen Custom Fields plugin
1208
+ * Fixed: Compatibility with Adsense Explosion plugin
1209
+ * Fixed: Suppress wp_footer notices unless WP_DEBUG is set to TRUE
1210
+
1211
+ = V2.0.17 - 08.30.2013 =
1212
+ Fixed: Match legacy behaviour when changing gallery path, i.e. don't move files
1213
+
1214
+ = V2.0.14 - 08.27.2013 =
1215
+ * NEW: Added the ability to override thumbnail settings for NextGEN Basic Albums
1216
+ * NEW: Shortcode Manager API, which ensures that shortcodes are outputted as intended
1217
+ * Changed: Re-added the ability to select the original image size for widgets
1218
+ * Fixed: Ensure that stylesheet url returned is correct for Windows hosts
1219
+ * Fixed: Broken links and lightbox effects with AJAX pagination
1220
+ * Fixed: Try to ensure that third party plugins don't add content to our dynamic JS
1221
+ * Fixed: Improved reliability of iframely.js
1222
+ * Fixed: Ensure that urls are generated correctly in HTTPs environments
1223
+ * Fixed: Datamapper works correctly in environments where temporary tables aren't supported
1224
+ * Fixed: Fixed an issue with thickbox loading animation when home url differs from site url
1225
+
1226
+ = V2.0.11 - 08.19.2013 =
1227
+ * NEW: Added "run_ngg_resource_manager" hook to by-pass our resource manager
1228
+ * Changed: Removed "Reset & Uninstall" tab, for now
1229
+ * Fixed: Compatibility with W3 Total Cache. Please flush cache after updating.
1230
+ * Fixed: Conflicts with Photocrati Theme Galleries
1231
+ * Fixed: Blank Insert Gallery interface window
1232
+ * Fixed: Fixed ability to change Lightbox Effect settings
1233
+ * Fixed: Implemented techniques to ensure WP_Query variables aren't overwritten
1234
+ * Fixed: Enqueuing AJAX JS libraries twice in wp-admin
1235
+ * Fixed: Encoding issues
1236
+ * Fixed: PHP warnings caused by accessing unserialized data as array
1237
+ * Fixed: Fixed WordPress gallery plugin installer issues
1238
+
1239
+ = V2.0.7 - 08.09.2013 =
1240
+ * NEW: New resource manager that fixes many plugin and theme incompatibilities
1241
+ * NEW: Styles (custom stylesheets) should reside in wp-content/ngg_styles
1242
+ * NEW: Added option to "Other Options -> Misc" to control maximum images returned
1243
+ * Secured: Removed default connector for jQuery FileTree library
1244
+ * Changed: Updated the simplehtmldom library to version 1.5
1245
+ * Changed: jQuery is now enqueued at the beginning of every request
1246
+ * Fixed: Incompatibilities with BuddyPress
1247
+ * Fixed: Incompatibilities with Events+, bbPress, Custom Permalinks, and many other plugins
1248
+ * Fixed: Incompcatibilities with Member Access, AMember, Magic Fields, and More Fields
1249
+ * Fixed: Incompatibilities with Elegant Themes, Oxygen, Responsive, and many other themes
1250
+ * Fixed: Ensure that gallery images don't have a border by default
1251
+ * Fixed: Conflict between imagebrowser and album urls
1252
+ * Fixed: Reverted default gallerypath to wp-content/gallery/
1253
+ * Fixed: Upgrade-safe way of overriding Styles
1254
+ * Fixed: Generation of AJAX url is now based on slug
1255
+ * Fixed: Restore nggShowGallery and nggShowSlideshow as wrappers to new API
1256
+ * Fixed: Always use domain as specified by WordPress Site URL
1257
+ * Fixed: Use WordPress Home URL over Site URL when appropriate
1258
+ * Fixed: Numerous WordPress gallery plugin pagination issues
1259
+ * Fixed: Adjusted our forms to comply with WordPress Firewalls
1260
+ * Fixed: Correct use of select2 DOM selector for maximum compatibility
1261
+ * Fixed: Path and URL calculations for Windows and UNIX environments
1262
+ * Fixed: Ensure that pluggable.php is loaded at the start of every request
1263
+ * Fixed: Fancybox: adjust CSS for further box-sizing protection from themes
1264
+ * Fixed: Use PHP 5.2.1 compatible named pattern matching syntax
1265
+ * Fixed: Remove usage of __DIR__ constant not supported by PHP 5.2.x
1266
+ * Fixed: Removed dependency on mb_string PHP module
1267
+ * Fixed: Allow "No Lightbox" as an option for Lightbox Effects
1268
+ * Fixed: Warning: "Invalid CRT parameters detected" for Windows environments
1269
+
1270
+ = V2.0 - 07.30.2013 =
1271
+ * NEW: Improved user experience throughout the plugin, settings and usage.
1272
+ * NEW: Plupload queue uploader that allows for bulk and zip uploads within the same interface.
1273
+ * NEW: Complete redesign of the NextGEN options panel
1274
+ * NEW: Added new interface for adding galleries from pages and posts.
1275
+ * NEW: Galleries are now mobile friendly and responsive, which is most noticeable with a responsive theme.
1276
+ * NEW: Streamlined functionality for displaying galleries based on tags.
1277
+ * NEW: Architecture based on Pope Framework (http://bitbucket.org/photocrati/pope-framework)
1278
+ * NEW: New shortcode, “ngg_images”, and corresponding Insert Gallery interface
1279
+ * NEW: Galleries have now global and instance settings
1280
+ * NEW: Support for FastCGI environments
1281
+ * Changed: Replaces shortcodes with placeholder images, however still supports legacy shortcodes.
1282
+ * Changed: Introduced new Growl-like notifications for WordPress gallery plugin
1283
+ * Changed: The container and its images are centered for photo slideshows
1284
+ * Changed: NextGEN styles now override vs replace default styles
1285
+ * Changed: NextGEN legacy templates have been deprecated (but still function)
1286
+ * FIXED: The ability to use NextGEN image as a Featured Image.
1287
+ * FIXED: Misc PHP warnings, errors, in gallery plugin
1288
+
1289
+ = V1.9.13 - 06.11.2013 =
1290
+ * NEW: Slideshows are now centered to their content area
1291
+ * Secured: Ensure that only logged in users can upload images via plugin
1292
+ * Fixed: Import date is preserved are no longer Jan 1 1970
1293
+ * Fixed: Removed mention of upgrade.php, which no longer exists
1294
+
1295
+ = V1.9.12 - 02.15.2013 =
1296
+ * Fixed: jQuery Conflict Detection was trying to dequeue irremovable scripts
1297
+
1298
+ = V1.9.11 - 02.12.2013 =
1299
+ * NEW: Added the ability to detect JQuery conflicts on NGG Admin Pages and auto-resolve
1300
+ * Changed: Added "nggalbum" shortcode. Use this when Jetpack is installed.
1301
+ * Changed: Using natural sorting algorithm for alphanumeric values
1302
+ * Changed: Database schema is automatically updated when out-of-date
1303
+ * Fixed: Empty drop-down for "Page Link To"
1304
+ * Fixed: Alphabetical image sorting
1305
+ * Fixed: Compatibility between gallery plugin and Arjuna X theme
1306
+ * Fixed: “Creating default object from empty value” on album page
1307
+ * Fixed: Compatibility issues with PHP 5.4 on album page
1308
+ * Fixed: E_DEPRECATED warning when using get_userdatabylogin() function
1309
+ * Fixed: Removed many E_NOTICE errors
1310
+ * Fixed: Correct use of register_uninstall_hook across all PHP versions
1311
+
1312
+ = V1.9.10 - 12.18.2012 =
1313
+ * Fixed: XML-RPC error displayed when authenticating using WordPress 3.5
1314
+ * Fixed: Restored compatibility with NextGEN Gallery Export Plugin
1315
+ * Fixed: Removed some remaining references to database upgrade code
1316
+ * Fixed: Deleted galleries within an album are handed gracefully without warning messages
1317
+ * Fixed: Correct use of register_uninstall_hook
1318
+ * Fixed: CSS and usability issues with the TinyMCE window used to display galleries
1319
+ * Fixed: Inability to generate new image slugs
1320
+
1321
+ = V1.9.9 - 12.14.2012 =
1322
+ * NEW: JW ImageRotator v3.17 is now bundled with the plugin and used by default.
1323
+ * Changed: Removed database upgrade code for versions of NextGEN Gallery earlier than 1.9.3
1324
+ * Fixed: Compatibility with WordPress v3.5 ( wpdb->prepare() warnings )
1325
+ * Fixed: Sorting by filename now produces expected results using a natural sorting algorithm
1326
+
1327
+ = V1.9.8 - 12.05.2012 =
1328
+ * Secured: Removed bundled version of swfupload. See fix below for SCM information.
1329
+ * Changed: All transients created by NextGEN are flushed when the plugin is activated.
1330
+ * Fixed: Our primary SCM is conducted at http://bitbucket.org/photocrati/nextgen-gallery, but was not synchronizing correctly with the WordPress Plugin SVN Repository
1331
+ * Fixed: The transient adjustment fixes: http://wordpress.org/support/topic/plugin-nextgen-gallery-_transient_ngg_request-entry-in-wp_options
1332
+
1333
+ = V1.9.7 - 11.12.2012 =
1334
+ * Secured: Removed bundled version of swfupload; using WordPress-bundled version instead for WordPress 3.2 instances
1335
+ * Changed: Using JQuery UI for the image sorting interface (thanks Tomás Soler)
1336
+ * Bugfix: Image uploads work in WP 3.2 when using Safari
1337
+ * Bugfix: Adjusted TinyMCE window to use built-in JavaScript libraries
1338
+ * Bugfix: Removed Photocrati acquisition announcement from WordPress gallery plugin
1339
+ * Bugfix: Fixed incorrect usage of ImageJpeg() function
1340
+ * Bugfix: Switched from "template_redirect" to "wp_enqueue_script" hook to load scripts and styles
1341
+
1342
+ = V1.9.6 - 07.21.2012 =
1343
+ * Changed: Implemented workaround for bug found in WordPress SEO, resulting in no images being added to sitemap
1344
+ * Bugfix: Fixed an issue with users not being able to dismiss the "Photocrati Acquisition Notice"
1345
+ * Bugfix: Adjusted Javascript for activating social media pages to load on NextGEN Gallery pages only.
1346
+ * Bugfix: Fixed compatibility issue with Simple Facebook Connect
1347
+ * Bugfix: Using correct Facebook Page ID in Like button
1348
+
1349
+ = V1.9.5 - 07.18.2012 =
1350
+ * Changed: Branding changes following Photocrati acquisition (removed donation messages and updated links)
1351
+ * Secured: Use WordPress-bundled JavaScript libraries for swfobject and swfupload instead of bundling our own
1352
+ * Bugfix: Adjusted thickbox effect styling to ensure that the lightbox is always displayed in the foreground
1353
+ * Bugfix: Fixed compatibility issues with Contact Form 7 and other plugins by following WordPress Plugin conventions
1354
+ * Bugfix: Fixed network-wide gallery plugin activation in WordPress 3.4
1355
+ * Bugfix: Gallery plugin is no longer dependent on its folder name
1356
+
1357
+ = V1.9.3 - 26.02.2012 =
1358
+ * Bugfix : Ensure to set the slug for "all" albums
1359
+ * Bugfix : Updated german translation ( THX to Roger Hunziker )
1360
+ * Bugfix : Ensure error checking on IPTC array (THX to Kristian Edlund)
1361
+ * Bugfix : Handle IE8 cached images better in slideshow
1362
+ * Bugfix : Show album preview image if selected (THX to Kristian Edlund)
1363
+
1364
+ = V1.9.2 - 17.01.2012 =
1365
+ * NEW : Added more XMLRPC commands (THX to Vladimir Vinogradsky)
1366
+ * Changed : Rework Post-thumbnail function (THX to Kristian Edlund)
1367
+ * Bugfix : Check first for valid images on unzip (only Mac OS zip-files)
1368
+ * Bugfix : Increase z-index for twenty eleven theme
1369
+ * Bugfix : Support non latin chars in tagcloud
1370
+ * Bugfix : Allow other tinymce intance
1371
+ * Bugfix : Better gallery plugin upport for WPML translation
1372
+
1373
+ = V1.9.1 - 10.12.2011 =
1374
+ * Bugfix : Security hardness for untrusted filenames/meta data (THX to Brian St. Pierre)
1375
+ * Bugfix : Fixed security vulnerability (TXH to Jon Cave)
1376
+ * Bugfix : Load piclens script via other function
1377
+ * Bugfix : IE7 script fix for add gallery
1378
+ * Bugfix : IE7/IE8 width set correctly for edit album autocomplete field
1379
+
1380
+ = V1.9.0 - 27.11.2011 =
1381
+ * NEW : Keep images transparency for PNG and GIF format
1382
+ * NEW : Switch to Plupload, support now HTML5 Upload (only with WordPress 3.3)
1383
+ * NEW : Added client side resize feature (only with WordPress 3.3)
1384
+ * NEW : Support for gallery templates in album shortcodes [ album id=x template="name" gallery="templatename" ]
1385
+ * NEW : Added new hook ngg_delete_picture
1386
+ * Changed : Updated gallery plugin to jQuery Cycle Version 2.9995
1387
+ * Changed : Always cache the single pictures, remove option
1388
+ * Bugfix : Couldn't use bulk operation for search results
1389
+ * Bugfix : Bugfix for Edit thumbnails under IE 8 + 9
1390
+ * Bugfix : Allow empty altext in ngg.editImage
1391
+ * Bugfix : Various PHP notice fixes in gallery plugin
1392
+ * Bugfix : Resize fix for Shutter effect and mobile Browser
1393
+ * Bugfix : FTP Import missing slug field into database
1394
+ * Bugfix : Check also EXIF field "DateTimeOriginal" for timestamp
1395
+
1396
+ = V1.8.4 - 26.10.2011 =
1397
+ * Bugfix : Fixed security vulnerability (TXH to Alain Schneider)
1398
+
1399
+ = V1.8.3 - 07.08.2011 =
1400
+ * Changed : Support for simple custom permalink structures (i.e. /%category%/%postname%/)
1401
+ * Bugfix : Sub-Albums in Albums didn't create the correct link
1402
+ * Bugfix : AJAX Pagination didn't work anymore
1403
+ * Bugfix : Adding index.php to home_url()
1404
+ * Bugfix : Preview picture lost on backend gallery page 2 or higher
1405
+
1406
+ = V1.8.2 - 12.07.2011 =
1407
+ * Bugfix : Set pagination variables for search result, otherwise update failed
1408
+ * Bugfix : Update failed for paged galleries since WordPress 3.2
1409
+
1410
+ = V1.8.1 - 18.06.2011 =
1411
+ * Bugfix : Special case for pagination, instead of showing page-1, we show the clean url
1412
+ * Bugfix : Various PHP notice fixes in gallery plugin
1413
+ * Bugfix : Typo in rewrite rules
1414
+ * Bugfix : Flush rewrite rules during upgrade later
1415
+
1416
+ = V1.8.0 - 12.06.2011 =
1417
+ * NEW : Full rework of permalink url structure
1418
+ * NEW : Adding Google Sitemaps for Images (require WordPress SEO plugin by YOAST )
1419
+ * NEW : Support for WPML ( WordPress Multilingual Plugin )
1420
+ * NEW : Adding support for arrow key in shutter effect (THX to Flyvans)
1421
+ * NEW : Adding sort operation for galleries overview page
1422
+ * Changed : Updated pagination to new WP3.1 style
1423
+ * Bugfix : Create unique slug in a better way
1424
+ * Bugfix : Rework screen options filter for gallery and image table
1425
+ * Bugfix : Empty values in XMLRPC update calls are ignored
1426
+ * Bugfix : Create gallery failed when safe-mode on
1427
+ * Bugfix : Permalink didn't work in combination with album & imagebrowser
1428
+
1429
+ = V1.7.4 - 15.02.2011 =
1430
+ * Bugfix : Disallow direct call of ajax file to avoid path disclosure (THX to High-Tech Bridge SA)
1431
+ * Bugfix : Rework jQuery Cycle slideshow for IE compat reason (THX to Justin Dickenson)
1432
+ * Bugfix : Resize only larger images in slideshow
1433
+ * Bugfix : Improved image format detection in gd.thumbnail class (THX to Kupar.b)
1434
+
1435
+ = V1.7.3 - 20.01.2011 =
1436
+ * NEW : Introduce plugin health check for conflicts with other plugins/themes
1437
+ * NEW : Adding new XMLRPC method ngg.deleteImage
1438
+ * NEW : Adding new XMLRPC method ngg.editImage
1439
+ * Changed : Rework register script for autocomplete feature
1440
+ * Bugfix : Bugfix for Multisite setup and flash upload
1441
+ * Bugfix : WP3.1 compat issue, show site admin page only on Multisite installation
1442
+
1443
+ = V1.7.2 - 13.12.2010 =
1444
+ * Bugfix : Adding images to database require slug
1445
+
1446
+ = V1.7.1 - 13.12.2010 =
1447
+ * Changed : Disable upgrade for PHP4 user
1448
+ * Changed : Disable colorpicker for WordPress gallery plugin option page
1449
+ * Bugfix : Compat fix for upgrade
1450
+
1451
+ = V1.7.0 - 11.12.2010 =
1452
+ * NEW : Publish a new post direct from the gallery admin page
1453
+ * NEW : Added filter hook 'ngg_get_image_metadata' to add more exif/iptc information
1454
+ * NEW : Adding Autocomplete field to TinyMCE Popup and Album page
1455
+ * NEW : More methods for XMLRPC interface
1456
+ * Changed : New hooks for gallery table (THX to Alexander Schneider)
1457
+ * Changed : Introduce jQuery dialog as new UI element for WordPress gallery plugin
1458
+ * Changed : Call TinyMCE window via admin-ajax
1459
+ * Bugfix : Better support for SSL blogs
1460
+ * Bugfix : Install/Upgrade failed when table prefix contain captial letters
1461
+ * Bugfix : Fix validation issues in Media-RSS
1462
+ * Bugfix : Empty tags in XMP Meta causes PHP error
1463
+ * Bugfix : Rework load mechanism for slideshow
1464
+ * Bugfix : Copy meta data when image is copied
1465
+ * Bugfix : Icon Support for Ozh' Admin Drop Down Menu
1466
+ * Bugfix : Use correct sort order in slideshow
1467
+
1468
+ = V1.6.2 - 19.09.2010 =
1469
+ * NEW : Added constant NGG_SKIP_LOAD_SCRIPTS to avoid script load
1470
+ * Bugfix : Load Tags library with core files
1471
+ * Bugfix : Slideshow script failed in IE7, load script now in header
1472
+ * Bugfix : Load slideshow widget always
1473
+ * Changed : New admin notice for database upgrade
1474
+ * Changed : Rework crop feature of WordPress gallery plugin for featured images
1475
+ * Changed : Use site_url() instead get_option ('siteurl'), required for SSL support
1476
+
1477
+ = V1.6.1 - 08.09.2010 =
1478
+ * Bugfix : Script load of swfobject.js failed
1479
+ * Bugfix : Show sideshow also with 1 or 2 images
1480
+ * Bugfix : Rework null byte check in zip upload
1481
+
1482
+ = V1.6.0 - 07.09.2010 =
1483
+ * NEW : Wordpress 3.0 Network (Multi-Site) support
1484
+ * NEW : Integrate jQuery Cycle as NON-Flash slideshow
1485
+ * NEW : Adding jQuery File Tree for import folder (THX to Sergey Pasyuk )
1486
+ * NEW : Added action hook 'ngg_show_imagebrowser_first' on custom request
1487
+ * NEW : Added filter hook 'ngg_slideshow_size' to resize sildeshow for mobile browser plugins
1488
+ * Changed : Reorder tabs for upload
1489
+ * Changed : New menu icon and screen icon (THX to Ben Dunkle)
1490
+ * Changed : Load frontend libs always
1491
+ * Changed : Rework of WordPress gallery plugin overview page
1492
+ * Bugfix : Security bugfix for Zip-Upload (THX to Dominic Szablewski)
1493
+ * Bugfix : Allow JPG, PNG, GIF extension
1494
+ * Bugfix : New German translation (THX to Martin Kramarz)
1495
+ * Bugfix : Copy/Move also backup file
1496
+ * Bugfix : Calculate correct ratio for fix thumbnail size (THX to Alekz Keck)
1497
+
1498
+ = V1.5.5 - 14.06.2010 =
1499
+ * Bugfix : Compat issue for post thumbnails with WP2.9
1500
+ * NEW : Adding more hooks for custom fields plugin
1501
+
1502
+ = V1.5.4 - 14.06.2010 =
1503
+ * Bugfix : No resize of smaller images or photos
1504
+ * Bugfix : Compat issues for Post Thumbnails under WP3.0
1505
+ * Bugfix : Esc_URL in Media RSS
1506
+
1507
+ = V1.5.3 - 11.04.2010 =
1508
+ * New : Adding pagination to footer
1509
+ * Changed : Prepare new filter to replace slideshow
1510
+ * Bugfix : Remove non-breaking space from navigation
1511
+ * Bugfix : Pagination of galleries
1512
+ * Bugfix : Fixed brackets position for old shortcode query
1513
+ * Bugfix : Slideshow option 'Show next image on click" has wrong default value
1514
+
1515
+ = V1.5.2 - 25.03.2010 =
1516
+ * Bugfix : XSS security vulnerability (THX to Core Security Advisories Team , Pedro Varangot)
1517
+ * Bugfix : Missing $wpdb in shortcodes.php
1518
+
1519
+ = V1.5.1 - 23.03.2010 =
1520
+ * Bugfix : PHP4 compat issue for Add gallery & options page
1521
+ * Bugfix : Gallery widget can now have a empty title
1522
+ * Bugfix : Adding correct stripslash for gallery title
1523
+
1524
+ = V1.5.0 - 18.03.2010 =
1525
+ * NEW : Support for Post thumbnail feature
1526
+ * NEW : Backup and Recover function for images (THX to Simone Fumagalli)
1527
+ * NEW : Resize images after upload (THX to Simone Fumagalli)
1528
+ * NEW : Added a JSON class for fetching galleries in a RESTful way (see xml/json.php)
1529
+ * NEW : Adding various new capabilities for user roles
1530
+ * NEW : Auto downloader for translation file
1531
+ * Changed : Rename query var from slideshow to callback for compat reason with other plugin
1532
+ * Changed : Convert WordPress gallery plugin widget function to new WP structure
1533
+ * Changed : Include lookup for tags into the backend search
1534
+ * Changed : Restructure addgallery and settings page to enable custom tabs
1535
+ * Bugfix : Select album preview from gallery preview pics instead random list
1536
+ * Bugfix : Keep fix dimension in edit thumbnail operation
1537
+ * Bugfix : Import meta data didn't work correct for existing images
1538
+ * Bugfix : Fix onload bug for Chrome 4 in Shutter script
1539
+ * Bugfix : Remove various PHP notices for a better world
1540
+ * Removed : Canonical link is now part of Wordpress 2.9
1541
+
1542
+ = V1.4.3 - 16.11.2009 =
1543
+ * Bugfix : Urlencode XML file path for sildeshow
1544
+
1545
+ = V1.4.2 - 16.11.2009 =
1546
+ * Changed : Load sildeshow XML not longer via relative path
1547
+ * Bugfix : No imagebrowser in carousel mode
1548
+ * Bugfix : JS Effect navigation based on wrong array structure
1549
+ * Bugfix : Remove whitespaces from meta import
1550
+ * Bugfix : Capability check for upgrade notice
1551
+ * Removed : Hide "more settings" for now, causes problems with IE and jQuery UI tabs
1552
+
1553
+ = V1.4.1 - 10.11.2009 =
1554
+ * Bugfix : Capabilites could not be saved
1555
+ * Bugfix : Ajax pagination option not saved
1556
+ * Bugfix : echo nggSlideshowWidget() for compat reason
1557
+
1558
+ = V1.4.0 - 08.11.2009 =
1559
+ * NEW : Automatic rotate images during upload or via manage gallery page (THX to Simone Fumagalli)
1560
+ * NEW : Include Bulkupdate for gallery overview, require PHP 5.2
1561
+ * NEW : XMLRPC support with 4 new methods : see xmlrpc.php for more information
1562
+ * NEW : Recent and random images can be taken from a specific gallery using the id=x parameter in the shortcode (THX to Prollius)
1563
+ * NEW : Recent images can be recent by exif date (instead of database id) by using the mode=recentdate parameter in the shortcode (THX to Prollius)
1564
+ * NEW : Introduce the WP_Object_cache and meta_data
1565
+ * NEW : Various new hooks and filters
1566
+ * Added : Better support for role manager plugin (THX to Mattias Buelens)
1567
+ * Added : New option to add hidden images. Needed to show all images in a modal window (Thickbox, Lightbox et.)
1568
+ * Added : New link parameter for the singlepic shortcode : [singlepic id=x w=x h=x link="http://google.com"]
1569
+ * Added : New template gallery-carousel
1570
+ * Added : New id parameter for recent and random shortcodes : [random max="7" template="filename" id="2"] takes only pictures from the gallery with id=2
1571
+ * Added : New mode parameter for recent shortcode : [recent max="7" template="filename" id="3" mode="date" /] where mode can be one of (id, date, sort). Recent pictures are delivered by addition to database (id), exif date (date) or user sort order (sort).
1572
+ * Added : Enable/Disable Ajax navigation via settings
1573
+ * Added : New filter hook 'ngg_render_template' to render templates with a other plugin
1574
+ * Changed : Added option to link an album with a page id
1575
+ * Changed : Support templates for child themes, use STYLESHEETPATH instead TEMPLATEPATH (THX to Prollius)
1576
+ * Changed : Rework of WordPress gallery plugin Media RSS Widget
1577
+ * Bugfix : Check capability to create a new page
1578
+ * Bugfix : Fix double call of filter name , changed to ngg_picturelist_object (THX to Prollius)
1579
+ * Bugfix : Check for a deleted gallery in a album
1580
+
1581
+ = V1.3.6 - 20.09.2009 =
1582
+ * Changed : Just change the feed link
1583
+
1584
+ = V1.3.5 - 17.07.2009 =
1585
+ * Bugfix : Fixed XSS issue for Page title
1586
+
1587
+ = V1.3.4 - 07.07.2009 =
1588
+ * Added : New filter ngg_gallery_object and ngg_image_object
1589
+ * Bugfix : Fix double rendering of a gallery if two album shortcodes are used
1590
+ * Bugfix : Fix for custom field ngg_gal_sort
1591
+ * Bugfix : Changed capability check for upload
1592
+ * Bugfix : Check for correct version OR memory limit
1593
+
1594
+ = V1.3.3 - 11.06.2009 =
1595
+ * Changed : Load Thickbox images via wp_footer()
1596
+ * Bugfix : Widget setting could not be saved
1597
+
1598
+ = V1.3.2 - 10.06.2009 =
1599
+ * Changed : Resize maximum to 1280 x 1280 with nggshow (THX to onezero)
1600
+ * Bugfix : Bugfix for Multifile upload
1601
+ * Bugfix : Bugfix for sortorder under jQuery 1.3
1602
+ * Bugfix : Workaround for more albums per page, need more rework
1603
+ * Bugfix : AJAX reload didn't work if slideshow is shown by default
1604
+ * Bugfix : Redirect links didn't work if permalinks are deactivates
1605
+ * Bugfix : Add new gallery in manage-overview didn't use defaultpath
1606
+
1607
+ = V1.3.1 - 07.06.2009 =
1608
+ * Bugfix : Fixed ZIP upload, wrong variable used
1609
+ * Bugfix : Check for array before foreach in album missing
1610
+
1611
+ = V1.3.0 - 07.06.2009 =
1612
+ * NEW : Subalbum support for WordPress gallery plugin
1613
+ * NEW : Search for images and photos in the admin tab
1614
+ * NEW : Add new gallery also in manage tab
1615
+ * NEW : AJAX support for Imagebrowser and gallery navigation (THX to Anty)
1616
+ * NEW : Added zip upload via URL (THX to Juan Jose Galvez)
1617
+ * Added : jQuery Multiple File Upload Plugin v1.44
1618
+ * Added : SWFUpload V2.2.0
1619
+ * Changed : Remove extension for Alttext during first import
1620
+ * Changed : Meta tag added via wp_head hook (THX to Viper)
1621
+ * Bugfix : Correct various PHP notice messages
1622
+ * Bugfix : Typo fix in custom fields for ngg_gal_ImageBrowser
1623
+ * Bugfix : Avoid upload of images and photos in gallery without correct capability
1624
+
1625
+ = V1.2.1 - 22.03.2009 =
1626
+ * NEW : Support for IE8 Web Slices in widgets
1627
+ * NEW : Add filter ngg_image_object
1628
+ * Changed : Descending order in add gallery menu
1629
+ * Bugfix : Exclude option didn't work for multi pages
1630
+ * Bugfix : Check for correct capability in manage gallery
1631
+
1632
+ = V1.2.0 - 09.03.2009 =
1633
+ * NEW : Support for image tag cloud with shortcode [tagcloud]
1634
+ * NEW : Adding shortcode [recent max="7" template="filename" /] & [random max="7" template="filename" /] to show the most recent/random pictures (THX to Bernhard)
1635
+ * NEW : Crop photo thumbnails manually (THX to Simone Fumagalli)
1636
+ * NEW : Support for i18n with polyglot or qtrans plugin (THX to Boris Glumpler)
1637
+ * NEW : Canonical meta link support
1638
+ * Added : SWFUpload V2.2.0 B5
1639
+ * Added : New memory limit check in upload screen
1640
+ * Bugfix : Language typo fixes for WordPress gallery plugin
1641
+ * Bugfix : Admin Pagination fix
1642
+ * Bugfix : Typo fix in WordPress gallery plugin widgets
1643
+ * Bugfix : Init column script after document is ready
1644
+ * Bugfix : htmlspecialchars() instead htmlentities() for links in the a href title description
1645
+ * Bugfix : Upgrade routine didn't add sortorder to correct table (THX to Uwe)
1646
+ * Bugfix : Correct shotcode in media upload tab
1647
+
1648
+ = V1.1.0 - 26.01.2009 =
1649
+ * NEW : Pagination for album page via custom fields ('ngg_paged_Galleries')
1650
+ * NEW : Support for fixed number of columns inside the gallery
1651
+ * NEW : Added pagination for galleries and images in admin section
1652
+ * NEW : New action hook after image is added to database, called 'ngg_added_new_image'
1653
+ * NEW : New template for caption below images, called via [nggallery id=x template=caption]
1654
+ * Added : SWFUpload V2.2.0 B4
1655
+ * Changed : Rework of Manage image tables
1656
+ * Changed : Move imagerotator.swf to wp-content/uploads
1657
+ * Changed : Added a URL field to setup the path to the Imagerotator
1658
+ * Changed : Add additional parameter to gallery object
1659
+ * Changed : Load donators list external
1660
+ * Bugfix : Style fixes for tables in IE7
1661
+ * Bugfix : All albums code couldn't use the slideshow, query is empty for 0
1662
+ * Bugfix : Htmlentities() for links in the a href title description
1663
+ * Bugfix : Clean up mode for singlepic
1664
+ * Bugfix : Typo in WordPress gallery plugin widget settings
1665
+
1666
+ = V1.0.2 - 19.12.2008 =
1667
+ * Added : Option to enable/disable the MediaRSS Feed
1668
+ * Added : For flash under FF3/WIN we should use outline: none;
1669
+ * Added : Use sort order also for Media RSS
1670
+ * Changed : Descending order for TinyMCE Editor
1671
+ * Changed : Added screencolor flashvar as bgcolor for the flash slideshow
1672
+ * Changed : Remove link to gallery in sidebar widget
1673
+ * Bugfix : Check for empty gallery title and show name instead
1674
+ * Bugfix : Album id=all / Album id=0 didn't show content
1675
+ * Bugfix : Check for a empty description and alttext
1676
+ * Bugfix : Remove HTML tags from slideshow
1677
+ * Bugfix : Load SWFobject always when the imagerotator exist
1678
+ * Bugfix : Zip-Upload in existing gallery failed
1679
+ * Bugifx : Typo in functions.php (THX to David Horat)
1680
+
1681
+ = V1.0.1 - 11.12.2008 =
1682
+ * Bugfix : Change upgrade routine, import_date_time could cause a memory problem
1683
+ * Bugfix : Help pages will not show up in non-english enviroment
1684
+ * Bugfix : Show gallery name if title is empty
1685
+
1686
+ = V1.0.0 - 11.12.2008 =
1687
+ * NEW : Adding some rewrite rules for the Blog title for a better SEO (Will be continued...)
1688
+ * NEW : Added ImageMagick support (currently a bit experimental) (THX to Frederic de Ranter)
1689
+ * NEW : Automatic unistall via register_uninstall_hook()
1690
+ * NEW : Added a presort option to sort images and photos
1691
+ * NEW : Look for a nggallery.css in the theme folder
1692
+ * NEW : Added Date/Time field to database and import it from EXIF, new sort option
1693
+ * NEW : Multi Widgets to show links to Media RSS feeds (THX to Vincent Prat)
1694
+ * NEW : PicLens support for galleries (THX to Vincent Prat)
1695
+ * NEW : Copy/Move images and photos between galleries (THX to Vincent Prat)
1696
+ * NEW : Media RSS feeds (either for galleries, albums or global) (THX to Vincent Prat)
1697
+ * NEW : Image and photo tag management (THX to Vincent Prat)
1698
+ * NEW : Convert all WordPress gallery plugin shortcodes to WP shortcodes API
1699
+ * NEW : AJAX based thumbnail generator
1700
+ * NEW : Create output via template files, more flexible and support for multiple templates
1701
+ * NEW : Extended role system. Each gallery has now a author
1702
+ * NEW : [thumb id="4,5,12,..."] shortcode. You can now insert thumbnails for one or more images (that are not necessarly inside the same gallery).
1703
+ * Changed : Add swfupload 2.2.0. Support for Adobe Flash 10 upload
1704
+ * Changed : Update all Admin pages for Wordpress 2.7 Admin UI
1705
+ * Changed : New icon for TinyMCE and WP2.7 Menue from http://www.pinvoke.com/
1706
+ * Changed : Move update message to admin.php
1707
+ * Changed : Widgets are now core and doesn't need to be activate, rework as Multi Widgets
1708
+ * Changed : Improved the gallery management page.
1709
+ * Changed : Rename the filter 'ngg_create_gallery_thumbcode' to 'ngg_get_thumbcode'.
1710
+ * Changed : Convert tags to WP-Taxonomy tables, no more need for ngg_tags, ngg_pic2tags
1711
+ * Changed : Arrange manage fields in a new way
1712
+ * Changed : Support now SSL
1713
+ * Changed : Use JQuery UI instead of interface lib
1714
+ * Changed : Updated to swfobject 2.1
1715
+ * Changed : Rework of database queries and new central nggdb class
1716
+ * Bugfix : Changed CSS for singlepic padding to margin
1717
+ * Bugfix : Check for zero in Exif Focal Length
1718
+ * Bugfix : Round instead inval for square thumbnails
1719
+ * Removed : Do not longer check for myGallery folders
1720
+ * Removed : Use now PclZip from WP Core
1721
+ * Removed : Wordpress 2.1 - 2.3 files deleted
1722
+
1723
+ = V0.99 - 27.09.2008 =
1724
+ * Changed : Included swfobject version 2.1
1725
+ * Bugfix : Recognize the zip better
1726
+ * Bugfix : Limit the length of the title in the media-upload
1727
+ * Bugfix : Round instead inval for square thumbnails
1728
+
1729
+ = V0.98 - 15.07.2008 =
1730
+ * Bugfix : Removed all whitespaces at EOF
1731
+
1732
+ = V0.97 - 10.07.2008 =
1733
+ * Changed : Get new path contstant from WP2.6
1734
+ * Changed : Minor WordPress gallery plugin updates for WP2.6
1735
+ * Changed : Added new filters (THX to Vincent Prat)
1736
+ * Removed : Revert singlepic wrapper, breaks validation
1737
+
1738
+ = V0.96 - 18.05.2008 =
1739
+ * Changed : Use postbox for gallery settings
1740
+ * Added : New filter function to add custom columns
1741
+ * Bugfix : Fixed width for Thickbox in Manage gallery
1742
+ * Bugfix : Fixed width for media upload select box
1743
+ * Bugfix : Remove P tag in singlepic regex
1744
+ * Bugfix : Correct format of shutter speed
1745
+ * Bugfix : Album name in Short code not useable
1746
+
1747
+ = V0.95 - 25.04.2008 =
1748
+ * Bugfix : Correction in media-upload to fit with Wordpress 2.5.1
1749
+ * Bugfix : Attribute_escape all objects in media-upload
1750
+ * Bugfix : Correct sortorder for albums
1751
+ * Bugfix : Typo correction (THX to Momo-I)
1752
+
1753
+ = V0.94 - 20.04.2008 =
1754
+ * Added : New filter option ngg_create_gallery_link
1755
+ * Changed : Reduce amount of DB queries in albums (Big THX to Alexandr Kindras)
1756
+ * Changed : Revert wpautop priority change (issues with other plugins)
1757
+
1758
+ = V0.93 - 12.04.2008 =
1759
+ * Added : Select Full-Size or Singlepic in Media Upload
1760
+ * Added : Check for minimum 8 MB Memory
1761
+ * Changed : Priority from wpautop must be before gallery
1762
+ * Bugfix : Added Screencolor to WordPress gallery plugin Widgets
1763
+ * Bugfix : Clean CSS class in setup.php
1764
+ * Bugfix : Change PHP short tag (Thx to Archedition)
1765
+ * Bugfix : Remove tab.png from CSS (Thx to Frisco)
1766
+ * Bugfix : Remove newline and encode quotes in Media-Upload (THX to Trip Mellinger)
1767
+
1768
+ = V0.92 - 30.03.2008 =
1769
+ * Changed : Higher priority for filter in WP2.5 final
1770
+ * Changed : Do not increase memory_limit with ini_set
1771
+ * Added : Read EXIF field ImageDescription
1772
+
1773
+ = V0.91 - 24.03.2008 =
1774
+ * Changed : Resample mode back to 3
1775
+ * Changed : Add DIV "ngg-singlepic-wrapper" for SingelPic (THX to Travel-Junkie)
1776
+ * Changed : Increase Tweakfactor for Memory Check
1777
+ * Bugfix : Use admin.css only on NextGEN pages (THX tp Oliver)
1778
+ * Bugfix : Updates WordPress gallery plugin widgets (V1.21) for ImageRotator 3.15
1779
+ * Bugfix : Change order of rewrite rules for WP 2.5
1780
+ * Bugfix : Include Dashboard CSS also for page "nextgen-gallery"
1781
+
1782
+ = V0.90 - 18.03.2008 =
1783
+ * NEW : Sort order for images and photos
1784
+ * NEW : Updated WordPress gallery plugin style for Wp 2.5
1785
+ * NEW : Media upload tab integration for WP 2.5
1786
+ * Added : Change wp shortcode filter
1787
+ * Added : TinyMCE V3 Button for WordPress 2.5
1788
+ * Added : Singlepic center class
1789
+ * Changed : New default parameter for ImageRotator 3.15
1790
+ * Changed : By default enable metadata import
1791
+ * Changed : Moved disable/enable flash setting to add gallery
1792
+ * Changed : wpdb->escape gallerytag in nggfunctions
1793
+ * Changed : Sort files after scan folder
1794
+ * Changed : Check for filename during upload
1795
+ * Changed : Remove jQuery plugin for navigation
1796
+ * Changed : Remove myGallery import
1797
+ * Changed : Resample mode default set to 5, causes problems at PHP 4.4.8 /PHP 5.2.4
1798
+ * Bugfix : nggextractXML missing stripslashes
1799
+ * Bugfix : P tags not closed in manage.php
1800
+ * Bugfix : Remove " from singlepic class
1801
+ * Bugfix : Rewrite rule for ImageBrowser added
1802
+
1803
+ = V0.83 - 14.02.2008 =
1804
+ * Changed : New Interfaces.js from WP Core 2.5, for sortable bug under IE7
1805
+ * Changed : Update WordPress gallery plugin to jQuery V1.2.2, deregister older version from WP
1806
+ * Changed : Add ini_set 128MB for memory-limit
1807
+ * Bugfix : SWFUpload Cookie Post_Params are overwritten , no upload possible
1808
+ * Bugfix : WPMU options are not saved after installation
1809
+ * Bugfix : Remove Flush rewrite rules during install
1810
+
1811
+ = V0.82 - 09.02.2008 =
1812
+ * Bugfix : add_filter (searchnggallerytags) not proper included for some other plugins
1813
+
1814
+ = V0.81 - 04.02.2008 =
1815
+ * Changed : Use stristr first to reduce CPU cycles (THX to Alakhnor)
1816
+ * Changed : Flush Rewrites rules after option update
1817
+ * Changed : Rework for folder check under Safe-Mode
1818
+ * Bugfix : Check for array in get_option() (THX to Alessandro)
1819
+ * Bugfix : Add Cookie to SWFUpload, show Error code included
1820
+ * Bugfix : galShowOrder = Sildeshow at first didn't work
1821
+ * Bugfix : Remove reference from ngg_getOnlyImages
1822
+
1823
+ = V0.80 - 02.02.2008 =
1824
+ * NEW : SWFUpload integrated : Show upload progress and select multiple files in the file browser dialog.
1825
+ * NEW : Progress bar for resize, watermark and thumbnail operation
1826
+ * NEW : Import Meta data from images and photos
1827
+ * NEW : Show Meta data information for photos
1828
+ * NEW : Cache option for SinglePic
1829
+ * NEW : Permalink support for WordPress gallery plugin
1830
+ * NEW : Custom fields support - Change the settings for each post/page
1831
+ * Changed : Up to 10 Widgets, exclude galleries from random/recent images.
1832
+ * Changed : Refactor permission check for Safe-Mode Check and mkdir/chmod
1833
+ * Changed : Admin CSS in new folder/file for better structure
1834
+ * Changed : Clean up folder structure of WordPress gallery plugin
1835
+ * Changed : Clean up code in manage.php, functions.php
1836
+ * Changed : Moved several functions into nggAdmin Class (functions.php)
1837
+ * Changed : Updated WordPress gallery plugin to jQuery V1.1.4 (v1.2.1 causes problems with interface.js)
1838
+ * Changed : Hide used galleries in album admin page
1839
+ * Changed : Remove float in singlepic code and added class ngg-left , ngg-right (THX to Nathan Sylvain)
1840
+ * Changed : Edit style setting (added new class .desc , THX to Sebastian)
1841
+ * Changed : Check for galleryfolder instead name (THX to Luke Poland)
1842
+ * Changed : Delete images per default
1843
+ * Changed : Change CSS (ngg-album-compact) , remove width & height setting from code
1844
+ * Bugfix : Fixed static front page problem
1845
+ * Bugfix : Missing stripslashes & html_entity_decode
1846
+ * Bugfix : Change Album CSS (THX to Thomas-DK)
1847
+ * Bugfix : Watermark for GIF not correct supported
1848
+ * Bugfix : Missing wp_nonce at setup page
1849
+ * Bugfix : Add DIV in Slideshow link (for Safari & Opera)
1850
+ * Added : Screencolor flashvar for JW Image Rotator 3.13 or higher
1851
+ * Added : Set WP-CHARSET / COLLATE during installation
1852
+ * Added : Updated to Pclzip.lib.php v2.6
1853
+ * Added : CSS ID field for gallery & images
1854
+ * WPMU : New site admin page (wpmu.php)
1855
+ * WPMU : Integrated quota check
1856
+ * WPMU : No update check
1857
+ * WPMU : Remove edit style (THX to Kristin)
1858
+ * WPMU : Remove uninstall button
1859
+ * WPMU : Remove server settings
1860
+ * WPMU : Gallery path set to blog.dir
1861
+ * Added : Support for WPMU
1862
+
1863
+ = V0.74 - 01.12.2007 =
1864
+ * NEW : Added meta reader class, first step to integrated meta data import
1865
+
1866
+ = V0.73 - 20.10.2007 =
1867
+ * Added : Support for Shutter Reloaded
1868
+ * Changed : Updated WordPress gallery plugin to jQuery Tabs 2.7.4
1869
+ * Changed : Remove $_SERVER['REQUEST_URI'] for IIS compatibility
1870
+ * Bugfix : Option Sildeshow didn't jump to overview
1871
+
1872
+ = V0.72 - 13.09.2007 =
1873
+ * Added : Missing overflow:hidden in ngg-album.css
1874
+ * Added : New experimental stylesheet hovereffect.css
1875
+ * Changed : Better check for memory limit in zip-files
1876
+ * Bugfix : Missing stripslashes for alttext (THX to Lawrence)
1877
+ * Bugfix : Navigation didn't highlight page 1 (THX to Brot)
1878
+ * Bugfix : Albums automatic minimize if more than 4 galleries
1879
+ * Bugfix : Missing check_admin_referer in style (THX again to Christopher)
1880
+
1881
+ = V0.71 - 07.09.2007 =
1882
+ * Added : Add defer="defer" to Slideshow to avoid IE crash (THX to Simbo)
1883
+ * Bugfix : Bugfix for slideshow to show all pictures
1884
+ * Bugfix : Wrong check_admin_referer in albums (THX to Christopher)
1885
+ * Bugfix : No exclude check in counter and widgets (THX to Christopher)
1886
+ * Bugfix : Check for existing role (THX to Lost in Network)
1887
+ * Bugfix : Label in roles are wrong (THX to Joern)
1888
+
1889
+ = V0.70 - 06.09.2007 =
1890
+ * NEW : Add role manager page and capabilities to WordPress gallery plugin
1891
+ * NEW : Show gallery with [tags=list of tags]
1892
+ * NEW : Show album with [albumtags=list of tags]
1893
+ * NEW : Tag system for all images
1894
+ * NEW : Option for append related images
1895
+ * NEW : Option to show description below thumbnail
1896
+ * NEW : Option to show ImageBrowser instead JS effect
1897
+ * Added : Add Full size link to thickbox
1898
+ * Added : Check for page/postid in tag processing
1899
+ * Added : Sildeshow widget can now contain all images
1900
+ * Added : Minimize/Maximize option for albums
1901
+ * Added : Deregister jQuery V1.1.2 for WP2.2 (to use V1.1.3.1)
1902
+ * Added : Integrate wp_nonce_field at all admin pages
1903
+ * Changed : Update WordPress gallery plugin to Thickbox 3.1 + mods
1904
+ * Changed : Moved "clear:both" into class "ngg-clear" (THX to Gero)
1905
+ * Changed : Switched from jQuery Interface to jQuery Tabs from Klaus Hartl
1906
+ * Remove : Remove option for singlepic link
1907
+ * Remove : Remove options for imagebrowser
1908
+ * Bugfix : Most Recent image in Widget are wrong
1909
+ * Bugfix : More XHTML valid , htmlspecialchars() after add_query_arg()
1910
+ * Bugfix : Sanitize file name before upload
1911
+ * Bugfix : Sanitize folder name (THX to Tom Fowler)
1912
+ * Bugfix : Show title/alt in jQuery plugin (THX to Gregory Green)
1913
+ * Bugfix : i18n support for Gallery tab
1914
+ * Bugfix : Reduce memory-needs for plugin
1915
+ * Bugfix : Typo/spelling correction in WordPress gallery plugin
1916
+ * Bugfix : Removed myGallery author from contribute list
1917
+
1918
+ = V0.64 - 31.07.2007 =
1919
+ * Bugfix : Remove arrows in image browser text
1920
+ * Bugfix : Include nggadmintab.php with dirname
1921
+ * Bugfix : Zip-Upload under Mac > look for basename
1922
+
1923
+ = V0.63 - 10.07.2007 =
1924
+ * NEW : You can now upload a zip file into a existing gallery
1925
+ * Added : Remove subfolder in Zip-files
1926
+ * Added : Show required memory for thumbnail creation
1927
+ * Added : Updated to jQuery.multifile 1.22
1928
+ * Added : Install-Upgrade for WordPress 2.3
1929
+ * Bugfix : Supress unlink error message for thumbs
1930
+ * Bugfix : Support upload of zip files from MAC
1931
+ * Bugfix : Add Stripslash for image description
1932
+ * Bugfix : Use for Singlepic not rel="Gallery name"
1933
+ * Bugfix : Moved RSS/Snoopy includes into function
1934
+
1935
+ = V0.62 - 06.07.2007 =
1936
+ * NEW : Import for myGallery
1937
+ * Added : Updated WordPress gallery plugin to jQuery 1.1.3.1
1938
+ * Bugfix : Check for memory_limit setting, otherwise pass the test
1939
+ * Bugfix : Thumbcode not insert for nggDisplayRandomImages and nggDisplayRecentImages
1940
+
1941
+ = V0.61 - 29.06.2007 =
1942
+ * Added : Forgot the file jquery.nextgen.pack.js and jquery.nextgen.js
1943
+
1944
+ = V0.60 - 27.06.2007 =
1945
+ * NEW : Select a image from the Upload Tab
1946
+ * NEW : Tag [imagebrowser=id] for a Inline Gallery Browser
1947
+ * NEW : Show gallery without Subpages
1948
+ * NEW : Manage gallery : Function "Add a new page"
1949
+ * NEW : Manage gallery : Show/Hide thumbnails for WordPress gallery plugin
1950
+ * Added : Slideshow option : Watermark / Background music
1951
+ * Added : Check for memory limit
1952
+ * Added : Show actual memory usage in WordPress gallery plugin overview
1953
+ * Added : Include function check in widget
1954
+ * Added : Latest Sidebar widget from KeViN
1955
+ * Added : Check for capability during installation
1956
+ * Changed : Remove P Tag around gallery tags ( THX to the work from John Godley )
1957
+ * Bugfix : Delete picture, check for pid
1958
+ * Bugfix : admin/settings.php line #172: typos corrected (this=these,maxium=maximum). (THX to Helene D.)
1959
+ * Bugfix : admin/settings.php line #311: missing </td> added. (THX to Helene D.)
1960
+
1961
+ = V0.52 - 31.05.2007 =
1962
+ * Changed : Create better thubmnails in square mode (THX to Kees de Bruin)
1963
+ * Changed : Again , fixed ratio create better thumbnails (Also for widescreen photos)
1964
+ * Removed : Option "Resize image before cropping" removed and included in Create square thumbnail
1965
+ * Bugfix : Scan folder for new picture didn't set exclude = 0
1966
+ * Bugfix : If no option is checked in thumbnails, resize failed (THK to Joern Kretzschmar)
1967
+
1968
+ = V0.51 - 28.05.2007 =
1969
+ * Bugfix : Thumbnail permission not set correct
1970
+ * Bugfix : Folder permission check wrong
1971
+ * Bugfix : Remove echo in album (THX to Lazy)
1972
+
1973
+ = V0.50 - 28.05.2007 =
1974
+ * NEW : Select multiple files for upload (THX to Diego A., http://www.fyneworks.com)
1975
+ * NEW : Sidebar widget contain now Slideshow, recent images and random images
1976
+ * Added : New Option for Imagerotator 3.8 (Slow zoom effect)
1977
+ * Added : Option for CDATA wrapper (not working proper)
1978
+ * Added : Option for Thickbox Loading Image for WordPress gallery plugin
1979
+ * Added : CSS file for dKret2 (THK to Joern)
1980
+ * Added : Better file permission check
1981
+ * Changed : Fixed ratio create better thumbnails in portrait mode
1982
+ * Changed : All jQuery scripts are now in "No Conflict" mode
1983
+ * Changed : Script loading now via wp_enqueue_script
1984
+ * Changed : Add constant values for folder/file permission
1985
+ * Changed : Use description in <A href title>
1986
+ * Bugfix : Remove wrong DIV tag in slideshow
1987
+ * Bugfix : Tag [Slideshow=id,width,height] didn't work proper
1988
+ * Bugfix : Name conflict in Album script (serialize) (THX to Die-Andis)
1989
+ * Bugfix : Changed check for CSS activation
1990
+ * Bugfix : Changed check for safe-mode (Don't ask)
1991
+
1992
+ = V0.43 - 20.05.2007 =
1993
+ * Changed : Rename Thumbnail class to avoid php name collision
1994
+ * Bugfix : Missing translation flag in setup
1995
+ * Bugfix : Changed check for safe-mode
1996
+ * Bugfix : Changed check for Zip-File
1997
+
1998
+ = V0.42 - 17.05.2007 =
1999
+ * Bugfix : Float function for singlepic not integrated, sorry !
2000
+ * Bugfix : Remove clear:both in widget
2001
+
2002
+ = V0.41 - 17.05.2007 =
2003
+ * NEW : Sidebar widget from KeViN
2004
+ * Update : Better album management for more galleries
2005
+ * Update : Thickbox v3 integrated into WordPress gallery plugin
2006
+ * Added : Float selection for singlepic
2007
+ * Added : CSS class for widget
2008
+ * Added : CSS file for K2 theme
2009
+ * Added : German translation (THX to Lazy)
2010
+ * Added : Better check for safe-mode
2011
+ * Added : CSS Class for single-pic : class="ngg-singlepic"
2012
+ * Added : Option to resize image before cropping it (Setting reset of prior versions needed! Setup -> Reset Settings)
2013
+ * Changed : Image quality by default 85% (THX to ArizonaGroovejet)
2014
+ * Bugfix : Update wrong file when select other style
2015
+ * Bugfix : Fixed Permalink in album (THX to Helene D.)
2016
+ * Bugfix : Scan folder in empty gallery
2017
+ * Bugfix : Swfobjects only added with Thickbox effect
2018
+ * Bugfix : Umlauts are now handled correctly
2019
+
2020
+ = V0.40 - 29.04.2007 =
2021
+ * NEW : TinyMCE Button integration for WordPress gallery plugin
2022
+ * Removed : CSS Style : remove width/height in album
2023
+
2024
+ = V0.39 - 28.04.2007 =
2025
+ * Added : Set ORDER BY for gallery
2026
+ * Bugfix : check now for Exclude != 1
2027
+ * Bugfix : DB Query in function wrong
2028
+ * Bugfix : DB exlude = DEFAULT '0'
2029
+ * Bugfix : Scan folder in empty gallery
2030
+
2031
+ = V0.38 - 28.04.2007 =
2032
+ * Bugfix : One time more remove get_settings :-)
2033
+ * Bugfix : $_GET in Manage gallery
2034
+ * Bugfix : exclude option
2035
+
2036
+ = V0.37 - 28.04.2007 =
2037
+ * Bugfix : $_GET in Manage gallery
2038
+ * Bugfix : update DB installation routine
2039
+
2040
+ = V0.36 - 26.04.2007 =
2041
+ * Bugfix : Stupid PHP beginner failure in album management
2042
+
2043
+ = V0.35 - 26.04.2007 =
2044
+ * Rework : Folder name can be flexible
2045
+ * New option : Fullsize pic for Singlepic mode
2046
+ * New option : Select show order
2047
+ * Added : Check for WP2.1
2048
+ * Added : Check for permission for default folder
2049
+ * Bugfix : Remove get_settings
2050
+ * Bugfix : Correction for Safe-Mode ON
2051
+ * Bugfix : Set Default '0' for table album.sortorder
2052
+ * Bugfix : Update sort order
2053
+
2054
+ = V0.34 - 24.04.2007 =
2055
+ * Added : Add fix ration setting
2056
+ * Added : Add language file
2057
+ * Bugfix : Change link in Album to get_bloginfo('wpurl')
2058
+ * Bugfix : Album CSS file not loaded
2059
+
2060
+ = V0.33 - 23.04.2007 =
2061
+ * NEW : Overview Page for WordPress gallery plugin
2062
+ * NEW : Core function
2063
+ * NEW : Slideshow for WordPress gallery plugin
nextgen-gallery/composer.json ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "imagely/nextgen-gallery",
3
+ "version": "3.5.0",
4
+ "description": "The most popular gallery plugin for WordPress and one of the most popular plugins of all time with over 30 million downloads.",
5
+ "keywords": ["nextgen", "nextgen gallery", "gallery", "galleries", "image", "images", "image gallery", "photo", "photos", "photo gallery", "picture", "pictures", "picture gallery", "album", "albums", "photo albums", "image album", "media", "media gallery", "thumbnails", "thumbnail gallery", "thumbnail galleries", "slideshow", "slideshows", "slideshow gallery", "slideshow galleries", "fancybox", "lightbox", "responsive", "responsive gallery", "responsive galleries", "singlepic", "watermarks", "watermarking", "photography", "photographer"],
6
+ "homepage": "https://www.imagely.com/",
7
+ "license": "GPLv2",
8
+ "type": "wordpress-plugin",
9
+ "repositories": [
10
+ {"type": "composer", "url": "https://repo.packagist.com/imagely/"},
11
+ {"packagist.org": false}
12
+ ],
13
+ "require": {
14
+ "imagely/pope-framework": "v0.17",
15
+ "ezyang/htmlpurifier": "^4.13"
16
+ },
17
+ "require-dev": {
18
+ "nikic/php-parser": "^4.12"
19
+ }
20
+ }
nextgen-gallery/composer.lock ADDED
@@ -0,0 +1,187 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "_readme": [
3
+ "This file locks the dependencies of your project to a known state",
4
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
5
+ "This file is @generated automatically"
6
+ ],
7
+ "content-hash": "065f055ec7f42c14604615434d627a40",
8
+ "packages": [
9
+ {
10
+ "name": "ezyang/htmlpurifier",
11
+ "version": "v4.16.0",
12
+ "source": {
13
+ "type": "git",
14
+ "url": "https://github.com/ezyang/htmlpurifier.git",
15
+ "reference": "523407fb06eb9e5f3d59889b3978d5bfe94299c8"
16
+ },
17
+ "dist": {
18
+ "type": "zip",
19
+ "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/523407fb06eb9e5f3d59889b3978d5bfe94299c8",
20
+ "reference": "523407fb06eb9e5f3d59889b3978d5bfe94299c8",
21
+ "shasum": "",
22
+ "mirrors": [
23
+ {
24
+ "url": "https://repo.packagist.com/imagely/dists/%package%/%version%/r%reference%.%type%",
25
+ "preferred": true
26
+ }
27
+ ]
28
+ },
29
+ "require": {
30
+ "php": "~5.6.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0"
31
+ },
32
+ "require-dev": {
33
+ "cerdic/css-tidy": "^1.7 || ^2.0",
34
+ "simpletest/simpletest": "dev-master"
35
+ },
36
+ "suggest": {
37
+ "cerdic/css-tidy": "If you want to use the filter 'Filter.ExtractStyleBlocks'.",
38
+ "ext-bcmath": "Used for unit conversion and imagecrash protection",
39
+ "ext-iconv": "Converts text to and from non-UTF-8 encodings",
40
+ "ext-tidy": "Used for pretty-printing HTML"
41
+ },
42
+ "type": "library",
43
+ "autoload": {
44
+ "files": [
45
+ "library/HTMLPurifier.composer.php"
46
+ ],
47
+ "psr-0": {
48
+ "HTMLPurifier": "library/"
49
+ },
50
+ "exclude-from-classmap": [
51
+ "/library/HTMLPurifier/Language/"
52
+ ]
53
+ },
54
+ "notification-url": "https://repo.packagist.com/imagely/downloads/",
55
+ "license": [
56
+ "LGPL-2.1-or-later"
57
+ ],
58
+ "authors": [
59
+ {
60
+ "name": "Edward Z. Yang",
61
+ "email": "admin@htmlpurifier.org",
62
+ "homepage": "http://ezyang.com"
63
+ }
64
+ ],
65
+ "description": "Standards compliant HTML filter written in PHP",
66
+ "homepage": "http://htmlpurifier.org/",
67
+ "keywords": [
68
+ "html"
69
+ ],
70
+ "support": {
71
+ "issues": "https://github.com/ezyang/htmlpurifier/issues",
72
+ "source": "https://github.com/ezyang/htmlpurifier/tree/v4.16.0"
73
+ },
74
+ "time": "2022-09-18T07:06:19+00:00"
75
+ },
76
+ {
77
+ "name": "imagely/pope-framework",
78
+ "version": "v0.17",
79
+ "source": {
80
+ "type": "git",
81
+ "url": "https://github.com/LionSher-Technologies/pope-framework/",
82
+ "reference": "13da4d47779a91fbf07a68062e64974eb1427ef2"
83
+ },
84
+ "dist": {
85
+ "type": "zip",
86
+ "url": "https://repo.packagist.com/imagely/dists/imagely/pope-framework/0.17.0.0/13da4d47779a91fbf07a68062e64974eb1427ef2.zip",
87
+ "reference": "13da4d47779a91fbf07a68062e64974eb1427ef2",
88
+ "mirrors": [
89
+ {
90
+ "url": "https://repo.packagist.com/imagely/dists/%package%/%version%/r%reference%.%type%",
91
+ "preferred": true
92
+ }
93
+ ]
94
+ },
95
+ "type": "library",
96
+ "autoload": {
97
+ "files": [
98
+ "./lib/autoload.php"
99
+ ]
100
+ },
101
+ "notification-url": "https://repo.packagist.com/imagely/downloads/",
102
+ "license": [
103
+ "GPL-2.0-only"
104
+ ],
105
+ "authors": [
106
+ {
107
+ "name": "Imagely",
108
+ "email": "support@imagely.com"
109
+ }
110
+ ],
111
+ "description": "A component framework inspired by Zope 3. Pope is \"PHP's Zope\".",
112
+ "time": "2020-10-22T19:43:52+00:00"
113
+ }
114
+ ],
115
+ "packages-dev": [
116
+ {
117
+ "name": "nikic/php-parser",
118
+ "version": "v4.15.1",
119
+ "source": {
120
+ "type": "git",
121
+ "url": "https://github.com/nikic/PHP-Parser.git",
122
+ "reference": "0ef6c55a3f47f89d7a374e6f835197a0b5fcf900"
123
+ },
124
+ "dist": {
125
+ "type": "zip",
126
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/0ef6c55a3f47f89d7a374e6f835197a0b5fcf900",
127
+ "reference": "0ef6c55a3f47f89d7a374e6f835197a0b5fcf900",
128
+ "shasum": "",
129
+ "mirrors": [
130
+ {
131
+ "url": "https://repo.packagist.com/imagely/dists/%package%/%version%/r%reference%.%type%",
132
+ "preferred": true
133
+ }
134
+ ]
135
+ },
136
+ "require": {
137
+ "ext-tokenizer": "*",
138
+ "php": ">=7.0"
139
+ },
140
+ "require-dev": {
141
+ "ircmaxell/php-yacc": "^0.0.7",
142
+ "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0"
143
+ },
144
+ "bin": [
145
+ "bin/php-parse"
146
+ ],
147
+ "type": "library",
148
+ "extra": {
149
+ "branch-alias": {
150
+ "dev-master": "4.9-dev"
151
+ }
152
+ },
153
+ "autoload": {
154
+ "psr-4": {
155
+ "PhpParser\\": "lib/PhpParser"
156
+ }
157
+ },
158
+ "notification-url": "https://repo.packagist.com/imagely/downloads/",
159
+ "license": [
160
+ "BSD-3-Clause"
161
+ ],
162
+ "authors": [
163
+ {
164
+ "name": "Nikita Popov"
165
+ }
166
+ ],
167
+ "description": "A PHP parser written in PHP",
168
+ "keywords": [
169
+ "parser",
170
+ "php"
171
+ ],
172
+ "support": {
173
+ "issues": "https://github.com/nikic/PHP-Parser/issues",
174
+ "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.1"
175
+ },
176
+ "time": "2022-09-04T07:30:47+00:00"
177
+ }
178
+ ],
179
+ "aliases": [],
180
+ "minimum-stability": "stable",
181
+ "stability-flags": [],
182
+ "prefer-stable": false,
183
+ "prefer-lowest": false,
184
+ "platform": [],
185
+ "platform-dev": [],
186
+ "plugin-api-version": "2.3.0"
187
+ }
nextgen-gallery/index.html ADDED
File without changes
nextgen-gallery/license.txt ADDED
@@ -0,0 +1,340 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ GNU GENERAL PUBLIC LICENSE
2
+ Version 2, June 1991
3
+
4
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
5
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
6
+ Everyone is permitted to copy and distribute verbatim copies
7
+ of this license document, but changing it is not allowed.
8
+
9
+ Preamble
10
+
11
+ The licenses for most software are designed to take away your
12
+ freedom to share and change it. By contrast, the GNU General Public
13
+ License is intended to guarantee your freedom to share and change free
14
+ software--to make sure the software is free for all its users. This
15
+ General Public License applies to most of the Free Software
16
+ Foundation's software and to any other program whose authors commit to
17
+ using it. (Some other Free Software Foundation software is covered by
18
+ the GNU Lesser General Public License instead.) You can apply it to
19
+ your programs, too.
20
+
21
+ When we speak of free software, we are referring to freedom, not
22
+ price. Our General Public Licenses are designed to make sure that you
23
+ have the freedom to distribute copies of free software (and charge for
24
+ this service if you wish), that you receive source code or can get it
25
+ if you want it, that you can change the software or use pieces of it
26
+ in new free programs; and that you know you can do these things.
27
+
28
+ To protect your rights, we need to make restrictions that forbid
29
+ anyone to deny you these rights or to ask you to surrender the rights.
30
+ These restrictions translate to certain responsibilities for you if you
31
+ distribute copies of the software, or if you modify it.
32
+
33
+ For example, if you distribute copies of such a program, whether
34
+ gratis or for a fee, you must give the recipients all the rights that
35
+ you have. You must make sure that they, too, receive or can get the
36
+ source code. And you must show them these terms so they know their
37
+ rights.
38
+
39
+ We protect your rights with two steps: (1) copyright the software, and
40
+ (2) offer you this license which gives you legal permission to copy,
41
+ distribute and/or modify the software.
42
+
43
+ Also, for each author's protection and ours, we want to make certain
44
+ that everyone understands that there is no warranty for this free
45
+ software. If the software is modified by someone else and passed on, we
46
+ want its recipients to know that what they have is not the original, so
47
+ that any problems introduced by others will not reflect on the original
48
+ authors' reputations.
49
+
50
+ Finally, any free program is threatened constantly by software
51
+ patents. We wish to avoid the danger that redistributors of a free
52
+ program will individually obtain patent licenses, in effect making the
53
+ program proprietary. To prevent this, we have made it clear that any
54
+ patent must be licensed for everyone's free use or not licensed at all.
55
+
56
+ The precise terms and conditions for copying, distribution and
57
+ modification follow.
58
+
59
+ GNU GENERAL PUBLIC LICENSE
60
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
61
+
62
+ 0. This License applies to any program or other work which contains
63
+ a notice placed by the copyright holder saying it may be distributed
64
+ under the terms of this General Public License. The "Program", below,
65
+ refers to any such program or work, and a "work based on the Program"
66
+ means either the Program or any derivative work under copyright law:
67
+ that is to say, a work containing the Program or a portion of it,
68
+ either verbatim or with modifications and/or translated into another
69
+ language. (Hereinafter, translation is included without limitation in
70
+ the term "modification".) Each licensee is addressed as "you".
71
+
72
+ Activities other than copying, distribution and modification are not
73
+ covered by this License; they are outside its scope. The act of
74
+ running the Program is not restricted, and the output from the Program
75
+ is covered only if its contents constitute a work based on the
76
+ Program (independent of having been made by running the Program).
77
+ Whether that is true depends on what the Program does.
78
+
79
+ 1. You may copy and distribute verbatim copies of the Program's
80
+ source code as you receive it, in any medium, provided that you
81
+ conspicuously and appropriately publish on each copy an appropriate
82
+ copyright notice and disclaimer of warranty; keep intact all the
83
+ notices that refer to this License and to the absence of any warranty;
84
+ and give any other recipients of the Program a copy of this License
85
+ along with the Program.
86
+
87
+ You may charge a fee for the physical act of transferring a copy, and
88
+ you may at your option offer warranty protection in exchange for a fee.
89
+
90
+ 2. You may modify your copy or copies of the Program or any portion
91
+ of it, thus forming a work based on the Program, and copy and
92
+ distribute such modifications or work under the terms of Section 1
93
+ above, provided that you also meet all of these conditions:
94
+
95
+ a) You must cause the modified files to carry prominent notices
96
+ stating that you changed the files and the date of any change.
97
+
98
+ b) You must cause any work that you distribute or publish, that in
99
+ whole or in part contains or is derived from the Program or any
100
+ part thereof, to be licensed as a whole at no charge to all third
101
+ parties under the terms of this License.
102
+
103
+ c) If the modified program normally reads commands interactively
104
+ when run, you must cause it, when started running for such
105
+ interactive use in the most ordinary way, to print or display an
106
+ announcement including an appropriate copyright notice and a
107
+ notice that there is no warranty (or else, saying that you provide
108
+ a warranty) and that users may redistribute the program under
109
+ these conditions, and telling the user how to view a copy of this
110
+ License. (Exception: if the Program itself is interactive but
111
+ does not normally print such an announcement, your work based on
112
+ the Program is not required to print an announcement.)
113
+
114
+ These requirements apply to the modified work as a whole. If
115
+ identifiable sections of that work are not derived from the Program,
116
+ and can be reasonably considered independent and separate works in
117
+ themselves, then this License, and its terms, do not apply to those
118
+ sections when you distribute them as separate works. But when you
119
+ distribute the same sections as part of a whole which is a work based
120
+ on the Program, the distribution of the whole must be on the terms of
121
+ this License, whose permissions for other licensees extend to the
122
+ entire whole, and thus to each and every part regardless of who wrote it.
123
+
124
+ Thus, it is not the intent of this section to claim rights or contest
125
+ your rights to work written entirely by you; rather, the intent is to
126
+ exercise the right to control the distribution of derivative or
127
+ collective works based on the Program.
128
+
129
+ In addition, mere aggregation of another work not based on the Program
130
+ with the Program (or with a work based on the Program) on a volume of
131
+ a storage or distribution medium does not bring the other work under
132
+ the scope of this License.
133
+
134
+ 3. You may copy and distribute the Program (or a work based on it,
135
+ under Section 2) in object code or executable form under the terms of
136
+ Sections 1 and 2 above provided that you also do one of the following:
137
+
138
+ a) Accompany it with the complete corresponding machine-readable
139
+ source code, which must be distributed under the terms of Sections
140
+ 1 and 2 above on a medium customarily used for software interchange; or,
141
+
142
+ b) Accompany it with a written offer, valid for at least three
143
+ years, to give any third party, for a charge no more than your
144
+ cost of physically performing source distribution, a complete
145
+ machine-readable copy of the corresponding source code, to be
146
+ distributed under the terms of Sections 1 and 2 above on a medium
147
+ customarily used for software interchange; or,
148
+
149
+ c) Accompany it with the information you received as to the offer
150
+ to distribute corresponding source code. (This alternative is
151
+ allowed only for noncommercial distribution and only if you
152
+ received the program in object code or executable form with such
153
+ an offer, in accord with Subsection b above.)
154
+
155
+ The source code for a work means the preferred form of the work for
156
+ making modifications to it. For an executable work, complete source
157
+ code means all the source code for all modules it contains, plus any
158
+ associated interface definition files, plus the scripts used to
159
+ control compilation and installation of the executable. However, as a
160
+ special exception, the source code distributed need not include
161
+ anything that is normally distributed (in either source or binary
162
+ form) with the major components (compiler, kernel, and so on) of the
163
+ operating system on which the executable runs, unless that component
164
+ itself accompanies the executable.
165
+
166
+ If distribution of executable or object code is made by offering
167
+ access to copy from a designated place, then offering equivalent
168
+ access to copy the source code from the same place counts as
169
+ distribution of the source code, even though third parties are not
170
+ compelled to copy the source along with the object code.
171
+
172
+ 4. You may not copy, modify, sublicense, or distribute the Program
173
+ except as expressly provided under this License. Any attempt
174
+ otherwise to copy, modify, sublicense or distribute the Program is
175
+ void, and will automatically terminate your rights under this License.
176
+ However, parties who have received copies, or rights, from you under
177
+ this License will not have their licenses terminated so long as such
178
+ parties remain in full compliance.
179
+
180
+ 5. You are not required to accept this License, since you have not
181
+ signed it. However, nothing else grants you permission to modify or
182
+ distribute the Program or its derivative works. These actions are
183
+ prohibited by law if you do not accept this License. Therefore, by
184
+ modifying or distributing the Program (or any work based on the
185
+ Program), you indicate your acceptance of this License to do so, and
186
+ all its terms and conditions for copying, distributing or modifying
187
+ the Program or works based on it.
188
+
189
+ 6. Each time you redistribute the Program (or any work based on the
190
+ Program), the recipient automatically receives a license from the
191
+ original licensor to copy, distribute or modify the Program subject to
192
+ these terms and conditions. You may not impose any further
193
+ restrictions on the recipients' exercise of the rights granted herein.
194
+ You are not responsible for enforcing compliance by third parties to
195
+ this License.
196
+
197
+ 7. If, as a consequence of a court judgment or allegation of patent
198
+ infringement or for any other reason (not limited to patent issues),
199
+ conditions are imposed on you (whether by court order, agreement or
200
+ otherwise) that contradict the conditions of this License, they do not
201
+ excuse you from the conditions of this License. If you cannot
202
+ distribute so as to satisfy simultaneously your obligations under this
203
+ License and any other pertinent obligations, then as a consequence you
204
+ may not distribute the Program at all. For example, if a patent
205
+ license would not permit royalty-free redistribution of the Program by
206
+ all those who receive copies directly or indirectly through you, then
207
+ the only way you could satisfy both it and this License would be to
208
+ refrain entirely from distribution of the Program.
209
+
210
+ If any portion of this section is held invalid or unenforceable under
211
+ any particular circumstance, the balance of the section is intended to
212
+ apply and the section as a whole is intended to apply in other
213
+ circumstances.
214
+
215
+ It is not the purpose of this section to induce you to infringe any
216
+ patents or other property right claims or to contest validity of any
217
+ such claims; this section has the sole purpose of protecting the
218
+ integrity of the free software distribution system, which is
219
+ implemented by public license practices. Many people have made
220
+ generous contributions to the wide range of software distributed
221
+ through that system in reliance on consistent application of that
222
+ system; it is up to the author/donor to decide if he or she is willing
223
+ to distribute software through any other system and a licensee cannot
224
+ impose that choice.
225
+
226
+ This section is intended to make thoroughly clear what is believed to
227
+ be a consequence of the rest of this License.
228
+
229
+ 8. If the distribution and/or use of the Program is restricted in
230
+ certain countries either by patents or by copyrighted interfaces, the
231
+ original copyright holder who places the Program under this License
232
+ may add an explicit geographical distribution limitation excluding
233
+ those countries, so that distribution is permitted only in or among
234
+ countries not thus excluded. In such case, this License incorporates
235
+ the limitation as if written in the body of this License.
236
+
237
+ 9. The Free Software Foundation may publish revised and/or new versions
238
+ of the General Public License from time to time. Such new versions will
239
+ be similar in spirit to the present version, but may differ in detail to
240
+ address new problems or concerns.
241
+
242
+ Each version is given a distinguishing version number. If the Program
243
+ specifies a version number of this License which applies to it and "any
244
+ later version", you have the option of following the terms and conditions
245
+ either of that version or of any later version published by the Free
246
+ Software Foundation. If the Program does not specify a version number of
247
+ this License, you may choose any version ever published by the Free Software
248
+ Foundation.
249
+
250
+ 10. If you wish to incorporate parts of the Program into other free
251
+ programs whose distribution conditions are different, write to the author
252
+ to ask for permission. For software which is copyrighted by the Free
253
+ Software Foundation, write to the Free Software Foundation; we sometimes
254
+ make exceptions for this. Our decision will be guided by the two goals
255
+ of preserving the free status of all derivatives of our free software and
256
+ of promoting the sharing and reuse of software generally.
257
+
258
+ NO WARRANTY
259
+
260
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
261
+ FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
262
+ OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
263
+ PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
264
+ OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
265
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
266
+ TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
267
+ PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
268
+ REPAIR OR CORRECTION.
269
+
270
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
271
+ WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
272
+ REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
273
+ INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
274
+ OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
275
+ TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
276
+ YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
277
+ PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
278
+ POSSIBILITY OF SUCH DAMAGES.
279
+
280
+ END OF TERMS AND CONDITIONS
281
+
282
+ How to Apply These Terms to Your New Programs
283
+
284
+ If you develop a new program, and you want it to be of the greatest
285
+ possible use to the public, the best way to achieve this is to make it
286
+ free software which everyone can redistribute and change under these terms.
287
+
288
+ To do so, attach the following notices to the program. It is safest
289
+ to attach them to the start of each source file to most effectively
290
+ convey the exclusion of warranty; and each file should have at least
291
+ the "copyright" line and a pointer to where the full notice is found.
292
+
293
+ <one line to give the program's name and a brief idea of what it does.>
294
+ Copyright (C) <year> <name of author>
295
+
296
+ This program is free software; you can redistribute it and/or modify
297
+ it under the terms of the GNU General Public License as published by
298
+ the Free Software Foundation; either version 2 of the License, or
299
+ (at your option) any later version.
300
+
301
+ This program is distributed in the hope that it will be useful,
302
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
303
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
304
+ GNU General Public License for more details.
305
+
306
+ You should have received a copy of the GNU General Public License along
307
+ with this program; if not, write to the Free Software Foundation, Inc.,
308
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
309
+
310
+ Also add information on how to contact you by electronic and paper mail.
311
+
312
+ If the program is interactive, make it output a short notice like this
313
+ when it starts in an interactive mode:
314
+
315
+ Gnomovision version 69, Copyright (C) year name of author
316
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
317
+ This is free software, and you are welcome to redistribute it
318
+ under certain conditions; type `show c' for details.
319
+
320
+ The hypothetical commands `show w' and `show c' should show the appropriate
321
+ parts of the General Public License. Of course, the commands you use may
322
+ be called something other than `show w' and `show c'; they could even be
323
+ mouse-clicks or menu items--whatever suits your program.
324
+
325
+ You should also get your employer (if you work as a programmer) or your
326
+ school, if any, to sign a "copyright disclaimer" for the program, if
327
+ necessary. Here is a sample; alter the names:
328
+
329
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
330
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
331
+
332
+ <signature of Ty Coon>, 1 April 1989
333
+ Ty Coon, President of Vice
334
+
335
+ This General Public License does not permit incorporating your program into
336
+ proprietary programs. If your program is a subroutine library, you may
337
+ consider it more useful to permit linking proprietary applications with the
338
+ library. If this is what you want to do, use the GNU Lesser General
339
+ Public License instead of this License.
340
+
nextgen-gallery/nggallery.php ADDED
@@ -0,0 +1,813 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ if(preg_match('#' . basename(__FILE__) . '#', $_SERVER['PHP_SELF'])) { die('You are not allowed to call this page directly.'); }
3
+
4
+ /**
5
+ * Plugin Name: NextGEN Gallery
6
+ * Description: The most popular gallery plugin for WordPress and one of the most popular plugins of all time with over 30 million downloads.
7
+ * Version: 3.29
8
+ * Author: Imagely
9
+ * Plugin URI: https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/
10
+ * Author URI: https://www.imagely.com
11
+ * License: GPLv3
12
+ * Text Domain: nggallery
13
+ * Domain Path: /products/photocrati_nextgen/modules/i18n/lang
14
+ * Requires PHP: 5.6
15
+ */
16
+
17
+ if (!class_exists('E_Clean_Exit')) { class E_Clean_Exit extends RuntimeException {} }
18
+ if (!class_exists('E_NggErrorException')) { class E_NggErrorException extends RuntimeException {} }
19
+
20
+ // This is a temporary function to replace the use of WP's esc_url which strips spaces away from URLs
21
+ // TODO: Move this to a better place
22
+ if (!function_exists('nextgen_esc_url')) {
23
+ function nextgen_esc_url( $url, $protocols = null, $_context = 'display' ) {
24
+ $original_url = $url;
25
+
26
+ if ( '' == $url )
27
+ return $url;
28
+ $url = preg_replace('|[^a-z0-9 \\-~+_.?#=!&;,/:%@$\|*\'()\\x80-\\xff]|i', '', $url);
29
+ $strip = array('%0d', '%0a', '%0D', '%0A');
30
+ $url = _deep_replace($strip, $url);
31
+ $url = str_replace(';//', '://', $url);
32
+ /* If the URL doesn't appear to contain a scheme, we
33
+ * presume it needs http:// appended (unless a relative
34
+ * link starting with /, # or ? or a php file).
35
+ */
36
+
37
+ if ( strpos($url, ':') === false && ! in_array( $url[0], array( '/', '#', '?' ) ) &&
38
+ ! preg_match('/^[a-z0-9-]+?\.php/i', $url) )
39
+ $url = 'http://' . $url;
40
+
41
+ // Replace ampersands and single quotes only when displaying.
42
+ if ( 'display' == $_context ) {
43
+ $url = wp_kses_normalize_entities( $url );
44
+ $url = str_replace( '&amp;', '&#038;', $url );
45
+ $url = str_replace( "'", '&#039;', $url );
46
+ $url = str_replace( ' ', '%20', $url );
47
+ }
48
+
49
+ if ( '/' === $url[0] ) {
50
+ $good_protocol_url = $url;
51
+ } else {
52
+ if ( ! is_array( $protocols ) )
53
+ $protocols = wp_allowed_protocols();
54
+ $good_protocol_url = wp_kses_bad_protocol( $url, $protocols );
55
+ if ( strtolower( $good_protocol_url ) != strtolower( $url ) )
56
+ return '';
57
+ }
58
+
59
+ return apply_filters('clean_url', $good_protocol_url, $original_url, $_context);
60
+ }
61
+ }
62
+
63
+ /**
64
+ * NextGEN Gallery is built on top of the Pope Framework:
65
+ * https://bitbucket.org/photocrati/pope-framework
66
+ *
67
+ * Pope constructs applications by assembling modules.
68
+ *
69
+ * The Bootstrapper. This class performs the following:
70
+ * 1) Loads the Pope Framework
71
+ * 2) Adds a path to the C_Component_Registry instance to search for products
72
+ * 3) Loads all found Products. A Product is a collection of modules with some
73
+ * additional meta data. A Product is responsible for loading any modules it
74
+ * requires.
75
+ * 4) Once all Products (and their associated modules) have been loaded (or in
76
+ * otherwords, "included"), the modules are initialized.
77
+ */
78
+ class C_NextGEN_Bootstrap
79
+ {
80
+ var $_registry = NULL;
81
+ var $_settings_option_name = 'ngg_options';
82
+ var $_pope_loaded = FALSE;
83
+ static $debug = FALSE;
84
+ var $minimum_ngg_pro_version = '2.0.5';
85
+ var $minimum_ngg_plus_version = '1.0.1';
86
+
87
+ static function shutdown($exception=NULL)
88
+ {
89
+ if (is_null($exception))
90
+ {
91
+ $name = php_sapi_name();
92
+ if (FALSE === strpos($name, 'cgi')
93
+ && version_compare(PHP_VERSION, '5.3.3') >= 0)
94
+ {
95
+ $status = session_status();
96
+ if (in_array($status, array(PHP_SESSION_DISABLED, PHP_SESSION_NONE), TRUE))
97
+ session_write_close();
98
+ fastcgi_finish_request();
99
+ }
100
+ else {
101
+ exit();
102
+ }
103
+ }
104
+ elseif (!($exception instanceof E_Clean_Exit)) {
105
+ if (ob_get_level() > 0) ob_end_clean();
106
+ self::print_exception($exception);
107
+ }
108
+ }
109
+
110
+ static function print_exception($exception)
111
+ {
112
+ $klass = get_class($exception);
113
+ echo "<h1>{$klass} thrown</h1>";
114
+ echo "<p>{$exception->getMessage()}</p>";
115
+ if (self::$debug OR (defined('NGG_DEBUG') AND NGG_DEBUG == TRUE)) {
116
+ echo "<h3>Where:</h3>";
117
+ echo "<p>On line <strong>{$exception->getLine()}</strong> of <strong>{$exception->getFile()}</strong></p>";
118
+ echo "<h3>Trace:</h3>";
119
+ echo "<pre>{$exception->getTraceAsString()}</pre>";
120
+ if (method_exists($exception, 'getPrevious')) {
121
+ if (($previous = $exception->getPrevious())) {
122
+ self::print_exception($previous);
123
+ }
124
+ }
125
+ }
126
+ }
127
+
128
+ static function get_backtrace($objects=FALSE, $remove_dynamic_calls=TRUE)
129
+ {
130
+ $trace = debug_backtrace($objects);
131
+ if ($remove_dynamic_calls) {
132
+ $skip_methods = array(
133
+ '_exec_cached_method',
134
+ '__call',
135
+ 'get_method_property',
136
+ 'set_method_property',
137
+ 'call_method'
138
+ );
139
+ foreach ($trace as $key => &$value) {
140
+ if (isset($value['class']) && isset($value['function'])) {
141
+ if ($value['class'] == 'ReflectionMethod' && $value['function'] == 'invokeArgs')
142
+ unset($trace[$key]);
143
+
144
+ else if ($value['class'] == 'ExtensibleObject' && in_array($value['function'], $skip_methods))
145
+ unset($trace[$key]);
146
+ }
147
+ }
148
+ }
149
+
150
+ return $trace;
151
+ }
152
+
153
+ public function php_version_incompatible()
154
+ { ?>
155
+ <div class="notice notice-error is-dismissible">
156
+ <p><?php print __('We’ve detected you are running PHP versions 7.0.26 or 7.1.12. These versions of PHP have a bug that breaks NextGEN Gallery and causes server crashes in certain conditions. To protect your site, NextGEN Gallery will not load. We recommend asking your host to roll back to an earlier version of PHP. For details on the PHP bug, see: <a target="_blank" href="https://bugs.php.net/bug.php?id=75573">bugs.php.net/bug.php?id=75573</a>', 'nggallery'); ?></p>
157
+ </div>
158
+ <?php
159
+ }
160
+
161
+ function __construct()
162
+ {
163
+ if (!defined('NGG_DISABLE_SHUTDOWN_EXCEPTION_HANDLER') || !NGG_DISABLE_SHUTDOWN_EXCEPTION_HANDLER)
164
+ set_exception_handler(__CLASS__.'::shutdown');
165
+
166
+ // We only load the plugin if we're outside of the activation request, loaded in an iframe
167
+ // by WordPress. Reason being, if WP_DEBUG is enabled, and another Pope-based plugin (such as
168
+ // the photocrati theme or NextGEN Pro/Plus), then PHP will output strict warnings
169
+ if ($this->is_not_activating() && !$this->is_topscorer_request()) {
170
+ $this->_define_constants();
171
+ $this->_load_non_pope();
172
+ $this->_register_hooks();
173
+ $this->_load_pope();
174
+ }
175
+ }
176
+
177
+ function is_topscorer_request()
178
+ {
179
+ return strpos($_SERVER['REQUEST_URI'], 'topscorer/v1') !== FALSE;
180
+ }
181
+
182
+ function is_not_activating()
183
+ {
184
+ return !$this->is_activating();
185
+ }
186
+
187
+ function is_activating()
188
+ {
189
+ $retval = strpos($_SERVER['REQUEST_URI'], 'plugins.php') !== FALSE && isset($_REQUEST['action']) && in_array($_REQUEST['action'], array('activate-selected'));
190
+
191
+ if (!$retval && strpos($_SERVER['REQUEST_URI'], 'update.php') !== FALSE && isset($_REQUEST['action']) && $_REQUEST['action'] == 'install-plugin' && isset($_REQUEST['plugin']) && strpos($_REQUEST['plugin'], 'nextgen-gallery') === 0) {
192
+ $retval = TRUE;
193
+ }
194
+
195
+ if (!$retval && strpos($_SERVER['REQUEST_URI'], 'update.php') !== FALSE && isset($_REQUEST['action']) && $_REQUEST['action'] == 'activate-plugin' && isset($_REQUEST['plugin']) && strpos($_REQUEST['plugin'], 'nextgen-gallery') === 0) {
196
+ $retval = TRUE;
197
+ }
198
+
199
+ return $retval;
200
+ }
201
+
202
+ function _load_non_pope()
203
+ {
204
+ // Load caching component
205
+ include_once('non_pope/class.photocrati_transient_manager.php');
206
+ include_once('non_pope/class.nextgen_serializable.php');
207
+
208
+ // Load Settings Manager
209
+ include_once('non_pope/class.photocrati_settings_manager.php');
210
+ include_once('non_pope/class.nextgen_settings.php');
211
+ C_Photocrati_Global_Settings_Manager::$option_name = $this->_settings_option_name;
212
+ C_Photocrati_Settings_Manager::$option_name = $this->_settings_option_name;
213
+
214
+ // Load the installer
215
+ include_once('non_pope/class.photocrati_installer.php');
216
+
217
+ // Load the (mostly deprecated) resource manager
218
+ include_once('non_pope/class.photocrati_resource_manager.php');
219
+ C_Photocrati_Resource_Manager::init();
220
+
221
+ // Load the shortcode manager
222
+ include_once('non_pope/class.nextgen_shortcode_manager.php');
223
+ C_NextGen_Shortcode_Manager::get_instance();
224
+ }
225
+
226
+ function fix_loading_order()
227
+ {
228
+ // If a plugin wasn't activated/deactivated siliently, we can listen for these things
229
+ if (did_action('activate_plugin') || did_action('deactivate_plugin')) return;
230
+ else if (strpos($_SERVER['REQUEST_URI'], 'plugins') !== FALSE) return;
231
+ else if (!$this->is_page_request()) return;
232
+
233
+ $plugins = get_option('active_plugins');
234
+
235
+ // Remove NGG from the list
236
+ $ngg = basename(dirname(__FILE__)).'/'.basename(__FILE__);
237
+ $order = array();
238
+ foreach ($plugins as $plugin) {
239
+ if ($plugin != $ngg) $order[] = $plugin;
240
+ }
241
+
242
+
243
+ // Get the position of either NGG Pro or NGG Plus
244
+ $insert_at = FALSE;
245
+ for($i=0; $i<count($order); $i++) {
246
+ $plugin = $order[$i];
247
+ if (strpos($plugin, 'nggallery-pro') !== FALSE) $insert_at = $i+1;
248
+ else if (strpos($plugin, 'ngg-plus') !== FALSE) $insert_at = $i+1;
249
+ }
250
+
251
+ // Re-insert NGG after Pro or Plus
252
+ if ($insert_at === FALSE || $insert_at === count($order)) $order[] = $ngg;
253
+ elseif ($insert_at === 0) array_unshift($order, $ngg);
254
+ else array_splice($order, $insert_at, 0, array($ngg));
255
+
256
+ if ($order != $plugins) {
257
+ $order = array_filter($order);
258
+ update_option('active_plugins', $order);
259
+ }
260
+ }
261
+
262
+ /**
263
+ * Loads the Pope Framework
264
+ */
265
+ function _load_pope()
266
+ {
267
+ // No need to initialize pope again
268
+ if ($this->_pope_loaded) return;
269
+
270
+ // Pope requires a a higher limit
271
+ $tmp = ini_get('xdebug.max_nesting_level');
272
+ if ($tmp && (int)$tmp <= 300) @ini_set('xdebug.max_nesting_level', 300);
273
+
274
+ // Include pope framework
275
+ require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'vendor/autoload.php');
276
+
277
+ // Enable/disable pope caching. For now, the pope cache will not be used in multisite environments
278
+ if (class_exists('C_Pope_Cache')) {
279
+ if ((C_Pope_Cache::$enabled = NGG_POPE_CACHE)) {
280
+ $blogid = (is_multisite() ? get_current_blog_id() : NULL);
281
+ if (isset($_SERVER['SERVER_ADDR']))
282
+ $cache_key_prefix = abs(crc32((implode('|', array($blogid, site_url(), AUTH_KEY, $_SERVER['SERVER_ADDR'])))));
283
+ else
284
+ $cache_key_prefix = abs(crc32(implode('|', array($blogid, site_url(), AUTH_KEY))));
285
+
286
+ C_Pope_Cache::set_driver('C_Pope_Cache_SingleFile');
287
+ C_Pope_Cache::add_key_prefix($cache_key_prefix);
288
+ }
289
+ }
290
+
291
+ // Enforce interfaces
292
+ if (property_exists('ExtensibleObject', 'enforce_interfaces')) ExtensibleObject::$enforce_interfaces = EXTENSIBLE_OBJECT_ENFORCE_INTERFACES;
293
+
294
+ // Get the component registry
295
+ $this->_registry = C_Component_Registry::get_instance();
296
+
297
+ // Add the default Pope factory utility, C_Component_Factory
298
+ $this->_registry->add_utility('I_Component_Factory', 'C_Component_Factory');
299
+
300
+ // Blacklist any modules which are known NOT to work with this version of NextGEN Gallery
301
+ // We need to check if we have this ability as it's only available with Pope 0.9
302
+ if (method_exists($this->_registry, 'blacklist_module_file')) {
303
+ $this->_registry->blacklist_module_file('module.nextgen_pro_lightbox_legacy.php');
304
+ $this->_registry->blacklist_module_file('module.protect_image.php');
305
+ // TODO: Add module id for protect image
306
+ }
307
+
308
+ // If Pro is incompatible, then we need to blacklist all of Pro's modules
309
+ // TODO: Pope needs a better way of introspecting into a product's list of provided modules
310
+ if ($this->is_pro_incompatible()) {
311
+ $pro_modules = array(
312
+ 'photocrati-comments',
313
+ 'photocrati-galleria',
314
+ 'photocrati-nextgen_pro_slideshow',
315
+ 'photocrati-nextgen_pro_horizontal_filmstrip',
316
+ 'photocrati-nextgen_pro_thumbnail_grid',
317
+ 'photocrati-nextgen_pro_blog_gallery',
318
+ 'photocrati-nextgen_pro_film',
319
+ 'photocrati-nextgen_pro_masonry',
320
+ 'photocrati-nextgen_pro_albums',
321
+ 'photocrati-nextgen_pro_lightbox',
322
+ 'photocrati-nextgen_pro_lightbox_legacy',
323
+ 'photocrati-nextgen_pro_ecommerce',
324
+ 'photocrati-paypal_express_checkout',
325
+ 'photocrati-paypal_standard',
326
+ 'photocrati-stripe'
327
+ );
328
+ foreach ($pro_modules as $mod) $this->_registry->blacklist_module_file($mod);
329
+ }
330
+
331
+ // Load embedded products. Each product is expected to load any
332
+ // modules required
333
+ $this->_registry->add_module_path(NGG_PRODUCT_DIR, 2, false);
334
+ $this->_registry->load_all_products();
335
+
336
+ // Give third-party plugins that opportunity to include their own products
337
+ // and modules
338
+ do_action('load_nextgen_gallery_modules', $this->_registry);
339
+
340
+ // Initializes all loaded modules
341
+ $this->_registry->initialize_all_modules();
342
+
343
+ $this->_pope_loaded = TRUE;
344
+ }
345
+
346
+ function is_pro_compatible()
347
+ {
348
+ $retval = TRUE;
349
+
350
+ if (defined('NEXTGEN_GALLERY_PRO_VERSION')) $retval = FALSE;
351
+ if (defined('NEXTGEN_GALLERY_PRO_PLUGIN_BASENAME') && !defined('NGG_PRO_PLUGIN_VERSION')) $retval = FALSE; // 1.0 - 1.0.6
352
+ if (defined('NGG_PRO_PLUGIN_VERSION') && version_compare(NGG_PRO_PLUGIN_VERSION, $this->minimum_ngg_pro_version) < 0) $retval = FALSE;
353
+ if (defined('NGG_PLUS_PLUGIN_VERSION') && version_compare(NGG_PLUS_PLUGIN_VERSION, $this->minimum_ngg_plus_version) < 0) $retval = FALSE;
354
+
355
+ return $retval;
356
+ }
357
+
358
+ function is_pro_incompatible()
359
+ {
360
+ return !$this->is_pro_compatible();
361
+ }
362
+
363
+ function render_incompatibility_warning()
364
+ {
365
+ echo '<div class="updated error"><p>';
366
+ echo esc_html(
367
+ sprintf(
368
+ __("NextGEN Gallery %s is incompatible with this version of NextGEN Pro. Please update NextGEN Pro to version %s or higher to restore NextGEN Pro functionality.",
369
+ 'nggallery'
370
+ ),
371
+ NGG_PLUGIN_VERSION, $this->minimum_ngg_pro_version
372
+ ));
373
+ echo '</p></div>';
374
+ }
375
+
376
+ public function render_jquery_wp_55_warning()
377
+ {
378
+ $render = false;
379
+ global $wp_version;
380
+
381
+ if (defined('NGG_PRO_PLUGIN_VERSION') && version_compare(NGG_PRO_PLUGIN_VERSION, '3.1') < 0)
382
+ {
383
+ $render = TRUE;
384
+ $message = __("Your version of NextGEN Pro is known to have some issues with NextGEN Gallery 3.4 and later.", 'nggallery');
385
+ $account_msg = preg_match("#photocrati#i", wp_get_theme()->get('Name'))
386
+ ? sprintf(__("Please download the latest version of NextGEN Pro from your <a href='%s' target='_blank'>account area</a>", 'nggallery'), 'https://members.photocrati.com/account/')
387
+ : sprintf(__("Please download the latest version of NextGEN Pro from your <a href='%s' target='_blank'>account area</a>", 'nggallery'), 'https://www.imagely.com/account/');
388
+ }
389
+
390
+ if (defined('NGG_PLUS_PLUGIN_VERSION') && version_compare(NGG_PLUS_PLUGIN_VERSION, '1.7') < 0)
391
+ {
392
+ $render = TRUE;
393
+ $message = __("Your version of NextGEN Plus is known to have some issues with NextGEN Gallery 3.4 and later.", 'nggallery');
394
+ $account_msg = preg_match("#photocrati#i", wp_get_theme()->get('Name'))
395
+ ? sprintf(__("Please download the latest version of NextGEN Plus from your <a href='%s' target='_blank'>account area</a>", 'nggallery'), 'https://members.photocrati.com/account/')
396
+ : sprintf(__("Please download the latest version of NextGEN Plus from your <a href='%s' target='_blank'>account area</a>", 'nggallery'), 'https://www.imagely.com/account/');
397
+ }
398
+
399
+ if (!$render)
400
+ return;
401
+
402
+ print '<div class="updated error"><p>';
403
+ print $message;
404
+ print ' ';
405
+ print $account_msg;
406
+
407
+ if ( version_compare( $wp_version, '5.5', '>=' ) && version_compare( $wp_version, '5.5.9', '<=') ) {
408
+ $note = __("NOTE: The autoupdater doesn't work on the version of WordPress you have installed.", 'ngallery');
409
+ print "<div style='font-weight: bold;'>";
410
+ print $note;
411
+ print "</div>";
412
+ }
413
+ print '</p></div>';
414
+ }
415
+
416
+
417
+ /**
418
+ * Registers hooks for the WordPress framework necessary for instantiating
419
+ * the plugin
420
+ */
421
+ function _register_hooks()
422
+ {
423
+ // Register the (de)activation routines
424
+ add_action('deactivate_' . NGG_PLUGIN_BASENAME, array(get_class(), 'deactivate'));
425
+ add_action('activate_' . NGG_PLUGIN_BASENAME, array(get_class(), 'activate'), -10);
426
+
427
+ // Handle activation redirect to overview page
428
+ add_action('init', array($this, 'handle_activation_redirect'));
429
+
430
+ // Ensure that settings manager is saved as an array
431
+ add_filter('pre_update_option_' . $this->_settings_option_name, array($this, 'persist_settings'));
432
+ add_filter('pre_update_site_option_' . $this->_settings_option_name, array($this, 'persist_settings'));
433
+
434
+ // Delete displayed gallery transients periodically
435
+ if (NGG_CRON_ENABLED) {
436
+ add_filter('cron_schedules', array(&$this, 'add_ngg_schedule'));
437
+ add_action('ngg_delete_expired_transients', array($this, 'delete_expired_transients'));
438
+ add_action('wp', array(&$this, 'schedule_cron_jobs'));
439
+ }
440
+
441
+ // Update modules
442
+ add_action('init', array(&$this, 'update'), PHP_INT_MAX-2);
443
+
444
+ // Start the plugin!
445
+ add_action('init', array(&$this, 'route'), 11);
446
+
447
+ // Flush pope cache
448
+ add_action('init', array(&$this, 'flush_pope_cache'));
449
+
450
+ // NGG extension plugins should be loaded in a specific order
451
+ add_action('shutdown', array(&$this, 'fix_loading_order'));
452
+
453
+ // Display a warning if an compatible version of NextGEN Pro is installed alongside this version of NextGEN Gallery
454
+ if ($this->is_pro_incompatible()) {
455
+ add_filter('http_request_args', array($this, 'fix_autoupdate_api_requests'), 10, 2);
456
+ add_action('all_admin_notices', array($this, 'render_incompatibility_warning'));
457
+ }
458
+
459
+ add_action('all_admin_notices', [$this, 'render_jquery_wp_55_warning']);
460
+ }
461
+
462
+ function handle_activation_redirect()
463
+ {
464
+ if (get_transient('ngg-activated')) {
465
+ delete_transient('ngg-activated');
466
+ wp_redirect(admin_url("?page=nextgen-gallery"));
467
+ }
468
+ }
469
+
470
+ function fix_autoupdate_api_requests($args, $url)
471
+ {
472
+ // Is this an HTTP request to the licensing server?
473
+ if (preg_match("/api_act=/", $url)) {
474
+ $args['autoupdate'] = TRUE;
475
+
476
+ // If we're supposed to pass all Pro modules, then include them here
477
+ if (preg_match("/api_act=(ckups|cklic)/", $url) && isset($args['body']) && is_array($args['body']) && isset($args['body']['module-list'])) {
478
+ $pro_modules = array(
479
+ 'photocrati-comments',
480
+ 'photocrati-galleria',
481
+ 'photocrati-nextgen_pro_slideshow',
482
+ 'photocrati-nextgen_pro_horizontal_filmstrip',
483
+ 'photocrati-nextgen_pro_thumbnail_grid',
484
+ 'photocrati-nextgen_pro_blog_gallery',
485
+ 'photocrati-nextgen_pro_film',
486
+ 'photocrati-nextgen_pro_masonry',
487
+ 'photocrati-nextgen_pro_albums',
488
+ 'photocrati-auto_update',
489
+ 'photocrati-auto_update-admin',
490
+ 'photocrati-nextgen_pro_lightbox',
491
+ 'photocrati-nextgen_pro_lightbox_legacy',
492
+ 'photocrati-nextgen_pro_ecommerce',
493
+ 'photocrati-paypal_express_checkout',
494
+ 'photocrati-paypal_standard',
495
+ 'photocrati-stripe'
496
+ );
497
+ foreach ($pro_modules as $mod) {
498
+ if (!isset($args['body']['module-list'][$mod])) $args['body']['module-list'][$mod] = '0.1';
499
+ }
500
+ }
501
+ }
502
+ return $args;
503
+ }
504
+
505
+ function flush_pope_cache()
506
+ {
507
+ if (is_user_logged_in() && current_user_can('manage_options') && isset($_REQUEST['ngg_flush_pope_cache'])) {
508
+ C_Pope_Cache::get_instance()->flush();
509
+ print "Flushed pope cache";
510
+ exit;
511
+ }
512
+ }
513
+
514
+ function schedule_cron_jobs()
515
+ {
516
+ if (!wp_next_scheduled('ngg_delete_expired_transients')) {
517
+ wp_schedule_event(time(), 'ngg_custom', 'ngg_delete_expired_transients');
518
+ }
519
+ }
520
+
521
+ /**
522
+ * Defines a new cron schedule
523
+ * @param $schedules
524
+ * @return mixed
525
+ */
526
+ function add_ngg_schedule($schedules)
527
+ {
528
+ $schedules['ngg_custom'] = array(
529
+ 'interval' => NGG_CRON_SCHEDULE,
530
+ 'display' => sprintf(__('Every %d seconds', 'nggallery'), NGG_CRON_SCHEDULE)
531
+ );
532
+
533
+ return $schedules;
534
+ }
535
+
536
+
537
+ /**
538
+ * Flush all expires transients created by the plugin
539
+ */
540
+ function delete_expired_transients()
541
+ {
542
+ C_Photocrati_Transient_Manager::get_instance()->flush_expired();
543
+ }
544
+
545
+ /**
546
+ * Ensure that C_Photocrati_Settings_Manager gets persisted as an array
547
+ * @param C_Photocrati_Settings_Manager_Base|array $settings
548
+ * @return array
549
+ */
550
+ function persist_settings($settings = array())
551
+ {
552
+ if (is_object($settings) && $settings instanceof C_Photocrati_Settings_Manager_Base) {
553
+ $settings = $settings->to_array();
554
+ }
555
+ return $settings;
556
+ }
557
+
558
+ /**
559
+ * Updates all modules
560
+ */
561
+ function update()
562
+ {
563
+ if ((!(defined('DOING_AJAX') && DOING_AJAX)) && !isset($_REQUEST['doing_wp_cron'])) {
564
+
565
+ $this->_load_pope();
566
+
567
+ // Try updating all modules
568
+ C_Photocrati_Installer::update();
569
+ }
570
+ }
571
+
572
+ /**
573
+ * Routes access points using the Pope Router
574
+ * @return boolean
575
+ */
576
+ function route()
577
+ {
578
+ $this->_load_pope();
579
+ $router = C_Router::get_instance();
580
+
581
+ // Set context to path if subdirectory install
582
+ $parts = parse_url($router->get_base_url(FALSE));
583
+ $siteparts = parse_url(get_option('home'));
584
+
585
+ if (isset($parts['path']) && isset($siteparts['path']))
586
+ {
587
+ if (strpos($parts['path'], '/index.php') === FALSE)
588
+ {
589
+ $router->context = $siteparts['path'];
590
+ }
591
+ else {
592
+ $new_parts = explode('/index.php', $parts['path']);
593
+ if (!empty($new_parts[0]) && $new_parts[0] == $siteparts['path']) {
594
+ $router->context = array_shift($new_parts);
595
+ }
596
+ }
597
+ }
598
+
599
+ // Provide a means for modules/third-parties to configure routes
600
+ do_action_ref_array('ngg_routes', array(&$router));
601
+
602
+ // Serve the routes
603
+ if (!$router->serve_request() && $router->has_parameter_segments()) {
604
+ return $router->passthru();
605
+ }
606
+ }
607
+
608
+ function is_page_request()
609
+ {
610
+ return !(defined('DOING_AJAX') && DOING_AJAX) && !(defined('DOING_CRON') && DOING_CRON) && !(defined('NGG_AJAX_SLUG') && strpos($_SERVER['REQUEST_URI'], NGG_AJAX_SLUG) !== FALSE);
611
+ }
612
+
613
+ /**
614
+ * Run the uninstaller
615
+ */
616
+ public static function deactivate()
617
+ {
618
+ include_once('products/photocrati_nextgen/class.nextgen_product_installer.php');
619
+ C_Photocrati_Installer::add_handler(NGG_PLUGIN_BASENAME, 'C_NextGen_Product_Installer');
620
+ C_Photocrati_Installer::uninstall(NGG_PLUGIN_BASENAME);
621
+ }
622
+
623
+ public static function set_role_caps()
624
+ {
625
+ // Set the capabilities for the administrator
626
+ $role = get_role('administrator');
627
+
628
+ if (!$role)
629
+ {
630
+ if (!class_exists('WP_Roles'))
631
+ include_once(ABSPATH.'/wp-includes/class-wp-roles.php');
632
+ $roles = new WP_Roles();
633
+ $roles->init_roles();
634
+ }
635
+
636
+ // We need this role, no other chance
637
+ $role = get_role('administrator');
638
+ if (!$role)
639
+ {
640
+ update_option("ngg_init_check", __('Sorry, NextGEN Gallery works only with a role called administrator',"nggallery"));
641
+ return;
642
+ }
643
+
644
+ delete_option("ngg_init_check");
645
+
646
+ $capabilities = array(
647
+ 'NextGEN Attach Interface',
648
+ 'NextGEN Change options',
649
+ 'NextGEN Change style',
650
+ 'NextGEN Edit album',
651
+ 'NextGEN Gallery overview',
652
+ 'NextGEN Manage gallery',
653
+ 'NextGEN Manage others gallery',
654
+ 'NextGEN Manage tags',
655
+ 'NextGEN Upload images',
656
+ 'NextGEN Use TinyMCE'
657
+ );
658
+
659
+ foreach ($capabilities as $capability) {
660
+ $role->add_cap($capability);
661
+ }
662
+ }
663
+
664
+ public static function activate()
665
+ {
666
+ self::set_role_caps();
667
+
668
+ set_transient('ngg-activated', time(), 30);
669
+ }
670
+
671
+ /**
672
+ * Defines necessary plugins for the plugin to load correctly
673
+ */
674
+ function _define_constants()
675
+ {
676
+ define('NGG_PLUGIN', basename($this->directory_path()));
677
+ define('NGG_PLUGIN_BASENAME', plugin_basename(__FILE__));
678
+ define('NGG_PLUGIN_DIR', plugin_dir_path(__FILE__));
679
+ define('NGG_PLUGIN_URL', $this->path_uri());
680
+ define('NGG_TESTS_DIR', implode(DIRECTORY_SEPARATOR, array(rtrim(NGG_PLUGIN_DIR, "/\\"), 'tests')));
681
+ define('NGG_PRODUCT_DIR', implode(DIRECTORY_SEPARATOR, array(rtrim(NGG_PLUGIN_DIR, "/\\"), 'products')));
682
+ define('NGG_MODULE_DIR', implode(DIRECTORY_SEPARATOR, array(rtrim(NGG_PRODUCT_DIR, "/\\"), 'photocrati_nextgen', 'modules')));
683
+ define('NGG_PRODUCT_URL', path_join(str_replace("\\" , '/', NGG_PLUGIN_URL), 'products'));
684
+ define('NGG_MODULE_URL', path_join(str_replace("\\", '/', NGG_PRODUCT_URL), 'photocrati_nextgen/modules'));
685
+ define('NGG_PLUGIN_STARTED_AT', microtime());
686
+ define('NGG_PLUGIN_VERSION', '3.29');
687
+
688
+ define(
689
+ 'NGG_SCRIPT_VERSION',
690
+ defined('SCRIPT_DEBUG') && SCRIPT_DEBUG
691
+ ? (string)mt_rand(0, mt_getrandmax())
692
+ : NGG_PLUGIN_VERSION
693
+ );
694
+
695
+ // Should we display NGG debugging information?
696
+ if (!defined('NGG_DEBUG')) {
697
+ define('NGG_DEBUG', FALSE);
698
+ }
699
+ self::$debug = NGG_DEBUG;
700
+
701
+ // User definable constants
702
+ if (!defined('NGG_IMPORT_ROOT')) {
703
+ $path = WP_CONTENT_DIR;
704
+ if (defined('NEXTGEN_GALLERY_IMPORT_ROOT')) {
705
+ $path = NEXTGEN_GALLERY_IMPORT_ROOT;
706
+ }
707
+ define('NGG_IMPORT_ROOT', $path);
708
+ }
709
+
710
+ // Should the Photocrati cache be enabled
711
+ if (!defined('PHOTOCRATI_CACHE')) {
712
+ define('PHOTOCRATI_CACHE', TRUE);
713
+ }
714
+ if (!defined('PHOTOCRATI_CACHE_TTL')) {
715
+ define('PHOTOCRATI_CACHE_TTL', 1800);
716
+ }
717
+
718
+ // Cron job
719
+ if (!defined('NGG_CRON_SCHEDULE')) {
720
+ define('NGG_CRON_SCHEDULE', 900);
721
+ }
722
+
723
+ if (!defined('NGG_CRON_ENABLED')) {
724
+ define('NGG_CRON_ENABLED', TRUE);
725
+ }
726
+
727
+ // Don't enforce interfaces
728
+ if (!defined('EXTENSIBLE_OBJECT_ENFORCE_INTERFACES')) {
729
+ define('EXTENSIBLE_OBJECT_ENFORCE_INTERFACES', FALSE);
730
+ }
731
+
732
+ // Use Pope's new caching mechanism?
733
+ if (!defined('NGG_POPE_CACHE')) {
734
+ define('NGG_POPE_CACHE', FALSE);
735
+ }
736
+
737
+ // Where are galleries restricted to?
738
+ if (!defined('NGG_GALLERY_ROOT_TYPE')) {
739
+ define('NGG_GALLERY_ROOT_TYPE', 'site'); // "content" is the other possible value
740
+ }
741
+
742
+ // Define what file extensions and mime are accepted, with optional WebP
743
+ $default_extensions_list = 'jpeg,jpg,png,gif';
744
+ $default_mime_list = 'image/gif,image/jpg,image/jpeg,image/pjpeg,image/png';
745
+ if (function_exists('imagewebp'))
746
+ {
747
+ $default_extensions_list .= ',webp';
748
+ $default_mime_list .= ',image/webp';
749
+ }
750
+
751
+ if (!defined('NGG_DEFAULT_ALLOWED_FILE_TYPES'))
752
+ define('NGG_DEFAULT_ALLOWED_FILE_TYPES', $default_extensions_list);
753
+
754
+ if (!defined('NGG_DEFAULT_ALLOWED_MIME_TYPES'))
755
+ define('NGG_DEFAULT_ALLOWED_MIME_TYPES', $default_mime_list);
756
+
757
+ add_filter('ngg_allowed_file_types', function($string) {
758
+ return explode(',', $string);
759
+ }, -10);
760
+
761
+ add_filter('ngg_allowed_mime_types', function($string) {
762
+ return explode(',', $string);
763
+ }, -10);
764
+ }
765
+
766
+ /**
767
+ * Returns the path to a file within the plugin root folder
768
+ *
769
+ * @param string $file_name
770
+ * @return string
771
+ */
772
+ function file_path($file_name = NULL)
773
+ {
774
+ $path = dirname(__FILE__);
775
+ if ($file_name != null)
776
+ $path .= '/' . $file_name;
777
+
778
+ return str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $path);
779
+ }
780
+
781
+ /**
782
+ * Gets the directory path used by the plugin
783
+ *
784
+ * @param string|null $dir (optional)
785
+ * @return string
786
+ */
787
+ function directory_path($dir = NULL)
788
+ {
789
+ return $this->file_path($dir);
790
+ }
791
+
792
+ /**
793
+ * Determine the path to the NGG directory.
794
+ *
795
+ * @TODO Remove this, it's silly.
796
+ * @return string
797
+ */
798
+ function path_uri()
799
+ {
800
+ // Note: paths could not match but STILL being contained in the theme (i.e. WordPress returns the wrong path for the theme directory, either with wrong formatting or wrong encoding)
801
+ $base = basename(dirname(__FILE__));
802
+
803
+ // This is needed when using symlinks, if the user renames the plugin folder everything will break though
804
+ if ($base != 'nextgen-gallery')
805
+ $base = 'nextgen-gallery';
806
+
807
+ $uri = plugins_url($base);
808
+
809
+ return $uri;
810
+ }
811
+ }
812
+
813
+ new C_NextGEN_Bootstrap();
nextgen-gallery/non_pope/class.nextgen_serializable.php ADDED
@@ -0,0 +1,86 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class C_NextGen_Serializable
4
+ {
5
+ /**
6
+ * Serializes the data
7
+ *
8
+ * @param mixed $value
9
+ * @return string
10
+ */
11
+ public static function serialize($value)
12
+ {
13
+ // Try encoding using JSON. It's usually Unicode safe but still, sometimes trips over things
14
+ $serialized = @json_encode($value);
15
+
16
+ if (!$serialized)
17
+ {
18
+ $serialized = preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x9F]/u', '', $value);
19
+ $serialized = @json_encode($serialized);
20
+ }
21
+
22
+ // Using json_encode here because PHP's serialize is not Unicode safe
23
+ return base64_encode($serialized);
24
+ }
25
+
26
+ /**
27
+ * Unserializes data using our proprietary format
28
+ *
29
+ * @throws Exception This method will not unserialize any objects
30
+ * @param string $value
31
+ * @return mixed
32
+ */
33
+ public static function unserialize($value)
34
+ {
35
+ $retval = NULL;
36
+ if (is_string($value))
37
+ {
38
+ $retval = stripcslashes($value);
39
+
40
+ if (strlen($value) > 1)
41
+ {
42
+ // We can't always rely on base64_decode() or json_decode() to return FALSE as their documentation
43
+ // claims so check if $retval begins with a: as that indicates we have a serialized PHP object.
44
+ if (strpos($retval, 'a:') === 0)
45
+ {
46
+ if (self::check_for_serialized_objects($value))
47
+ throw new Exception(__("NextGen Gallery will not unserialize data with objects", 'nextgen_gallery'));
48
+
49
+ // Record this for later
50
+ $er = error_reporting(0);
51
+
52
+ // The second parameter was added by PHP 7.0
53
+ if (version_compare(phpversion(), '7.0', '>=')) {
54
+ $retval = unserialize($value, array('allowed_classes' => FALSE));
55
+ }
56
+ else {
57
+ $retval = unserialize($value);
58
+ }
59
+
60
+ // Restore error reporting level
61
+ error_reporting($er);
62
+ }
63
+ else {
64
+ // We use json_decode() here because PHP's unserialize() is not Unicode safe.
65
+ $retval = json_decode(base64_decode($retval), TRUE);
66
+ }
67
+ }
68
+ }
69
+
70
+ return $retval;
71
+ }
72
+
73
+ /**
74
+ * Determines if a string may hold a serialized PHP object
75
+ *
76
+ * @param $string
77
+ * @return bool
78
+ */
79
+ public static function check_for_serialized_objects($string)
80
+ {
81
+ if (!is_string($string))
82
+ return false;
83
+ $string = trim($string);
84
+ return (bool)preg_match("/(O|C):\+?[0-9]+:/is", $string);
85
+ }
86
+ }
nextgen-gallery/non_pope/class.nextgen_settings.php ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ if (!class_exists('C_NextGen_Settings'))
4
+ {
5
+ class C_NextGen_Settings
6
+ {
7
+ /**
8
+ * @return C_Photocrati_Settings_Manager
9
+ */
10
+ static function get_instance()
11
+ {
12
+ return C_Photocrati_Settings_Manager::get_instance();
13
+ }
14
+ }
15
+ }
16
+
17
+ if (!class_exists('C_NextGen_Global_Settings'))
18
+ {
19
+ class C_NextGen_Global_Settings extends C_NextGen_Settings
20
+ {
21
+ static function get_instance()
22
+ {
23
+ if (is_multisite())
24
+ return C_Photocrati_Global_Settings_Manager::get_instance();
25
+ else
26
+ return C_Photocrati_Settings_Manager::get_instance();
27
+ }
28
+ }
29
+ }
nextgen-gallery/non_pope/class.nextgen_shortcode_manager.php ADDED
@@ -0,0 +1,342 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Class C_NextGen_Shortcode_Manager
5
+ *
6
+ * NGG registers it's shortcodes using C_NextGen_Shortcode_Manager::add($tag, $callback)
7
+ *
8
+ * We do this for the following reason:
9
+ *
10
+ * NGG is used with a wide variety of third-party themes and plugins. Some of which, do things
11
+ * a little unorthadox, and end up modifying the markup generated by the shortcode, which breaks
12
+ * the display for our users.
13
+ *
14
+ * Rather than having to explain to our userbase, "you shouldn't use NGG with [plugin x]", we
15
+ * decided to find a mechanism that would make our plugin immune from such manipulation from other
16
+ * plugins, or at least reduce likelihood of such a thing happening.
17
+ *
18
+ * This is how the mechanism works:
19
+ *
20
+ * When you register a shortcode using C_NextGen_Shortcode_Manager::add(), we store a reference to
21
+ * the callback internally, but add the shortcode will actually call one of the internal methods of
22
+ * this class which outputs a placeholder (@see $_privateholder_text) instead of the markup generated
23
+ * by the callback. It's just a simple string and something that a third-party plugin is unlikely to
24
+ * manipulate in any way.
25
+ *
26
+ * We then register a filter for the_content, at high a priority of PHP_INT_MAX as an attempt to make
27
+ * our hook be the last hook to be executed. This hook then substitutes the placeholders with the markup
28
+ * generated by the shortcode's callback that was provided in C_NextGen_Shortcode_Manager::add()
29
+ *
30
+ */
31
+ class C_NextGen_Shortcode_Manager
32
+ {
33
+ private static $_instance = NULL;
34
+ private $_shortcodes = array();
35
+ private $_found = array();
36
+ private $_placeholder_text = 'ngg_shortcode_%d_placeholder';
37
+
38
+ /**
39
+ * Gets an instance of the class
40
+ * @return C_NextGen_Shortcode_Manager
41
+ */
42
+ static function get_instance()
43
+ {
44
+ if (is_null(self::$_instance)) {
45
+ $klass = get_class();
46
+ self::$_instance = new $klass;
47
+ }
48
+ return self::$_instance;
49
+ }
50
+
51
+ /**
52
+ * Adds a shortcode
53
+ * @param $name
54
+ * @param $callback
55
+ * @param callable|null Parameters transformer
56
+ */
57
+ static function add($name, $callback, $transformer = NULL)
58
+ {
59
+ $manager = self::get_instance();
60
+ $manager->add_shortcode($name, $callback, $transformer);
61
+ }
62
+
63
+ /**
64
+ * @return string[]
65
+ */
66
+ public function get_shortcodes()
67
+ {
68
+ return $this->_shortcodes;
69
+ }
70
+
71
+ /**
72
+ * Removes a previously added shortcode
73
+ * @param $name
74
+ */
75
+ static function remove($name)
76
+ {
77
+ $manager = self::get_instance();
78
+ $manager->remove_shortcode($name);
79
+ }
80
+
81
+ /**
82
+ * Returns whether NGG_DISABLE_SHORTCODE_MANAGER is defined and TRUE.
83
+ *
84
+ * @return bool
85
+ */
86
+ public function is_disabled()
87
+ {
88
+ return defined('NGG_DISABLE_SHORTCODE_MANAGER') && NGG_DISABLE_SHORTCODE_MANAGER;
89
+ }
90
+
91
+ private function __construct()
92
+ {
93
+ // For theme & plugin compatibility and to prevent the output of our shortcodes from being
94
+ // altered we substitute our shortcodes with placeholders at the start of the the_content() filter
95
+ // queue and then at the end of the the_content() queue, we substitute the placeholders with our
96
+ // actual markup. Optionally this can be disabled by defining NGG_DISABLE_SHORTCODE_MANAGER to TRUE.
97
+ if (!$this->is_disabled())
98
+ {
99
+ add_filter('the_content', [$this, 'fix_nested_shortcodes'], -1);
100
+ add_filter('the_content', [$this, 'parse_content'], PHP_INT_MAX);
101
+ add_filter('widget_text', [$this, 'fix_nested_shortcodes'], -1);
102
+ }
103
+ }
104
+
105
+ /**
106
+ * We're parsing our own shortcodes because WP can't yet handle nested shortcodes
107
+ * [ngg param="[slideshow]"]
108
+ * @param string $content
109
+ * @return string
110
+ */
111
+ function fix_nested_shortcodes($content)
112
+ {
113
+ // Try to find each registered shortcode in the content
114
+ foreach ($this->_shortcodes as $tag => $tag_details) {
115
+ $shortcode_start_tag = "[{$tag}";
116
+ $offset = 0;
117
+
118
+ // Find each occurance of the shortcode
119
+ while(($start_of_shortcode = strpos($content, $shortcode_start_tag, $offset)) !== FALSE) {
120
+ $index = $start_of_shortcode + strlen($shortcode_start_tag);
121
+ $found_attribute_assignment = FALSE;
122
+ $current_attribute_enclosure = NULL;
123
+ $last_found_char = '';
124
+ $content_length = strlen($content) - 1;
125
+
126
+ while (TRUE) {
127
+ // Parse out the shortcode, character-by-character
128
+ $char = $content[$index];
129
+ if ($char == '"' || $char == "'" && $last_found_char == '=') {
130
+ // Is this the closing quote for an already found attribute assignment?
131
+ if ($found_attribute_assignment && $current_attribute_enclosure == $char) {
132
+ $found_attribute_assignment = FALSE;
133
+ $current_attribute_enclosure = NULL;
134
+ } else {
135
+ $found_attribute_assignment = TRUE;
136
+ $current_attribute_enclosure = $char;
137
+ }
138
+ }
139
+ else if ($char == ']') {
140
+ // we've found a shortcode closing tag. But, we need to ensure
141
+ // that this ] isn't within the value of a shortcode attribute
142
+ if (!$found_attribute_assignment) {
143
+ break; //exit loop - we've found the shortcode
144
+ }
145
+ }
146
+
147
+ $last_found_char = $char;
148
+
149
+ // Prevent infinite loops in our while(TRUE)
150
+ if ($index == $content_length)
151
+ break;
152
+
153
+ $index++;
154
+ }
155
+
156
+ // Get the shortcode
157
+ $shortcode = substr($content, $start_of_shortcode+1, --$index-$start_of_shortcode);
158
+ $shortcode_replacement = str_replace(
159
+ array('[', ']'), array('&#91;', '&#93;'), $shortcode
160
+ );
161
+
162
+ // Replace the shortcode with one that doesn't have nested shortcodes
163
+ $content = str_replace(
164
+ $shortcode,
165
+ $shortcode_replacement,
166
+ $content
167
+ );
168
+
169
+ // Calculate the offset for the next loop iteration
170
+ $offset = $index+1+strlen($shortcode_replacement)-strlen($shortcode);
171
+ }
172
+ }
173
+ reset($this->_shortcodes);
174
+
175
+ return $content;
176
+ }
177
+
178
+ /**
179
+ * Deactivates all shortcodes
180
+ */
181
+ function deactivate_all()
182
+ {
183
+ foreach (array_keys($this->_shortcodes) as $shortcode) {
184
+ $this->deactivate($shortcode);
185
+ }
186
+ }
187
+
188
+ /**
189
+ * Parses the content for shortcodes and returns the substituted content
190
+ * @param $content
191
+ * @return string
192
+ */
193
+ function parse_content($content)
194
+ {
195
+ $regex = str_replace('%d', '(\d+)', $this->_placeholder_text);
196
+
197
+ if ($this->is_rest_request()) ob_start();
198
+
199
+ if (preg_match_all("/{$regex}/m", $content, $matches, PREG_SET_ORDER)) {
200
+ foreach ($matches as $match) {
201
+ $placeholder = array_shift($match);
202
+ $id = array_shift($match);
203
+ $content = str_replace($placeholder, $this->execute_found_shortcode($id), $content);
204
+ }
205
+ }
206
+
207
+ if ($this->is_rest_request())
208
+ {
209
+ // Pre-generating displayed gallery cache by executing shortcodes in the REST API can prevent users
210
+ // from being able to add and save blocks with lots of images and no pagination (for example a very large
211
+ // basic slideshow or pro masonry / mosaic / tile display)
212
+ if (apply_filters('ngg_disable_shortcodes_in_request_api', FALSE))
213
+ return $content;
214
+ ob_start();
215
+ }
216
+
217
+ return $content;
218
+ }
219
+
220
+ function render_legacy_shortcode($params, $inner_content)
221
+ {
222
+ return C_Displayed_Gallery_Renderer::get_instance()->display_images($params, $inner_content);
223
+ }
224
+
225
+ function execute_found_shortcode($found_id)
226
+ {
227
+ return isset($this->_found[$found_id])
228
+ ? $this->render_shortcode(
229
+ $this->_found[$found_id]['shortcode'],
230
+ $this->_found[$found_id]['params'],
231
+ $this->_found[$found_id]['inner_content']
232
+ )
233
+ : "Invalid shortcode";
234
+ }
235
+
236
+ /**
237
+ * Adds a shortcode
238
+ * @param $name
239
+ * @param $callback
240
+ * @param callable|null $transformer
241
+ */
242
+ function add_shortcode($name, $callback, $transformer = NULL)
243
+ {
244
+ $this->_shortcodes[$name] = ['callback' => $callback, 'transformer' => $transformer];
245
+
246
+ if ($this->is_disabled())
247
+ // Because render_shortcode() is a wrapper to several shortcodes it requires the $name parameter and can't be passed directly to add_shortcode()
248
+ add_shortcode($name, function($params, $inner_content) use ($name) {
249
+ return $this->render_shortcode($name, $params, $inner_content);
250
+ });
251
+ else
252
+ add_shortcode($name, array($this, $name . '____wrapper'));
253
+ }
254
+
255
+ /**
256
+ * Removes a shortcode
257
+ * @param $name
258
+ */
259
+ function remove_shortcode($name)
260
+ {
261
+ unset($this->_shortcodes[$name]);
262
+ $this->deactivate($name);
263
+ }
264
+
265
+ /**
266
+ * De-activates a shortcode
267
+ * @param $shortcode
268
+ */
269
+ function deactivate($shortcode)
270
+ {
271
+ if (isset($this->_shortcodes[$shortcode]))
272
+ remove_shortcode($shortcode);
273
+ }
274
+
275
+ function is_rest_request()
276
+ {
277
+ return defined('REST_REQUEST') || strpos($_SERVER['REQUEST_URI'], 'wp-json') !== FALSE;
278
+ }
279
+
280
+ function __call($method, $args)
281
+ {
282
+ $params = array_shift($args);
283
+ $inner_content = array_shift($args);
284
+ $parts = explode('____', $method);
285
+ $shortcode = array_shift($parts);
286
+
287
+ if (doing_filter('the_content') && !doing_filter('widget_text'))
288
+ {
289
+ $retval = $this->replace_with_placeholder($shortcode, $params, $inner_content);
290
+ }
291
+ else {
292
+ // For widgets, don't use placeholders
293
+ return $this->render_shortcode($shortcode, $params, $inner_content);
294
+ }
295
+
296
+ return $retval;
297
+
298
+ }
299
+
300
+ function render_shortcode($shortcode, $params=[], $inner_content='')
301
+ {
302
+ if (isset($this->_shortcodes[$shortcode]))
303
+ {
304
+ $shortcode = $this->_shortcodes[$shortcode];
305
+
306
+ if (is_callable($shortcode['transformer']))
307
+ $params = call_user_func($shortcode['transformer'], $params);
308
+
309
+ $method = (is_null($shortcode['callback']) && is_callable($shortcode['transformer'])) ? [$this, 'render_legacy_shortcode'] : $shortcode['callback'];
310
+
311
+ $retval = call_user_func($method, $params, $inner_content);
312
+ }
313
+ else {
314
+ $retval = "Invalid shortcode";
315
+ }
316
+
317
+ return $retval;
318
+ }
319
+
320
+ function replace_with_placeholder($shortcode, $params=array(), $inner_content='')
321
+ {
322
+ $id = count($this->_found);
323
+ $this->_found[$id] = array(
324
+ 'shortcode' => $shortcode,
325
+ 'params' => $params,
326
+ 'inner_content' => $inner_content
327
+ );
328
+
329
+ $placeholder = sprintf($this->_placeholder_text, $id); // try to wptexturize this! ha!
330
+
331
+ return apply_filters('ngg_shortcode_placeholder', $placeholder, $shortcode, $params, $inner_content);
332
+ }
333
+
334
+ /**
335
+ * @return string
336
+ */
337
+ public function get_shortcode_regex()
338
+ {
339
+ $keys = array_keys($this->_shortcodes);
340
+ return '/' . get_shortcode_regex($keys) . '/';
341
+ }
342
+ }
nextgen-gallery/non_pope/class.photocrati_installer.php ADDED
@@ -0,0 +1,309 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Class C_Gallery_Display_Installer
5
+ *
6
+ * This is a class added to 2.0.68 for compatiblity reasons, and can be removed after NextGEN Pro 2.2 is released
7
+ */
8
+ class C_Gallery_Display_Installer
9
+ {
10
+ static $_proxy = NULL;
11
+
12
+ function get_proxy()
13
+ {
14
+ if (!self::$_proxy) {
15
+ self::$_proxy = new C_Display_Type_Installer;
16
+ }
17
+ return self::$_proxy;
18
+ }
19
+
20
+ function install($reset=FALSE)
21
+ {
22
+ $this->get_proxy()->install($reset);
23
+ }
24
+
25
+ function uninstall()
26
+ {
27
+ $this->get_proxy()->uninstall();
28
+ }
29
+
30
+
31
+ function __call($method, $args)
32
+ {
33
+ $klass = new ReflectionMethod($this->get_proxy(), $method);
34
+ return $klass->invokeArgs($this->get_proxy(), $args);
35
+ }
36
+ }
37
+
38
+ if (!class_exists('C_Photocrati_Installer'))
39
+ {
40
+ class C_Photocrati_Installer
41
+ {
42
+ static $_instance = NULL;
43
+
44
+ /**
45
+ * @return C_Photocrati_Installer
46
+ */
47
+ static function get_instance()
48
+ {
49
+ if (is_null(self::$_instance)) {
50
+ $klass = get_class();
51
+ self::$_instance = new $klass();
52
+ }
53
+ return self::$_instance;
54
+ }
55
+
56
+ /**
57
+ * Each product and module will register it's own handler (a class, with an install() and uninstall() method)
58
+ * to be used for install/uninstall routines
59
+ * @param $name
60
+ * @param $handler
61
+ */
62
+ static function add_handler($name, $handler)
63
+ {
64
+ self::get_instance()->_installers[$name] = $handler;
65
+ }
66
+
67
+ /**
68
+ * Gets an instance of an installation handler
69
+ * @param $name
70
+ * @return mixed
71
+ */
72
+ static function get_handler_instance($name)
73
+ {
74
+ $installers = $handler = self::get_instance()->_installers;
75
+ if (isset($installers[$name])) {
76
+ $klass = $installers[$name];
77
+ return new $klass;
78
+ }
79
+ else return NULL;
80
+ }
81
+
82
+
83
+ /**
84
+ * Uninstalls a product
85
+ * @param $product
86
+ * @param bool $hard
87
+ * @return mixed
88
+ */
89
+ static function uninstall($product, $hard=FALSE)
90
+ {
91
+ $handler = self::get_handler_instance($product);
92
+ if ($handler && method_exists($handler, 'uninstall')) return $handler->uninstall($hard);
93
+
94
+ if ($handler && $hard) {
95
+ C_NextGen_Settings::get_instance()->destroy();
96
+ C_NextGen_Global_Settings::get_instance()->destroy();
97
+ }
98
+ }
99
+
100
+ static function can_do_upgrade()
101
+ {
102
+ $proceed = FALSE;
103
+
104
+ // Proceed if no other process has started the installer routines
105
+ if (!($doing_upgrade = get_option('ngg_doing_upgrade', FALSE))) {
106
+ update_option('ngg_doing_upgrade', time());
107
+ $proceed = TRUE;
108
+ }
109
+
110
+ // Or, force proceeding if we have a stale ngg_doing_upgrade record
111
+ elseif ($doing_upgrade === TRUE OR time() - $doing_upgrade > 120) {
112
+ update_option('ngg_doing_upgrade', time());
113
+ $proceed = TRUE;
114
+ }
115
+ return $proceed;
116
+ }
117
+
118
+ static function done_upgrade()
119
+ {
120
+ delete_option('ngg_doing_upgrade');
121
+ }
122
+
123
+ static function update($reset=FALSE)
124
+ {
125
+ $local_settings = C_NextGen_Settings::get_instance();
126
+ $global_settings = C_NextGen_Global_Settings::get_instance();
127
+
128
+ // Somehow some installations are missing several default settings
129
+ // Because imgWidth is essential to know we do a 'soft' reset here
130
+ // by filling in any missing options from the default settings
131
+ $settings_installer = new C_NextGen_Settings_Installer();
132
+ if (!$global_settings->gallerypath) {
133
+ $global_settings->reset();
134
+ $settings_installer->install_global_settings();
135
+ $global_settings->save();
136
+ }
137
+ if (!$local_settings->imgWidth) {
138
+ $local_settings->reset();
139
+ $settings_installer->install_local_settings();
140
+ $local_settings->save();
141
+ }
142
+
143
+ // This is a specific hack/work-around/fix and can probably be removed sometime after 2.0.20's release
144
+ //
145
+ // NextGen 2x was not multisite compatible until 2.0.18. Users that upgraded before this
146
+ // will have nearly all of their settings stored globally (network wide) in wp_sitemeta. If
147
+ // pope_module_list (which should always be a local setting) exists site-wide we wipe the current
148
+ // global ngg_options and restore from defaults. This should only ever run once.
149
+ if (is_multisite() && isset($global_settings->pope_module_list))
150
+ {
151
+ // Setting this to TRUE will wipe current settings for display types, but also
152
+ // allows the display type installer to run correctly
153
+ $reset = TRUE;
154
+
155
+ $settings_installer = new C_NextGen_Settings_Installer();
156
+ $global_defaults = $settings_installer->get_global_defaults();
157
+
158
+ // Preserve the network options we honor by restoring them after calling $global_settings->reset()
159
+ $global_settings_to_keep = array();
160
+ foreach ($global_defaults as $key => $val) {
161
+ $global_settings_to_keep[$key] = $global_settings->$key;
162
+ }
163
+
164
+ // Resets internal options to an empty array
165
+ $global_settings->reset();
166
+
167
+ // Restore the defaults, then our saved values. This must be done again later because
168
+ // we've set $reset to TRUE.
169
+ $settings_installer->install_global_settings();
170
+ foreach ($global_settings_to_keep as $key => $val) {
171
+ $global_settings->$key = $val;
172
+ }
173
+ }
174
+
175
+ // Get last module list and current module list. Compare...
176
+ $last_module_list = self::_get_last_module_list($reset);
177
+ $current_module_list = self::_generate_module_info();
178
+ $diff = array_diff($current_module_list, $last_module_list);
179
+ $do_upgrade = (count($diff)>0 || count($last_module_list) != count($current_module_list));
180
+ $can_upgrade = $do_upgrade ? self::can_do_upgrade() : FALSE;
181
+ if ($can_upgrade && !$diff) $diff = $current_module_list;
182
+
183
+ if ($can_upgrade && $do_upgrade) {
184
+
185
+ // Clear APC cache
186
+ if (function_exists('apc_clear_cache')) {
187
+ @apc_clear_cache('opcode');
188
+ apc_clear_cache();
189
+ }
190
+
191
+ // Clear all of our transients
192
+ wp_cache_flush();
193
+ C_Photocrati_Transient_Manager::flush();
194
+
195
+ // Remove all NGG created cron jobs
196
+ self::refresh_cron();
197
+
198
+ // Delete auto-update cache
199
+ update_option('photocrati_auto_update_admin_update_list', null);
200
+ update_option('photocrati_auto_update_admin_check_date', '');
201
+
202
+ // Other Pope applications might be loaded, and therefore
203
+ // all singletons should be destroyed, so that they can be
204
+ // adapted as necessary. For now, we'll just assume that the factory
205
+ // is the only singleton that will be used by other Pope applications
206
+ C_Component_Factory::$_instances = array();
207
+
208
+ foreach ($diff as $module_name) {
209
+ $parts = explode('|', $module_name);
210
+ if (($handler = self::get_handler_instance(array_shift($parts)))) {
211
+ if (method_exists($handler, 'install'))
212
+ $handler->install($reset);
213
+ }
214
+ }
215
+
216
+ // NOTE & TODO: if the above section that declares $global_settings_to_keep is removed this should also
217
+ // Since a hard-reset of the settings was forced we must again re-apply our previously saved values
218
+ if (isset($global_settings_to_keep)) {
219
+ foreach ($global_settings_to_keep as $key => $val) {
220
+ $global_settings->$key = $val;
221
+ }
222
+ }
223
+
224
+ // Save any changes settings
225
+ $global_settings->save();
226
+ $local_settings->save();
227
+
228
+ // Set role capabilities
229
+ C_NextGEN_Bootstrap::set_role_caps();
230
+ }
231
+
232
+ // Another workaround to an issue caused by NextGen's lack of multisite compatibility. It's possible
233
+ // the string substitation wasn't performed, so if a '%' symbol exists in gallerypath we reset it. It's
234
+ // another db call, but again this should only ever run once.
235
+ //
236
+ // Remove this when removing the above reset-global-settings code
237
+ if (strpos($local_settings->gallerypath, '%'))
238
+ {
239
+ $settings_installer = new C_NextGen_Settings_Installer();
240
+ $local_settings->gallerypath = $settings_installer->gallerypath_replace($global_settings->gallerypath);
241
+ $local_settings->save();
242
+ }
243
+
244
+ // Update the module list, and remove the update flag
245
+ if ($can_upgrade)
246
+ {
247
+ update_option('pope_module_list', $current_module_list);
248
+ self::done_upgrade();
249
+ }
250
+ }
251
+
252
+ static function _get_last_module_list($reset=FALSE)
253
+ {
254
+ // Return empty array to reset
255
+ if ($reset) return array();
256
+
257
+ // First try getting the list from a single WP option, "pope_module_list"
258
+ $retval = get_option('pope_module_list', array());
259
+ if (!$retval) {
260
+ $local_settings = C_NextGen_Settings::get_instance();
261
+ $retval = $local_settings->get('pope_module_list', array());
262
+ $local_settings->delete('pope_module_list');
263
+ }
264
+
265
+ return $retval;
266
+ }
267
+
268
+ static function _generate_module_info()
269
+ {
270
+ $retval = array();
271
+ $registry = C_Component_Registry::get_instance();
272
+ $products = array('photocrati-nextgen');
273
+ foreach ($registry->get_product_list() as $product_id) {
274
+ if ($product_id != 'photocrati-nextgen') $products[] = $product_id;
275
+ }
276
+
277
+ foreach ($products as $product_id) {
278
+ foreach ($registry->get_module_list($product_id) as $module_id) {
279
+ if (($module = $registry->get_module($module_id))) {
280
+ $module_version = $module->module_version;
281
+ $module_string = "{$module_id}|{$module_version}";
282
+ if (!in_array($module_string, $retval)) $retval[] = $module_string;
283
+ }
284
+ }
285
+ }
286
+
287
+ return $retval;
288
+ }
289
+
290
+ static function refresh_cron()
291
+ {
292
+ if (!extension_loaded('suhosin')) @ini_set('memory_limit', -1);
293
+
294
+ // Remove all cron jobs created by NextGEN Gallery
295
+ $cron = _get_cron_array();
296
+ if (is_array($cron)) {
297
+ foreach ($cron as $timestamp => $job) {
298
+ if (is_array($job)) {
299
+ unset($cron[$timestamp]['ngg_delete_expired_transients']);
300
+ if (empty($cron[$timestamp])) {
301
+ unset($cron[$timestamp]);
302
+ }
303
+ }
304
+ }
305
+ }
306
+ _set_cron_array($cron);
307
+ }
308
+ }
309
+ }
nextgen-gallery/non_pope/class.photocrati_resource_manager.php ADDED
@@ -0,0 +1,270 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class C_Photocrati_Resource_Manager
4
+ {
5
+ static $instance = NULL;
6
+
7
+ public $marker = '<!-- ngg_resource_manager_marker -->';
8
+
9
+ var $buffer = '';
10
+ var $styles = '';
11
+ var $scripts = '';
12
+ var $other_output = '';
13
+ var $wrote_footer = FALSE;
14
+ var $run_shutdown = FALSE;
15
+ var $valid_request = TRUE;
16
+
17
+ /**
18
+ * Start buffering all generated output. We'll then do two things with the buffer
19
+ * 1) Find stylesheets lately enqueued and move them to the header
20
+ * 2) Ensure that wp_print_footer_scripts() is called
21
+ */
22
+ function __construct()
23
+ {
24
+ // Validate the request
25
+ $this->validate_request();
26
+
27
+ add_action('init', [$this, 'start_buffer'], -1);
28
+ add_action('wp_footer', [$this, 'print_marker'], -1);
29
+ }
30
+
31
+ /**
32
+ * Created early as possible in the wp_footer action this is the string to which we
33
+ * will move JS resources after
34
+ */
35
+ function print_marker()
36
+ {
37
+ if (self::is_disabled())
38
+ return;
39
+
40
+ // is_feed() is important to not break Wordpress feeds and the WooCommerce api
41
+ if ($this->valid_request && !is_feed())
42
+ print $this->marker;
43
+ }
44
+
45
+ /**
46
+ * Determines if the resource manager should perform it's routines for this request
47
+ */
48
+ function validate_request()
49
+ {
50
+ $this->valid_request = $this->is_valid_request();
51
+ }
52
+
53
+ /**
54
+ * Pro, Plus, and Starter versions below these were not ready to function without the resource manager
55
+ *
56
+ * @return bool
57
+ */
58
+ public static function addons_version_check()
59
+ {
60
+ if (defined('NGG_PRO_PLUGIN_VERSION') && version_compare(NGG_PRO_PLUGIN_VERSION, '3.3', '<'))
61
+ return FALSE;
62
+ if (defined('NGG_STARTER_PLUGIN_VERSION') && version_compare(NGG_STARTER_PLUGIN_VERSION, '1.1', '<'))
63
+ return FALSE;
64
+ if (defined('NGG_PLUS_PLUGIN_VERSION') && version_compare(NGG_PLUS_PLUGIN_VERSION, '1.8', '<'))
65
+ return FALSE;
66
+
67
+ return TRUE;
68
+ }
69
+
70
+ /**
71
+ * @return bool
72
+ */
73
+ public static function is_disabled()
74
+ {
75
+ // This is admittedly an ugly hack, but much easier than reworking the entire nextgen_admin modules
76
+ if (!empty($_GET['page']) && $_GET['page'] === 'ngg_addgallery' && isset($_GET['attach_to_post']))
77
+ return FALSE;
78
+
79
+ // Provide users a method of forcing this on should it be necessary
80
+ if (defined('NGG_ENABLE_RESOURCE_MANAGER') && NGG_ENABLE_RESOURCE_MANAGER)
81
+ return FALSE;
82
+
83
+ return self::addons_version_check();
84
+ }
85
+
86
+ function is_valid_request()
87
+ {
88
+ $retval = TRUE;
89
+
90
+ if (is_admin()) {
91
+ if (isset($_REQUEST['page']) && !preg_match("#^(ngg|nextgen)#", $_REQUEST['page'])) $retval = FALSE;
92
+ }
93
+
94
+ if (preg_match("#wp-admin/(network/)?update|wp-login|wp-signup#", $_SERVER['REQUEST_URI'])) $retval = FALSE;
95
+ else if (isset($_GET['display_gallery_iframe'])) $retval = FALSE;
96
+ else if (defined('WP_ADMIN') && WP_ADMIN && defined('DOING_AJAX') && DOING_AJAX) $retval = FALSE;
97
+ else if (strpos($_SERVER['REQUEST_URI'], '/nextgen-image/') !== FALSE) $retval = FALSE;
98
+ else if (preg_match("/(js|css|xsl|xml|kml)$/", $_SERVER['REQUEST_URI'])) $retval = FALSE;
99
+ else if (preg_match("#/feed(/?)$#i", $_SERVER['REQUEST_URI']) || !empty($_GET['feed'])) $retval = FALSE;
100
+ elseif (preg_match("/\\.(\\w{3,4})$/", $_SERVER['REQUEST_URI'], $match)) {
101
+ if (!in_array($match[1], array('htm', 'html', 'php'))) {
102
+ $retval = FALSE;
103
+ }
104
+ }
105
+ elseif ((isset($_SERVER['PATH_INFO']) && strpos($_SERVER['PATH_INFO'], 'nextgen-pro-lightbox-gallery') !== FALSE) OR strpos($_SERVER['REQUEST_URI'], 'nextgen-pro-lightbox-gallery') !== FALSE) {
106
+ $retval = FALSE;
107
+ }
108
+ else if ($this->is_rest_request()) $retval = FALSE;
109
+
110
+ return $retval;
111
+ }
112
+
113
+ function is_rest_request()
114
+ {
115
+ return defined('REST_REQUEST') || strpos($_SERVER['REQUEST_URI'], 'wp-json') !== FALSE;
116
+ }
117
+
118
+ /**
119
+ * Start the output buffers
120
+ */
121
+ function start_buffer()
122
+ {
123
+ if (self::is_disabled())
124
+ return;
125
+
126
+ if (apply_filters('run_ngg_resource_manager', $this->valid_request))
127
+ {
128
+ ob_start([$this, 'output_buffer_handler']);
129
+ ob_start([$this, 'get_buffer']);
130
+
131
+ add_action('wp_print_footer_scripts', [$this, 'get_resources'], 1);
132
+ add_action('admin_print_footer_scripts', [$this, 'get_resources'], 1);
133
+ add_action('shutdown', [$this, 'shutdown']);
134
+ }
135
+ }
136
+
137
+ function get_resources()
138
+ {
139
+ ob_start();
140
+ wp_print_styles();
141
+ print_admin_styles();
142
+ $this->styles = ob_get_clean();
143
+
144
+ if (!is_admin()) {
145
+ ob_start();
146
+ wp_print_scripts();
147
+ $this->scripts = ob_get_clean();
148
+ }
149
+
150
+ $this->wrote_footer = TRUE;
151
+ }
152
+
153
+ /**
154
+ * Output the buffer after PHP execution has ended (but before shutdown)
155
+ * @param $content
156
+ * @return string
157
+ */
158
+ function output_buffer_handler($content)
159
+ {
160
+ return $this->output_buffer();
161
+ }
162
+
163
+ /**
164
+ * Removes the closing </html> tag from the output buffer. We'll then write our own closing tag
165
+ * in the shutdown function after running wp_print_footer_scripts()
166
+ * @param $content
167
+ * @return mixed
168
+ */
169
+ function get_buffer($content)
170
+ {
171
+ $this->buffer = $content;
172
+ return '';
173
+ }
174
+
175
+ /**
176
+ * Moves resources to their appropriate place
177
+ */
178
+ function move_resources()
179
+ {
180
+ if ($this->valid_request) {
181
+
182
+ // Move stylesheets to head
183
+ if ($this->styles) {
184
+ $this->buffer = str_ireplace('</head>', $this->styles.'</head>', $this->buffer);
185
+ }
186
+
187
+ // Move the scripts to the bottom of the page
188
+ if ($this->scripts) {
189
+ $this->buffer = str_ireplace($this->marker, $this->marker . $this->scripts, $this->buffer);
190
+ }
191
+
192
+ if ($this->other_output) {
193
+ $this->buffer = str_replace($this->marker, $this->marker . $this->other_output, $this->buffer);
194
+ }
195
+ }
196
+ }
197
+
198
+ /**
199
+ * When PHP has finished, we output the footer scripts and closing tags
200
+ * @param bool $in_shutdown
201
+ * @return string
202
+ */
203
+ function output_buffer($in_shutdown=FALSE)
204
+ {
205
+ // If the footer scripts haven't been outputted, then
206
+ // we need to take action - as they're required
207
+ if (!$this->wrote_footer) {
208
+
209
+ // If W3TC is installed and activated, we can't output the
210
+ // scripts and manipulate the buffer, so we can only provide a warning
211
+ if (defined('W3TC') && defined('WP_DEBUG') && WP_DEBUG && !is_admin()) {
212
+ if (!defined('DONOTCACHEPAGE')) define('DONOTCACHEPAGE', TRUE);
213
+ if (!did_action('wp_footer')) {
214
+ error_log("We're sorry, but your theme's page template didn't make a call to wp_footer(), which is required by NextGEN Gallery. Please add this call to your page templates.");
215
+ }
216
+ else {
217
+ error_log("We're sorry, but your theme's page template didn't make a call to wp_print_footer_scripts(), which is required by NextGEN Gallery. Please add this call to your page templates.");
218
+ }
219
+ }
220
+
221
+ // We don't want to manipulate the buffer if it doesn't contain HTML
222
+ elseif (strpos($this->buffer, '</body>') === FALSE) {
223
+ $this->valid_request = FALSE;
224
+ }
225
+
226
+ // The output_buffer() function has been called in the PHP shutdown callback
227
+ // This will allow us to print the scripts ourselves and manipulate the buffer
228
+ if ($in_shutdown === TRUE) {
229
+ if ($this->valid_request) {
230
+ ob_start();
231
+ if (!did_action('wp_footer')) {
232
+ wp_footer();
233
+ }
234
+ else {
235
+ wp_print_footer_scripts();
236
+ }
237
+ $this->other_output = ob_get_clean();
238
+ $this->buffer = str_ireplace('</body>', $this->marker.'</body>', $this->buffer);
239
+ }
240
+ }
241
+
242
+ // W3TC isn't activated and we're not in the shutdown callback.
243
+ // We'll therefore add a shutdown callback to print the scripts
244
+ else {
245
+ $this->run_shutdown = TRUE;
246
+ return '';
247
+ }
248
+ }
249
+
250
+ // Once we have the footer scripts, we can modify the buffer and
251
+ // move the resources around
252
+ if ($this->wrote_footer) $this->move_resources();
253
+
254
+ return $this->buffer;
255
+ }
256
+
257
+ /**
258
+ * PHP shutdown callback. Manipulate and output the buffer
259
+ */
260
+ function shutdown()
261
+ {
262
+ if ($this->run_shutdown) echo $this->output_buffer(TRUE);
263
+ }
264
+
265
+ static function init()
266
+ {
267
+ $klass = get_class();
268
+ return self::$instance = new $klass;
269
+ }
270
+ }
nextgen-gallery/non_pope/class.photocrati_settings_manager.php ADDED
@@ -0,0 +1,315 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ if (!class_exists('C_Photocrati_Settings_Manager_Base'))
4
+ {
5
+ /**
6
+ * Provides a base abstraction for a Settings Manager
7
+ * Class C_Settings_Manager_Base
8
+ */
9
+ abstract class C_Photocrati_Settings_Manager_Base implements ArrayAccess
10
+ {
11
+ static $option_name = 'pope_settings';
12
+ protected $_options = array();
13
+ protected $_defaults = array();
14
+ protected $_option_handlers = array();
15
+
16
+ abstract function save();
17
+ abstract function destroy();
18
+ abstract function load();
19
+
20
+ protected function __construct()
21
+ {
22
+ $this->load();
23
+ }
24
+
25
+ /**
26
+ * Adds a class to handle dynamic options
27
+ * @param string $klass
28
+ * @param array $options
29
+ */
30
+ function add_option_handler($klass, $options=array())
31
+ {
32
+ if (!is_array($options)) $options = array($options);
33
+ foreach ($options as $option_name) {
34
+ $this->_option_handlers[$option_name] = $klass;
35
+ }
36
+ }
37
+
38
+ /**
39
+ * Gets a handler used to provide a dynamic option
40
+ * @param string $option_name
41
+ * @return null|mixed
42
+ */
43
+ protected function _get_option_handler($option_name, $method='get')
44
+ {
45
+ $retval = NULL;
46
+
47
+ if (isset($this->_option_handlers[$option_name])) {
48
+ if (!is_object($this->_option_handlers[$option_name])) {
49
+ $klass = $this->_option_handlers[$option_name];
50
+ $this->_option_handlers[$option_name] = new $klass;
51
+ }
52
+ $retval = $this->_option_handlers[$option_name];
53
+ if (!method_exists($retval, $method)) $retval = NULL;
54
+ }
55
+ return $retval;
56
+ }
57
+
58
+ /**
59
+ * Gets the value of a particular setting
60
+ *
61
+ * @param $key
62
+ * @param null $default
63
+ * @return mixed
64
+ */
65
+ function get($key, $default = NULL)
66
+ {
67
+ $retval = $default;
68
+
69
+ if (($handler = $this->_get_option_handler($key, 'get'))) {
70
+ $retval = $handler->get($key, $default);
71
+ }
72
+ else if (isset($this->_options[$key])) {
73
+ $retval = $this->_options[$key];
74
+ }
75
+
76
+ // In case a stdObject has been passed in as a value, we want to only return scalar values or arrays
77
+ if (is_object($retval))
78
+ $retval = (array) $retval;
79
+
80
+ return $retval;
81
+ }
82
+
83
+ /**
84
+ * Sets a setting to a particular value
85
+ * @param string $key
86
+ * @param mixed $value
87
+ * @return mixed
88
+ */
89
+ function set($key, $value=NULL, $skip_handlers=FALSE)
90
+ {
91
+ if (is_object($value)) $value = (array) $value;
92
+
93
+ if (is_array($key)) {
94
+ foreach ($key as $k=>$v) $this->set($k, $v);
95
+ }
96
+ elseif (!$skip_handlers && ($handler = $this->_get_option_handler($key, 'set'))) {
97
+ $handler->set($key, $value);
98
+ }
99
+ else $this->_options[$key] = $value;
100
+
101
+ return $this;
102
+ }
103
+
104
+ /**
105
+ * Deletes a setting
106
+ * @param string $key
107
+ */
108
+ function delete($key)
109
+ {
110
+ if (($handler = $this->_get_option_handler($key, 'delete'))) {
111
+ $handler->delete($key);
112
+ }
113
+ else {
114
+ unset($this->_options[$key]);
115
+ }
116
+ }
117
+
118
+ /**
119
+ * Determines if a setting exists or not
120
+ * @param $key
121
+ * @return bool
122
+ */
123
+ function is_set($key)
124
+ {
125
+ return array_key_exists($key, $this->_options);
126
+ }
127
+
128
+ /**
129
+ * Alias to is_set()
130
+ * @param $key
131
+ * @return bool
132
+ */
133
+ function exists($key)
134
+ {
135
+ return $this->is_set($key);
136
+ }
137
+
138
+ function does_not_exist($key)
139
+ {
140
+ return !$this->exists($key);
141
+ }
142
+
143
+ function reset()
144
+ {
145
+ $this->_options = array();
146
+ $this->_defaults = array();
147
+ }
148
+
149
+ /**
150
+ * This function does two things:
151
+ * a) If a value hasn't been set for the specified key, or it's been set to a previously set
152
+ * default value, then set this key to the value specified
153
+ * b) Sets a new default value for this key
154
+ */
155
+ function set_default_value($key, $default)
156
+ {
157
+ if (!isset($this->_defaults[$key])) $this->_defaults[$key] = $default;
158
+ if (is_null($this->get($key, NULL)) OR $this->get($key) == $this->_defaults[$key]) {
159
+ $this->set($key, $default);
160
+ }
161
+ $this->_defaults[$key] = $default;
162
+ return $this->get($key);
163
+ }
164
+
165
+ #[\ReturnTypeWillChange]
166
+ function offsetExists($key)
167
+ {
168
+ return $this->is_set($key);
169
+ }
170
+
171
+ #[\ReturnTypeWillChange]
172
+ function offsetGet($key)
173
+ {
174
+ return $this->get($key);
175
+ }
176
+
177
+ #[\ReturnTypeWillChange]
178
+ function offsetSet($key, $value)
179
+ {
180
+ return $this->set($key, $value);
181
+ }
182
+
183
+ #[\ReturnTypeWillChange]
184
+ function offsetUnset($key)
185
+ {
186
+ return $this->delete($key);
187
+ }
188
+
189
+ function __get($key)
190
+ {
191
+ return $this->get($key);
192
+ }
193
+
194
+ function __set($key, $value)
195
+ {
196
+ return $this->set($key, $value);
197
+ }
198
+
199
+ function __isset($key)
200
+ {
201
+ return $this->is_set($key);
202
+ }
203
+
204
+ function __toString()
205
+ {
206
+ return json_encode($this->_options);
207
+ }
208
+
209
+ function __toArray()
210
+ {
211
+ return $this->_options;
212
+ }
213
+
214
+ function to_array()
215
+ {
216
+ return $this->__toArray();
217
+ }
218
+
219
+ function to_json()
220
+ {
221
+ return json_encode($this->_options);
222
+ }
223
+
224
+ function from_json($json)
225
+ {
226
+ $this->_options = (array)json_decode($json);
227
+ }
228
+ }
229
+ }
230
+
231
+ if (!class_exists('C_Photocrati_Global_Settings_Manager')) {
232
+ class C_Photocrati_Global_Settings_Manager extends C_Photocrati_Settings_Manager_Base
233
+ {
234
+ static $_instance = NULL;
235
+
236
+ /**
237
+ * @return C_Photocrati_Global_Settings_Manager
238
+ */
239
+ public static function get_instance()
240
+ {
241
+ if (is_null(self::$_instance)) {
242
+ $klass = get_class();
243
+ self::$_instance = new $klass();
244
+ }
245
+ return self::$_instance;
246
+ }
247
+
248
+ function save()
249
+ {
250
+ return update_site_option(self::$option_name, $this->to_array());
251
+ }
252
+
253
+ function load()
254
+ {
255
+ $this->_options = get_site_option(self::$option_name, $this->to_array());
256
+ if (!$this->_options)
257
+ $this->_options = array();
258
+ else if (is_string($this->_options))
259
+ $this->_options = C_NextGen_Serializable::unserialize($this->_options);
260
+ }
261
+
262
+ function destroy()
263
+ {
264
+ return delete_site_option(self::$option_name);
265
+ }
266
+ }
267
+ }
268
+
269
+
270
+ if (!class_exists('C_Photocrati_Settings_Manager'))
271
+ {
272
+ class C_Photocrati_Settings_Manager extends C_Photocrati_Settings_Manager_Base
273
+ {
274
+ static $_instance = NULL;
275
+
276
+ /**
277
+ * @return C_Photocrati_Settings_Manager
278
+ */
279
+ public static function get_instance()
280
+ {
281
+ if (is_null(self::$_instance)) {
282
+ $klass = get_class();
283
+ self::$_instance = new $klass();
284
+ }
285
+ return self::$_instance;
286
+ }
287
+
288
+ function get($key, $default=NULL)
289
+ {
290
+ $retval = parent::get($key, NULL);
291
+
292
+ if (is_null($retval)) {
293
+ $retval = C_Photocrati_Global_Settings_Manager::get_instance()->get($key, $default);
294
+ }
295
+ return $retval;
296
+ }
297
+
298
+ function save()
299
+ {
300
+ return update_option(self::$option_name, $this->to_array());
301
+ }
302
+
303
+ function load()
304
+ {
305
+ $this->_options = get_option(self::$option_name, array());
306
+ if (!$this->_options) $this->_options = array();
307
+ else if (is_string($this->_options)) $this->_options = C_NextGen_Serializable::unserialize($this->_options);
308
+ }
309
+
310
+ function destroy()
311
+ {
312
+ delete_option(self::$option_name);
313
+ }
314
+ }
315
+ }
nextgen-gallery/non_pope/class.photocrati_transient_manager.php ADDED
@@ -0,0 +1,250 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class C_Photocrati_Transient_Manager
4
+ {
5
+ private $_groups = [];
6
+ private $_tracker = [];
7
+
8
+ /** @var null|C_Photocrati_Transient_Manager */
9
+ private static $_instance = NULL;
10
+
11
+ /**
12
+ * @return C_Photocrati_Transient_Manager
13
+ */
14
+ static function get_instance()
15
+ {
16
+ if (!self::$_instance) {
17
+ $klass = get_class();
18
+ self::$_instance = new $klass;
19
+ }
20
+ return self::$_instance;
21
+ }
22
+
23
+ function __construct()
24
+ {
25
+ global $_wp_using_ext_object_cache;
26
+
27
+ $this->_groups = get_option('ngg_transient_groups', array('__counter' => 1));
28
+ if ($_wp_using_ext_object_cache)
29
+ $this->_tracker = get_option('photocrati_cache_tracker', array());
30
+
31
+ // Ensure that _tracker remains an array or PHP 8 may generate fatal errors
32
+ if (!is_array($this->_tracker))
33
+ $this->_tracker = [];
34
+
35
+ if (!defined('NGG_DISABLE_PHOTOCRATI_CACHE_TRACKER') || !NGG_DISABLE_PHOTOCRATI_CACHE_TRACKER)
36
+ register_shutdown_function(array(&$this, '_update_tracker'));
37
+ }
38
+
39
+ function delete_tracked($group=NULL)
40
+ {
41
+ global $_wp_using_ext_object_cache;
42
+ if ($_wp_using_ext_object_cache) {
43
+ if ($group) {
44
+ if (is_array($this->_tracker) && isset($this->_tracker[$this->get_group_id($group)])) {
45
+ foreach ($this->_tracker[$this->get_group_id($group)] as $key) {
46
+ delete_transient($this->get_group_id($group).'__'.$key);
47
+ }
48
+ unset($this->_tracker[$this->get_group_id($group)]);
49
+ }
50
+ }
51
+ else foreach($this->_groups as $group => $data) $this->delete_tracked($group);
52
+ }
53
+ }
54
+
55
+ function _update_tracker()
56
+ {
57
+ global $_wp_using_ext_object_cache;
58
+ if ($_wp_using_ext_object_cache)
59
+ {
60
+ $current_value = get_option('photocrati_cache_tracker', []);
61
+ if ($current_value !== $this->_tracker)
62
+ update_option('photocrati_cache_tracker', $this->_tracker, 'no');
63
+ }
64
+ }
65
+
66
+ function add_group($group_or_groups)
67
+ {
68
+ $updated = FALSE;
69
+ $groups = is_array($group_or_groups) ? $group_or_groups : array($group_or_groups);
70
+ foreach ($groups as $group) {
71
+ if (!isset($this->_groups[$group])) {
72
+ $id = $this->_groups['__counter'] += 1;
73
+ $this->_groups[$group] = array('id' => $id, 'enabled' => TRUE);
74
+ $updated = TRUE;
75
+ }
76
+ }
77
+ if ($updated) update_option('ngg_transient_groups', $this->_groups);
78
+
79
+ }
80
+
81
+ function get_group_id($group_name)
82
+ {
83
+ $this->add_group($group_name);
84
+
85
+ return $this->_groups[$group_name]['id'];
86
+ }
87
+
88
+ function generate_key($group, $params=array())
89
+ {
90
+ if (is_object($params)) $params = (array) $params;
91
+ if (is_array($params)) {
92
+ foreach ($params as &$param) $param = @json_encode($param);
93
+ $params = implode('', $params);
94
+ }
95
+
96
+ return $this->get_group_id($group).'__'.str_replace('-', '_', crc32($params));
97
+ }
98
+
99
+ function get($key, $default=NULL, $lookup=NULL)
100
+ {
101
+ $retval = $default;
102
+
103
+ if (is_null($lookup)) {
104
+ if (defined('PHOTOCRATI_CACHE')) {
105
+ $lookup = PHOTOCRATI_CACHE;
106
+ }
107
+ }
108
+
109
+ if ($lookup) {
110
+ $retval = json_decode(get_transient($key));
111
+ if (is_object($retval)) $retval = (array) $retval;
112
+ if (is_null($retval)) $retval = $default;
113
+ }
114
+
115
+ return $retval;
116
+ }
117
+
118
+ function _track_key($key)
119
+ {
120
+ global $_wp_using_ext_object_cache;
121
+ if ($_wp_using_ext_object_cache)
122
+ {
123
+ if (!is_array($this->_tracker))
124
+ $this->_tracker = [];
125
+ $parts = explode('__', $key);
126
+ $group = $parts[0];
127
+ $id = $parts[1];
128
+ if (!isset($this->_tracker[$group]))
129
+ $this->_tracker[$group] = array();
130
+ $this->_tracker[$group][] = $id;
131
+ }
132
+ }
133
+
134
+ public function set($key, $value, $ttl=0)
135
+ {
136
+ $retval = FALSE;
137
+ $enabled = TRUE;
138
+
139
+ if (defined('PHOTOCRATI_CACHE'))
140
+ $enabled = PHOTOCRATI_CACHE;
141
+ if (defined('PHOTOCRATI_CACHE_TTL')
142
+ && !$ttl) $ttl = PHOTOCRATI_CACHE_TTL;
143
+
144
+ if ($enabled)
145
+ {
146
+ $retval = set_transient($key, json_encode($value), $ttl);
147
+ if ($retval)
148
+ $this->_track_key($key);
149
+ }
150
+
151
+ return $retval;
152
+ }
153
+
154
+ public function delete($key)
155
+ {
156
+ return delete_transient($key);
157
+ }
158
+
159
+ /**
160
+ * Clears all (or only expired) transients managed by this utility
161
+ *
162
+ * @param string $group Group name to purge
163
+ * @param bool $expired Whether to clear all transients (FALSE) or to clear expired transients (TRUE)
164
+ */
165
+ public function clear($group = NULL, $expired = FALSE)
166
+ {
167
+ if ($group === '__counter')
168
+ return;
169
+
170
+ if (is_string($group) && !empty($group))
171
+ {
172
+ global $wpdb;
173
+
174
+ // A little query building is necessary here..
175
+ // Clear transients for "the" site or for the current multisite instance
176
+ $expired_sql = '';
177
+ $params = array($wpdb->esc_like('_transient_') . '%',
178
+ '%' . $wpdb->esc_like("{$this->get_group_id($group)}__") . '%',
179
+ $wpdb->esc_like('_transient_timeout_') . '%');
180
+ if ($expired)
181
+ {
182
+ $params[] = time();
183
+ $expired_sql = $expired ? "AND b.option_value < %d" : '';
184
+ }
185
+
186
+ $sql = "DELETE a, b
187
+ FROM {$wpdb->options} a, {$wpdb->options} b
188
+ WHERE a.option_name LIKE %s
189
+ AND a.option_name LIKE %s
190
+ AND a.option_name NOT LIKE %s
191
+ AND b.option_name = CONCAT('_transient_timeout_', SUBSTRING(a.option_name, 12))
192
+ {$expired_sql}";
193
+
194
+ $wpdb->query($wpdb->prepare($sql, $params));
195
+
196
+ // Clear transients for the main site of a multisite network
197
+ if (is_main_site() && is_main_network())
198
+ {
199
+ $expired_sql = '';
200
+ $params = array($wpdb->esc_like('_site_transient_') . '%',
201
+ '%' . $wpdb->esc_like("{$this->get_group_id($group)}__") . '%',
202
+ $wpdb->esc_like('_site_transient_timeout_') . '%');
203
+ if ($expired)
204
+ {
205
+ $params[] = time();
206
+ $expired_sql = $expired ? "AND b.option_value < %d" : '';
207
+ }
208
+ $sql = "DELETE a, b
209
+ FROM {$wpdb->options} a, {$wpdb->options} b
210
+ WHERE a.option_name LIKE %s
211
+ AND a.option_name LIKE %s
212
+ AND a.option_name NOT LIKE %s
213
+ AND b.option_name = CONCAT('_site_transient_timeout_', SUBSTRING(a.option_name, 17))
214
+ {$expired_sql}";
215
+ $wpdb->query($wpdb->prepare($sql, $params));
216
+ }
217
+
218
+ if ($expired)
219
+ $this->delete_tracked($group);
220
+ }
221
+ else foreach ($this->_groups as $name => $params) {
222
+ $this->clear($name, $expired);
223
+ }
224
+ }
225
+
226
+ public static function update($key, $value, $ttl=NULL)
227
+ {
228
+ return self::get_instance()->set($key, $value, $ttl);
229
+ }
230
+
231
+ public static function fetch($key, $default=NULL)
232
+ {
233
+ return self::get_instance()->get($key, $default);
234
+ }
235
+
236
+ public static function flush($group = NULL)
237
+ {
238
+ self::get_instance()->clear($group);
239
+ }
240
+
241
+ public static function flush_expired($group = NULL)
242
+ {
243
+ self::get_instance()->clear($group, TRUE);
244
+ }
245
+
246
+ public static function create_key($group, $params=array())
247
+ {
248
+ return self::get_instance()->generate_key($group, $params);
249
+ }
250
+ }
nextgen-gallery/products/photocrati_nextgen/class.nextgen_product_installer.php ADDED
@@ -0,0 +1,103 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class C_NextGen_Product_Installer
4
+ {
5
+ function _filter_modules($pope_modules_list, $product)
6
+ {
7
+ foreach ($product as $module_name) {
8
+ $module = C_Component_Registry::get_instance()->get_module($module_name);
9
+ $str = $module->module_id . '|' . $module->module_version;
10
+ $search = array_search($str, $pope_modules_list);
11
+ if (FALSE !== $search)
12
+ unset($pope_modules_list[$search]);
13
+ }
14
+ return $pope_modules_list;
15
+ }
16
+
17
+ function get_modules_to_load_for($product_id)
18
+ {
19
+ $modules = array();
20
+
21
+ $obj = C_Component_Registry::get_instance()->get_product($product_id);
22
+ try {
23
+ $klass = new ReflectionClass( $obj );
24
+ if ( $klass->hasMethod( 'get_modules_to_load' ) ) {
25
+ $modules = $obj->get_modules_to_load();
26
+ } elseif ( $klass->hasProperty( 'modules' ) ) {
27
+ $modules = $klass->getStaticPropertyValue( 'modules' );
28
+ }
29
+
30
+ if ( ! $modules && $klass->hasMethod( 'define_modules' ) ) {
31
+ $modules = $obj->define_modules();
32
+ if ( $klass->hasProperty( 'modules' ) ) {
33
+ $modules = $klass->getStaticPropertyValue( 'modules' );
34
+ }
35
+ }
36
+ }
37
+ catch (ReflectionException $ex) {
38
+ // Oh oh...
39
+ }
40
+
41
+ return $modules;
42
+ }
43
+
44
+ function uninstall($hard)
45
+ {
46
+ // remove this products modules from the pope_module_list registry
47
+ $registry = C_Component_Registry::get_instance();
48
+ $nextgen_product = $registry->get_product('photocrati-nextgen');
49
+ $pope_modules_list = get_option('pope_module_list', array());
50
+ $pope_modules_list = $this->_filter_modules($pope_modules_list, $nextgen_product->get_modules_to_load());
51
+
52
+ // run each modules respective uninstall routines
53
+ foreach ($nextgen_product->get_modules_to_load() as $module_name) {
54
+ if (($handler = C_Photocrati_Installer::get_handler_instance($module_name))) {
55
+ if (method_exists($handler, 'uninstall')) $handler->uninstall($hard);
56
+ }
57
+ }
58
+
59
+ // lastly remove this product itself from the pope_module_list registry
60
+ $search = array_search('photocrati-nextgen|' . NGG_PLUGIN_VERSION, $pope_modules_list);
61
+ if (FALSE !== $search)
62
+ unset($pope_modules_list[$search]);
63
+
64
+ // TODO: remove this. NextGen Pro's uninstall routine will be updated in a separate release,
65
+ // so to maintain proper support we run the same routine as above for it
66
+ $pro_version = FALSE;
67
+ if (defined('NGG_PRO_PLUGIN_VERSION'))
68
+ $pro_version = 'NGG_PRO_PLUGIN_VERSION';
69
+ if (defined('NEXTGEN_GALLERY_PRO_VERSION'))
70
+ $pro_version = 'NEXTGEN_GALLERY_PRO_VERSION';
71
+ if (FALSE !== $pro_version)
72
+ $pro_version = constant($pro_version);
73
+
74
+ if (FALSE !== $pro_version)
75
+ {
76
+ $pope_modules_list = $this->_filter_modules($pope_modules_list, $this->get_modules_to_load_for('photocrati-nextgen-pro'));
77
+ $search = array_search('photocrati-nextgen-pro|' . $pro_version, $pope_modules_list);
78
+ if (FALSE !== $search)
79
+ unset($pope_modules_list[$search]);
80
+ }
81
+
82
+ // TODO: remove this also. NextGen Plus should also be updated in a separate release
83
+ $plus_version = FALSE;
84
+ if (defined('NGG_PLUS_PLUGIN_VERSION'))
85
+ $plus_version = 'NGG_PLUS_PLUGIN_VERSION';
86
+ if (FALSE !== $plus_version)
87
+ $plus_version = constant($plus_version);
88
+
89
+ if (FALSE !== $plus_version)
90
+ {
91
+ $pope_modules_list = $this->_filter_modules($pope_modules_list, $this->get_modules_to_load_for('photocrati-nextgen-plus'));
92
+ $search = array_search('photocrati-nextgen-plus|' . $plus_version, $pope_modules_list);
93
+ if (FALSE !== $search)
94
+ unset($pope_modules_list[$search]);
95
+ }
96
+
97
+ if (empty($pope_modules_list))
98
+ delete_option('pope_module_list');
99
+ else
100
+ update_option('pope_module_list', $pope_modules_list);
101
+
102
+ }
103
+ }
nextgen-gallery/products/photocrati_nextgen/modules/ajax/README.txt ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ AJAX MODULE
2
+ ======================
3
+
4
+ == Introduction ==
5
+ -------------------
6
+
7
+ This module provides a means for executing AJAX actions through the C_Ajax_Controller class.
8
+ This controller is registed as a route, trigged by "/photocrati_ajax" It's designed in mind
9
+ with the intention that other modules will adapt this controller to provide custom AJAX
10
+ actions.
11
+
12
+ This module also adds some client-side variables to assist with executing your AJAX actions:
13
+ => photocrati_ajax.url, the url used to post your AJAX requests to
14
+ => photacrati_ajax.wp_site_url, the url of the WordPress site
15
+
16
+ To call an AJAX method using jQuery, you'd do the following:
17
+
18
+ jQuery.post(photocrati_ajax.url, {action: "get_gallery", id: 1}, function(response){
19
+ if (typeof response != 'object) response = JSON.parse(response);
20
+ });
21
+
22
+ The above AJAX request will execute C_Ajax_Controller->get_gallery_action(), which is
23
+ expected to return valid JSON (even if there is an error)
24
+
25
+
26
+ == Caveats ==
27
+ -------------
28
+
29
+ This module does not currently have any built-in security mechanisms. Any actions you
30
+ mixin using an adapter need to perform their own authorization checks.
nextgen-gallery/products/photocrati_nextgen/modules/ajax/module.ajax.php ADDED
@@ -0,0 +1,140 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ define('NGG_AJAX_SLUG', 'photocrati_ajax');
4
+
5
+ class M_Ajax extends C_Base_Module
6
+ {
7
+ function define($id = 'pope-module',
8
+ $name = 'Pope Module',
9
+ $description = '',
10
+ $version = '',
11
+ $uri = '',
12
+ $author = '',
13
+ $author_uri = '',
14
+ $context = FALSE)
15
+ {
16
+ parent::define(
17
+ 'photocrati-ajax',
18
+ 'AJAX',
19
+ 'Provides AJAX functionality',
20
+ '3.3.21',
21
+ 'https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/',
22
+ 'Imagely',
23
+ 'https://www.imagely.com'
24
+ );
25
+ C_NextGen_Settings::get_instance()->add_option_handler('C_Ajax_Option_Handler', array(
26
+ 'ajax_slug',
27
+ 'ajax_url',
28
+ 'ajax_js_url'
29
+ ));
30
+
31
+ if (is_multisite()) C_NextGen_Global_Settings::get_instance()->add_option_handler('C_Ajax_Option_Handler', array(
32
+ 'ajax_slug',
33
+ 'ajax_url',
34
+ 'ajax_js_url'
35
+ ));
36
+ }
37
+
38
+ function _register_utilities()
39
+ {
40
+ $this->get_registry()->add_utility('I_Ajax_Controller', 'C_Ajax_Controller');
41
+
42
+ }
43
+
44
+ /**
45
+ * Hooks into the WordPress framework
46
+ */
47
+ function _register_hooks()
48
+ {
49
+ add_action('init', array(get_class(), 'register_scripts'), 9);
50
+ add_action('ngg_routes', array(&$this, 'define_routes'));
51
+ add_action('init', array(&$this, 'serve_ajax_request'));
52
+ }
53
+
54
+ function serve_ajax_request()
55
+ {
56
+ if (isset($_REQUEST[NGG_AJAX_SLUG])) {
57
+ $controller = C_Ajax_Controller::get_instance();
58
+ $controller->index_action();
59
+ exit;
60
+ }
61
+ }
62
+
63
+ function define_routes($router)
64
+ {
65
+ $app = $router->create_app('/photocrati_ajax');
66
+ $app->route('/', 'I_Ajax_Controller#index');
67
+ }
68
+
69
+ /**
70
+ * Loads a single script to provide the photocrati_ajax settings to the web browser
71
+ */
72
+ static function register_scripts()
73
+ {
74
+ $settings = C_NextGen_Settings::get_instance();
75
+ $router = C_Router::get_instance();
76
+
77
+ wp_register_script('photocrati_ajax', $router->get_static_url('photocrati-ajax#ajax.min.js'), array('jquery'), NGG_SCRIPT_VERSION);
78
+
79
+ $vars = array(
80
+ 'url' => $settings->get('ajax_url'),
81
+ 'wp_home_url' => $router->get_base_url('home'),
82
+ 'wp_site_url' => $router->get_base_url('site'),
83
+ 'wp_root_url' => $router->get_base_url('root'),
84
+ 'wp_plugins_url' => $router->get_base_url('plugins'),
85
+ 'wp_content_url' => $router->get_base_url('content'),
86
+ 'wp_includes_url' => includes_url(),
87
+ 'ngg_param_slug' => C_NextGen_Settings::get_instance()->get('router_param_slug', 'nggallery')
88
+ );
89
+ wp_localize_script('photocrati_ajax', 'photocrati_ajax', $vars);
90
+ }
91
+
92
+ /**
93
+ * Pass PHP object or array to JS, preserving numeric and boolean value
94
+ * @param string $handle
95
+ * @param string $name
96
+ * @param object|array $data
97
+ */
98
+ static function pass_data_to_js($handle, $var_name, $data)
99
+ {
100
+ $var_name = esc_js($var_name);
101
+ return wp_add_inline_script($handle, "let {$var_name} = ".json_encode($data, JSON_NUMERIC_CHECK));
102
+ }
103
+
104
+ function get_type_list()
105
+ {
106
+ return array(
107
+ 'C_Ajax_Installer' => 'class.ajax_installer.php',
108
+ 'C_Ajax_Controller' => 'class.ajax_controller.php',
109
+ 'M_Ajax' => 'module.ajax.php'
110
+ );
111
+ }
112
+ }
113
+
114
+ class C_Ajax_Option_Handler {
115
+ private $slug = NGG_AJAX_SLUG;
116
+
117
+ function get_router() {
118
+ return C_Router::get_instance();
119
+ }
120
+
121
+ function get( $key, $default = null ) {
122
+ $retval = $default;
123
+
124
+ switch ( $key ) {
125
+ case 'ajax_slug':
126
+ $retval = $this->slug;
127
+ break;
128
+ case 'ajax_url':
129
+ $retval = site_url( "/index.php?{$this->slug}=1" );
130
+ if ( is_ssl() && strpos( $retval, 'https' ) === false ) {
131
+ $retval = str_replace( 'http', 'https', $retval );
132
+ }
133
+ break;
134
+ }
135
+
136
+ return $retval;
137
+ }
138
+ }
139
+
140
+ new M_Ajax();
nextgen-gallery/products/photocrati_nextgen/modules/ajax/package.module.ajax.php ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Class C_Ajax_Controller
4
+ * @implements I_Ajax_Controller
5
+ */
6
+ class C_Ajax_Controller extends C_MVC_Controller
7
+ {
8
+ static $_instances = array();
9
+ function define($context = FALSE)
10
+ {
11
+ parent::define($context);
12
+ $this->implement('I_Ajax_Controller');
13
+ }
14
+ function index_action($return = FALSE)
15
+ {
16
+ $retval = NULL;
17
+ define('DOING_AJAX', TRUE);
18
+ // Inform the MVC framework what type of content we're returning
19
+ $this->set_content_type('json');
20
+ // Start an output buffer to avoid displaying any PHP warnings/errors
21
+ ob_start();
22
+ // Get the action requested & find and execute the related method
23
+ if ($action = $this->param('action')) {
24
+ $method = "{$action}_action";
25
+ if ($this->has_method($method)) {
26
+ $retval = $this->call_method($method);
27
+ } else {
28
+ $retval = array('error' => 'Not a valid AJAX action');
29
+ }
30
+ } else {
31
+ $retval = array('error' => 'No action specified');
32
+ }
33
+ // Flush the buffer
34
+ $buffer_limit = 0;
35
+ $zlib = ini_get('zlib.output_compression');
36
+ if (!is_numeric($zlib) && $zlib == 'On') {
37
+ $buffer_limit = 1;
38
+ } else {
39
+ if (is_numeric($zlib) && $zlib > 0) {
40
+ $buffer_limit = 1;
41
+ }
42
+ }
43
+ while (ob_get_level() != $buffer_limit) {
44
+ ob_end_clean();
45
+ }
46
+ // Return the JSON to the browser
47
+ wp_send_json($retval);
48
+ }
49
+ /**
50
+ * Returns an instance of this class
51
+ * @param string|bool $context
52
+ * @return C_Ajax_Controller
53
+ */
54
+ static function get_instance($context = FALSE)
55
+ {
56
+ if (!isset(self::$_instances[$context])) {
57
+ $klass = get_class();
58
+ self::$_instances[$context] = new $klass($context);
59
+ }
60
+ return self::$_instances[$context];
61
+ }
62
+ function validate_ajax_request($action = NULL, $token = FALSE)
63
+ {
64
+ if ($token === TRUE && (!isset($_REQUEST['nonce']) || !M_Security::verify_nonce($_REQUEST['nonce'], $action))) {
65
+ return FALSE;
66
+ }
67
+ return M_Security::is_allowed($action);
68
+ }
69
+ }
nextgen-gallery/products/photocrati_nextgen/modules/ajax/static/ajax.min.js ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ EasyCookie=(function(){var EPOCH='Thu, 01-Jan-1970 00:00:01 GMT',RATIO=1000*60*60*24,KEYS=['expires','path','domain'],esc=escape,un=unescape,doc=document,me;var get_now=function(){var r=new Date();r.setTime(r.getTime());return r;}
3
+ var cookify=function(c_key,c_val){var i,key,val,r=[],opt=(arguments.length>2)?arguments[2]:{};r.push(esc(c_key)+'='+esc(c_val));for(i=0;i<KEYS.length;i++){key=KEYS[i];if(val=opt[key])
4
+ r.push(key+'='+val);}
5
+ if(opt.secure)
6
+ r.push('secure');return r.join('; ');}
7
+ var alive=function(){var k='__EC_TEST__',v=new Date();v=v.toGMTString();this.set(k,v);this.enabled=(this.remove(k)==v);return this.enabled;}
8
+ me={set:function(key,val){var opt=(arguments.length>2)?arguments[2]:{},now=get_now(),expire_at,cfg={};if(opt.expires){opt.expires*=RATIO;cfg.expires=new Date(now.getTime()+opt.expires);cfg.expires=cfg.expires.toGMTString();}
9
+ var keys=['path','domain','secure'];for(i=0;i<keys.length;i++)
10
+ if(opt[keys[i]])
11
+ cfg[keys[i]]=opt[keys[i]];var r=cookify(key,val,cfg);doc.cookie=r;return val;},has:function(key){key=esc(key);var c=doc.cookie,ofs=c.indexOf(key+'='),len=ofs+key.length+1,sub=c.substring(0,key.length);return((!ofs&&key!=sub)||ofs<0)?false:true;},get:function(key){key=esc(key);var c=doc.cookie,ofs=c.indexOf(key+'='),len=ofs+key.length+1,sub=c.substring(0,key.length),end;if((!ofs&&key!=sub)||ofs<0)
12
+ return null;end=c.indexOf(';',len);if(end<0)
13
+ end=c.length;return un(c.substring(len,end));},remove:function(k){var r=me.get(k),opt={expires:EPOCH};doc.cookie=cookify(k,'',opt);return r;},keys:function(){var c=doc.cookie,ps=c.split('; '),i,p,r=[];for(i=0;i<ps.length;i++){p=ps[i].split('=');r.push(un(p[0]));}
14
+ return r;},all:function(){var c=doc.cookie,ps=c.split('; '),i,p,r=[];for(i=0;i<ps.length;i++){p=ps[i].split('=');r.push([un(p[0]),un(p[1])]);}
15
+ return r;},version:'0.2.1',enabled:false};me.enabled=alive.call(me);return me;}());
16
+
17
+ window.Ngg_Store = {
18
+
19
+ get: function(key){
20
+ return EasyCookie.get(key);
21
+ },
22
+
23
+ set: function(key, value){
24
+ if (typeof(value) == 'object') {
25
+ value = JSON.stringify(value);
26
+ }
27
+ return EasyCookie.set(key, value, {
28
+ expires: 10,
29
+ path: '/',
30
+ secure: false
31
+ });
32
+ },
33
+
34
+ del: function(key){
35
+ EasyCookie.remove(key);
36
+ return !this.has(key);
37
+ },
38
+
39
+ has: function(key){
40
+ var value = this.get(key);
41
+ return typeof(value) != 'undefined' && value != null;
42
+ },
43
+
44
+ save: function(){
45
+ return true;
46
+ }
47
+ };
48
+
49
+ jQuery(function($){
50
+ $(window).on('unload', function(){
51
+ Ngg_Store.save();
52
+ })
53
+ });
nextgen-gallery/products/photocrati_nextgen/modules/ajax/static/persist.swf ADDED
Binary file
nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/module.attach_to_post.php ADDED
@@ -0,0 +1,605 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ define('NGG_ATTACH_TO_POST_SLUG', 'nextgen-attach_to_post');
4
+ define('NGG_ATTACH_TO_POST_VERSION', '3.4.0');
5
+
6
+ class M_Attach_To_Post extends C_Base_Module
7
+ {
8
+ var $attach_to_post_tinymce_plugin = 'NextGEN_AttachToPost';
9
+ var $_event_publisher = NULL;
10
+ static $substitute_placeholders = TRUE;
11
+
12
+ /**
13
+ * Defines the module
14
+ * @param string|bool $context
15
+ */
16
+ function define($id = 'pope-module',
17
+ $name = 'Pope Module',
18
+ $description = '',
19
+ $version = '',
20
+ $uri = '',
21
+ $author = '',
22
+ $author_uri = '',
23
+ $context = FALSE)
24
+ {
25
+ parent::define(
26
+ 'photocrati-attach_to_post',
27
+ 'Attach To Post',
28
+ 'Provides the "Attach to Post" interface for displaying galleries and albums',
29
+ NGG_ATTACH_TO_POST_VERSION,
30
+ 'https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/',
31
+ 'Imagely',
32
+ 'https://www.imagely.com',
33
+ $context
34
+ );
35
+
36
+ C_NextGen_Settings::get_instance()->add_option_handler('C_Attach_To_Post_Option_Handler', array(
37
+ 'attach_to_post_url',
38
+ 'gallery_preview_url',
39
+ 'attach_to_post_display_tab_js_url'
40
+ ));
41
+ if (is_multisite()) C_NextGen_Global_Settings::get_instance()->add_option_handler('C_Attach_To_Post_Option_Handler', array(
42
+ 'attach_to_post_url',
43
+ 'gallery_preview_url',
44
+ 'attach_to_post_display_tab_js_url'
45
+ ));
46
+
47
+ C_Photocrati_Installer::add_handler($this->module_id, 'C_Attach_To_Post_Installer');
48
+ }
49
+
50
+ static function is_atp_url()
51
+ {
52
+ return (strpos(strtolower($_SERVER['REQUEST_URI']), NGG_ATTACH_TO_POST_SLUG) !== false) ? TRUE : FALSE;
53
+ }
54
+
55
+ /**
56
+ * Gets the Frame Event Publisher
57
+ * @return C_Component
58
+ */
59
+ function _get_frame_event_publisher()
60
+ {
61
+ if (is_null($this->_event_publisher)) {
62
+ $this->_event_publisher = $this->get_registry()->get_utility('I_Frame_Event_Publisher', 'attach_to_post');
63
+ }
64
+
65
+ return $this->_event_publisher;
66
+ }
67
+
68
+ /**
69
+ * Registers requires the utilites that this module provides
70
+ */
71
+ function _register_utilities()
72
+ {
73
+ // This utility provides a controller that renders the
74
+ // Attach to Post interface, used to manage Displayed Galleries
75
+ $this->get_registry()->add_utility(
76
+ 'I_Attach_To_Post_Controller',
77
+ 'C_Attach_Controller'
78
+ );
79
+ }
80
+
81
+ /**
82
+ * Registers the adapters that this module provides
83
+ */
84
+ function _register_adapters()
85
+ {
86
+ // Installs the Attach to Post module
87
+ $this->get_registry()->add_adapter(
88
+ 'I_Installer', 'A_Attach_To_Post_Installer'
89
+ );
90
+
91
+ // Provides AJAX actions for the Attach To Post interface
92
+ $this->get_registry()->add_adapter(
93
+ 'I_Ajax_Controller', 'A_Attach_To_Post_Ajax'
94
+ );
95
+
96
+ // Applies a post hook to the generate_thumbnail method of the
97
+ // gallery storage component
98
+ $this->get_registry()->add_adapter(
99
+ 'I_Gallery_Storage', 'A_Gallery_Storage_Frame_Event'
100
+ );
101
+ }
102
+
103
+ function does_request_require_frame_communication()
104
+ {
105
+ return (strpos($_SERVER['REQUEST_URI'], 'attach_to_post') !== FALSE OR (isset($_SERVER['HTTP_REFERER']) && strpos($_SERVER['HTTP_REFERER'], 'attach_to_post') !== FALSE) OR array_key_exists('attach_to_post', $_REQUEST));
106
+ }
107
+
108
+ function _register_hooks()
109
+ {
110
+ add_action('ngg_routes', array($this, 'define_routes'), 2);
111
+
112
+ add_filter('wpseo_opengraph_image', array($this, 'hide_preview_image_from_yoast'));
113
+ add_filter('wpseo_twitter_image', array($this, 'hide_preview_image_from_yoast'));
114
+ add_filter('wpseo_sitemap_urlimages', array($this, 'remove_preview_images_from_yoast_sitemap'), NULL, 2);
115
+
116
+ // Emit frame communication events
117
+ if ($this->does_request_require_frame_communication()) {
118
+ add_action('ngg_created_new_gallery', array(&$this, 'new_gallery_event'));
119
+ add_action('ngg_after_new_images_added',array(&$this, 'images_added_event'));
120
+ add_action('ngg_page_event', array(&$this, 'nextgen_page_event'));
121
+ add_action('ngg_manage_tags', array(&$this, 'manage_tags_event'));
122
+ }
123
+
124
+ // Admin-only hooks
125
+ if (is_admin())
126
+ {
127
+ add_action(
128
+ 'admin_enqueue_scripts',
129
+ array($this, 'enqueue_static_resources'),
130
+ -100
131
+ );
132
+
133
+ // Elementor's editor.php runs `new \WP_Scripts()` which requires we enqueue scripts on both
134
+ // admin_enqueue_scripts and this action if we want our resources to be used with the page builder.
135
+ add_action(
136
+ 'elementor/editor/after_enqueue_scripts',
137
+ array($this, 'enqueue_static_resources')
138
+ );
139
+
140
+ add_action('admin_init', array(&$this, 'route_insert_gallery_window'));
141
+
142
+ add_action('media_buttons', array($this, 'add_media_button'), 15);
143
+ add_action('admin_enqueue_scripts', array($this, 'enqueue_tinymce_resources'));
144
+ add_filter('mce_buttons', array(&$this, 'add_attach_to_post_button'));
145
+ add_filter('mce_external_plugins', array(&$this, 'add_attach_to_post_tinymce_plugin'));
146
+ add_filter('wp_mce_translation', array($this, 'add_attach_to_post_tinymce_i18n'));
147
+ add_action('admin_print_scripts', array(&$this, 'print_tinymce_placeholder_template'));
148
+ }
149
+
150
+ // Frontend-only hooks
151
+ if (!is_admin()) {
152
+ // Add hook to subsitute displayed gallery placeholders
153
+ add_filter('the_content', array(&$this, 'substitute_placeholder_imgs'), PHP_INT_MAX, 1);
154
+ }
155
+ }
156
+
157
+ /**
158
+ * Renders the underscore template used by TinyMCE for IGW placeholders
159
+ */
160
+ function print_tinymce_placeholder_template()
161
+ {
162
+ readfile(C_Fs::get_instance()->join_paths(
163
+ $this->get_registry()->get_module_dir('photocrati-attach_to_post'),
164
+ 'templates',
165
+ 'tinymce_placeholder.php'
166
+ ));
167
+ }
168
+
169
+ /**
170
+ * Prevents ATP preview image placeholders from being used as opengraph / twitter metadata
171
+ *
172
+ * @param string $image
173
+ * @return null|string
174
+ */
175
+ function hide_preview_image_from_yoast($image)
176
+ {
177
+ if (strpos($image, NGG_ATTACH_TO_POST_SLUG) !== FALSE)
178
+ return null;
179
+ return $image;
180
+ }
181
+
182
+ /**
183
+ * Removes IGW preview/placeholder images from Yoast's sitemap
184
+ * @param $images
185
+ * @param $post_id
186
+ * @return array
187
+ */
188
+ function remove_preview_images_from_yoast_sitemap($images, $post_id)
189
+ {
190
+ $retval = array();
191
+
192
+ foreach ($images as $image) {
193
+ if (strpos($image['src'], NGG_ATTACH_TO_POST_SLUG) === FALSE) {
194
+ $retval[] = $image;
195
+ }
196
+ else {
197
+ // Lookup images for the displayed gallery
198
+ if (preg_match('/(\d+)$/', $image['src'], $match)) {
199
+ $displayed_gallery_id = $match[1];
200
+ $mapper = C_Displayed_Gallery_Mapper::get_instance();
201
+ $displayed_gallery = $mapper->find($displayed_gallery_id, TRUE);
202
+ if ($displayed_gallery) {
203
+ $gallery_storage = C_Gallery_Storage::get_instance();
204
+ $settings = C_NextGen_Settings::get_instance();
205
+ $source_obj = $displayed_gallery->get_source();
206
+ if (in_array('image', $source_obj->returns)) {
207
+ foreach ($displayed_gallery->get_entities() as $image) {
208
+ $named_image_size = $settings->imgAutoResize ? 'full' : 'thumb';
209
+
210
+ $sitemap_image = array(
211
+ 'src' => $gallery_storage->get_image_url($image, $named_image_size),
212
+ 'alt' => $image->alttext,
213
+ 'title' => $image->description ? $image->description: $image->alttext
214
+ );
215
+ $retval[] = $sitemap_image;
216
+ }
217
+ }
218
+ }
219
+
220
+ }
221
+ }
222
+ }
223
+
224
+ return $retval;
225
+ }
226
+
227
+ /**
228
+ * In 2.0.66.X and earlier, ATP placeholder images used a different url than
229
+ * what 2.0.69 uses. Therefore, we need to convert those
230
+ * @param string $content
231
+ * @return string
232
+ */
233
+ function fix_preview_images($content)
234
+ {
235
+ $content = str_replace(
236
+ site_url('/'.NGG_ATTACH_TO_POST_SLUG.'/preview/id--'),
237
+ admin_url('/?'.NGG_ATTACH_TO_POST_SLUG.'='.NGG_ATTACH_TO_POST_SLUG.'/preview/id--'),
238
+ $content
239
+ );
240
+
241
+ $content = str_replace(
242
+ site_url('/index.php/'.NGG_ATTACH_TO_POST_SLUG.'/preview/id--'),
243
+ admin_url('/?'.NGG_ATTACH_TO_POST_SLUG.'='.NGG_ATTACH_TO_POST_SLUG.'/preview/id--'),
244
+ $content
245
+ );
246
+
247
+ return $content;
248
+ }
249
+
250
+ function add_media_button()
251
+ {
252
+ if (in_array(FALSE, array(
253
+ M_Security::is_allowed('NextGEN Attach Interface'),
254
+ M_Security::is_allowed('NextGEN Use TinyMCE'))))
255
+ return;
256
+
257
+ $router = C_Router::get_instance();
258
+ $button_url = $router->get_static_url('photocrati-attach_to_post#igw_button.png');
259
+ $label = __('Add Gallery', 'nggallery');
260
+ $igw_url = admin_url('/?'.NGG_ATTACH_TO_POST_SLUG.'=1&KeepThis=true&TB_iframe=true&height=600&width=1000');
261
+
262
+ echo sprintf('<a href="%s" data-editor="content" class="button ngg-add-gallery thickbox" id="ngg-media-button" class="button" ><img src="%s" style="padding:0 4px 0 0; margin-left: -2px; margin-top:-3px; max-width: 20px;">%s</a>', $igw_url, $button_url, $label);
263
+ }
264
+
265
+ /**
266
+ * Route the IGW requests using wp-admin
267
+ */
268
+ function route_insert_gallery_window()
269
+ {
270
+ if (isset($_REQUEST[NGG_ATTACH_TO_POST_SLUG])) {
271
+ $controller = C_Attach_Controller::get_instance();
272
+ if ($_REQUEST[NGG_ATTACH_TO_POST_SLUG] == 'js') {
273
+ $controller->display_tab_js_action();
274
+ }
275
+ elseif (strpos($_REQUEST[NGG_ATTACH_TO_POST_SLUG], '/preview') !== FALSE) {
276
+ $controller->preview_action();
277
+ }
278
+ else {
279
+ $controller->index_action();
280
+ }
281
+
282
+ exit();
283
+ }
284
+ }
285
+
286
+ /**
287
+ * @param C_Router $router
288
+ */
289
+ function define_routes($router)
290
+ {
291
+ $app = $router->create_app('/'.NGG_ATTACH_TO_POST_SLUG);
292
+ $app->rewrite('/preview/{id}', '/preview/id--{id}');
293
+ $app->rewrite('/display_tab_js/{id}', '/display_tab_js/id--{id}');
294
+ $app->route('/preview', 'I_Attach_To_Post_Controller#preview');
295
+ $app->route('/display_tab_js', 'I_Attach_To_Post_Controller#display_tab_js');
296
+ $app->route('/', 'I_Attach_To_Post_Controller#index');
297
+ }
298
+
299
+ /**
300
+ * Substitutes the gallery placeholder content with the gallery type frontend
301
+ * view, returns a list of static resources that need to be loaded
302
+ * @param string $content
303
+ */
304
+ function substitute_placeholder_imgs($content)
305
+ {
306
+ $content = $this->fix_preview_images($content);
307
+
308
+ // To match ATP entries we compare the stored url against a generic path; entries MUST have a gallery ID
309
+ if (preg_match_all("#<img.*http(s)?://(.*)?".NGG_ATTACH_TO_POST_SLUG."(=|/)preview(/|&|&amp;)id(=|--)(\\d+).*?>#mi", $content, $matches, PREG_SET_ORDER)) {
310
+
311
+ $mapper = C_Displayed_Gallery_Mapper::get_instance();
312
+ foreach ($matches as $match) {
313
+ // Find the displayed gallery
314
+ $displayed_gallery_id = $match[6];
315
+ $displayed_gallery = $mapper->find($displayed_gallery_id, TRUE);
316
+
317
+ // Get the content for the displayed gallery
318
+ $retval = '<p>'._('Invalid Displayed Gallery').'</p>';
319
+ if ($displayed_gallery) {
320
+ $retval = '';
321
+ $renderer = C_Displayed_Gallery_Renderer::get_instance();
322
+ if (defined('NGG_SHOW_DISPLAYED_GALLERY_ERRORS') && NGG_SHOW_DISPLAYED_GALLERY_ERRORS && $displayed_gallery->is_invalid()) {
323
+ $retval .= var_export($displayed_gallery->get_errors(), TRUE);
324
+ }
325
+ if (self::$substitute_placeholders) $retval .= $renderer->render($displayed_gallery, TRUE);
326
+ }
327
+
328
+ $content = str_replace($match[0], $retval, $content);
329
+ }
330
+ }
331
+
332
+ return $content;
333
+ }
334
+
335
+ /**
336
+ * Enqueues static resources required by the Attach to Post interface
337
+ */
338
+ function enqueue_static_resources()
339
+ {
340
+ $router = C_Router::get_instance();
341
+
342
+ // Enqueue resources needed at post/page level
343
+ if ($this->is_new_or_edit_post_screen()) {
344
+ wp_enqueue_script('nextgen_admin_js');
345
+ wp_enqueue_style('nextgen_admin_css');
346
+ wp_enqueue_script('frame_event_publisher');
347
+
348
+ M_Gallery_Display::enqueue_fontawesome();
349
+
350
+ wp_register_script(
351
+ 'Base64',
352
+ $router->get_static_url('photocrati-attach_to_post#base64.js'),
353
+ array(),
354
+ NGG_PLUGIN_VERSION
355
+ );
356
+
357
+ wp_enqueue_style(
358
+ 'ngg_attach_to_post_dialog',
359
+ $router->get_static_url('photocrati-attach_to_post#attach_to_post_dialog.css'),
360
+ array('gritter'),
361
+ NGG_SCRIPT_VERSION
362
+ );
363
+
364
+ wp_enqueue_script(
365
+ 'ngg-igw',
366
+ $router->get_static_url('photocrati-attach_to_post#igw.js'),
367
+ array('jquery', 'Base64', 'gritter'),
368
+ NGG_PLUGIN_VERSION
369
+ );
370
+ wp_localize_script('ngg-igw', 'ngg_igw_i18n', array(
371
+ 'nextgen_gallery' => __('NextGEN Gallery', 'nggallery'),
372
+ 'edit' => __('Edit', 'nggallery'),
373
+ 'remove' => __('Delete', 'nggallery'),
374
+ ));
375
+
376
+ }
377
+
378
+ elseif (isset($_REQUEST['attach_to_post']) OR
379
+ (isset($_REQUEST['page']) && strpos($_REQUEST['page'], 'nggallery') !== FALSE)) {
380
+ wp_enqueue_script(
381
+ 'iframely',
382
+ $router->get_static_url('photocrati-attach_to_post#iframely.js'),
383
+ array(),
384
+ NGG_SCRIPT_VERSION
385
+ );
386
+ wp_enqueue_style(
387
+ 'iframely',
388
+ $router->get_static_url('photocrati-attach_to_post#iframely.css'),
389
+ array(),
390
+ NGG_SCRIPT_VERSION
391
+ );
392
+ wp_enqueue_script('nextgen_admin_js');
393
+ }
394
+ }
395
+
396
+ function is_new_or_edit_post_screen()
397
+ {
398
+ return preg_match("/\/wp-admin\/(post|post-new)\.php$/", $_SERVER['SCRIPT_NAME']);
399
+ }
400
+
401
+ function can_use_tinymce()
402
+ {
403
+ $checks = array(
404
+ M_Security::is_allowed('NextGEN Attach Interface'),
405
+ M_Security::is_allowed('NextGEN Use TinyMCE'),
406
+ get_user_option('rich_editing') == 'true'
407
+ );
408
+ return !in_array(FALSE, $checks);
409
+ }
410
+
411
+ /**
412
+ * Enqueues resources needed by the TinyMCE editor
413
+ */
414
+ function enqueue_tinymce_resources()
415
+ {
416
+ if ($this->is_new_or_edit_post_screen()) {
417
+ $router = C_Router::get_instance();
418
+
419
+ add_editor_style($router->get_static_url('photocrati-attach_to_post#ngg_attach_to_post_tinymce_plugin.css'));
420
+ wp_enqueue_script('photocrati_ajax');
421
+
422
+
423
+ wp_localize_script('media-editor', 'igw', [
424
+ 'url' => C_NextGen_Settings::get_instance()->attach_to_post_url
425
+ ]);
426
+
427
+ wp_localize_script(
428
+ 'photocrati_ajax',
429
+ 'ngg_tinymce_plugin',
430
+ array(
431
+ 'url' => add_query_arg(
432
+ 'ver',
433
+ NGG_SCRIPT_VERSION,
434
+ $router->get_static_url('photocrati-attach_to_post#ngg_attach_to_post_tinymce_plugin.js')
435
+ ),
436
+ 'name' => $this->attach_to_post_tinymce_plugin,
437
+ 'i18n' => array(
438
+ 'button_label' => __('Add NextGEN Gallery', 'nextgen-gallery')
439
+ )
440
+ )
441
+ );
442
+ }
443
+ }
444
+
445
+ /**
446
+ * Adds a TinyMCE button for the Attach To Post plugin
447
+ * @param array $buttons
448
+ * @return array
449
+ */
450
+ function add_attach_to_post_button($buttons)
451
+ {
452
+ if ($this->can_use_tinymce()) {
453
+ array_push(
454
+ $buttons,
455
+ 'separator',
456
+ $this->attach_to_post_tinymce_plugin
457
+ );
458
+ }
459
+
460
+ return $buttons;
461
+ }
462
+
463
+ /**
464
+ * Adds the Attach To Post TinyMCE plugin
465
+ * @param array $plugins
466
+ * @return array
467
+ * @uses mce_external_plugins filter
468
+ */
469
+ function add_attach_to_post_tinymce_plugin($plugins)
470
+ {
471
+ if ($this->can_use_tinymce()) {
472
+ $router = C_Router::get_instance();
473
+ $plugins[$this->attach_to_post_tinymce_plugin] = add_query_arg(
474
+ 'ver',
475
+ NGG_SCRIPT_VERSION,
476
+ $router->get_static_url('photocrati-attach_to_post#ngg_attach_to_post_tinymce_plugin.js')
477
+ );
478
+ }
479
+
480
+ return $plugins;
481
+ }
482
+
483
+ /**
484
+ * Adds the Attach To Post TinyMCE i18n strings
485
+ * @param $mce_translation
486
+ * @return mixed
487
+ */
488
+ function add_attach_to_post_tinymce_i18n($mce_translation)
489
+ {
490
+ $mce_translation['ngg_attach_to_post.title'] = __('Attach NextGEN Gallery to Post', 'nggallery');
491
+ return $mce_translation;
492
+ }
493
+
494
+ /**
495
+ * Notify frames that a new gallery has been created
496
+ * @param int $gallery_id
497
+ */
498
+ function new_gallery_event($gallery_id)
499
+ {
500
+ $gallery = C_Gallery_Mapper::get_instance()->find($gallery_id);
501
+ if ($gallery) {
502
+ $this->_get_frame_event_publisher()->add_event(array(
503
+ 'event' => 'new_gallery',
504
+ 'gallery_id'=> intval($gallery_id),
505
+ 'gallery_title' => $gallery->title
506
+ ));
507
+ }
508
+ }
509
+
510
+ /**
511
+ * Notifies a frame that images have been added to a gallery
512
+ * @param int $gallery_id
513
+ * @param array $image_ids
514
+ */
515
+ function images_added_event($gallery_id, $image_ids=array())
516
+ {
517
+ $this->_get_frame_event_publisher()->add_event(array(
518
+ 'event' => 'images_added',
519
+ 'gallery_id' => intval($gallery_id)
520
+ ));
521
+ }
522
+
523
+ /**
524
+ * Notifies a frame that the tags have changed
525
+ *
526
+ * @param array $tags
527
+ */
528
+ function manage_tags_event($tags = array())
529
+ {
530
+ $this->_get_frame_event_publisher()->add_event(array(
531
+ 'event' => 'manage_tags',
532
+ 'tags' => $tags
533
+ ));
534
+ }
535
+
536
+ /**
537
+ * Notifies a frame that an action has been performed on a particular
538
+ * NextGEN page
539
+ * @param array $event
540
+ */
541
+ function nextgen_page_event($event)
542
+ {
543
+ $this->_get_frame_event_publisher()->add_event($event);
544
+ }
545
+
546
+ /**
547
+ * @return array
548
+ */
549
+ function get_type_list()
550
+ {
551
+ return array(
552
+ 'A_Attach_To_Post_Ajax' => 'adapter.attach_to_post_ajax.php',
553
+ 'C_Attach_To_Post_Installer' => 'class.attach_to_post_installer.php',
554
+ 'A_Gallery_Storage_Frame_Event' => 'adapter.gallery_storage_frame_event.php',
555
+ 'C_Attach_Controller' => 'class.attach_controller.php',
556
+ 'C_Attach_To_Post_Proxy_Controller' => 'class.attach_to_post_proxy_controller.php',
557
+ 'Mixin_Attach_To_Post_Display_Tab' => 'mixin.attach_to_post_display_tab.php'
558
+ );
559
+ }
560
+ }
561
+
562
+ class C_Attach_To_Post_Option_Handler
563
+ {
564
+ function get_router()
565
+ {
566
+ return C_Router::get_instance();
567
+ }
568
+
569
+ function get($key, $default=NULL)
570
+ {
571
+ $retval = $default;
572
+
573
+ switch ($key) {
574
+ case 'attach_to_post_url':
575
+ $retval = admin_url('/?'.NGG_ATTACH_TO_POST_SLUG.'=1');
576
+ break;
577
+ case 'gallery_preview_url':
578
+ // TODO: This url will be used in 2.0.69
579
+ if (FALSE) $retval = admin_url('/?'.NGG_ATTACH_TO_POST_SLUG.'='.NGG_ATTACH_TO_POST_SLUG.'/preview');
580
+ else $retval = $this->get_router()->get_url('/'.NGG_ATTACH_TO_POST_SLUG.'/preview', FALSE);
581
+ break;
582
+ case 'attach_to_post_display_tab_js_url':
583
+ $retval = admin_url('/?'.NGG_ATTACH_TO_POST_SLUG.'=js');
584
+ break;
585
+ }
586
+
587
+ if (is_ssl() && strpos($retval, 'https') === FALSE) $retval = str_replace('http', 'https', $retval);
588
+
589
+ return $retval;
590
+ }
591
+ }
592
+
593
+ class C_Attach_To_Post_Installer
594
+ {
595
+ function install()
596
+ {
597
+ // Delete cached values. Needed for 2.0.7 and less
598
+ $settings = C_NextGen_Settings::get_instance();
599
+ $settings->delete('attach_to_post_url');
600
+ $settings->delete('gallery_preview_url');
601
+ $settings->delete('attach_to_post_display_tab_js_url');
602
+ }
603
+ }
604
+
605
+ new M_Attach_To_Post();
nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/package.module.attach_to_post.php ADDED
@@ -0,0 +1,853 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Provides AJAX actions for the Attach To Post interface
4
+ * TODO: Need to add authorization checks to each action
5
+ *
6
+ * @mixin C_Ajax_Controller
7
+ * @adapts I_Ajax_Controller
8
+ */
9
+ class A_Attach_To_Post_Ajax extends Mixin
10
+ {
11
+ var $attach_to_post = NULL;
12
+ /**
13
+ * Retrieves the attach to post controller
14
+ */
15
+ function get_attach_to_post()
16
+ {
17
+ if (is_null($this->attach_to_post)) {
18
+ $this->attach_to_post = C_Attach_Controller::get_instance();
19
+ }
20
+ return $this->attach_to_post;
21
+ }
22
+ /**
23
+ * Returns a list of image sources for the Attach to Post interface
24
+ * @return array
25
+ */
26
+ function get_attach_to_post_sources_action()
27
+ {
28
+ $response = array();
29
+ if ($this->object->validate_ajax_request('nextgen_edit_displayed_gallery')) {
30
+ $response['sources'] = $this->get_attach_to_post()->get_sources();
31
+ }
32
+ return $response;
33
+ }
34
+ /**
35
+ * Gets existing galleries
36
+ * @return array
37
+ */
38
+ function get_existing_galleries_action()
39
+ {
40
+ $this->debug = TRUE;
41
+ $response = array();
42
+ if ($this->object->validate_ajax_request('nextgen_edit_displayed_gallery')) {
43
+ $limit = $this->object->param('limit');
44
+ $offset = $this->object->param('offset');
45
+ // We return the total # of galleries, so that the client can make
46
+ // pagination requests
47
+ $mapper = C_Gallery_Mapper::get_instance();
48
+ $response['total'] = $mapper->count();
49
+ $response['limit'] = $limit = $limit ? $limit : 0;
50
+ $response['offset'] = $offset = $offset ? $offset : 0;
51
+ // Get the galleries
52
+ $mapper->select();
53
+ if ($limit) {
54
+ $mapper->limit($limit, $offset);
55
+ }
56
+ $response['items'] = $mapper->run_query();
57
+ } else {
58
+ $response['error'] = 'insufficient access';
59
+ }
60
+ $this->debug = FALSE;
61
+ return $response;
62
+ }
63
+ /**
64
+ * Gets existing albums
65
+ * @return array
66
+ */
67
+ function get_existing_albums_action()
68
+ {
69
+ $response = array();
70
+ if ($this->object->validate_ajax_request('nextgen_edit_displayed_gallery')) {
71
+ $limit = $this->object->param('limit');
72
+ $offset = $this->object->param('offset');
73
+ // We return the total # of albums, so that the client can make pagination requests
74
+ $mapper = C_Album_Mapper::get_instance();
75
+ $response['total'] = $mapper->count();
76
+ $response['limit'] = $limit = $limit ? $limit : 0;
77
+ $response['offset'] = $offset = $offset ? $offset : 0;
78
+ // Get the albums
79
+ $mapper->select();
80
+ if ($limit) {
81
+ $mapper->limit($limit, $offset);
82
+ }
83
+ $response['items'] = $mapper->run_query();
84
+ }
85
+ return $response;
86
+ }
87
+ /**
88
+ * Gets existing image tags
89
+ * @return array
90
+ */
91
+ function get_existing_image_tags_action()
92
+ {
93
+ $response = array();
94
+ if ($this->object->validate_ajax_request('nextgen_edit_displayed_gallery')) {
95
+ $limit = $this->object->param('limit');
96
+ $offset = $this->object->param('offset');
97
+ $response['limit'] = $limit = $limit ? $limit : 0;
98
+ $response['offset'] = $offset = $offset ? $offset : 0;
99
+ $response['items'] = array();
100
+ $params = array('number' => $limit, 'offset' => $offset, 'fields' => 'names');
101
+ foreach (get_terms('ngg_tag', $params) as $term) {
102
+ $response['items'][] = array('id' => $term, 'title' => $term, 'name' => $term);
103
+ }
104
+ $response['total'] = count(get_terms('ngg_tag', array('fields' => 'ids')));
105
+ }
106
+ return $response;
107
+ }
108
+ /**
109
+ * Gets entities (such as images) for a displayed gallery (attached gallery)
110
+ */
111
+ function get_displayed_gallery_entities_action()
112
+ {
113
+ $response = array();
114
+ if ($this->object->validate_ajax_request('nextgen_edit_displayed_gallery') && ($params = $this->object->param('displayed_gallery'))) {
115
+ global $wpdb;
116
+ $limit = $this->object->param('limit');
117
+ $offset = $this->object->param('offset');
118
+ $factory = C_Component_Factory::get_instance();
119
+ $displayed_gallery = $factory->create('displayed_gallery');
120
+ foreach ($params as $key => $value) {
121
+ $key = $wpdb->_escape($key);
122
+ if (!in_array($key, array('container_ids', 'entity_ids', 'sortorder'))) {
123
+ $value = esc_sql($value);
124
+ }
125
+ $displayed_gallery->{$key} = $value;
126
+ }
127
+ $response['limit'] = $limit = $limit ? esc_sql($limit) : 0;
128
+ $response['offset'] = $offset = $offset ? esc_sql($offset) : 0;
129
+ $response['total'] = $displayed_gallery->get_entity_count('both');
130
+ $response['items'] = $displayed_gallery->get_entities($limit, $offset, FALSE, 'both');
131
+ $controller = C_Display_Type_Controller::get_instance();
132
+ $storage = C_Gallery_Storage::get_instance();
133
+ $image_mapper = C_Image_Mapper::get_instance();
134
+ $settings = C_NextGen_Settings::get_instance();
135
+ foreach ($response['items'] as &$entity) {
136
+ $image = $entity;
137
+ if (in_array($displayed_gallery->source, array('album', 'albums'))) {
138
+ // Set the alttext of the preview image to the
139
+ // name of the gallery or album
140
+ if ($image = $image_mapper->find($entity->previewpic)) {
141
+ if ($entity->is_album) {
142
+ $image->alttext = sprintf(__('Album: %s', 'nggallery'), $entity->name);
143
+ } else {
144
+ $image->alttext = sprintf(__('Gallery: %s', 'nggallery'), $entity->title);
145
+ }
146
+ }
147
+ // Prefix the id of an album with 'a'
148
+ if ($entity->is_album) {
149
+ $id = $entity->{$entity->id_field};
150
+ $entity->{$entity->id_field} = 'a' . $id;
151
+ }
152
+ }
153
+ // Get the thumbnail
154
+ $entity->thumb_url = $storage->get_image_url($image, 'thumb', TRUE);
155
+ $entity->thumb_html = $storage->get_image_html($image, 'thumb');
156
+ }
157
+ } else {
158
+ $response['error'] = __('Missing parameters', 'nggallery');
159
+ }
160
+ return $response;
161
+ }
162
+ /**
163
+ * Saves the displayed gallery
164
+ */
165
+ function save_displayed_gallery_action()
166
+ {
167
+ $response = array();
168
+ $mapper = C_Displayed_Gallery_Mapper::get_instance();
169
+ // Do we have fields to work with?
170
+ if ($this->object->validate_ajax_request('nextgen_edit_displayed_gallery', true) && ($params = json_decode($this->object->param('displayed_gallery')))) {
171
+ // Existing displayed gallery ?
172
+ if ($id = $this->object->param('id')) {
173
+ $displayed_gallery = $mapper->find($id, TRUE);
174
+ if ($displayed_gallery) {
175
+ foreach ($params as $key => $value) {
176
+ $displayed_gallery->{$key} = $value;
177
+ }
178
+ }
179
+ } else {
180
+ $factory = C_Component_Factory::get_instance();
181
+ $displayed_gallery = $factory->create('displayed_gallery', $params, $mapper);
182
+ }
183
+ // Save the changes
184
+ if ($displayed_gallery) {
185
+ if ($displayed_gallery->save()) {
186
+ $response['displayed_gallery'] = $displayed_gallery->get_entity();
187
+ } else {
188
+ $response['validation_errors'] = $this->get_attach_to_post()->show_errors_for($displayed_gallery, TRUE);
189
+ }
190
+ } else {
191
+ $response['error'] = __('Displayed gallery does not exist', 'nggallery');
192
+ }
193
+ } else {
194
+ $response['error'] = __('Invalid request', 'nggallery');
195
+ }
196
+ return $response;
197
+ }
198
+ }
199
+ /**
200
+ * Class A_Gallery_Storage_Frame_Event
201
+ * @mixin C_Gallery_Storage
202
+ * @adapts I_Gallery_Storage
203
+ */
204
+ class A_Gallery_Storage_Frame_Event extends Mixin
205
+ {
206
+ function generate_thumbnail($image, $params = null, $skip_defaults = false)
207
+ {
208
+ $retval = $this->call_parent('generate_thumbnail', $image, $params, $skip_defaults);
209
+ if (is_admin() && ($image = C_Image_Mapper::get_instance()->find($image))) {
210
+ $controller = C_Display_Type_Controller::get_instance();
211
+ $storage = C_Gallery_Storage::get_instance();
212
+ $app = C_Router::get_instance()->get_routed_app();
213
+ $image->thumb_url = $controller->set_param_for($app->get_routed_url(TRUE), 'timestamp', time(), NULL, $storage->get_thumb_url($image));
214
+ $event = new stdClass();
215
+ $event->pid = $image->{$image->id_field};
216
+ $event->id_field = $image->id_field;
217
+ $event->thumb_url = $image->thumb_url;
218
+ C_Frame_Event_Publisher::get_instance('attach_to_post')->add_event(array('event' => 'thumbnail_modified', 'image' => $event));
219
+ }
220
+ return $retval;
221
+ }
222
+ }
223
+ /**
224
+ * Class C_Attach_Controller
225
+ * @mixin Mixin_Attach_To_Post
226
+ * @mixin Mixin_Attach_To_Post_Display_Tab
227
+ * @implements I_Attach_To_Post_Controller
228
+ */
229
+ class C_Attach_Controller extends C_NextGen_Admin_Page_Controller
230
+ {
231
+ static $_instances = array();
232
+ var $_displayed_gallery;
233
+ var $_marked_scripts;
234
+ var $_is_rendering;
235
+ static function &get_instance($context = 'all')
236
+ {
237
+ if (!isset(self::$_instances[$context])) {
238
+ $klass = get_class();
239
+ self::$_instances[$context] = new $klass($context);
240
+ }
241
+ return self::$_instances[$context];
242
+ }
243
+ function define($context = FALSE)
244
+ {
245
+ if (!is_array($context)) {
246
+ $context = array($context);
247
+ }
248
+ array_unshift($context, 'ngg_attach_to_post');
249
+ parent::define($context);
250
+ $this->add_mixin('Mixin_Attach_To_Post');
251
+ $this->add_mixin('Mixin_Attach_To_Post_Display_Tab');
252
+ $this->implement('I_Attach_To_Post_Controller');
253
+ }
254
+ function initialize()
255
+ {
256
+ parent::initialize();
257
+ $this->_load_displayed_gallery();
258
+ if (!has_action('wp_print_scripts', array($this, 'filter_scripts'))) {
259
+ add_action('wp_print_scripts', array($this, 'filter_scripts'));
260
+ }
261
+ if (!has_action('wp_print_scripts', array($this, 'filter_styles'))) {
262
+ add_action('wp_print_scripts', array($this, 'filter_styles'));
263
+ }
264
+ }
265
+ }
266
+ class Mixin_Attach_To_Post extends Mixin
267
+ {
268
+ function _load_displayed_gallery()
269
+ {
270
+ $mapper = C_Displayed_Gallery_Mapper::get_instance();
271
+ // Fetch the displayed gallery by ID
272
+ if ($id = $this->object->param('id')) {
273
+ $this->object->_displayed_gallery = $mapper->find($id, TRUE);
274
+ } else {
275
+ if (isset($_REQUEST['shortcode'])) {
276
+ // Fetch the displayed gallery by shortcode
277
+ $shortcode = base64_decode($_REQUEST['shortcode']);
278
+ // $shortcode lacks the opening and closing brackets but still begins with 'ngg ' or 'ngg_images ' which are not parameters
279
+ $params = preg_replace('/^(ngg|ngg_images) /i', '', $shortcode, 1);
280
+ $params = stripslashes($params);
281
+ $params = str_replace(array('[', ']'), array('&#91;', '&#93;'), $params);
282
+ $params = shortcode_parse_atts($params);
283
+ $this->object->_displayed_gallery = C_Displayed_Gallery_Renderer::get_instance()->params_to_displayed_gallery($params);
284
+ }
285
+ }
286
+ // If all else fails, then create fresh with a new displayed gallery
287
+ if (empty($this->object->_displayed_gallery)) {
288
+ $this->object->_displayed_gallery = $mapper->create();
289
+ }
290
+ }
291
+ /**
292
+ * Gets all dependencies for a particular resource that has been registered using wp_register_style/wp_register_script
293
+ * @param $handle
294
+ * @param $type
295
+ *
296
+ * @return array
297
+ */
298
+ function get_resource_dependencies($handle, $type)
299
+ {
300
+ $retval = array();
301
+ $wp_resources = $GLOBALS[$type];
302
+ if (($index = array_search($handle, $wp_resources->registered)) !== FALSE) {
303
+ $registered_script = $wp_resources->registered[$index];
304
+ if ($registered_script->deps) {
305
+ foreach ($registered_script->deps as $dep) {
306
+ $retval[] = $dep;
307
+ $retval = array_merge($retval, $this->get_script_dependencies($handle));
308
+ }
309
+ }
310
+ }
311
+ return $retval;
312
+ }
313
+ function get_script_dependencies($handle)
314
+ {
315
+ return $this->get_resource_dependencies($handle, 'wp_scripts');
316
+ }
317
+ function get_style_dependencies($handle)
318
+ {
319
+ return $this->get_resource_dependencies($handle, 'wp_styles');
320
+ }
321
+ function get_ngg_provided_resources($type)
322
+ {
323
+ $wp_resources = $GLOBALS[$type];
324
+ $retval = array();
325
+ foreach ($wp_resources->queue as $handle) {
326
+ $script = $wp_resources->registered[$handle];
327
+ if (strpos($script->src, plugin_dir_url(NGG_PLUGIN_BASENAME)) !== FALSE) {
328
+ $retval[] = $handle;
329
+ }
330
+ if (defined('NGG_PRO_PLUGIN_BASENAME') && strpos($script->src, plugin_dir_url(NGG_PRO_PLUGIN_BASENAME)) !== FALSE) {
331
+ $retval[] = $handle;
332
+ }
333
+ if (defined('NGG_PLUS_PLUGIN_BASENAME') && strpos($script->src, plugin_dir_url(NGG_PLUS_PLUGIN_BASENAME)) !== FALSE) {
334
+ $retval[] = $handle;
335
+ }
336
+ }
337
+ return array_unique($retval);
338
+ }
339
+ function get_ngg_provided_scripts()
340
+ {
341
+ return $this->get_ngg_provided_resources('wp_scripts');
342
+ }
343
+ function get_ngg_provided_styles()
344
+ {
345
+ return $this->get_ngg_provided_resources('wp_styles');
346
+ }
347
+ function get_igw_allowed_scripts()
348
+ {
349
+ $retval = array();
350
+ foreach ($this->get_ngg_provided_scripts() as $handle) {
351
+ $retval[] = $handle;
352
+ $retval = array_merge($retval, $this->get_script_dependencies($handle));
353
+ }
354
+ foreach ($this->get_display_type_scripts() as $handle) {
355
+ $retval[] = $handle;
356
+ $retval = array_merge($retval, $this->get_script_dependencies($handle));
357
+ }
358
+ foreach ($this->attach_to_post_scripts as $handle) {
359
+ $retval[] = $handle;
360
+ $retval = array_merge($retval, $this->get_script_dependencies($handle));
361
+ }
362
+ return array_unique(apply_filters('ngg_igw_approved_scripts', $retval));
363
+ }
364
+ function get_display_type_scripts()
365
+ {
366
+ global $wp_scripts;
367
+ $wp_scripts->old_queue = $wp_scripts->queue;
368
+ $wp_scripts->queue = array();
369
+ $mapper = C_Display_Type_Mapper::get_instance();
370
+ foreach ($mapper->find_all() as $display_type) {
371
+ $form = C_Form::get_instance($display_type->name);
372
+ $form->enqueue_static_resources();
373
+ }
374
+ $retval = $wp_scripts->queue;
375
+ $wp_scripts->queue = $wp_scripts->old_queue;
376
+ unset($wp_scripts->old_queue);
377
+ return $retval;
378
+ }
379
+ function get_display_type_styles()
380
+ {
381
+ global $wp_styles;
382
+ $wp_styles->old_queue = $wp_styles->queue;
383
+ $wp_styles->queue = array();
384
+ $mapper = C_Display_Type_Mapper::get_instance();
385
+ foreach ($mapper->find_all() as $display_type) {
386
+ $form = C_Form::get_instance($display_type->name);
387
+ $form->enqueue_static_resources();
388
+ }
389
+ $retval = $wp_styles->queue;
390
+ $wp_styles->queue = $wp_styles->old_queue;
391
+ unset($wp_styles->old_queue);
392
+ return $retval;
393
+ }
394
+ function get_igw_allowed_styles()
395
+ {
396
+ $retval = array();
397
+ foreach ($this->get_ngg_provided_styles() as $handle) {
398
+ $retval[] = $handle;
399
+ $retval = array_merge($retval, $this->get_style_dependencies($handle));
400
+ }
401
+ foreach ($this->get_display_type_styles() as $handle) {
402
+ $retval[] = $handle;
403
+ $retval = array_merge($retval, $this->get_style_dependencies($handle));
404
+ }
405
+ foreach ($this->attach_to_post_styles as $handle) {
406
+ $retval[] = $handle;
407
+ $retval = array_merge($retval, $this->get_style_dependencies($handle));
408
+ }
409
+ return array_unique(apply_filters('ngg_igw_approved_styles', $retval));
410
+ }
411
+ function filter_scripts()
412
+ {
413
+ global $wp_scripts;
414
+ $new_queue = array();
415
+ $current_queue = $wp_scripts->queue;
416
+ $approved = $this->get_igw_allowed_scripts();
417
+ foreach ($current_queue as $handle) {
418
+ if (in_array($handle, $approved)) {
419
+ $new_queue[] = $handle;
420
+ }
421
+ }
422
+ $wp_scripts->queue = $new_queue;
423
+ }
424
+ function filter_styles()
425
+ {
426
+ global $wp_styles;
427
+ $new_queue = array();
428
+ $current_queue = $wp_styles->queue;
429
+ $approved = $this->get_igw_allowed_styles();
430
+ foreach ($current_queue as $handle) {
431
+ if (in_array($handle, $approved)) {
432
+ $new_queue[] = $handle;
433
+ }
434
+ }
435
+ $wp_styles->queue = $new_queue;
436
+ }
437
+ function mark_script($handle)
438
+ {
439
+ return FALSE;
440
+ }
441
+ function enqueue_display_tab_js()
442
+ {
443
+ // Enqueue backbone.js library, required by the Attach to Post display tab
444
+ wp_enqueue_script('backbone');
445
+ // provided by WP
446
+ $this->object->mark_script('backbone');
447
+ // Enqueue the backbone app for the display tab
448
+ // Get all entities used by the display tab
449
+ $context = 'attach_to_post';
450
+ $gallery_mapper = $this->get_registry()->get_utility('I_Gallery_Mapper', $context);
451
+ $album_mapper = $this->get_registry()->get_utility('I_Album_Mapper', $context);
452
+ $image_mapper = $this->get_registry()->get_utility('I_Image_Mapper', $context);
453
+ $display_type_mapper = $this->get_registry()->get_utility('I_Display_Type_Mapper', $context);
454
+ $sources = C_Displayed_Gallery_Source_Manager::get_instance();
455
+ $settings = C_NextGen_Settings::get_instance();
456
+ // Get the nextgen tags
457
+ global $wpdb;
458
+ $tags = $wpdb->get_results("SELECT DISTINCT name AS 'id', name FROM {$wpdb->terms}\n WHERE term_id IN (\n SELECT term_id FROM {$wpdb->term_taxonomy}\n WHERE taxonomy = 'ngg_tag'\n )");
459
+ $all_tags = new stdClass();
460
+ $all_tags->name = "All";
461
+ $all_tags->id = "All";
462
+ array_unshift($tags, $all_tags);
463
+ $display_types = array();
464
+ $registry = C_Component_Registry::get_instance();
465
+ $display_type_mapper->flush_query_cache();
466
+ foreach ($display_type_mapper->find_all() as $display_type) {
467
+ if (isset($display_type->hidden_from_igw) && $display_type->hidden_from_igw || isset($display_type->hidden_from_ui) && $display_type->hidden_from_ui) {
468
+ continue;
469
+ }
470
+ $available = $registry->is_module_loaded($display_type->name);
471
+ if (!apply_filters('ngg_atp_show_display_type', $available, $display_type)) {
472
+ continue;
473
+ }
474
+ // Some display types were saved with values like "nextgen-gallery-pro/modules/nextgen_pro_imagebrowser/static/preview.jpg"
475
+ // as the preview_image_relpath property
476
+ if (strpos($display_type->preview_image_relpath, '#') === FALSE) {
477
+ $static_path = preg_replace("#^.*static/#", "", $display_type->preview_image_relpath);
478
+ $module_id = isset($display_type->module_id) ? $display_type->module_id : $display_type->name;
479
+ if ($module_id == 'photocrati-nextgen_basic_slideshow') {
480
+ $display_type->module_id = $module_id = 'photocrati-nextgen_basic_gallery';
481
+ }
482
+ $display_type->preview_image_relpath = "{$module_id}#{$static_path}";
483
+ $display_type_mapper->save($display_type);
484
+ $display_type_mapper->flush_query_cache();
485
+ }
486
+ $display_type->preview_image_url = M_Static_Assets::get_static_url($display_type->preview_image_relpath);
487
+ $display_types[] = $display_type;
488
+ }
489
+ usort($display_types, array($this->object, '_display_type_list_sort'));
490
+ wp_enqueue_script('ngg_display_tab', $this->get_static_url('photocrati-attach_to_post#display_tab.js'), array('jquery', 'backbone', 'photocrati_ajax'), NGG_ATTACH_TO_POST_VERSION);
491
+ $this->object->mark_script('ngg_display_tab');
492
+ wp_localize_script('ngg_display_tab', 'igw_data', array('displayed_gallery_preview_url' => $settings->gallery_preview_url, 'displayed_gallery' => $this->object->_displayed_gallery->get_entity(), 'sources' => $sources->get_all(), 'gallery_primary_key' => $gallery_mapper->get_primary_key_column(), 'galleries' => $gallery_mapper->find_all(), 'albums' => $album_mapper->find_all(), 'tags' => $tags, 'display_types' => $display_types, 'nonce' => M_Security::create_nonce('nextgen_edit_displayed_gallery'), 'image_primary_key' => $image_mapper->get_primary_key_column(), 'display_type_priority_base' => NGG_DISPLAY_PRIORITY_BASE, 'display_type_priority_step' => NGG_DISPLAY_PRIORITY_STEP, 'shortcode_ref' => isset($_REQUEST['ref']) ? floatval($_REQUEST['ref']) : null, 'shortcode_defaults' => array('order_by' => $settings->galSort, 'order_direction' => $settings->galSortDir, 'returns' => 'included', 'maximum_entity_count' => $settings->maximum_entity_count), 'shortcode_attr_replacements' => array('source' => 'src', 'container_ids' => 'ids', 'display_type' => 'display'), 'i18n' => array('sources' => __('Are you inserting a Gallery (default), an Album, or images based on Tags?', 'nggallery'), 'optional' => __('(optional)', 'nggallery'), 'slug_tooltip' => __('Sets an SEO-friendly name to this gallery for URLs. Currently only in use by the Pro Lightbox', 'nggallery'), 'slug_label' => __('Slug', 'nggallery'), 'no_entities' => __('No entities to display for this source', 'nggallery'), 'exclude_question' => __('Exclude?', 'nggallery'), 'select_gallery' => __('Select a Gallery', 'nggallery'), 'galleries' => __('Select one or more galleries (click in box to see available galleries).', 'nggallery'), 'albums' => __('Select one album (click in box to see available albums).', 'nggallery'))));
493
+ }
494
+ function start_resource_monitoring()
495
+ {
496
+ global $wp_scripts, $wp_styles;
497
+ $this->attach_to_post_scripts = array();
498
+ $this->attach_to_post_styles = array();
499
+ $wp_styles->before_monitoring = $wp_styles->queue;
500
+ $wp_scripts->before_monitoring = $wp_styles->queue;
501
+ }
502
+ function stop_resource_monitoring()
503
+ {
504
+ global $wp_scripts, $wp_styles;
505
+ $this->attach_to_post_scripts = array_diff($wp_scripts->queue, $wp_scripts->before_monitoring);
506
+ $this->attach_to_post_styles = array_diff($wp_styles->queue, $wp_styles->before_monitoring);
507
+ }
508
+ function enqueue_backend_resources()
509
+ {
510
+ $this->start_resource_monitoring();
511
+ $this->call_parent('enqueue_backend_resources');
512
+ // Enqueue frame event publishing
513
+ wp_enqueue_script('frame_event_publisher');
514
+ // Enqueue JQuery UI libraries
515
+ wp_enqueue_script('jquery-ui-tabs');
516
+ wp_enqueue_script('jquery-ui-sortable');
517
+ wp_enqueue_script('jquery-ui-tooltip');
518
+ wp_enqueue_script('ngg_tabs', $this->get_static_url('photocrati-attach_to_post#ngg_tabs.js'), FALSE, NGG_SCRIPT_VERSION);
519
+ wp_enqueue_style('buttons');
520
+ // Ensure select2
521
+ wp_enqueue_style('ngg_select2');
522
+ wp_enqueue_script('ngg_select2');
523
+ // Ensure that the Photocrati AJAX library is loaded
524
+ wp_enqueue_script('photocrati_ajax');
525
+ // Enqueue logic for the Attach to Post interface as a whole
526
+ wp_enqueue_script('ngg_attach_to_post_js', $this->get_static_url('photocrati-attach_to_post#attach_to_post.js'), array(), NGG_SCRIPT_VERSION);
527
+ wp_enqueue_style('ngg_attach_to_post', $this->get_static_url('photocrati-attach_to_post#attach_to_post.css'), array(), NGG_SCRIPT_VERSION);
528
+ wp_dequeue_script('debug-bar-js');
529
+ wp_dequeue_style('debug-bar-css');
530
+ $this->object->enqueue_display_tab_js();
531
+ do_action('ngg_igw_enqueue_scripts');
532
+ do_action('ngg_igw_enqueue_styles');
533
+ $this->stop_resource_monitoring();
534
+ }
535
+ /**
536
+ * Renders the interface
537
+ * @param bool $return
538
+ * @return string
539
+ */
540
+ function index_action($return = FALSE)
541
+ {
542
+ $this->object->enqueue_backend_resources();
543
+ $this->object->do_not_cache();
544
+ // If Elementor is also active a fatal error is generated due to this method not existing
545
+ if (!function_exists('wp_print_media_templates')) {
546
+ require_once ABSPATH . WPINC . '/media-template.php';
547
+ }
548
+ // Enqueue resources
549
+ return $this->object->render_view('photocrati-attach_to_post#attach_to_post', array('page_title' => $this->object->_get_page_title(), 'tabs' => $this->object->_get_main_tabs(), 'logo' => $this->get_static_url('photocrati-nextgen_admin#imagely_icon.png')), $return);
550
+ }
551
+ /**
552
+ * Displays a preview image for the displayed gallery
553
+ */
554
+ function preview_action()
555
+ {
556
+ $found_preview_pic = FALSE;
557
+ $dyn_thumbs = C_Dynamic_Thumbnails_Manager::get_instance();
558
+ $storage = C_Gallery_Storage::get_instance();
559
+ $image_mapper = C_Image_Mapper::get_instance();
560
+ // Get the first entity from the displayed gallery. We will use this
561
+ // for a preview pic
562
+ $results = $this->object->_displayed_gallery->get_included_entities(1);
563
+ $entity = array_pop($results);
564
+ $image = FALSE;
565
+ if ($entity) {
566
+ // This is an album or gallery
567
+ if (isset($entity->previewpic)) {
568
+ $image = (int) $entity->previewpic;
569
+ if ($image = $image_mapper->find($image)) {
570
+ $found_preview_pic = TRUE;
571
+ }
572
+ } else {
573
+ if (isset($entity->galleryid)) {
574
+ $image = $entity;
575
+ $found_preview_pic = TRUE;
576
+ }
577
+ }
578
+ }
579
+ // Were we able to find a preview pic? If so, then render it
580
+ $image_size = $dyn_thumbs->get_size_name(array('width' => 300, 'height' => 200, 'quality' => 90, 'type' => 'jpg', 'watermark' => FALSE, 'crop' => TRUE));
581
+ add_filter('ngg_before_save_thumbnail', array(&$this, 'set_igw_placeholder_text'));
582
+ $found_preview_pic = $storage->render_image($image, $image_size, TRUE);
583
+ remove_filter('ngg_before_save_thumbnail', array(&$this, 'set_igw_placeholder_text'));
584
+ // Render invalid image if no preview pic is found
585
+ if (!$found_preview_pic) {
586
+ $filename = $this->object->get_static_abspath('photocrati-attach_to_post#invalid_image.png');
587
+ $this->set_content_type('image/png');
588
+ readfile($filename);
589
+ $this->render();
590
+ }
591
+ }
592
+ /**
593
+ * Filter for ngg_before_save_thumbnail
594
+ * @param stdClass $thumbnail
595
+ * @return stdClass
596
+ */
597
+ function set_igw_placeholder_text($thumbnail)
598
+ {
599
+ $settings = C_NextGen_Settings::get_instance();
600
+ $thumbnail->applyFilter(IMG_FILTER_BRIGHTNESS, -25);
601
+ $watermark_settings = apply_filters('ngg_igw_placeholder_line_1_settings', array('text' => __("NextGEN Gallery", 'nggallery'), 'font_color' => 'ffffff', 'font' => 'YanoneKaffeesatz-Bold.ttf', 'font_size' => 32));
602
+ if ($watermark_settings) {
603
+ $thumbnail->watermarkText = $watermark_settings['text'];
604
+ $thumbnail->watermarkCreateText($watermark_settings['font_color'], $watermark_settings['font'], $watermark_settings['font_size'], 100);
605
+ $thumbnail->watermarkImage('topCenter', 0, 72);
606
+ }
607
+ $watermark_settings = apply_filters('ngg_igw_placeholder_line_2_settings', array('text' => __("Click to edit", 'nggallery'), 'font_color' => 'ffffff', 'font' => 'YanoneKaffeesatz-Bold.ttf', 'font_size' => 15));
608
+ if ($watermark_settings) {
609
+ $thumbnail->watermarkText = $watermark_settings['text'];
610
+ $thumbnail->watermarkCreateText($watermark_settings['font_color'], $watermark_settings['font'], $watermark_settings['font_size'], 100);
611
+ $thumbnail->watermarkImage('topCenter', 0, 108);
612
+ }
613
+ return $thumbnail;
614
+ }
615
+ /**
616
+ * Returns the page title of the Attach to Post interface
617
+ * @return string
618
+ */
619
+ function _get_page_title()
620
+ {
621
+ return __('NextGEN Gallery - Attach To Post', 'nggallery');
622
+ }
623
+ /**
624
+ * Returns the main tabs displayed on the Attach to Post interface
625
+ * @return array
626
+ */
627
+ function _get_main_tabs()
628
+ {
629
+ $retval = array();
630
+ if (M_Security::is_allowed('NextGEN Manage gallery')) {
631
+ $retval['displayed_tab'] = array('content' => $this->object->_render_display_tab(), 'title' => __('Insert Into Page', 'nggallery'));
632
+ }
633
+ if (M_Security::is_allowed('NextGEN Upload images')) {
634
+ $retval['create_tab'] = array('content' => $this->object->_render_create_tab(), 'title' => __('Upload Images', 'nggallery'));
635
+ }
636
+ if (M_Security::is_allowed('NextGEN Manage others gallery') && M_Security::is_allowed('NextGEN Manage gallery')) {
637
+ $retval['galleries_tab'] = array('content' => $this->object->_render_galleries_tab(), 'title' => __('Manage Galleries', 'nggallery'));
638
+ }
639
+ if (M_Security::is_allowed('NextGEN Edit album')) {
640
+ $retval['albums_tab'] = array('content' => $this->object->_render_albums_tab(), 'title' => __('Manage Albums', 'nggallery'));
641
+ }
642
+ // if ($sec_actor->is_allowed('NextGEN Manage tags')) {
643
+ // $retval['tags_tab'] = array(
644
+ // 'content' => $this->object->_render_tags_tab(),
645
+ // 'title' => __('Manage Tags', 'nggallery')
646
+ // );
647
+ // }
648
+ return apply_filters('ngg_attach_to_post_main_tabs', $retval);
649
+ }
650
+ /**
651
+ * Renders a NextGen Gallery page in an iframe, suited for the attach to post
652
+ * interface
653
+ * @param string $page
654
+ * @param null|int $tab_id (optional)
655
+ * @return string
656
+ */
657
+ function _render_ngg_page_in_frame($page, $tab_id = null)
658
+ {
659
+ $frame_url = admin_url("/admin.php?page={$page}&attach_to_post");
660
+ $frame_url = nextgen_esc_url($frame_url);
661
+ if ($tab_id) {
662
+ $tab_id = " id='ngg-iframe-{$tab_id}'";
663
+ }
664
+ return "<iframe name='{$page}' frameBorder='0'{$tab_id} class='ngg-attach-to-post ngg-iframe-page-{$page}' scrolling='yes' src='{$frame_url}'></iframe>";
665
+ }
666
+ /**
667
+ * Renders the display tab for adjusting how images/galleries will be displayed
668
+ * @return string
669
+ */
670
+ function _render_display_tab()
671
+ {
672
+ return $this->object->render_partial('photocrati-attach_to_post#display_tab', array('messages' => array(), 'displayed_gallery' => $this->object->_displayed_gallery, 'tabs' => $this->object->_get_display_tabs()), TRUE);
673
+ }
674
+ /**
675
+ * Renders the tab used primarily for Gallery and Image creation
676
+ * @return string
677
+ */
678
+ function _render_create_tab()
679
+ {
680
+ return $this->object->_render_ngg_page_in_frame('ngg_addgallery', 'create_tab');
681
+ }
682
+ /**
683
+ * Renders the tab used for Managing Galleries
684
+ * @return string
685
+ */
686
+ function _render_galleries_tab()
687
+ {
688
+ return $this->object->_render_ngg_page_in_frame('nggallery-manage-gallery', 'galleries_tab');
689
+ }
690
+ /**
691
+ * Renders the tab used for Managing Albums
692
+ */
693
+ function _render_albums_tab()
694
+ {
695
+ return $this->object->_render_ngg_page_in_frame('nggallery-manage-album', 'albums_tab');
696
+ }
697
+ /**
698
+ * Renders the tab used for Managing Albums
699
+ * @return string
700
+ */
701
+ function _render_tags_tab()
702
+ {
703
+ return $this->object->_render_ngg_page_in_frame('nggallery-tags', 'tags_tab');
704
+ }
705
+ }
706
+ /**
707
+ * Provides the "Display Tab" for the Attach To Post interface/controller
708
+ * @see C_Attach_Controller adds this mixin
709
+ */
710
+ class Mixin_Attach_To_Post_Display_Tab extends Mixin
711
+ {
712
+ function _display_type_list_sort($type_1, $type_2)
713
+ {
714
+ $order_1 = $type_1->view_order;
715
+ $order_2 = $type_2->view_order;
716
+ if ($order_1 == null) {
717
+ $order_1 = NGG_DISPLAY_PRIORITY_BASE;
718
+ }
719
+ if ($order_2 == null) {
720
+ $order_2 = NGG_DISPLAY_PRIORITY_BASE;
721
+ }
722
+ if ($order_1 > $order_2) {
723
+ return 1;
724
+ }
725
+ if ($order_1 < $order_2) {
726
+ return -1;
727
+ }
728
+ return 0;
729
+ }
730
+ /**
731
+ * Gets a list of tabs to render for the "Display" tab
732
+ */
733
+ function _get_display_tabs()
734
+ {
735
+ // The ATP requires more memmory than some applications, somewhere around 60MB.
736
+ // Because it's such an important feature of NextGEN Gallery, we temporarily disable
737
+ // any memory limits
738
+ if (!extension_loaded('suhosin')) {
739
+ @ini_set('memory_limit', -1);
740
+ }
741
+ return array('choose_display_tab' => $this->object->_render_choose_display_tab(), 'display_settings_tab' => $this->object->_render_display_settings_tab(), 'preview_tab' => $this->object->_render_preview_tab());
742
+ }
743
+ /**
744
+ * Renders the accordion tab, "What would you like to display?"
745
+ */
746
+ function _render_choose_display_tab()
747
+ {
748
+ return array('id' => 'choose_display', 'title' => __('Choose Display', 'nggallery'), 'content' => $this->object->_render_display_source_tab_contents() . $this->object->_render_display_type_tab_contents());
749
+ }
750
+ /**
751
+ * Renders the contents of the source tab
752
+ * @return string
753
+ */
754
+ function _render_display_source_tab_contents()
755
+ {
756
+ return $this->object->render_partial('photocrati-attach_to_post#display_tab_source', array('i18n' => array()), TRUE);
757
+ }
758
+ /**
759
+ * Renders the contents of the display type tab
760
+ */
761
+ function _render_display_type_tab_contents()
762
+ {
763
+ return $this->object->render_partial('photocrati-attach_to_post#display_tab_type', array(), TRUE);
764
+ }
765
+ /**
766
+ * Renders the display settings tab for the Attach to Post interface
767
+ * @return array
768
+ */
769
+ function _render_display_settings_tab()
770
+ {
771
+ return array('id' => 'display_settings_tab', 'title' => __('Customize Display Settings', 'nggallery'), 'content' => $this->object->_render_display_settings_contents());
772
+ }
773
+ /**
774
+ * If editing an existing displayed gallery, retrieves the name
775
+ * of the display type
776
+ * @return string
777
+ */
778
+ function _get_selected_display_type_name()
779
+ {
780
+ $retval = '';
781
+ if ($this->object->_displayed_gallery) {
782
+ $retval = $this->object->_displayed_gallery->display_type;
783
+ }
784
+ return $retval;
785
+ }
786
+ /**
787
+ * Is the displayed gallery that's being edited using the specified display
788
+ * type?
789
+ * @param string $name name of the display type
790
+ * @return bool
791
+ */
792
+ function is_displayed_gallery_using_display_type($name)
793
+ {
794
+ $retval = FALSE;
795
+ if ($this->object->_displayed_gallery) {
796
+ $retval = $this->object->_displayed_gallery->display_type == $name;
797
+ }
798
+ return $retval;
799
+ }
800
+ /**
801
+ * Renders the contents of the display settings tab
802
+ * @return string
803
+ */
804
+ function _render_display_settings_contents()
805
+ {
806
+ $retval = array();
807
+ // Get all display setting forms
808
+ $form_manager = C_Form_Manager::get_instance();
809
+ $forms = $form_manager->get_forms(NGG_DISPLAY_SETTINGS_SLUG, TRUE);
810
+ // Display each form
811
+ foreach ($forms as $form) {
812
+ // Enqueue the form's static resources
813
+ $form->enqueue_static_resources();
814
+ // Determine which classes to use for the form's "class" attribute
815
+ $model = $form->get_model();
816
+ $current = $this->object->is_displayed_gallery_using_display_type($model->name);
817
+ $css_class = $current ? 'display_settings_form' : 'display_settings_form hidden';
818
+ $defaults = $model->settings;
819
+ // If this form is used to provide the display settings for the current
820
+ // displayed gallery, then we need to override the forms settings
821
+ // with the displayed gallery settings
822
+ if ($current) {
823
+ $settings = $this->array_merge_assoc($model->settings, $this->object->_displayed_gallery->display_settings, TRUE);
824
+ $model->settings = $settings;
825
+ }
826
+ // Output the display settings form
827
+ $retval[] = $this->object->render_partial('photocrati-attach_to_post#display_settings_form', array('settings' => $form->render(), 'display_type_name' => $model->name, 'css_class' => $css_class, 'defaults' => $defaults), TRUE);
828
+ }
829
+ // In addition, we'll render a form that will be displayed when no
830
+ // display type has been selected in the Attach to Post interface
831
+ // Render the default "no display type selected" view
832
+ $css_class = $this->object->_get_selected_display_type_name() ? 'display_settings_form hidden' : 'display_settings_form';
833
+ $retval[] = $this->object->render_partial('photocrati-attach_to_post#no_display_type_selected', array('no_display_type_selected' => __('No display type selected', 'nggallery'), 'css_class' => $css_class), TRUE);
834
+ // Return all display setting forms
835
+ return implode("\n", $retval);
836
+ }
837
+ /**
838
+ * Renders the tab used to preview included images
839
+ * @return array
840
+ */
841
+ function _render_preview_tab()
842
+ {
843
+ return array('id' => 'preview_tab', 'title' => __('Sort or Exclude Images', 'nggallery'), 'content' => $this->object->_render_preview_tab_contents());
844
+ }
845
+ /**
846
+ * Renders the contents of the "Preview" tab.
847
+ * @return string
848
+ */
849
+ function _render_preview_tab_contents()
850
+ {
851
+ return $this->object->render_partial('photocrati-attach_to_post#preview_tab', array(), TRUE);
852
+ }
853
+ }
nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/atp_button.png ADDED
Binary file
nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/attach_to_post.css ADDED
@@ -0,0 +1,832 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*
2
+ *
3
+ * This file contains CSS for:
4
+ * 1. Overall IGW Window (dialog CSS is in attach_to_post_dialog.css)
5
+ * 2. IGW Sidebar
6
+ * 3. Display Tab: General CSS
7
+ * 3a. Display Tab: "Choose Display" Subtab
8
+ * 3b. Display Tab: "Customize Display Settings" Subtab
9
+ * 3c. Display Tab: "Sort & Exclude Images" (ie, Preview) Subtab
10
+ * 4. Other Tabs
11
+ * 5. Media Queries
12
+ *
13
+ * Note that much of the CSS in #2 is duplicated in iframely.css. The css here cannot
14
+ * reach into the iframe of the Add Gallery, Manage Gallery, and Manage Album pages.
15
+ * So overrides for those pages go in iframely.css.
16
+ *
17
+ * Almost every time you make a change here, you may need to make an equivalent change
18
+ * in iframely.css for the other main tabs in the IGW other than the Display Tab.
19
+ *
20
+ */
21
+
22
+ @font-face {
23
+ font-family: 'Lato';
24
+ src: url('../../nextgen_admin/static/Lato-Regular.ttf') format('truetype')
25
+ }
26
+
27
+ /* 1. Overall IGW Window */
28
+
29
+ html, body {
30
+ width: 100% !important;
31
+ height: 100% !important;
32
+ padding: 0 !important;
33
+ margin: 0 !important;
34
+ max-width: 100% !important;
35
+ font-size: 13px;
36
+ overflow: hidden;
37
+ }
38
+
39
+ body {
40
+ position: absolute;
41
+ visibility: hidden;
42
+ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
43
+ filter: alpha(opacity=0);
44
+ opacity: 0.0;
45
+ height: 100%;
46
+ }
47
+
48
+ .entity_errors {
49
+ color: red;
50
+ }
51
+
52
+ .entity_errors ul {
53
+ margin-left: 30px;
54
+ }
55
+ .entity_errors ul li{
56
+ list-style-type: disc;
57
+ }
58
+
59
+ .ui-helper-reset {
60
+ font-size: 13px;
61
+ }
62
+
63
+ #attach_to_post_tabs {
64
+ border: 0;
65
+ background: none;
66
+ height: 100%;
67
+ overflow: hidden;
68
+ padding: 0;
69
+ position: relative;
70
+ visibility: visible;
71
+ }
72
+
73
+ #attach_to_post_tabs.ui-tabs-hide {
74
+ display: block !important;
75
+ visibility: hidden;
76
+ position: absolute;
77
+ top: -5000px;
78
+ }
79
+
80
+ #attach_to_post_tabs h3 {
81
+ text-transform: uppercase;
82
+ color: black;
83
+ margin-top: 0;
84
+ letter-spacing: 2px;
85
+ font-size: 18px;
86
+ font-weight: 900;
87
+ }
88
+
89
+ h3#choose_display {
90
+ margin-bottom: 24px;
91
+ }
92
+
93
+ #attach_to_post_tabs .main_menu_tab {
94
+ padding: 0;
95
+ position: absolute;
96
+ left: 220px;
97
+ right: 0;
98
+ top: 0;
99
+ bottom: 0;
100
+ }
101
+
102
+ #attach_to_post_tabs.ngg_atp_ios_detected {
103
+ overflow-y: scroll;
104
+ -webkit-overflow-scrolling: touch;
105
+ }
106
+
107
+ #attach_to_post_tabs .ui-widget-header {
108
+ border: 0;
109
+ border-bottom: 1px solid #dfdfdf;
110
+ background: none;
111
+ }
112
+
113
+ iframe {
114
+ width: 100%;
115
+ min-height: 100%;
116
+ border: none;
117
+ padding: 0;
118
+ margin: 0;
119
+ background: transparent;
120
+ }
121
+
122
+ .chrome_70_hack_frames {
123
+ z-index: 100000000 !important;
124
+ }
125
+
126
+ .chrome_70_hack_noframes {
127
+ z-index: 0 !important;
128
+ }
129
+
130
+
131
+ .clear {
132
+ clear: both;
133
+ float: none;
134
+ }
135
+
136
+ table {
137
+ font-size: 13px;
138
+ }
139
+
140
+ .select2-search input {
141
+ width: 100% !important;
142
+ }
143
+
144
+ .select2-result-label {
145
+ white-space: nowrap;
146
+ }
147
+
148
+ .select2-results {
149
+ font-family: 'segoe ui', Arial, sans-serif;
150
+ font-size: 13px;
151
+ }
152
+
153
+ .select2-container a {
154
+ color: #444 !important;
155
+ }
156
+
157
+ /* thanks to nextgen_admin_page.css */
158
+ #ngg_page_content .ngg_page_content_main .select2-container {
159
+ width: 100% !important;
160
+ max-width: 500px !important;
161
+ }
162
+
163
+ /* 2. IGW Sidebar */
164
+
165
+ #attach_to_post_tabs .ui-tabs-icon {
166
+ box-sizing: border-box;
167
+ color: #fff;
168
+ font-family: "Lato", sans-serif;
169
+ float: none;
170
+ font-size: 20px;
171
+ font-weight: bold;
172
+ height: 100%;
173
+ letter-spacing: 1px;
174
+ line-height: 60px;
175
+ margin-bottom: 0;
176
+ position: fixed;
177
+ text-transform: uppercase;
178
+ width: 220px;
179
+ padding: 0;
180
+ }
181
+
182
+ #attach_to_post_tabs img.attach_to_post_logo {
183
+ height: 80px;
184
+ padding: 50px 0 30px;
185
+ float: right;
186
+ margin-right: 26px;
187
+ }
188
+
189
+ #attach_to_post_tabs .ui-tabs-nav {
190
+ border: none;
191
+ background: transparent;
192
+ padding: 0;
193
+ margin-top: 110px;
194
+ list-style: none;
195
+ }
196
+
197
+ #attach_to_post_tabs .ui-tabs-nav li {
198
+ background: transparent;
199
+ border: none;
200
+ display: block;
201
+ height: auto;
202
+ margin: 0;
203
+ width: 100%;
204
+ border-radius: 0;
205
+ box-sizing: border-box;
206
+ padding: 24px 30px 24px 20px;
207
+ }
208
+
209
+ #attach_to_post_tabs .ui-tabs-nav li.ui-state-focus,
210
+ #attach_to_post_tabs .ui-tabs-nav li.ui-state-active,
211
+ #attach_to_post_tabs .ui-tabs-nav li:focus,
212
+ #attach_to_post_tabs .ui-tabs-nav li.active {
213
+ outline: none;
214
+ }
215
+
216
+ #attach_to_post_tabs .ui-tabs-nav li a {
217
+ display: list-item;
218
+ color: #555;
219
+ float: right;
220
+ font-size: 13px;
221
+ font-weight: 400;
222
+ font-family: "Lato", sans-serif;
223
+ letter-spacing: 1.5px;
224
+ line-height: 1;
225
+ text-transform: uppercase;
226
+ padding: 0 !important;
227
+ }
228
+
229
+ #attach_to_post_tabs .ui-tabs-nav li.ui-tabs-active {
230
+ border-left: 6px solid #9dbd1b;
231
+ }
232
+
233
+ #attach_to_post_tabs .ui-tabs-nav li.ui-tabs-active a,
234
+ #attach_to_post_tabs .ui-tabs-nav li.ui-state-disabled a,
235
+ #attach_to_post_tabs .ui-tabs-nav li.ui-tabs-loading a {
236
+ cursor: pointer;
237
+ }
238
+
239
+ #attach_to_post_tabs .ui-tabs-nav li a.active_tab {
240
+ font-weight: 800;
241
+ color: black;
242
+ }
243
+
244
+ /* 3. Display Tab: General CSS */
245
+
246
+ #displayed_tab.main_menu_tab {
247
+ overflow-y: scroll;
248
+ overflow-x: hidden;
249
+ }
250
+
251
+ #displayed_tab #ngg_page_content {
252
+ margin: 0;
253
+ width: 100%;
254
+ }
255
+
256
+ #displayed_tab #attach_to_post_tabs .ngg_page_content_header {
257
+ display: none;
258
+ }
259
+
260
+ #displayed_tab #ngg_page_content .ngg_page_content_menu {
261
+ background: transparent;
262
+ border: none;
263
+ padding: 0 20px 10px 27px;
264
+ float: none;
265
+ height: 25px;
266
+ margin-top: 0;
267
+ width: auto;
268
+ position: relative;
269
+ top: 100px;
270
+ }
271
+
272
+ #displayed_tab #ngg_page_content .ngg_page_content_menu a,
273
+ #displayed_tab #ngg_page_content .ngg_page_content_menu a:active {
274
+ border: none;
275
+ color: black;
276
+ display: inline;
277
+ font-weight: 300;
278
+ text-decoration: none;
279
+ line-height: 25px;
280
+ padding: 4px;
281
+ font-size: 12px;
282
+ background: transparent;
283
+ margin-right: 10px;
284
+ }
285
+
286
+ #displayed_tab #ngg_page_content .ngg_page_content_menu .ngg_page_content_menu_active {
287
+ font-weight: 500;
288
+ color: black;
289
+ border-bottom: 3px solid #9ebc1b;
290
+ }
291
+
292
+ #displayed_tab #ngg_page_content .ngg_page_content_menu a:active:after {
293
+ display:none;
294
+ }
295
+
296
+ #displayed_tab #ngg_page_content .ngg_page_content_menu a:before {
297
+ display: none;
298
+ }
299
+
300
+ #displayed_tab #ngg_page_content .ngg_page_content_main {
301
+ padding: 20px 30px 30px;
302
+ width: 100%;
303
+ box-shadow: none;
304
+ }
305
+
306
+ #displayed_tab #ngg_page_content.ngg_settings_page {
307
+ border: none;
308
+ }
309
+
310
+ #displayed_tab .ngg_igw_promo {
311
+ display: block !important;
312
+ padding: 15px 7px;
313
+ color: #666;
314
+ font-family: "Lato", sans-serif;
315
+ font-size: 10pt;
316
+ letter-spacing: .5px;
317
+ box-sizing: border-box;
318
+ height: 172px;
319
+ }
320
+
321
+ #displayed_tab .ngg_igw_promo p {
322
+ text-align: center;
323
+ }
324
+
325
+ #displayed_tab .ngg_igw_promo p:nth-of-type(1) {
326
+ margin-top: 10px;
327
+ }
328
+
329
+ #displayed_tab .ngg_igw_promo p:nth-of-type(2) {
330
+ margin: 20px 0;
331
+ }
332
+
333
+ #displayed_tab .ngg_igw_promo a {
334
+ text-decoration: none;
335
+ font-weight: 600;
336
+ background: #9ebc1b;
337
+ color: white;
338
+ padding: 10px 16px;
339
+ font-size: 11px;
340
+ text-transform: uppercase;
341
+ }
342
+
343
+ #displayed_tab .ngg_igw_coupon {
344
+ font-size: 12px;
345
+ margin-top: 10px;
346
+ }
347
+
348
+
349
+ #attach_to_post_tabs #displayed_tab #ngg_page_content .ngg_page_content_main > div.ngg_igw_video {
350
+ display: block !important;
351
+ position: absolute;
352
+ left: 280px;
353
+ top: 71px;
354
+ }
355
+
356
+ #displayed_tab .ngg_igw_video_open {
357
+ background: black;
358
+ cursor: pointer;
359
+ margin: 0;
360
+ font-weight: 400;
361
+ height: 28px !important;
362
+ line-height: 28px !important;
363
+ font-size: 10px;
364
+ }
365
+
366
+ #displayed_tab .ngg_igw_video_inner {
367
+ display: none;
368
+ box-shadow: 0 0 10px 5px rgba(0,0,0,.2);
369
+ background: #fff;
370
+ }
371
+
372
+ #displayed_tab .ngg_igw_video_close {
373
+ width: 100%;
374
+ height: 50px;
375
+ display: block;
376
+ text-align: center;
377
+ line-height: 50px;
378
+ font-size: 13px;
379
+ font-weight: 600;
380
+ cursor: pointer;
381
+ font-family: "Lato", sans-serif;
382
+ background: black;
383
+ color: #fff;
384
+ text-transform: uppercase;
385
+ letter-spacing: 1.5px;
386
+ }
387
+
388
+ #displayed_tab .ngg_igw_video iframe {
389
+ width: 630px;
390
+ height: 350px !important;
391
+ min-height: auto;
392
+ margin-bottom: -3px;
393
+ }
394
+
395
+ #choose_display_content,
396
+ #display_settings_tab_content,
397
+ #preview_tab_content {
398
+ margin-top: 80px;
399
+ }
400
+
401
+ /* 3a. Display Tab: "Choose Display" Subtab **/
402
+
403
+ #displayed_tab #displayed_gallery_source {
404
+ width: 400px;
405
+ }
406
+
407
+ #displayed_tab #display_tip {
408
+ color: rgba(42,52,61,.6);
409
+ display: block;
410
+ font-size: 14px;
411
+ width: 960px;
412
+ max-width: 100%;
413
+ padding: 10px 0 0;
414
+ }
415
+
416
+ #displayed_tab #slug_configuration {
417
+ display: none;
418
+ }
419
+
420
+ #displayed_tab #source_configuration td,
421
+ #displayed_tab #slug_configuration td {
422
+ vertical-align: top;
423
+ padding: 4px 0 !important;
424
+ min-width: 200px;
425
+ }
426
+
427
+ #displayed_tab #source_configuration label {
428
+ color: #777 !important;
429
+ font-size: 13px !important;
430
+ }
431
+
432
+ #attach_to_post_tabs #displayed_tab #ngg_page_content #source_configuration tr td:first-of-type {
433
+ white-space: normal;
434
+ line-height: 1.2;
435
+ width: 265px;
436
+ }
437
+
438
+ #displayed_tab #ngg_page_content .select2-container {
439
+ width: 250px !important;
440
+ line-height: 20px;
441
+ }
442
+
443
+ #displayed_tab #ngg_page_content .ngg_page_content_main .select2-selection--multiple,
444
+ #displayed_tab #ngg_page_content .ngg_page_content_main .select2-selection--single {
445
+ height: auto;
446
+ line-height: 21px;
447
+ }
448
+
449
+ .select2-container--default .select2-results__option--highlighted[aria-selected] {
450
+ background-color: #9fbb1a;
451
+ }
452
+
453
+ #displayed_tab #slug_configuration #slug_label {
454
+ width: 52px;
455
+ }
456
+
457
+ #displayed_tab #slug_configuration #slug_column input[type=text] {
458
+ width: 498px;
459
+ }
460
+
461
+ #displayed_tab #display_type_selector {
462
+ margin-top: 14px;
463
+ }
464
+
465
+ #displayed_tab .display_type_preview {
466
+ float: left;
467
+ margin: 0 5px 5px 0;
468
+ border: 1px solid #ddd;
469
+ background: #fff;
470
+ width: 145px;
471
+ height: 170px;
472
+ }
473
+
474
+ #displayed_tab .display_type_preview .image_container {
475
+ width: 100%;
476
+ vertical-align: middle;
477
+ text-align: center;
478
+ font-size: 12px;
479
+ font-weight: 500;
480
+ padding: 8px;
481
+ box-sizing: border-box;
482
+ }
483
+
484
+ #displayed_tab .display_type_preview .image_container img {
485
+ margin-top: 10px;
486
+ margin-bottom: 10px;
487
+ box-sizing: border-box;
488
+ max-width: 100px;
489
+ }
490
+
491
+ #displayed_tab .display_type_preview .image_container p {
492
+ display: inline-block;
493
+ }
494
+
495
+ .display_type_preview label > div {
496
+ font-size: 12px;
497
+ }
498
+
499
+ #displayed_tab .select2-chosen {
500
+ color: #666 !important;
501
+ }
502
+
503
+ #ngg_page_content #save_displayed_gallery.button {
504
+ font-weight: 700;
505
+ height: 50px!important;
506
+ line-height: 50px!important;
507
+ padding: 0 30px!important;
508
+ font-size: 13px;
509
+ }
510
+
511
+ #save_displayed_gallery:disabled {
512
+ background: gray !important;
513
+ }
514
+
515
+ /* 3b. Display Tab: "Customize Display Settings" Subtab */
516
+
517
+ #display_settings_tab #display_settings_form table tr td:first-child {
518
+ vertical-align: top;
519
+ text-align: right;
520
+ padding-right: 7px;
521
+ width: 180px;
522
+ }
523
+
524
+ #display_settings_tab #display_settings_form table td {
525
+ text-align: left;
526
+ }
527
+
528
+ #display_settings_tab #display_settings_form table textarea {
529
+ height: 60px;
530
+ }
531
+
532
+ #display_settings_tab #display_settings_form textarea,
533
+ #display_settings_tab #display_settings_form input[type=text],
534
+ #display_settings_tab #display_settings_form input[type=number],
535
+ #display_settings_tab #display_settings_form select {
536
+ width: 157px;
537
+ }
538
+
539
+ #display_settings_tab #display_settings_form .ngg_slideshow_gallery_width,
540
+ #display_settings_tab #display_settings_form .ngg_slideshow_gallery_height,
541
+ #display_settings_tab #display_settings_form .ngg_thumbnail_dimension_width,
542
+ #display_settings_tab #display_settings_form .ngg_thumbnail_dimension_height {
543
+ width: 65px !important;
544
+ }
545
+
546
+ #display_settings_tab #display_settings_form .nextgen_settings_colorpicker {
547
+ width: 85px !important;
548
+ text-align: center;
549
+ }
550
+
551
+ /* 3c. Display Tab: "Sort & Exclude Images" (ie, Preview) Subtab */
552
+
553
+ h3#preview_tab {
554
+ margin-bottom: 0;
555
+ }
556
+
557
+ #preview_tab_content {
558
+ padding: 10px 0;
559
+ }
560
+
561
+ #preview_tab_content a {
562
+ text-decoration: none;
563
+ font-weight: 300;
564
+ }
565
+
566
+ #preview_tab_content .previewed_entity {
567
+ width: 100%;
568
+ border-bottom: solid 1px #E0E0D6;
569
+ background-color: #FAFAF0;
570
+ }
571
+
572
+ #preview_tab_content .previewed_entity .container {
573
+ padding-top: 15px;
574
+ }
575
+
576
+ #preview_tab_content .previewed_entity.header {
577
+ background-color: #F0F0E6;
578
+ padding-bottom: 5px;
579
+ padding-top: 5px;
580
+ }
581
+
582
+ #preview_tab_content .header label {
583
+ font-size: 12px;
584
+ color: rgb(100,150,100);
585
+ font-weight: 600;
586
+ }
587
+
588
+ #preview_tab_content .ui-sortable-helper {
589
+ background: none;
590
+ }
591
+
592
+ #preview_tab_content ul {
593
+ list-style-type: none;
594
+ display: block;
595
+ padding: 0;
596
+ position: relative;
597
+ margin-top: 20px;
598
+ }
599
+
600
+ #preview_tab_content .inclusion_checkbox {
601
+ margin-right: 7px;
602
+ display: block;
603
+ float: left;
604
+ }
605
+
606
+ #preview_tab_content .preview_item {
607
+ background-color: white;
608
+ width: 100px;
609
+ padding: 10px 10px 30px 10px;
610
+ margin: 0 5px 5px 0;
611
+ border: solid 1px #eee;
612
+ display: block;
613
+ vertical-align: middle;
614
+ text-align: center;
615
+ position: relative;
616
+ }
617
+
618
+ #preview_tab_content .image_container {
619
+ background-repeat: no-repeat;
620
+ background-position: center;
621
+ background-size: cover;
622
+ display: block;
623
+ width: 100%;
624
+ height: 75px;
625
+ }
626
+
627
+ #preview_tab_content .image_container img {
628
+ border: 0;
629
+ }
630
+
631
+ #preview_tab_content #entity_list li{
632
+ float: left;
633
+ }
634
+
635
+ #preview_tab_content #entity_list .ui-state-default {
636
+ background: none;
637
+ border: none;
638
+ }
639
+
640
+ #preview_tab_content .placeholder {
641
+ background-color: #e0ddc1;
642
+ position: relative;
643
+ }
644
+
645
+ #preview_tab_content #entity_list .exclude_container {
646
+ background: white;
647
+ display: block;
648
+ text-align: center;
649
+ margin: 0 auto;
650
+ color: black;
651
+ font-weight: normal;
652
+ height: 1.4em;
653
+ line-height: 1.1em;
654
+ font-size: 0.8em;
655
+ position: absolute;
656
+ bottom: 0.2em;
657
+ left: 0;
658
+ width: 100%;
659
+ padding: 5px 0;
660
+ }
661
+
662
+ #preview_tab_content #entity_list .exclude_container input {
663
+ vertical-align: middle;
664
+ line-height: 1.2em;
665
+ margin: 0 0.5em;
666
+ }
667
+
668
+ #preview_tab_content .header_row {
669
+ margin-bottom: 5px;
670
+ font-weight: 300;
671
+ }
672
+ #preview_tab_content .header_row strong {
673
+ width: 70px;
674
+ display: inline-block;
675
+ }
676
+ #preview_tab_content .header_row .separator {
677
+ display: inline-block;
678
+ margin: 0 5px;
679
+ }
680
+
681
+ #preview_tab_content .header_row .selected {
682
+ font-weight: bold;
683
+ }
684
+
685
+ #preview_tab_content #entity_list li.clear {
686
+ float: none;
687
+ clear: both;
688
+ }
689
+
690
+ #preview_tab_content .refresh_button {
691
+ float: right;
692
+ }
693
+
694
+ /* 4. Overall IGW Window */
695
+
696
+ #ngg-iframe-galleries_tab {
697
+ }
698
+
699
+ /* 5. Media Queries */
700
+
701
+ @media (max-width: 1120px) {
702
+ #displayed_tab .ngg_igw_promo {
703
+ position: static;
704
+ width: 602px;
705
+ height: 125px;
706
+ max-width: 100%;
707
+ margin-bottom: 10px;
708
+ }
709
+ #displayed_tab .ngg_igw_coupon {
710
+ margin-top: 10px;
711
+ }
712
+ #attach_to_post_tabs #displayed_tab #ngg_page_content .ngg_page_content_main > div.ngg_igw_video,
713
+ #displayed_tab .ngg_igw_video_inner {
714
+ display: none !important;
715
+ }
716
+ }
717
+
718
+ @media (max-width: 800px) {
719
+ #attach_to_post_tabs .ui-tabs-icon {
720
+ width: 100%;
721
+ position: static;
722
+ border-right: none;
723
+ border-bottom: 3px solid #9fbb1a;
724
+ text-align: center;
725
+ /* Also update #attach_to_post_tabs .main_menu_tab's top position when changing height */
726
+ /*height: 280px;*/
727
+ height: 150px;
728
+ padding: 20px;
729
+ }
730
+ #attach_to_post_tabs img.attach_to_post_logo {
731
+ display: none;
732
+ }
733
+
734
+ #attach_to_post_tabs .ui-tabs-nav {
735
+ margin-top: 0;
736
+ }
737
+ #attach_to_post_tabs .ui-tabs-nav li {
738
+ padding: 5px;
739
+ list-style: none !important;
740
+ border-bottom: none;
741
+ border-top: none !important;
742
+ }
743
+ #attach_to_post_tabs .ui-tabs-nav li.ui-tabs-active {
744
+ background: transparent;
745
+ }
746
+ #attach_to_post_tabs:not(.ngg_atp_ios_detected) .ui-tabs-nav li:nth-of-type(2)::after {
747
+ display: none;
748
+ }
749
+ #attach_to_post_tabs .ui-tabs-nav li a {
750
+ float: none;
751
+ padding: 0 !important;
752
+ font-weight: normal;
753
+ }
754
+ #attach_to_post_tabs .ui-tabs-nav li a.active_tab {
755
+ color: #9ebc1b;
756
+ }
757
+ #attach_to_post_tabs .ui-tabs-nav li a.active_tab::before {
758
+ display:none;
759
+ }
760
+ #attach_to_post_tabs .main_menu_tab {
761
+ margin-left: 0;
762
+ min-height: auto;
763
+ position: absolute;
764
+ top: 150px;
765
+ right: 0;
766
+ left: 0;
767
+ bottom: 0;
768
+ height: auto;
769
+ }
770
+ #displayed_tab #ngg_page_content .ngg_page_content_menu {
771
+ padding: 5px 0 0;
772
+ background: none;
773
+ border: none;
774
+ }
775
+ #displayed_tab #ngg_page_content .ngg_page_content_menu a {
776
+ display: block;
777
+ width: 100%;
778
+ float: left;
779
+ padding: 0;
780
+ text-align: center;
781
+ box-sizing: border-box;
782
+ }
783
+ #displayed_tab #ngg_page_content .ngg_page_content_menu .ngg_page_content_menu_active,
784
+ #displayed_tab #ngg_page_content .ngg_page_content_menu a:active {
785
+ background: transparent;
786
+ }
787
+ #displayed_tab #ngg_page_content .ngg_page_content_menu .ngg_page_content_menu_active:after {
788
+ display:none;
789
+ }
790
+ #displayed_tab #ngg_page_content .ngg_page_content_menu a:last-of-type {
791
+ padding-bottom: 5px;
792
+ }
793
+ #displayed_tab #source_configuration tr,
794
+ #displayed_tab #slug_configuration tr {
795
+ margin-bottom: 24px;
796
+ }
797
+ #ngg_page_content #save_displayed_gallery.button {
798
+ position: static;
799
+ margin-left: 0;
800
+ padding: 0;
801
+ }
802
+ }
803
+
804
+ @media (max-width: 781px) {
805
+ #attach_to_post_tabs.ngg_atp_ios_detected .ui-tabs-nav li:nth-of-type(1)::after {
806
+ display:none;
807
+ }
808
+ #attach_to_post_tabs #displayed_tab #ngg_page_content .ngg_page_content_main table tr td {
809
+ width: 100% !important;
810
+ }
811
+ #attach_to_post_tabs #displayed_tab #ngg_page_content .ngg_page_content_main #source_configuration {
812
+ display: table !important;
813
+ }
814
+ #attach_to_post_tabs #displayed_tab #ngg_page_content .ngg_page_content_main #source_configuration tbody {
815
+ display: table-row-group !important;
816
+ }
817
+ #displayed_tab #ngg_page_content .responsive-menu-icon {
818
+ padding: 10px 0 15px !important;
819
+ }
820
+ }
821
+
822
+ .ngg-marketing-popup {
823
+ font-family: "Lato", sans-serif;
824
+ }
825
+
826
+ @media (max-width: 400px) {
827
+ #displayed_tab .display_type_preview {
828
+ float: none;
829
+ margin: 20px auto;
830
+ width: 170px;
831
+ }
832
+ }
nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/attach_to_post.js ADDED
@@ -0,0 +1,259 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Give this window an ID
2
+ this.id = 'ngg-attach_to_post';
3
+
4
+ // This function is only necessary on iOS because iframe's scrollable='yes' attribute
5
+ // is ignored there. To work around this we give each iframe a height matching its contents
6
+ // height and set overflow-y:scroll on the wrapping parent div.
7
+ function adjust_height_for_frame(parent_window, current_window, callback) {
8
+ // TODO: ADD BLOCK CHECK AND DO NOTHING
9
+ if (!/crios|iP(hone|od|ad)/i.test(navigator.userAgent)) {
10
+ if (callback !== undefined) {
11
+ return callback(parent_window, current_window);
12
+ } else {
13
+ return true;
14
+ }
15
+ }
16
+
17
+ // Adjust height of the frame
18
+ var $frame = jQuery(current_window.frameElement);
19
+ var new_height = $frame.contents().height()/3;
20
+ var new_height_body = $frame.contents().find('#wpbody').height();
21
+ var parent_height = jQuery(parent_window.document).height();
22
+ var current_height = $frame.height();
23
+
24
+ // because #wpbody may have zero height
25
+ if (new_height_body === 0) {
26
+ new_height_body = $frame.contents().height();
27
+ }
28
+
29
+ if (new_height < new_height_body) { new_height = new_height_body; }
30
+ if (new_height < parent_height) { new_height = parent_height; }
31
+
32
+ if (current_height < new_height) {
33
+ var frame_id = $frame.attr('id');
34
+ if (frame_id && frame_id.indexOf('ngg-iframe-') === 0) {
35
+ var tab_id = frame_id.substr(11);
36
+ if (tab_id) {
37
+ jQuery('#' + tab_id).height(new_height);
38
+ }
39
+ }
40
+ }
41
+
42
+ if (callback !== undefined) {
43
+ return callback(parent_window, current_window, new_height);
44
+ } else {
45
+ return true;
46
+ }
47
+ }
48
+
49
+ // Provides a function to close the TinyMCE popup window
50
+ function close_attach_to_post_window() {
51
+ // Block editor
52
+ if (is_block_editor()) {
53
+ const iframe = parent.document.getElementById(window.name);
54
+ const event = new Event('NGG_Close_Modal');
55
+ iframe.dispatchEvent(event);
56
+
57
+ // TinyMCE editor
58
+ } else {
59
+ const src = jQuery(top.document).find("#TB_window iframe").attr('src');
60
+ if (src && src.match('attach_to_post')) {
61
+ top.tb_remove();
62
+ } else {
63
+ top.tinyMCE.activeEditor.windowManager.close(window);
64
+ }
65
+
66
+ }
67
+ }
68
+
69
+ function insert_into_editor(snippet, ref_or_id) {
70
+ if (is_block_editor()) {
71
+ const iframe = parent.document.getElementById(window.name);
72
+ const event = new CustomEvent('NGG_Insert_Gallery', { detail: {
73
+ shortcode: snippet
74
+ }});
75
+ iframe.dispatchEvent(event);
76
+ }
77
+ else if (is_visual_editor()) {
78
+ var editor = top.tinyMCE.activeEditor;
79
+ if (editor.selection.getNode().outerHTML.indexOf(ref_or_id) >= 0) {
80
+ jQuery(editor.selection.getNode()).attr('data-shortcode', snippet.substring(1, snippet.length-1));
81
+ } else {
82
+ editor.execCommand('mceInsertContent', false, snippet);
83
+ }
84
+ editor.selection.collapse(false);
85
+
86
+ } else {
87
+ myField = top.document.getElementById('content');
88
+
89
+ myValue = snippet;
90
+
91
+ //IE support
92
+ if (document.selection) {
93
+ myField.trigger('focus');
94
+ sel = document.selection.createRange();
95
+ sel.text = myValue;
96
+ } else if (myField.selectionStart || myField.selectionStart === '0') {
97
+ //MOZILLA and others
98
+ var startPos = myField.selectionStart;
99
+ var endPos = myField.selectionEnd;
100
+ myField.value = myField.value.substring(0, startPos)
101
+ + myValue
102
+ + myField.value.substring(endPos, myField.value.length);
103
+ } else {
104
+ myField.value += myValue;
105
+ }
106
+ }
107
+ }
108
+
109
+ function is_visual_editor() {
110
+ return jQuery(top.document).find('.html-active:visible').length === 0;
111
+ }
112
+
113
+ function is_block_editor() {
114
+ return typeof window.name !== 'undefined' && window.name === 'add-ngg-gallery-block-iframe';
115
+ }
116
+
117
+ // This overrides certain parts of shutter.js' positioning & sizing code
118
+ function ngg_get_measures_for_frame(frame) {
119
+ // TODO: DETECT BLOCK EDITOR AND IMPLEMENTATION
120
+ var $frame = jQuery(frame);
121
+ var frame_id = $frame.attr('id');
122
+ var measures = {};
123
+
124
+ if (frame_id && frame_id.indexOf('ngg-iframe-') === 0) {
125
+ var tab_id = frame_id.substr(11);
126
+
127
+ if (tab_id) {
128
+ var jDoc = jQuery(document);
129
+
130
+ // remove around 40px for tabs and padding
131
+ measures.scrollTop = jDoc.scrollTop() - 40;
132
+
133
+ if (window.parent) {
134
+ // remove around 40px for tabs and padding
135
+ measures.scrollHeight = jQuery(window.parent.document)
136
+ .find('.ngg_attach_to_post_window')
137
+ .height() - 40;
138
+ } else {
139
+ measures.scrollHeight = jDoc.height();
140
+ }
141
+
142
+ if (typeof(window.console) !== 'undefined') {
143
+ console.log(measures);
144
+ }
145
+ }
146
+ }
147
+
148
+ return measures;
149
+ }
150
+
151
+ // Activates the attach to post screen elements
152
+ jQuery(function($) {
153
+
154
+ // iOS does not support iframe's scrollable="yes" attribute which requires some workarounds
155
+ if (/crios|iP(hone|od|ad)/i.test(navigator.userAgent)) {
156
+ $('#attach_to_post_tabs').addClass('ngg_atp_ios_detected');
157
+ }
158
+
159
+ // Activate tabs
160
+ $('#attach_to_post_tabs').ngg_tabs({
161
+ onShowTab: function(tab) {
162
+ // Fix z-index problem with frames and non-frames on Chrome 69/70
163
+ if (navigator.appVersion.match(/Chrome\/(69|7)/)) {
164
+ tab.attr('id') != 'displayed_tab' ?
165
+ $('#attach_to_post_tabs').addClass('chrome_70_hack_frames').removeClass('chrome_70_hack_noframes') :
166
+ $('#attach_to_post_tabs').removeClass('chrome_70_hack_frames').addClass('chrome_70_hack_noframes')
167
+ }
168
+ }
169
+ });
170
+
171
+ // If the preview area is being displayed, emit an event for that
172
+ $('.ngg_page_content_menu a').on('click', function(){
173
+ if ($(this).attr('data-id') === 'preview_tab') {
174
+ $('#preview_area').trigger('opened');
175
+ }
176
+ });
177
+
178
+ // Activate accordion for display tab
179
+ $('.accordion').accordion({
180
+ clearStyle: true,
181
+ autoHeight: false,
182
+ heightStyle: 'content'
183
+ });
184
+
185
+ // Apply active class to first tab
186
+ $('.ui-tabs-nav li:first-of-type a').addClass("active_tab");
187
+
188
+ // If the active display tab is clicked, then we assume that the user
189
+ // wants to display the original tab content
190
+ $('.ui-tabs-nav a').on('click', function(e) {
191
+
192
+ /* Add color to the active link */
193
+ $('.ui-tabs-nav a').removeClass("active_tab");
194
+ $(this).addClass("active_tab");
195
+
196
+ var element = e.target;
197
+
198
+ // If the accordion tab is used to display an iframe, ensure when
199
+ // clicked that the original iframe content is always displayed
200
+ if ($(element).parent().hasClass('ui-state-active')) {
201
+ var iframe = $(element.hash + ' iframe');
202
+ if (iframe.length > 0) {
203
+ if (iframe[0].contentDocument.location != iframe.attr('src')) {
204
+ iframe[0].contentDocument.location = iframe.attr('src');
205
+ }
206
+ }
207
+ }
208
+ });
209
+
210
+ // Close the window when the escape key is pressed
211
+ $(this).on('keydown', function(e) {
212
+ if (e.keyCode === 27) {
213
+ close_attach_to_post_window();
214
+ }
215
+ return true;
216
+ });
217
+
218
+ // Fade in now that all GUI elements are intact
219
+ $('body').css({
220
+ position: 'static',
221
+ visibility: 'visible'
222
+ }).animate({
223
+ opacity: 1.0
224
+ });
225
+
226
+ /* Open and close IGW video tutorial */
227
+ $('#displayed_tab .ngg_igw_video_open').on('click', function(e) {
228
+ $('#displayed_tab .ngg_igw_video_inner').append('<iframe class="ngg_igw_video_iframe" width="1050" height="590" src="https://www.youtube.com/embed/mNEnY23i9DE?rel=0" frameborder="0" allowfullscreen></iframe>');
229
+ $('#displayed_tab .ngg_igw_video_inner').css("display", "block");
230
+ $('#displayed_tab .ngg_igw_video_open').css("display", "none");
231
+ });
232
+
233
+ $('#displayed_tab .ngg_igw_video_close').on('click', function(e) {
234
+ $('#displayed_tab .ngg_igw_video_iframe').remove();
235
+ $('#displayed_tab .ngg_igw_video_inner').css("display", "none");
236
+ $('#displayed_tab .ngg_igw_video_open').css("display", "block");
237
+ });
238
+
239
+ /* Show Pro gallery promo only on Choose Display tab */
240
+ $('.ngg_page_content_menu a').on('click', function(e) {
241
+
242
+ var id = $(this).attr('data-id');
243
+ if (id == "choose_display") {
244
+ $("#displayed_tab .ngg_igw_video_open").css("display", "block");
245
+ }
246
+ else {
247
+ $("#displayed_tab .ngg_igw_video_open").css("display", "none");
248
+ $("#displayed_tab .ngg_igw_video_inner").css("display", "none");
249
+ }
250
+ });
251
+
252
+ // The Block plugin will wait for this event to trigger before removing its loading spinner
253
+ if (is_block_editor()) {
254
+ const iframe = parent.document.getElementById(window.name);
255
+ const event = new Event('NGG_Iframe_Ready');
256
+ iframe.dispatchEvent(event);
257
+ }
258
+
259
+ });
nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/attach_to_post.min.css ADDED
@@ -0,0 +1 @@
 
1
+ .ui-helper-reset,body,html{font-size:13px}@font-face{font-family:Lato;src:url(../../nextgen_admin/static/Lato-Regular.ttf) format('truetype')}body,html{width:100%!important;height:100%!important;padding:0!important;margin:0!important;max-width:100%!important;overflow:hidden}body{position:absolute;visibility:hidden;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";filter:alpha(opacity=0);opacity:0;height:100%}.entity_errors{color:red}.entity_errors ul{margin-left:30px}.entity_errors ul li{list-style-type:disc}#attach_to_post_tabs{border:0;background:0 0;height:100%;overflow:hidden;padding:0;position:relative;visibility:visible}#attach_to_post_tabs.ui-tabs-hide{display:block!important;visibility:hidden;position:absolute;top:-5000px}#attach_to_post_tabs h3{text-transform:uppercase;color:#000;margin-top:0;letter-spacing:2px;font-size:18px;font-weight:900}h3#choose_display{margin-bottom:24px}#attach_to_post_tabs .main_menu_tab{padding:0;position:absolute;left:220px;right:0;top:0;bottom:0}#attach_to_post_tabs.ngg_atp_ios_detected{overflow-y:scroll;-webkit-overflow-scrolling:touch}#attach_to_post_tabs .ui-widget-header{border:0;border-bottom:1px solid #dfdfdf;background:0 0}iframe{width:100%;min-height:100%;border:none;padding:0;margin:0;background:0 0}.chrome_70_hack_frames{z-index:100000000!important}.chrome_70_hack_noframes{z-index:0!important}.clear{clear:both;float:none}table{font-size:13px}.select2-search input{width:100%!important}.select2-result-label{white-space:nowrap}.select2-results{font-family:'segoe ui',Arial,sans-serif;font-size:13px}#attach_to_post_tabs .ui-tabs-icon,#attach_to_post_tabs .ui-tabs-nav li a,#displayed_tab .ngg_igw_promo,#displayed_tab .ngg_igw_video_close,.ngg-marketing-popup{font-family:Lato,sans-serif}.select2-container a{color:#444!important}#ngg_page_content .ngg_page_content_main .select2-container{width:100%!important;max-width:500px!important}#attach_to_post_tabs .ui-tabs-icon{box-sizing:border-box;color:#fff;float:none;font-size:20px;font-weight:700;height:100%;letter-spacing:1px;line-height:60px;margin-bottom:0;position:fixed;text-transform:uppercase;width:220px;padding:0}#attach_to_post_tabs img.attach_to_post_logo{height:80px;padding:50px 0 30px;float:right;margin-right:26px}#attach_to_post_tabs .ui-tabs-nav{border:none;background:0 0;padding:0;margin-top:110px;list-style:none}#attach_to_post_tabs .ui-tabs-nav li{background:0 0;border:none;display:block;height:auto;margin:0;width:100%;border-radius:0;box-sizing:border-box;padding:24px 30px 24px 20px}#attach_to_post_tabs .ui-tabs-nav li.active,#attach_to_post_tabs .ui-tabs-nav li.ui-state-active,#attach_to_post_tabs .ui-tabs-nav li.ui-state-focus,#attach_to_post_tabs .ui-tabs-nav li:focus{outline:0}#attach_to_post_tabs .ui-tabs-nav li a{display:list-item;color:#555;float:right;font-size:13px;font-weight:400;letter-spacing:1.5px;line-height:1;text-transform:uppercase;padding:0!important}#attach_to_post_tabs .ui-tabs-nav li.ui-tabs-active{border-left:6px solid #9dbd1b}#attach_to_post_tabs .ui-tabs-nav li.ui-state-disabled a,#attach_to_post_tabs .ui-tabs-nav li.ui-tabs-active a,#attach_to_post_tabs .ui-tabs-nav li.ui-tabs-loading a{cursor:pointer}#attach_to_post_tabs .ui-tabs-nav li a.active_tab{font-weight:800;color:#000}#displayed_tab.main_menu_tab{overflow-y:scroll;overflow-x:hidden}#displayed_tab #ngg_page_content{margin:0;width:100%}#displayed_tab #attach_to_post_tabs .ngg_page_content_header{display:none}#displayed_tab #ngg_page_content .ngg_page_content_menu{background:0 0;border:none;padding:0 20px 10px 27px;float:none;height:25px;margin-top:0;width:auto;position:relative;top:100px}#displayed_tab #ngg_page_content .ngg_page_content_menu a,#displayed_tab #ngg_page_content .ngg_page_content_menu a:active{border:none;color:#000;display:inline;font-weight:300;text-decoration:none;line-height:25px;padding:4px;font-size:12px;background:0 0;margin-right:10px}#displayed_tab #ngg_page_content .ngg_page_content_menu .ngg_page_content_menu_active{font-weight:500;color:#000;border-bottom:3px solid #9ebc1b}#displayed_tab #ngg_page_content .ngg_page_content_menu a:active:after,#displayed_tab #ngg_page_content .ngg_page_content_menu a:before{display:none}#displayed_tab #ngg_page_content .ngg_page_content_main{padding:20px 30px 30px;width:100%;box-shadow:none}#displayed_tab #ngg_page_content.ngg_settings_page{border:none}#displayed_tab .ngg_igw_promo{display:block!important;padding:15px 7px;color:#666;font-size:10pt;letter-spacing:.5px;box-sizing:border-box;height:172px}#displayed_tab .ngg_igw_promo p{text-align:center}#displayed_tab .ngg_igw_promo p:nth-of-type(1){margin-top:10px}#displayed_tab .ngg_igw_promo p:nth-of-type(2){margin:20px 0}#displayed_tab .ngg_igw_promo a{text-decoration:none;font-weight:600;background:#9ebc1b;color:#fff;padding:10px 16px;font-size:11px;text-transform:uppercase}#displayed_tab .ngg_igw_coupon{font-size:12px;margin-top:10px}#attach_to_post_tabs #displayed_tab #ngg_page_content .ngg_page_content_main>div.ngg_igw_video{display:block!important;position:absolute;left:280px;top:71px}#displayed_tab .ngg_igw_video_open{background:#000;cursor:pointer;margin:0;font-weight:400;height:28px!important;line-height:28px!important;font-size:10px}#displayed_tab .ngg_igw_video_inner{display:none;box-shadow:0 0 10px 5px rgba(0,0,0,.2);background:#fff}#displayed_tab .ngg_igw_video_close{width:100%;height:50px;display:block;text-align:center;line-height:50px;font-size:13px;font-weight:600;cursor:pointer;background:#000;color:#fff;text-transform:uppercase;letter-spacing:1.5px}#displayed_tab .ngg_igw_video iframe{width:630px;height:350px!important;min-height:auto;margin-bottom:-3px}#choose_display_content,#display_settings_tab_content,#preview_tab_content{margin-top:80px}#displayed_tab #displayed_gallery_source{width:400px}#displayed_tab #display_tip{color:rgba(42,52,61,.6);display:block;font-size:14px;width:960px;max-width:100%;padding:10px 0 0}#displayed_tab #slug_configuration{display:none}#displayed_tab #slug_configuration td,#displayed_tab #source_configuration td{vertical-align:top;padding:4px 0!important;min-width:200px}#displayed_tab #source_configuration label{color:#777!important;font-size:13px!important}#attach_to_post_tabs #displayed_tab #ngg_page_content #source_configuration tr td:first-of-type{white-space:normal;line-height:1.2;width:265px}#displayed_tab #ngg_page_content .select2-container{width:250px!important;line-height:20px}#displayed_tab #ngg_page_content .ngg_page_content_main .select2-selection--multiple,#displayed_tab #ngg_page_content .ngg_page_content_main .select2-selection--single{height:auto;line-height:21px}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#9fbb1a}#displayed_tab #slug_configuration #slug_label{width:52px}#displayed_tab #slug_configuration #slug_column input[type=text]{width:498px}#displayed_tab #display_type_selector{margin-top:14px}#displayed_tab .display_type_preview{float:left;margin:0 5px 5px 0;border:1px solid #ddd;background:#fff;width:145px;height:170px}#displayed_tab .display_type_preview .image_container{width:100%;vertical-align:middle;text-align:center;font-size:12px;font-weight:500;padding:8px;box-sizing:border-box}#displayed_tab .display_type_preview .image_container img{margin-top:10px;margin-bottom:10px;box-sizing:border-box;max-width:100px}#displayed_tab .display_type_preview .image_container p{display:inline-block}.display_type_preview label>div{font-size:12px}#displayed_tab .select2-chosen{color:#666!important}#ngg_page_content #save_displayed_gallery.button{font-weight:700;height:50px!important;line-height:50px!important;padding:0 30px!important;font-size:13px}#save_displayed_gallery:disabled{background:gray!important}#display_settings_tab #display_settings_form table tr td:first-child{vertical-align:top;text-align:right;padding-right:7px;width:180px}#display_settings_tab #display_settings_form table td{text-align:left}#display_settings_tab #display_settings_form table textarea{height:60px}#display_settings_tab #display_settings_form input[type=number],#display_settings_tab #display_settings_form input[type=text],#display_settings_tab #display_settings_form select,#display_settings_tab #display_settings_form textarea{width:157px}#display_settings_tab #display_settings_form .ngg_slideshow_gallery_height,#display_settings_tab #display_settings_form .ngg_slideshow_gallery_width,#display_settings_tab #display_settings_form .ngg_thumbnail_dimension_height,#display_settings_tab #display_settings_form .ngg_thumbnail_dimension_width{width:65px!important}#display_settings_tab #display_settings_form .nextgen_settings_colorpicker{width:85px!important;text-align:center}h3#preview_tab{margin-bottom:0}#preview_tab_content{padding:10px 0}#preview_tab_content a{text-decoration:none;font-weight:300}#preview_tab_content .previewed_entity{width:100%;border-bottom:solid 1px #E0E0D6;background-color:#FAFAF0}#preview_tab_content .previewed_entity .container{padding-top:15px}#preview_tab_content .previewed_entity.header{background-color:#F0F0E6;padding-bottom:5px;padding-top:5px}#preview_tab_content .header label{font-size:12px;color:#649664;font-weight:600}#preview_tab_content .ui-sortable-helper{background:0 0}#preview_tab_content ul{list-style-type:none;display:block;padding:0;position:relative;margin-top:20px}#preview_tab_content .inclusion_checkbox{margin-right:7px;display:block;float:left}#preview_tab_content .preview_item{background-color:#fff;width:100px;padding:10px 10px 30px;margin:0 5px 5px 0;border:1px solid #eee;display:block;vertical-align:middle;text-align:center;position:relative}#preview_tab_content .image_container{background-repeat:no-repeat;background-position:center;background-size:cover;display:block;width:100%;height:75px}#preview_tab_content .image_container img{border:0}#preview_tab_content #entity_list li{float:left}#preview_tab_content #entity_list .ui-state-default{background:0 0;border:none}#preview_tab_content .placeholder{background-color:#e0ddc1;position:relative}#preview_tab_content #entity_list .exclude_container{background:#fff;display:block;text-align:center;margin:0 auto;color:#000;font-weight:400;height:1.4em;line-height:1.1em;font-size:.8em;position:absolute;bottom:.2em;left:0;width:100%;padding:5px 0}#preview_tab_content #entity_list .exclude_container input{vertical-align:middle;line-height:1.2em;margin:0 .5em}#preview_tab_content .header_row{margin-bottom:5px;font-weight:300}#preview_tab_content .header_row strong{width:70px;display:inline-block}#preview_tab_content .header_row .separator{display:inline-block;margin:0 5px}#preview_tab_content .header_row .selected{font-weight:700}#preview_tab_content #entity_list li.clear{float:none;clear:both}#preview_tab_content .refresh_button{float:right}@media (max-width:1120px){#displayed_tab .ngg_igw_promo{position:static;width:602px;height:125px;max-width:100%;margin-bottom:10px}#displayed_tab .ngg_igw_coupon{margin-top:10px}#attach_to_post_tabs #displayed_tab #ngg_page_content .ngg_page_content_main>div.ngg_igw_video,#displayed_tab .ngg_igw_video_inner{display:none!important}}@media (max-width:800px){#attach_to_post_tabs .ui-tabs-nav li a.active_tab::before,#attach_to_post_tabs img.attach_to_post_logo,#attach_to_post_tabs:not(.ngg_atp_ios_detected) .ui-tabs-nav li:nth-of-type(2)::after{display:none}#attach_to_post_tabs .ui-tabs-icon{width:100%;position:static;border-right:none;border-bottom:3px solid #9fbb1a;text-align:center;height:150px;padding:20px}#attach_to_post_tabs .ui-tabs-nav{margin-top:0}#attach_to_post_tabs .ui-tabs-nav li{padding:5px;list-style:none!important;border-bottom:none;border-top:none!important}#attach_to_post_tabs .ui-tabs-nav li.ui-tabs-active{background:0 0}#attach_to_post_tabs .ui-tabs-nav li a{float:none;padding:0!important;font-weight:400}#attach_to_post_tabs .ui-tabs-nav li a.active_tab{color:#9ebc1b}#attach_to_post_tabs .main_menu_tab{margin-left:0;min-height:auto;position:absolute;top:150px;right:0;left:0;bottom:0;height:auto}#displayed_tab #ngg_page_content .ngg_page_content_menu{padding:5px 0 0;background:0 0;border:none}#displayed_tab #ngg_page_content .ngg_page_content_menu a{display:block;width:100%;float:left;padding:0;text-align:center;box-sizing:border-box}#displayed_tab #ngg_page_content .ngg_page_content_menu .ngg_page_content_menu_active,#displayed_tab #ngg_page_content .ngg_page_content_menu a:active{background:0 0}#displayed_tab #ngg_page_content .ngg_page_content_menu .ngg_page_content_menu_active:after{display:none}#displayed_tab #ngg_page_content .ngg_page_content_menu a:last-of-type{padding-bottom:5px}#displayed_tab #slug_configuration tr,#displayed_tab #source_configuration tr{margin-bottom:24px}#ngg_page_content #save_displayed_gallery.button{position:static;margin-left:0;padding:0}}@media (max-width:781px){#attach_to_post_tabs.ngg_atp_ios_detected .ui-tabs-nav li:nth-of-type(1)::after{display:none}#attach_to_post_tabs #displayed_tab #ngg_page_content .ngg_page_content_main table tr td{width:100%!important}#attach_to_post_tabs #displayed_tab #ngg_page_content .ngg_page_content_main #source_configuration{display:table!important}#attach_to_post_tabs #displayed_tab #ngg_page_content .ngg_page_content_main #source_configuration tbody{display:table-row-group!important}#displayed_tab #ngg_page_content .responsive-menu-icon{padding:10px 0 15px!important}}@media (max-width:400px){#displayed_tab .display_type_preview{float:none;margin:20px auto;width:170px}}
nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/attach_to_post.min.js ADDED
@@ -0,0 +1 @@
 
1
+ "use strict";function adjust_height_for_frame(e,t,i){if(!/crios|iP(hone|od|ad)/i.test(navigator.userAgent))return void 0===i||i(e,t);var a=jQuery(t.frameElement),n=a.contents().height()/3,o=a.contents().find("#wpbody").height(),s=jQuery(e.document).height(),d=a.height();if(0===o&&(o=a.contents().height()),n<o&&(n=o),n<s&&(n=s),d<n){var r=a.attr("id");if(r&&0===r.indexOf("ngg-iframe-")){var c=r.substr(11);c&&jQuery("#"+c).height(n)}}return void 0===i||i(e,t,n)}function close_attach_to_post_window(){if(is_block_editor()){var e=parent.document.getElementById(window.name),t=new Event("NGG_Close_Modal");e.dispatchEvent(t)}else{var i=jQuery(top.document).find("#TB_window iframe").attr("src");i&&i.match("attach_to_post")?top.tb_remove():top.tinyMCE.activeEditor.windowManager.close(window)}}function insert_into_editor(e,t){if(is_block_editor()){var i=parent.document.getElementById(window.name),a=new CustomEvent("NGG_Insert_Gallery",{detail:{shortcode:e}});i.dispatchEvent(a)}else if(is_visual_editor()){var n=top.tinyMCE.activeEditor;n.selection.getNode().outerHTML.indexOf(t)>=0?jQuery(n.selection.getNode()).attr("data-shortcode",e.substring(1,e.length-1)):n.execCommand("mceInsertContent",!1,e),n.selection.collapse(!1)}else if(myField=top.document.getElementById("content"),myValue=e,document.selection)myField.trigger("focus"),sel=document.selection.createRange(),sel.text=myValue;else if(myField.selectionStart||"0"===myField.selectionStart){var o=myField.selectionStart,s=myField.selectionEnd;myField.value=myField.value.substring(0,o)+myValue+myField.value.substring(s,myField.value.length)}else myField.value+=myValue}function is_visual_editor(){return 0===jQuery(top.document).find(".html-active:visible").length}function is_block_editor(){return void 0!==window.name&&"add-ngg-gallery-block-iframe"===window.name}function ngg_get_measures_for_frame(e){var t=jQuery(e),i=t.attr("id"),a={};if(i&&0===i.indexOf("ngg-iframe-")){if(i.substr(11)){var n=jQuery(document);a.scrollTop=n.scrollTop()-40,window.parent?a.scrollHeight=jQuery(window.parent.document).find(".ngg_attach_to_post_window").height()-40:a.scrollHeight=n.height(),void 0!==window.console&&console.log(a)}}return a}(void 0).id="ngg-attach_to_post",jQuery(function(e){if(/crios|iP(hone|od|ad)/i.test(navigator.userAgent)&&e("#attach_to_post_tabs").addClass("ngg_atp_ios_detected"),e("#attach_to_post_tabs").ngg_tabs({onShowTab:function(t){navigator.appVersion.match(/Chrome\/(69|7)/)&&("displayed_tab"!=t.attr("id")?e("#attach_to_post_tabs").addClass("chrome_70_hack_frames").removeClass("chrome_70_hack_noframes"):e("#attach_to_post_tabs").removeClass("chrome_70_hack_frames").addClass("chrome_70_hack_noframes"))}}),e(".ngg_page_content_menu a").on("click",function(){"preview_tab"===e(this).attr("data-id")&&e("#preview_area").trigger("opened")}),e(".accordion").accordion({clearStyle:!0,autoHeight:!1,heightStyle:"content"}),e(".ui-tabs-nav li:first-of-type a").addClass("active_tab"),e(".ui-tabs-nav a").on("click",function(t){e(".ui-tabs-nav a").removeClass("active_tab"),e(this).addClass("active_tab");var i=t.target;if(e(i).parent().hasClass("ui-state-active")){var a=e(i.hash+" iframe");a.length>0&&a[0].contentDocument.location!=a.attr("src")&&(a[0].contentDocument.location=a.attr("src"))}}),e(this).on("keydown",function(e){return 27===e.keyCode&&close_attach_to_post_window(),!0}),e("body").css({position:"static",visibility:"visible"}).animate({opacity:1}),e("#displayed_tab .ngg_igw_video_open").on("click",function(t){e("#displayed_tab .ngg_igw_video_inner").append('<iframe class="ngg_igw_video_iframe" width="1050" height="590" src="https://www.youtube.com/embed/mNEnY23i9DE?rel=0" frameborder="0" allowfullscreen></iframe>'),e("#displayed_tab .ngg_igw_video_inner").css("display","block"),e("#displayed_tab .ngg_igw_video_open").css("display","none")}),e("#displayed_tab .ngg_igw_video_close").on("click",function(t){e("#displayed_tab .ngg_igw_video_iframe").remove(),e("#displayed_tab .ngg_igw_video_inner").css("display","none"),e("#displayed_tab .ngg_igw_video_open").css("display","block")}),e(".ngg_page_content_menu a").on("click",function(t){"choose_display"==e(this).attr("data-id")?e("#displayed_tab .ngg_igw_video_open").css("display","block"):(e("#displayed_tab .ngg_igw_video_open").css("display","none"),e("#displayed_tab .ngg_igw_video_inner").css("display","none"))}),is_block_editor()){var t=parent.document.getElementById(window.name),i=new Event("NGG_Iframe_Ready");t.dispatchEvent(i)}});
nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/attach_to_post_dialog.css ADDED
@@ -0,0 +1,213 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @font-face {
2
+ font-family: 'Lato';
3
+ src: url('../../nextgen_admin/static/Lato-Regular.ttf') format('truetype')
4
+ }
5
+
6
+ /* Thickbox-based IGW Rules */
7
+
8
+ #TB_window.ngg_tb_window {
9
+ box-shadow: 0 0 20px 10px rgba( 0, 0, 0, .5 );
10
+ }
11
+
12
+ .ngg_tb_window #TB_iframeContent {
13
+ height:100.1% !important;
14
+ }
15
+
16
+ .ngg_tb_window #TB_title {
17
+ height: 0 !important;
18
+ border: none !important;
19
+ }
20
+
21
+ .ngg_tb_window #TB_closeWindowButton {
22
+ background: transparent;
23
+ top: 10px;
24
+ right: 20px;
25
+ }
26
+
27
+ .ngg_tb_window .tb-close-icon,
28
+ .ngg_tb_window #TB_closeWindowButton:focus .tb-close-icon {
29
+ color: #fff;
30
+ border: none;
31
+ box-shadow: none;
32
+ background: #9fbb1a;
33
+ border-radius: 50%;
34
+ padding: 1px;
35
+ height: 20px;
36
+ width: 20px;
37
+ font-size: 12px;
38
+ }
39
+
40
+ .ngg_tb_window #TB_closeWindowButton:hover .tb-close-icon,
41
+ .ngg_tb_window #TB_closeWindowButton:focus .tb-close-icon {
42
+ color: #fff;
43
+ }
44
+
45
+ .ngg_tb_window .tb-close-icon:before {
46
+ font: normal 18px dashicons;
47
+ }
48
+
49
+ /* TinyMCE 4-based IGW rules */
50
+
51
+ #ngg_attach_to_post_dialog {
52
+ width: 95% !important;
53
+ left: 2.5% !important;
54
+ }
55
+
56
+ #ngg_attach_to_post_dialog-head
57
+ #ngg_attach_to_post_dialog-title {
58
+ display: none;
59
+ }
60
+
61
+ #ngg_attach_to_post_dialog-body {
62
+ width: 100% !important;
63
+ }
64
+
65
+ #ngg_attach_to_post_dialog-head {
66
+ min-height: 0;
67
+ height: 0;
68
+ border: none;
69
+ }
70
+
71
+ #ngg_attach_to_post_dialog-head .mce-close {
72
+ position: absolute;
73
+ background: transparent;
74
+ top: 10px !important;
75
+ right: 20px !important;
76
+ z-index: 2;
77
+ }
78
+
79
+ #ngg_attach_to_post_dialog-head .mce-close i,
80
+ #ngg_attach_to_post_dialog-head .mce-close:focus i {
81
+ color: #fff;
82
+ border: none;
83
+ box-shadow: none;
84
+ background: #9fbb1a;
85
+ border-radius: 50%;
86
+ padding: 1px;
87
+ height: 20px;
88
+ width: 20px;
89
+ font-size: 12px;
90
+ }
91
+
92
+ #ngg_attach_to_post_dialog-head .mce-close:hover i,
93
+ #ngg_attach_to_post_dialog-head .mce-close:focus i {
94
+ color: #fff;
95
+ }
96
+
97
+ #ngg_attach_to_post_dialog-head .mce-close i:before {
98
+ font: normal 17px dashicons;
99
+ color: #fff;
100
+ margin: 1.2px 0 0 -8px;
101
+ }
102
+
103
+ .ngg_attach_to_post_window {
104
+ position: relative;
105
+ border: none !important;
106
+ }
107
+
108
+ /* TinyMCE 3-based IGW rules */
109
+
110
+ .ngg_attach_to_post_window .mceResize,
111
+ .ngg_attach_to_post_window .mceTop,
112
+ .ngg_attach_to_post_window .mceBottom,
113
+ .ngg_attach_to_post_window .mceLeft,
114
+ .ngg_attach_to_post_window .mceRight,
115
+ .ngg_attach_to_post_window .mceCenter {
116
+ background: transparent !important;
117
+ border: none !important;
118
+ }
119
+
120
+ .ngg_attach_to_post_window .mceMiddle span {
121
+ padding-top: 6px !important;
122
+ }
123
+
124
+ .ngg_attach_to_post_window .mceTop {
125
+ display: block !important;
126
+ height: 0px !important;
127
+ font-size: 0px !important;
128
+ }
129
+
130
+ .ngg_attach_to_post_window .mceClose {
131
+ background: url('uploader-icons.png') !important;
132
+ display: block !important;
133
+ margin: 0 !important;
134
+ padding: 0 !important;
135
+ width: 15px !important;
136
+ height: 15px !important;
137
+ background-position: -100px 0 !important;
138
+ position: absolute !important;
139
+ top: 44px !important;
140
+ right: 30px !important;
141
+ }
142
+
143
+ #ngg_attach_to_post_dialog-body {
144
+ -webkit-border-radius: 0px;
145
+ -moz-border-radius: 0px;
146
+ border-radius: 0px;
147
+ background: rgba(255, 255, 255, 0.6);
148
+ border-top: none;
149
+ }
150
+
151
+ /* Styling for NGG placeholder in Gutenberg. This styling mimics
152
+ * rules in ngg_attach_to_post_tinymce_plugin.css to ensure the
153
+ * placeholder is properly styled for Gutenberg. */
154
+
155
+ div[aria-label="Block: Classic"] .nggPlaceholder {
156
+ background-color: #ffffff;
157
+ border-radius: 0;
158
+ box-shadow: 0 0 4px 2px rgba(0,0,0,.05);
159
+ box-sizing: border-box;
160
+ border-top: 5px solid #b8d330;
161
+ color: #fff;
162
+ font-family: sans-serif;
163
+ font-size: 20px;
164
+ margin: 20px auto !important;
165
+ outline: none !important;
166
+ text-align: center;
167
+ width: 99%;
168
+ min-height: 210px;
169
+ padding: 60px 60px 70px;
170
+ }
171
+
172
+ div[aria-label="Block: Classic"] .nggPlaceholder h3 {
173
+ color: black !important;
174
+ text-transform: uppercase;
175
+ font-size: 21px;
176
+ font-family: "Lato", sans-serif !important;
177
+ font-weight: 700 !important;
178
+ letter-spacing: 3px !important;
179
+ margin-bottom: 0;
180
+ margin-top: 0;
181
+ }
182
+
183
+ div[aria-label="Block: Classic"] .nggPlaceholderButton {
184
+ background: black !important;
185
+ border-radius: 2px;
186
+ border: none !important;
187
+ box-shadow: none !important;
188
+ color: #fff !important;
189
+ display: inline-block !important;
190
+ font-size: 12px;
191
+ font-weight: bold;
192
+ font-family: "Lato", sans-serif !important;
193
+ height: 36px !important;
194
+ line-height: 36px !important;
195
+ letter-spacing: 1.2px;
196
+ margin: 0px 4px 2px 0;
197
+ padding: 0;
198
+ width: 121px;
199
+ text-align: center;
200
+ text-transform: uppercase !important;
201
+ text-shadow: none !important;
202
+ cursor: pointer;
203
+ }
204
+
205
+ div[aria-label="Block: Classic"] .nggPlaceholderButton:hover {
206
+ background: #383838 !important;
207
+ }
208
+
209
+ @media (max-width: 781px) {
210
+ #TB_window.ngg_tb_window {
211
+ position: absolute !important;
212
+ }
213
+ }
nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/attach_to_post_dialog.min.css ADDED
@@ -0,0 +1 @@
 
1
+ @font-face{font-family:Lato;src:url(../../nextgen_admin/static/Lato-Regular.ttf) format('truetype')}#TB_window.ngg_tb_window{box-shadow:0 0 20px 10px rgba(0,0,0,.5)}.ngg_tb_window #TB_iframeContent{height:100.1%!important}.ngg_tb_window #TB_title{height:0!important;border:none!important}.ngg_tb_window #TB_closeWindowButton{background:0 0;top:10px;right:20px}.ngg_tb_window #TB_closeWindowButton:focus .tb-close-icon,.ngg_tb_window .tb-close-icon{color:#fff;border:none;box-shadow:none;background:#9fbb1a;border-radius:50%;padding:1px;height:20px;width:20px;font-size:12px}.ngg_tb_window #TB_closeWindowButton:focus .tb-close-icon,.ngg_tb_window #TB_closeWindowButton:hover .tb-close-icon{color:#fff}.ngg_tb_window .tb-close-icon:before{font:400 18px dashicons}#ngg_attach_to_post_dialog{width:95%!important;left:2.5%!important}#ngg_attach_to_post_dialog-head #ngg_attach_to_post_dialog-title{display:none}#ngg_attach_to_post_dialog-body{width:100%!important}#ngg_attach_to_post_dialog-head{min-height:0;height:0;border:none}#ngg_attach_to_post_dialog-head .mce-close{position:absolute;background:0 0;top:10px!important;right:20px!important;z-index:2}#ngg_attach_to_post_dialog-head .mce-close i,#ngg_attach_to_post_dialog-head .mce-close:focus i{color:#fff;border:none;box-shadow:none;background:#9fbb1a;border-radius:50%;padding:1px;height:20px;width:20px;font-size:12px}#ngg_attach_to_post_dialog-head .mce-close:focus i,#ngg_attach_to_post_dialog-head .mce-close:hover i{color:#fff}#ngg_attach_to_post_dialog-head .mce-close i:before{font:400 17px dashicons;color:#fff;margin:1.2px 0 0 -8px}.ngg_attach_to_post_window{position:relative;border:none!important}.ngg_attach_to_post_window .mceBottom,.ngg_attach_to_post_window .mceCenter,.ngg_attach_to_post_window .mceLeft,.ngg_attach_to_post_window .mceResize,.ngg_attach_to_post_window .mceRight,.ngg_attach_to_post_window .mceTop{background:0 0!important;border:none!important}.ngg_attach_to_post_window .mceMiddle span{padding-top:6px!important}.ngg_attach_to_post_window .mceTop{display:block!important;height:0!important;font-size:0!important}.ngg_attach_to_post_window .mceClose{background:url(uploader-icons.png) -100px 0!important;display:block!important;margin:0!important;padding:0!important;width:15px!important;height:15px!important;position:absolute!important;top:44px!important;right:30px!important}#ngg_attach_to_post_dialog-body{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;background:rgba(255,255,255,.6);border-top:none}div[aria-label="Block: Classic"] .nggPlaceholder{background-color:#fff;border-radius:0;box-shadow:0 0 4px 2px rgba(0,0,0,.05);box-sizing:border-box;border-top:5px solid #b8d330;color:#fff;font-family:sans-serif;font-size:20px;margin:20px auto!important;outline:0!important;text-align:center;width:99%;min-height:210px;padding:60px 60px 70px}div[aria-label="Block: Classic"] .nggPlaceholder h3{color:#000!important;text-transform:uppercase;font-size:21px;font-family:Lato,sans-serif!important;font-weight:700!important;letter-spacing:3px!important;margin-bottom:0;margin-top:0}div[aria-label="Block: Classic"] .nggPlaceholderButton{background:#000!important;border-radius:2px;border:none!important;box-shadow:none!important;color:#fff!important;display:inline-block!important;font-size:12px;font-weight:700;font-family:Lato,sans-serif!important;height:36px!important;line-height:36px!important;letter-spacing:1.2px;margin:0 4px 2px 0;padding:0;width:121px;text-align:center;text-transform:uppercase!important;text-shadow:none!important;cursor:pointer}div[aria-label="Block: Classic"] .nggPlaceholderButton:hover{background:#383838!important}@media (max-width:781px){#TB_window.ngg_tb_window{position:absolute!important}}
nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/base64.js ADDED
@@ -0,0 +1,231 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*
2
+ * base64.js
3
+ *
4
+ * Licensed under the BSD 3-Clause License.
5
+ * http://opensource.org/licenses/BSD-3-Clause
6
+ *
7
+ * References:
8
+ * http://en.wikipedia.org/wiki/Base64
9
+ */
10
+ ;(function (global, factory) {
11
+ typeof exports === 'object' && typeof module !== 'undefined'
12
+ ? module.exports = factory(global)
13
+ : typeof define === 'function' && define.amd
14
+ ? define(factory) : factory(global)
15
+ }((
16
+ typeof self !== 'undefined' ? self
17
+ : typeof window !== 'undefined' ? window
18
+ : typeof global !== 'undefined' ? global
19
+ : this
20
+ ), function(global) {
21
+ 'use strict';
22
+ // existing version for noConflict()
23
+ var _Base64 = global.Base64;
24
+ var version = "2.4.9";
25
+ // if node.js and NOT React Native, we use Buffer
26
+ var buffer;
27
+ if (typeof module !== 'undefined' && module.exports) {
28
+ try {
29
+ buffer = eval("require('buffer').Buffer");
30
+ } catch (err) {
31
+ buffer = undefined;
32
+ }
33
+ }
34
+ // constants
35
+ var b64chars
36
+ = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
37
+ var b64tab = function(bin) {
38
+ var t = {};
39
+ for (var i = 0, l = bin.length; i < l; i++) t[bin.charAt(i)] = i;
40
+ return t;
41
+ }(b64chars);
42
+ var fromCharCode = String.fromCharCode;
43
+ // encoder stuff
44
+ var cb_utob = function(c) {
45
+ if (c.length < 2) {
46
+ var cc = c.charCodeAt(0);
47
+ return cc < 0x80 ? c
48
+ : cc < 0x800 ? (fromCharCode(0xc0 | (cc >>> 6))
49
+ + fromCharCode(0x80 | (cc & 0x3f)))
50
+ : (fromCharCode(0xe0 | ((cc >>> 12) & 0x0f))
51
+ + fromCharCode(0x80 | ((cc >>> 6) & 0x3f))
52
+ + fromCharCode(0x80 | ( cc & 0x3f)));
53
+ } else {
54
+ var cc = 0x10000
55
+ + (c.charCodeAt(0) - 0xD800) * 0x400
56
+ + (c.charCodeAt(1) - 0xDC00);
57
+ return (fromCharCode(0xf0 | ((cc >>> 18) & 0x07))
58
+ + fromCharCode(0x80 | ((cc >>> 12) & 0x3f))
59
+ + fromCharCode(0x80 | ((cc >>> 6) & 0x3f))
60
+ + fromCharCode(0x80 | ( cc & 0x3f)));
61
+ }
62
+ };
63
+ var re_utob = /[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g;
64
+ var utob = function(u) {
65
+ return u.replace(re_utob, cb_utob);
66
+ };
67
+ var cb_encode = function(ccc) {
68
+ var padlen = [0, 2, 1][ccc.length % 3],
69
+ ord = ccc.charCodeAt(0) << 16
70
+ | ((ccc.length > 1 ? ccc.charCodeAt(1) : 0) << 8)
71
+ | ((ccc.length > 2 ? ccc.charCodeAt(2) : 0)),
72
+ chars = [
73
+ b64chars.charAt( ord >>> 18),
74
+ b64chars.charAt((ord >>> 12) & 63),
75
+ padlen >= 2 ? '=' : b64chars.charAt((ord >>> 6) & 63),
76
+ padlen >= 1 ? '=' : b64chars.charAt(ord & 63)
77
+ ];
78
+ return chars.join('');
79
+ };
80
+ var btoa = global.btoa ? function(b) {
81
+ return global.btoa(b);
82
+ } : function(b) {
83
+ return b.replace(/[\s\S]{1,3}/g, cb_encode);
84
+ };
85
+ var _encode = buffer ?
86
+ buffer.from && Uint8Array && buffer.from !== Uint8Array.from
87
+ ? function (u) {
88
+ return (u.constructor === buffer.constructor ? u : buffer.from(u))
89
+ .toString('base64')
90
+ }
91
+ : function (u) {
92
+ return (u.constructor === buffer.constructor ? u : new buffer(u))
93
+ .toString('base64')
94
+ }
95
+ : function (u) { return btoa(utob(u)) }
96
+ ;
97
+ var encode = function(u, urisafe) {
98
+ return !urisafe
99
+ ? _encode(String(u))
100
+ : _encode(String(u)).replace(/[+\/]/g, function(m0) {
101
+ return m0 == '+' ? '-' : '_';
102
+ }).replace(/=/g, '');
103
+ };
104
+ var encodeURI = function(u) { return encode(u, true) };
105
+ // decoder stuff
106
+ var re_btou = new RegExp([
107
+ '[\xC0-\xDF][\x80-\xBF]',
108
+ '[\xE0-\xEF][\x80-\xBF]{2}',
109
+ '[\xF0-\xF7][\x80-\xBF]{3}'
110
+ ].join('|'), 'g');
111
+ var cb_btou = function(cccc) {
112
+ switch(cccc.length) {
113
+ case 4:
114
+ var cp = ((0x07 & cccc.charCodeAt(0)) << 18)
115
+ | ((0x3f & cccc.charCodeAt(1)) << 12)
116
+ | ((0x3f & cccc.charCodeAt(2)) << 6)
117
+ | (0x3f & cccc.charCodeAt(3)),
118
+ offset = cp - 0x10000;
119
+ return (fromCharCode((offset >>> 10) + 0xD800)
120
+ + fromCharCode((offset & 0x3FF) + 0xDC00));
121
+ case 3:
122
+ return fromCharCode(
123
+ ((0x0f & cccc.charCodeAt(0)) << 12)
124
+ | ((0x3f & cccc.charCodeAt(1)) << 6)
125
+ | (0x3f & cccc.charCodeAt(2))
126
+ );
127
+ default:
128
+ return fromCharCode(
129
+ ((0x1f & cccc.charCodeAt(0)) << 6)
130
+ | (0x3f & cccc.charCodeAt(1))
131
+ );
132
+ }
133
+ };
134
+ var btou = function(b) {
135
+ return b.replace(re_btou, cb_btou);
136
+ };
137
+ var cb_decode = function(cccc) {
138
+ var len = cccc.length,
139
+ padlen = len % 4,
140
+ n = (len > 0 ? b64tab[cccc.charAt(0)] << 18 : 0)
141
+ | (len > 1 ? b64tab[cccc.charAt(1)] << 12 : 0)
142
+ | (len > 2 ? b64tab[cccc.charAt(2)] << 6 : 0)
143
+ | (len > 3 ? b64tab[cccc.charAt(3)] : 0),
144
+ chars = [
145
+ fromCharCode( n >>> 16),
146
+ fromCharCode((n >>> 8) & 0xff),
147
+ fromCharCode( n & 0xff)
148
+ ];
149
+ chars.length -= [0, 0, 2, 1][padlen];
150
+ return chars.join('');
151
+ };
152
+ var atob = global.atob ? function(a) {
153
+ return global.atob(a);
154
+ } : function(a){
155
+ return a.replace(/[\s\S]{1,4}/g, cb_decode);
156
+ };
157
+ var _decode = buffer ?
158
+ buffer.from && Uint8Array && buffer.from !== Uint8Array.from
159
+ ? function(a) {
160
+ return (a.constructor === buffer.constructor
161
+ ? a : buffer.from(a, 'base64')).toString();
162
+ }
163
+ : function(a) {
164
+ return (a.constructor === buffer.constructor
165
+ ? a : new buffer(a, 'base64')).toString();
166
+ }
167
+ : function(a) { return btou(atob(a)) };
168
+ var decode = function(a){
169
+ return _decode(
170
+ String(a).replace(/[-_]/g, function(m0) { return m0 == '-' ? '+' : '/' })
171
+ .replace(/[^A-Za-z0-9\+\/]/g, '')
172
+ );
173
+ };
174
+ var noConflict = function() {
175
+ var Base64 = global.Base64;
176
+ global.Base64 = _Base64;
177
+ return Base64;
178
+ };
179
+ // export Base64
180
+ global.Base64 = {
181
+ VERSION: version,
182
+ atob: atob,
183
+ btoa: btoa,
184
+ fromBase64: decode,
185
+ toBase64: encode,
186
+ utob: utob,
187
+ encode: encode,
188
+ encodeURI: encodeURI,
189
+ btou: btou,
190
+ decode: decode,
191
+ noConflict: noConflict,
192
+ __buffer__: buffer
193
+ };
194
+ // if ES5 is available, make Base64.extendString() available
195
+ if (typeof Object.defineProperty === 'function') {
196
+ var noEnum = function(v){
197
+ return {value:v,enumerable:false,writable:true,configurable:true};
198
+ };
199
+ global.Base64.extendString = function () {
200
+ Object.defineProperty(
201
+ String.prototype, 'fromBase64', noEnum(function () {
202
+ return decode(this)
203
+ }));
204
+ Object.defineProperty(
205
+ String.prototype, 'toBase64', noEnum(function (urisafe) {
206
+ return encode(this, urisafe)
207
+ }));
208
+ Object.defineProperty(
209
+ String.prototype, 'toBase64URI', noEnum(function () {
210
+ return encode(this, true)
211
+ }));
212
+ };
213
+ }
214
+ //
215
+ // export Base64 to the namespace
216
+ //
217
+ if (global['Meteor']) { // Meteor.js
218
+ Base64 = global.Base64;
219
+ }
220
+ // module.exports and AMD are mutually exclusive.
221
+ // module.exports has precedence.
222
+ if (typeof module !== 'undefined' && module.exports) {
223
+ module.exports.Base64 = global.Base64;
224
+ }
225
+ else if (typeof define === 'function' && define.amd) {
226
+ // AMD. Register as an anonymous module.
227
+ define([], function(){ return global.Base64 });
228
+ }
229
+ // that's it!
230
+ return {Base64: global.Base64}
231
+ }));
nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/base64.min.js ADDED
@@ -0,0 +1 @@
 
1
+ "use strict";function _typeof(e){"@babel/helpers - typeof";return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}!function(e,o){"object"===("undefined"==typeof exports?"undefined":_typeof(exports))&&"undefined"!=typeof module?module.exports=o(e):"function"==typeof define&&define.amd?define(o):o(e)}("undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:void 0,function(global){var _Base64=global.Base64,version="2.4.9",buffer;if("undefined"!=typeof module&&module.exports)try{buffer=eval("require('buffer').Buffer")}catch(e){buffer=void 0}var b64chars="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",b64tab=function(e){for(var o={},r=0,t=e.length;r<t;r++)o[e.charAt(r)]=r;return o}(b64chars),fromCharCode=String.fromCharCode,cb_utob=function(e){if(e.length<2){var o=e.charCodeAt(0);return o<128?e:o<2048?fromCharCode(192|o>>>6)+fromCharCode(128|63&o):fromCharCode(224|o>>>12&15)+fromCharCode(128|o>>>6&63)+fromCharCode(128|63&o)}var o=65536+1024*(e.charCodeAt(0)-55296)+(e.charCodeAt(1)-56320);return fromCharCode(240|o>>>18&7)+fromCharCode(128|o>>>12&63)+fromCharCode(128|o>>>6&63)+fromCharCode(128|63&o)},re_utob=/[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g,utob=function(e){return e.replace(re_utob,cb_utob)},cb_encode=function(e){var o=[0,2,1][e.length%3],r=e.charCodeAt(0)<<16|(e.length>1?e.charCodeAt(1):0)<<8|(e.length>2?e.charCodeAt(2):0);return[b64chars.charAt(r>>>18),b64chars.charAt(r>>>12&63),o>=2?"=":b64chars.charAt(r>>>6&63),o>=1?"=":b64chars.charAt(63&r)].join("")},btoa=global.btoa?function(e){return global.btoa(e)}:function(e){return e.replace(/[\s\S]{1,3}/g,cb_encode)},_encode=buffer?buffer.from&&Uint8Array&&buffer.from!==Uint8Array.from?function(e){return(e.constructor===buffer.constructor?e:buffer.from(e)).toString("base64")}:function(e){return(e.constructor===buffer.constructor?e:new buffer(e)).toString("base64")}:function(e){return btoa(utob(e))},encode=function(e,o){return o?_encode(String(e)).replace(/[+\/]/g,function(e){return"+"==e?"-":"_"}).replace(/=/g,""):_encode(String(e))},encodeURI=function(e){return encode(e,!0)},re_btou=new RegExp(["[À-ß][€-¿]","[à-ï][€-¿]{2}","[ð-÷][€-¿]{3}"].join("|"),"g"),cb_btou=function(e){switch(e.length){case 4:var o=(7&e.charCodeAt(0))<<18|(63&e.charCodeAt(1))<<12|(63&e.charCodeAt(2))<<6|63&e.charCodeAt(3),r=o-65536;return fromCharCode(55296+(r>>>10))+fromCharCode(56320+(1023&r));case 3:return fromCharCode((15&e.charCodeAt(0))<<12|(63&e.charCodeAt(1))<<6|63&e.charCodeAt(2));default:return fromCharCode((31&e.charCodeAt(0))<<6|63&e.charCodeAt(1))}},btou=function(e){return e.replace(re_btou,cb_btou)},cb_decode=function(e){var o=e.length,r=o%4,t=(o>0?b64tab[e.charAt(0)]<<18:0)|(o>1?b64tab[e.charAt(1)]<<12:0)|(o>2?b64tab[e.charAt(2)]<<6:0)|(o>3?b64tab[e.charAt(3)]:0),n=[fromCharCode(t>>>16),fromCharCode(t>>>8&255),fromCharCode(255&t)];return n.length-=[0,0,2,1][r],n.join("")},atob=global.atob?function(e){return global.atob(e)}:function(e){return e.replace(/[\s\S]{1,4}/g,cb_decode)},_decode=buffer?buffer.from&&Uint8Array&&buffer.from!==Uint8Array.from?function(e){return(e.constructor===buffer.constructor?e:buffer.from(e,"base64")).toString()}:function(e){return(e.constructor===buffer.constructor?e:new buffer(e,"base64")).toString()}:function(e){return btou(atob(e))},decode=function(e){return _decode(String(e).replace(/[-_]/g,function(e){return"-"==e?"+":"/"}).replace(/[^A-Za-z0-9\+\/]/g,""))},noConflict=function(){var e=global.Base64;return global.Base64=_Base64,e};if(global.Base64={VERSION:version,atob:atob,btoa:btoa,fromBase64:decode,toBase64:encode,utob:utob,encode:encode,encodeURI:encodeURI,btou:btou,decode:decode,noConflict:noConflict,__buffer__:buffer},"function"==typeof Object.defineProperty){var noEnum=function(e){return{value:e,enumerable:!1,writable:!0,configurable:!0}};global.Base64.extendString=function(){Object.defineProperty(String.prototype,"fromBase64",noEnum(function(){return decode(this)})),Object.defineProperty(String.prototype,"toBase64",noEnum(function(e){return encode(this,e)})),Object.defineProperty(String.prototype,"toBase64URI",noEnum(function(){return encode(this,!0)}))}}return global.Meteor&&(Base64=global.Base64),"undefined"!=typeof module&&module.exports?module.exports.Base64=global.Base64:"function"==typeof define&&define.amd&&define([],function(){return global.Base64}),{Base64:global.Base64}});
nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/display_tab.js ADDED
@@ -0,0 +1,1766 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ jQuery(function($){
2
+
3
+ /*****************************************************************************
4
+ ** NGG DEFINITION
5
+ ***/
6
+
7
+ /**
8
+ Setup a namespace for NextGEN-offered Backbone components
9
+ **/
10
+ var Ngg = {
11
+ Models: {},
12
+ Views: {}
13
+ };
14
+
15
+ /*****************************************************************************
16
+ ** NGG MODELS
17
+ ***/
18
+
19
+ /**
20
+ * Ngg.Models.SelectableItems
21
+ * A collection of items that can be selectable. Commonly used with the
22
+ * Ngg.Views.SelectTag widget (view)
23
+ **/
24
+ Ngg.Models.SelectableItems = Backbone.Collection.extend({
25
+ selected: function(){
26
+ return this.filter(function(item){
27
+ return item.get('selected') == true;
28
+ });
29
+ },
30
+
31
+ deselect_all: function(){
32
+ this.each(function(item){
33
+ item.set('selected', false);
34
+ });
35
+ },
36
+
37
+ selected_ids: function(){
38
+ return _.pluck(this.selected(), 'id');
39
+ },
40
+
41
+ select: function(ids){
42
+ if (!_.isArray(ids)) ids = [ids];
43
+ this.each(function(item){
44
+ if (_.indexOf(ids, item.id) >= 0) {
45
+ item.set('selected', true);
46
+ }
47
+ });
48
+ this.trigger('selected');
49
+ }
50
+ });
51
+
52
+
53
+ /*****************************************************************************
54
+ ** NGG VIEWS
55
+ ***/
56
+
57
+ /**
58
+ * Ngg.Views.SelectTag
59
+ * Used to render a Select tag (drop-down list)
60
+ **/
61
+ Ngg.Views.SelectTag = Backbone.View.extend({
62
+ tagName: 'select',
63
+
64
+ collection: null,
65
+
66
+ multiple: false,
67
+
68
+ value_field: 'id',
69
+
70
+ text_field: 'title',
71
+
72
+ initialize: function(options) {
73
+ this.options = options || {};
74
+ _.each(this.options, function(value, key){
75
+ this[key] = value;
76
+ }, this);
77
+ this.collection.on('add', this.render_new_option, this);
78
+ this.collection.on('remove', this.remove_existing_option, this);
79
+ this.collection.on('reset', this.empty_list, this);
80
+ },
81
+
82
+ events: {
83
+ 'change': 'selection_changed'
84
+ },
85
+
86
+ empty_list: function(){
87
+ this.$el.empty();
88
+ },
89
+
90
+ render_new_option: function(item){
91
+ this.$el.append(new this.Option({
92
+ model: item,
93
+ value_field: this.value_field,
94
+ text_field: this.text_field
95
+ }).render().el);
96
+ },
97
+
98
+ remove_existing_option: function(item){
99
+ this.$el.find("option[value='"+item.id+"']").remove();
100
+ },
101
+
102
+ /**
103
+ * After a selection has changed, set the 'selected' property for each item in the
104
+ * collection
105
+ * @triggers 'selected'
106
+ **/
107
+ selection_changed: function(){
108
+ // Get selected options from DOM
109
+ var selections = _.map(this.$el.find(':selected'), function(element){
110
+ return $(element).val();
111
+ });
112
+
113
+ // Set the 'selected' attribute for each item in the collection
114
+ this.collection.each(function(item){
115
+ if (_.indexOf(selections, item.id) >= 0 || _.indexOf(selections, item.id.toString()) >= 0)
116
+ item.set('selected', true);
117
+ else
118
+ item.set('selected', false);
119
+ });
120
+ this.collection.trigger('selected');
121
+
122
+ if (this.onSelect) this.onSelect();
123
+ },
124
+
125
+ render: function(){
126
+ this.$el.empty();
127
+
128
+ if (this.multiple) {
129
+ this.$el.prop('multiple', true);
130
+ this.$el.attr('multiple', 'multiple');
131
+ }
132
+
133
+ this.collection.each(function(item){
134
+ var option = new this.Option({
135
+ model: item,
136
+ value_field: this.value_field,
137
+ text_field: this.text_field
138
+ });
139
+ this.$el.append(option.render().el);
140
+ }, this);
141
+
142
+ if (this.width) {
143
+ this.$el.width(this.width);
144
+ }
145
+
146
+ return this;
147
+ },
148
+
149
+ /**
150
+ * Represents an option in the Select drop-down
151
+ **/
152
+ Option: Backbone.View.extend({
153
+ tagName: 'option',
154
+
155
+ model: null,
156
+
157
+ initialize: function(options) {
158
+ this.options = options || {};
159
+ _.each(this.options, function(value, key){
160
+ this[key] = value;
161
+ }, this);
162
+ this.model.on('change', this.render, this);
163
+ },
164
+
165
+ render: function(){
166
+ var self = this;
167
+ this.$el.html(this.model.get(this.text_field).replace(/\\&/g, '&').replace(/\\'/g, "'"));
168
+ this.$el.prop({
169
+ value: this.value_field == 'id' ? this.model.id : this.model.get(this.value_field),
170
+ });
171
+ if (self.model.get('selected') == true) {
172
+ this.$el.prop('selected', true).attr('selected', 'selected');
173
+ }
174
+ return this;
175
+ }
176
+ })
177
+ });
178
+
179
+
180
+ Ngg.Views.Chosen = Backbone.View.extend({
181
+ tagName: 'span',
182
+
183
+ initialize: function(options) {
184
+ this.options = options || {};
185
+ this.collection = this.options.collection;
186
+ this.select_tag = new Ngg.Views.SelectTag(this.options);
187
+ this.collection.on('change', this.selection_changed, this);
188
+ },
189
+
190
+ selection_changed: function(e){
191
+ if (_.isUndefined(e.changed['selected'])) this.render();
192
+ },
193
+
194
+ render: function(){
195
+
196
+ this.$el.append(this.select_tag.render().$el);
197
+ if (this.options.width)
198
+ this.select_tag.$el.width(this.options.width);
199
+
200
+ // Configure select2 options
201
+ this.select2_opts = {
202
+ placeholder: this.options.placeholder
203
+ };
204
+
205
+ // Create the select2 drop-down
206
+ this.select_tag.$el.select2(this.select2_opts);
207
+
208
+ return this;
209
+ }
210
+ });
211
+
212
+ /*****************************************************************************
213
+ ** DISPLAY TAB DEFINITION
214
+ ***/
215
+
216
+ /**
217
+ * Setup a namespace
218
+ **/
219
+ Ngg.DisplayTab = {
220
+ Models: {},
221
+ Views: {},
222
+ App: {}
223
+ };
224
+
225
+ /*****************************************************************************
226
+ * MODEL CLASSES
227
+ **/
228
+
229
+ /**
230
+ * A collection that can fetch it's entities from the server
231
+ **/
232
+ Ngg.Models.Remote_Collection = Ngg.Models.SelectableItems.extend({
233
+ fetch_limit: 5000,
234
+ in_progress: false,
235
+ fetch_url: photocrati_ajax.url,
236
+ action: '',
237
+ extra_data: {},
238
+
239
+ _create_request: function(limit, offset) {
240
+ var request = {
241
+ action: this.action,
242
+ limit: limit ? limit : this.fetch_limit,
243
+ offset: offset ? offset : 0,
244
+ nonce: igw_data.nonce,
245
+ };
246
+ for (var index in this.extra_data) {
247
+ var value = this.extra_data[index];
248
+ if (typeof(request[index]) === 'undefined') {
249
+ request[index] = {};
250
+ }
251
+ if (typeof(value['toJSON']) !== 'undefined') {
252
+ value = value.toJSON();
253
+ }
254
+ request[index] = _.extend(request[index], value);
255
+ }
256
+ return request;
257
+ },
258
+
259
+ _add_item: function(item) {
260
+ this.push(item);
261
+ },
262
+
263
+ fetch: function(limit, offset){
264
+ // Request the entities from the server
265
+ var self = this;
266
+ this.in_progress = true;
267
+ $.post(this.fetch_url, this._create_request(limit, offset), function(response){
268
+ if (typeof(_) == 'undefined') return;
269
+ if (!_.isObject(response)) response = JSON.parse(response);
270
+
271
+ if (response.items) {
272
+ _.each(response.items, function(item){
273
+ self._add_item(item);
274
+ });
275
+
276
+ // Continue fetching ?
277
+ if (response.total >= response.limit+response.offset) {
278
+ self.fetch(response.limit, response.offset+response.limit);
279
+ }
280
+ else {
281
+ self.in_progress = false;
282
+ self.trigger('finished_fetching');
283
+ }
284
+ }
285
+ });
286
+ }
287
+ });
288
+
289
+
290
+ /**
291
+ * Ngg.DisplayTab.Models.Displayed_Gallery
292
+ * Represents the displayed gallery being edited or created by the Display Tab
293
+ **/
294
+ Ngg.DisplayTab.Models.Displayed_Gallery = Backbone.Model.extend({
295
+ defaults: {
296
+ source: null,
297
+ container_ids: [],
298
+ entity_ids: [],
299
+ display_type: null,
300
+ display_settings: {},
301
+ exclusions: [],
302
+ sortorder: [],
303
+ slug: null
304
+ },
305
+
306
+ to_shortcode: function() {
307
+ retval = null;
308
+
309
+ var get_shortcode_attr = function(object, key) {
310
+ var val = object[key];
311
+
312
+ // Prevent default shortcode attributes from being included
313
+ if (typeof igw_data.shortcode_defaults[key] !== 'undefined'
314
+ && igw_data.shortcode_defaults[key] == val) {
315
+ val = null;
316
+ }
317
+
318
+ if (_.isArray(val)) {
319
+ val = val.length > 0 ? val.join(',') : null;
320
+ }
321
+ if (val) {
322
+ val = val.toString().replace('[', '&#91;');
323
+ val = val.toString().replace(']', '&#93;');
324
+
325
+ // Some keys have aliases to be used when writing shortcodes
326
+ if (typeof igw_data.shortcode_attr_replacements[key] !== 'undefined') {
327
+ key = igw_data.shortcode_attr_replacements[key];
328
+ }
329
+
330
+ return key + '="' + val +'"';
331
+ }
332
+ };
333
+
334
+ // Convert the displayed gallery to a JSON object
335
+ var display_type = Ngg.DisplayTab.instance.display_types.find_by_name_or_alias(this.get('display_type'));
336
+ var obj = this.toJSON();
337
+ obj.display_type = display_type.get_shortcode_value();
338
+
339
+
340
+ // Convert the displayed gallery to a shortcode
341
+ var snippet = '[ngg';
342
+ var val = null;
343
+
344
+ if ((val = get_shortcode_attr(obj, 'source'))) snippet += ' ' + val;
345
+ if ((val = get_shortcode_attr(obj, 'container_ids'))) snippet += ' ' + val;
346
+ if ((val = get_shortcode_attr(obj, 'entity_ids'))) snippet += ' ' + val;
347
+ if ((val = get_shortcode_attr(obj, 'exclusions'))) snippet += ' ' + val;
348
+ if ((val = get_shortcode_attr(obj, 'sortorder'))) snippet += ' ' + val;
349
+
350
+ for (var key in obj) {
351
+ var skipped = [
352
+ 'source',
353
+ 'container_ids',
354
+ 'entity_ids',
355
+ 'exclusions',
356
+ 'sortorder',
357
+ '__defaults_set',
358
+ 'id_field',
359
+ 'post_category',
360
+ 'ID'
361
+ ];
362
+
363
+ if (skipped.indexOf(key) > -1) {
364
+ continue;
365
+ }
366
+ else if (key == 'display_settings') {
367
+ for (var display_key in obj[key]) {
368
+ if ((val = get_shortcode_attr(obj[key], display_key))) {
369
+ snippet += ' ' + val;
370
+ }
371
+ }
372
+ }
373
+ else {
374
+ val = get_shortcode_attr(obj, key);
375
+ if (val) {
376
+ snippet += ' ' + val;
377
+ }
378
+ }
379
+ }
380
+
381
+ snippet += ']';
382
+
383
+ return snippet;
384
+ }
385
+ });
386
+
387
+ /**
388
+ * Ngg.DisplayTab.Models.Source
389
+ * Represents an individual source used to collect displayable entities from
390
+ **/
391
+ Ngg.DisplayTab.Models.Source = Backbone.Model.extend({
392
+ idAttribute: 'name',
393
+ defaults: {
394
+ title: '',
395
+ name: '',
396
+ selected: false
397
+ }
398
+ });
399
+
400
+ /**
401
+ * Ngg.DisplayTab.Models.Source_Collection
402
+ * Used as a collection of all the available sources for entities
403
+ **/
404
+ Ngg.DisplayTab.Models.Source_Collection = Ngg.Models.SelectableItems.extend({
405
+ model: Ngg.DisplayTab.Models.Source,
406
+
407
+ selected_value: function(){
408
+ var retval = null;
409
+ var selected = this.selected();
410
+ if (selected.length > 0) {
411
+ retval = selected[0].get('name');
412
+ }
413
+ return retval;
414
+ },
415
+
416
+ find_by_name_or_alias: function(name) {
417
+ return this.find(function(source) {
418
+ return source.get('name') == name || (_.isArray(source.get('aliases')) && source.get('aliases').indexOf(name) > -1);
419
+ });
420
+ }
421
+ });
422
+
423
+ /**
424
+ * Ngg.DisplayTab.Models.Gallery
425
+ * Represents an individual gallery entity
426
+ **/
427
+ Ngg.DisplayTab.Models.Gallery = Backbone.Model.extend({
428
+ idAttribute: igw_data.gallery_primary_key,
429
+ defaults: {
430
+ title: '',
431
+ name: ''
432
+ }
433
+ });
434
+
435
+ /**
436
+ * Ngg.DisplayTab.Models.Gallery_Collection
437
+ * Collection of gallery objects
438
+ **/
439
+ Ngg.DisplayTab.Models.Gallery_Collection = Ngg.Models.Remote_Collection.extend({
440
+ model: Ngg.DisplayTab.Models.Gallery,
441
+
442
+ action: 'get_existing_galleries'
443
+ });
444
+
445
+ /**
446
+ * Ngg.DisplayTab.Models.Album
447
+ * Represents an individual Album object
448
+ **/
449
+ Ngg.DisplayTab.Models.Album = Backbone.Model.extend({
450
+ defaults: {
451
+ title: '',
452
+ name: ''
453
+ }
454
+ });
455
+
456
+ /**
457
+ * Ngg.DisplayTab.Models.Album_Collection
458
+ * Used as a collection of album objects
459
+ **/
460
+ Ngg.DisplayTab.Models.Album_Collection = Ngg.Models.Remote_Collection.extend({
461
+ model: Ngg.DisplayTab.Models.Album,
462
+
463
+ action: 'get_existing_albums'
464
+ });
465
+
466
+ /**
467
+ * Ngg.DisplayTab.Models.Tag
468
+ * Represents an individual tag object
469
+ **/
470
+ Ngg.DisplayTab.Models.Tag = Backbone.Model.extend({
471
+ defaults: {
472
+ title: ''
473
+ }
474
+ });
475
+
476
+ /**
477
+ * Ngg.DisplayTab.Models.Tag_Collection
478
+ * Represents a collection of tag objects
479
+ **/
480
+ Ngg.DisplayTab.Models.Tag_Collection = Ngg.Models.Remote_Collection.extend({
481
+ model: Ngg.DisplayTab.Models.Tag,
482
+ /*
483
+ selected_ids: function(){
484
+ return this.selected().map(function(item){
485
+ return item.get('name');
486
+ });
487
+ },
488
+ */
489
+
490
+ action: 'get_existing_image_tags'
491
+ });
492
+
493
+ /**
494
+ * Ngg.DisplayTab.Models.Display_Type
495
+ * Represents an individual display type
496
+ **/
497
+ Ngg.DisplayTab.Models.Display_Type = Backbone.Model.extend({
498
+ idAttribute: 'name',
499
+ defaults: {
500
+ title: ''
501
+ },
502
+
503
+ is_compatible_with_source: function(source){
504
+ var success = true;
505
+ for (index in source.get('returns')) {
506
+ var returned_entity_type = source.get('returns')[index];
507
+ if (_.indexOf(this.get('entity_types'), returned_entity_type) < 0) {
508
+ success = false;
509
+ break;
510
+ }
511
+ }
512
+ return success;
513
+ },
514
+
515
+ get_shortcode_value: function() {
516
+ var retval = this.id;
517
+
518
+ var aliases = this.get('aliases');
519
+ if (_.isArray(aliases) && aliases.length > 0) {
520
+ retval = aliases[0];
521
+ }
522
+
523
+ return retval;
524
+ }
525
+ });
526
+
527
+ /**
528
+ * Ngg.DisplayTab.Models.Display_Type_Collection
529
+ * Represents a collection of display type objects
530
+ **/
531
+ Ngg.DisplayTab.Models.Display_Type_Collection = Ngg.Models.SelectableItems.extend({
532
+ model: Ngg.DisplayTab.Models.Display_Type,
533
+
534
+ selected_value: function(){
535
+ var retval = null;
536
+ var selected = this.selected();
537
+ if (selected.length > 0) {
538
+ return selected[0].get('name');
539
+ }
540
+ return retval;
541
+ },
542
+
543
+ find_by_name_or_alias: function(name){
544
+ return this.find(function(display_type){
545
+ return display_type.get('name') == name || (_.isArray(display_type.get('aliases')) && display_type.get('aliases').indexOf(name) > -1);
546
+ });
547
+ }
548
+ });
549
+
550
+ /**
551
+ * Ngg.DisplayTab.Models.Entity
552
+ * Represents an entity to display on the front-end
553
+ **/
554
+ Ngg.DisplayTab.Models.Entity = Backbone.Model.extend({
555
+ entity_id: function(){
556
+ return this.get(this.get('id_field'));
557
+ },
558
+
559
+ is_excluded: function() {
560
+ current_value = this.get('exclude');
561
+ if (_.isUndefined(current_value)) return false;
562
+ else if (_.isBoolean(current_value)) return current_value;
563
+ else return parseInt(current_value) == 0 ? false : true;
564
+ },
565
+
566
+ is_included: function(){
567
+ return !this.is_excluded();
568
+ },
569
+
570
+ is_gallery: function(){
571
+ retval = false;
572
+ if (this.get('is_gallery') == true) retval = true;
573
+ return retval;
574
+ },
575
+
576
+ is_album: function(){
577
+ retval = false;
578
+ if (this.get('is_album') == true) retval = true;
579
+ return retval;
580
+ },
581
+
582
+ is_image: function(){
583
+ return !this.is_album() && !this.is_gallery();
584
+ },
585
+
586
+ alttext: function(){
587
+ if (this.is_image()) {
588
+ return this.get('alttext');
589
+ }
590
+ else if (this.is_gallery()) {
591
+ return this.get('title');
592
+ }
593
+ else if (this.is_album()) {
594
+ return this.get('name');
595
+ }
596
+ }
597
+ });
598
+
599
+ /**
600
+ * Ngg.DisplayTab.Models.Entity_Collection
601
+ * Represents a collection of entities
602
+ **/
603
+ Ngg.DisplayTab.Models.Entity_Collection = Ngg.Models.Remote_Collection.extend({
604
+ model: Ngg.DisplayTab.Models.Entity,
605
+
606
+ action: 'get_displayed_gallery_entities',
607
+
608
+ _add_item: function(item){
609
+ item.exclude = parseInt(item.exclude) == 1 ? true : false;
610
+ item.is_gallery = parseInt(item.is_gallery) == 1 ? true : false;
611
+ item.is_album = parseInt(item.is_album) == 1 ? true : false;
612
+ this.push(item);
613
+ },
614
+
615
+ entity_ids: function(){
616
+ return this.map(function(item){
617
+ return item.entity_id();
618
+ });
619
+ },
620
+
621
+ included_ids: function(){
622
+ return _.compact(this.map(function(item){
623
+ if (item.is_included()) return item.entity_id();
624
+ }));
625
+ },
626
+
627
+ excluded_ids: function() {
628
+ return _.compact(this.map(function(item) {
629
+ if (!item.is_included()) {
630
+ return item.entity_id();
631
+ }
632
+ }));
633
+ }
634
+ });
635
+
636
+
637
+ Ngg.DisplayTab.Models.SortOrder = Backbone.Model.extend({
638
+ });
639
+
640
+ Ngg.DisplayTab.Models.SortOrder_Options = Ngg.Models.SelectableItems.extend({
641
+ model: Ngg.DisplayTab.Models.SortOrder
642
+ });
643
+ Ngg.DisplayTab.Models.SortDirection = Backbone.Model.extend({
644
+
645
+ });
646
+ Ngg.DisplayTab.Models.SortDirection_Options = Backbone.Collection.extend({
647
+ model: Ngg.DisplayTab.Models.SortDirection
648
+ });
649
+
650
+ Ngg.DisplayTab.Models.Slug = Backbone.Model.extend({});
651
+
652
+ /*****************************************************************************
653
+ * VIEW CLASSES
654
+ **/
655
+
656
+ /**
657
+ * Ngg.DisplayTab.Views.Source_Config
658
+ * Used to populate the source configuration tab
659
+ **/
660
+ Ngg.DisplayTab.Views.Source_Config = Backbone.View.extend({
661
+ el: '#source_configuration',
662
+
663
+ selected_view: null,
664
+
665
+ /**
666
+ * Bind to the "sources" collection to know when a selection has been made
667
+ * and determine what sub-view to render
668
+ **/
669
+ initialize: function(){
670
+ this.sources = Ngg.DisplayTab.instance.sources;
671
+ this.sources.on('selected', this.render, this);
672
+ _.bindAll(this, 'render');
673
+ this.render();
674
+ },
675
+
676
+ render: function(){
677
+ var chosen = new Ngg.Views.Chosen({
678
+ id: 'source_select',
679
+ collection: this.sources,
680
+ placeholder: 'Select a source',
681
+ width: 500,
682
+ onSelect: function(){
683
+ $('.main_menu_tab').off('scroll');
684
+ }
685
+ });
686
+
687
+ var template = _.template('<tr><td id="source_column"></td><td><label><%- sources %></label></td></tr>');
688
+ this.$el.html(template(igw_data.i18n));
689
+ this.$el.find('#source_column').append(chosen.render().el);
690
+
691
+ var selected = this.sources.selected();
692
+ if (selected.length) {
693
+ function capitalizeFirstLetter(text) {
694
+ text = String(text);
695
+ return text.charAt(0).toUpperCase() + text.slice(1);
696
+ }
697
+ var view_name = capitalizeFirstLetter(selected.pop().id) + "Source";
698
+ if (typeof(Ngg.DisplayTab.Views[view_name]) != 'undefined') {
699
+ var selected_view = new Ngg.DisplayTab.Views[view_name];
700
+ this.$el.append(selected_view.render().el);
701
+ }
702
+ }
703
+
704
+ return this;
705
+ }
706
+ });
707
+
708
+ Ngg.DisplayTab.Views.Slug_Config = Backbone.View.extend({
709
+ el: '#slug_configuration',
710
+
711
+ selected_view: null,
712
+
713
+ initialize: function() {
714
+ this.displayed_gallery = Ngg.DisplayTab.instance.displayed_gallery;
715
+ this.slug = Ngg.DisplayTab.instance.displayed_gallery.get('slug');
716
+ this.render();
717
+ },
718
+
719
+ render: function() {
720
+ var self = this;
721
+
722
+ var input = $('<input>').prop({
723
+ type: 'text',
724
+ name: 'slug',
725
+ value: this.slug,
726
+ placeholder: igw_data.i18n.optional,
727
+ id: 'field_slug'
728
+ });
729
+
730
+ input.on('input', function() {
731
+ // Do not allow the following characters in the slug
732
+ $(this).val($(this).val().replace(/\s|\?|\\|\/|&|=|\[|]|#/gm, '-'));
733
+ self.displayed_gallery.set('slug', $(this).val());
734
+ });
735
+
736
+ // Trim extraneous leading/following dashes from the above sanitation
737
+ input.on('change', function() {
738
+ $(this).val(
739
+ $(this).val()
740
+ .replace(/^-*/gm, '')
741
+ .replace(/-*$/gm, '')
742
+ );
743
+ self.displayed_gallery.set('slug', $(this).val());
744
+ });
745
+
746
+ var template = _.template('<tr><td id="slug_label"><label for="field_slug" class="tooltip" title="<%- slug_tooltip %><"><<%- slug_label %></label></td><td id="slug_column"></td></tr>');
747
+ this.$el.append(template(igw_data.i18n));
748
+ this.$el.find('#slug_column').append(input);
749
+
750
+ return this;
751
+ }
752
+ });
753
+
754
+ Ngg.DisplayTab.Views.Display_Type_Selector = Backbone.View.extend({
755
+ el: '#display_type_selector',
756
+
757
+ initialize: function(){
758
+ this.display_types = Ngg.DisplayTab.instance.display_types;
759
+ this.display_type_order_base = Ngg.DisplayTab.instance.display_type_order_base;
760
+ this.display_type_order_step = Ngg.DisplayTab.instance.display_type_order_step;
761
+ this.sources = Ngg.DisplayTab.instance.sources;
762
+ this.render();
763
+ },
764
+
765
+ selection_changed: function(value){
766
+ var selected_type = null;
767
+ this.display_types.each(function(item){
768
+ if (item.get('name') == value) {
769
+ selected_type = item;
770
+ item.set('selected', true);
771
+ }
772
+ else {
773
+ item.set('selected', false);
774
+ }
775
+ });
776
+
777
+ $('.display_settings_form').each(function(){
778
+ $this = $(this);
779
+ if ($this.attr('rel') == value) $this.removeClass('hidden');
780
+ else $this.addClass('hidden');
781
+ });
782
+ },
783
+
784
+ render: function(){
785
+ var selected_source = this.sources.selected();
786
+ var current_step = 0;
787
+ selected_source = selected_source.length > 0 ? selected_source[0] : false;
788
+ this.$el.empty();
789
+
790
+ var order_base = this.display_type_order_base;
791
+ var order_step = this.display_type_order_step;
792
+
793
+ this.display_types.each(function(item){
794
+ if (selected_source && !item.is_compatible_with_source(selected_source)) {
795
+
796
+ // Show all display types if we're viewing the display type
797
+ // selector tab
798
+ var display_tab = $('#display_type_tab_content:visible');
799
+ if (display_tab.length == 0) return;
800
+ else if (display_tab.css('visibility') == 'hidden') return;
801
+ }
802
+ var display_type = new Ngg.DisplayTab.Views.DisplayType;
803
+ display_type.model = item;
804
+ display_type.on('selected', this.selection_changed, this);
805
+ if (!this.display_types.selected_value()) {
806
+ item.set('selected', true);
807
+ this.selection_changed(item.id);
808
+ }
809
+ var display_order = item.get('view_order');
810
+ if (!display_order)
811
+ display_order = order_base;
812
+ var display_step = Math.floor(display_order / order_step);
813
+ current_step = display_step;
814
+ this.$el.append(display_type.render().el);
815
+ }, this);
816
+ this.$el.append('<li class="clear" style="height: 10px; list-style-type:none" />');
817
+ return this;
818
+ },
819
+
820
+
821
+ });
822
+
823
+ Ngg.DisplayTab.Views.DisplayType = Backbone.View.extend({
824
+ className: 'display_type_preview',
825
+
826
+ events: {
827
+ click: 'clicked'
828
+ },
829
+
830
+ clicked: function(e){
831
+ this.trigger('selected', this.model.get('name'));
832
+ },
833
+
834
+ render: function() {
835
+ // Create all elements
836
+ var image_container = $('<label style="display: block; cursor: pointer;"/>').addClass('image_container');
837
+
838
+ var img = $('<img/>').attr({
839
+ src: this.model.get('preview_image_url'),
840
+ title: this.model.get('title'),
841
+ alt: this.model.get('alt')
842
+ });
843
+ var inner_div = $('<div/>');
844
+ var radio_button = $('<input/>').prop({
845
+ type: 'radio',
846
+ value: this.model.get('name'),
847
+ title: this.model.get('title'),
848
+ name: 'display_type',
849
+ checked: this.model.get('selected')
850
+ });
851
+ var line_break = $('<br>');
852
+ image_container.append(inner_div);
853
+ image_container.append(img);
854
+ image_container.append('<br>');
855
+ image_container.append(this.model.get('title').replace(/nextgen /gi, ''));
856
+ inner_div.append(radio_button);
857
+ inner_div.append(line_break);
858
+ // inner_div.append(this.model.get('title').replace(/nextgen /gi, ''));
859
+ this.$el.append(image_container);
860
+ return this;
861
+ }
862
+ })
863
+
864
+ Ngg.DisplayTab.Views.Preview_Area = Backbone.View.extend({
865
+ el: '#preview_area',
866
+
867
+ initialize: function(){
868
+ this.entities = Ngg.DisplayTab.instance.entities;
869
+ this.sources = Ngg.DisplayTab.instance.sources;
870
+ this.displayed_gallery = Ngg.DisplayTab.instance.displayed_gallery;
871
+
872
+ // Create the entity list
873
+ this.entity_list = $('<ul/>').attr('id', 'entity_list').append('<li class="clear"/>');
874
+
875
+ // When an entity is added/removed to the collection, we'll add/remove it on the DOM
876
+ this.entities.on('add', this.render_entity, this);
877
+ this.entities.on('remove', this.remove_entity, this);
878
+
879
+ // When the collection is reset, we add a list item to clear the float. This is important -
880
+ // jQuery sortable() will break without the cleared element.
881
+ this.entities.on('reset', this.entities_reset, this);
882
+
883
+ // When jQuery sortable() is finished sorting, we need to adjust the order of models in the collection
884
+ this.entities.on('change:sortorder', function(model){
885
+ this.entities.remove(model, {silent: true});
886
+ this.entities.add(model, {at: model.changed.sortorder, silent: true});
887
+ this.displayed_gallery.set('sortorder', this.entities.entity_ids());
888
+ if (typeof(console) != 'undefined' && typeof(console.log) != 'undefined') {
889
+ console.log(this.entities.entity_ids());
890
+ }
891
+ this.displayed_gallery.set('order_by', 'sortorder');
892
+ }, this);
893
+
894
+ // Reset when the source changes
895
+ this.sources.on('selected', this.render, this);
896
+
897
+ this.render();
898
+ },
899
+
900
+ events: {
901
+ opened: 'entities_reset'
902
+ },
903
+
904
+ entities_reset: function(e){
905
+ this.entities.reset(null, {silent: true});
906
+ this.entity_list.empty().append('<li class="clear"/>');
907
+ if (!this.entities.in_progress) this.entities.fetch();
908
+ },
909
+
910
+ render_entity: function(model){
911
+ var entity_element = new this.EntityElement({model: model});
912
+ this.entity_list.find('.clear').before(entity_element.render().$el);
913
+ entity_element.$el.css('visibility', 'hidden');
914
+ setTimeout(function(){
915
+ entity_element.$el.css('visibility', 'visible');
916
+ }, 0);
917
+ if (this.$el.find('.no_entities').length == 1) {
918
+ this.render();
919
+ }
920
+ else if (this.entities.length > 1) {
921
+ this.entity_list.sortable('refresh');
922
+ }
923
+ },
924
+
925
+ remove_entity: function(model){
926
+ var id = this.id = model.get('id_field')+'_'+model.entity_id();
927
+ var entity = this.entity_list.find('#'+id).remove();
928
+ this.entity_list.sortable('refresh');
929
+ if (this.entities.length == 0) {
930
+ this.render_no_images_notice();
931
+ }
932
+ },
933
+
934
+ render_no_images_notice: function(){
935
+ this.$el.empty();
936
+ this.$el.append("<p class='no_entities'>"+igw_data.i18n.no_entities+"</p>");
937
+ },
938
+
939
+ render: function(){
940
+ this.$el.empty();
941
+ if (this.entities.length > 0 && this.displayed_gallery.get('container_ids').length > 0) {
942
+
943
+ // Render header rows
944
+ this.$el.append(new this.RefreshButton({
945
+ entities: this.entities
946
+ }).render().el);
947
+ this.$el.append(new this.SortButtons({
948
+ entities: this.entities,
949
+ displayed_gallery: this.displayed_gallery,
950
+ sources: this.sources
951
+ }).render().el);
952
+ this.$el.append(new this.ExcludeButtons({
953
+ entities: this.entities
954
+ }).render().el);
955
+
956
+ this.$el.append(this.entity_list);
957
+
958
+ // Activate jQuery Sortable for the entity list
959
+ this.entity_list.sortable({
960
+ placeholder: 'placeholder',
961
+ forcePlaceholderSize: true,
962
+ containment: 'parent',
963
+ opacity: 0.7,
964
+ revert: true,
965
+ dropOnEmpty: true,
966
+ start: function(e, ui){
967
+ ui.placeholder.css({
968
+ height: ui.item.height()
969
+ });
970
+ return true;
971
+ },
972
+ stop: function(e, ui) {
973
+ ui.item.trigger('drop', ui.item.index());
974
+ }
975
+ });
976
+ this.entity_list.disableSelection();
977
+ }
978
+ else {
979
+ this.render_no_images_notice();
980
+ }
981
+ return this;
982
+ },
983
+
984
+ RefreshButton: Backbone.View.extend({
985
+ className: 'refresh_button button-primary',
986
+
987
+ tagName: 'input',
988
+
989
+ label: 'Refresh',
990
+
991
+ events: {
992
+ click: 'clicked'
993
+ },
994
+
995
+ clicked: function(){
996
+ this.entities.reset();
997
+ },
998
+
999
+ initialize: function(options) {
1000
+ this.options = options || {};
1001
+ _.each(this.options, function(value, key){
1002
+ this[key] = value;
1003
+ }, this);
1004
+ },
1005
+
1006
+ render: function(){
1007
+ this.$el.attr({
1008
+ value: this.label,
1009
+ type: 'button'
1010
+ });
1011
+ return this;
1012
+ }
1013
+ }),
1014
+
1015
+ ExcludeButtons: Backbone.View.extend({
1016
+ className: 'header_row',
1017
+
1018
+ initialize: function(options) {
1019
+ this.options = options || {};
1020
+ _.each(this.options, function(value, key){
1021
+ this[key] = value;
1022
+ }, this);
1023
+ },
1024
+
1025
+ render: function(){
1026
+ this.$el.empty();
1027
+ this.$el.append('<span style="margin-right: 8px;">Exclude:</span>');
1028
+ var all_button = new this.Button({
1029
+ value: true,
1030
+ text: 'All',
1031
+ entities: this.entities
1032
+ });
1033
+ this.$el.append(all_button.render().el);
1034
+ this.$el.append('<span class="separator">|</span>');
1035
+ var none_button = new this.Button({
1036
+ value: false,
1037
+ text: 'None',
1038
+ entities: this.entities
1039
+ });
1040
+ this.$el.append(none_button.render().el);
1041
+ return this;
1042
+ },
1043
+
1044
+ Button: Backbone.View.extend({
1045
+ tagName: 'a',
1046
+
1047
+ value: 1,
1048
+
1049
+ text: '',
1050
+
1051
+ events: {
1052
+ click: 'clicked'
1053
+ },
1054
+
1055
+ initialize: function(options) {
1056
+ this.options = options || {};
1057
+ _.each(this.options, function(value, key){
1058
+ this[key] = value;
1059
+ }, this);
1060
+ },
1061
+
1062
+ clicked: function(e){
1063
+ e.preventDefault();
1064
+ this.entities.each(function(item){
1065
+ item.set('exclude', this.value);
1066
+ }, this);
1067
+ },
1068
+
1069
+ render: function(){
1070
+ this.$el.text(this.text).attr('href', '#');
1071
+ return this;
1072
+ }
1073
+ })
1074
+ }),
1075
+
1076
+ SortButtons: Backbone.View.extend({
1077
+ className: 'header_row',
1078
+
1079
+ initialize: function(options) {
1080
+ this.options = options || {};
1081
+ _.each(this.options, function(value, key){
1082
+ this[key] = value;
1083
+ }, this);
1084
+ this.sortorder_options = new Ngg.DisplayTab.Models.SortOrder_Options();
1085
+ this.sortorder_options.on('change:selected', this.sortoption_changed, this);
1086
+
1087
+ // Create sort directions and listen for selection changes
1088
+ this.sortdirection_options = new Ngg.DisplayTab.Models.SortDirection_Options([
1089
+ {
1090
+ value: 'ASC',
1091
+ title: 'Ascending',
1092
+ selected: this.displayed_gallery.get('order_direction') == 'ASC'
1093
+ },
1094
+ {
1095
+ value: 'DESC',
1096
+ title: 'Descending',
1097
+ selected: this.displayed_gallery.get('order_direction') == 'DESC'
1098
+ }
1099
+ ]);
1100
+ this.sortdirection_options.on('change:selected', this.sortdirection_changed, this);
1101
+ this.displayed_gallery.on('change:order_by', this.displayed_gallery_order_changed, this);
1102
+ this.displayed_gallery.on('change.order_direction', this.displayed_gallery_order_dir_changed, this);
1103
+ },
1104
+
1105
+ populate_sorting_fields: function(){
1106
+ // We display difference sorting buttons depending on what type of entities we're dealing with.
1107
+ var entity_types = this.sources.selected().pop().get('returns');
1108
+ if (_.indexOf(entity_types, 'image') !== -1) {
1109
+ this.fill_image_sortorder_options();
1110
+ }
1111
+ else {
1112
+ this.fill_gallery_sortorder_options();
1113
+ }
1114
+ },
1115
+
1116
+ create_sortorder_option: function(name, title){
1117
+ return new Ngg.DisplayTab.Models.SortOrder({
1118
+ name: name,
1119
+ title: title,
1120
+ value: name,
1121
+ selected: this.displayed_gallery.get('order_by') == name
1122
+ });
1123
+ },
1124
+
1125
+ fill_image_sortorder_options: function(){
1126
+ this.sortorder_options.reset();
1127
+ this.sortorder_options.push(this.create_sortorder_option('', 'None'));
1128
+ this.sortorder_options.push(this.create_sortorder_option('sortorder', 'Custom'));
1129
+ this.sortorder_options.push(this.create_sortorder_option(Ngg.DisplayTab.instance.image_key, 'Image ID'));
1130
+ this.sortorder_options.push(this.create_sortorder_option('filename', 'Filename'));
1131
+ this.sortorder_options.push(this.create_sortorder_option('alttext', 'Alt/Title Text'));
1132
+ this.sortorder_options.push(this.create_sortorder_option('imagedate', 'Date/Time'));
1133
+ },
1134
+
1135
+ fill_gallery_sortorder_options: function(){
1136
+ this.sortorder_options.reset();
1137
+ this.sortorder_options.push(this.create_sortorder_option('', 'None'));
1138
+ this.sortorder_options.push(this.create_sortorder_option('sortorder' ,'Custom'));
1139
+ this.sortorder_options.push(this.create_sortorder_option('name', 'Name'));
1140
+ this.sortorder_options.push(this.create_sortorder_option('galdesc', 'Description'));
1141
+ },
1142
+
1143
+ displayed_gallery_order_changed: function(e){
1144
+ this.sortorder_options.findWhere({value: e.get('order_by')}).set('selected', true);
1145
+ },
1146
+
1147
+
1148
+ displayed_gallery_order_dir_changed: function(e){
1149
+ this.sortdirection_options.findWhere({value: e.get('order_direction')}).set('selected', true);
1150
+ },
1151
+
1152
+ sortoption_changed: function(model){
1153
+ this.sortorder_options.each(function(item){
1154
+ item.set('selected', model.get('value') == item.get('value') ? true : false, {silent: true});
1155
+ });
1156
+
1157
+ this.displayed_gallery.set('sortorder', []);
1158
+
1159
+ var sort_by = model.get('value');
1160
+
1161
+ // If "None" was selected, then clear the "sortorder" property
1162
+ if (model.get('value').length == 0) {
1163
+ sort_by = 'sortorder';
1164
+ }
1165
+
1166
+ // Change the "sort by" parameter
1167
+ this.displayed_gallery.set('order_by', sort_by);
1168
+
1169
+ this.entities.reset();
1170
+ this.$el.find('a.sortorder').each(function(){
1171
+ var $item = $(this);
1172
+ if ($item.attr('value') == model.get('value'))
1173
+ $item.addClass('selected');
1174
+ else
1175
+ $item.removeClass('selected');
1176
+ });
1177
+ },
1178
+
1179
+ sortdirection_changed: function(model){
1180
+
1181
+ this.sortdirection_options.each(function(item){
1182
+ item.set('selected', model.get('value') == item.get('value') ? true : false, {silent: true});
1183
+ });
1184
+ this.displayed_gallery.set('order_direction', model.get('value'));
1185
+ this.entities.reset();
1186
+ this.$el.find('a.sortdirection').each(function(){
1187
+ var $item = $(this);
1188
+ if ($item.attr('value') == model.get('value'))
1189
+ $item.addClass('selected');
1190
+ else
1191
+ $item.removeClass('selected');
1192
+ });
1193
+ },
1194
+
1195
+ render: function(){
1196
+ this.$el.empty();
1197
+ this.populate_sorting_fields();
1198
+ this.$el.append('<span style="margin-right: 8px;">Sort By:</span>');
1199
+ this.sortorder_options.each(function(item, index){
1200
+ var button = new this.Button({model: item, className: 'sortorder'});
1201
+ this.$el.append(button.render().el);
1202
+ if (this.sortorder_options.length-1 > index) {
1203
+ this.$el.append('<span class="separator">|</span>');
1204
+ }
1205
+ }, this);
1206
+ this.$el.append('<span style="margin: 0 8px 0 40px;">Order By:</span>');
1207
+ this.sortdirection_options.each(function(item, index){
1208
+ var button = new this.Button({model: item, className: 'sortdirection'});
1209
+ this.$el.append(button.render().el);
1210
+ if (this.sortdirection_options.length-1 > index) {
1211
+ this.$el.append('<span class="separator">|</span>');
1212
+ }
1213
+ }, this);
1214
+ return this;
1215
+ },
1216
+
1217
+ Button: Backbone.View.extend({
1218
+ tagName: 'a',
1219
+
1220
+ initialize: function(options) {
1221
+ this.options = options || {};
1222
+ _.each(this.options, function(value, key){
1223
+ this[key] = value;
1224
+ }, this);
1225
+ },
1226
+
1227
+ events: {
1228
+ click: 'clicked'
1229
+ },
1230
+
1231
+ clicked: function(e){
1232
+ e.preventDefault();
1233
+ this.model.set('selected', true);
1234
+ },
1235
+
1236
+ render: function(){
1237
+ this.$el.prop({
1238
+ value: this.model.get('value'),
1239
+ href: '#'
1240
+ });
1241
+ this.$el.text(this.model.get('title'));
1242
+ if (this.model.get('selected')) this.$el.addClass('selected');
1243
+ return this;
1244
+ }
1245
+ })
1246
+ }),
1247
+
1248
+ // Individual entity in the preview area
1249
+ EntityElement: Backbone.View.extend({
1250
+ tagName: 'li',
1251
+
1252
+ events: {
1253
+ drop: 'item_dropped'
1254
+ },
1255
+
1256
+ initialize: function(options) {
1257
+ this.options = options || {};
1258
+ _.each(this.options, function(value, key){
1259
+ this[key] = value;
1260
+ }, this);
1261
+ this.initTime = new Date().getTime();
1262
+ this.model.on('change', this.render, this);
1263
+ if (this.model.get('sortorder') == 0) {
1264
+ this.model.set('sortorder', -1, {silent: true});
1265
+ }
1266
+ this.id = this.model.get('id_field')+'_'+this.model.entity_id()
1267
+ },
1268
+
1269
+ item_dropped: function(e, index){
1270
+ Ngg.DisplayTab.instance.displayed_gallery.set('order_by', 'sortorder');
1271
+ //Ngg.DisplayTab.instance.displayed_gallery.set('order_direction', 'ASC');
1272
+ this.model.set('sortorder', index);
1273
+ },
1274
+
1275
+ render: function(){
1276
+ this.$el.empty();
1277
+ var preview_item = $('<div/>').addClass('preview_item');
1278
+ var image_container = $('<div/>').addClass('image_container');
1279
+ var alt_text = this.model.alttext().replace(/\\&/g, '&').replace(/\\'/g, "'");
1280
+ var timestamp = this.initTime;
1281
+ image_container.attr({
1282
+ title: alt_text,
1283
+ style: "background-image: url('"+this.model.get('thumb_url')+"?timestamp"+timestamp+"')"
1284
+ });
1285
+
1286
+ this.$el.append(preview_item).addClass('ui-state-default');
1287
+
1288
+ preview_item.append(image_container);
1289
+
1290
+ // Add exclude checkbox
1291
+ var exclude_container = $('<div/>').addClass('exclude_container');
1292
+ var exclude_label = $('<label/>');
1293
+ exclude_label.append(igw_data.i18n.exclude_question);
1294
+ var exclude_checkbox = new this.ExcludeCheckbox({model: this.model});
1295
+ exclude_label.append(exclude_checkbox.render().el);
1296
+ exclude_container.append(exclude_label);
1297
+ preview_item.append(exclude_container);
1298
+ return this;
1299
+ },
1300
+
1301
+ ExcludeCheckbox: Backbone.View.extend({
1302
+ tagName: 'input',
1303
+
1304
+ events: {
1305
+ 'change': 'entity_excluded'
1306
+ },
1307
+
1308
+ type_set: false,
1309
+
1310
+ entity_excluded: function(e){
1311
+ this.model.set('exclude', e.target.checked);
1312
+ },
1313
+
1314
+ initialize: function(options) {
1315
+ this.options = options || {};
1316
+ _.each(this.options, function(value, key){
1317
+ this[key] = value;
1318
+ }, this);
1319
+ this.model.on('change:exclude', this.render, this);
1320
+ },
1321
+
1322
+ render: function(){
1323
+ if (!this.type_set) {
1324
+ this.$el.attr('type', 'checkbox');
1325
+ this.type_set = true;
1326
+ }
1327
+ if (this.model.is_excluded()) this.$el.prop('checked', true);
1328
+ else this.$el.prop('checked', false);
1329
+ return this;
1330
+ }
1331
+ })
1332
+ })
1333
+ });
1334
+
1335
+
1336
+ // Additional source configuration views. These will be rendered dynamically by PHP.
1337
+ // Adapters will add them.
1338
+ Ngg.DisplayTab.Views.GalleriesSource = Backbone.View.extend({
1339
+ tagName: 'tbody',
1340
+
1341
+ initialize: function(){
1342
+ this.galleries = Ngg.DisplayTab.instance.galleries;
1343
+ },
1344
+
1345
+ render: function(){
1346
+ var select = new Ngg.Views.Chosen({
1347
+ collection: this.galleries,
1348
+ placeholder: igw_data.i18n.select_gallery,
1349
+ multiple: true,
1350
+ width: 500
1351
+ });
1352
+ var html = $('<tr><td class="galleries_column"></td><td><label>'+igw_data.i18n.galleries+'</label></td></tr>');
1353
+ this.$el.empty();
1354
+ this.$el.append(html);
1355
+ this.$el.find('.galleries_column').append(select.render().el);
1356
+ return this;
1357
+ }
1358
+ });
1359
+
1360
+ Ngg.DisplayTab.Views.AlbumsSource = Backbone.View.extend({
1361
+ tagName: 'tbody',
1362
+
1363
+ initialize: function(){
1364
+ this.albums = Ngg.DisplayTab.instance.albums;
1365
+ },
1366
+
1367
+ render: function(){
1368
+ var album_select = new Ngg.Views.Chosen({
1369
+ collection: this.albums,
1370
+ multiple: true,
1371
+ placeholder: 'Select an album',
1372
+ text_field: 'name',
1373
+ width: 500
1374
+ });
1375
+ this.$el.empty();
1376
+ this.$el.append('<tr><td class="albums_column"></td><td><label>'+igw_data.i18n.albums+'</label></td></tr>');
1377
+ this.$el.find('.albums_column').append(album_select.render().el);
1378
+ return this;
1379
+ }
1380
+ });
1381
+
1382
+ Ngg.DisplayTab.Views.TagsSource = Backbone.View.extend({
1383
+ tagName: 'tbody',
1384
+
1385
+ initialize: function(){
1386
+ this.tags = Ngg.DisplayTab.instance.tags;
1387
+ },
1388
+
1389
+ render: function(){
1390
+ var tag_select = new Ngg.Views.Chosen({
1391
+ collection: this.tags,
1392
+ multiple: true,
1393
+ placeholder: 'Select a tag',
1394
+ text_field: 'name',
1395
+ width: 500
1396
+ });
1397
+ this.$el.empty();
1398
+ this.$el.append('<tr><td class="tags_column"></td><td><label>Tags</label></td></tr>');
1399
+ this.$el.find('.tags_column').append(tag_select.render().el);
1400
+ return this;
1401
+ }
1402
+ });
1403
+
1404
+ Ngg.DisplayTab.Views.Recent_imagesSource = Backbone.View.extend({
1405
+ tagName: 'tbody',
1406
+
1407
+ initialize: function(){
1408
+ this.displayed_gallery = Ngg.DisplayTab.instance.displayed_gallery;
1409
+ this.maximum_entity_count = Ngg.DisplayTab.instance.displayed_gallery.get('maximum_entity_count');
1410
+ this.displayed_gallery.set('container_ids', []);
1411
+ },
1412
+
1413
+ render: function(){
1414
+ var self = this;
1415
+ var edit_field = $('<input/>').prop({
1416
+ type: 'text',
1417
+ value: this.maximum_entity_count,
1418
+ name: 'maximum_entity_count'
1419
+ });
1420
+
1421
+ edit_field.on('change', function () {
1422
+ self.displayed_gallery.set('maximum_entity_count', $(this).val());
1423
+ });
1424
+
1425
+ this.$el.empty();
1426
+ this.$el.append('<tr><td class="recent_images_column"></td><td><label># of Images To Display</label></td></tr>');
1427
+ this.$el.find('.recent_images_column').append(edit_field);
1428
+ return this;
1429
+ }
1430
+ });
1431
+
1432
+ Ngg.DisplayTab.Views.Random_imagesSource = Backbone.View.extend({
1433
+ tagName: 'tbody',
1434
+
1435
+ initialize: function(){
1436
+ this.displayed_gallery = Ngg.DisplayTab.instance.displayed_gallery;
1437
+ this.maximum_entity_count = Ngg.DisplayTab.instance.displayed_gallery.get('maximum_entity_count');
1438
+ this.displayed_gallery.set('container_ids', []);
1439
+ },
1440
+
1441
+ render: function(){
1442
+ var self = this;
1443
+ var edit_field = $('<input/>').prop({
1444
+ type: 'text',
1445
+ value: this.maximum_entity_count,
1446
+ name: 'maximum_entity_count'
1447
+ });
1448
+
1449
+ edit_field.on('change', function () {
1450
+ self.displayed_gallery.set('maximum_entity_count', $(this).val());
1451
+ });
1452
+
1453
+ this.$el.empty();
1454
+ this.$el.append('<tr><td class="random_images_column"></td><td><label># of Images To Display</label></td></tr>');
1455
+ this.$el.find('.random_images_column').append(edit_field);
1456
+ return this;
1457
+ }
1458
+ });
1459
+
1460
+ Ngg.DisplayTab.Views.SaveButton = Backbone.View.extend({
1461
+ el: '#save_displayed_gallery',
1462
+
1463
+ errors_el: '#errors',
1464
+
1465
+ displayed_gallery: null,
1466
+
1467
+ events: {
1468
+ click: 'clicked'
1469
+ },
1470
+
1471
+ initialize: function(){
1472
+ this.displayed_gallery = Ngg.DisplayTab.instance.displayed_gallery;
1473
+ this.entities = Ngg.DisplayTab.instance.entities;
1474
+ this.render();
1475
+ },
1476
+
1477
+ clicked: function(){
1478
+ this.set_display_settings();
1479
+ var shortcode = this.displayed_gallery.to_shortcode();
1480
+ insert_into_editor(shortcode, (this.displayed_gallery.id ? this.displayed_gallery.id : igw_data.shortcode_ref));
1481
+ var editor = null
1482
+ if ((editor = location.toString().match(/editor=([^\&]+)/)) && editor.length >= 2) {
1483
+ top.tinyMCE.editors[editor[1]].fire('ngg-inserted', {shortcode: shortcode})
1484
+ }
1485
+
1486
+ close_attach_to_post_window();
1487
+ },
1488
+
1489
+ set_display_settings: function() {
1490
+ var display_type = this.displayed_gallery.get('display_type');
1491
+ if (display_type) {
1492
+ // Collect display settings
1493
+ var form = $("form[rel='" + display_type + "']");
1494
+ var defaults = form.data('defaults')
1495
+ var display_settings = (function(item) {
1496
+ var obj = {};
1497
+ $.each(item.serializeArray(), function(key, item) {
1498
+ var parts = item.name.split('[');
1499
+ var current_obj = obj;
1500
+ for (var i = 0; i < parts.length; i++) {
1501
+ var part = parts[i].replace(/\]$/, '');
1502
+
1503
+ // Skip settings that haven't been changed from the default
1504
+ if (defaults[part] == item.value) {
1505
+ return true;
1506
+ }
1507
+
1508
+ if (!current_obj[part]) {
1509
+ if (i == (parts.length - 1)) {
1510
+ current_obj[part] = item.value;
1511
+ } else {
1512
+ current_obj[part] = {};
1513
+ }
1514
+ }
1515
+ current_obj = current_obj[part];
1516
+ }
1517
+ });
1518
+ return obj;
1519
+ })(form);
1520
+
1521
+ // Set display settings for displayed gallery
1522
+ this.displayed_gallery.set('display_settings', display_settings[display_type]);
1523
+ }
1524
+ },
1525
+
1526
+ render: function(){
1527
+ this.$el.css('z-index', 1000);
1528
+ return this;
1529
+ }
1530
+ });
1531
+
1532
+ /*****************************************************************************
1533
+ * APPLICATION
1534
+ **/
1535
+ Ngg.DisplayTab.App = Backbone.View.extend({
1536
+ /**
1537
+ * Initializes the DisplayTab object
1538
+ **/
1539
+ initialize: function(){
1540
+ // TODO: We're currently fetching ALL galleries, albums, and tags
1541
+ // in one shot. Instead, we should display the displayed_gallery's
1542
+ // containers, if there are any, otherwise get the first 100 or so.
1543
+ // We can then use AJAX to fetch the rest of batches.
1544
+ this.displayed_gallery = new Ngg.DisplayTab.Models.Displayed_Gallery(igw_data.displayed_gallery);
1545
+ this.original_displayed_gallery = new Ngg.DisplayTab.Models.Displayed_Gallery(igw_data.displayed_gallery);
1546
+ this.galleries = new Ngg.DisplayTab.Models.Gallery_Collection(igw_data.galleries);
1547
+ this.albums = new Ngg.DisplayTab.Models.Album_Collection(igw_data.albums);
1548
+ this.tags = new Ngg.DisplayTab.Models.Tag_Collection(igw_data.tags);
1549
+ this.sources = new Ngg.DisplayTab.Models.Source_Collection(igw_data.sources);
1550
+ this.display_types = new Ngg.DisplayTab.Models.Display_Type_Collection(igw_data.display_types);
1551
+ this.display_type_order_base = igw_data.display_type_priority_base;
1552
+ this.display_type_order_step = igw_data.display_type_priority_step;
1553
+ this.entities = new Ngg.DisplayTab.Models.Entity_Collection();
1554
+ this.entities.extra_data.displayed_gallery = this.displayed_gallery;
1555
+ this.image_key = igw_data.image_primary_key;
1556
+
1557
+ // Pre-select current displayed gallery values
1558
+ if (this.displayed_gallery.get('source')) {
1559
+
1560
+ // Pre-select source
1561
+ if (this.displayed_gallery.get('source')) {
1562
+ var source = this.sources.find_by_name_or_alias(this.displayed_gallery.get('source'));
1563
+ if (source) source.set('selected', true);
1564
+ }
1565
+
1566
+ // Pre-select containers
1567
+ if (this.displayed_gallery.get('container_ids')) {
1568
+ _.each(this.displayed_gallery.get('container_ids'), function(id){
1569
+ var container = this[this.displayed_gallery.get('source')].find(function(item){
1570
+ return item.id == id;
1571
+ }, this);
1572
+ if (container) container.set('selected', true);
1573
+ }, this);
1574
+ }
1575
+
1576
+ // Pre-select display type
1577
+ if ((this.displayed_gallery.get('display_type'))) {
1578
+ var display_type = this.display_types.find_by_name_or_alias(this.displayed_gallery.get('display_type'));
1579
+ if (display_type) {
1580
+ display_type.set('selected', true);
1581
+ this.displayed_gallery.set('display_type', display_type.get('name'));
1582
+ }
1583
+ }
1584
+ }
1585
+
1586
+ // Bind to the 'selected' event for each of the collections, and update the displayed
1587
+ // gallery object's 'container_ids' attribute when something has changed
1588
+ collections = ['galleries', 'albums', 'tags'];
1589
+ _.each(collections, function(collection){
1590
+ this[collection].on('selected', function(){this.update_selected_containers(collection);}, this);
1591
+ }, this);
1592
+
1593
+ // Bind to the 'selected' event for the display types collection, updating the displayed gallery
1594
+ this.display_types.on('change:selected', function(){
1595
+ this.displayed_gallery.set('display_type', this.display_types.selected_value());
1596
+ }, this);
1597
+
1598
+ // Bind to the 'selected' event for the source, updating the displayed gallery
1599
+ this.sources.on('selected', function() {
1600
+
1601
+ // It is possible for fast acting users to get an invalid shortcode: by changing gallery source and
1602
+ // then rushing to the 'insert gallery' button it's possible for the state to be unchanged when the new
1603
+ // shortcode is written thus 'leaving behind' the old displayed gallery without the newly chosen attr.
1604
+ // This just temporarily disables that button for one second for the internal state to catch up.
1605
+ $('#save_displayed_gallery').prop('disabled', true);
1606
+ setTimeout(function() {
1607
+ $('#save_displayed_gallery').prop('disabled', false);
1608
+ }, 1000);
1609
+
1610
+ this.displayed_gallery.set('source', this.sources.selected_value());
1611
+
1612
+ // If the source changed, and it's not the set to the original value, then
1613
+ // exclusions get's set to []
1614
+ if (this.sources.selected_value() != this.original_displayed_gallery.get('source'))
1615
+ this.displayed_gallery.set('exclusions', this.entities.excluded_ids());
1616
+
1617
+ // Otherwise, we revert to the original exclusions
1618
+ else
1619
+ this.displayed_gallery.set('exclusions', this.original_displayed_gallery.get('exclusions'));
1620
+
1621
+ // special exemption: these should default to a reasonable limit
1622
+ if (this.sources.selected_value() == 'random_images' || this.sources.selected_value() == 'recent_images') {
1623
+ this.displayed_gallery.set('maximum_entity_count', 20);
1624
+ }
1625
+
1626
+ // Reset everything else
1627
+ this.galleries.deselect_all();
1628
+ this.albums.deselect_all();
1629
+ this.tags.deselect_all();
1630
+
1631
+ // If the selected source is incompatible with the current display type, then
1632
+ // display a new list
1633
+ var selected_display_type = this.display_types.selected();
1634
+ var selected_source = this.sources.selected();
1635
+ if (selected_display_type.length > 0 && selected_source.length > 0) {
1636
+ selected_display_type = selected_display_type[0];
1637
+ selected_source = selected_source[0];
1638
+ if (!selected_display_type.is_compatible_with_source(selected_source))
1639
+ this.display_types.deselect_all();
1640
+ if (this.display_type_selector) this.display_type_selector.render();
1641
+ }
1642
+ if (this.preview_area) this.preview_area.render();
1643
+ }, this);
1644
+
1645
+ // Synchronize changes made to entities with the displayed gallery
1646
+ this.entities.on('change:exclude finished_fetching', function(){
1647
+ //this.displayed_gallery.set('sortorder', this.entities.entity_ids());
1648
+ this.displayed_gallery.set('exclusions', this.entities.excluded_ids());
1649
+ }, this);
1650
+
1651
+ // Default to the "galleries" display types when creating new entries
1652
+ if (!this.displayed_gallery.get('source')) {
1653
+ var defaultsource = this.sources.find_by_name_or_alias('galleries');
1654
+ if (defaultsource) {
1655
+ defaultsource.set('selected', true);
1656
+ this.sources.trigger('selected');
1657
+ }
1658
+ }
1659
+
1660
+ // Monitor events in other tabs and respond as appropriate
1661
+ if (window.Frame_Event_Publisher) {
1662
+ var app = this;
1663
+
1664
+ // New gallery event
1665
+ Frame_Event_Publisher.listen_for('attach_to_post:new_gallery', function(){
1666
+ app.galleries.reset();
1667
+ app.galleries.fetch();
1668
+ });
1669
+
1670
+ // A change has been made using the "Manage Galleries" page
1671
+ Frame_Event_Publisher.listen_for('attach_to_post:manage_galleries attach_to_post:manage_images', function(data){
1672
+
1673
+ // Refresh the list of galleries
1674
+ app.galleries.reset();
1675
+ app.galleries.fetch();
1676
+
1677
+ // If we're viewing galleries or images, then we need to refresh the entity list
1678
+ var selected_source = app.sources.selected().pop();
1679
+ if (selected_source) {
1680
+ if (_.indexOf(selected_source.get('returns'), 'image') >= 0 ||
1681
+ _.indexOf(selected_source.get('returns'), 'gallery')) {
1682
+ app.entities.reset();
1683
+ }
1684
+ }
1685
+ });
1686
+
1687
+ // A change has been made using the "Manage Albums" page
1688
+ Frame_Event_Publisher.listen_for('attach_to_post:manage_album', function(data){
1689
+ // Refresh the list of albums
1690
+ app.albums.reset();
1691
+ app.albums.fetch();
1692
+
1693
+ // If we're viewing albums, then we need to refresh the entity list
1694
+ var selected_source = app.sources.selected().pop();
1695
+ if (selected_source) {
1696
+ if (_.indexOf(selected_source.get('returns'), 'album') >= 0) {
1697
+ app.entities.reset();
1698
+ }
1699
+ }
1700
+ });
1701
+
1702
+ // A change has been made using the "Manage Tags" page
1703
+ Frame_Event_Publisher.listen_for('attach_to_post:manage_tags attach_to_post:manage_images', function(data){
1704
+ // Refresh the list of tags
1705
+ app.tags.reset();
1706
+ app.tags.fetch();
1707
+
1708
+ // If we're viewing galleries or images, then we need to refresh the entity list
1709
+ var selected_source = app.sources.selected().pop();
1710
+ if (selected_source) {
1711
+ if (_.indexOf(selected_source.get('returns'), 'image') >= 0 ||
1712
+ _.indexOf(selected_source.get('returns'), 'gallery')) {
1713
+ app.entities.reset();
1714
+ }
1715
+ }
1716
+ });
1717
+
1718
+ // Thumbnail modified event
1719
+ Frame_Event_Publisher.listen_for('attach_to_post:thumbnail_modified', function(data){
1720
+ var selected_source = app.sources.selected().pop();
1721
+ var image_id = data.image[data.image.id_field];
1722
+
1723
+ if (selected_source) {
1724
+
1725
+ // Does the currently selected source return images? If so,
1726
+ // check refresh the modified image's thumbnail
1727
+ if(_.indexOf(selected_source.get('returns'), 'image') >= 0) {
1728
+ var image = app.entities.find(function(item){
1729
+ return parseInt(item.entity_id()) == parseInt(image_id);
1730
+ }, this);
1731
+ if (image) image.set('thumb_url', data.image.thumb_url);
1732
+ }
1733
+
1734
+ // It must be an album or gallery
1735
+ else {
1736
+ var entity = app.entities.find(function(item){
1737
+ return parseInt(item.get('previewpic')) == image_id;
1738
+ }, this);
1739
+ if (entity) entity.trigger('change');
1740
+ }
1741
+ }
1742
+ });
1743
+ }
1744
+ },
1745
+
1746
+ // Updates the selected container_ids for the displayed gallery
1747
+ update_selected_containers: function(collection){
1748
+ this.displayed_gallery.set('container_ids', this[collection].selected_ids());
1749
+ },
1750
+
1751
+ render: function(){
1752
+ this.display_type_selector = new Ngg.DisplayTab.Views.Display_Type_Selector();
1753
+ new Ngg.DisplayTab.Views.Source_Config();
1754
+ new Ngg.DisplayTab.Views.Slug_Config();
1755
+ this.preview_area = new Ngg.DisplayTab.Views.Preview_Area();
1756
+ new Ngg.DisplayTab.Views.SaveButton();
1757
+ }
1758
+ });
1759
+ window.Ngg = Ngg;
1760
+ $(window).trigger('ngg_before_igw_render');
1761
+ Ngg.DisplayTab.instance = new Ngg.DisplayTab.App();
1762
+ Ngg.DisplayTab.instance.render();
1763
+
1764
+ // Invoke styling libraries
1765
+ $('span.tooltip, label.tooltip').tooltip();
1766
+ });
nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/display_tab.min.js ADDED
@@ -0,0 +1 @@
 
1
+ "use strict";jQuery(function(e){var t={Models:{},Views:{}};t.Models.SelectableItems=Backbone.Collection.extend({selected:function(){return this.filter(function(e){return 1==e.get("selected")})},deselect_all:function(){this.each(function(e){e.set("selected",!1)})},selected_ids:function(){return _.pluck(this.selected(),"id")},select:function(e){_.isArray(e)||(e=[e]),this.each(function(t){_.indexOf(e,t.id)>=0&&t.set("selected",!0)}),this.trigger("selected")}}),t.Views.SelectTag=Backbone.View.extend({tagName:"select",collection:null,multiple:!1,value_field:"id",text_field:"title",initialize:function(e){this.options=e||{},_.each(this.options,function(e,t){this[t]=e},this),this.collection.on("add",this.render_new_option,this),this.collection.on("remove",this.remove_existing_option,this),this.collection.on("reset",this.empty_list,this)},events:{change:"selection_changed"},empty_list:function(){this.$el.empty()},render_new_option:function(e){this.$el.append(new this.Option({model:e,value_field:this.value_field,text_field:this.text_field}).render().el)},remove_existing_option:function(e){this.$el.find("option[value='"+e.id+"']").remove()},selection_changed:function(){var t=_.map(this.$el.find(":selected"),function(t){return e(t).val()});this.collection.each(function(e){_.indexOf(t,e.id)>=0||_.indexOf(t,e.id.toString())>=0?e.set("selected",!0):e.set("selected",!1)}),this.collection.trigger("selected"),this.onSelect&&this.onSelect()},render:function(){return this.$el.empty(),this.multiple&&(this.$el.prop("multiple",!0),this.$el.attr("multiple","multiple")),this.collection.each(function(e){var t=new this.Option({model:e,value_field:this.value_field,text_field:this.text_field});this.$el.append(t.render().el)},this),this.width&&this.$el.width(this.width),this},Option:Backbone.View.extend({tagName:"option",model:null,initialize:function(e){this.options=e||{},_.each(this.options,function(e,t){this[t]=e},this),this.model.on("change",this.render,this)},render:function(){var e=this;return this.$el.html(this.model.get(this.text_field).replace(/\\&/g,"&").replace(/\\'/g,"'")),this.$el.prop({value:"id"==this.value_field?this.model.id:this.model.get(this.value_field)}),1==e.model.get("selected")&&this.$el.prop("selected",!0).attr("selected","selected"),this}})}),t.Views.Chosen=Backbone.View.extend({tagName:"span",initialize:function(e){this.options=e||{},this.collection=this.options.collection,this.select_tag=new t.Views.SelectTag(this.options),this.collection.on("change",this.selection_changed,this)},selection_changed:function(e){_.isUndefined(e.changed.selected)&&this.render()},render:function(){return this.$el.append(this.select_tag.render().$el),this.options.width&&this.select_tag.$el.width(this.options.width),this.select2_opts={placeholder:this.options.placeholder},this.select_tag.$el.select2(this.select2_opts),this}}),t.DisplayTab={Models:{},Views:{},App:{}},t.Models.Remote_Collection=t.Models.SelectableItems.extend({fetch_limit:5e3,in_progress:!1,fetch_url:photocrati_ajax.url,action:"",extra_data:{},_create_request:function(e,t){var i={action:this.action,limit:e||this.fetch_limit,offset:t||0,nonce:igw_data.nonce};for(var s in this.extra_data){var l=this.extra_data[s];void 0===i[s]&&(i[s]={}),void 0!==l.toJSON&&(l=l.toJSON()),i[s]=_.extend(i[s],l)}return i},_add_item:function(e){this.push(e)},fetch:function(t,i){var s=this;this.in_progress=!0,e.post(this.fetch_url,this._create_request(t,i),function(e){"undefined"!=typeof _&&(_.isObject(e)||(e=JSON.parse(e)),e.items&&(_.each(e.items,function(e){s._add_item(e)}),e.total>=e.limit+e.offset?s.fetch(e.limit,e.offset+e.limit):(s.in_progress=!1,s.trigger("finished_fetching"))))})}}),t.DisplayTab.Models.Displayed_Gallery=Backbone.Model.extend({defaults:{source:null,container_ids:[],entity_ids:[],display_type:null,display_settings:{},exclusions:[],sortorder:[],slug:null},to_shortcode:function(){retval=null;var e=function(e,t){var i=e[t];if(void 0!==igw_data.shortcode_defaults[t]&&igw_data.shortcode_defaults[t]==i&&(i=null),_.isArray(i)&&(i=i.length>0?i.join(","):null),i)return i=i.toString().replace("[","&#91;"),i=i.toString().replace("]","&#93;"),void 0!==igw_data.shortcode_attr_replacements[t]&&(t=igw_data.shortcode_attr_replacements[t]),t+'="'+i+'"'},i=t.DisplayTab.instance.display_types.find_by_name_or_alias(this.get("display_type")),s=this.toJSON();s.display_type=i.get_shortcode_value();var l="[ngg",n=null;(n=e(s,"source"))&&(l+=" "+n),(n=e(s,"container_ids"))&&(l+=" "+n),(n=e(s,"entity_ids"))&&(l+=" "+n),(n=e(s,"exclusions"))&&(l+=" "+n),(n=e(s,"sortorder"))&&(l+=" "+n);for(var a in s){if(!(["source","container_ids","entity_ids","exclusions","sortorder","__defaults_set","id_field","post_category","ID"].indexOf(a)>-1))if("display_settings"==a)for(var r in s[a])(n=e(s[a],r))&&(l+=" "+n);else(n=e(s,a))&&(l+=" "+n)}return l+="]"}}),t.DisplayTab.Models.Source=Backbone.Model.extend({idAttribute:"name",defaults:{title:"",name:"",selected:!1}}),t.DisplayTab.Models.Source_Collection=t.Models.SelectableItems.extend({model:t.DisplayTab.Models.Source,selected_value:function(){var e=null,t=this.selected();return t.length>0&&(e=t[0].get("name")),e},find_by_name_or_alias:function(e){return this.find(function(t){return t.get("name")==e||_.isArray(t.get("aliases"))&&t.get("aliases").indexOf(e)>-1})}}),t.DisplayTab.Models.Gallery=Backbone.Model.extend({idAttribute:igw_data.gallery_primary_key,defaults:{title:"",name:""}}),t.DisplayTab.Models.Gallery_Collection=t.Models.Remote_Collection.extend({model:t.DisplayTab.Models.Gallery,action:"get_existing_galleries"}),t.DisplayTab.Models.Album=Backbone.Model.extend({defaults:{title:"",name:""}}),t.DisplayTab.Models.Album_Collection=t.Models.Remote_Collection.extend({model:t.DisplayTab.Models.Album,action:"get_existing_albums"}),t.DisplayTab.Models.Tag=Backbone.Model.extend({defaults:{title:""}}),t.DisplayTab.Models.Tag_Collection=t.Models.Remote_Collection.extend({model:t.DisplayTab.Models.Tag,action:"get_existing_image_tags"}),t.DisplayTab.Models.Display_Type=Backbone.Model.extend({idAttribute:"name",defaults:{title:""},is_compatible_with_source:function(e){var t=!0;for(index in e.get("returns")){var i=e.get("returns")[index];if(_.indexOf(this.get("entity_types"),i)<0){t=!1;break}}return t},get_shortcode_value:function(){var e=this.id,t=this.get("aliases");return _.isArray(t)&&t.length>0&&(e=t[0]),e}}),t.DisplayTab.Models.Display_Type_Collection=t.Models.SelectableItems.extend({model:t.DisplayTab.Models.Display_Type,selected_value:function(){var e=this.selected();return e.length>0?e[0].get("name"):null},find_by_name_or_alias:function(e){return this.find(function(t){return t.get("name")==e||_.isArray(t.get("aliases"))&&t.get("aliases").indexOf(e)>-1})}}),t.DisplayTab.Models.Entity=Backbone.Model.extend({entity_id:function(){return this.get(this.get("id_field"))},is_excluded:function(){return current_value=this.get("exclude"),!_.isUndefined(current_value)&&(_.isBoolean(current_value)?current_value:0!=parseInt(current_value))},is_included:function(){return!this.is_excluded()},is_gallery:function(){return retval=!1,1==this.get("is_gallery")&&(retval=!0),retval},is_album:function(){return retval=!1,1==this.get("is_album")&&(retval=!0),retval},is_image:function(){return!this.is_album()&&!this.is_gallery()},alttext:function(){return this.is_image()?this.get("alttext"):this.is_gallery()?this.get("title"):this.is_album()?this.get("name"):void 0}}),t.DisplayTab.Models.Entity_Collection=t.Models.Remote_Collection.extend({model:t.DisplayTab.Models.Entity,action:"get_displayed_gallery_entities",_add_item:function(e){e.exclude=1==parseInt(e.exclude),e.is_gallery=1==parseInt(e.is_gallery),e.is_album=1==parseInt(e.is_album),this.push(e)},entity_ids:function(){return this.map(function(e){return e.entity_id()})},included_ids:function(){return _.compact(this.map(function(e){if(e.is_included())return e.entity_id()}))},excluded_ids:function(){return _.compact(this.map(function(e){if(!e.is_included())return e.entity_id()}))}}),t.DisplayTab.Models.SortOrder=Backbone.Model.extend({}),t.DisplayTab.Models.SortOrder_Options=t.Models.SelectableItems.extend({model:t.DisplayTab.Models.SortOrder}),t.DisplayTab.Models.SortDirection=Backbone.Model.extend({}),t.DisplayTab.Models.SortDirection_Options=Backbone.Collection.extend({model:t.DisplayTab.Models.SortDirection}),t.DisplayTab.Models.Slug=Backbone.Model.extend({}),t.DisplayTab.Views.Source_Config=Backbone.View.extend({el:"#source_configuration",selected_view:null,initialize:function(){this.sources=t.DisplayTab.instance.sources,this.sources.on("selected",this.render,this),_.bindAll(this,"render"),this.render()},render:function(){var i=new t.Views.Chosen({id:"source_select",collection:this.sources,placeholder:"Select a source",width:500,onSelect:function(){e(".main_menu_tab").off("scroll")}}),s=_.template('<tr><td id="source_column"></td><td><label><%- sources %></label></td></tr>');this.$el.html(s(igw_data.i18n)),this.$el.find("#source_column").append(i.render().el);var l=this.sources.selected();if(l.length){var n=function(e){return e=String(e),e.charAt(0).toUpperCase()+e.slice(1)}(l.pop().id)+"Source";if(void 0!==t.DisplayTab.Views[n]){var a=new t.DisplayTab.Views[n];this.$el.append(a.render().el)}}return this}}),t.DisplayTab.Views.Slug_Config=Backbone.View.extend({el:"#slug_configuration",selected_view:null,initialize:function(){this.displayed_gallery=t.DisplayTab.instance.displayed_gallery,this.slug=t.DisplayTab.instance.displayed_gallery.get("slug"),this.render()},render:function(){var t=this,i=e("<input>").prop({type:"text",name:"slug",value:this.slug,placeholder:igw_data.i18n.optional,id:"field_slug"});i.on("input",function(){e(this).val(e(this).val().replace(/\s|\?|\\|\/|&|=|\[|]|#/gm,"-")),t.displayed_gallery.set("slug",e(this).val())}),i.on("change",function(){e(this).val(e(this).val().replace(/^-*/gm,"").replace(/-*$/gm,"")),t.displayed_gallery.set("slug",e(this).val())});var s=_.template('<tr><td id="slug_label"><label for="field_slug" class="tooltip" title="<%- slug_tooltip %><"><<%- slug_label %></label></td><td id="slug_column"></td></tr>');return this.$el.append(s(igw_data.i18n)),this.$el.find("#slug_column").append(i),this}}),t.DisplayTab.Views.Display_Type_Selector=Backbone.View.extend({el:"#display_type_selector",initialize:function(){this.display_types=t.DisplayTab.instance.display_types,this.display_type_order_base=t.DisplayTab.instance.display_type_order_base,this.display_type_order_step=t.DisplayTab.instance.display_type_order_step,this.sources=t.DisplayTab.instance.sources,this.render()},selection_changed:function(t){var i=null;this.display_types.each(function(e){e.get("name")==t?(i=e,e.set("selected",!0)):e.set("selected",!1)}),e(".display_settings_form").each(function(){$this=e(this),$this.attr("rel")==t?$this.removeClass("hidden"):$this.addClass("hidden")})},render:function(){var i=this.sources.selected(),s=0;i=i.length>0&&i[0],this.$el.empty();var l=this.display_type_order_base,n=this.display_type_order_step;return this.display_types.each(function(a){if(i&&!a.is_compatible_with_source(i)){var r=e("#display_type_tab_content:visible");if(0==r.length)return;if("hidden"==r.css("visibility"))return}var o=new t.DisplayTab.Views.DisplayType;o.model=a,o.on("selected",this.selection_changed,this),this.display_types.selected_value()||(a.set("selected",!0),this.selection_changed(a.id));var d=a.get("view_order");d||(d=l);var c=Math.floor(d/n);s=c,this.$el.append(o.render().el)},this),this.$el.append('<li class="clear" style="height: 10px; list-style-type:none" />'),this}}),t.DisplayTab.Views.DisplayType=Backbone.View.extend({className:"display_type_preview",events:{click:"clicked"},clicked:function(e){this.trigger("selected",this.model.get("name"))},render:function(){var t=e('<label style="display: block; cursor: pointer;"/>').addClass("image_container"),i=e("<img/>").attr({src:this.model.get("preview_image_url"),title:this.model.get("title"),alt:this.model.get("alt")}),s=e("<div/>"),l=e("<input/>").prop({type:"radio",value:this.model.get("name"),title:this.model.get("title"),name:"display_type",checked:this.model.get("selected")}),n=e("<br>");return t.append(s),t.append(i),t.append("<br>"),t.append(this.model.get("title").replace(/nextgen /gi,"")),s.append(l),s.append(n),this.$el.append(t),this}}),t.DisplayTab.Views.Preview_Area=Backbone.View.extend({el:"#preview_area",initialize:function(){this.entities=t.DisplayTab.instance.entities,this.sources=t.DisplayTab.instance.sources,this.displayed_gallery=t.DisplayTab.instance.displayed_gallery,this.entity_list=e("<ul/>").attr("id","entity_list").append('<li class="clear"/>'),this.entities.on("add",this.render_entity,this),this.entities.on("remove",this.remove_entity,this),this.entities.on("reset",this.entities_reset,this),this.entities.on("change:sortorder",function(e){this.entities.remove(e,{silent:!0}),this.entities.add(e,{at:e.changed.sortorder,silent:!0}),this.displayed_gallery.set("sortorder",this.entities.entity_ids()),"undefined"!=typeof console&&void 0!==console.log&&console.log(this.entities.entity_ids()),this.displayed_gallery.set("order_by","sortorder")},this),this.sources.on("selected",this.render,this),this.render()},events:{opened:"entities_reset"},entities_reset:function(e){this.entities.reset(null,{silent:!0}),this.entity_list.empty().append('<li class="clear"/>'),this.entities.in_progress||this.entities.fetch()},render_entity:function(e){var t=new this.EntityElement({model:e});this.entity_list.find(".clear").before(t.render().$el),t.$el.css("visibility","hidden"),setTimeout(function(){t.$el.css("visibility","visible")},0),1==this.$el.find(".no_entities").length?this.render():this.entities.length>1&&this.entity_list.sortable("refresh")},remove_entity:function(e){var t=this.id=e.get("id_field")+"_"+e.entity_id();this.entity_list.find("#"+t).remove();this.entity_list.sortable("refresh"),0==this.entities.length&&this.render_no_images_notice()},render_no_images_notice:function(){this.$el.empty(),this.$el.append("<p class='no_entities'>"+igw_data.i18n.no_entities+"</p>")},render:function(){return this.$el.empty(),this.entities.length>0&&this.displayed_gallery.get("container_ids").length>0?(this.$el.append(new this.RefreshButton({entities:this.entities}).render().el),this.$el.append(new this.SortButtons({entities:this.entities,displayed_gallery:this.displayed_gallery,sources:this.sources}).render().el),this.$el.append(new this.ExcludeButtons({entities:this.entities}).render().el),this.$el.append(this.entity_list),this.entity_list.sortable({placeholder:"placeholder",forcePlaceholderSize:!0,containment:"parent",opacity:.7,revert:!0,dropOnEmpty:!0,start:function(e,t){return t.placeholder.css({height:t.item.height()}),!0},stop:function(e,t){t.item.trigger("drop",t.item.index())}}),this.entity_list.disableSelection()):this.render_no_images_notice(),this},RefreshButton:Backbone.View.extend({className:"refresh_button button-primary",tagName:"input",label:"Refresh",events:{click:"clicked"},clicked:function(){this.entities.reset()},initialize:function(e){this.options=e||{},_.each(this.options,function(e,t){this[t]=e},this)},render:function(){return this.$el.attr({value:this.label,type:"button"}),this}}),ExcludeButtons:Backbone.View.extend({className:"header_row",initialize:function(e){this.options=e||{},_.each(this.options,function(e,t){this[t]=e},this)},render:function(){this.$el.empty(),this.$el.append('<span style="margin-right: 8px;">Exclude:</span>');var e=new this.Button({value:!0,text:"All",entities:this.entities});this.$el.append(e.render().el),this.$el.append('<span class="separator">|</span>');var t=new this.Button({value:!1,text:"None",entities:this.entities});return this.$el.append(t.render().el),this},Button:Backbone.View.extend({tagName:"a",value:1,text:"",events:{click:"clicked"},initialize:function(e){this.options=e||{},_.each(this.options,function(e,t){this[t]=e},this)},clicked:function(e){e.preventDefault(),this.entities.each(function(e){e.set("exclude",this.value)},this)},render:function(){return this.$el.text(this.text).attr("href","#"),this}})}),SortButtons:Backbone.View.extend({className:"header_row",initialize:function(e){this.options=e||{},_.each(this.options,function(e,t){this[t]=e},this),this.sortorder_options=new t.DisplayTab.Models.SortOrder_Options,this.sortorder_options.on("change:selected",this.sortoption_changed,this),this.sortdirection_options=new t.DisplayTab.Models.SortDirection_Options([{value:"ASC",title:"Ascending",selected:"ASC"==this.displayed_gallery.get("order_direction")},{value:"DESC",title:"Descending",selected:"DESC"==this.displayed_gallery.get("order_direction")}]),this.sortdirection_options.on("change:selected",this.sortdirection_changed,this),this.displayed_gallery.on("change:order_by",this.displayed_gallery_order_changed,this),this.displayed_gallery.on("change.order_direction",this.displayed_gallery_order_dir_changed,this)},populate_sorting_fields:function(){var e=this.sources.selected().pop().get("returns");-1!==_.indexOf(e,"image")?this.fill_image_sortorder_options():this.fill_gallery_sortorder_options()},create_sortorder_option:function(e,i){return new t.DisplayTab.Models.SortOrder({name:e,title:i,value:e,selected:this.displayed_gallery.get("order_by")==e})},fill_image_sortorder_options:function(){this.sortorder_options.reset(),this.sortorder_options.push(this.create_sortorder_option("","None")),this.sortorder_options.push(this.create_sortorder_option("sortorder","Custom")),this.sortorder_options.push(this.create_sortorder_option(t.DisplayTab.instance.image_key,"Image ID")),this.sortorder_options.push(this.create_sortorder_option("filename","Filename")),this.sortorder_options.push(this.create_sortorder_option("alttext","Alt/Title Text")),this.sortorder_options.push(this.create_sortorder_option("imagedate","Date/Time"))},fill_gallery_sortorder_options:function(){this.sortorder_options.reset(),this.sortorder_options.push(this.create_sortorder_option("","None")),this.sortorder_options.push(this.create_sortorder_option("sortorder","Custom")),this.sortorder_options.push(this.create_sortorder_option("name","Name")),this.sortorder_options.push(this.create_sortorder_option("galdesc","Description"))},displayed_gallery_order_changed:function(e){this.sortorder_options.findWhere({value:e.get("order_by")}).set("selected",!0)},displayed_gallery_order_dir_changed:function(e){this.sortdirection_options.findWhere({value:e.get("order_direction")}).set("selected",!0)},sortoption_changed:function(t){this.sortorder_options.each(function(e){e.set("selected",t.get("value")==e.get("value"),{silent:!0})}),this.displayed_gallery.set("sortorder",[]);var i=t.get("value");0==t.get("value").length&&(i="sortorder"),this.displayed_gallery.set("order_by",i),this.entities.reset(),this.$el.find("a.sortorder").each(function(){var i=e(this);i.attr("value")==t.get("value")?i.addClass("selected"):i.removeClass("selected")})},sortdirection_changed:function(t){this.sortdirection_options.each(function(e){e.set("selected",t.get("value")==e.get("value"),{silent:!0})}),this.displayed_gallery.set("order_direction",t.get("value")),this.entities.reset(),this.$el.find("a.sortdirection").each(function(){var i=e(this);i.attr("value")==t.get("value")?i.addClass("selected"):i.removeClass("selected")})},render:function(){return this.$el.empty(),this.populate_sorting_fields(),this.$el.append('<span style="margin-right: 8px;">Sort By:</span>'),this.sortorder_options.each(function(e,t){var i=new this.Button({model:e,className:"sortorder"});this.$el.append(i.render().el),this.sortorder_options.length-1>t&&this.$el.append('<span class="separator">|</span>')},this),this.$el.append('<span style="margin: 0 8px 0 40px;">Order By:</span>'),this.sortdirection_options.each(function(e,t){var i=new this.Button({model:e,className:"sortdirection"});this.$el.append(i.render().el),this.sortdirection_options.length-1>t&&this.$el.append('<span class="separator">|</span>')},this),this},Button:Backbone.View.extend({tagName:"a",initialize:function(e){this.options=e||{},_.each(this.options,function(e,t){this[t]=e},this)},events:{click:"clicked"},clicked:function(e){e.preventDefault(),this.model.set("selected",!0)},render:function(){return this.$el.prop({value:this.model.get("value"),href:"#"}),this.$el.text(this.model.get("title")),this.model.get("selected")&&this.$el.addClass("selected"),this}})}),EntityElement:Backbone.View.extend({tagName:"li",events:{drop:"item_dropped"},initialize:function(e){this.options=e||{},_.each(this.options,function(e,t){this[t]=e},this),this.initTime=(new Date).getTime(),this.model.on("change",this.render,this),0==this.model.get("sortorder")&&this.model.set("sortorder",-1,{silent:!0}),this.id=this.model.get("id_field")+"_"+this.model.entity_id()},item_dropped:function(e,i){t.DisplayTab.instance.displayed_gallery.set("order_by","sortorder"),this.model.set("sortorder",i)},render:function(){this.$el.empty();var t=e("<div/>").addClass("preview_item"),i=e("<div/>").addClass("image_container"),s=this.model.alttext().replace(/\\&/g,"&").replace(/\\'/g,"'"),l=this.initTime;i.attr({title:s,style:"background-image: url('"+this.model.get("thumb_url")+"?timestamp"+l+"')"}),this.$el.append(t).addClass("ui-state-default"),t.append(i);var n=e("<div/>").addClass("exclude_container"),a=e("<label/>");a.append(igw_data.i18n.exclude_question);var r=new this.ExcludeCheckbox({model:this.model});return a.append(r.render().el),n.append(a),t.append(n),this},ExcludeCheckbox:Backbone.View.extend({tagName:"input",events:{change:"entity_excluded"},type_set:!1,entity_excluded:function(e){this.model.set("exclude",e.target.checked)},initialize:function(e){this.options=e||{},_.each(this.options,function(e,t){this[t]=e},this),this.model.on("change:exclude",this.render,this)},render:function(){return this.type_set||(this.$el.attr("type","checkbox"),this.type_set=!0),this.model.is_excluded()?this.$el.prop("checked",!0):this.$el.prop("checked",!1),this}})})}),t.DisplayTab.Views.GalleriesSource=Backbone.View.extend({tagName:"tbody",initialize:function(){this.galleries=t.DisplayTab.instance.galleries},render:function(){var i=new t.Views.Chosen({collection:this.galleries,placeholder:igw_data.i18n.select_gallery,multiple:!0,width:500}),s=e('<tr><td class="galleries_column"></td><td><label>'+igw_data.i18n.galleries+"</label></td></tr>");return this.$el.empty(),this.$el.append(s),this.$el.find(".galleries_column").append(i.render().el),this}}),t.DisplayTab.Views.AlbumsSource=Backbone.View.extend({tagName:"tbody",initialize:function(){this.albums=t.DisplayTab.instance.albums},render:function(){var e=new t.Views.Chosen({collection:this.albums,multiple:!0,placeholder:"Select an album",text_field:"name",width:500});return this.$el.empty(),this.$el.append('<tr><td class="albums_column"></td><td><label>'+igw_data.i18n.albums+"</label></td></tr>"),this.$el.find(".albums_column").append(e.render().el),this}}),t.DisplayTab.Views.TagsSource=Backbone.View.extend({tagName:"tbody",initialize:function(){this.tags=t.DisplayTab.instance.tags},render:function(){var e=new t.Views.Chosen({collection:this.tags,multiple:!0,placeholder:"Select a tag",text_field:"name",width:500});return this.$el.empty(),this.$el.append('<tr><td class="tags_column"></td><td><label>Tags</label></td></tr>'),this.$el.find(".tags_column").append(e.render().el),this}}),t.DisplayTab.Views.Recent_imagesSource=Backbone.View.extend({tagName:"tbody",initialize:function(){this.displayed_gallery=t.DisplayTab.instance.displayed_gallery,this.maximum_entity_count=t.DisplayTab.instance.displayed_gallery.get("maximum_entity_count"),this.displayed_gallery.set("container_ids",[])},render:function(){var t=this,i=e("<input/>").prop({type:"text",value:this.maximum_entity_count,name:"maximum_entity_count"});return i.on("change",function(){t.displayed_gallery.set("maximum_entity_count",e(this).val())}),this.$el.empty(),this.$el.append('<tr><td class="recent_images_column"></td><td><label># of Images To Display</label></td></tr>'),this.$el.find(".recent_images_column").append(i),this}}),t.DisplayTab.Views.Random_imagesSource=Backbone.View.extend({tagName:"tbody",initialize:function(){this.displayed_gallery=t.DisplayTab.instance.displayed_gallery,this.maximum_entity_count=t.DisplayTab.instance.displayed_gallery.get("maximum_entity_count"),this.displayed_gallery.set("container_ids",[])},render:function(){var t=this,i=e("<input/>").prop({type:"text",value:this.maximum_entity_count,name:"maximum_entity_count"});return i.on("change",function(){t.displayed_gallery.set("maximum_entity_count",e(this).val())}),this.$el.empty(),this.$el.append('<tr><td class="random_images_column"></td><td><label># of Images To Display</label></td></tr>'),this.$el.find(".random_images_column").append(i),this}}),t.DisplayTab.Views.SaveButton=Backbone.View.extend({el:"#save_displayed_gallery",errors_el:"#errors",displayed_gallery:null,events:{click:"clicked"},initialize:function(){this.displayed_gallery=t.DisplayTab.instance.displayed_gallery,this.entities=t.DisplayTab.instance.entities,this.render()},clicked:function(){this.set_display_settings();var e=this.displayed_gallery.to_shortcode();insert_into_editor(e,this.displayed_gallery.id?this.displayed_gallery.id:igw_data.shortcode_ref);var t=null;(t=location.toString().match(/editor=([^\&]+)/))&&t.length>=2&&top.tinyMCE.editors[t[1]].fire("ngg-inserted",{shortcode:e}),close_attach_to_post_window()},set_display_settings:function(){var t=this.displayed_gallery.get("display_type");if(t){var i=e("form[rel='"+t+"']"),s=i.data("defaults"),l=function(t){var i={};return e.each(t.serializeArray(),function(e,t){for(var l=t.name.split("["),n=i,a=0;a<l.length;a++){var r=l[a].replace(/\]$/,"");if(s[r]==t.value)return!0;n[r]||(a==l.length-1?n[r]=t.value:n[r]={}),n=n[r]}}),i}(i);this.displayed_gallery.set("display_settings",l[t])}},render:function(){return this.$el.css("z-index",1e3),this}}),t.DisplayTab.App=Backbone.View.extend({initialize:function(){if(this.displayed_gallery=new t.DisplayTab.Models.Displayed_Gallery(igw_data.displayed_gallery),this.original_displayed_gallery=new t.DisplayTab.Models.Displayed_Gallery(igw_data.displayed_gallery),this.galleries=new t.DisplayTab.Models.Gallery_Collection(igw_data.galleries),this.albums=new t.DisplayTab.Models.Album_Collection(igw_data.albums),this.tags=new t.DisplayTab.Models.Tag_Collection(igw_data.tags),this.sources=new t.DisplayTab.Models.Source_Collection(igw_data.sources),this.display_types=new t.DisplayTab.Models.Display_Type_Collection(igw_data.display_types),this.display_type_order_base=igw_data.display_type_priority_base,this.display_type_order_step=igw_data.display_type_priority_step,this.entities=new t.DisplayTab.Models.Entity_Collection,this.entities.extra_data.displayed_gallery=this.displayed_gallery,this.image_key=igw_data.image_primary_key,this.displayed_gallery.get("source")){if(this.displayed_gallery.get("source")){var i=this.sources.find_by_name_or_alias(this.displayed_gallery.get("source"));i&&i.set("selected",!0)}if(this.displayed_gallery.get("container_ids")&&_.each(this.displayed_gallery.get("container_ids"),function(e){var t=this[this.displayed_gallery.get("source")].find(function(t){return t.id==e},this);t&&t.set("selected",!0)},this),this.displayed_gallery.get("display_type")){var s=this.display_types.find_by_name_or_alias(this.displayed_gallery.get("display_type"));s&&(s.set("selected",!0),this.displayed_gallery.set("display_type",s.get("name")))}}if(collections=["galleries","albums","tags"],_.each(collections,function(e){this[e].on("selected",function(){this.update_selected_containers(e)},this)},this),this.display_types.on("change:selected",function(){this.displayed_gallery.set("display_type",this.display_types.selected_value())},this),this.sources.on("selected",function(){e("#save_displayed_gallery").prop("disabled",!0),setTimeout(function(){e("#save_displayed_gallery").prop("disabled",!1)},1e3),this.displayed_gallery.set("source",this.sources.selected_value()),this.sources.selected_value()!=this.original_displayed_gallery.get("source")?this.displayed_gallery.set("exclusions",this.entities.excluded_ids()):this.displayed_gallery.set("exclusions",this.original_displayed_gallery.get("exclusions")),"random_images"!=this.sources.selected_value()&&"recent_images"!=this.sources.selected_value()||this.displayed_gallery.set("maximum_entity_count",20),this.galleries.deselect_all(),this.albums.deselect_all(),this.tags.deselect_all();var t=this.display_types.selected(),i=this.sources.selected();t.length>0&&i.length>0&&(t=t[0],i=i[0],t.is_compatible_with_source(i)||this.display_types.deselect_all(),this.display_type_selector&&this.display_type_selector.render()),this.preview_area&&this.preview_area.render()},this),this.entities.on("change:exclude finished_fetching",function(){this.displayed_gallery.set("exclusions",this.entities.excluded_ids())},this),!this.displayed_gallery.get("source")){var l=this.sources.find_by_name_or_alias("galleries");l&&(l.set("selected",!0),this.sources.trigger("selected"))}if(window.Frame_Event_Publisher){var n=this;Frame_Event_Publisher.listen_for("attach_to_post:new_gallery",function(){n.galleries.reset(),n.galleries.fetch()}),Frame_Event_Publisher.listen_for("attach_to_post:manage_galleries attach_to_post:manage_images",function(e){n.galleries.reset(),n.galleries.fetch();var t=n.sources.selected().pop();t&&(_.indexOf(t.get("returns"),"image")>=0||_.indexOf(t.get("returns"),"gallery"))&&n.entities.reset()}),Frame_Event_Publisher.listen_for("attach_to_post:manage_album",function(e){n.albums.reset(),n.albums.fetch();var t=n.sources.selected().pop();t&&_.indexOf(t.get("returns"),"album")>=0&&n.entities.reset()}),Frame_Event_Publisher.listen_for("attach_to_post:manage_tags attach_to_post:manage_images",function(e){n.tags.reset(),n.tags.fetch();var t=n.sources.selected().pop();t&&(_.indexOf(t.get("returns"),"image")>=0||_.indexOf(t.get("returns"),"gallery"))&&n.entities.reset()}),Frame_Event_Publisher.listen_for("attach_to_post:thumbnail_modified",function(e){var t=n.sources.selected().pop(),i=e.image[e.image.id_field];if(t)if(_.indexOf(t.get("returns"),"image")>=0){var s=n.entities.find(function(e){return parseInt(e.entity_id())==parseInt(i)},this);s&&s.set("thumb_url",e.image.thumb_url)}else{var l=n.entities.find(function(e){return parseInt(e.get("previewpic"))==i},this);l&&l.trigger("change")}})}},update_selected_containers:function(e){this.displayed_gallery.set("container_ids",this[e].selected_ids())},render:function(){this.display_type_selector=new t.DisplayTab.Views.Display_Type_Selector,new t.DisplayTab.Views.Source_Config,new t.DisplayTab.Views.Slug_Config,this.preview_area=new t.DisplayTab.Views.Preview_Area,new t.DisplayTab.Views.SaveButton}}),window.Ngg=t,e(window).trigger("ngg_before_igw_render"),t.DisplayTab.instance=new t.DisplayTab.App,t.DisplayTab.instance.render(),e("span.tooltip, label.tooltip").tooltip()});
nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/iframely.css ADDED
@@ -0,0 +1,209 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* keep the ATP background white */
2
+ html#iframely {
3
+ background: white !important;
4
+ }
5
+
6
+ #iframely, #iframely body {
7
+ background: white !important;
8
+ padding: 0px;
9
+ width: 100%;
10
+ height: 100%;
11
+ }
12
+
13
+ #iframely {
14
+ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
15
+ filter: alpha(opacity=0);
16
+ opacity: 0.0;
17
+ background-position: center center;
18
+ background-repeat: no-repeat;
19
+ position: absolute;
20
+ visibility: hidden;
21
+ }
22
+
23
+ #iframely #wpbody-content {
24
+ float: none;
25
+ padding: 0px;
26
+ }
27
+
28
+ #iframely #ngg_page_content.ngg_settings_page {
29
+ background: #fff;
30
+ }
31
+
32
+ #iframely h2,
33
+ #iframely #icon-nextgen-gallery {
34
+ display: none;
35
+ }
36
+
37
+ #iframely #wpwrap {
38
+ background-color: #fcfcfc;
39
+ }
40
+
41
+ #iframely #ngg_page_content {
42
+ margin: 0;
43
+ width: 100%;
44
+ }
45
+
46
+ #iframely #ngg_page_content,
47
+ #iframely #ngg_page_content .ngg_manage_galleries table th,
48
+ #iframely #ngg_page_content .ngg_manage_galleries table td {
49
+ font-size: 13px !important;
50
+ }
51
+
52
+ #iframely .ngg-admin .notice,
53
+ #iframely .ngg-admin div.error,
54
+ #iframely .ngg-admin div.updated {
55
+ display: none;
56
+ }
57
+
58
+ #iframely #ngg_page_content .ngg_page_content_header {
59
+ margin: 25px 0 -30px;
60
+ padding-left: 30px;
61
+ }
62
+
63
+ #iframely #ngg_page_content .ngg_page_content_header img,
64
+ #iframely #ngg_page_content .ngg_page_content_header p {
65
+ display: none;
66
+ }
67
+
68
+ #iframely #ngg_page_content .ngg_page_content_menu {
69
+ background: transparent;
70
+ border: none;
71
+ padding: 10px 20px 10px 23px;
72
+ float: none;
73
+ height: 25px;
74
+ margin-top: 16px;
75
+ width: auto;
76
+ }
77
+
78
+ #iframely #ngg_page_content .ngg_page_content_menu a {
79
+ border: none;
80
+ color: black;
81
+ display: inline;
82
+ font-size: 14px;
83
+ font-weight: 300;
84
+ text-decoration: none;
85
+ line-height: 25px;
86
+ padding: 6px;
87
+ font-size: 12px;
88
+ margin-right: 10px;
89
+ }
90
+
91
+ #iframely #ngg_page_content .ngg_page_content_menu a:active {
92
+ background: transparent;
93
+ }
94
+
95
+ #iframely #ngg_page_content .ngg_page_content_menu .ngg_page_content_menu_active {
96
+ font-weight: 500;
97
+ border-bottom: 3px solid #9ebc1b;
98
+
99
+ }
100
+
101
+ #iframely #ngg_page_content .ngg_page_content_menu a:before {
102
+ display: none;
103
+ }
104
+
105
+ #displayed_tab #ngg_page_content .ngg_page_content_menu .ngg_page_content_menu_active:after,
106
+ #displayed_tab #ngg_page_content .ngg_page_content_menu a:active:after {
107
+ display: none !important;
108
+ }
109
+
110
+ #iframely #ngg_page_content .ngg_page_content_main {
111
+ padding: 30px;
112
+ width: 100%;
113
+ box-shadow: none;
114
+ }
115
+
116
+ #iframely #ngg_page_content .ngg_page_content_main h3 {
117
+ display: none;
118
+ }
119
+
120
+ #iframely #ngg_page_content .ngg_manage_tags .ngg_page_content_main h3,
121
+ #iframely #ngg_page_content .ngg_manage_images .ngg_page_content_main h3,
122
+ #iframely #ngg_page_content .ngg_manage_albums .ngg_page_content_main h3 {
123
+ display: block;
124
+ }
125
+
126
+ #iframely #ngg_page_content button:active,
127
+ #iframely #ngg_page_content .button-primary:active,
128
+ #iframely #ngg_page_content .button-secondary:active {
129
+ vertical-align: top;
130
+ }
131
+
132
+ #iframely #bulkaction {
133
+ width: 140px !important;
134
+ }
135
+
136
+ #iframely .tablenav.top .displaying-num {
137
+ display: none;
138
+ }
139
+
140
+ #iframely .ngg_manage_galleries table #id {
141
+ min-width: 40px;
142
+ }
143
+
144
+ #iframely .ngg_manage_galleries table #author {
145
+ min-width: 85px;
146
+ }
147
+
148
+ #iframely .ngg_manage_galleries table #page_id {
149
+ min-width: 65px;
150
+ }
151
+ #iframely .gallery_page_nggallery-manage-gallery .ui-dialog {
152
+ height: auto !important;
153
+ min-height: auto;
154
+ }
155
+
156
+ /* Media Queries */
157
+
158
+
159
+ @media (max-width: 1140px) {
160
+ #iframely .gallery_page_ngg_addgallery #ngg_page_content button,
161
+ #iframely .gallery_page_ngg_addgallery #ngg_page_content .button-primary,
162
+ #iframely .gallery_page_ngg_addgallery #ngg_page_content .button-secondary {
163
+ width: 130px !important;
164
+ }
165
+ }
166
+
167
+ @media (max-width: 940px) {
168
+ #iframely .gallery_page_ngg_addgallery #ngg_page_content button,
169
+ #iframely .gallery_page_ngg_addgallery #ngg_page_content .button-primary,
170
+ #iframely .gallery_page_ngg_addgallery #ngg_page_content .button-secondary {
171
+ width: 201px !important;
172
+ }
173
+ }
174
+
175
+ @media (max-width: 800px) {
176
+ #iframely .ngg-admin #wpbody {
177
+ padding: 0;
178
+ }
179
+ #iframely #ngg_page_content .ngg_page_content_menu {
180
+ padding: 5px 0 0;
181
+ background: transparent;
182
+ border: none;
183
+ }
184
+ #iframely #ngg_page_content .ngg_page_content_menu a {
185
+ display: block;
186
+ width: 100%;
187
+ float: left;
188
+ padding: 0;
189
+ text-align: center;
190
+ box-sizing: border-box;
191
+ }
192
+ #iframely #ngg_page_content .ngg_page_content_menu .ngg_page_content_menu_active,
193
+ #iframely #ngg_page_content .ngg_page_content_menu a:active {
194
+ background: transparent;
195
+ }
196
+ #iframely #ngg_page_content .ngg_page_content_menu .ngg_page_content_menu_active:after {
197
+ display:none;
198
+ }
199
+ #iframely #ngg_page_content .ngg_page_content_menu a:last-of-type {
200
+ padding-bottom: 5px;
201
+ }
202
+ #iframely .gallery_page_ngg_addgallery #ngg_page_content button,
203
+ #iframely .gallery_page_ngg_addgallery #ngg_page_content .button-primary,
204
+ #iframely .gallery_page_ngg_addgallery #ngg_page_content .button-secondary {
205
+ width: 100% !important;
206
+ margin: 4px 0;
207
+ display: block;
208
+ }
209
+ }
nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/iframely.js ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ if (window.frameElement) {
2
+ document.getElementsByTagName('html')[0].id = 'iframely';
3
+ jQuery(function($) {
4
+ var $content = $('#ngg_page_content');
5
+ $('#wpbody-content').html($content);
6
+ $('#wpbody').html($content);
7
+ $('#wpwrap').html($content);
8
+ // $('#wpwrap').html($('#wpbody').html($('#wpbody-content').html($('#ngg_page_content'))));
9
+
10
+
11
+ // We need to ensure that any POST operation includes the "attach_to_post"
12
+ // parameter, to display subsequent clicks in iframely.
13
+ $('form').each(function() {
14
+ $(this).append("<input type='hidden' name='attach_to_post' value='1'/>");
15
+ });
16
+
17
+ var parent = window.parent;
18
+
19
+ if (parent == null || typeof(parent.adjust_height_for_frame) === "undefined") {
20
+ if (window != null && typeof(window.adjust_height_for_frame) !== "undefined") {
21
+ parent = window;
22
+ }
23
+ }
24
+
25
+ // Adjust the height of the frame
26
+ if (typeof(parent.adjust_height_for_frame) !== "undefined") {
27
+ parent.adjust_height_for_frame(parent, window, iframely_callback);
28
+ }
29
+
30
+ });
31
+ }
32
+
33
+ function iframely_callback(parent_window, current_window)
34
+ {
35
+ var $current_window = jQuery(current_window);
36
+
37
+ if (typeof($current_window.data('iframely')) === 'undefined') {
38
+ $current_window.data('iframely', { attempts: 1 });
39
+ }
40
+
41
+ var iframely = $current_window.data('iframely');
42
+
43
+ // After we've attempted to resize the frame 3 times, give up
44
+ if (iframely.attempts == 3) {
45
+ jQuery('#iframely').css({
46
+ position: 'static',
47
+ visibility: 'visible'
48
+ }).animate({ opacity: 1.0 });
49
+ } else {
50
+ iframely.attempts += 1;
51
+ setTimeout(function() {
52
+ parent_window.adjust_height_for_frame(parent_window, current_window, iframely_callback);
53
+ }, 400);
54
+ }
55
+ }
nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/iframely.min.css ADDED
@@ -0,0 +1 @@
 
1
+ #iframely,#iframely body,html#iframely{background:#fff!important}#iframely #icon-nextgen-gallery,#iframely #ngg_page_content .ngg_page_content_header img,#iframely #ngg_page_content .ngg_page_content_header p,#iframely .ngg-admin .notice,#iframely .ngg-admin div.error,#iframely .ngg-admin div.updated,#iframely h2{display:none}#iframely,#iframely body{padding:0;width:100%;height:100%}#iframely{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";filter:alpha(opacity=0);opacity:0;background-position:center center;background-repeat:no-repeat;position:absolute;visibility:hidden}#iframely #wpbody-content{float:none;padding:0}#iframely #ngg_page_content.ngg_settings_page{background:#fff}#iframely #wpwrap{background-color:#fcfcfc}#iframely #ngg_page_content{margin:0;width:100%}#iframely #ngg_page_content,#iframely #ngg_page_content .ngg_manage_galleries table td,#iframely #ngg_page_content .ngg_manage_galleries table th{font-size:13px!important}#iframely #ngg_page_content .ngg_page_content_header{margin:25px 0 -30px;padding-left:30px}#iframely #ngg_page_content .ngg_page_content_menu{background:0 0;border:none;padding:10px 20px 10px 23px;float:none;height:25px;margin-top:16px;width:auto}#iframely #ngg_page_content .ngg_page_content_menu a{border:none;color:#000;display:inline;font-weight:300;text-decoration:none;line-height:25px;padding:6px;font-size:12px;margin-right:10px}#iframely #ngg_page_content .ngg_page_content_menu a:active{background:0 0}#iframely #ngg_page_content .ngg_page_content_menu .ngg_page_content_menu_active{font-weight:500;border-bottom:3px solid #9ebc1b}#iframely #ngg_page_content .ngg_page_content_menu a:before{display:none}#displayed_tab #ngg_page_content .ngg_page_content_menu .ngg_page_content_menu_active:after,#displayed_tab #ngg_page_content .ngg_page_content_menu a:active:after{display:none!important}#iframely #ngg_page_content .ngg_page_content_main{padding:30px;width:100%;box-shadow:none}#iframely #ngg_page_content .ngg_page_content_main h3{display:none}#iframely #ngg_page_content .ngg_manage_albums .ngg_page_content_main h3,#iframely #ngg_page_content .ngg_manage_images .ngg_page_content_main h3,#iframely #ngg_page_content .ngg_manage_tags .ngg_page_content_main h3{display:block}#iframely #ngg_page_content .button-primary:active,#iframely #ngg_page_content .button-secondary:active,#iframely #ngg_page_content button:active{vertical-align:top}#iframely #bulkaction{width:140px!important}#iframely .tablenav.top .displaying-num{display:none}#iframely .ngg_manage_galleries table #id{min-width:40px}#iframely .ngg_manage_galleries table #author{min-width:85px}#iframely .ngg_manage_galleries table #page_id{min-width:65px}#iframely .gallery_page_nggallery-manage-gallery .ui-dialog{height:auto!important;min-height:auto}@media (max-width:1140px){#iframely .gallery_page_ngg_addgallery #ngg_page_content .button-primary,#iframely .gallery_page_ngg_addgallery #ngg_page_content .button-secondary,#iframely .gallery_page_ngg_addgallery #ngg_page_content button{width:130px!important}}@media (max-width:940px){#iframely .gallery_page_ngg_addgallery #ngg_page_content .button-primary,#iframely .gallery_page_ngg_addgallery #ngg_page_content .button-secondary,#iframely .gallery_page_ngg_addgallery #ngg_page_content button{width:201px!important}}@media (max-width:800px){#iframely .ngg-admin #wpbody{padding:0}#iframely #ngg_page_content .ngg_page_content_menu{padding:5px 0 0;background:0 0;border:none}#iframely #ngg_page_content .ngg_page_content_menu a{display:block;width:100%;float:left;padding:0;text-align:center;box-sizing:border-box}#iframely #ngg_page_content .ngg_page_content_menu .ngg_page_content_menu_active,#iframely #ngg_page_content .ngg_page_content_menu a:active{background:0 0}#iframely #ngg_page_content .ngg_page_content_menu .ngg_page_content_menu_active:after{display:none}#iframely #ngg_page_content .ngg_page_content_menu a:last-of-type{padding-bottom:5px}#iframely .gallery_page_ngg_addgallery #ngg_page_content .button-primary,#iframely .gallery_page_ngg_addgallery #ngg_page_content .button-secondary,#iframely .gallery_page_ngg_addgallery #ngg_page_content button{width:100%!important;margin:4px 0;display:block}}
nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/iframely.min.js ADDED
@@ -0,0 +1 @@
 
1
+ "use strict";function iframely_callback(t,a){var e=jQuery(a);void 0===e.data("iframely")&&e.data("iframely",{attempts:1});var i=e.data("iframely");3==i.attempts?jQuery("#iframely").css({position:"static",visibility:"visible"}).animate({opacity:1}):(i.attempts+=1,setTimeout(function(){t.adjust_height_for_frame(t,a,iframely_callback)},400))}window.frameElement&&(document.getElementsByTagName("html")[0].id="iframely",jQuery(function(t){var a=t("#ngg_page_content");t("#wpbody-content").html(a),t("#wpbody").html(a),t("#wpwrap").html(a),t("form").each(function(){t(this).append("<input type='hidden' name='attach_to_post' value='1'/>")});var e=window.parent;null!=e&&void 0!==e.adjust_height_for_frame||null!=window&&void 0!==window.adjust_height_for_frame&&(e=window),void 0!==e.adjust_height_for_frame&&e.adjust_height_for_frame(e,window,iframely_callback)}));
nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/igw.js ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ (function($) {
2
+ setTimeout(function() {
3
+ $(function() {
4
+ window.get_igw_dimensions = function() {
5
+ var $button = $('.ngg-add-gallery');
6
+ var win = jQuery(top);
7
+ var winWidth = win.width();
8
+ var winHeight = win.height();
9
+ var popupWidth = 1800;
10
+ var popupHeight = 1200;
11
+ var minWidth = 800;
12
+ var minHeight = 600;
13
+ var maxWidth = winWidth - (winWidth * 0.05);
14
+ var maxHeight = winHeight - (winHeight * 0.09);
15
+
16
+ if (maxWidth < minWidth) { maxWidth = winWidth-20 }
17
+ if (maxHeight < minHeight) { maxHeight = winHeight-40 }
18
+ if (popupWidth > maxWidth) { popupWidth = maxWidth; }
19
+ if (popupHeight > maxHeight) { popupHeight = maxHeight; }
20
+
21
+ return {
22
+ width: popupWidth,
23
+ height: popupHeight,
24
+ top: (winHeight-popupHeight)/2,
25
+ left: (winWidth-popupWidth)/2
26
+ };
27
+ };
28
+
29
+ // Restore Thickbox functionality
30
+ window.wp_tb_position = window.tb_position;
31
+ window.tb_position = function(){
32
+ var src = $("#TB_window iframe").attr('src');
33
+ if (src && src.match('attach_to_post')) {
34
+ var dimensions = get_igw_dimensions();
35
+ $("#TB_window").css({
36
+ width: dimensions.width.toString()+ "px",
37
+ height: dimensions.height.toString()+"px",
38
+ 'top': dimensions.top.toString()+"px",
39
+ 'left': dimensions.left.toString()+"px"
40
+ });
41
+ $('#TB_window').addClass('ngg_tb_window');
42
+ $('#TB_window iframe').css({
43
+ width: '100%',
44
+ height: '100%'
45
+ });
46
+ } else {
47
+ window.wp_tb_position();
48
+ }
49
+ };
50
+
51
+ });
52
+ });
53
+ })(jQuery);
nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/igw.min.js ADDED
@@ -0,0 +1 @@
 
1
+ "use strict";!function(t){setTimeout(function(){t(function(){window.get_igw_dimensions=function(){var i=(t(".ngg-add-gallery"),jQuery(top)),o=i.width(),n=i.height(),w=1800,e=1200,d=o-.05*o,s=n-.09*n;return d<800&&(d=o-20),s<600&&(s=n-40),w>d&&(w=d),e>s&&(e=s),{width:w,height:e,top:(n-e)/2,left:(o-w)/2}},window.wp_tb_position=window.tb_position,window.tb_position=function(){var i=t("#TB_window iframe").attr("src");if(i&&i.match("attach_to_post")){var o=get_igw_dimensions();t("#TB_window").css({width:o.width.toString()+"px",height:o.height.toString()+"px",top:o.top.toString()+"px",left:o.left.toString()+"px"}),t("#TB_window").addClass("ngg_tb_window"),t("#TB_window iframe").css({width:"100%",height:"100%"})}else window.wp_tb_position()}})})}(jQuery);
nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/igw_button.png ADDED
Binary file
nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/invalid_image.png ADDED
Binary file
nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/nextgen.gif ADDED
Binary file
nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/ngg_attach_to_post_tinymce_plugin.css ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @font-face {
2
+ font-family: 'Lato';
3
+ src: url('../../nextgen_admin/static/Lato-Regular.ttf') format('truetype')
4
+ }
5
+
6
+ .nggPlaceholder {
7
+ background-color: #143650;
8
+ box-sizing: border-box;
9
+ border-top: 5px solid #9fbb1a;
10
+ border-radius: 3px;
11
+ box-shadow: 0 0 4px 1px rgba(0,0,0,.05);
12
+ color: #9fbb1a;
13
+ font-family: sans-serif;
14
+ font-size: 20px;
15
+ height: 230px;
16
+ margin: 5px;
17
+ outline: none !important;
18
+ padding: 20px 30px 50px 30px;
19
+ text-align: center;
20
+ width: 400px;
21
+ max-width: 98%;
22
+ }
23
+
24
+ .nggPlaceholder h3 {
25
+ color: #fff;
26
+ font-family: "Lato", sans-serif;
27
+ font-size: 22px;
28
+ margin: 40px 0 8px 3px;
29
+ text-transform: uppercase;
30
+ font-weight: 900;
31
+ letter-spacing: 1.5px;
32
+ }
33
+
34
+ .nggPlaceholderButton {
35
+ background: #9ebd00 !important;
36
+ border-radius: 2px;
37
+ border: none !important;
38
+ box-shadow: none !important;
39
+ color: #fff !important;
40
+ display: inline-block !important;
41
+ font-size: 13px;
42
+ font-weight: bold;
43
+ font-family: "Lato", sans-serif !important;
44
+ height: 36px !important;
45
+ line-height: 36px !important;
46
+ letter-spacing: 1.2px;
47
+ margin: 4px;
48
+ padding: 0;
49
+ width: 106px;
50
+ text-align: center;
51
+ text-transform: uppercase !important;
52
+ text-shadow: none !important;
53
+ cursor: pointer;
54
+ }
55
+
56
+ .nggPlaceholderButtonRow {
57
+ display: flex;
58
+ justify-content: center;
59
+ align-items: center;
60
+ }
61
+
62
+ .nggPlaceholderButton:hover {
63
+ background: #a5c31a !important;
64
+ }
nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/ngg_attach_to_post_tinymce_plugin.js ADDED
@@ -0,0 +1,300 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Self-executing function to create and register the TinyMCE plugin
2
+ (function (siteurl, $) {
3
+ window.id = "wordpress-post-page";
4
+
5
+ tinyMCE.addI18n("en.ngg_attach_to_post", {
6
+ title: "Attach NextGEN Gallery to Post",
7
+ });
8
+
9
+ // Create the plugin. We'll register it afterwards
10
+ tinymce.create("tinymce.plugins.NextGEN_AttachToPost", {
11
+ /**
12
+ * The WordPress Site URL
13
+ */
14
+ siteurl: siteurl,
15
+
16
+ /**
17
+ * Returns metadata about this plugin
18
+ */
19
+ getInfo: function () {
20
+ return {
21
+ longname: "NextGEN Gallery",
22
+ author: "Imagely",
23
+ authorurl: "https://www.imagely.com",
24
+ infourl:
25
+ "https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/",
26
+ version: "0.1",
27
+ };
28
+ },
29
+
30
+ /**
31
+ * Initializes the plugin, this will be executed after the plugin has been created.
32
+ */
33
+ init: function (editor, plugin_url) {
34
+ var self = this;
35
+
36
+ // TinyMCE 4s events are a bit weird, but this lets us listen to the window-manager close event
37
+ editor.windowManager.nggOldOpen = editor.windowManager.open;
38
+ editor.windowManager.open = function (one, two) {
39
+ var modal = editor.windowManager.nggOldOpen(one, two);
40
+ modal.on("close", self.wm_close_event);
41
+ return modal;
42
+ };
43
+
44
+ // Register a new TinyMCE command
45
+ editor.addCommand(
46
+ "ngg_attach_to_post",
47
+ this.render_attach_to_post_interface,
48
+ {
49
+ editor: editor,
50
+ plugin: editor.plugins.NextGEN_AttachToPost,
51
+ }
52
+ );
53
+
54
+ // Add a button to trigger the above command
55
+ editor.addButton("NextGEN_AttachToPost", {
56
+ title: "ngg_attach_to_post.title",
57
+ cmd: "ngg_attach_to_post",
58
+ image: plugin_url + "/igw_button.png",
59
+ });
60
+
61
+ /**
62
+ * Listen for click events to our placeholder
63
+ */
64
+ editor.on("mouseup touchend", function (e) {
65
+ tinymce.extend(self, {
66
+ editor: editor,
67
+ plugin: editor.plugins.NextGEN_AttachToPost,
68
+ });
69
+
70
+ // Support for IGW placeholder images. NGG <= 2.1.50
71
+ if (e.target.tagName === "IMG") {
72
+ if (
73
+ self.get_class_name(e.target).indexOf("ngg_displayed_gallery") >= 0
74
+ ) {
75
+ editor.dom.events.cancel(e);
76
+ var id = e.target.src.match(/\d+$/);
77
+ if (id) id = id.pop();
78
+ self.render_attach_to_post_interface({
79
+ key: "id",
80
+ val: id,
81
+ });
82
+ }
83
+ }
84
+
85
+ // Support for IGW Visual Shortcodes. NGG >= 2.1.50.1
86
+ else {
87
+ var $target = $(e.target);
88
+
89
+ if ($target.hasClass("nggPlaceholderButton")) {
90
+ // Remove button
91
+ if ($target.hasClass("nggIgwRemove")) {
92
+ var $placeholder = $target.parents(".nggPlaceholder");
93
+ var shortcode = $placeholder[0].getAttribute("data-shortcode");
94
+ editor.fire("ngg-removed", { shortcode: shortcode });
95
+ $placeholder.remove();
96
+ }
97
+
98
+ // Edit button
99
+ else {
100
+ // Do not use jQuery's .data() here: it will use cached data
101
+ window.igw_shortcode = $(e.target)
102
+ .parents(".nggPlaceholder")[0]
103
+ .getAttribute("data-shortcode");
104
+
105
+ self.render_attach_to_post_interface({
106
+ key: "shortcode",
107
+ val: Base64.encode(window.igw_shortcode),
108
+ ref: $(e.target).parents(".nggPlaceholder").attr("id"),
109
+ });
110
+ }
111
+ }
112
+ }
113
+ });
114
+
115
+ /**
116
+ * Find each shortcode and replace it with the placeholder, rendered using an underscore template
117
+ * in templates/tinymce_placeholder.php
118
+ */
119
+ editor.on("BeforeSetContent", function (event) {
120
+ handle_shortcode(event, "[ngg_images ");
121
+ handle_shortcode(event, "[ngg ");
122
+ });
123
+
124
+ /**
125
+ * Substitutes the IGW placeholders with the corresponding shortcode
126
+ */
127
+ editor.on("PostProcess", function (event) {
128
+ var $content = $("<div/>").append(event.content);
129
+ $content
130
+ .find(".nggPlaceholder")
131
+ .toArray()
132
+ .forEach(function (placeholder) {
133
+ var $placeholder = $(placeholder);
134
+ var shortcode = $placeholder.data("shortcode");
135
+ shortcode = "[" + _.unescape(shortcode) + "]";
136
+ $placeholder.replaceWith(shortcode);
137
+ });
138
+ event.content = $content[0].innerHTML;
139
+ });
140
+
141
+ function handle_shortcode(event, shortcode_opening_tag) {
142
+ while (event.content.indexOf(shortcode_opening_tag) >= 0) {
143
+ var start_of_shortcode = event.content.indexOf(shortcode_opening_tag);
144
+ var index = start_of_shortcode + shortcode_opening_tag.length;
145
+ var found_attribute_assignment = false;
146
+ var current_attribute_enclosure = null;
147
+ var last_found_char = false;
148
+ var content_length = event.content.length;
149
+ while (true) {
150
+ var char = event.content[index];
151
+ if (char == '"' || (char == "'" && last_found_char == "=")) {
152
+ // Is this the closing quote for an already found attribute assignment?
153
+ if (
154
+ found_attribute_assignment &&
155
+ current_attribute_enclosure == char
156
+ ) {
157
+ found_attribute_assignment = false;
158
+ current_attribute_enclosure = null;
159
+ } else {
160
+ found_attribute_assignment = true;
161
+ current_attribute_enclosure = char;
162
+ }
163
+ } else if (char == "]") {
164
+ // we've found a shortcode closing tag. But, we need to ensure
165
+ // that this ] isn't within the value of a shortcode attribute
166
+ if (!found_attribute_assignment) {
167
+ break; //exit loop - we've found the shortcode
168
+ }
169
+ }
170
+
171
+ last_found_char = char;
172
+
173
+ if (index == content_length) {
174
+ break;
175
+ }
176
+
177
+ index++;
178
+ }
179
+
180
+ // Replace the shortcode with a placeholder
181
+ var match = event.content.substring(start_of_shortcode, ++index);
182
+ var shortcode = match.substring(1, match.length - 1);
183
+ shortcode = shortcode.replace("[", "&#91;");
184
+ shortcode = shortcode.replace("]", "&#93;");
185
+
186
+ var template = _.template($("#ngg-igw-placeholder").html());
187
+ event.content = event.content.replace(
188
+ match,
189
+ template(
190
+ $.extend(ngg_igw_i18n, {
191
+ shortcode: shortcode,
192
+ ref: _.now(),
193
+ })
194
+ )
195
+ );
196
+ }
197
+ }
198
+ },
199
+
200
+ get_class_name: function (node) {
201
+ var class_name = node.getAttribute("class")
202
+ ? node.getAttribute("class")
203
+ : node.className;
204
+ if (class_name) {
205
+ return class_name;
206
+ } else {
207
+ return "";
208
+ }
209
+ },
210
+
211
+ wm_close_event: function (e) {
212
+ if (
213
+ e &&
214
+ e.target &&
215
+ e.target._id &&
216
+ e.target._id == "ngg_attach_to_post_dialog"
217
+ ) {
218
+ // Restore scrolling for the main content window when the attach to post interface is closed
219
+ $("html,body").css("overflow", "auto");
220
+ tinyMCE.activeEditor.selection.select(
221
+ tinyMCE.activeEditor.dom.select("p")[0]
222
+ );
223
+ tinyMCE.activeEditor.selection.collapse(0);
224
+ }
225
+ },
226
+
227
+ /**
228
+ * Renders the attach to post interface
229
+ */
230
+ render_attach_to_post_interface: function (params) {
231
+ // Determine the attach to post url
232
+ var attach_to_post_url = window.igw.url;
233
+ if (typeof params != "undefined") {
234
+ attach_to_post_url +=
235
+ "&" + params.key + "=" + encodeURIComponent(params.val);
236
+ if (typeof params["ref"] != "undefined") {
237
+ attach_to_post_url += "&ref=" + encodeURIComponent(params.ref);
238
+ }
239
+ }
240
+ attach_to_post_url += "&editor=" + this.editor.id;
241
+
242
+ var win = window;
243
+ while (win.parent != null && win.parent != win) {
244
+ win = win.parent;
245
+ }
246
+
247
+ win = $(win);
248
+ var winWidth = win.width();
249
+ var winHeight = win.height();
250
+ var popupWidth = 1600;
251
+ var popupHeight = 1200;
252
+ var minWidth = 800;
253
+ var minHeight = 600;
254
+ var maxWidth = winWidth - winWidth * 0.05;
255
+ var maxHeight = winHeight - winHeight * 0.1;
256
+
257
+ if (maxWidth < minWidth) {
258
+ maxWidth = winWidth - 20;
259
+ }
260
+ if (maxHeight < minHeight) {
261
+ maxHeight = winHeight - 40;
262
+ }
263
+ if (popupWidth > maxWidth) {
264
+ popupWidth = maxWidth;
265
+ }
266
+ if (popupHeight > maxHeight) {
267
+ popupHeight = maxHeight;
268
+ }
269
+
270
+ // for mobile devices: dismiss the keyboard by blurring any input with focus
271
+ document.activeElement.blur();
272
+ Array.prototype.forEach.call(
273
+ document.querySelectorAll("input, textarea"),
274
+ function (it) {
275
+ it.blur();
276
+ }
277
+ );
278
+
279
+ // Open a window, occupying 90% of the screen real estate
280
+ this.editor.windowManager.open({
281
+ url: attach_to_post_url,
282
+ id: "ngg_attach_to_post_dialog",
283
+ width: popupWidth,
284
+ height: popupHeight,
285
+ title: "NextGEN Gallery - Attach To Post",
286
+ });
287
+
288
+ // Ensure that the window cannot be scrolled - XXX actually allow scrolling in the main window and disable it for the inner-windows/frames/elements as to create a single scrollbar
289
+ $("html,body").css("overflow", "hidden");
290
+ $("#ngg_attach_to_post_dialog_ifr").css("overflow-y", "auto");
291
+ $("#ngg_attach_to_post_dialog_ifr").css("overflow-x", "hidden");
292
+ },
293
+ });
294
+
295
+ // Register plugin
296
+ tinymce.PluginManager.add(
297
+ "NextGEN_AttachToPost",
298
+ tinymce.plugins.NextGEN_AttachToPost
299
+ );
300
+ })(photocrati_ajax.wp_site_url, jQuery);
nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/ngg_attach_to_post_tinymce_plugin.min.css ADDED
@@ -0,0 +1 @@
 
1
+ @font-face{font-family:Lato;src:url(../../nextgen_admin/static/Lato-Regular.ttf) format('truetype')}.nggPlaceholder{background-color:#143650;box-sizing:border-box;border-top:5px solid #9fbb1a;border-radius:3px;box-shadow:0 0 4px 1px rgba(0,0,0,.05);color:#9fbb1a;font-family:sans-serif;font-size:20px;height:230px;margin:5px;outline:0!important;padding:20px 30px 50px;text-align:center;width:400px;max-width:98%}.nggPlaceholder h3{color:#fff;font-family:Lato,sans-serif;font-size:22px;margin:40px 0 8px 3px;text-transform:uppercase;font-weight:900;letter-spacing:1.5px}.nggPlaceholderButton{background:#9ebd00!important;border-radius:2px;border:none!important;box-shadow:none!important;color:#fff!important;display:inline-block!important;font-size:13px;font-weight:700;font-family:Lato,sans-serif!important;height:36px!important;line-height:36px!important;letter-spacing:1.2px;margin:4px;padding:0;width:106px;text-align:center;text-transform:uppercase!important;text-shadow:none!important;cursor:pointer}.nggPlaceholderButtonRow{display:flex;justify-content:center;align-items:center}.nggPlaceholderButton:hover{background:#a5c31a!important}
nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/ngg_attach_to_post_tinymce_plugin.min.js ADDED
@@ -0,0 +1 @@
 
1
+ "use strict";!function(t,e){window.id="wordpress-post-page",tinyMCE.addI18n("en.ngg_attach_to_post",{title:"Attach NextGEN Gallery to Post"}),tinymce.create("tinymce.plugins.NextGEN_AttachToPost",{siteurl:t,getInfo:function(){return{longname:"NextGEN Gallery",author:"Imagely",authorurl:"https://www.imagely.com",infourl:"https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/",version:"0.1"}},init:function(t,n){function o(t,n){for(;t.content.indexOf(n)>=0;){for(var o=t.content.indexOf(n),a=o+n.length,r=!1,i=null,c=!1,g=t.content.length;;){var l=t.content[a];if('"'==l||"'"==l&&"="==c)r&&i==l?(r=!1,i=null):(r=!0,i=l);else if("]"==l&&!r)break;if(c=l,a==g)break;a++}var s=t.content.substring(o,++a),d=s.substring(1,s.length-1);d=d.replace("[","&#91;"),d=d.replace("]","&#93;");var h=_.template(e("#ngg-igw-placeholder").html());t.content=t.content.replace(s,h(e.extend(ngg_igw_i18n,{shortcode:d,ref:_.now()})))}}var a=this;t.windowManager.nggOldOpen=t.windowManager.open,t.windowManager.open=function(e,n){var o=t.windowManager.nggOldOpen(e,n);return o.on("close",a.wm_close_event),o},t.addCommand("ngg_attach_to_post",this.render_attach_to_post_interface,{editor:t,plugin:t.plugins.NextGEN_AttachToPost}),t.addButton("NextGEN_AttachToPost",{title:"ngg_attach_to_post.title",cmd:"ngg_attach_to_post",image:n+"/igw_button.png"}),t.on("mouseup touchend",function(n){if(tinymce.extend(a,{editor:t,plugin:t.plugins.NextGEN_AttachToPost}),"IMG"===n.target.tagName){if(a.get_class_name(n.target).indexOf("ngg_displayed_gallery")>=0){t.dom.events.cancel(n);var o=n.target.src.match(/\d+$/);o&&(o=o.pop()),a.render_attach_to_post_interface({key:"id",val:o})}}else{var r=e(n.target);if(r.hasClass("nggPlaceholderButton"))if(r.hasClass("nggIgwRemove")){var i=r.parents(".nggPlaceholder"),c=i[0].getAttribute("data-shortcode");t.fire("ngg-removed",{shortcode:c}),i.remove()}else window.igw_shortcode=e(n.target).parents(".nggPlaceholder")[0].getAttribute("data-shortcode"),a.render_attach_to_post_interface({key:"shortcode",val:Base64.encode(window.igw_shortcode),ref:e(n.target).parents(".nggPlaceholder").attr("id")})}}),t.on("BeforeSetContent",function(t){o(t,"[ngg_images "),o(t,"[ngg ")}),t.on("PostProcess",function(t){var n=e("<div/>").append(t.content);n.find(".nggPlaceholder").toArray().forEach(function(t){var n=e(t),o=n.data("shortcode");o="["+_.unescape(o)+"]",n.replaceWith(o)}),t.content=n[0].innerHTML})},get_class_name:function(t){var e=t.getAttribute("class")?t.getAttribute("class"):t.className;return e||""},wm_close_event:function(t){t&&t.target&&t.target._id&&"ngg_attach_to_post_dialog"==t.target._id&&(e("html,body").css("overflow","auto"),tinyMCE.activeEditor.selection.select(tinyMCE.activeEditor.dom.select("p")[0]),tinyMCE.activeEditor.selection.collapse(0))},render_attach_to_post_interface:function(t){var n=window.igw.url;void 0!==t&&(n+="&"+t.key+"="+encodeURIComponent(t.val),void 0!==t.ref&&(n+="&ref="+encodeURIComponent(t.ref))),n+="&editor="+this.editor.id;for(var o=window;null!=o.parent&&o.parent!=o;)o=o.parent;o=e(o);var a=o.width(),r=o.height(),i=1600,c=1200,g=a-.05*a,l=r-.1*r;g<800&&(g=a-20),l<600&&(l=r-40),i>g&&(i=g),c>l&&(c=l),document.activeElement.blur(),Array.prototype.forEach.call(document.querySelectorAll("input, textarea"),function(t){t.blur()}),this.editor.windowManager.open({url:n,id:"ngg_attach_to_post_dialog",width:i,height:c,title:"NextGEN Gallery - Attach To Post"}),e("html,body").css("overflow","hidden"),e("#ngg_attach_to_post_dialog_ifr").css("overflow-y","auto"),e("#ngg_attach_to_post_dialog_ifr").css("overflow-x","hidden")}}),tinymce.PluginManager.add("NextGEN_AttachToPost",tinymce.plugins.NextGEN_AttachToPost)}(photocrati_ajax.wp_site_url,jQuery);
nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/ngg_tabs.js ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ jQuery(function($) {
2
+
3
+ // Creates a Firefox-friendly wrapper around jQuery Tabs
4
+ $.fn.ngg_tabs = function(options) {
5
+
6
+ // Create jQuery tabs
7
+ this.tabs(options);
8
+
9
+ // Change from display:none to visbibility:hidden
10
+ var i = 0;
11
+ this.find('.main_menu_tab').each(function() {
12
+ if (i === 0) {
13
+ $.fn.ngg_tabs.show_tab(this, options.onShowTab);
14
+ } else {
15
+ $.fn.ngg_tabs.hide_tab(this, options.onHideTab);
16
+ }
17
+ i++;
18
+ });
19
+
20
+ // When the selected tab changes, then we need to re-adjust
21
+ this.on('tabsactivate', function(event, ui) {
22
+ // Ensure that all tabs are still displayed, but hidden ;)
23
+ $.fn.ngg_tabs.hide_tab($.fn.ngg_tabs.get_tab_by_li(ui.oldTab), options.onHideTab);
24
+ $.fn.ngg_tabs.show_tab($.fn.ngg_tabs.get_tab_by_li(ui.newTab), options.onShowTab);
25
+ });
26
+ };
27
+
28
+ $.fn.ngg_tabs.hide_tab = function(tab, cb) {
29
+ setTimeout(function() {
30
+ $(tab).css({
31
+ display: 'block',
32
+ 'z-index': -10,
33
+ visibility: 'hidden',
34
+ opacity: 0
35
+ }).addClass('ngg-tab-inactive').removeClass('ngg-tab-active').trigger('tab-hidden');
36
+
37
+ if (cb) cb(tab)
38
+ }, 0);
39
+ };
40
+
41
+ $.fn.ngg_tabs.show_tab = function(tab, cb){
42
+ tab = $(tab);
43
+
44
+ setTimeout(function() {
45
+ var iframe = tab.find('iframe')[0];
46
+ if (typeof iframe !== 'undefined'
47
+ && typeof iframe.contentWindow !== 'undefined') {
48
+ adjust_height_for_frame(top, iframe.contentWindow);
49
+ }
50
+ }, 50);
51
+
52
+ setTimeout(function() {
53
+ tab.css({
54
+ 'z-index': 1,
55
+ visibility: 'visible',
56
+ opacity: 1
57
+ }).addClass('ngg-tab-active').removeClass('ngg-tab-inactive').trigger('tab-visible');
58
+
59
+ if (cb) cb(tab)
60
+ }, 50);
61
+
62
+ if (cb) cb(tab)
63
+ };
64
+
65
+ $.fn.ngg_tabs.get_tab_by_li = function(list_item) {
66
+ return list_item.parents('div')
67
+ .find('.main_menu_tab[aria-labelledby="' + list_item.attr('aria-labelledby') + '"]');
68
+ }
69
+
70
+ });
nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/ngg_tabs.min.js ADDED
@@ -0,0 +1 @@
 
1
+ "use strict";jQuery(function(t){t.fn.ngg_tabs=function(n){this.tabs(n);var i=0;this.find(".main_menu_tab").each(function(){0===i?t.fn.ngg_tabs.show_tab(this,n.onShowTab):t.fn.ngg_tabs.hide_tab(this,n.onHideTab),i++}),this.on("tabsactivate",function(i,a){t.fn.ngg_tabs.hide_tab(t.fn.ngg_tabs.get_tab_by_li(a.oldTab),n.onHideTab),t.fn.ngg_tabs.show_tab(t.fn.ngg_tabs.get_tab_by_li(a.newTab),n.onShowTab)})},t.fn.ngg_tabs.hide_tab=function(n,i){setTimeout(function(){t(n).css({display:"block","z-index":-10,visibility:"hidden",opacity:0}).addClass("ngg-tab-inactive").removeClass("ngg-tab-active").trigger("tab-hidden"),i&&i(n)},0)},t.fn.ngg_tabs.show_tab=function(n,i){n=t(n),setTimeout(function(){var t=n.find("iframe")[0];void 0!==t&&void 0!==t.contentWindow&&adjust_height_for_frame(top,t.contentWindow)},50),setTimeout(function(){n.css({"z-index":1,visibility:"visible",opacity:1}).addClass("ngg-tab-active").removeClass("ngg-tab-inactive").trigger("tab-visible"),i&&i(n)},50),i&&i(n)},t.fn.ngg_tabs.get_tab_by_li=function(t){return t.parents("div").find('.main_menu_tab[aria-labelledby="'+t.attr("aria-labelledby")+'"]')}});
nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/spinner.gif ADDED
Binary file
nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/uploader-icons-2x.png ADDED
Binary file
nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/uploader-icons.png ADDED
Binary file
nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/templates/attach_to_post.php ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title><?php esc_html_e($page_title)?></title>
5
+ <?php
6
+ print_admin_styles();
7
+ print_head_scripts();
8
+ ?>
9
+ </head>
10
+ <body>
11
+ <div id="attach_to_post_tabs">
12
+ <div class='ui-tabs-icon'><img src='<?php esc_html_e($logo) ?>' class='attach_to_post_logo'>
13
+ <ul>
14
+ <?php foreach ($tabs as $id => $tab_params): ?>
15
+ <li>
16
+ <a href='#<?php echo esc_attr($id)?>'>
17
+ <?php esc_html_e($tab_params['title']) ?>
18
+ </a>
19
+ </li>
20
+ <?php endforeach ?>
21
+ </ul>
22
+ </div>
23
+ <?php reset($tabs); foreach ($tabs as $id => $tab_params): ?>
24
+ <div class="main_menu_tab" id="<?php echo esc_attr($id) ?>">
25
+ <?php echo $tab_params['content'] ?>
26
+ </div>
27
+ <?php endforeach ?>
28
+ </div>
29
+
30
+ <div id="adminmenu" style="display:none;" data-wp-responsive="true"></div>
31
+ <?php wp_print_footer_scripts() ?>
32
+ </body>
33
+ </html>
nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/templates/display_settings_form.php ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <form rel="<?php echo esc_attr($display_type_name) ?>"
2
+ class="<?php echo esc_attr($css_class) ?>"
3
+ method='POST'
4
+ action='<?php echo esc_attr($_SERVER['REQUEST_URI'])?>'
5
+ data-defaults="<?php print esc_attr(json_encode($defaults)); ?>">
6
+ <?php echo $settings ?>
7
+ </form>
nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/templates/display_tab.php ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div id='ngg_page_content'>
2
+
3
+ <div id="errors">
4
+ </div>
5
+
6
+ <div class="ngg_page_content_menu" class="ngg_advanced">
7
+
8
+ <?php foreach($tabs as $tab): ?>
9
+ <a href='javascript:void(0)' data-id='<?php esc_attr_e( $tab['id'] ) ?>'><?php esc_html_e( $tab['title']) ?></a>
10
+ <?php endforeach ?>
11
+
12
+ </div>
13
+
14
+ <div class="ngg_page_content_main"">
15
+
16
+ <?php foreach($tabs as $tab): ?>
17
+ <div data-id='<?php esc_attr_e($tab['id']) ?>'>
18
+ <h3 class="accordion_tab" id="<?php esc_html_e( $tab['id']) ?>"><?php esc_html_e( $tab['title']) ?></h3>
19
+ <div id="<?php echo esc_attr($tab['id']) ?>_content"><?php echo $tab['content']; ?></div>
20
+ </div>
21
+ <?php endforeach ?>
22
+
23
+ <p class="wp-core-ui">
24
+ <input type="button" class="button button-primary button-large ngg_display_tab_save" id="save_displayed_gallery" value="<?php if ($displayed_gallery->id()) { _e('Save Changes', 'nggallery'); } else { _e('Insert Gallery', 'nggallery'); } ?>"/>
25
+ </p>
26
+ <div class="ngg_igw_video">
27
+ <p class="ngg_igw_video_open button-primary"><?php esc_html_e('Need a quick tutorial?', 'nggallery'); ?></p>
28
+ <div class="ngg_igw_video_inner">
29
+ <span class="ngg_igw_video_close"><?php esc_html_e('Click to Close', 'nggallery'); ?></span>
30
+ </div>
31
+ </div>
32
+ </div>
33
+
34
+ </div>
nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/templates/display_tab_source.php ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ <table id="source_configuration"></table>
2
+ <table id='slug_configuration'></table>
3
+ <label id="display_tip"></label>
nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/templates/display_tab_type.php ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ <div id="display_type_selector">
2
+
3
+ </div>
nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/templates/no_display_type_selected.php ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ <p class="<?php echo esc_attr($css_class) ?>">
2
+ <?php esc_html_e($no_display_type_selected)?>
3
+ </p>
nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/templates/preview_tab.php ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ <div id="preview_area">
2
+
3
+ </div>
nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/templates/tinymce_placeholder.php ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <script type="text/underscore-template" id="ngg-igw-placeholder">
2
+ <div class="mceItem mceNonEditable nggPlaceholder"
3
+ id="<%- ref %>"
4
+ data-shortcode="<%- shortcode %>"
5
+ data-mce-resize="false"
6
+ data-mce-placeholder="1"
7
+ contenteditable="false">
8
+ <h3><%- nextgen_gallery %></h3>
9
+ <div class="nggPlaceholderButton nggIgwEdit">
10
+ <%- edit %>
11
+ </div>
12
+ <div class="nggPlaceholderButton nggIgwRemove">
13
+ <%- remove %>
14
+ </div>
15
+ </div>
16
+ </script>
nextgen-gallery/products/photocrati_nextgen/modules/cache/module.cache.php ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class M_Cache extends C_Base_Module
3
+ {
4
+ /**
5
+ * Defines the module name & version
6
+ */
7
+ function define($id = 'pope-module',
8
+ $name = 'Pope Module',
9
+ $description = '',
10
+ $version = '',
11
+ $uri = '',
12
+ $author = '',
13
+ $author_uri = '',
14
+ $context = FALSE)
15
+ {
16
+ parent::define(
17
+ 'photocrati-cache',
18
+ 'Cache',
19
+ 'Handles clearing of NextGen caches',
20
+ '3.0.0',
21
+ 'https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/',
22
+ 'Imagely',
23
+ 'https://www.imagely.com'
24
+ );
25
+ }
26
+
27
+ /**
28
+ * Register utilities
29
+ */
30
+ function _register_utilities()
31
+ {
32
+ $this->get_registry()->add_utility('I_Cache', 'C_Cache');
33
+ }
34
+
35
+ /**
36
+ * @return array
37
+ */
38
+ function get_type_list()
39
+ {
40
+ return array(
41
+ 'C_Cache' => 'class.cache.php'
42
+ );
43
+ }
44
+ }
45
+
46
+ new M_Cache();
nextgen-gallery/products/photocrati_nextgen/modules/cache/package.module.cache.php ADDED
@@ -0,0 +1,74 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Class C_Cache
4
+ *
5
+ * @implements I_Cache
6
+ */
7
+ class C_Cache extends C_Component
8
+ {
9
+ public static $_instances = array();
10
+ function define($context = FALSE)
11
+ {
12
+ parent::define($context);
13
+ $this->implement('I_Cache');
14
+ }
15
+ /**
16
+ * @param bool|string $context
17
+ * @return C_Cache
18
+ */
19
+ public static function get_instance($context = False)
20
+ {
21
+ if (!isset(self::$_instances[$context])) {
22
+ self::$_instances[$context] = new C_Cache($context);
23
+ }
24
+ return self::$_instances[$context];
25
+ }
26
+ /**
27
+ * Empties a directory of all of its content
28
+ *
29
+ * @param string $directory Absolute path
30
+ * @param bool $recursive Remove files from subdirectories of the cache
31
+ * @param string $regex (optional) Only remove files matching pattern; '/^.+\.png$/i' will match all .png
32
+ */
33
+ public function flush_directory($directory, $recursive = TRUE, $regex = NULL)
34
+ {
35
+ // It is possible that the cache directory has not been created yet
36
+ if (!is_dir($directory)) {
37
+ return;
38
+ }
39
+ if ($recursive) {
40
+ $directory = new DirectoryIterator($directory);
41
+ } else {
42
+ $directory = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory), RecursiveIteratorIterator::CHILD_FIRST);
43
+ }
44
+ if (!is_null($regex)) {
45
+ $iterator = RegexIterator($directory, $regex, RecursiveRegexIterator::GET_MATCH);
46
+ } else {
47
+ $iterator = $directory;
48
+ }
49
+ foreach ($iterator as $file) {
50
+ if ($file->isFile() || $file->isLink()) {
51
+ @unlink($file->getPathname());
52
+ } elseif ($file->isDir() && !$file->isDot() && $recursive) {
53
+ @rmdir($file->getPathname());
54
+ }
55
+ }
56
+ }
57
+ /**
58
+ * Flushes cache from all available galleries
59
+ *
60
+ * @param array $galleries When provided only the requested galleries' cache is flushed
61
+ */
62
+ public function flush_galleries($galleries = array())
63
+ {
64
+ global $wpdb;
65
+ if (empty($galleries)) {
66
+ $galleries = C_Gallery_Mapper::get_instance()->find_all();
67
+ }
68
+ foreach ($galleries as $gallery) {
69
+ C_Gallery_Storage::get_instance()->flush_cache($gallery);
70
+ }
71
+ // Remove images still in the DB whose gallery no longer exists
72
+ $wpdb->query("DELETE FROM `{$wpdb->nggpictures}` WHERE `galleryid` NOT IN (SELECT `gid` FROM `{$wpdb->nggallery}`)");
73
+ }
74
+ }
nextgen-gallery/products/photocrati_nextgen/modules/datamapper/README.txt ADDED
@@ -0,0 +1 @@
 
1
+ See the datamapper unit tests for details about the API
nextgen-gallery/products/photocrati_nextgen/modules/datamapper/module.datamapper.php ADDED
@@ -0,0 +1,247 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class M_DataMapper extends C_Base_Module
3
+ {
4
+ function define($id = 'pope-module',
5
+ $name = 'Pope Module',
6
+ $description = '',
7
+ $version = '',
8
+ $uri = '',
9
+ $author = '',
10
+ $author_uri = '',
11
+ $context = FALSE)
12
+ {
13
+ parent::define(
14
+ 'photocrati-datamapper',
15
+ 'DataMapper',
16
+ 'Provides a database abstraction layer following the DataMapper pattern',
17
+ '3.1.19',
18
+ 'https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/',
19
+ 'Imagely',
20
+ 'https://www.imagely.com'
21
+ );
22
+
23
+ C_Photocrati_Installer::add_handler($this->module_id, 'C_Datamapper_Installer');
24
+ }
25
+
26
+ function _register_adapters()
27
+ {
28
+ $this->get_registry()->add_adapter('I_Component_Factory', 'A_DataMapper_Factory');
29
+ }
30
+
31
+
32
+ function _register_hooks()
33
+ {
34
+ add_filter('posts_request', array($this, 'set_custom_wp_query'), 50, 2);
35
+ add_filter('posts_fields', array($this, 'set_custom_wp_query_fields'), 50, 2);
36
+ add_filter('posts_where', array($this, 'set_custom_wp_query_where'), 50, 2);
37
+ add_filter('posts_groupby', array($this, 'set_custom_wp_query_groupby'), 50, 2);
38
+ }
39
+
40
+
41
+ /**
42
+ * Sets a custom SQL query for the WP_Query class, when the Custom Post
43
+ * DataMapper implementation is used
44
+ * @param string $sql
45
+ * @param WP_Query $wp_query
46
+ * @return string
47
+ */
48
+ function set_custom_wp_query($sql, $wp_query)
49
+ {
50
+ if ($wp_query->get('datamapper')) {
51
+
52
+ // Set the custom query
53
+ if (($custom_sql = $wp_query->get('custom_sql'))) {
54
+ $sql = $custom_sql;
55
+ }
56
+
57
+ // Perhaps we're to initiate a delete query instead?
58
+ elseif ($wp_query->get('is_delete')) {
59
+ $sql = preg_replace("/^SELECT.*FROM/i", "DELETE FROM", $sql);
60
+ }
61
+
62
+ if ($wp_query->get('debug')) var_dump($sql);
63
+ }
64
+
65
+ return $sql;
66
+ }
67
+
68
+ /**
69
+ * Sets custom fields to select from the database
70
+ * @param string $fields
71
+ * @param WP_Query $wp_query
72
+ * @return string
73
+ */
74
+ function set_custom_wp_query_fields($fields, $wp_query)
75
+ {
76
+ if ($wp_query->get('datamapper')) {
77
+ if (($custom_fields = $wp_query->get('fields')) && $custom_fields != 'ids') {
78
+ $fields = $custom_fields;
79
+ }
80
+ }
81
+
82
+ return $fields;
83
+ }
84
+
85
+
86
+ /**
87
+ * Sets custom where clauses for a query
88
+ * @param string $where
89
+ * @param WP_Query $wp_query
90
+ * @return string
91
+ */
92
+ function set_custom_wp_query_where($where, $wp_query)
93
+ {
94
+ if ($wp_query->get('datamapper')) {
95
+ $this->add_post_title_where_clauses($where, $wp_query);
96
+ $this->add_post_name_where_clauses($where, $wp_query);
97
+ }
98
+
99
+ return $where;
100
+ }
101
+
102
+
103
+ /**
104
+ * Adds additional group by clauses to the SQL query
105
+ * @param string $groupby
106
+ * @param WP_Query $wp_query
107
+ * @return string
108
+ */
109
+ function set_custom_wp_query_groupby($groupby, $wp_query)
110
+ {
111
+ $retval = $groupby;
112
+ $group_by_columns = $wp_query->get('group_by_columns');
113
+ if ($group_by_columns) {
114
+ $retval = str_replace('GROUP BY', '', $retval);
115
+ $columns = explode(',', $retval);
116
+ foreach (array_reverse($columns) as $column) {
117
+ array_unshift($group_by_columns, trim($column));
118
+ }
119
+ $retval = "GROUP BY ".implode(', ', $group_by_columns);
120
+ }
121
+ // Not all mysql servers allow access to create temporary tables which are used when doing GROUP BY
122
+ // statements; this can potentially ruin basic queries. If no group_by_columns is set AND the query originates
123
+ // within the datamapper we strip the "GROUP BY" clause entirely in this filter.
124
+ else if ($wp_query->get('datamapper')) {
125
+ $retval = '';
126
+ }
127
+ return $retval;
128
+ }
129
+
130
+
131
+ /**
132
+ * Formats the value of used in a WHERE IN
133
+ * SQL clause for use in the WP_Query where clause
134
+ * @param string|array $values
135
+ * @return string
136
+ */
137
+ function format_where_in_value($values)
138
+ {
139
+ if (is_string($values) && strpos($values, ',') !== FALSE)
140
+ $values = explode(", ", $values);
141
+ elseif (!is_array($values))
142
+ $values = array($values);
143
+
144
+ // Quote the titles
145
+ foreach ($values as $index => $value) {
146
+ $values[$index] = "'{$value}'";
147
+ }
148
+
149
+ return implode(', ', $values);
150
+ }
151
+
152
+
153
+ /**
154
+ * Adds post_title to the where clause
155
+ * @param string $where
156
+ * @param WP_Query $wp_query
157
+ * @return string
158
+ */
159
+ function add_post_title_where_clauses(&$where, &$wp_query)
160
+ {
161
+ global $wpdb;
162
+
163
+ // Handle post_title query var
164
+ if (($titles = $wp_query->get('post_title'))) {
165
+ $titles = $this->format_where_in_value($titles);
166
+ $where .= " AND {$wpdb->posts}.post_title IN ({$titles})";
167
+ }
168
+
169
+ // Handle post_title_like query var
170
+ elseif (($value = $wp_query->get('post_title__like'))) {
171
+ $where .= " AND {$wpdb->posts}.post_title LIKE '{$value}'";
172
+ }
173
+
174
+ return $where;
175
+ }
176
+
177
+
178
+ /**
179
+ * Adds post_name to the where clause
180
+ * @param string $where
181
+ * @param WP_Query $wp_query
182
+ */
183
+ function add_post_name_where_clauses(&$where, &$wp_query)
184
+ {
185
+ global $wpdb;
186
+
187
+ if (($name = $wp_query->get('page_name__like'))) {
188
+ $where .= " AND {$wpdb->posts}.post_name LIKE '{$name}'";
189
+ }
190
+ elseif (($names = $wp_query->get('page_name__in'))) {
191
+ $names = $this->format_where_in_value($names);
192
+ $where .= " AND {$wpdb->posts}.post_name IN ({$names})";
193
+ }
194
+ }
195
+
196
+ /**
197
+ * Unserializes data
198
+ *
199
+ * @deprecated Used only by the Pro Lightbox
200
+ * @param string $value
201
+ * @return mixed
202
+ */
203
+ public static function unserialize($value)
204
+ {
205
+ return C_NextGen_Serializable::unserialize($value);
206
+ }
207
+
208
+ /**
209
+ * Serializes the data
210
+ *
211
+ * @deprecated Used only by the Pro Lightbox
212
+ * @param mixed $value
213
+ * @return string
214
+ */
215
+ static function serialize($value)
216
+ {
217
+ return C_NextGen_Serializable::serialize($value);
218
+ }
219
+
220
+ function get_type_list()
221
+ {
222
+ return array(
223
+ 'A_Datamapper_Factory' => 'adapter.datamapper_factory.php',
224
+ 'C_Datamapper_Installer' => 'class.datamapper_installer.php',
225
+ 'C_Datamapper' => 'class.datamapper.php',
226
+ 'C_Custompost_Datamapper_Driver' => 'class.custompost_datamapper_driver.php',
227
+ 'C_Customtable_Datamapper_Driver' => 'class.customtable_datamapper_driver.php',
228
+ 'C_Datamapper_Driver_Base' => 'class.datamapper_driver_base.php',
229
+ 'C_Datamapper_Model' => 'class.datamapper_model.php',
230
+ 'M_Datamapper' => 'module.datamapper.php'
231
+ );
232
+ }
233
+ }
234
+
235
+ class C_DataMapper_Installer
236
+ {
237
+ function __construct()
238
+ {
239
+ $this->settings = C_NextGen_Settings::get_instance();
240
+ }
241
+
242
+ function install()
243
+ {
244
+ $this->settings->set_default_value('datamapper_driver', 'custom_post_datamapper');
245
+ }
246
+ }
247
+ new M_DataMapper();
nextgen-gallery/products/photocrati_nextgen/modules/datamapper/package.module.datamapper.php ADDED
@@ -0,0 +1,1926 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Class A_DataMapper_Factory
4
+ * @mixin C_Component_Factory
5
+ * @adapts I_Component_Factory
6
+ */
7
+ class A_DataMapper_Factory extends Mixin
8
+ {
9
+ function datamapper_model($mapper, $properties = array(), $context = FALSE)
10
+ {
11
+ return new C_DataMapper_Model($mapper, $properties = array(), $context);
12
+ }
13
+ function datamapper($object_name, $context = FALSE)
14
+ {
15
+ return new C_DataMapper($object_name, $context);
16
+ }
17
+ function custom_table_datamapper($object_name, $context = FALSE)
18
+ {
19
+ return new C_CustomTable_DataMapper_Driver($object_name, $context);
20
+ }
21
+ function custom_post_datamapper($object_name, $context = FALSE)
22
+ {
23
+ return new C_CustomPost_DataMapper_Driver($object_name, $context);
24
+ }
25
+ }
26
+ /**
27
+ * Class C_DataMapper_Driver_Base
28
+ * @mixin Mixin_DataMapper_Driver_Base
29
+ * @implements I_DataMapper_Driver
30
+ */
31
+ class C_DataMapper_Driver_Base extends C_Component
32
+ {
33
+ var $_object_name;
34
+ var $_model_factory_method = FALSE;
35
+ var $_columns = array();
36
+ var $_table_columns = array();
37
+ var $_serialized_columns = array();
38
+ function define($object_name = FALSE, $context = FALSE)
39
+ {
40
+ parent::define($context);
41
+ $this->add_mixin('Mixin_DataMapper_Driver_Base');
42
+ $this->implement('I_DataMapper_Driver');
43
+ $this->_object_name = $object_name;
44
+ }
45
+ function initialize()
46
+ {
47
+ parent::initialize();
48
+ $this->_cache = array();
49
+ if ($this->has_method('define_columns')) {
50
+ $this->define_columns();
51
+ }
52
+ $this->lookup_columns();
53
+ }
54
+ /**
55
+ * Gets the object name
56
+ * @return string
57
+ */
58
+ function get_object_name()
59
+ {
60
+ return $this->_object_name;
61
+ }
62
+ /**
63
+ * Gets the name of the table
64
+ * @global string $table_prefix
65
+ * @return string
66
+ */
67
+ function get_table_name()
68
+ {
69
+ global $table_prefix;
70
+ global $wpdb;
71
+ $prefix = $table_prefix;
72
+ if ($wpdb != null && $wpdb->prefix != null) {
73
+ $prefix = $wpdb->prefix;
74
+ }
75
+ return apply_filters('ngg_datamapper_table_name', $prefix . $this->_object_name, $this->_object_name);
76
+ }
77
+ /**
78
+ * Looks up using SQL the columns existing in the database, result is cached
79
+ */
80
+ function lookup_columns()
81
+ {
82
+ // Avoid doing multiple SHOW COLUMNS if we can help it
83
+ $key = C_Photocrati_Transient_Manager::create_key('col_in_' . $this->get_table_name(), 'columns');
84
+ $this->_table_columns = C_Photocrati_Transient_Manager::fetch($key, FALSE);
85
+ if (!$this->_table_columns) {
86
+ $this->object->update_columns_cache();
87
+ }
88
+ return $this->_table_columns;
89
+ }
90
+ /**
91
+ * Looks up using SQL the columns existing in the database
92
+ */
93
+ function update_columns_cache()
94
+ {
95
+ $key = C_Photocrati_Transient_Manager::create_key('col_in_' . $this->get_table_name(), 'columns');
96
+ global $wpdb;
97
+ $this->_table_columns = array();
98
+ $sql = "SHOW COLUMNS FROM `{$this->get_table_name()}`";
99
+ foreach ($wpdb->get_results($sql) as $row) {
100
+ $this->_table_columns[] = $row->Field;
101
+ }
102
+ C_Photocrati_Transient_Manager::update($key, $this->_table_columns);
103
+ }
104
+ /**
105
+ * Determines whether a column is present for the table
106
+ * @param string $column_name
107
+ * @return bool
108
+ */
109
+ function has_column($column_name)
110
+ {
111
+ if (empty($this->object->_table_columns)) {
112
+ $this->object->lookup_columns();
113
+ }
114
+ return array_search($column_name, $this->object->_table_columns) !== FALSE;
115
+ }
116
+ /**
117
+ * Sets the name of the factory method used to create a model for this entity
118
+ * @param string $method_name
119
+ */
120
+ function set_model_factory_method($method_name)
121
+ {
122
+ $this->_model_factory_method = $method_name;
123
+ }
124
+ /**
125
+ * Gets the name of the factory method used to create a model for this entity
126
+ */
127
+ function get_model_factory_method()
128
+ {
129
+ return $this->_model_factory_method;
130
+ }
131
+ /**
132
+ * Gets the name of the primary key column
133
+ * @return string
134
+ */
135
+ function get_primary_key_column()
136
+ {
137
+ return $this->_primary_key_column;
138
+ }
139
+ /**
140
+ * Gets the class name of the driver used
141
+ * @return string
142
+ */
143
+ function get_driver_class_name()
144
+ {
145
+ return get_called_class();
146
+ }
147
+ function cache($key, $results)
148
+ {
149
+ if ($this->object->_use_cache) {
150
+ $this->_cache[$key] = $results;
151
+ }
152
+ }
153
+ function get_from_cache($key, $default = NULL)
154
+ {
155
+ if ($this->object->_use_cache && isset($this->_cache[$key])) {
156
+ return $this->_cache[$key];
157
+ } else {
158
+ return $default;
159
+ }
160
+ }
161
+ function flush_query_cache()
162
+ {
163
+ $this->_cache = array();
164
+ }
165
+ /**
166
+ * Used to clean column or table names in a SQL query
167
+ * @param string $val
168
+ * @return string
169
+ */
170
+ function _clean_column($val)
171
+ {
172
+ return str_replace(array(';', "'", '"', '`'), array(''), $val);
173
+ }
174
+ /**
175
+ * Notes that a particular columns is serialized, and should be unserialized when converted to an entity
176
+ * @param $column
177
+ */
178
+ function add_serialized_column($column)
179
+ {
180
+ $this->object->_serialized_columns[] = $column;
181
+ }
182
+ function unserialize_columns($object)
183
+ {
184
+ foreach ($this->object->_serialized_columns as $column) {
185
+ if (isset($object->{$column}) && is_string($object->{$column})) {
186
+ $object->{$column} = C_NextGen_Serializable::unserialize($object->{$column});
187
+ }
188
+ }
189
+ }
190
+ /**
191
+ * Fetches the first row
192
+ * @param array $conditions (optional)
193
+ * @param object|bool $model (optional)
194
+ * @return null|object
195
+ */
196
+ function find_first($conditions = array(), $model = FALSE)
197
+ {
198
+ $results = $this->object->select()->where_and($conditions)->limit(1, 0)->run_query();
199
+ if ($results) {
200
+ return $model ? $this->object->convert_to_model($results[0]) : $results[0];
201
+ } else {
202
+ return NULL;
203
+ }
204
+ }
205
+ /**
206
+ * Queries all rows
207
+ * @param array $conditions (optional)
208
+ * @param object|bool $model (optional)
209
+ * @return array
210
+ */
211
+ function find_all($conditions = array(), $model = FALSE)
212
+ {
213
+ // Sometimes users will forget that the first parameter is conditions, and think it's $model instead
214
+ if ($conditions === TRUE) {
215
+ $conditions = array();
216
+ $model = TRUE;
217
+ }
218
+ if ($conditions === FALSE) {
219
+ $conditions = array();
220
+ }
221
+ $results = $this->object->select()->where_and($conditions)->run_query();
222
+ if ($results && $model) {
223
+ foreach ($results as &$r) {
224
+ $r = $this->object->convert_to_model($r);
225
+ }
226
+ }
227
+ return $results;
228
+ }
229
+ /**
230
+ * Filters the query using conditions:
231
+ * E.g.
232
+ * array("post_title = %s", "Foo")
233
+ * array(
234
+ * array("post_title = %s", "Foo"),
235
+ *
236
+ * )
237
+ * @param array $conditions (optional)
238
+ * @return self
239
+ */
240
+ function where_and($conditions = array())
241
+ {
242
+ return $this->object->_where($conditions, 'AND');
243
+ }
244
+ /**
245
+ * @param array $conditions (optional)
246
+ * @return self
247
+ */
248
+ function where_or($conditions = array())
249
+ {
250
+ return $this->object->where($conditions, 'OR');
251
+ }
252
+ /**
253
+ * @param array $conditions (optional)
254
+ * @return self
255
+ */
256
+ function where($conditions = array())
257
+ {
258
+ return $this->object->_where($conditions, 'AND');
259
+ }
260
+ /** Parses the where clauses
261
+ * They could look like the following:
262
+ *
263
+ * array(
264
+ * "post_id = 1"
265
+ * array("post_id = %d", 1),
266
+ * )
267
+ *
268
+ * or simply "post_id = 1"
269
+ * @param array|string $conditions
270
+ * @param string $operator
271
+ * @return ExtensibleObject
272
+ */
273
+ function _where($conditions, $operator)
274
+ {
275
+ $where_clauses = array();
276
+ // If conditions is not an array, make it one
277
+ if (!is_array($conditions)) {
278
+ $conditions = array($conditions);
279
+ } elseif (!empty($conditions) && !is_array($conditions[0])) {
280
+ // Just a single condition was passed, but with a bind
281
+ $conditions = array($conditions);
282
+ }
283
+ // Iterate through each condition
284
+ foreach ($conditions as $condition) {
285
+ if (is_string($condition)) {
286
+ $clause = $this->object->_parse_where_clause($condition);
287
+ if ($clause) {
288
+ $where_clauses[] = $clause;
289
+ }
290
+ } else {
291
+ $clause = array_shift($condition);
292
+ $clause = $this->object->_parse_where_clause($clause, $condition);
293
+ if ($clause) {
294
+ $where_clauses[] = $clause;
295
+ }
296
+ }
297
+ }
298
+ // Add where clause to query
299
+ if ($where_clauses) {
300
+ $this->object->_add_where_clause($where_clauses, $operator);
301
+ }
302
+ return $this->object;
303
+ }
304
+ /**
305
+ * Parses a where clause and returns an associative array
306
+ * representing the query
307
+ *
308
+ * E.g. parse_where_clause("post_title = %s", "Foo Bar")
309
+ *
310
+ * @global wpdb $wpdb
311
+ * @param string $condition
312
+ * @return array
313
+ */
314
+ function _parse_where_clause($condition)
315
+ {
316
+ $column = '';
317
+ $operator = '';
318
+ $value = '';
319
+ $numeric = TRUE;
320
+ // Substitute any placeholders
321
+ global $wpdb;
322
+ $binds = func_get_args();
323
+ $binds = isset($binds[1]) ? $binds[1] : array();
324
+ // first argument is the condition
325
+ foreach ($binds as &$bind) {
326
+ // A bind could be an array, used for the 'IN' operator
327
+ // or a simple scalar value. We need to convert arrays
328
+ // into scalar values
329
+ if (is_object($bind)) {
330
+ $bind = (array) $bind;
331
+ }
332
+ if (is_array($bind) && !empty($bind)) {
333
+ foreach ($bind as &$val) {
334
+ if (!is_numeric($val)) {
335
+ $val = '"' . addslashes($val) . '"';
336
+ $numeric = FALSE;
337
+ }
338
+ }
339
+ $bind = implode(',', $bind);
340
+ } else {
341
+ if (is_array($bind) && empty($bind)) {
342
+ $bind = 'NULL';
343
+ } else {
344
+ if (!is_numeric($bind)) {
345
+ $numeric = FALSE;
346
+ }
347
+ }
348
+ }
349
+ }
350
+ if ($binds) {
351
+ $condition = $wpdb->prepare($condition, $binds);
352
+ }
353
+ // Parse the where clause
354
+ if (preg_match("/^[^\\s]+/", $condition, $match)) {
355
+ $column = trim(array_shift($match));
356
+ $condition = str_replace($column, '', $condition);
357
+ }
358
+ if (preg_match("/(NOT )?IN|(NOT )?LIKE|(NOT )?BETWEEN|[=!<>]+/i", $condition, $match)) {
359
+ $operator = trim(array_shift($match));
360
+ $condition = str_replace($operator, '', $condition);
361
+ $operator = strtolower($operator);
362
+ $value = trim($condition);
363
+ }
364
+ // Values will automatically be quoted, so remove them
365
+ // If the value is part of an IN clause or BETWEEN clause and
366
+ // has multiple values, we attempt to split the values apart into an
367
+ // array and iterate over them individually
368
+ if ($operator == 'in') {
369
+ $values = preg_split("/'?\\s?(,)\\s?'?/i", $value);
370
+ } elseif ($operator == 'between') {
371
+ $values = preg_split("/'?\\s?(AND)\\s?'?/i", $value);
372
+ }
373
+ // If there's a single value, treat it as an array so that we
374
+ // can still iterate
375
+ if (empty($values)) {
376
+ $values = array($value);
377
+ }
378
+ foreach ($values as $index => $value) {
379
+ $value = preg_replace("/^(\\()?'/", '', $value);
380
+ $value = preg_replace("/'(\\))?\$/", '', $value);
381
+ $values[$index] = $value;
382
+ }
383
+ if (count($values) > 1) {
384
+ $value = $values;
385
+ }
386
+ // Return the WP Query meta query parameters
387
+ $retval = array('column' => $column, 'value' => $value, 'compare' => strtoupper($operator), 'type' => $numeric ? 'numeric' : 'string');
388
+ return $retval;
389
+ }
390
+ function strip_slashes($stdObject_or_array_or_string)
391
+ {
392
+ /**
393
+ * Some objects have properties that are recursive objects. To avoid this we have to keep track
394
+ * of what objects we've already processed when we're running this method recursively
395
+ */
396
+ static $level = 0;
397
+ static $processed_objects = array();
398
+ $level++;
399
+ $processed_objects[] = $stdObject_or_array_or_string;
400
+ if (is_string($stdObject_or_array_or_string)) {
401
+ $stdObject_or_array_or_string = str_replace("\\'", "'", str_replace('\\"', '"', str_replace("\\\\", "\\", $stdObject_or_array_or_string)));
402
+ } elseif (is_object($stdObject_or_array_or_string) && !in_array($stdObject_or_array_or_string, $processed_objects)) {
403
+ foreach (get_object_vars($stdObject_or_array_or_string) as $key => $val) {
404
+ if ($val != $stdObject_or_array_or_string && $key != '_mapper') {
405
+ $stdObject_or_array_or_string->{$key} = $this->strip_slashes($val);
406
+ }
407
+ }
408
+ $processed_objects[] = $stdObject_or_array_or_string;
409
+ } elseif (is_array($stdObject_or_array_or_string)) {
410
+ foreach ($stdObject_or_array_or_string as $key => $val) {
411
+ if ($key != '_mixins') {
412
+ $stdObject_or_array_or_string[$key] = $this->strip_slashes($val);
413
+ }
414
+ }
415
+ }
416
+ $level--;
417
+ if ($level == 0) {
418
+ $processed_objects = array();
419
+ }
420
+ return $stdObject_or_array_or_string;
421
+ }
422
+ /**
423
+ * Converts a stdObject entity to a model
424
+ * @param object $stdObject
425
+ * @param string|bool $context (optional)
426
+ * @return object
427
+ */
428
+ function convert_to_model($stdObject, $context = FALSE)
429
+ {
430
+ // Create a factory
431
+ $retval = NULL;
432
+ try {
433
+ $this->object->_convert_to_entity($stdObject);
434
+ } catch (Exception $ex) {
435
+ throw new E_InvalidEntityException($ex);
436
+ }
437
+ $retval = $this->object->create($stdObject, $context);
438
+ return $retval;
439
+ }
440
+ /**
441
+ * Determines whether an object is actually a model
442
+ * @param mixed $obj
443
+ * @return bool
444
+ */
445
+ function is_model($obj)
446
+ {
447
+ return is_subclass_of($obj, 'C_DataMapper_Model') or get_class($obj) == 'C_DataMapper_Model';
448
+ }
449
+ /**
450
+ * If a field has no value, then use the default value.
451
+ * @param stdClass|C_DataMapper_Model $object
452
+ */
453
+ function _set_default_value($object)
454
+ {
455
+ $array = NULL;
456
+ $field = NULL;
457
+ $default_value = NULL;
458
+ // The first argument MUST be an object
459
+ if (!is_object($object)) {
460
+ throw new E_InvalidEntityException();
461
+ }
462
+ // This method has two signatures:
463
+ // 1) _set_default_value($object, $field, $default_value)
464
+ // 2) _set_default_value($object, $array_field, $field, $default_value)
465
+ // Handle #1
466
+ $args = func_get_args();
467
+ if (count($args) == 4) {
468
+ list($object, $array, $field, $default_value) = $args;
469
+ if (!isset($object->{$array})) {
470
+ $object->{$array} = array();
471
+ $object->{$array}[$field] = NULL;
472
+ } else {
473
+ $arr =& $object->{$array};
474
+ if (!isset($arr[$field])) {
475
+ $arr[$field] = NULL;
476
+ }
477
+ }
478
+ $array =& $object->{$array};
479
+ $value =& $array[$field];
480
+ if ($value === '' or is_null($value)) {
481
+ $value = $default_value;
482
+ }
483
+ } else {
484
+ list($object, $field, $default_value) = $args;
485
+ if (!isset($object->{$field})) {
486
+ $object->{$field} = NULL;
487
+ }
488
+ $value = $object->{$field};
489
+ if ($value === '' or is_null($value)) {
490
+ $object->{$field} = $default_value;
491
+ }
492
+ }
493
+ }
494
+ function get_defined_column_names()
495
+ {
496
+ return array_keys($this->object->_columns);
497
+ }
498
+ function has_defined_column($name)
499
+ {
500
+ $columns = $this->object->_columns;
501
+ return isset($columns[$name]);
502
+ }
503
+ function cast_columns($entity)
504
+ {
505
+ foreach ($this->object->_columns as $key => $properties) {
506
+ $value = property_exists($entity, $key) ? $entity->{$key} : NULL;
507
+ $default_value = $properties['default_value'];
508
+ if (!is_null($value) && $value !== $default_value) {
509
+ $column_type = $this->object->_columns[$key]['type'];
510
+ if (preg_match("/varchar|text/i", $column_type)) {
511
+ if (!is_array($value) && !is_object($value)) {
512
+ $entity->{$key} = strval($value);
513
+ }
514
+ } else {
515
+ if (preg_match("/decimal|numeric|double|float/i", $column_type)) {
516
+ $entity->{$key} = floatval($value);
517
+ } else {
518
+ if (preg_match("/int/i", $column_type)) {
519
+ $entity->{$key} = intval($value);
520
+ } else {
521
+ if (preg_match("/bool/i", $column_type)) {
522
+ $entity->{$key} = $value ? TRUE : FALSE;
523
+ }
524
+ }
525
+ }
526
+ }
527
+ } else {
528
+ $entity->{$key} = $default_value;
529
+ }
530
+ }
531
+ return $entity;
532
+ }
533
+ }
534
+ /**
535
+ * Provides instance methods for C_CustomPost_DataMapper_Driver
536
+ * @mixin C_CustomPost_DataMapper_Driver
537
+ */
538
+ class Mixin_CustomPost_DataMapper_Driver extends Mixin
539
+ {
540
+ /**
541
+ * Used to select which fields should be returned. NOT currently used by
542
+ * this implementation of the datamapper driver
543
+ * @param string $fields
544
+ * @return C_DataMapper_Driver_Base
545
+ */
546
+ function select($fields = '*')
547
+ {
548
+ $this->object->_query_args = array('post_type' => $this->object->get_object_name(), 'paged' => FALSE, 'fields' => $fields, 'post_status' => 'any', 'datamapper' => TRUE, 'posts_per_page' => -1, 'is_select' => TRUE, 'is_delete' => FALSE);
549
+ return $this->object;
550
+ }
551
+ /**
552
+ * Destroys/deletes an entity from the database
553
+ * @param object|C_DataMapper_Model $entity
554
+ * @param bool $skip_trash (optional) Default = true
555
+ * @return bool
556
+ */
557
+ function destroy($entity, $skip_trash = TRUE)
558
+ {
559
+ $retval = FALSE;
560
+ $key = $this->object->get_primary_key_column();
561
+ // Find the id of the entity
562
+ if (is_object($entity) && isset($entity->{$key})) {
563
+ $id = (int) $entity->{$key};
564
+ } else {
565
+ $id = (int) $entity;
566
+ }
567
+ // If we have an ID, then delete the post
568
+ if (is_integer($id)) {
569
+ // TODO: We assume that we can skip the trash. Is that correct?
570
+ // FYI, Deletes postmeta as wells
571
+ if (is_object(wp_delete_post($id, TRUE))) {
572
+ $retval = TRUE;
573
+ }
574
+ }
575
+ return $retval;
576
+ }
577
+ /**
578
+ * Saves an entity to the database
579
+ * @param object $entity
580
+ * @return int Post ID
581
+ */
582
+ function _save_entity($entity)
583
+ {
584
+ $post = $this->object->_convert_entity_to_post($entity);
585
+ $primary_key = $this->object->get_primary_key_column();
586
+ // TODO: unsilence this. Wordpress 3.9-beta2 is generating an error that should be corrected before its
587
+ // final release.
588
+ if ($post_id = @wp_insert_post($post)) {
589
+ $new_entity = $this->object->find($post_id, TRUE);
590
+ if ($new_entity) {
591
+ foreach ($new_entity->get_entity() as $key => $value) {
592
+ $entity->{$key} = $value;
593
+ }
594
+ }
595
+ // Save properties as post meta
596
+ $this->object->_flush_and_update_postmeta($post_id, $entity instanceof stdClass ? $entity : $entity->get_entity());
597
+ $entity->{$primary_key} = $post_id;
598
+ // Clean cache
599
+ $this->object->_cache = array();
600
+ }
601
+ $entity->id_field = $primary_key;
602
+ return $post_id;
603
+ }
604
+ /**
605
+ * Starts a new DELETE statement
606
+ */
607
+ function delete()
608
+ {
609
+ $this->object->select();
610
+ $this->object->_query_args['is_select'] = FALSE;
611
+ $this->object->_query_args['is_delete'] = TRUE;
612
+ return $this->object;
613
+ }
614
+ /**
615
+ * Returns the title of the post. Used when post_title is not set
616
+ * @param stdClass $entity
617
+ * @return string
618
+ */
619
+ function get_post_title($entity)
620
+ {
621
+ return "Untitled {$this->object->get_object_name()}";
622
+ }
623
+ /**
624
+ * Returns the excerpt of the post. Used when post_excerpt is not set
625
+ * @param stdClass $entity
626
+ * @return string
627
+ */
628
+ function get_post_excerpt($entity)
629
+ {
630
+ return '';
631
+ }
632
+ }
633
+ /**
634
+ * Class C_CustomTable_DataMapper_Driver
635
+ * @mixin C_CustomTable_DataMapper_Driver_Mixin
636
+ */
637
+ class C_CustomTable_DataMapper_Driver extends C_DataMapper_Driver_Base
638
+ {
639
+ /**
640
+ * The WordPress Database Connection
641
+ * @var wpdb
642
+ */
643
+ var $_where_clauses = array();
644
+ var $_order_clauses = array();
645
+ var $_group_by_columns = array();
646
+ var $_limit_clause = '';
647
+ var $_select_clause = '';
648
+ var $_delete_clause = '';
649
+ public $_use_cache = TRUE;
650
+ function define($object_name = FALSE, $context = FALSE)
651
+ {
652
+ parent::define($object_name, $context);
653
+ $this->add_mixin('C_CustomTable_DataMapper_Driver_Mixin');
654
+ $this->implement('I_CustomTable_DataMapper');
655
+ }
656
+ function initialize($object_name = FALSE)
657
+ {
658
+ parent::initialize();
659
+ if (!isset($this->_primary_key_column)) {
660
+ $this->_primary_key_column = $this->_lookup_primary_key_column();
661
+ }
662
+ $this->migrate();
663
+ }
664
+ /**
665
+ * Returns the database connection object for WordPress
666
+ * @global wpdb $wpdb
667
+ * @return wpdb
668
+ */
669
+ function _wpdb()
670
+ {
671
+ global $wpdb;
672
+ return $wpdb;
673
+ }
674
+ /**
675
+ * Looks up the primary key column for this table
676
+ */
677
+ function _lookup_primary_key_column()
678
+ {
679
+ $key = $this->_wpdb()->get_row("SHOW INDEX FROM {$this->get_table_name()} WHERE Key_name='PRIMARY'", ARRAY_A);
680
+ if (!$key) {
681
+ throw new Exception("Please specify the primary key for {$this->get_table_name()}");
682
+ }
683
+ return $key['Column_name'];
684
+ }
685
+ /**
686
+ * Gets the name of the primary key column
687
+ * @return string
688
+ */
689
+ function get_primary_key_column()
690
+ {
691
+ return $this->object->_primary_key_column;
692
+ }
693
+ /**
694
+ * Determines whether we're going to execute a SELECT statement
695
+ * @return boolean
696
+ */
697
+ function is_select_statement()
698
+ {
699
+ return $this->object->_select_clause ? TRUE : FALSE;
700
+ }
701
+ /**
702
+ * Determines if we're going to be executing a DELETE statement
703
+ * @return bool
704
+ */
705
+ function is_delete_statement()
706
+ {
707
+ return $this->object->_delete_clause ? TRUE : FALSE;
708
+ }
709
+ /**
710
+ * Orders the results of the query
711
+ * This method may be used multiple of times to order by more than column
712
+ * @param $order_by
713
+ * @param $direction
714
+ * @return object
715
+ */
716
+ function order_by($order_by, $direction = 'ASC')
717
+ {
718
+ // We treat the rand() function as an exception
719
+ if (preg_match("/rand\\(\\s*\\)/", $order_by)) {
720
+ $order = 'rand()';
721
+ } else {
722
+ $order_by = $this->object->_clean_column($order_by);
723
+ // If the order by clause is a column, then it should be backticked
724
+ if ($this->object->has_column($order_by)) {
725
+ $order_by = "`{$order_by}`";
726
+ }
727
+ $direction = $this->object->_clean_column($direction);
728
+ $order = "{$order_by} {$direction}";
729
+ }
730
+ $this->object->_order_clauses[] = $order;
731
+ return $this->object;
732
+ }
733
+ /**
734
+ * Specifies a limit and optional offset
735
+ * @param integer $max
736
+ * @param integer $offset
737
+ * @return object
738
+ */
739
+ function limit($max, $offset = 0)
740
+ {
741
+ if ($offset) {
742
+ $limit = $this->_wpdb()->prepare("LIMIT %d, %d", max(0, $offset), $max);
743
+ } else {
744
+ $limit = $this->_wpdb()->prepare("LIMIT %d", max(0, $max));
745
+ }
746
+ if ($limit) {
747
+ $this->object->_limit_clause = $limit;
748
+ }
749
+ return $this->object;
750
+ }
751
+ /**
752
+ * Specifics a group by clause for one or more columns
753
+ * @param array|string $columns
754
+ * @return object
755
+ */
756
+ function group_by($columns = array())
757
+ {
758
+ if (!is_array($columns)) {
759
+ $columns = array($columns);
760
+ }
761
+ $this->object->_group_by_columns = array_merge($this->object->_group_by_columns, $columns);
762
+ return $this->object;
763
+ }
764
+ /**
765
+ * Adds a where clause to the driver
766
+ * @param array $where_clauses
767
+ * @param string $join
768
+ */
769
+ function _add_where_clause($where_clauses, $join)
770
+ {
771
+ $clauses = array();
772
+ foreach ($where_clauses as $clause) {
773
+ extract($clause);
774
+ if ($this->object->has_column($column)) {
775
+ $column = "`{$column}`";
776
+ }
777
+ if (!is_array($value)) {
778
+ $value = array($value);
779
+ }
780
+ foreach ($value as $index => $v) {
781
+ $v = $clause['type'] == 'numeric' ? $v : "'{$v}'";
782
+ $value[$index] = $v;
783
+ }
784
+ if ($compare == 'BETWEEN') {
785
+ $value = "{$value[0]} AND {$value[1]}";
786
+ } else {
787
+ $value = implode(', ', $value);
788
+ if (strpos($compare, 'IN') !== FALSE) {
789
+ $value = "({$value})";
790
+ }
791
+ }
792
+ $clauses[] = "{$column} {$compare} {$value}";
793
+ }
794
+ $this->object->_where_clauses[] = implode(" {$join} ", $clauses);
795
+ }
796
+ /**
797
+ * Returns the total number of entities known
798
+ * @return int
799
+ */
800
+ function count()
801
+ {
802
+ $retval = 0;
803
+ $key = $this->object->get_primary_key_column();
804
+ $results = $this->object->run_query("SELECT COUNT(`{$key}`) AS `{$key}` FROM `{$this->object->get_table_name()}`");
805
+ if ($results && isset($results[0]->{$key})) {
806
+ $retval = (int) $results[0]->{$key};
807
+ }
808
+ return $retval;
809
+ }
810
+ /**
811
+ * Run the query
812
+ * @param string|bool $sql (optional) run the specified SQL
813
+ * @param object|bool $model (optional)
814
+ * @param bool $no_entities (optional)
815
+ * @return array
816
+ */
817
+ function run_query($sql = FALSE, $model = FALSE, $no_entities = FALSE)
818
+ {
819
+ $results = FALSE;
820
+ $retval = array();
821
+ // Or generate SQL query
822
+ if (!$sql) {
823
+ $sql = $this->object->get_generated_query($no_entities);
824
+ }
825
+ // If we have a SQL statement to execute, then heck, execute it!
826
+ if ($sql) {
827
+ if ($this->object->debug) {
828
+ var_dump($sql);
829
+ }
830
+ // Try getting the result from cache first
831
+ if ($this->is_select_statement() && $this->object->_use_cache) {
832
+ $results = $this->object->get_from_cache($sql);
833
+ }
834
+ }
835
+ if (!$results) {
836
+ $this->_wpdb()->query($sql);
837
+ $results = $this->_wpdb()->last_result;
838
+ if ($this->is_select_statement()) {
839
+ $this->object->cache($sql, $results);
840
+ }
841
+ }
842
+ if ($results) {
843
+ $retval = array();
844
+ // For each row, create an entity, update it's properties, and add it to the result set
845
+ if ($no_entities) {
846
+ $retval = $results;
847
+ } else {
848
+ $id_field = $this->get_primary_key_column();
849
+ foreach ($results as $row) {
850
+ if ($row) {
851
+ if (isset($row->{$id_field})) {
852
+ if ($model) {
853
+ $retval[] = $this->object->convert_to_model($row);
854
+ } else {
855
+ $retval[] = $this->object->_convert_to_entity($row);
856
+ }
857
+ }
858
+ }
859
+ }
860
+ }
861
+ } elseif ($this->object->debug) {
862
+ var_dump("No entities returned from query");
863
+ }
864
+ // Just a safety check
865
+ if (!$retval) {
866
+ $retval = array();
867
+ }
868
+ return $retval;
869
+ }
870
+ /**
871
+ * Converts an entity to something suitable for inserting into a database column
872
+ * @param object $entity
873
+ * @return array
874
+ */
875
+ function _convert_to_table_data($entity)
876
+ {
877
+ $data = (array) $entity;
878
+ foreach ($data as $key => $value) {
879
+ if (is_array($value)) {
880
+ $data[$key] = $this->object->serialize($value);
881
+ }
882
+ }
883
+ return $data;
884
+ }
885
+ /**
886
+ * Fetches the last row
887
+ * @param array $conditions
888
+ * @return object
889
+ */
890
+ function find_last($conditions = array(), $model = FALSE)
891
+ {
892
+ $retval = NULL;
893
+ // Get row number for the last row
894
+ $this->select()->limit(1)->order_by('date', 'DESC');
895
+ if ($conditions) {
896
+ $this->where_and($conditions);
897
+ }
898
+ $results = $this->run_query();
899
+ if ($results) {
900
+ $retval = $model ? $this->object->convert_to_model($results[0]) : $results[0];
901
+ }
902
+ return $retval;
903
+ }
904
+ function get_column_names()
905
+ {
906
+ return array_keys($this->object->_columns);
907
+ }
908
+ /**
909
+ * Migrates the schema of the database
910
+ */
911
+ function migrate()
912
+ {
913
+ if (!$this->object->_columns) {
914
+ throw new E_ColumnsNotDefinedException("Columns not defined for {$this->get_table_name()}");
915
+ }
916
+ $added = FALSE;
917
+ $removed = FALSE;
918
+ // Add any missing columns
919
+ foreach ($this->object->_columns as $key => $properties) {
920
+ if (!in_array($key, $this->object->_table_columns)) {
921
+ if ($this->object->_add_column($key, $properties['type'], $properties['default_value'])) {
922
+ $added = TRUE;
923
+ }
924
+ }
925
+ }
926
+ // Remove any columns not defined
927
+ // foreach ($this->object->_table_columns as $key) {
928
+ // if (!isset($this->object->_columns[$key])) {
929
+ // $this->object->_remove_column($key);
930
+ // $removed = TRUE;
931
+ // }
932
+ // }
933
+ if ($added or $removed) {
934
+ // var_dump($this->object->_table_columns);
935
+ $this->object->lookup_columns();
936
+ // var_dump($added, $removed);
937
+ }
938
+ }
939
+ function _init()
940
+ {
941
+ $this->object->_where_clauses = array();
942
+ $this->object->_order_clauses = array();
943
+ $this->object->_group_by_columns = array();
944
+ $this->object->_limit_clause = '';
945
+ $this->object->_select_clause = '';
946
+ }
947
+ }
948
+ /**
949
+ * Provides instance methods for C_CustomTable_DataMapper_Driver
950
+ * @mixin C_CustomTable_DataMapper_Driver
951
+ */
952
+ class C_CustomTable_DataMapper_Driver_Mixin extends Mixin
953
+ {
954
+ /**
955
+ * Selects which fields to collect from the table.
956
+ * NOTE: Not protected from SQL injection - DO NOT let your users specify DB columns
957
+ * @param string $fields
958
+ * @return object
959
+ */
960
+ function select($fields = NULL)
961
+ {
962
+ // Create a fresh slate
963
+ $this->object->_init();
964
+ if (!$fields or $fields == '*') {
965
+ $fields = $this->get_table_name() . '.*';
966
+ }
967
+ $this->object->_select_clause = "SELECT {$fields}";
968
+ return $this->object;
969
+ }
970
+ /**
971
+ * Start a delete statement
972
+ */
973
+ function delete()
974
+ {
975
+ // Create a fresh slate
976
+ $this->object->_init();
977
+ $this->object->_delete_clause = "DELETE";
978
+ return $this->object;
979
+ }
980
+ /**
981
+ * Stores the entity
982
+ * @param object $entity
983
+ * @return bool|object
984
+ */
985
+ function _save_entity($entity)
986
+ {
987
+ $retval = FALSE;
988
+ unset($entity->id_field);
989
+ $primary_key = $this->object->get_primary_key_column();
990
+ if (isset($entity->{$primary_key}) && $entity->{$primary_key} > 0) {
991
+ if ($this->object->_update($entity)) {
992
+ $retval = intval($entity->{$primary_key});
993
+ }
994
+ } else {
995
+ $retval = $this->object->_create($entity);
996
+ if ($retval) {
997
+ $new_entity = $this->object->find($retval);
998
+ foreach ($new_entity as $key => $value) {
999
+ $entity->{$key} = $value;
1000
+ }
1001
+ }
1002
+ }
1003
+ $entity->id_field = $primary_key;
1004
+ // Clean cache
1005
+ if ($retval) {
1006
+ $this->object->_cache = array();
1007
+ }
1008
+ return $retval;
1009
+ }
1010
+ /**
1011
+ * Destroys/deletes an entity
1012
+ * @param object|C_DataMapper_Model|int $entity
1013
+ * @return boolean
1014
+ */
1015
+ function destroy($entity)
1016
+ {
1017
+ $retval = FALSE;
1018
+ $key = $this->object->get_primary_key_column();
1019
+ // Find the id of the entity
1020
+ if (is_object($entity) && isset($entity->{$key})) {
1021
+ $id = (int) $entity->{$key};
1022
+ } else {
1023
+ $id = (int) $entity;
1024
+ }
1025
+ // If we have an ID, then delete the post
1026
+ if (is_numeric($id)) {
1027
+ $sql = $this->object->_wpdb()->prepare("DELETE FROM `{$this->object->get_table_name()}` WHERE {$key} = %s", $id);
1028
+ $retval = $this->object->_wpdb()->query($sql);
1029
+ }
1030
+ return $retval;
1031
+ }
1032
+ /**
1033
+ * Creates a new record in the database
1034
+ * @param object $entity
1035
+ * @return boolean
1036
+ */
1037
+ function _create($entity)
1038
+ {
1039
+ $retval = FALSE;
1040
+ $id = $this->object->_wpdb()->insert($this->object->get_table_name(), $this->object->_convert_to_table_data($entity));
1041
+ if ($id) {
1042
+ $key = $this->object->get_primary_key_column();
1043
+ $retval = $entity->{$key} = intval($this->object->_wpdb()->insert_id);
1044
+ }
1045
+ return $retval;
1046
+ }
1047
+ /**
1048
+ * Updates a record in the database
1049
+ * @param object $entity
1050
+ * @return int|bool
1051
+ */
1052
+ function _update($entity)
1053
+ {
1054
+ $key = $this->object->get_primary_key_column();
1055
+ return $this->object->_wpdb()->update($this->object->get_table_name(), $this->object->_convert_to_table_data($entity), array($key => $entity->{$key}));
1056
+ }
1057
+ function _add_column($column_name, $datatype, $default_value = NULL)
1058
+ {
1059
+ $sql = "ALTER TABLE `{$this->get_table_name()}` ADD COLUMN `{$column_name}` {$datatype}";
1060
+ if ($default_value) {
1061
+ if (is_string($default_value)) {
1062
+ $default_value = str_replace("'", "\\'", $default_value);
1063
+ }
1064
+ $sql .= " NOT NULL DEFAULT " . (is_string($default_value) ? "'{$default_value}" : "{$default_value}");
1065
+ }
1066
+ $return = $this->object->_wpdb()->query($sql) ? TRUE : FALSE;
1067
+ $this->object->update_columns_cache();
1068
+ return $return;
1069
+ }
1070
+ function _remove_column($column_name)
1071
+ {
1072
+ $sql = "ALTER TABLE `{$this->get_table_name()}` DROP COLUMN `{$column_name}`";
1073
+ $return = $this->object->_wpdb()->query($sql) ? TRUE : FALSE;
1074
+ $this->object->update_columns_cache();
1075
+ return $return;
1076
+ }
1077
+ /**
1078
+ * Returns the generated SQL query to be executed
1079
+ * @param bool $no_entities Default = false
1080
+ * @return string
1081
+ */
1082
+ function get_generated_query($no_entities = FALSE)
1083
+ {
1084
+ $sql = array();
1085
+ if ($this->object->is_select_statement()) {
1086
+ $sql[] = $this->object->_select_clause;
1087
+ } elseif ($this->object->is_delete_statement()) {
1088
+ $sql[] = $this->object->_delete_clause;
1089
+ }
1090
+ $sql[] = 'FROM `' . $this->object->get_table_name() . '`';
1091
+ $where_clauses = array();
1092
+ foreach ($this->object->_where_clauses as $where) {
1093
+ $where_clauses[] = '(' . $where . ')';
1094
+ }
1095
+ if ($where_clauses) {
1096
+ $sql[] = 'WHERE ' . implode(' AND ', $where_clauses);
1097
+ }
1098
+ if ($this->object->is_select_statement()) {
1099
+ if ($this->object->_group_by_columns) {
1100
+ $sql[] = 'GROUP BY ' . implode(', ', $this->object->_group_by_columns);
1101
+ }
1102
+ if ($this->object->_order_clauses) {
1103
+ $sql[] = 'ORDER BY ' . implode(', ', $this->object->_order_clauses);
1104
+ }
1105
+ if ($this->object->_limit_clause) {
1106
+ $sql[] = $this->object->_limit_clause;
1107
+ }
1108
+ }
1109
+ return implode(' ', $sql);
1110
+ }
1111
+ }
1112
+ /**
1113
+ * Thrown when an entity does not exist
1114
+ */
1115
+ class E_EntityNotFoundException extends E_NggErrorException
1116
+ {
1117
+ }
1118
+ class E_ColumnsNotDefinedException extends E_NggErrorException
1119
+ {
1120
+ }
1121
+ /**
1122
+ * Thrown when an invalid data type is used as an entity, such as an associative
1123
+ * array which is not yet supported due to a problem with references and the
1124
+ * call_user_func_array() function.
1125
+ */
1126
+ class E_InvalidEntityException extends E_NggErrorException
1127
+ {
1128
+ function __construct($message_or_previous = FALSE, $code = 0, $previous = NULL)
1129
+ {
1130
+ // We don't know if we have been passed a message yet or not
1131
+ $message = FALSE;
1132
+ // Determine if the first parameter is a string or exception
1133
+ if ($message_or_previous) {
1134
+ if (is_string($message_or_previous)) {
1135
+ $message = $message_or_previous;
1136
+ } else {
1137
+ $previous = $message_or_previous;
1138
+ }
1139
+ }
1140
+ // If no message was provided, create a default message
1141
+ if (!$message) {
1142
+ $message = "Invalid data type used for entity. Please use stdClass\n\t\t\t\tor a subclass of C_DataMapper_Model. Arrays will be supported in\n\t\t\t\tthe future.";
1143
+ }
1144
+ parent::__construct($message, $code);
1145
+ }
1146
+ }
1147
+ /**
1148
+ * Class C_CustomPost_DataMapper_Driver
1149
+ * @mixin Mixin_CustomPost_DataMapper_Driver
1150
+ * @implements I_CustomPost_DataMapper
1151
+ */
1152
+ class C_CustomPost_DataMapper_Driver extends C_DataMapper_Driver_Base
1153
+ {
1154
+ var $_query_args = array();
1155
+ var $_primary_key_column = 'ID';
1156
+ static $_post_table_columns = array();
1157
+ public $_use_cache = TRUE;
1158
+ function define($object_name = FALSE, $context = FALSE)
1159
+ {
1160
+ if (strlen($object_name) > 20) {
1161
+ throw new Exception("The custom post name can be no longer than 20 characters long");
1162
+ }
1163
+ parent::define($object_name, $context);
1164
+ $this->add_mixin('Mixin_CustomPost_DataMapper_Driver');
1165
+ $this->implement('I_CustomPost_DataMapper');
1166
+ }
1167
+ function lookup_columns()
1168
+ {
1169
+ if (empty(self::$_post_table_columns)) {
1170
+ $columns = parent::lookup_columns();
1171
+ foreach ($columns as $column) {
1172
+ self::$_post_table_columns[] = $column;
1173
+ }
1174
+ } else {
1175
+ foreach (self::$_post_table_columns as $column) {
1176
+ $this->_table_columns[] = $column;
1177
+ }
1178
+ }
1179
+ }
1180
+ /**
1181
+ * Gets the name of the table
1182
+ * @global string $table_prefix
1183
+ * @return string
1184
+ */
1185
+ function get_table_name()
1186
+ {
1187
+ global $table_prefix;
1188
+ return $table_prefix . 'posts';
1189
+ }
1190
+ /**
1191
+ * Returns a list of querable table columns for posts
1192
+ * @return array
1193
+ */
1194
+ function _get_querable_table_columns()
1195
+ {
1196
+ return array('name', 'author', 'date', 'title', 'modified', 'menu_order', 'parent', 'ID', 'rand', 'comment_count');
1197
+ }
1198
+ /**
1199
+ * Specifies an order clause
1200
+ * @param string $order_by
1201
+ * @param string $direction
1202
+ * @return C_DataMapper_Driver_Base
1203
+ */
1204
+ function order_by($order_by, $direction = 'ASC')
1205
+ {
1206
+ // Make an exception for the rand() method
1207
+ $order_by = preg_replace("/rand\\(\\s*\\)/", 'rand', $order_by);
1208
+ if (in_array($order_by, $this->object->_get_querable_table_columns())) {
1209
+ $this->object->_query_args['orderby'] = $order_by;
1210
+ } else {
1211
+ // ordering by a meta value
1212
+ $this->object->_query_args['orderby'] = 'meta_value';
1213
+ $this->object->_query_args['meta_key'] = $order_by;
1214
+ }
1215
+ $this->object->_query_args['order'] = $direction;
1216
+ return $this->object;
1217
+ }
1218
+ /**
1219
+ * Specifies a limit and optional offset
1220
+ * @param int $max
1221
+ * @param int|bool $offset (optional)
1222
+ * @return object
1223
+ */
1224
+ function limit($max, $offset = FALSE)
1225
+ {
1226
+ if ($max) {
1227
+ $this->object->_query_args['paged'] = TRUE;
1228
+ if ($offset) {
1229
+ $this->object->_query_args['offset'] = $offset;
1230
+ } else {
1231
+ unset($this->object->_query_args['offset']);
1232
+ }
1233
+ $this->object->_query_args['posts_per_page'] = $max;
1234
+ }
1235
+ return $this->object;
1236
+ }
1237
+ /**
1238
+ * Specifies a list of columns to group by
1239
+ * @param array|string $columns
1240
+ * @return object
1241
+ */
1242
+ function group_by($columns = array())
1243
+ {
1244
+ if (!isset($this->object->_query_args['group_by_columns'])) {
1245
+ $this->object->_query_args['group_by_columns'] = $columns;
1246
+ } else {
1247
+ $this->object->_query_args['group_by_columns'] = array_merge($this->object->_query_args['group_by_columns'], $columns);
1248
+ }
1249
+ return $this->object;
1250
+ }
1251
+ /**
1252
+ * Adds a WP_Query where clause
1253
+ * @param array $where_clauses
1254
+ * @param string $join
1255
+ */
1256
+ function _add_where_clause($where_clauses, $join)
1257
+ {
1258
+ foreach ($where_clauses as $clause) {
1259
+ // $clause => array(
1260
+ // 'column' => 'ID',
1261
+ // 'value' => 1210,
1262
+ // 'compare' => '='
1263
+ // )
1264
+ // Determine where what the where clause is comparing
1265
+ switch ($clause['column']) {
1266
+ case 'author':
1267
+ case 'author_id':
1268
+ $this->object->_query_args['author'] = $clause['value'];
1269
+ break;
1270
+ case 'author_name':
1271
+ $this->object->_query_args['author_name'] = $clause['value'];
1272
+ break;
1273
+ case 'cat':
1274
+ case 'cat_id':
1275
+ case 'category_id':
1276
+ switch ($clause['compare']) {
1277
+ case '=':
1278
+ case 'BETWEEN':
1279
+ case 'IN':
1280
+ if (!isset($this->object->_query_args['category__in'])) {
1281
+ $this->object->_query_args['category__in'] = array();
1282
+ }
1283
+ $this->object->_query_args['category__in'][] = $clause['value'];
1284
+ break;
1285
+ case '!=':
1286
+ case 'NOT BETWEEN':
1287
+ case 'NOT IN':
1288
+ if (!isset($this->object->_query_args['category__not_in'])) {
1289
+ $this->object->_query_args['category__not_in'] = array();
1290
+ }
1291
+ $this->object->_query_args['category__not_in'][] = $clause['value'];
1292
+ break;
1293
+ }
1294
+ break;
1295
+ case 'category_name':
1296
+ $this->object->_query_args['category_name'] = $clause['value'];
1297
+ break;
1298
+ case 'post_id':
1299
+ case $this->object->get_primary_key_column():
1300
+ switch ($clause['compare']) {
1301
+ case '=':
1302
+ case 'IN':
1303
+ case 'BETWEEN':
1304
+ if (!isset($this->object->_query_args['post__in'])) {
1305
+ $this->object->_query_args['post__in'] = array();
1306
+ }
1307
+ $this->object->_query_args['post__in'][] = $clause['value'];
1308
+ break;
1309
+ default:
1310
+ if (!isset($this->object->_query_args['post__not_in'])) {
1311
+ $this->object->_query_args['post__not_in'] = array();
1312
+ }
1313
+ $this->object->_query_args['post__not_in'][] = $clause['value'];
1314
+ break;
1315
+ }
1316
+ break;
1317
+ case 'pagename':
1318
+ case 'postname':
1319
+ case 'page_name':
1320
+ case 'post_name':
1321
+ if ($clause['compare'] == 'LIKE') {
1322
+ $this->object->_query_args['page_name__like'] = $clause['value'];
1323
+ } elseif ($clause['compare'] == '=') {
1324
+ $this->object->_query_args['pagename'] = $clause['value'];
1325
+ } elseif ($clause['compare'] == 'IN') {
1326
+ $this->object->_query_args['page_name__in'] = $clause['value'];
1327
+ }
1328
+ break;
1329
+ case 'post_title':
1330
+ // Post title uses custom WHERE clause
1331
+ if ($clause['compare'] == 'LIKE') {
1332
+ $this->object->_query_args['post_title__like'] = $clause['value'];
1333
+ } else {
1334
+ $this->object->_query_args['post_title'] = $clause['value'];
1335
+ }
1336
+ break;
1337
+ default:
1338
+ // Must be metadata
1339
+ $clause['key'] = $clause['column'];
1340
+ unset($clause['column']);
1341
+ // Convert values to array, when required
1342
+ if (in_array($clause['compare'], array('IN', 'BETWEEN'))) {
1343
+ $clause['value'] = explode(',', $clause['value']);
1344
+ foreach ($clause['value'] as &$val) {
1345
+ if (!is_numeric($val)) {
1346
+ // In the _parse_where_clause() method, we
1347
+ // quote the strings and add slashes
1348
+ $val = stripslashes($val);
1349
+ $val = substr($val, 1, strlen($val) - 2);
1350
+ }
1351
+ }
1352
+ }
1353
+ if (!isset($this->object->_query_args['meta_query'])) {
1354
+ $this->object->_query_args['meta_query'] = array();
1355
+ }
1356
+ $this->object->_query_args['meta_query'][] = $clause;
1357
+ break;
1358
+ }
1359
+ }
1360
+ // If any where clauses have been added, specify how the conditions
1361
+ // will be conbined/joined
1362
+ if (isset($this->object->_query_args['meta_query'])) {
1363
+ $this->object->_query_args['meta_query']['relation'] = $join;
1364
+ }
1365
+ }
1366
+ /**
1367
+ * Converts a post to an entity
1368
+ * @param \stdClass $post
1369
+ * @param boolean $model
1370
+ * @return \stdClass
1371
+ */
1372
+ function convert_post_to_entity($post, $model = FALSE)
1373
+ {
1374
+ $entity = new stdClass();
1375
+ // Unserialize the post_content_filtered field
1376
+ if (is_string($post->post_content_filtered)) {
1377
+ if ($post_content = $this->object->unserialize($post->post_content_filtered)) {
1378
+ foreach ($post_content as $key => $value) {
1379
+ $post->{$key} = $value;
1380
+ }
1381
+ }
1382
+ }
1383
+ // Unserialize the post content field
1384
+ if (is_string($post->post_content)) {
1385
+ if ($post_content = $this->object->unserialize($post->post_content)) {
1386
+ foreach ($post_content as $key => $value) {
1387
+ $post->{$key} = $value;
1388
+ }
1389
+ }
1390
+ }
1391
+ // Copy post fields to entity
1392
+ unset($post->post_content);
1393
+ unset($post->post_content_filtered);
1394
+ foreach ($post as $key => $value) {
1395
+ $entity->{$key} = $value;
1396
+ }
1397
+ $this->object->_convert_to_entity($entity);
1398
+ return $model ? $this->object->convert_to_model($entity) : $entity;
1399
+ }
1400
+ /**
1401
+ * Converts an entity to a post
1402
+ * @param object $entity
1403
+ * @return object
1404
+ */
1405
+ function _convert_entity_to_post($entity)
1406
+ {
1407
+ // Was a model passed instead of an entity?
1408
+ $post = $entity;
1409
+ if (!$entity instanceof stdClass) {
1410
+ $post = $entity->get_entity();
1411
+ }
1412
+ // Create the post content
1413
+ $post_content = clone $post;
1414
+ foreach ($this->object->_table_columns as $column) {
1415
+ unset($post_content->{$column});
1416
+ }
1417
+ unset($post->id_field);
1418
+ unset($post->post_content_filtered);
1419
+ unset($post->post_content);
1420
+ $post->post_content = $this->object->serialize($post_content);
1421
+ $post->post_content_filtered = $post->post_content;
1422
+ $post->post_type = $this->object->get_object_name();
1423
+ // Sometimes an entity can contain a data stored in an array or object
1424
+ // Those will be removed from the post, and serialized in the
1425
+ // post_content field
1426
+ foreach ($post as $key => $value) {
1427
+ if (in_array(strtolower(gettype($value)), array('object', 'array'))) {
1428
+ unset($post->{$key});
1429
+ }
1430
+ }
1431
+ // A post required a title
1432
+ if (!property_exists($post, 'post_title')) {
1433
+ $post->post_title = $this->object->get_post_title($post);
1434
+ }
1435
+ // A post also requires an excerpt
1436
+ if (!property_exists($post, 'post_excerpt')) {
1437
+ $post->post_excerpt = $this->object->get_post_excerpt($post);
1438
+ }
1439
+ return $post;
1440
+ }
1441
+ /**
1442
+ * Returns the WordPress database class
1443
+ * @global wpdb $wpdb
1444
+ * @return wpdb
1445
+ */
1446
+ function _wpdb()
1447
+ {
1448
+ global $wpdb;
1449
+ return $wpdb;
1450
+ }
1451
+ /**
1452
+ * Flush and update all postmeta for a particular post
1453
+ * @param int $post_id
1454
+ */
1455
+ function _flush_and_update_postmeta($post_id, $entity, $omit = array())
1456
+ {
1457
+ // We need to insert post meta data for each property
1458
+ // Unfortunately, that means flushing all existing postmeta
1459
+ // and then inserting new values. Depending on the number of
1460
+ // properties, this could be slow. So, we directly access the database
1461
+ /* @var $wpdb wpdb */
1462
+ global $wpdb;
1463
+ if (!is_array($omit)) {
1464
+ $omit = array($omit);
1465
+ }
1466
+ // By default, we omit creating meta values for columns in the posts table
1467
+ $omit = array_merge($omit, $this->object->_table_columns);
1468
+ // Delete the existing meta values
1469
+ $wpdb->query($wpdb->prepare("DELETE FROM {$wpdb->postmeta} WHERE post_id = %s", $post_id));
1470
+ // Create query for new meta values
1471
+ $sql_parts = array();
1472
+ foreach ($entity as $key => $value) {
1473
+ if (in_array($key, $omit)) {
1474
+ continue;
1475
+ }
1476
+ if (is_array($value) or is_object($value)) {
1477
+ $value = $this->object->serialize($value);
1478
+ }
1479
+ $sql_parts[] = $wpdb->prepare("(%s, %s, %s)", $post_id, $key, $value);
1480
+ }
1481
+ $wpdb->query("INSERT INTO {$wpdb->postmeta} (post_id, meta_key, meta_value) VALUES " . implode(',', $sql_parts));
1482
+ }
1483
+ /**
1484
+ * Determines whether the current statement is SELECT
1485
+ * @return boolean
1486
+ */
1487
+ function is_select_statement()
1488
+ {
1489
+ return isset($this->object->_query_args['is_select']) && $this->object->_query_args['is_select'];
1490
+ }
1491
+ /**
1492
+ * Determines whether the current statement is DELETE
1493
+ * @return bool
1494
+ */
1495
+ function is_delete_statement()
1496
+ {
1497
+ return isset($this->object->_query_args['is_delete']) && $this->object->_query_args['is_delete'];
1498
+ }
1499
+ /**
1500
+ * Runs the query
1501
+ * @param string|bool $sql (optional) Run the specified query
1502
+ * @param object|bool $model (optional)
1503
+ * @param bool $convert_to_entities (optional) Default = true
1504
+ * @return array
1505
+ */
1506
+ function run_query($sql = FALSE, $model = FALSE, $convert_to_entities = TRUE)
1507
+ {
1508
+ $retval = array();
1509
+ $results = array();
1510
+ // All of our custom fields are stored as post meta, but is also stored as a serialized
1511
+ // value in the post_content field. Because of this, we don't need to look up and cache the
1512
+ // post meta values
1513
+ $this->object->_query_args['update_post_meta_cache'] = FALSE;
1514
+ $this->object->_query_args['update_post_meta_cache'] = FALSE;
1515
+ $this->object->_query_args['no_found_posts'] = FALSE;
1516
+ // Don't cache any manual SQL query
1517
+ if ($sql) {
1518
+ $this->object->_query_args['cache_results'] = FALSE;
1519
+ $this->object->_query_args['custom_sql'] = $sql;
1520
+ }
1521
+ // If this is a select query, then try fetching the results from cache
1522
+ $cache_key = md5(json_encode($this->object->_query_args));
1523
+ if ($this->is_select_statement() && $this->object->_use_cache) {
1524
+ $results = $this->object->get_from_cache($cache_key);
1525
+ }
1526
+ // Execute the query
1527
+ if (!$results) {
1528
+ $query = new WP_Query(array('datamapper' => TRUE));
1529
+ if (isset($this->object->debug)) {
1530
+ $this->object->_query_args['debug'] = TRUE;
1531
+ }
1532
+ $query->query_vars = $this->object->_query_args;
1533
+ add_action('pre_get_posts', array(&$this, 'set_query_args'), PHP_INT_MAX - 1, 1);
1534
+ $results = $query->get_posts();
1535
+ // Cache the result
1536
+ if ($this->is_select_statement()) {
1537
+ $this->object->cache($cache_key, $results);
1538
+ }
1539
+ remove_action('pre_get_posts', array(&$this, 'set_query_args'), PHP_INT_MAX - 1);
1540
+ }
1541
+ // Convert the result
1542
+ if ($convert_to_entities) {
1543
+ foreach ($results as $row) {
1544
+ $retval[] = $this->object->convert_post_to_entity($row, $model);
1545
+ }
1546
+ } else {
1547
+ $retval = $results;
1548
+ }
1549
+ // Ensure that we return an empty array when there are no results
1550
+ if (!$retval) {
1551
+ $retval = array();
1552
+ }
1553
+ return $retval;
1554
+ }
1555
+ /**
1556
+ * Ensure that the query args are set. We need to do this in case a third-party
1557
+ * plugin overrides our query
1558
+ * @param $query
1559
+ */
1560
+ function set_query_args($query)
1561
+ {
1562
+ if ($query->get('datamapper')) {
1563
+ $query->query_vars = $this->object->_query_args;
1564
+ }
1565
+ $filter = isset($query->query_vars['suppress_filters']) ? $query->query_vars['suppress_filters'] : FALSE;
1566
+ $query->query_vars['suppress_filters'] = apply_filters('wpml_suppress_filters', $filter);
1567
+ }
1568
+ /**
1569
+ * Fetches the last row
1570
+ * @param array $conditions (optional)
1571
+ * @param object|bool $model (optional)
1572
+ * @return object
1573
+ */
1574
+ function find_last($conditions = array(), $model = FALSE)
1575
+ {
1576
+ $retval = NULL;
1577
+ // Get row number for the last row
1578
+ $table_name = $this->object->_clean_column($this->object->get_table_name());
1579
+ $object_name = $this->object->_clean_column($this->object->get_object_name());
1580
+ $sql = $this->_wpdb()->prepare("SELECT COUNT(*) FROM {$table_name} WHERE post_type = %s", $object_name);
1581
+ $count = $this->_wpdb()->get_var($sql);
1582
+ $offset = $count - 1;
1583
+ $this->select();
1584
+ if ($conditions) {
1585
+ $this->where_and($conditions);
1586
+ }
1587
+ if ($offset) {
1588
+ $this->limit(1, $offset);
1589
+ }
1590
+ $results = $this->run_query();
1591
+ if ($results) {
1592
+ $retval = $model ? $this->object->convert_to_model($results[0]) : $results[0];
1593
+ }
1594
+ return $retval;
1595
+ }
1596
+ /**
1597
+ * Returns the number of total records/entities that exist
1598
+ * @return int
1599
+ */
1600
+ function count()
1601
+ {
1602
+ $this->object->select($this->object->get_primary_key_column());
1603
+ $retval = $this->object->run_query(FALSE, FALSE, FALSE);
1604
+ return count($retval);
1605
+ }
1606
+ }
1607
+ /**
1608
+ * Provides instance methods for C_DataMapper_Driver_Base
1609
+ * @mixin C_DataMapper_Driver_Base
1610
+ */
1611
+ class Mixin_DataMapper_Driver_Base extends Mixin
1612
+ {
1613
+ /**
1614
+ * Serializes the data
1615
+ *
1616
+ * @param mixed $value
1617
+ * @return string
1618
+ */
1619
+ function serialize($value)
1620
+ {
1621
+ return C_NextGen_Serializable::serialize($value);
1622
+ }
1623
+ /**
1624
+ * Unserializes data using our proprietary format
1625
+ *
1626
+ * @param string $value
1627
+ * @return mixed
1628
+ */
1629
+ function unserialize($value)
1630
+ {
1631
+ return C_NextGen_Serializable::unserialize($value);
1632
+ }
1633
+ /**
1634
+ * Finds a partiular entry by id
1635
+ * @param int|stdClass|C_DataMapper_Model $entity
1636
+ * @param object|bool $model (optional)
1637
+ * @return null|object
1638
+ */
1639
+ function find($entity, $model = FALSE)
1640
+ {
1641
+ $retval = NULL;
1642
+ // Get primary key of the entity
1643
+ $pkey = $this->object->get_primary_key_column();
1644
+ if (!is_numeric($entity)) {
1645
+ $entity = isset($entity->{$pkey}) ? intval($entity->{$pkey}) : FALSE;
1646
+ }
1647
+ // If we have an entity ID, then get the record
1648
+ if ($entity) {
1649
+ $results = $this->object->select()->where_and(array("{$pkey} = %d", $entity))->limit(1, 0)->run_query();
1650
+ if ($results) {
1651
+ $retval = $model ? $this->object->convert_to_model($results[0]) : $results[0];
1652
+ }
1653
+ }
1654
+ return $retval;
1655
+ }
1656
+ /**
1657
+ * Converts a stdObject to an Entity
1658
+ * @param object $stdObject
1659
+ * @return object
1660
+ */
1661
+ function _convert_to_entity($stdObject)
1662
+ {
1663
+ // Add name of the id_field to the entity, and convert
1664
+ // the ID to an integer
1665
+ $stdObject->id_field = $key = $this->object->get_primary_key_column();
1666
+ // Cast columns to their appropriate data type
1667
+ $this->cast_columns($stdObject);
1668
+ // Strip slashes
1669
+ $this->strip_slashes($stdObject);
1670
+ // Unserialize columns
1671
+ $this->unserialize_columns($stdObject);
1672
+ // Set defaults for this entity
1673
+ if (!$this->has_default_values($stdObject)) {
1674
+ $this->object->set_defaults($stdObject);
1675
+ $stdObject->__defaults_set = TRUE;
1676
+ }
1677
+ return $stdObject;
1678
+ }
1679
+ /**
1680
+ * Creates a new model
1681
+ * @param object|array $properties (optional)
1682
+ * @param string|bool $context (optional)
1683
+ * @return C_DataMapper_Model
1684
+ */
1685
+ function create($properties = array(), $context = FALSE)
1686
+ {
1687
+ $entity = $properties;
1688
+ $factory = C_Component_Factory::get_instance();
1689
+ if (!is_object($properties)) {
1690
+ $entity = new stdClass();
1691
+ foreach ($properties as $k => $v) {
1692
+ $entity->{$k} = $v;
1693
+ }
1694
+ }
1695
+ return $factory->create($this->object->get_model_factory_method(), $entity, $this->object, $context);
1696
+ }
1697
+ /**
1698
+ * Saves an entity
1699
+ * @param stdClass|C_DataMapper_Model $entity
1700
+ * @return bool|int Resulting ID or false upon failure
1701
+ */
1702
+ function save($entity)
1703
+ {
1704
+ $retval = FALSE;
1705
+ $model = $entity;
1706
+ $this->flush_query_cache();
1707
+ // Attempt to use something else, most likely an associative array
1708
+ // TODO: Support assocative arrays. The trick is to support references
1709
+ // with dynamic calls using __call() and call_user_func_array().
1710
+ if (is_array($entity)) {
1711
+ throw new E_InvalidEntityException();
1712
+ } elseif (!$this->object->is_model($entity)) {
1713
+ unset($entity->__defaults_set);
1714
+ $model = $this->object->convert_to_model($entity);
1715
+ }
1716
+ // Validate the model
1717
+ $model->validate();
1718
+ if ($model->is_valid()) {
1719
+ $saved_entity = $model->get_entity();
1720
+ unset($saved_entity->_errors);
1721
+ $retval = $this->object->_save_entity($saved_entity);
1722
+ }
1723
+ $this->flush_query_cache();
1724
+ // We always return the same type of entity that we given
1725
+ if (get_class($entity) == 'stdClass') {
1726
+ $model->get_entity();
1727
+ }
1728
+ return $retval;
1729
+ }
1730
+ /**
1731
+ * Gets validation errors for the entity
1732
+ * @param stdClass|C_DataMapper_Model $entity
1733
+ * @return array
1734
+ */
1735
+ function get_errors($entity)
1736
+ {
1737
+ $model = $entity;
1738
+ if (!$this->object->is_model($entity)) {
1739
+ $model = $this->object->convert_to_model($entity);
1740
+ }
1741
+ $model->validate();
1742
+ return $model->get_errors();
1743
+ }
1744
+ /**
1745
+ * Called to set defaults for the record/model/entity.
1746
+ * Subclasses and adapters should extend this method to provide their
1747
+ * implementation. The implementation should make use of the
1748
+ * _set_default_value() method
1749
+ * @param object $stdObject
1750
+ */
1751
+ function set_defaults($stdObject)
1752
+ {
1753
+ }
1754
+ function has_default_values($entity)
1755
+ {
1756
+ return isset($entity->__defaults_set) && $entity->__defaults_set == TRUE;
1757
+ }
1758
+ function define_column($name, $type, $default_value = NULL)
1759
+ {
1760
+ $this->object->_columns[$name] = array('type' => $type, 'default_value' => $default_value);
1761
+ }
1762
+ }
1763
+ /**
1764
+ * Class C_DataMapper_Model
1765
+ * @mixin Mixin_Validation
1766
+ * @mixin Mixin_DataMapper_Model_Instance_Methods
1767
+ * @mixin Mixin_DataMapper_Model_Validation
1768
+ * @implements I_DataMapper_Model
1769
+ */
1770
+ class C_DataMapper_Model extends C_Component
1771
+ {
1772
+ var $_mapper;
1773
+ var $_stdObject;
1774
+ /**
1775
+ * Define the model
1776
+ */
1777
+ function define($mapper = NULL, $properties = array(), $context = FALSE)
1778
+ {
1779
+ parent::define($context);
1780
+ $this->add_mixin('Mixin_Validation');
1781
+ $this->add_mixin('Mixin_DataMapper_Model_Instance_Methods');
1782
+ $this->add_mixin('Mixin_DataMapper_Model_Validation');
1783
+ $this->implement('I_DataMapper_Model');
1784
+ }
1785
+ /**
1786
+ * Creates a new entity for the specified mapper
1787
+ * @param C_DataMapper_Driver_Base $mapper (optional)
1788
+ * @param array|object|bool $properties (optional)
1789
+ */
1790
+ function initialize($mapper = NULL, $properties = FALSE)
1791
+ {
1792
+ $this->_mapper = $mapper;
1793
+ $this->_stdObject = $properties ? (object) $properties : new stdClass();
1794
+ parent::initialize();
1795
+ if (!$this->has_default_values()) {
1796
+ $this->set_defaults();
1797
+ $this->_stdObject->__defaults_set = TRUE;
1798
+ }
1799
+ }
1800
+ function jsonSerialize()
1801
+ {
1802
+ return $this->get_entity();
1803
+ }
1804
+ function has_default_values()
1805
+ {
1806
+ return isset($this->_stdObject->__defaults_set) && $this->_stdObject->__defaults_set == TRUE;
1807
+ }
1808
+ /**
1809
+ * Gets the data mapper for the entity
1810
+ * @return C_DataMapper_Driver_Base
1811
+ */
1812
+ function get_mapper()
1813
+ {
1814
+ return $this->_mapper;
1815
+ }
1816
+ /**
1817
+ * Gets a property of the model
1818
+ * @param string $property
1819
+ * @return mixed
1820
+ */
1821
+ function &__get($property)
1822
+ {
1823
+ if (isset($this->_stdObject->{$property})) {
1824
+ $retval =& $this->_stdObject->{$property};
1825
+ return $retval;
1826
+ } else {
1827
+ // We need to assign NULL to a variable first, since only
1828
+ // variables can be returned by reference
1829
+ $retval = NULL;
1830
+ return $retval;
1831
+ }
1832
+ }
1833
+ /**
1834
+ * Sets a property for the model
1835
+ * @param mixed $property
1836
+ * @param mixed $value
1837
+ * @return mixed $value
1838
+ */
1839
+ function &__set($property, $value)
1840
+ {
1841
+ $retval = $this->_stdObject->{$property} = $value;
1842
+ return $retval;
1843
+ }
1844
+ function __isset($property_name)
1845
+ {
1846
+ return isset($this->_stdObject->{$property_name});
1847
+ }
1848
+ /**
1849
+ * Saves the entity
1850
+ * @param array $updated_attributes
1851
+ * @return int|bool Object ID or false upon failure
1852
+ */
1853
+ function save($updated_attributes = array())
1854
+ {
1855
+ $this->update_attributes($updated_attributes);
1856
+ return $this->get_mapper()->save($this->get_entity());
1857
+ }
1858
+ /**
1859
+ * Updates the attributes for an object
1860
+ * @param array $array (optional)
1861
+ */
1862
+ function update_attributes($array = array())
1863
+ {
1864
+ foreach ($array as $key => $value) {
1865
+ $this->_stdObject->{$key} = $value;
1866
+ }
1867
+ }
1868
+ /**
1869
+ * Sets the default values for this model
1870
+ */
1871
+ function set_defaults()
1872
+ {
1873
+ $mapper = $this->get_mapper();
1874
+ if ($mapper->has_method('set_defaults')) {
1875
+ $mapper->set_defaults($this);
1876
+ }
1877
+ }
1878
+ /**
1879
+ * Destroys or deletes the entity
1880
+ */
1881
+ function destroy()
1882
+ {
1883
+ return $this->get_mapper()->destroy($this->_stdObject);
1884
+ }
1885
+ /**
1886
+ * Determines whether the object is new or existing
1887
+ * @return bool
1888
+ */
1889
+ function is_new()
1890
+ {
1891
+ return $this->id() ? FALSE : TRUE;
1892
+ }
1893
+ /**
1894
+ * Gets/sets the primary key
1895
+ * @param null|int|string $value (optional)
1896
+ * @return mixed
1897
+ */
1898
+ function id($value = NULL)
1899
+ {
1900
+ $key = $this->get_mapper()->get_primary_key_column();
1901
+ if ($value) {
1902
+ $this->__set($key, $value);
1903
+ }
1904
+ return $this->__get($key);
1905
+ }
1906
+ }
1907
+ /**
1908
+ * This mixin should be overwritten by other modules
1909
+ */
1910
+ class Mixin_DataMapper_Model_Validation extends Mixin
1911
+ {
1912
+ function validation()
1913
+ {
1914
+ return $this->object->is_valid();
1915
+ }
1916
+ }
1917
+ class Mixin_DataMapper_Model_Instance_Methods extends Mixin
1918
+ {
1919
+ /**
1920
+ * Returns the associated entity
1921
+ */
1922
+ function &get_entity()
1923
+ {
1924
+ return $this->object->_stdObject;
1925
+ }
1926
+ }
nextgen-gallery/products/photocrati_nextgen/modules/dynamic_stylesheet/module.dynamic_stylesheet.php ADDED
@@ -0,0 +1,88 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ {
5
+ Module: photocrati-dynamic_stylesheet,
6
+ Depends: { photocrati-mvc }
7
+ }
8
+ */
9
+
10
+ if (!defined('NGG_INLINE_DYNAMIC_CSS')) define('NGG_INLINE_DYNAMIC_CSS', TRUE);
11
+
12
+ class M_Dynamic_Stylesheet extends C_Base_Module
13
+ {
14
+ function define($id = 'pope-module',
15
+ $name = 'Pope Module',
16
+ $description = '',
17
+ $version = '',
18
+ $uri = '',
19
+ $author = '',
20
+ $author_uri = '',
21
+ $context = FALSE)
22
+ {
23
+ parent::define(
24
+ 'photocrati-dynamic_stylesheet',
25
+ 'Dynamic Stylesheet',
26
+ 'Provides the ability to generate and enqueue a dynamic stylesheet',
27
+ '3.0.0',
28
+ 'https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/',
29
+ 'Imagely',
30
+ 'https://www.imagely.com',
31
+ $context
32
+ );
33
+
34
+ C_Photocrati_Installer::add_handler($this->module_id, 'C_Dynamic_Stylesheet_Installer');
35
+ }
36
+
37
+ function _register_utilities()
38
+ {
39
+ $this->get_registry()->add_utility(
40
+ "I_Dynamic_Stylesheet", 'C_Dynamic_Stylesheet_Controller'
41
+ );
42
+ }
43
+
44
+ function _register_hooks()
45
+ {
46
+ add_action('ngg_routes', array(&$this, 'define_routes'));
47
+ add_filter('ngg_non_minified_files', array(&$this, 'do_not_minify'), 10, 2);
48
+ }
49
+
50
+ function do_not_minify($path, $module)
51
+ {
52
+ $retval = FALSE;
53
+
54
+ if ($module == $this->module_id) $retval = TRUE;
55
+
56
+ return $retval;
57
+ }
58
+
59
+ function define_routes($router)
60
+ {
61
+ $app = $router->create_app('/nextgen-dcss');
62
+ $app->rewrite('/{\d}/{*}', '/index--{1}/data--{2}');
63
+ $app->route('/', 'I_Dynamic_Stylesheet#index');
64
+ }
65
+
66
+ function get_type_list()
67
+ {
68
+ return array(
69
+ 'C_Dynamic_Stylesheet_Installer' => 'class.dynamic_stylesheet_installer.php',
70
+ 'C_Dynamic_Stylesheet_Controller' => 'class.dynamic_stylesheet_controller.php'
71
+ );
72
+ }
73
+ }
74
+
75
+ class C_Dynamic_Stylesheet_Installer
76
+ {
77
+ function __construct()
78
+ {
79
+ $this->settings = C_NextGen_Settings::get_instance();
80
+ }
81
+
82
+ function install()
83
+ {
84
+ $this->settings->set_default_value('dynamic_stylesheet_slug', 'nextgen-dcss');
85
+ }
86
+ }
87
+
88
+ new M_Dynamic_Stylesheet;
nextgen-gallery/products/photocrati_nextgen/modules/dynamic_stylesheet/package.module.dynamic_stylesheet.php ADDED
@@ -0,0 +1,126 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Class C_Dynamic_Stylesheet_Controller
4
+ * @mixin Mixin_Dynamic_Stylesheet_Instance_Methods
5
+ * @mixin Mixin_Dynamic_Stylesheet_Actions
6
+ * @implements I_Dynamic_Stylesheet
7
+ */
8
+ class C_Dynamic_Stylesheet_Controller extends C_MVC_Controller
9
+ {
10
+ static $_instances = array();
11
+ var $_known_templates = array();
12
+ var $_app = NULL;
13
+ function define($context = FALSE)
14
+ {
15
+ parent::define($context);
16
+ $this->add_mixin('Mixin_Dynamic_Stylesheet_Instance_Methods');
17
+ $this->add_mixin('Mixin_Dynamic_Stylesheet_Actions');
18
+ $this->implement('I_Dynamic_Stylesheet');
19
+ }
20
+ function initialize()
21
+ {
22
+ parent::initialize();
23
+ $this->_app = C_NextGen_Settings::get_instance()->dynamic_stylesheet_slug;
24
+ }
25
+ static function &get_instance($context = FALSE)
26
+ {
27
+ if (!isset(self::$_instances[$context])) {
28
+ $klass = get_class();
29
+ self::$_instances[$context] = new $klass($context);
30
+ }
31
+ return self::$_instances[$context];
32
+ }
33
+ }
34
+ /**
35
+ * Provides instance methods for the dynamic stylesheet utility
36
+ */
37
+ class Mixin_Dynamic_Stylesheet_Instance_Methods extends Mixin
38
+ {
39
+ /**
40
+ * Registers a template with the dynamic stylesheet utility. A template
41
+ * must be registered before it can be loaded
42
+ * @param string $name
43
+ * @param string $template
44
+ */
45
+ function register($name, $template)
46
+ {
47
+ $this->object->_known_templates[$name] = $template;
48
+ }
49
+ /**
50
+ * Finds a registered template by name
51
+ * @param string $name
52
+ * @return int
53
+ */
54
+ function get_css_template_index($name)
55
+ {
56
+ return array_search($name, array_keys($this->object->_known_templates));
57
+ }
58
+ function get_css_template($index)
59
+ {
60
+ $keys = array_keys($this->object->_known_templates);
61
+ return $this->object->_known_templates[$keys[$index]];
62
+ }
63
+ /**
64
+ * Loads a template, along with the dynamic variables to be interpolated
65
+ * @param string $name
66
+ * @param array $data (optional)
67
+ */
68
+ function enqueue($name, $data = array())
69
+ {
70
+ if (($index = $this->object->get_css_template_index($name)) !== FALSE) {
71
+ if (is_subclass_of($data, 'C_DataMapper_Model')) {
72
+ $data = $data->get_entity();
73
+ }
74
+ if (defined('NGG_INLINE_DYNAMIC_CSS') && NGG_INLINE_DYNAMIC_CSS) {
75
+ $css = $this->render_view($this->object->get_css_template($index), $data, TRUE);
76
+ wp_enqueue_style('ngg_dyncss', $this->get_static_url('photocrati-dynamic_stylesheet#blank.css'), array(), NGG_SCRIPT_VERSION);
77
+ wp_add_inline_style('ngg_dyncss', $css);
78
+ } else {
79
+ $data = $this->object->encode($data);
80
+ wp_enqueue_style('dyncss-' . $index . $data . '@dynamic', $this->object->get_router()->get_url("/{$this->object->_app}", TRUE) . "?index={$index}&data={$data}", FALSE, NGG_SCRIPT_VERSION);
81
+ }
82
+ }
83
+ }
84
+ /**
85
+ * Encodes $data
86
+ *
87
+ * base64 encoding uses '==' to denote the end of the sequence, but keep it out of the url
88
+ * @param $data
89
+ * @return string
90
+ */
91
+ function encode($data)
92
+ {
93
+ $data = json_encode($data);
94
+ $data = base64_encode($data);
95
+ $data = str_replace('/', '\\', $data);
96
+ $data = rtrim($data, '=');
97
+ return $data;
98
+ }
99
+ /**
100
+ * Decodes $data
101
+ *
102
+ * @param $data
103
+ * @return array|mixed
104
+ */
105
+ function decode($data)
106
+ {
107
+ $data = str_replace('\\', '/', $data);
108
+ $data = base64_decode($data . '==');
109
+ $data = json_decode($data);
110
+ return $data;
111
+ }
112
+ }
113
+ /**
114
+ * Provides controller actions for the dynamic stylesheet
115
+ */
116
+ class Mixin_Dynamic_Stylesheet_Actions extends Mixin
117
+ {
118
+ function index_action()
119
+ {
120
+ $this->set_content_type('css');
121
+ if (($data = $this->param('data')) !== FALSE && ($index = $this->param('index')) !== FALSE) {
122
+ $data = $this->object->decode($data);
123
+ $this->render_view($this->object->get_css_template($index), $data);
124
+ }
125
+ }
126
+ }
nextgen-gallery/products/photocrati_nextgen/modules/dynamic_stylesheet/static/blank.css ADDED
@@ -0,0 +1 @@
 
1
+ /* Intentionally blank */
nextgen-gallery/products/photocrati_nextgen/modules/dynamic_stylesheet/static/blank.min.css ADDED
File without changes
nextgen-gallery/products/photocrati_nextgen/modules/dynamic_thumbnails/module.dynamic_thumbnails.php ADDED
@@ -0,0 +1,79 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /***
4
+ {
5
+ Module: photocrati-dynamic_thumbnails
6
+ }
7
+ ***/
8
+ class M_Dynamic_Thumbnails extends C_Base_Module
9
+ {
10
+ function define($id = 'pope-module',
11
+ $name = 'Pope Module',
12
+ $description = '',
13
+ $version = '',
14
+ $uri = '',
15
+ $author = '',
16
+ $author_uri = '',
17
+ $context = FALSE)
18
+ {
19
+ parent::define(
20
+ 'photocrati-dynamic_thumbnails',
21
+ 'Dynamic Thumbnails',
22
+ 'Adds support for dynamic thumbnails',
23
+ '3.9.0',
24
+ 'https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/',
25
+ 'Imagely',
26
+ 'https://www.imagely.com'
27
+ );
28
+
29
+ C_Photocrati_Installer::add_handler($this->module_id, 'C_Dynamic_Thumbnails_Installer');
30
+ }
31
+
32
+ function _register_utilities()
33
+ {
34
+ $this->get_registry()->add_utility('I_Dynamic_Thumbnails_Manager', 'C_Dynamic_Thumbnails_Manager');
35
+ $this->get_registry()->add_utility('I_Dynamic_Thumbnails_Controller', 'C_Dynamic_Thumbnails_Controller');
36
+ }
37
+
38
+ function _register_hooks()
39
+ {
40
+ add_action('ngg_routes', array(&$this, 'define_routes'));
41
+ }
42
+
43
+ function define_routes($router)
44
+ {
45
+ $app = $router->create_app('/nextgen-image');
46
+
47
+ // The C_Dynamic_Thumbnails Controller was created before the new
48
+ // router implementation was conceptualized. It uses it's own mechanism
49
+ // to parse the REQUEST_URI. It should be refactored to use the router's
50
+ // parameter mechanism, but for now - we'll just removed the segments
51
+ // from the router's visibility, and let the Dynamic Thumbnails Controller
52
+ // do it's own parsing
53
+ $app->rewrite('/{*}', '/');
54
+ $app->route('/', 'I_Dynamic_Thumbnails_Controller#index');
55
+ }
56
+
57
+ function get_type_list()
58
+ {
59
+ return array(
60
+ 'C_Dynamic_Thumbnails_Installer' => 'class.dynamic_thumbnails_installer.php',
61
+ 'C_Dynamic_Thumbnails_Controller' => 'class.dynamic_thumbnails_controller.php'
62
+ );
63
+ }
64
+ }
65
+
66
+ class C_Dynamic_Thumbnails_Installer
67
+ {
68
+ function __construct()
69
+ {
70
+ $this->settings = C_NextGen_Settings::get_instance();
71
+ }
72
+
73
+ function install()
74
+ {
75
+ $this->settings->set_default_value('dynamic_thumbnail_slug', 'nextgen-image');
76
+ }
77
+ }
78
+
79
+ new M_Dynamic_Thumbnails();
nextgen-gallery/products/photocrati_nextgen/modules/dynamic_thumbnails/package.module.dynamic_thumbnails.php ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Class C_Dynamic_Thumbnails_Controller
4
+ * @implements I_Dynamic_Thumbnails_Controller
5
+ */
6
+ class C_Dynamic_Thumbnails_Controller extends C_MVC_Controller
7
+ {
8
+ static $_instances = array();
9
+ function define($context = FALSE)
10
+ {
11
+ parent::define($context);
12
+ $this->implement('I_Dynamic_Thumbnails_Controller');
13
+ }
14
+ /**
15
+ * Returns an instance of this class
16
+ *
17
+ * @param string|bool $context
18
+ * @return C_Dynamic_Thumbnails_Controller
19
+ */
20
+ static function get_instance($context = FALSE)
21
+ {
22
+ if (!isset(self::$_instances[$context])) {
23
+ $klass = get_class();
24
+ self::$_instances[$context] = new $klass($context);
25
+ }
26
+ return self::$_instances[$context];
27
+ }
28
+ function index_action($return = FALSE)
29
+ {
30
+ @set_time_limit(0);
31
+ @ini_set('memory_limit', '-1');
32
+ $dynthumbs = C_Dynamic_Thumbnails_Manager::get_instance();
33
+ $uri = $_SERVER['REQUEST_URI'];
34
+ $params = $dynthumbs->get_params_from_uri($uri);
35
+ $request_params = $params;
36
+ if ($params != null) {
37
+ $storage = C_Gallery_Storage::get_instance();
38
+ // Note, URLs should always include quality setting when returned by Gallery Storage component
39
+ // this sanity check is mostly for manually testing URLs
40
+ if (!isset($params['quality'])) {
41
+ // Note: there's a problem when doing this as using the same set of parameters to *retrieve* the image path/URL will lead to a different filename than the one tha was used to *generate* it (which went through here)
42
+ // The statement above about URLs always containing quality setting is not true anymore, this is because we need to retrieve default quality from the imgQuality and thumbquality settings, depending on "full" or "thumbnail" request in the ngglegacy storage
43
+ //$params['quality'] = 100;
44
+ }
45
+ $image_id = $params['image'];
46
+ $size = $dynthumbs->get_size_name($params);
47
+ $abspath = $storage->get_image_abspath($image_id, $size, true);
48
+ $valid = true;
49
+ // Render invalid image if hash check fails
50
+ if ($abspath == null) {
51
+ $uri_plain = $dynthumbs->get_uri_from_params($request_params);
52
+ $hash = wp_hash($uri_plain);
53
+ if (strpos($uri, $hash) === false) {
54
+ $valid = false;
55
+ $filename = M_Static_Assets::get_static_abspath('photocrati-dynamic_thumbnails#invalid_image.png');
56
+ $this->set_content_type('image/png');
57
+ readfile($filename);
58
+ $this->render();
59
+ }
60
+ }
61
+ if ($valid) {
62
+ $storage->render_image($image_id, $size);
63
+ }
64
+ }
65
+ }
66
+ }
nextgen-gallery/products/photocrati_nextgen/modules/dynamic_thumbnails/static/invalid_image.png ADDED
Binary file
nextgen-gallery/products/photocrati_nextgen/modules/frame_communication/module.frame_communication.php ADDED
@@ -0,0 +1,104 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /***
4
+ {
5
+ Module: photocrati-frame_communication,
6
+ Depends: { photocrati-router }
7
+ }
8
+ ***/
9
+
10
+ class M_Frame_Communication extends C_Base_Module
11
+ {
12
+ function define($id = 'pope-module',
13
+ $name = 'Pope Module',
14
+ $description = '',
15
+ $version = '',
16
+ $uri = '',
17
+ $author = '',
18
+ $author_uri = '',
19
+ $context = FALSE)
20
+ {
21
+ parent::define(
22
+ 'photocrati-frame_communication',
23
+ 'Frame/iFrame Inter-Communication',
24
+ 'Provides a means for HTML frames to share server-side events with each other',
25
+ '3.3.21',
26
+ 'https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/',
27
+ 'Imagely',
28
+ 'https://www.imagely.com',
29
+ $context
30
+ );
31
+
32
+ C_NextGen_Settings::get_instance()->add_option_handler('C_Frame_Communication_Option_Handler', array(
33
+ 'frame_event_cookie_name',
34
+ ));
35
+ C_NextGen_Global_Settings::get_instance()->add_option_handler('C_Frame_Communication_Option_Handler', array(
36
+ 'frame_event_cookie_name',
37
+ ));
38
+ }
39
+
40
+ function _register_utilities()
41
+ {
42
+ $this->get_registry()->add_utility(
43
+ 'I_Frame_Event_Publisher', 'C_Frame_Event_Publisher'
44
+ );
45
+ }
46
+
47
+ function _register_hooks()
48
+ {
49
+ add_action('init', array($this, 'register_script'));
50
+ add_filter('ngg_admin_script_handles', array($this, 'add_script_to_ngg_pages'));
51
+ add_action('ngg_enqueue_frame_event_publisher_script', array($this, 'enqueue_script'));
52
+
53
+ // Elementor's editor.php runs `new \WP_Scripts()` which requires we register scripts on both init and this
54
+ // action if we want the attach-to-post code to function (which relies on frame_event_publisher)
55
+ add_action('elementor/editor/before_enqueue_scripts', array($this, 'register_script'));
56
+ }
57
+
58
+ function add_script_to_ngg_pages($scripts)
59
+ {
60
+ $scripts['frame_event_publisher'] = $this->module_version;
61
+ return $scripts;
62
+ }
63
+
64
+ function enqueue_script()
65
+ {
66
+ wp_enqueue_script('frame_event_publisher');
67
+ wp_localize_script(
68
+ 'frame_event_publisher',
69
+ 'frame_event_publisher_domain',
70
+ array(parse_url(site_url(), PHP_URL_HOST))
71
+ );
72
+ }
73
+
74
+
75
+ function register_script()
76
+ {
77
+ $router = C_Router::get_instance();
78
+
79
+ wp_register_script(
80
+ 'frame_event_publisher',
81
+ $router->get_static_url('photocrati-frame_communication#frame_event_publisher.js'),
82
+ array('jquery'),
83
+ $this->module_version
84
+ );
85
+ }
86
+
87
+ function get_type_list()
88
+ {
89
+ return array(
90
+ 'C_Frame_Communication_Option_Handler' => 'class.frame_communication_option_handler.php',
91
+ 'C_Frame_Event_Publisher' => 'class.frame_event_publisher.php'
92
+ );
93
+ }
94
+ }
95
+
96
+ class C_Frame_Communication_Option_Handler
97
+ {
98
+ function get($key, $default='X-Frame-Events')
99
+ {
100
+ return 'X-Frame-Events';
101
+ }
102
+ }
103
+
104
+ new M_Frame_Communication();
nextgen-gallery/products/photocrati_nextgen/modules/frame_communication/package.module.frame_communication.php ADDED
@@ -0,0 +1,74 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Class C_Frame_Event_Publisher
4
+ * @mixin Mixin_Frame_Event_Publisher
5
+ * @implements I_Frame_Event_Publisher
6
+ */
7
+ class C_Frame_Event_Publisher extends C_Component
8
+ {
9
+ static $_instances = array();
10
+ var $setting_name = NULL;
11
+ function define($context = FALSE)
12
+ {
13
+ parent::define($context);
14
+ $this->add_mixin('Mixin_Frame_Event_Publisher');
15
+ $this->implement('I_Frame_Event_Publisher');
16
+ }
17
+ function initialize()
18
+ {
19
+ parent::initialize();
20
+ $this->setting_name = C_NextGen_Settings::get_instance()->frame_event_cookie_name;
21
+ }
22
+ /**
23
+ * Gets an instance of the publisher
24
+ * @param string|bool $context
25
+ * @return C_Frame_Event_Publisher
26
+ */
27
+ static function get_instance($context = FALSE)
28
+ {
29
+ if (!isset(self::$_instances[$context])) {
30
+ $klass = get_class();
31
+ self::$_instances[$context] = new $klass($context);
32
+ }
33
+ return self::$_instances[$context];
34
+ }
35
+ }
36
+ class Mixin_Frame_Event_Publisher extends Mixin
37
+ {
38
+ /**
39
+ * Encodes data for a setting
40
+ * @param array $data
41
+ * @return string
42
+ */
43
+ function _encode($data)
44
+ {
45
+ return rawurlencode(json_encode($data));
46
+ }
47
+ /**
48
+ * Decodes data from a setting
49
+ * @param string $data
50
+ * @return array
51
+ */
52
+ function _decode($data)
53
+ {
54
+ return (array) json_decode(rawurldecode($data));
55
+ }
56
+ /**
57
+ * Adds a setting to the frame events
58
+ * @param array $data
59
+ * @return array
60
+ */
61
+ function add_event($data)
62
+ {
63
+ $id = md5(serialize($data));
64
+ $data['context'] = $this->object->context;
65
+ $write_cookie = TRUE;
66
+ if (defined('XMLRPC_REQUEST')) {
67
+ $write_cookie = XMLRPC_REQUEST == FALSE;
68
+ }
69
+ if ($write_cookie) {
70
+ setrawcookie($this->object->setting_name . '_' . $id, $this->object->_encode($data), time() + 10800, '/', parse_url(site_url(), PHP_URL_HOST));
71
+ }
72
+ return $data;
73
+ }
74
+ }
nextgen-gallery/products/photocrati_nextgen/modules/frame_communication/static/frame_event_publisher.js ADDED
@@ -0,0 +1,191 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ (function(g,f){'use strict';var h=function(e){if("object"!==typeof e.document)throw Error("Cookies.js requires a `window` with a `document` object");var b=function(a,d,c){return 1===arguments.length?b.get(a):b.set(a,d,c)};b._document=e.document;b._cacheKeyPrefix="cookey.";b._maxExpireDate=new Date("Fri, 31 Dec 9999 23:59:59 UTC");b.defaults={path:"/",secure:!1};b.get=function(a){b._cachedDocumentCookie!==b._document.cookie&&b._renewCache();a=b._cache[b._cacheKeyPrefix+a];return a===f?f:decodeURIComponent(a)};
2
+ b.set=function(a,d,c){c=b._getExtendedOptions(c);c.expires=b._getExpiresDate(d===f?-1:c.expires);b._document.cookie=b._generateCookieString(a,d,c);return b};b.expire=function(a,d){return b.set(a,f,d)};b._getExtendedOptions=function(a){return{path:a&&a.path||b.defaults.path,domain:a&&a.domain||b.defaults.domain,expires:a&&a.expires||b.defaults.expires,secure:a&&a.secure!==f?a.secure:b.defaults.secure}};b._isValidDate=function(a){return"[object Date]"===Object.prototype.toString.call(a)&&!isNaN(a.getTime())};
3
+ b._getExpiresDate=function(a,d){d=d||new Date;"number"===typeof a?a=Infinity===a?b._maxExpireDate:new Date(d.getTime()+1E3*a):"string"===typeof a&&(a=new Date(a));if(a&&!b._isValidDate(a))throw Error("`expires` parameter cannot be converted to a valid Date instance");return a};b._generateCookieString=function(a,b,c){a=a.replace(/[^#$&+\^`|]/g,encodeURIComponent);a=a.replace(/\(/g,"%28").replace(/\)/g,"%29");b=(b+"").replace(/[^!#$&-+\--:<-\[\]-~]/g,encodeURIComponent);c=c||{};a=a+"="+b+(c.path?";path="+
4
+ c.path:"");a+=c.domain?";domain="+c.domain:"";a+=c.expires?";expires="+c.expires.toUTCString():"";return a+=c.secure?";secure":""};b._getCacheFromString=function(a){var d={};a=a?a.split("; "):[];for(var c=0;c<a.length;c++){var e=b._getKeyValuePairFromCookieString(a[c]);d[b._cacheKeyPrefix+e.key]===f&&(d[b._cacheKeyPrefix+e.key]=e.value)}return d};b._getKeyValuePairFromCookieString=function(a){var b=a.indexOf("="),b=0>b?a.length:b,c=a.substr(0,b),e;try{e=decodeURIComponent(c)}catch(f){console&&"function"===
5
+ typeof console.error&&console.error('Could not decode cookie with key "'+c+'"',f)}return{key:e,value:a.substr(b+1)}};b._renewCache=function(){b._cache=b._getCacheFromString(b._document.cookie);b._cachedDocumentCookie=b._document.cookie};b._areEnabled=function(){var a="1"===b.set("cookies.js",1).get("cookies.js");b.expire("cookies.js");return a};b.enabled=b._areEnabled();return b},e="object"===typeof g.document?h(g):h;"function"===typeof define&&define.amd?define(function(){return e}):"object"===typeof exports?
6
+ ("object"===typeof module&&"object"===typeof module.exports&&(exports=module.exports=e),exports.Cookies=e):g.Cookies=e})("undefined"===typeof window?this:window);
7
+
8
+ window.Frame_Event_Publisher = {
9
+ id: window.name,
10
+ cookie_name: 'X-Frame-Events',
11
+ received: [],
12
+ initialized: false,
13
+ children: {},
14
+ window: false,
15
+ ajax_handlers_setup: false,
16
+
17
+ is_parent: function() {
18
+ return window.parent.document === window.document;
19
+ },
20
+
21
+ is_child: function(){
22
+ return !this.is_parent();
23
+ },
24
+
25
+ setup_ajax_handlers: function() {
26
+ if (!this.ajax_handlers_setup) {
27
+ var publisher = this;
28
+ jQuery(document).ajaxComplete(function(e, xhr, settings) {
29
+ setTimeout(function() {
30
+ publisher.ajax_handler();
31
+ }, 0);
32
+ });
33
+ }
34
+ },
35
+
36
+ ajax_handler: function() {
37
+ this.broadcast(this.get_events(document.cookie));
38
+ },
39
+
40
+ initialize: function(){
41
+ this.setup_ajax_handlers();
42
+
43
+ // Provided by wp_localize_script() this lets us delete cookies set by the server
44
+ if (typeof window.frame_event_publisher_domain !== 'undefined') {
45
+ Cookies.defaults.domain = window.frame_event_publisher_domain;
46
+ }
47
+
48
+ this.window = window;
49
+ if (typeof(this.window.id) != 'undefined' && this.window.id.length != null && this.window.id.length > 0) this.id = this.window.id;
50
+ else this.id == 'Unknown';
51
+ this.received = this.get_events(document.cookie);
52
+ this.initialized = true;
53
+ if (this.is_parent()) this.emit(this.received, true);
54
+ return this.received;
55
+ },
56
+
57
+ register_child: function(child) {
58
+ this.children[child.id] = child;
59
+ },
60
+
61
+ broadcast: function(events, child){
62
+ if (!this.initialized) events = this.initialize();
63
+
64
+ if (this.id == "Unknown") {
65
+ this.initialized = false;
66
+ setTimeout(function(){
67
+ this.broadcast(events, child);
68
+ }, 100);
69
+ }
70
+ // Broad cast events
71
+ else {
72
+ if (this.is_child()) {
73
+ if (arguments.length <= 1) child = window;
74
+ this.find_parent(child).register_child(child.Frame_Event_Publisher);
75
+ this.notify_parent(events, child);
76
+ }
77
+ else {
78
+ if (arguments.length == 0) events = this.received;
79
+ this.notify_children(events);
80
+ }
81
+ }
82
+
83
+
84
+ },
85
+
86
+ /**
87
+ * Notifies the parent with a list of events to broadcast
88
+ */
89
+ notify_parent: function(events, child){
90
+ this.find_parent(child).broadcast(events, child);
91
+ },
92
+
93
+ /**
94
+ * Notifies (broadcasts) to children the list of available events
95
+ */
96
+ notify_children: function(events){
97
+ this.emit(events);
98
+ for (var index in this.children) {
99
+ var child = this.children[index];
100
+ try {
101
+ child.emit(events);
102
+ }
103
+ catch (ex) {
104
+ if (typeof(console) != "undefined") console.log(ex);
105
+ delete this.children.index;
106
+ }
107
+ }
108
+ },
109
+
110
+ /**
111
+ * Finds the parent window for the current child window
112
+ */
113
+ find_parent: function(child){
114
+ var retval = child;
115
+ try {
116
+ while (retval.document !== retval.parent.document) retval = retval.parent;
117
+ }
118
+ catch (ex){
119
+ if (typeof(console) != "undefined") console.log(ex);
120
+ }
121
+ return retval.Frame_Event_Publisher;
122
+ },
123
+
124
+ /**
125
+ * Emits all known events to all children
126
+ */
127
+ emit: function(events, forced){
128
+ if (typeof(forced) == "undefined") forced = false;
129
+ for (var event_id in events) {
130
+ var event = events[event_id];
131
+ if (!forced && !this.has_received_event(event_id)) {
132
+ if (typeof(console) != "undefined") console.log("Emitting "+event_id+":"+event.event+" to "+this.id);
133
+ this.trigger_event(event_id, events[event_id]);
134
+ }
135
+ }
136
+ },
137
+
138
+ has_received_event: function(id){
139
+ return this.received[id] != undefined;
140
+ },
141
+
142
+ trigger_event: function(id, event){
143
+ var signal = event.context+':'+event.event;
144
+ event.id = id;
145
+ if (typeof(window) != "undefined") jQuery(window).trigger(signal, event);
146
+ this.received[id] = event;
147
+ },
148
+
149
+ /**
150
+ * Parses the events found in the cookie
151
+ */
152
+ get_events: function(cookie){
153
+ var frame_events = {};
154
+ var cookies = unescape(cookie).split(' ');
155
+ for (var i=0; i<cookies.length; i++) {
156
+ var current_cookie = cookies[i];
157
+ var parts = current_cookie.match(/X-Frame-Events_([^=]+)=(.*)/);
158
+ if (parts) {
159
+ var event_id = parts[1];
160
+ var event_data = parts[2].replace(/;$/, '');
161
+ try {
162
+ frame_events[event_id] = JSON.parse(event_data);
163
+ }
164
+ catch (ex) {}
165
+ var cookie_name = 'X-Frame-Events_'+event_id;
166
+ this.delete_cookie(cookie_name);
167
+ }
168
+ }
169
+ return frame_events;
170
+ },
171
+
172
+ delete_cookie: function(cookie) {
173
+ Cookies.expire(cookie);
174
+ },
175
+
176
+ listen_for: function(signal, callback){
177
+ var publisher = this;
178
+ jQuery(window).on(signal, function(e, event){
179
+ var context = event.context;
180
+ var event_id = event.id;
181
+ if (!publisher.has_received_event(event_id)) {
182
+ callback.call(publisher, event);
183
+ publisher.received[event_id] = event;
184
+ }
185
+ });
186
+ }
187
+ };
188
+
189
+ jQuery(function($){
190
+ Frame_Event_Publisher.broadcast();
191
+ });
nextgen-gallery/products/photocrati_nextgen/modules/frame_communication/static/frame_event_publisher.min.js ADDED
@@ -0,0 +1 @@
 
1
+ "use strict";function _typeof(e){"@babel/helpers - typeof";return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}!function(e,t){var n=function(e){if("object"!==_typeof(e.document))throw Error("Cookies.js requires a `window` with a `document` object");var n=function e(t,n,i){return 1===arguments.length?e.get(t):e.set(t,n,i)};return n._document=e.document,n._cacheKeyPrefix="cookey.",n._maxExpireDate=new Date("Fri, 31 Dec 9999 23:59:59 UTC"),n.defaults={path:"/",secure:!1},n.get=function(e){return n._cachedDocumentCookie!==n._document.cookie&&n._renewCache(),e=n._cache[n._cacheKeyPrefix+e],e===t?t:decodeURIComponent(e)},n.set=function(e,i,o){return o=n._getExtendedOptions(o),o.expires=n._getExpiresDate(i===t?-1:o.expires),n._document.cookie=n._generateCookieString(e,i,o),n},n.expire=function(e,i){return n.set(e,t,i)},n._getExtendedOptions=function(e){return{path:e&&e.path||n.defaults.path,domain:e&&e.domain||n.defaults.domain,expires:e&&e.expires||n.defaults.expires,secure:e&&e.secure!==t?e.secure:n.defaults.secure}},n._isValidDate=function(e){return"[object Date]"===Object.prototype.toString.call(e)&&!isNaN(e.getTime())},n._getExpiresDate=function(e,t){if(t=t||new Date,"number"==typeof e?e=1/0===e?n._maxExpireDate:new Date(t.getTime()+1e3*e):"string"==typeof e&&(e=new Date(e)),e&&!n._isValidDate(e))throw Error("`expires` parameter cannot be converted to a valid Date instance");return e},n._generateCookieString=function(e,t,n){return e=e.replace(/[^#$&+\^`|]/g,encodeURIComponent),e=e.replace(/\(/g,"%28").replace(/\)/g,"%29"),t=(t+"").replace(/[^!#$&-+\--:<-\[\]-~]/g,encodeURIComponent),n=n||{},e=e+"="+t+(n.path?";path="+n.path:""),e+=n.domain?";domain="+n.domain:"",e+=n.expires?";expires="+n.expires.toUTCString():"",e+=n.secure?";secure":""},n._getCacheFromString=function(e){var i={};e=e?e.split("; "):[];for(var o=0;o<e.length;o++){var r=n._getKeyValuePairFromCookieString(e[o]);i[n._cacheKeyPrefix+r.key]===t&&(i[n._cacheKeyPrefix+r.key]=r.value)}return i},n._getKeyValuePairFromCookieString=function(e){var t,n=e.indexOf("="),n=0>n?e.length:n,i=e.substr(0,n);try{t=decodeURIComponent(i)}catch(e){console&&"function"==typeof console.error&&console.error('Could not decode cookie with key "'+i+'"',e)}return{key:t,value:e.substr(n+1)}},n._renewCache=function(){n._cache=n._getCacheFromString(n._document.cookie),n._cachedDocumentCookie=n._document.cookie},n._areEnabled=function(){var e="1"===n.set("cookies.js",1).get("cookies.js");return n.expire("cookies.js"),e},n.enabled=n._areEnabled(),n},i="object"===_typeof(e.document)?n(e):n;"function"==typeof define&&define.amd?define(function(){return i}):"object"===("undefined"==typeof exports?"undefined":_typeof(exports))?("object"===("undefined"==typeof module?"undefined":_typeof(module))&&"object"===_typeof(module.exports)&&(exports=module.exports=i),exports.Cookies=i):e.Cookies=i}("undefined"==typeof window?void 0:window),window.Frame_Event_Publisher={id:window.name,cookie_name:"X-Frame-Events",received:[],initialized:!1,children:{},window:!1,ajax_handlers_setup:!1,is_parent:function(){return window.parent.document===window.document},is_child:function(){return!this.is_parent()},setup_ajax_handlers:function(){if(!this.ajax_handlers_setup){var e=this;jQuery(document).ajaxComplete(function(t,n,i){setTimeout(function(){e.ajax_handler()},0)})}},ajax_handler:function(){this.broadcast(this.get_events(document.cookie))},initialize:function(){return this.setup_ajax_handlers(),void 0!==window.frame_event_publisher_domain&&(Cookies.defaults.domain=window.frame_event_publisher_domain),this.window=window,void 0!==this.window.id&&null!=this.window.id.length&&this.window.id.length>0?this.id=this.window.id:this.id,this.received=this.get_events(document.cookie),this.initialized=!0,this.is_parent()&&this.emit(this.received,!0),this.received},register_child:function(e){this.children[e.id]=e},broadcast:function(e,t){this.initialized||(e=this.initialize()),"Unknown"==this.id?(this.initialized=!1,setTimeout(function(){this.broadcast(e,t)},100)):this.is_child()?(arguments.length<=1&&(t=window),this.find_parent(t).register_child(t.Frame_Event_Publisher),this.notify_parent(e,t)):(0==arguments.length&&(e=this.received),this.notify_children(e))},notify_parent:function(e,t){this.find_parent(t).broadcast(e,t)},notify_children:function(e){this.emit(e);for(var t in this.children){var n=this.children[t];try{n.emit(e)}catch(e){"undefined"!=typeof console&&console.log(e),delete this.children.index}}},find_parent:function(e){var t=e;try{for(;t.document!==t.parent.document;)t=t.parent}catch(e){"undefined"!=typeof console&&console.log(e)}return t.Frame_Event_Publisher},emit:function(e,t){void 0===t&&(t=!1);for(var n in e){var i=e[n];t||this.has_received_event(n)||("undefined"!=typeof console&&console.log("Emitting "+n+":"+i.event+" to "+this.id),this.trigger_event(n,e[n]))}},has_received_event:function(e){return void 0!=this.received[e]},trigger_event:function(e,t){var n=t.context+":"+t.event;t.id=e,"undefined"!=typeof window&&jQuery(window).trigger(n,t),this.received[e]=t},get_events:function(e){for(var t={},n=unescape(e).split(" "),i=0;i<n.length;i++){var o=n[i],r=o.match(/X-Frame-Events_([^=]+)=(.*)/);if(r){var c=r[1],a=r[2].replace(/;$/,"");try{t[c]=JSON.parse(a)}catch(e){}var d="X-Frame-Events_"+c;this.delete_cookie(d)}}return t},delete_cookie:function(e){Cookies.expire(e)},listen_for:function(e,t){var n=this;jQuery(window).on(e,function(e,i){var o=(i.context,i.id);n.has_received_event(o)||(t.call(n,i),n.received[o]=i)})}},jQuery(function(e){Frame_Event_Publisher.broadcast()});
nextgen-gallery/products/photocrati_nextgen/modules/fs/module.fs.php ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ {
4
+ Module: photocrati-fs
5
+ }
6
+ */
7
+ class M_Fs extends C_Base_Module
8
+ {
9
+ function define($id = 'pope-module',
10
+ $name = 'Pope Module',
11
+ $description = '',
12
+ $version = '',
13
+ $uri = '',
14
+ $author = '',
15
+ $author_uri = '',
16
+ $context = FALSE)
17
+ {
18
+ parent::define(
19
+ 'photocrati-fs',
20
+ 'Filesystem',
21
+ 'Provides a filesystem abstraction layer for Pope modules',
22
+ '3.3.6',
23
+ 'https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/',
24
+ 'Imagely',
25
+ 'https://www.imagely.com'
26
+ );
27
+ }
28
+
29
+ function _register_utilities()
30
+ {
31
+ $this->get_registry()->add_utility('I_Fs', 'C_Fs');
32
+ }
33
+
34
+ function get_type_list()
35
+ {
36
+ return array(
37
+ 'C_Fs' => 'class.fs.php'
38
+ );
39
+ }
40
+ }
41
+
42
+ new M_Fs;
nextgen-gallery/products/photocrati_nextgen/modules/fs/package.module.fs.php ADDED
@@ -0,0 +1,335 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Class C_Fs
4
+ *
5
+ * @implements I_Fs
6
+ */
7
+ class C_Fs extends C_Component
8
+ {
9
+ static $_instances = array();
10
+ var $_document_root;
11
+ /**
12
+ * Gets an instance of the FS utility
13
+ * @param mixed $context
14
+ * @return C_Fs
15
+ */
16
+ static function &get_instance($context = FALSE)
17
+ {
18
+ if (!isset(self::$_instances[$context])) {
19
+ $klass = get_class();
20
+ self::$_instances[$context] = new $klass($context);
21
+ }
22
+ return self::$_instances[$context];
23
+ }
24
+ /**
25
+ * Defines the instance of the FS utility
26
+ * @param mixed $context the context in this case is the product
27
+ */
28
+ function define($context = FALSE)
29
+ {
30
+ parent::define($context);
31
+ $this->implement('I_Fs');
32
+ }
33
+ function initialize()
34
+ {
35
+ parent::initialize();
36
+ $this->_document_root = $this->set_document_root(ABSPATH);
37
+ }
38
+ /**
39
+ * Gets the document root for this application
40
+ * @param string $type Must be one of plugins, plugins_mu, templates, styles, content, gallery, or root
41
+ * @return string
42
+ */
43
+ function get_document_root($type = 'root')
44
+ {
45
+ $retval = NULL;
46
+ switch ($type) {
47
+ case 'plugins':
48
+ case 'plugin':
49
+ $retval = WP_PLUGIN_DIR;
50
+ break;
51
+ case 'plugins_mu':
52
+ case 'plugin_mu':
53
+ $retval = WPMU_PLUGIN_DIR;
54
+ break;
55
+ case 'templates':
56
+ case 'template':
57
+ case 'themes':
58
+ case 'theme':
59
+ $retval = get_template_directory();
60
+ break;
61
+ case 'styles':
62
+ case 'style':
63
+ case 'stylesheets':
64
+ case 'stylesheet':
65
+ $retval = get_stylesheet_directory();
66
+ break;
67
+ case 'content':
68
+ $retval = WP_CONTENT_DIR;
69
+ break;
70
+ case 'gallery':
71
+ case 'galleries':
72
+ $root_type = NGG_GALLERY_ROOT_TYPE;
73
+ if ($root_type == 'content') {
74
+ $retval = WP_CONTENT_DIR;
75
+ } else {
76
+ $retval = $this->_document_root;
77
+ }
78
+ break;
79
+ default:
80
+ $retval = $this->_document_root;
81
+ }
82
+ return wp_normalize_path($retval);
83
+ }
84
+ function get_absolute_path($path)
85
+ {
86
+ $parts = array_filter(explode(DIRECTORY_SEPARATOR, $path), 'strlen');
87
+ $absolutes = array();
88
+ foreach ($parts as $part) {
89
+ if ('.' == $part) {
90
+ continue;
91
+ }
92
+ if ('..' == $part) {
93
+ array_pop($absolutes);
94
+ } else {
95
+ $absolutes[] = $part;
96
+ }
97
+ }
98
+ return wp_normalize_path(implode(DIRECTORY_SEPARATOR, $absolutes));
99
+ }
100
+ /**
101
+ * Sets the document root for this application
102
+ * @param string $value
103
+ * @return string
104
+ */
105
+ function set_document_root($value)
106
+ {
107
+ // some web servers like home.pl and PhpStorm put the document root in "/" or (even weirder) "//"
108
+ if ($value == DIRECTORY_SEPARATOR . DIRECTORY_SEPARATOR) {
109
+ $value = DIRECTORY_SEPARATOR;
110
+ }
111
+ if ($value !== DIRECTORY_SEPARATOR) {
112
+ $value = rtrim($value, "/\\");
113
+ }
114
+ return $this->_document_root = $value;
115
+ }
116
+ function add_trailing_slash($path)
117
+ {
118
+ return rtrim($path, "/\\") . DIRECTORY_SEPARATOR;
119
+ }
120
+ /**
121
+ * Returns a calculated path to a file
122
+ * @param string $path
123
+ * @param string|false $module (optional)
124
+ * @return string
125
+ */
126
+ function get_abspath($path, $module = FALSE)
127
+ {
128
+ return M_Static_Assets::get_static_abspath($path, $module);
129
+ }
130
+ /**
131
+ * Removes a path segment from a url or filesystem path
132
+ * @param string $path
133
+ * @param string $segment
134
+ * @return string
135
+ */
136
+ function remove_path_segment($path, $segment)
137
+ {
138
+ $parts = explode($segment, rtrim($path, "/\\"));
139
+ return $this->join_paths($parts);
140
+ }
141
+ /**
142
+ * Gets the absolute path to a file/directory for a specific Pope product
143
+ *
144
+ * If the path doesn't exist, then NULL is returned
145
+ * @param string $path
146
+ * @param string|false $module (optional)
147
+ * @param bool $relpath (optional)
148
+ * @param array $search_paths (optional)
149
+ * @return string|NULL
150
+ */
151
+ function find_abspath($path, $module = FALSE)
152
+ {
153
+ if (strpos($path, '#') !== FALSE) {
154
+ $parts = explode("#", $path);
155
+ if (count($parts) === 2) {
156
+ $path = $parts[1];
157
+ $module = $parts[0];
158
+ } else {
159
+ $path = $parts[0];
160
+ }
161
+ }
162
+ if (!$module) {
163
+ die(sprintf("find_abspath requires a path and module. Received %s and %s", $path, strval($module)));
164
+ }
165
+ $module_dir = C_Component_Registry::get_instance()->get_module_dir($module);
166
+ $path = preg_replace("#^/{1,2}#", "", $path, 1);
167
+ $retval = path_join($module_dir, $path);
168
+ // Adjust for windows paths
169
+ return wp_normalize_path($retval);
170
+ }
171
+ /**
172
+ * Returns a list of directories to search for a particular filename
173
+ * @param string $path
174
+ * @param string|false $module (optional)
175
+ * @return array
176
+ */
177
+ function get_search_paths($path, $module = FALSE)
178
+ {
179
+ $append_module = FALSE;
180
+ // Ensure that we weren't passed a module id in the path
181
+ if (!$module) {
182
+ list($path, $module) = $this->object->parse_formatted_path($path);
183
+ }
184
+ // Directories to search
185
+ $directories = array();
186
+ // If a name of a module has been provided, then we need to search within
187
+ // that directory first
188
+ if ($module) {
189
+ // Were we given a module id?
190
+ if ($module_dir = $this->get_registry()->get_module_dir($module)) {
191
+ $directories[] = $module_dir;
192
+ } else {
193
+ $append_module = TRUE;
194
+ }
195
+ }
196
+ // Add product's module directories
197
+ foreach ($this->get_registry()->get_product_list() as $product_id) {
198
+ $product_dir = $this->get_registry()->get_product_module_path($product_id);
199
+ if ($append_module) {
200
+ $directories[] = $this->join_paths($product_dir, $module);
201
+ }
202
+ $directories[] = $product_dir;
203
+ }
204
+ // If all else fails, we search from the document root
205
+ $directories[] = $this->get_document_root();
206
+ return $directories;
207
+ }
208
+ /**
209
+ * Searches for a file recursively
210
+ *
211
+ * @param string $base_path
212
+ * @param string $file
213
+ * @return null|string
214
+ */
215
+ function _rglob($base_path, $file)
216
+ {
217
+ $retval = NULL;
218
+ $results = @file_exists($this->join_paths($base_path, $file));
219
+ // Must be located in a sub-directory
220
+ if (!$results) {
221
+ // the modules cache a list of all their files when they are initialized. Ask POPE for our current
222
+ // modules and inspect their file listing to determine which module provides what we need
223
+ $modules = $this->object->get_registry()->get_module_list();
224
+ foreach ($modules as $module) {
225
+ $module_file_list = array_values($this->object->get_registry()->get_module($module)->get_type_list());
226
+ $module_dir = $this->object->get_registry()->get_module_dir($module);
227
+ $variations = array($file, ltrim($file, DIRECTORY_SEPARATOR));
228
+ foreach ($variations as $variant) {
229
+ if (in_array($variant, $module_file_list)) {
230
+ $retval = $this->join_paths($module_dir, $variant);
231
+ break 2;
232
+ }
233
+ }
234
+ }
235
+ } else {
236
+ $retval = $this->join_paths($base_path, $file);
237
+ }
238
+ return $retval;
239
+ }
240
+ /**
241
+ * Gets the relative path to a file/directory for a specific Pope product. If the path doesn't exist, then NULL is returned
242
+ * @param string $path
243
+ * @param string|false $module (optional)
244
+ * @return string|null
245
+ */
246
+ function find_relpath($path, $module = FALSE)
247
+ {
248
+ return $this->object->find_abspath($path, $module, TRUE);
249
+ }
250
+ /**
251
+ * @param string $abspath
252
+ * @return bool
253
+ */
254
+ function delete($abspath)
255
+ {
256
+ $retval = FALSE;
257
+ if (file_exists($abspath)) {
258
+ // Delete single file
259
+ if (is_file($abspath)) {
260
+ @unlink($abspath);
261
+ } else {
262
+ foreach (scandir($abspath) as $relpath) {
263
+ if (in_array($relpath, array('.', '..'))) {
264
+ continue;
265
+ }
266
+ $sub_abspath = $this->join_paths($abspath, $relpath);
267
+ $this->object->delete($sub_abspath);
268
+ }
269
+ }
270
+ $retval = !file_exists($abspath);
271
+ }
272
+ return $retval;
273
+ }
274
+ /**
275
+ * Joins multiple path segments together
276
+ * @deprecated use path_join() instead when you can
277
+ * @return string
278
+ */
279
+ function join_paths()
280
+ {
281
+ $segments = array();
282
+ $retval = array();
283
+ $protocol = NULL;
284
+ $params = func_get_args();
285
+ $this->_flatten_array($params, $segments);
286
+ foreach ($segments as $segment) {
287
+ $segment = trim($segment, "/\\");
288
+ $pieces = array_values(preg_split('#[/\\\\]#', $segment));
289
+ $segment = join(DIRECTORY_SEPARATOR, $pieces);
290
+ if (!$retval) {
291
+ $retval = $segment;
292
+ } else {
293
+ if (strpos($segment, $retval) !== FALSE) {
294
+ $retval = $segment;
295
+ } else {
296
+ $retval = $retval . DIRECTORY_SEPARATOR . $segment;
297
+ }
298
+ }
299
+ }
300
+ if (strpos($retval, $this->get_document_root()) !== 0 && strtoupper(substr(PHP_OS, 0, 3)) != 'WIN') {
301
+ $retval = DIRECTORY_SEPARATOR . trim($retval, "/\\");
302
+ }
303
+ // Check for and adjust Windows UNC paths (\\server\share\) for network mounted sites
304
+ if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN' && substr($this->get_document_root(), 0, 2) === '\\\\') {
305
+ $retval = '\\\\' . $retval;
306
+ }
307
+ return $retval;
308
+ }
309
+ function _flatten_array($obj, &$arr)
310
+ {
311
+ if (is_array($obj)) {
312
+ foreach ($obj as $inner_obj) {
313
+ $this->_flatten_array($inner_obj, $arr);
314
+ }
315
+ } elseif ($obj) {
316
+ $arr[] = $obj;
317
+ }
318
+ }
319
+ /**
320
+ * Parses the path for a module and filename
321
+ * @param string $str
322
+ * @return array [path => module]
323
+ */
324
+ function parse_formatted_path($str)
325
+ {
326
+ $module = FALSE;
327
+ $path = $str;
328
+ $parts = explode('#', $path);
329
+ if (count($parts) > 1) {
330
+ $module = array_shift($parts);
331
+ $path = array_shift($parts);
332
+ }
333
+ return array($path, $module);
334
+ }
335
+ }
nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery-bs_BA.mo ADDED
Binary file
nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery-cs_CZ.mo ADDED
Binary file
nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery-da_DK.mo ADDED
Binary file
nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery-da_DK.po ADDED
@@ -0,0 +1,3981 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: NextGEN Gallery\n"
4
+ "Report-Msgid-Bugs-To: \n"
5
+ "POT-Creation-Date: 2018-03-02 11:42+0000\n"
6
+ "PO-Revision-Date: 2018-03-08 10:34+0000\n"
7
+ "Last-Translator: Humorguden <humorguden@humorhimlen.dk>\n"
8
+ "Language-Team: Danish\n"
9
+ "Language: da-DK\n"
10
+ "Plural-Forms: nplurals=2; plural=n != 1;\n"
11
+ "MIME-Version: 1.0\n"
12
+ "Content-Type: text/plain; charset=UTF-8\n"
13
+ "Content-Transfer-Encoding: 8bit\n"
14
+ "X-Generator: Loco https://localise.biz/"
15
+
16
+ #: products/photocrati_nextgen/modules/nextgen_xmlrpc/package.module.nextgen_xmlrpc.php:684
17
+ #, php-format
18
+ msgid " (%1$s)."
19
+ msgstr " (%1$s)."
20
+
21
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:363
22
+ msgid " 25"
23
+ msgstr " 25"
24
+
25
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:364
26
+ msgid " 50"
27
+ msgstr " 50"
28
+
29
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:365
30
+ msgid " 75"
31
+ msgstr " 75"
32
+
33
+ #: products/photocrati_nextgen/modules/nextgen_gallery_display/package.module.nextgen_gallery_display.php:1753
34
+ #, php-format
35
+ msgid " [<a href=\"%s\">See image gallery at %s</a>] "
36
+ msgstr " [<a href=\"%s\">Se billedgalleri på %s</a>] "
37
+
38
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:57
39
+ msgid " MByte"
40
+ msgstr " MByte"
41
+
42
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:2769
43
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:136
44
+ msgid " mm"
45
+ msgstr " mm"
46
+
47
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:2777
48
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:142
49
+ msgid " sec"
50
+ msgstr "sek"
51
+
52
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/package.module.nextgen_basic_gallery.php:384
53
+ msgid "# of columns"
54
+ msgstr "# af kolonner"
55
+
56
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/package.module.nextgen_basic_gallery.php:309
57
+ msgid "# of seconds"
58
+ msgstr "# sekunder"
59
+
60
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:144
61
+ #, php-format
62
+ msgid "%1$sMB (%2$s%%) Used"
63
+ msgstr "%1$sMB (%2$s%%) Brugt"
64
+
65
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:143
66
+ #, php-format
67
+ msgid "%1$sMB Allowed"
68
+ msgstr "%1$sMB Tilladt"
69
+
70
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/tags.php:190
71
+ #, php-format
72
+ msgid "%1s tag(s) deleted."
73
+ msgstr "%1s tag(s) er slettet."
74
+
75
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:668
76
+ #, php-format
77
+ msgid "%s picture successfully added"
78
+ msgid_plural "%s pictures successfully added"
79
+ msgstr[0] "%s billede med succes tilføjet"
80
+ msgstr[1] "%s billeder blev tilføjet"
81
+
82
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/tags.php:249
83
+ #, php-format
84
+ msgid "%s slug(s) edited."
85
+ msgstr "%s slug(s) redigeret."
86
+
87
+ #: products/photocrati_nextgen/modules/lightbox/package.module.lightbox.php:81
88
+ msgid "&lt; Prev"
89
+ msgstr "&lt; Forrige"
90
+
91
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:508
92
+ msgid "(Error : Couldn't not find image)"
93
+ msgstr "(Fejl: kunne ikke finde billede)"
94
+
95
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:492
96
+ msgid "(Error : Couldn't not update data base)"
97
+ msgstr "(Fejl: Kunne ikke opdatere database)"
98
+
99
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:499
100
+ msgid "(Error : Couldn't not update meta data)"
101
+ msgstr "(Fejl: Kunne ikke opdatere metadata)"
102
+
103
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:467
104
+ #:
105
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:697
106
+ msgid "(Hide Customization Options)"
107
+ msgstr "(Skjul tilpasningsindstillinger)"
108
+
109
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:148
110
+ msgid "(Hide Customization Settings)"
111
+ msgstr "(Skjul tilpasningsindstillinger)"
112
+
113
+ #: products/photocrati_nextgen/modules/attach_to_post/package.module.attach_to_post.php:363
114
+ #:
115
+ #: products/photocrati_nextgen/modules/nextgen_admin/package.module.nextgen_admin.php:500
116
+ msgid "(optional)"
117
+ msgstr "(valgfri)"
118
+
119
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:467
120
+ #:
121
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:697
122
+ msgid "(Show Customization Options)"
123
+ msgstr "(Vis Tilpasningsindstillinger)"
124
+
125
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:148
126
+ msgid "(Show Customization Settings)"
127
+ msgstr "(Vis Tilpasningsindstillinger)"
128
+
129
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/package.module.nextgen_addgallery_page.php:42
130
+ msgid "0 images were uploaded"
131
+ msgstr "0 billeder blev uploadet"
132
+
133
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/package.module.nextgen_basic_gallery.php:374
134
+ msgid "0 will display all images at once"
135
+ msgstr "0 viser alle billederne på en gang"
136
+
137
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/package.module.nextgen_addgallery_page.php:388
138
+ msgid "1 image was uploaded successfully."
139
+ msgstr "1 billede blev uploadet."
140
+
141
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/package.module.nextgen_addgallery_page.php:42
142
+ #, php-format
143
+ msgid ""
144
+ "1 image was uploaded successfully. <a href=\"%s\" target=\"_blank\">Manage "
145
+ "gallery</a>"
146
+ msgstr ""
147
+ "1 billede blev uploadet korrekt.<a href=\"%s\" target=\"_blank\">Administrer "
148
+ "galleri</a>"
149
+
150
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:366
151
+ msgid "100"
152
+ msgstr "100"
153
+
154
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:367
155
+ msgid "200"
156
+ msgstr "200"
157
+
158
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/rotate.php:93
159
+ msgid "90&deg; clockwise"
160
+ msgstr "90&deg; med uret"
161
+
162
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/rotate.php:94
163
+ msgid "90&deg; counter-clockwise"
164
+ msgstr "90&deg; mod uret"
165
+
166
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:392
167
+ msgid ""
168
+ "<a href=\"http://wordpress.org/tags/nextgen-gallery?forum_id=10\" "
169
+ "target=\"_blank\">Support Forums</a>"
170
+ msgstr ""
171
+ "<a href=\"http://wordpress.org/tags/nextgen-gallery?forum_id=10\" "
172
+ "target=\"_blank\">Supportfora</a>"
173
+
174
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:381
175
+ msgid ""
176
+ "<a href=\"https://www.imagely.com/languages/\" target=\"_blank\">"
177
+ "Languages</a>"
178
+ msgstr ""
179
+ "<a href=\"https://www.imagely.com/languages/\" target=\"_blank\">Sprog</a>"
180
+
181
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:378
182
+ msgid ""
183
+ "<a href=\"https://www.imagely.com/wordpress-gallery-plugin/nextgen-"
184
+ "gallery/\" target=\"_blank\">Introduction</a>"
185
+ msgstr ""
186
+ "<a href=\"https://www.imagely.com/wordpress-gallery-plugin/nextgen-"
187
+ "gallery/\" target=\"_blank\">Introduktion</a>"
188
+
189
+ #: products/photocrati_nextgen/modules/ngglegacy/nggallery.php:59
190
+ msgid ""
191
+ "<strong>Translation by : </strong><a target=\"_blank\" href=\"https://www."
192
+ "imagely.com/wordpress-gallery-plugin/nextgen-pro/\">See here</a>"
193
+ msgstr ""
194
+ "<strong>Translation by : </strong><a target=\"_blank\" href=\"https://www."
195
+ "imagely.com/wordpress-gallery-plugin/nextgen-pro/\">Se her</a>"
196
+
197
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:482
198
+ msgid "[Maximize]"
199
+ msgstr "[Maksimer]"
200
+
201
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:483
202
+ msgid "[Minimize]"
203
+ msgstr "[Minimer]"
204
+
205
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:481
206
+ msgid "[Show all]"
207
+ msgstr "[Vis alle]"
208
+
209
+ #: products/photocrati_nextgen/modules/nextgen_settings/module.nextgen_settings.php:97
210
+ msgid "[Show slideshow]"
211
+ msgstr "[Vis diasshow]"
212
+
213
+ #: products/photocrati_nextgen/modules/nextgen_settings/module.nextgen_settings.php:98
214
+ msgid "[Show thumbnails]"
215
+ msgstr "[Vis miniaturer]"
216
+
217
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:278
218
+ msgid "A failure occurred"
219
+ msgstr "Der opstod en fejl"
220
+
221
+ #: products/photocrati_nextgen/modules/imagify/package.module.imagify.php:54
222
+ msgid "Activate Imagify"
223
+ msgstr "Aktivér Imagify"
224
+
225
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:470
226
+ msgid "Add"
227
+ msgstr "Tilføj"
228
+
229
+ #: products/photocrati_nextgen/modules/attach_to_post/module.attach_to_post.php:269
230
+ msgid "Add Gallery"
231
+ msgstr "Tilføj Galleri"
232
+
233
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/package.module.nextgen_addgallery_page.php:344
234
+ #:
235
+ #: products/photocrati_nextgen/modules/attach_to_post/package.module.attach_to_post.php:499
236
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:189
237
+ msgid "Add Gallery / Images"
238
+ msgstr "Tilføj Galleri / Billeder"
239
+
240
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/roles.php:40
241
+ msgid "Add gallery / Upload images"
242
+ msgstr "Tilføj galleri / Upload billeder"
243
+
244
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/package.module.nextgen_basic_gallery.php:394
245
+ msgid "Add Hidden Images"
246
+ msgstr "Tilføj Skjulte billeder"
247
+
248
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:309
249
+ msgid "Add MediaRSS link?"
250
+ msgstr "Tilføj MediaRSS link?"
251
+
252
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:468
253
+ msgid "Add new album"
254
+ msgstr "Tilføj nyt album"
255
+
256
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:161
257
+ #:
258
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:202
259
+ msgid "Add new gallery"
260
+ msgid_plural "Manage Galleries"
261
+ msgstr[0] "Tilføj nyt galleri"
262
+ msgstr[1] "Administrer gallerier"
263
+
264
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:257
265
+ msgid "Add new tags"
266
+ msgstr "Tilføj nye tags"
267
+
268
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/templates/manage_gallery/gallery_create_page_field.php:10
269
+ msgid "Add page"
270
+ msgstr "Tilføj side"
271
+
272
+ #: products/photocrati_nextgen/modules/widget/package.module.widget.php:69
273
+ msgid "Add recent or random images from the galleries"
274
+ msgstr "Tilføj nyere eller tilfældige billeder fra gallerierne"
275
+
276
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:402
277
+ msgid "Add tags"
278
+ msgstr "Tilføj tags"
279
+
280
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:555
281
+ msgid "Adjust Thumbnail Quality?"
282
+ msgstr "Juster miniaturekvalitet?"
283
+
284
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:148
285
+ msgid ""
286
+ "After images are uploaded, they will be resized to the above dimensions and "
287
+ "quality"
288
+ msgstr ""
289
+ "Når billederne er uploadet, vil de blive ændret til ovenstående mål og "
290
+ "kvalitet"
291
+
292
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:485
293
+ msgid ""
294
+ "After you create and select an album, you can drag and drop a gallery or "
295
+ "another album into your new album below"
296
+ msgstr ""
297
+ "Når du har oprettet og valgt et album, kan du trække og slippe et galleri "
298
+ "eller et andet album i dit nye album nedenfor"
299
+
300
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/rewrite.php:223
301
+ msgid "Album"
302
+ msgstr "Album"
303
+
304
+ #: products/photocrati_nextgen/modules/nextgen_xmlrpc/package.module.nextgen_xmlrpc.php:781
305
+ msgid "Album creation failed."
306
+ msgstr "Albums oprettelse mislykkedes."
307
+
308
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:226
309
+ msgid "Album deleted"
310
+ msgstr "Album slettet"
311
+
312
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:576
313
+ msgid "Album description:"
314
+ msgstr "Albumbeskrivelse:"
315
+
316
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:536
317
+ msgid "Album ID"
318
+ msgstr "Album ID"
319
+
320
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:570
321
+ msgid "Album name:"
322
+ msgstr "Album navn:"
323
+
324
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/ngg-db.php:265
325
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/ngg-db.php:266
326
+ msgid "Album overview"
327
+ msgstr "Albumoversigt"
328
+
329
+ #: products/photocrati_nextgen/modules/attach_to_post/package.module.attach_to_post.php:137
330
+ #, php-format
331
+ msgid "Album: %s"
332
+ msgstr "Album: %s"
333
+
334
+ #: products/photocrati_nextgen/modules/attach_to_post/package.module.attach_to_post.php:363
335
+ #:
336
+ #: products/photocrati_nextgen/modules/nextgen_gallery_display/package.module.nextgen_gallery_display.php:1879
337
+ msgid "Albums"
338
+ msgstr "Albums"
339
+
340
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:422
341
+ msgid "Albums will link this gallery to the selected page"
342
+ msgstr "Albums linker dette galleri til den valgte side"
343
+
344
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/publish.php:45
345
+ msgid "Alignment"
346
+ msgstr "Justering"
347
+
348
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:368
349
+ msgid "All"
350
+ msgstr "Alle"
351
+
352
+ #: products/photocrati_nextgen/modules/widget/templates/form_gallery.php:92
353
+ msgid "All galleries"
354
+ msgstr "Alle gallerier"
355
+
356
+ #: products/photocrati_nextgen/modules/widget/templates/form_slideshow.php:23
357
+ msgid "All images"
358
+ msgstr "Alle billeder"
359
+
360
+ #: products/photocrati_nextgen/modules/nextgen_other_options/templates/styling_tab.php:38
361
+ #, php-format
362
+ msgid "All stylesheets must contain a <a href='#' onclick='%s'>file header</a>"
363
+ msgstr ""
364
+ "Alle stylesheets skal indeholde en <a href='#' onclick='%s'>filoverskrift</a>"
365
+
366
+ #: nggallery.php:933
367
+ #, php-format
368
+ msgid ""
369
+ "Allow %6$s to collect some usage data with %5$s to make the plugin even more "
370
+ "awesome. If you skip this, that's okay! %2$s will still work just fine."
371
+ msgstr ""
372
+ "Tillad %6$s at samle nogle brugsdata med %5$s for at gøre plugin endnu mere "
373
+ "fantastisk. Hvis du springer over det, er det okay! %2$s fungerer stadig "
374
+ "fint."
375
+
376
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/wpmu.php:98
377
+ msgid "Allow users to change the roles for other blog authors."
378
+ msgstr "Tillad brugere at ændre rollerne til andre blogforfattere."
379
+
380
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/wpmu.php:92
381
+ msgid "Allow users to choose a style for the gallery."
382
+ msgstr "Tillad brugere at vælge en stil til galleriet."
383
+
384
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/wpmu.php:86
385
+ msgid "Allow users to import images folders from the server."
386
+ msgstr "Tillad brugere at importere billedmapper fra serveren."
387
+
388
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/wpmu.php:80
389
+ msgid "Allow users to upload zip folders."
390
+ msgstr "Tillad brugere at uploade zip-mapper."
391
+
392
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:336
393
+ msgid "Allowed characters for file and folder names are"
394
+ msgstr "Tilladte tegn til fil- og mappenavne er"
395
+
396
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:44
397
+ msgid "Alphabetical"
398
+ msgstr "Alfabetisk"
399
+
400
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:171
401
+ msgid "Alt & Title Text / Description"
402
+ msgstr "Alt & Titel Tekst / Beskrivelse"
403
+
404
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:647
405
+ msgid "Alt &amp; Title Text"
406
+ msgstr "Alt &amp; Titel Tekst"
407
+
408
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:103
409
+ msgid "Alt/Title Text"
410
+ msgstr "Alt/Titel Tekst"
411
+
412
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/media-upload.php:249
413
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-sort.php:107
414
+ msgid "Alt/Title text"
415
+ msgstr "Alt/Titel Tekst"
416
+
417
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:666
418
+ msgid "An absolute or relative (to the site document root) file system path"
419
+ msgstr "En absolut eller relativ (til websteds dokument root) filsystem sti"
420
+
421
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:668
422
+ msgid ""
423
+ "An absolute or relative (to the site document root) file system path or an "
424
+ "HTTP url"
425
+ msgstr ""
426
+ "En absolut eller relativ (til websteds dokument root) filsystem sti eller en "
427
+ "HTTP url"
428
+
429
+ #: products/photocrati_nextgen/modules/nextgen_admin/package.module.nextgen_admin.php:500
430
+ msgid "An empty or 0 setting will make the gallery full width"
431
+ msgstr "En tom eller 0 indstilling gør galleriet fuld bredde"
432
+
433
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/package.module.nextgen_addgallery_page.php:154
434
+ #:
435
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/package.module.nextgen_addgallery_page.php:246
436
+ #:
437
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/package.module.nextgen_addgallery_page.php:268
438
+ #:
439
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/package.module.nextgen_addgallery_page.php:319
440
+ msgid "An unexpected error occured."
441
+ msgstr "Der opstod en uventet fejl."
442
+
443
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/package.module.nextgen_addgallery_page.php:42
444
+ #:
445
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/upload_images.php:235
446
+ msgid ""
447
+ "An unexpected error occured. This is most likely due to a server "
448
+ "misconfiguration. Check your PHP error log or ask your hosting provider for "
449
+ "assistance."
450
+ msgstr ""
451
+ "Der opstod en uventet fejl. Dette skyldes højst sandsynligt en "
452
+ "fejlkonfiguration af serveren. Tjek din PHP-fejllog eller spørg din "
453
+ "hostingudbyder for at få hjælp."
454
+
455
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:94
456
+ msgid "and the thumbnails directory"
457
+ msgstr "og miniaturer biblioteket"
458
+
459
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:3057
460
+ #:
461
+ #: products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser-exif.php:46
462
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:461
463
+ msgid "Aperture"
464
+ msgstr "Blænden"
465
+
466
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:406
467
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:199
468
+ msgid "Apply"
469
+ msgstr "Anvend"
470
+
471
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:111
472
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-sort.php:109
473
+ msgid "Ascending"
474
+ msgstr "Stigende"
475
+
476
+ #: products/photocrati_nextgen/modules/attach_to_post/module.attach_to_post.php:471
477
+ msgid "Attach NextGEN Gallery to Post"
478
+ msgstr "Vedhæft NextGEN Gallery til Indlæg"
479
+
480
+ #: products/photocrati_nextgen/modules/nextgen_xmlrpc/package.module.nextgen_xmlrpc.php:76
481
+ #:
482
+ #: products/photocrati_nextgen/modules/nextgen_xmlrpc/package.module.nextgen_xmlrpc.php:176
483
+ msgid "Authentication Failed."
484
+ msgstr "Godkendelse mislykkedes."
485
+
486
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:3057
487
+ #:
488
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:465
489
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:412
490
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:471
491
+ msgid "Author"
492
+ msgstr "Forfatter"
493
+
494
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:3057
495
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:480
496
+ msgid "Author Position"
497
+ msgstr "Forfatter Position"
498
+
499
+ #: products/photocrati_nextgen/modules/nextgen_xmlrpc/package.module.nextgen_xmlrpc.php:168
500
+ msgid "Authorization Failed."
501
+ msgstr "Tilladelse mislykkedes."
502
+
503
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/package.module.nextgen_addgallery_page.php:134
504
+ #, php-format
505
+ msgid "Automatic image resizing failed [%1$s]."
506
+ msgstr "Automatisk billed størrelses ændring mislykkedes [%1$s]."
507
+
508
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:148
509
+ msgid "Automatically resize images after upload"
510
+ msgstr "Ændre størrelsen automatisk efter upload"
511
+
512
+ #: products/photocrati_nextgen/modules/nextgen_admin/package.module.nextgen_admin.php:504
513
+ msgid "Average"
514
+ msgstr "Gennemsnit"
515
+
516
+ #: products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser-caption.php:26
517
+ #: products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser.php:26
518
+ #: products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser-exif.php:30
519
+ #: products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/templates/nextgen_basic_imagebrowser.php:41
520
+ msgid "Back"
521
+ msgstr "Tilbage"
522
+
523
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-sort.php:98
524
+ msgid "Back to gallery"
525
+ msgstr "Tilbage til galleriet"
526
+
527
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:148
528
+ msgid "Backup the original images?"
529
+ msgstr "Backup de originale billeder?"
530
+
531
+ #: products/photocrati_nextgen/modules/nextgen_basic_singlepic/package.module.nextgen_basic_singlepic.php:187
532
+ msgid "Blank"
533
+ msgstr "Blank"
534
+
535
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:224
536
+ msgid ""
537
+ "Brian is a professional photographer, author, and educator. He fuses "
538
+ "landscape & travel photography with experiential storytelling and practical "
539
+ "instructing to help others grow creatively. He is also a Sony Artisan of "
540
+ "Imagery, a Zeiss Lens Ambassador, a Formatt-Hitech Featured Photographer, "
541
+ "and a member of G-Technology’s G-Team."
542
+ msgstr ""
543
+ "Brian er en professionel fotograf, forfatter og lærer. Han sikrer landskabs- "
544
+ "og rejsefotografering med erfaringshistorie og praktisk instruktion til at "
545
+ "hjælpe andre med at vokse kreativt. Han er også en Sony Artisan of Imagery, "
546
+ "en Zeiss Lens Ambassador, en Formatt-Hitech Featured Photographer og et "
547
+ "medlem af G-Technology's G-Team."
548
+
549
+ #: products/photocrati_nextgen/modules/nextgen_gallery_display/package.module.nextgen_gallery_display.php:2394
550
+ msgid "Browse images without reloading the page."
551
+ msgstr "Gennemse billeder uden at genindlæse siden."
552
+
553
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:391
554
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:191
555
+ msgid "Bulk actions"
556
+ msgstr "Massehandlinger"
557
+
558
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:3057
559
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:463
560
+ msgid "Camera"
561
+ msgstr "Kamera"
562
+
563
+ #: products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser-exif.php:42
564
+ msgid "Camera / Type"
565
+ msgstr "Kamera / Type"
566
+
567
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:626
568
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:483
569
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:519
570
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:548
571
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:579
572
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:344
573
+ #:
574
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:373
575
+ #:
576
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:404
577
+ msgid "Cancel"
578
+ msgstr "Annuller"
579
+
580
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:3057
581
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:464
582
+ msgid "Caption"
583
+ msgstr "Billedtekst"
584
+
585
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:118
586
+ msgid "Categories"
587
+ msgstr "Kategorier"
588
+
589
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:3057
590
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:476
591
+ msgid "Category"
592
+ msgstr "Kategori"
593
+
594
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/import_folder.php:11
595
+ msgid ""
596
+ "Caution: If you keep images in the original folder and later delete the "
597
+ "gallery, the images in that folder might be deleted depending on your "
598
+ "settings."
599
+ msgstr ""
600
+ "Forsigtig: Hvis du holder billeder i den oprindelige mappe og senere sletter "
601
+ "galleriet, kan billederne i den pågældende mappe blive slettet afhængigt af "
602
+ "dine indstillinger."
603
+
604
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/publish.php:51
605
+ msgid "Center"
606
+ msgstr "Center"
607
+
608
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/package.module.nextgen_basic_gallery.php:317
609
+ msgid ""
610
+ "Certain themes may allow images to flow over their container if this setting "
611
+ "is too large"
612
+ msgstr ""
613
+ "Visse temaer kan tillade billeder at strømme over deres beholder, hvis denne "
614
+ "indstilling er for stor"
615
+
616
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/roles.php:64
617
+ msgid "Change options"
618
+ msgstr "Skift indstillinger"
619
+
620
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/roles.php:60
621
+ msgid "Change style"
622
+ msgstr "Skift stil"
623
+
624
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:467
625
+ msgid "Changes you make to the contents will be saved to"
626
+ msgstr "Ændringer du foretager til indholdet gemmes til"
627
+
628
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:615
629
+ msgid "Cheatin&#8217; uh?"
630
+ msgstr "Snyder du?"
631
+
632
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:4141
633
+ msgid "Check memory limit"
634
+ msgstr "Kontroller hukommelsesgrænse"
635
+
636
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:56
637
+ msgid "Check this link, if you didn't know how to set the permission :"
638
+ msgstr ""
639
+ "Tjek dette link, hvis du ikke vidste, hvordan du indstiller tilladelsen:"
640
+
641
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/wpmu.php:119
642
+ msgid "Choose the default style for the galleries."
643
+ msgstr "Vælg standardstil for gallerierne."
644
+
645
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:229
646
+ msgid ""
647
+ "Christine famously coined the term WordPress. She is an author, speaker, "
648
+ "business coach, and story strategist who specializes in helping creatives "
649
+ "celebrate their story online through blogging and social media. When not "
650
+ "offering actionable know-how to businesses, she can be found taking long "
651
+ "road trips across North America in her Mini Cooper."
652
+ msgstr ""
653
+ "Christine skabte det berømt ord WordPress. Hun er en forfatter, højttaler, "
654
+ "business coach og historie strateg, der specialiserer sig i at hjælpe "
655
+ "reklamer fejre deres historie online gennem blogging og sociale medier. Når "
656
+ "hun ikke tilbyder handlingsmæssig knowhow til virksomheder, kan hun blive "
657
+ "fundet ved at tage lange vejture i hele Nordamerika i sin Mini Cooper."
658
+
659
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:3057
660
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:481
661
+ msgid "City"
662
+ msgstr "By"
663
+
664
+ #: products/photocrati_nextgen/modules/nextgen_admin/package.module.nextgen_admin.php:769
665
+ msgid "Clear"
666
+ msgstr "Ryd"
667
+
668
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:309
669
+ msgid "Clear image cache"
670
+ msgstr "Ryd billede cache"
671
+
672
+ #: products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php:326
673
+ msgid "Click \"Add New\" to create a new page."
674
+ msgstr "Klik på \"Tilføj ny\" for at oprette en ny side."
675
+
676
+ #: products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php:322
677
+ msgid "Click on \"Pages\" to access your WordPress pages."
678
+ msgstr "Klik på \"Sider\" for at få adgang til dine WordPress-sider."
679
+
680
+ #: products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php:297
681
+ msgid ""
682
+ "Click on the \"Add Gallery / Images\" menu to create new galleries with "
683
+ "images."
684
+ msgstr ""
685
+ "Klik på menuen \"Tilføj galleri / billeder\" for at oprette nye gallerier "
686
+ "med billeder."
687
+
688
+ #: products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php:371
689
+ msgid ""
690
+ "Click on the \"NextGEN Basic Slideshow\" radio button to select the display "
691
+ "type for the gallery."
692
+ msgstr ""
693
+ "Klik på knappen \"NextGEN Basic Diasshow\" for at vælge displaytypen for "
694
+ "galleriet."
695
+
696
+ #: products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php:293
697
+ msgid "Click on the Gallery menu to access NextGEN's functionality."
698
+ msgstr "Klik på Galleri-menuen for at få adgang til NextGENs funktionalitet."
699
+
700
+ #: products/photocrati_nextgen/modules/lightbox/package.module.lightbox.php:65
701
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:299
702
+ msgid "Click to Close"
703
+ msgstr "Klik for at lukke"
704
+
705
+ #: products/photocrati_nextgen/modules/attach_to_post/module.attach_to_post.php:392
706
+ #:
707
+ #: products/photocrati_nextgen/modules/attach_to_post/package.module.attach_to_post.php:470
708
+ msgid "Click to edit"
709
+ msgstr "Klik for at redigere"
710
+
711
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:303
712
+ msgid "CLICK TO LEARN MORE:"
713
+ msgstr "Klik for yderligere info:"
714
+
715
+ #: products/photocrati_nextgen/modules/attach_to_post/module.attach_to_post.php:393
716
+ msgid "Click to remove"
717
+ msgstr "Klik for at fjerne"
718
+
719
+ #: products/photocrati_nextgen/modules/lightbox/package.module.lightbox.php:73
720
+ #: products/photocrati_nextgen/modules/lightbox/package.module.lightbox.php:81
721
+ msgid "Close"
722
+ msgstr "Luk"
723
+
724
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:26
725
+ msgid "Code"
726
+ msgstr "Kode"
727
+
728
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:211
729
+ msgid ""
730
+ "Colby is a photographer, photo educator, and author specializing in "
731
+ "landscape, travel and humanitarian photography. With an audience reaching "
732
+ "millions, Colby partners on social influencer marketing campaigns with some "
733
+ "of the biggest companies and destinations in the world, including Sony, "
734
+ "Samsung, Toshiba, Iceland Naturally, Jordan Tourism Board, Australia.com, "
735
+ "Visit California and more."
736
+ msgstr ""
737
+ "Colby er fotograf, fotopædagog og forfatter med speciale i landskabs-, rejse-"
738
+ " og humanitær fotografering. Med et publikum, der når millioner, samarbejder "
739
+ "Colby med sociale indflydende marketingkampagner med nogle af de største "
740
+ "virksomheder og destinationer i verden, herunder Sony, Samsung, Toshiba, "
741
+ "Island Naturally, Jordan Tourism Board, Australia.com, Visit California og "
742
+ "meget mere."
743
+
744
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:309
745
+ msgid ""
746
+ "Completely clear the NextGEN cache of all image modifications?\n"
747
+ "\n"
748
+ "Choose [Cancel] to Stop, [OK] to proceed."
749
+ msgstr ""
750
+ "Ryd NextGEN-cachen fuldstændigt for alle billedændringer?\n"
751
+ "\n"
752
+ "Vælg [Annuller] for Stop, [OK] for at fortsætte."
753
+
754
+ #: products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php:316
755
+ msgid "Congratulations! You just created your first gallery."
756
+ msgstr "Tillykke! Du har lige lavet dit første galleri."
757
+
758
+ #: products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php:364
759
+ msgid ""
760
+ "Congratulations! You just created your first gallery. Now let's insert it "
761
+ "into the page. Click the \"Display Galleries\" tab."
762
+ msgstr ""
763
+ "Tillykke! Du har lige lavet dit første galleri. Lad os nu indsætte den i "
764
+ "siden. Klik på fanen \"Vis gallerier\"."
765
+
766
+ #: products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php:404
767
+ msgid ""
768
+ "Congratulations! You just created your first gallery. You can now click the "
769
+ "\"Publish\" button on the right to publish your page."
770
+ msgstr ""
771
+ "Tillykke! Du har lige lavet dit første galleri. Du kan nu klikke på knappen "
772
+ "\"Publicer\" til højre for at offentliggøre din side."
773
+
774
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:3057
775
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:490
776
+ msgid "Contact"
777
+ msgstr "Kontakt"
778
+
779
+ #: products/photocrati_nextgen/modules/ngglegacy/nggallery.php:293
780
+ msgid "Contribute"
781
+ msgstr "Bidrag"
782
+
783
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:396
784
+ msgid "Contribute development"
785
+ msgstr "Bidrager til udviklingen"
786
+
787
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:3895
788
+ #, php-format
789
+ msgid "Copied %1$s picture(s) to gallery %2$s ."
790
+ msgstr "Kopierede %1$s billede (r) til galleri %2$s."
791
+
792
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:249
793
+ msgid "Copy image to..."
794
+ msgstr "Kopier billede til ..."
795
+
796
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:400
797
+ msgid "Copy to..."
798
+ msgstr "Kopier til..."
799
+
800
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:3057
801
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:466
802
+ msgid "Copyright"
803
+ msgstr "Ophavsret"
804
+
805
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:3057
806
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:489
807
+ msgid "Copyright Notice"
808
+ msgstr ""
809
+ "Ophavsret Varsel\n"
810
+
811
+ #: products/photocrati_nextgen/modules/nextgen_xmlrpc/package.module.nextgen_xmlrpc.php:725
812
+ #, php-format
813
+ msgid "Could not access file system for gallery (%1$s)."
814
+ msgstr "Kunne ikke få adgang til filsystemet til galleri (%1$s)."
815
+
816
+ #: products/photocrati_nextgen/modules/nextgen_xmlrpc/package.module.nextgen_xmlrpc.php:71
817
+ msgid "Could not connect to FTP to determine path."
818
+ msgstr "Kunne ikke oprette forbindelse til FTP for at bestemme stien."
819
+
820
+ #: products/photocrati_nextgen/modules/nextgen_xmlrpc/package.module.nextgen_xmlrpc.php:657
821
+ #, php-format
822
+ msgid "Could not delete image file(s) from disk (%1$s)."
823
+ msgstr "Kunne ikke slette billedfilerne fra disken (%1$s)."
824
+
825
+ #: products/photocrati_nextgen/modules/nextgen_xmlrpc/package.module.nextgen_xmlrpc.php:68
826
+ msgid "Could not determine FTP path."
827
+ msgstr "Kunne ikke bestemme FTP-stien."
828
+
829
+ #: products/photocrati_nextgen/modules/nextgen_xmlrpc/package.module.nextgen_xmlrpc.php:842
830
+ #, php-format
831
+ msgid "Could not find album (%1$s)."
832
+ msgstr "Kunne ikke finde album (%1$s)."
833
+
834
+ #: products/photocrati_nextgen/modules/nextgen_xmlrpc/package.module.nextgen_xmlrpc.php:737
835
+ #, php-format
836
+ msgid "Could not find gallery (%1$s)."
837
+ msgstr "Kunne ikke finde galleri (%1$s)."
838
+
839
+ #: products/photocrati_nextgen/modules/nextgen_xmlrpc/package.module.nextgen_xmlrpc.php:698
840
+ #, php-format
841
+ msgid "Could not find image file for image (%1$s)."
842
+ msgstr "Kunne ikke finde billedfilen for billede (%1$s)."
843
+
844
+ #: products/photocrati_nextgen/modules/nextgen_xmlrpc/package.module.nextgen_xmlrpc.php:669
845
+ #, php-format
846
+ msgid "Could not remove image because image was not found (%1$s)."
847
+ msgstr "Kunne ikke fjerne billedet, fordi billedet ikke blev fundet (%1$s)."
848
+
849
+ #: products/photocrati_nextgen/modules/nextgen_xmlrpc/package.module.nextgen_xmlrpc.php:661
850
+ #, php-format
851
+ msgid "Could not remove image from gallery (%1$s)."
852
+ msgstr "Kunne ikke fjerne billede fra galleri (%1$s)."
853
+
854
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:3057
855
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:485
856
+ msgid "Country"
857
+ msgstr "Land"
858
+
859
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:3057
860
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:484
861
+ msgid "Country code"
862
+ msgstr "Land kode"
863
+
864
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:334
865
+ msgid "Create a new , empty gallery below the folder"
866
+ msgstr "Opret et nyt, tomt galleri under mappen"
867
+
868
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/upload_images.php:4
869
+ #:
870
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/import_media_library.php:5
871
+ msgid "Create a new gallery"
872
+ msgstr "Opret et nyt galleri"
873
+
874
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:4143
875
+ #, php-format
876
+ msgid "Create Image failed. %1$s"
877
+ msgstr "Opret billede mislykkedes. %1$s"
878
+
879
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:433
880
+ msgid "Create new page:"
881
+ msgstr "Opret ny side:"
882
+
883
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:273
884
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:393
885
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:665
886
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:118
887
+ #:
888
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:194
889
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:657
890
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:735
891
+ msgid "Create new thumbnails"
892
+ msgstr "Opret nye miniaturebilleder"
893
+
894
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:891
895
+ msgid "created"
896
+ msgstr "oprettede den"
897
+
898
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:3057
899
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:462
900
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:487
901
+ msgid "Credit"
902
+ msgstr "Kredit"
903
+
904
+ #: products/photocrati_nextgen/modules/nextgen_basic_singlepic/package.module.nextgen_basic_singlepic.php:203
905
+ msgid "Crop thumbnail"
906
+ msgstr "Beskær miniaturebillede"
907
+
908
+ #: products/photocrati_nextgen/modules/nextgen_admin/package.module.nextgen_admin.php:769
909
+ msgid "Current Color"
910
+ msgstr "Nuværende farve"
911
+
912
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:103
913
+ #:
914
+ #: products/photocrati_nextgen/modules/lightbox/package.module.lightbox.php:87
915
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/thumbnails-template.php:76
916
+ msgid "Custom"
917
+ msgstr "Brugerdefinerede"
918
+
919
+ #: products/photocrati_nextgen/modules/attach_to_post/package.module.attach_to_post.php:641
920
+ msgid "Customize the display settings"
921
+ msgstr "Tilpas displayindstillingerne"
922
+
923
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:320
924
+ msgid "Customize thumbnail"
925
+ msgstr "Tilpas miniaturen"
926
+
927
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:622
928
+ msgid "Database error. Could not add gallery!"
929
+ msgstr "Database fejl. Kunne ikke tilføje galleri!"
930
+
931
+ #: products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser-exif.php:58
932
+ msgid "Date / Time"
933
+ msgstr "Dato / tid"
934
+
935
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:3057
936
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:478
937
+ msgid "Date Created"
938
+ msgstr "Dato oprettet"
939
+
940
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:3057
941
+ #:
942
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:103
943
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-sort.php:108
944
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:465
945
+ msgid "Date/Time"
946
+ msgstr "Dato/tid"
947
+
948
+ #: products/photocrati_nextgen/modules/nextgen_basic_templates/package.module.nextgen_basic_templates.php:46
949
+ #:
950
+ #: products/photocrati_nextgen/modules/nextgen_admin/package.module.nextgen_admin.php:769
951
+ msgid "Default"
952
+ msgstr "Standard"
953
+
954
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/wpmu.php:102
955
+ msgid "Default style"
956
+ msgstr "Standard stil"
957
+
958
+ #: products/photocrati_nextgen/modules/nextgen_gallery_display/package.module.nextgen_gallery_display.php:2468
959
+ msgid "Default Template"
960
+ msgstr "Standardskabelon"
961
+
962
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:555
963
+ msgid "Default thumbnail dimensions:"
964
+ msgstr "Standard miniature dimensioner:"
965
+
966
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:226
967
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:464
968
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:192
969
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:364
970
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:366
971
+ msgid "Delete"
972
+ msgstr "Slet"
973
+
974
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:464
975
+ msgid "Delete album ?"
976
+ msgstr "Slet album?"
977
+
978
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:363
979
+ msgid "Delete image"
980
+ msgstr "Slet billede"
981
+
982
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:148
983
+ msgid "Delete Image Files?"
984
+ msgstr "Slet billedfiler?"
985
+
986
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:396
987
+ msgid "Delete images"
988
+ msgstr "Slet billeder"
989
+
990
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:210
991
+ msgid "Delete Tag"
992
+ msgstr "Slet tag"
993
+
994
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:261
995
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:403
996
+ msgid "Delete tags"
997
+ msgstr "Slet tags"
998
+
999
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:91
1000
+ msgid "deleted successfully"
1001
+ msgstr "slettet korrekt"
1002
+
1003
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:111
1004
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-sort.php:110
1005
+ msgid "Descending"
1006
+ msgstr "Aftagende"
1007
+
1008
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/media-upload.php:253
1009
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:647
1010
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:464
1011
+ msgid "Description"
1012
+ msgstr "Beskrivelse"
1013
+
1014
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:400
1015
+ msgid "Description:"
1016
+ msgstr "Beskrivelse:"
1017
+
1018
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:55
1019
+ msgid "didn't exist. Please create first the main gallery folder "
1020
+ msgstr "eksisterede ikke. Opret venligst først hovedgalleriets mappe"
1021
+
1022
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:55
1023
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:83
1024
+ msgid "Directory"
1025
+ msgstr "Katalog"
1026
+
1027
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:606
1028
+ #, php-format
1029
+ msgid "Directory <strong>%s</strong> contains no pictures"
1030
+ msgstr "Kataloget <strong>%s </ strong> indeholder ingen billeder"
1031
+
1032
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:598
1033
+ #, php-format
1034
+ msgid "Directory <strong>%s</strong> doesn&#96;t exist!"
1035
+ msgstr "Kataloget <strong>%s </ strong> eksisterer ikke!"
1036
+
1037
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/package.module.nextgen_addgallery_page.php:207
1038
+ msgid "Directory does not exist."
1039
+ msgstr "Kataloget eksisterer ikke."
1040
+
1041
+ #: products/photocrati_nextgen/modules/nextgen_basic_album/package.module.nextgen_basic_album.php:859
1042
+ msgid "Display descriptions"
1043
+ msgstr "Vis beskrivelser"
1044
+
1045
+ #: products/photocrati_nextgen/modules/attach_to_post/package.module.attach_to_post.php:496
1046
+ msgid "Display Galleries"
1047
+ msgstr "Vis gallerier"
1048
+
1049
+ #: products/photocrati_nextgen/modules/nextgen_basic_album/package.module.nextgen_basic_album.php:843
1050
+ msgid "Display galleries as"
1051
+ msgstr "Vis gallerier som"
1052
+
1053
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:309
1054
+ msgid "Display galleries in feeds"
1055
+ msgstr "Vis gallerier i feeds"
1056
+
1057
+ #: products/photocrati_nextgen/modules/nextgen_basic_singlepic/package.module.nextgen_basic_singlepic.php:199
1058
+ msgid "Display reflection"
1059
+ msgstr "Vis refleksion"
1060
+
1061
+ #: products/photocrati_nextgen/modules/nextgen_basic_tagcloud/package.module.nextgen_basic_tagcloud.php:117
1062
+ msgid "Display type"
1063
+ msgstr "Vis type"
1064
+
1065
+ #: products/photocrati_nextgen/modules/nextgen_basic_singlepic/package.module.nextgen_basic_singlepic.php:195
1066
+ msgid "Display watermark"
1067
+ msgstr "Vis vandmærke"
1068
+
1069
+ #: products/photocrati_nextgen/modules/attach_to_post/package.module.attach_to_post.php:186
1070
+ msgid "Displayed gallery does not exist"
1071
+ msgstr "Vist galleri findes ikke"
1072
+
1073
+ #: products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php:284
1074
+ msgid "Do you need help with NextGEN?"
1075
+ msgstr "Har du brug for hjælp til NextGEN?"
1076
+
1077
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/import_folder.php:69
1078
+ #, php-format
1079
+ msgid ""
1080
+ "Done! Successfully imported {count} images. <a href=\"%s\" target=\"_blank\">"
1081
+ "Manage gallery</a>"
1082
+ msgstr ""
1083
+ "Færdig! {count} billeder er blevet importeret succesfuldt. <a href=\"%s\" "
1084
+ "target=\"_blank\"> Administrer galleri </a>"
1085
+
1086
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:397
1087
+ msgid "Download latest version"
1088
+ msgstr "Hent seneste version"
1089
+
1090
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/publish.php:60
1091
+ msgid "Draft"
1092
+ msgstr "Udkast"
1093
+
1094
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/upload_images.php:118
1095
+ msgid "Drag image and ZIP files here or click <strong>Add Files</strong>"
1096
+ msgstr ""
1097
+ "Træk billede og ZIP-filer her, eller klik på <strong> Tilføj filer </strong>"
1098
+
1099
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:252
1100
+ msgid "Edit"
1101
+ msgstr "Redigere"
1102
+
1103
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:427
1104
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:461
1105
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/roles.php:56
1106
+ msgid "Edit Album"
1107
+ msgstr "Rediger album"
1108
+
1109
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:670
1110
+ msgid "Edit gallery"
1111
+ msgstr "Rediger galleri"
1112
+
1113
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:3057
1114
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:475
1115
+ msgid "Edit Status"
1116
+ msgstr "Rediger status"
1117
+
1118
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:232
1119
+ msgid "Edit Tag Slug"
1120
+ msgstr "Rediger Tag Slug"
1121
+
1122
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:321
1123
+ msgid "Edit thumb"
1124
+ msgstr "Rediger thumb"
1125
+
1126
+ #: products/photocrati_nextgen/modules/nextgen_gallery_display/package.module.nextgen_gallery_display.php:2394
1127
+ msgid "Enable AJAX pagination"
1128
+ msgstr "Aktivér AJAX sidenavgation"
1129
+
1130
+ #: products/photocrati_nextgen/modules/nextgen_basic_album/package.module.nextgen_basic_album.php:855
1131
+ msgid "Enable breadcrumbs"
1132
+ msgstr "Aktivér brødkrummer"
1133
+
1134
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:467
1135
+ msgid "Enable custom CSS"
1136
+ msgstr "Aktivér brugerdefineret CSS"
1137
+
1138
+ #: products/photocrati_nextgen/modules/widget/templates/form_gallery.php:62
1139
+ msgid "Enable IE8 Web Slices"
1140
+ msgstr "Aktivér IE8 Web Slices"
1141
+
1142
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/wpmu.php:84
1143
+ msgid "Enable import function"
1144
+ msgstr "Aktivér importfunktion"
1145
+
1146
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/wpmu.php:96
1147
+ msgid "Enable roles/capabilities"
1148
+ msgstr "Aktivér roller / evner"
1149
+
1150
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/wpmu.php:90
1151
+ msgid "Enable style selection"
1152
+ msgstr "Aktivér stilvalg"
1153
+
1154
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/wpmu.php:72
1155
+ msgid "Enable upload quota check"
1156
+ msgstr "Aktivér upload kvotekontrol"
1157
+
1158
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/wpmu.php:78
1159
+ msgid "Enable zip upload option"
1160
+ msgstr "Aktivér zip upload mulighed"
1161
+
1162
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:218
1163
+ msgid ""
1164
+ "Enter the name of the tag to delete. This tag will be removed from all "
1165
+ "posts."
1166
+ msgstr ""
1167
+ "Indtast navnet på det tag, der skal slettes. Dette tag fjernes fra alle "
1168
+ "indlæg."
1169
+
1170
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/publish.php:37
1171
+ msgid "Enter the post title "
1172
+ msgstr "Indtast indlægs titel"
1173
+
1174
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:240
1175
+ msgid ""
1176
+ "Enter the tag name to edit and its new slug. This will be used in tagcloud "
1177
+ "links. <a href=\"http://codex.wordpress.org/Glossary#Slug\" "
1178
+ "target=\"_blank\">Slug definition</a>"
1179
+ msgstr ""
1180
+ "Indtast tagnavnet for at redigere og dets nye slug. Dette vil blive brugt i "
1181
+ "tagcloud links. <a href=\"http://codex.wordpress.org/Glossary#Slug\" "
1182
+ "target=\"_blank\"> Slug definition </a>"
1183
+
1184
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:192
1185
+ msgid ""
1186
+ "Enter the tag to rename and its new value. You can use this feature to "
1187
+ "merge tags too. Click \"Rename\" and all posts which use this tag will be "
1188
+ "updated."
1189
+ msgstr ""
1190
+ "Indtast mærket for at omdøbe og dets nye værdi. Du kan også bruge denne "
1191
+ "funktion til at fusionere tags. Klik på \"Omdøb\" og alle indlæg, der bruger "
1192
+ "dette tag, vil blive opdateret."
1193
+
1194
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:477
1195
+ msgid "Enter the tags"
1196
+ msgstr "Indtast tags"
1197
+
1198
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/rotate.php:70
1199
+ msgid "Error rotating thumbnail"
1200
+ msgstr "Fejl ved roterende miniaturebillede"
1201
+
1202
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/edit-thumbnail.php:146
1203
+ msgid "Error updating thumbnail"
1204
+ msgstr "Fejl ved opdatering af miniaturebillede"
1205
+
1206
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:356
1207
+ msgid "Error while applying watermark to image."
1208
+ msgstr "Fejl under anvendelse af vandmærke til billede."
1209
+
1210
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:187
1211
+ msgid "Error while creating thumbnail."
1212
+ msgstr "Fejl under oprettelse af miniaturebillede."
1213
+
1214
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:240
1215
+ msgid "Error while resizing image."
1216
+ msgstr "Fejl under ændring af billede."
1217
+
1218
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:322
1219
+ msgid "Error while rotating image."
1220
+ msgstr "Fejl under roterende billede."
1221
+
1222
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/tags.php:146
1223
+ msgid "Error. Not enough tags provided to rename or merge."
1224
+ msgstr ""
1225
+ "Fejl. Der er ikke nok tags til rådighed for at omdøbe eller slå sammen."
1226
+
1227
+ #: nggallery.php:520
1228
+ #, php-format
1229
+ msgid "Every %d seconds"
1230
+ msgstr "Hver %d sekunder"
1231
+
1232
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:214
1233
+ msgid "Exclude ?"
1234
+ msgstr "Udeluk?"
1235
+
1236
+ #: products/photocrati_nextgen/modules/attach_to_post/package.module.attach_to_post.php:363
1237
+ msgid "Exclude?"
1238
+ msgstr "Udeluk?"
1239
+
1240
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/showmeta.php:58
1241
+ msgid "EXIF Data"
1242
+ msgstr "EXIF-data"
1243
+
1244
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:111
1245
+ msgid "Existing Tags"
1246
+ msgstr "Eksisterende tags"
1247
+
1248
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:3826
1249
+ #, php-format
1250
+ msgid "Failed to copy database row for picture %s"
1251
+ msgstr "Kunne ikke kopiere databasen rækker for billede %s"
1252
+
1253
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:3868
1254
+ #, php-format
1255
+ msgid "Failed to copy image %1$s to %2$s"
1256
+ msgstr "Kunne ikke kopiere billede %1$s til %2$s"
1257
+
1258
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/package.module.nextgen_addgallery_page.php:124
1259
+ msgid "Failed to extract images from ZIP"
1260
+ msgstr "Kunne ikke hente billeder fra ZIP"
1261
+
1262
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:3840
1263
+ #, php-format
1264
+ msgid "Failed to get image path for %s"
1265
+ msgstr "Kunne ikke få billedsti til %s"
1266
+
1267
+ #: products/photocrati_nextgen/modules/nextgen_xmlrpc/package.module.nextgen_xmlrpc.php:793
1268
+ #, php-format
1269
+ msgid "Failed to remove album (%1$s)."
1270
+ msgstr "Kunne ikke fjerne album (%1$s)."
1271
+
1272
+ #: products/photocrati_nextgen/modules/nextgen_xmlrpc/package.module.nextgen_xmlrpc.php:597
1273
+ #, php-format
1274
+ msgid "Failed to remove gallery (%1$s)."
1275
+ msgstr "Kunne ikke fjerne galleri (%1$s)."
1276
+
1277
+ #: products/photocrati_nextgen/modules/nextgen_xmlrpc/package.module.nextgen_xmlrpc.php:837
1278
+ #, php-format
1279
+ msgid "Failed to save modified album (%1$s)."
1280
+ msgstr "Kunne ikke gemme ændret album (%1$s)."
1281
+
1282
+ #: products/photocrati_nextgen/modules/lightbox/package.module.lightbox.php:54
1283
+ msgid "Fancybox"
1284
+ msgstr "Fancybox"
1285
+
1286
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:393
1287
+ msgid "FAQ"
1288
+ msgstr "Ofte stillede spørgsmål"
1289
+
1290
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:394
1291
+ msgid "Feature request"
1292
+ msgstr "Funktionsanmodning"
1293
+
1294
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:467
1295
+ msgid "File Content:"
1296
+ msgstr "Filindhold:"
1297
+
1298
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:103
1299
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:646
1300
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:166
1301
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-sort.php:106
1302
+ msgid "Filename"
1303
+ msgstr "Filnavn"
1304
+
1305
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:2781
1306
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:146
1307
+ msgid "Fired"
1308
+ msgstr "Fyret"
1309
+
1310
+ #: products/photocrati_nextgen/modules/nextgen_admin/package.module.nextgen_admin.php:504
1311
+ msgid "First Image"
1312
+ msgstr "Første billede"
1313
+
1314
+ #: products/photocrati_nextgen/modules/lightbox/package.module.lightbox.php:73
1315
+ msgid "Fit to Screen"
1316
+ msgstr "Tilpas til skærm"
1317
+
1318
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:3057
1319
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:496
1320
+ msgid "Flash"
1321
+ msgstr "Blitz"
1322
+
1323
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/rotate.php:96
1324
+ msgid "Flip horizontally"
1325
+ msgstr "Flip vandret"
1326
+
1327
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/rotate.php:95
1328
+ msgid "Flip vertically"
1329
+ msgstr "Flip lodret"
1330
+
1331
+ #: products/photocrati_nextgen/modules/nextgen_basic_singlepic/package.module.nextgen_basic_singlepic.php:207
1332
+ msgid "Float"
1333
+ msgstr "Float"
1334
+
1335
+ #: products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser-exif.php:50
1336
+ #, fuzzy
1337
+ msgid "Focal Length"
1338
+ msgstr "brændvidde"
1339
+
1340
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:3057
1341
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:467
1342
+ #, fuzzy
1343
+ msgid "Focal length"
1344
+ msgstr "brændvidde"
1345
+
1346
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:680
1347
+ msgid "Font Color:"
1348
+ msgstr "Skrift farve:"
1349
+
1350
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:680
1351
+ msgid "Font Family:"
1352
+ msgstr "Skrift familie"
1353
+
1354
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:680
1355
+ msgid "Font Size:"
1356
+ msgstr "Skriftstørrelse:"
1357
+
1358
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:3057
1359
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:493
1360
+ msgid "Format"
1361
+ msgstr "Format"
1362
+
1363
+ #: products/photocrati_nextgen/modules/lightbox/package.module.lightbox.php:73
1364
+ msgid "Full Size"
1365
+ msgstr "Fuld størrelse"
1366
+
1367
+ #: products/photocrati_nextgen/modules/attach_to_post/package.module.attach_to_post.php:363
1368
+ #:
1369
+ #: products/photocrati_nextgen/modules/nextgen_gallery_display/package.module.nextgen_gallery_display.php:1872
1370
+ msgid "Galleries"
1371
+ msgstr "Gallerier"
1372
+
1373
+ #: products/photocrati_nextgen/modules/nextgen_basic_album/package.module.nextgen_basic_album.php:843
1374
+ msgid "Galleries per page"
1375
+ msgstr "Gallerier pr. Side"
1376
+
1377
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/upload_images.php:2
1378
+ #:
1379
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/import_media_library.php:3
1380
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:322
1381
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:155
1382
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:155
1383
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:168
1384
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:168
1385
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:374
1386
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:431
1387
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:463
1388
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/rewrite.php:217
1389
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/rewrite.php:226
1390
+ msgid "Gallery"
1391
+ msgstr "Galleri"
1392
+
1393
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:629
1394
+ #, php-format
1395
+ msgid "Gallery <strong>%s</strong> successfully created!"
1396
+ msgid_plural "Galleries <strong>%s</strong> successfully created!"
1397
+ msgstr[0] "Galleri <strong>%s</strong> blev oprettet!"
1398
+ msgstr[1] "Gallerier <strong>%s</strong> blev oprettet!"
1399
+
1400
+ #: products/photocrati_nextgen/modules/nextgen_xmlrpc/package.module.nextgen_xmlrpc.php:582
1401
+ #, php-format
1402
+ msgid "Gallery creation failed for \"%1$s\"%2$s."
1403
+ msgstr "Gallery oprettelse mislykkedes for \"%1$s\"%2$s."
1404
+
1405
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:604
1406
+ msgid "Gallery deleted successfully "
1407
+ msgstr "Galleriet er slettet korrekt"
1408
+
1409
+ #: products/photocrati_nextgen/modules/widget/templates/form_gallery.php:107
1410
+ msgid "Gallery ID"
1411
+ msgstr "Galleri-id"
1412
+
1413
+ #: products/photocrati_nextgen/modules/widget/templates/form_gallery.php:114
1414
+ msgid "Gallery IDs, separated by commas."
1415
+ msgstr "Galleri-id'er, adskilt af kommaer."
1416
+
1417
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:41
1418
+ msgid "Gallery not found."
1419
+ msgstr "Galleri blev ikke fundet."
1420
+
1421
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/wpmu.php:65
1422
+ msgid "Gallery path"
1423
+ msgstr "Galleri sti"
1424
+
1425
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:145
1426
+ msgid "Gallery path does not exist and could not be created"
1427
+ msgstr "Galleri sti findes ikke og kunne ikke oprettes"
1428
+
1429
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:293
1430
+ #:
1431
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:164
1432
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/wpmu.php:36
1433
+ #, php-format
1434
+ msgid "Gallery path must be located in %s"
1435
+ msgstr "Galleri sti skal være placeret i %s"
1436
+
1437
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:406
1438
+ msgid "Gallery path:"
1439
+ msgstr "Galleri sti:"
1440
+
1441
+ #: products/photocrati_nextgen/modules/nextgen_gallery_display/module.nextgen_gallery_display.php:374
1442
+ #:
1443
+ #: products/photocrati_nextgen/modules/nextgen_gallery_display/module.nextgen_gallery_display.php:447
1444
+ #:
1445
+ #: products/photocrati_nextgen/modules/nextgen_gallery_display/package.module.nextgen_gallery_display.php:20
1446
+ msgid "Gallery Settings"
1447
+ msgstr "Galleriindstillinger"
1448
+
1449
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:338
1450
+ msgid "Gallery settings"
1451
+ msgstr "Galleri indstillinger"
1452
+
1453
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:121
1454
+ #, php-format
1455
+ msgid ""
1456
+ "Gallery successfully created. <a href=\"%s\" target=\"_blank\">Manage "
1457
+ "gallery</a>"
1458
+ msgstr ""
1459
+ "Galleri blev oprettet. <a href=\"%s\" target=\"_blank\"> Administrer galleri "
1460
+ "</a>"
1461
+
1462
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/upload_images.php:9
1463
+ #:
1464
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/import_media_library.php:10
1465
+ msgid "Gallery title"
1466
+ msgstr "Gallerititel"
1467
+
1468
+ #: products/photocrati_nextgen/modules/nextgen_admin/package.module.nextgen_admin.php:500
1469
+ msgid "Gallery width"
1470
+ msgstr "Galleri bredde"
1471
+
1472
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:172
1473
+ msgid "Gallery Wizard."
1474
+ msgstr "Galleri Wizard."
1475
+
1476
+ #: products/photocrati_nextgen/modules/attach_to_post/package.module.attach_to_post.php:139
1477
+ #, php-format
1478
+ msgid "Gallery: %s"
1479
+ msgstr "Galleri: %s"
1480
+
1481
+ #: products/photocrati_nextgen/modules/ngglegacy/nggallery.php:292
1482
+ msgid "Get help"
1483
+ msgstr "Få hjælp"
1484
+
1485
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:386
1486
+ msgid "Get help with NextGEN Gallery"
1487
+ msgstr "Få hjælp til NextGEN Gallery"
1488
+
1489
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:291
1490
+ msgid "Get NextGEN Pro Now"
1491
+ msgstr "Få NextGEN Pro nu"
1492
+
1493
+ #: products/photocrati_nextgen/modules/nextgen_pro_upgrade/package.module.nextgen_pro_upgrade.php:56
1494
+ msgid "Get Premium Extensions"
1495
+ msgstr "Få Premium-udvidelser"
1496
+
1497
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:395
1498
+ msgid "Get your language pack"
1499
+ msgstr "Hent din sprogpakke"
1500
+
1501
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:119
1502
+ msgid "Go"
1503
+ msgstr "Videre"
1504
+
1505
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:290
1506
+ msgid ""
1507
+ "Gorgeous new gallery displays, image protection, full screen lightbox, "
1508
+ "commenting and social sharing for individual images, proofing, ecommerce, "
1509
+ "digital downloads, and more."
1510
+ msgstr ""
1511
+ "Dejligt nyt galleri viser, billedbeskyttelse, fuld skærm lysboks, "
1512
+ "kommentering og social deling til individuelle billeder, proofing, e-handel, "
1513
+ "digitale downloads og meget mere."
1514
+
1515
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:373
1516
+ msgid "Graphic Library"
1517
+ msgstr "Grafisk bibliotek"
1518
+
1519
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:148
1520
+ msgid "Heading for related images"
1521
+ msgstr "Overskrift til relaterede billeder"
1522
+
1523
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:3057
1524
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:486
1525
+ msgid "Headline"
1526
+ msgstr "Overskrift"
1527
+
1528
+ #: products/photocrati_nextgen/modules/widget/templates/form_slideshow.php:53
1529
+ msgid "Height"
1530
+ msgstr "Højde"
1531
+
1532
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:148
1533
+ msgid "Height:"
1534
+ msgstr "Højde:"
1535
+
1536
+ #: products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php:290
1537
+ msgid ""
1538
+ "Hello, it looks like you don't have any galleries, this wizard will guide "
1539
+ "you through creating your first gallery."
1540
+ msgstr ""
1541
+ "Hej, det ser ud til, at du ikke har nogen gallerier. Denne guide leder dig "
1542
+ "gennem oprettelse af dit første galleri."
1543
+
1544
+ #: products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php:320
1545
+ msgid ""
1546
+ "Hello, this wizard will guide you through creating a NextGEN gallery and "
1547
+ "inserting it into a page. Click \"Next step\" to proceed."
1548
+ msgstr ""
1549
+ "Hej, denne guide leder dig gennem oprettelse af et NextGEN-galleri og "
1550
+ "indsætter det på en side. Klik på \"Næste trin\" for at fortsætte."
1551
+
1552
+ #: products/photocrati_nextgen/modules/nextgen_admin/templates/review_notice.php:5
1553
+ #, php-format
1554
+ msgid ""
1555
+ "Hey <strong>%s</strong>, you've created %d NextGEN galleries! Awesome! Could "
1556
+ "I ask you to give us a 5-star rating really quickly on <a %s>WordPress."
1557
+ "org</a>? It helps other WordPress users and motivates us to keep improving. "
1558
+ "You can also just send us feedback <a %s>here</a>. Thanks! ~ Nathan Singh "
1559
+ "(founder of Imagely/NextGEN Gallery"
1560
+ msgstr ""
1561
+ "Hej <strong>%s </ strong>, du har oprettet %d NextGEN gallerier! Fantastisk! "
1562
+ "Kan jeg bede dig om at give os en 5-stjernet vurdering meget hurtigt på <a "
1563
+ "%s> WordPress.org </a>? Det hjælper andre WordPress-brugere og motiverer os "
1564
+ "til fortsat at forbedre. Du kan også bare sende os feedback <a %s> her </a>. "
1565
+ "Tak! ~ Nathan Singh (grundlægger af Imagely / NextGEN Gallery"
1566
+
1567
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/media-upload.php:238
1568
+ msgid "Hide"
1569
+ msgstr "Skjul"
1570
+
1571
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:148
1572
+ msgid "How should related images be matched?"
1573
+ msgstr "Hvordan skal relaterede billeder være match?"
1574
+
1575
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:697
1576
+ msgid "How will you generate a watermark?"
1577
+ msgstr "Hvordan vil du generere et vandmærke?"
1578
+
1579
+ #: products/photocrati_nextgen/modules/nextgen_basic_album/package.module.nextgen_basic_album.php:843
1580
+ msgid "How would you like galleries to be displayed?"
1581
+ msgstr "Hvordan vil du have gallerierne til at blive vist?"
1582
+
1583
+ #. Author URI of the plugin
1584
+ msgid "https://www.imagely.com"
1585
+ msgstr "https://www.imagely.com"
1586
+
1587
+ #. URI of the plugin
1588
+ msgid "https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/"
1589
+ msgstr "https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/"
1590
+
1591
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:156
1592
+ msgid "ID"
1593
+ msgstr "ID"
1594
+
1595
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/package.module.nextgen_basic_gallery.php:394
1596
+ msgid ""
1597
+ "If pagination is used this option will show all images in the modal window "
1598
+ "(Thickbox, Lightbox etc.) This increases page load."
1599
+ msgstr ""
1600
+ "Hvis der anvendes sideinddeling, vil denne mulighed vise alle billeder i "
1601
+ "modalvinduet (Thickbox, Lightbox osv.) Dette øger sidebelastningen."
1602
+
1603
+ #: products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php:425
1604
+ msgid ""
1605
+ "If you close this message, you can also launch the Gallery Wizard at any "
1606
+ "time from the"
1607
+ msgstr ""
1608
+ "Hvis du lukker denne besked, kan du også starte Galleri Wizard til enhver "
1609
+ "tid fra "
1610
+
1611
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:93
1612
+ msgid "If you have problems, please create directory"
1613
+ msgstr "Hvis du har problemer, skal du oprette mappe"
1614
+
1615
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:573
1616
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:398
1617
+ msgid "Ignore the aspect ratio, no portrait thumbnails"
1618
+ msgstr "Ignorer billedformatet, ingen portræt miniaturer"
1619
+
1620
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:555
1621
+ msgid "Ignore the aspect ratio, no portrait thumbnails?"
1622
+ msgstr "Ignorer billedformatet, ingen portræt miniaturebilleder?"
1623
+
1624
+ #: products/photocrati_nextgen/modules/lightbox/package.module.lightbox.php:73
1625
+ #: products/photocrati_nextgen/modules/lightbox/package.module.lightbox.php:81
1626
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:467
1627
+ #:
1628
+ #: products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/templates/imagebrowser-simple-template.php:54
1629
+ msgid "Image"
1630
+ msgstr "Billede"
1631
+
1632
+ #: products/photocrati_nextgen/modules/nextgen_gallery_display/package.module.nextgen_gallery_display.php:2443
1633
+ msgid "Image crop"
1634
+ msgstr "Beskær billede"
1635
+
1636
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/package.module.nextgen_addgallery_page.php:144
1637
+ #:
1638
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/package.module.nextgen_addgallery_page.php:293
1639
+ #:
1640
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/package.module.nextgen_addgallery_page.php:309
1641
+ msgid "Image generation failed"
1642
+ msgstr "Billedgenerering mislykkedes"
1643
+
1644
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:3057
1645
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:495
1646
+ msgid "Image Height"
1647
+ msgstr "Billedhøjde"
1648
+
1649
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:103
1650
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-sort.php:105
1651
+ msgid "Image ID"
1652
+ msgstr "Billede ID"
1653
+
1654
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/media-upload.php:243
1655
+ msgid "Image ID:"
1656
+ msgstr "Billede ID:"
1657
+
1658
+ #: products/photocrati_nextgen/modules/imagify/package.module.imagify.php:25
1659
+ msgid "Image Optimization"
1660
+ msgstr "Billedoptimering"
1661
+
1662
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:95
1663
+ msgid "Image Options"
1664
+ msgstr "Billedindstillinger"
1665
+
1666
+ #: products/photocrati_nextgen/modules/nextgen_basic_singlepic/package.module.nextgen_basic_singlepic.php:191
1667
+ #:
1668
+ #: products/photocrati_nextgen/modules/nextgen_gallery_display/package.module.nextgen_gallery_display.php:2442
1669
+ msgid "Image quality"
1670
+ msgstr "Billede kvalitet"
1671
+
1672
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/rotate.php:68
1673
+ msgid "Image rotated"
1674
+ msgstr "Billede roteret"
1675
+
1676
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:670
1677
+ msgid "Image URL:"
1678
+ msgstr "Billedwebadresse:"
1679
+
1680
+ #: products/photocrati_nextgen/modules/nextgen_gallery_display/package.module.nextgen_gallery_display.php:2444
1681
+ msgid "Image watermark"
1682
+ msgstr "Billede vandmærke"
1683
+
1684
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:3057
1685
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:494
1686
+ msgid "Image Width"
1687
+ msgstr "Billedbredde"
1688
+
1689
+ #. Author of the plugin
1690
+ #: nggallery.php:939
1691
+ msgid "Imagely"
1692
+ msgstr "Imagely"
1693
+
1694
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/package.module.nextgen_basic_gallery.php:374
1695
+ msgid "Images per page"
1696
+ msgstr "Billeder pr. Side"
1697
+
1698
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:387
1699
+ msgid "Images per page:"
1700
+ msgstr "Billeder pr. Side:"
1701
+
1702
+ #: products/photocrati_nextgen/modules/nextgen_basic_tagcloud/package.module.nextgen_basic_tagcloud.php:269
1703
+ #, php-format
1704
+ msgid "Images tagged &quot;%s&quot;"
1705
+ msgstr "Billeder tagget &quot;%s&quot;"
1706
+
1707
+ #: products/photocrati_nextgen/modules/imagify/package.module.imagify.php:48
1708
+ msgid "Imagify has been successfully activated"
1709
+ msgstr "Imagify er blevet aktiveret"
1710
+
1711
+ #: products/photocrati_nextgen/modules/imagify/package.module.imagify.php:50
1712
+ msgid "Imagify is already activated"
1713
+ msgstr "Imagify er allerede aktiveret"
1714
+
1715
+ #: products/photocrati_nextgen/modules/imagify/package.module.imagify.php:43
1716
+ msgid "Imagify Plugin Page"
1717
+ msgstr "Imagify Plugin Side"
1718
+
1719
+ #: products/photocrati_nextgen/modules/imagify/package.module.imagify.php:44
1720
+ msgid "Imagify Website"
1721
+ msgstr "Imagify Hjemmeside"
1722
+
1723
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/package.module.nextgen_addgallery_page.php:50
1724
+ #, php-format
1725
+ msgid "Import %d image(s)"
1726
+ msgstr "Importer %d billede(r)"
1727
+
1728
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/package.module.nextgen_addgallery_page.php:42
1729
+ #, php-format
1730
+ msgid "Import %s images"
1731
+ msgstr "Importer %s billeder"
1732
+
1733
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/package.module.nextgen_addgallery_page.php:42
1734
+ msgid "Import 1 image"
1735
+ msgstr "Importer 1 billede"
1736
+
1737
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/package.module.nextgen_addgallery_page.php:11
1738
+ #:
1739
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/import_folder.php:12
1740
+ msgid "Import Folder"
1741
+ msgstr "Importer mappe"
1742
+
1743
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/package.module.nextgen_addgallery_page.php:34
1744
+ msgid "Import from WordPress Media Library"
1745
+ msgstr "Import fra WordPress Media Library"
1746
+
1747
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/package.module.nextgen_addgallery_page.php:42
1748
+ msgid "Import Images into NextGen Gallery"
1749
+ msgstr "Import billeder til NextGen Gallery"
1750
+
1751
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:397
1752
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:196
1753
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:579
1754
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:703
1755
+ msgid "Import metadata"
1756
+ msgstr "Importer metadata"
1757
+
1758
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/package.module.nextgen_addgallery_page.php:42
1759
+ #:
1760
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/import_folder.php:49
1761
+ msgid "Importing gallery"
1762
+ msgstr "Importerer galleri"
1763
+
1764
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/package.module.nextgen_addgallery_page.php:42
1765
+ #:
1766
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/import_folder.php:51
1767
+ msgid "In Progress..."
1768
+ msgstr "I gang..."
1769
+
1770
+ #: products/photocrati_nextgen/modules/nextgen_xmlrpc/package.module.nextgen_xmlrpc.php:689
1771
+ #, php-format
1772
+ msgid "Inadequate system permissions to write image (%1$s)."
1773
+ msgstr "Utilstrækkelige systemtilladelser til at skrive billede (%1$s)."
1774
+
1775
+ #: products/photocrati_nextgen/modules/attach_to_post/templates/display_tab.php:10
1776
+ msgid "Insert Displayed Gallery"
1777
+ msgstr "Indsæt Vist Galleri"
1778
+
1779
+ #: products/photocrati_nextgen/modules/imagify/package.module.imagify.php:56
1780
+ msgid "Install and activate Imagify"
1781
+ msgstr "Installer og aktiver Imagify"
1782
+
1783
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/package.module.nextgen_basic_gallery.php:309
1784
+ msgid "Interval"
1785
+ msgstr "Interval"
1786
+
1787
+ #: products/photocrati_nextgen/modules/nextgen_pro_upgrade/package.module.nextgen_pro_upgrade.php:53
1788
+ msgid ""
1789
+ "Introducing the most powerful gallery system ever made for WordPress. Watch "
1790
+ "our 30 second video, or click below to learn more about NextGEN premium "
1791
+ "extensions and support."
1792
+ msgstr ""
1793
+ "Introduktion til det mest kraftfulde gallerisystem, der nogensinde er lavet "
1794
+ "til WordPress. Se vores 30 sekunders video, eller klik nedenfor for at lære "
1795
+ "mere om NextGEN premium-udvidelser og support."
1796
+
1797
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:1191
1798
+ #:
1799
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:3367
1800
+ msgid "Invalid image file. Acceptable formats: JPG, GIF, and PNG."
1801
+ msgstr "Ugyldig billedfil. Acceptable formater: JPG, GIF og PNG."
1802
+
1803
+ #: products/photocrati_nextgen/modules/ngglegacy/xml/media-rss.php:120
1804
+ msgid "Invalid MediaRSS command"
1805
+ msgstr "Ugyldig MediaRSS-kommando"
1806
+
1807
+ #: products/photocrati_nextgen/modules/attach_to_post/package.module.attach_to_post.php:189
1808
+ msgid "Invalid request"
1809
+ msgstr "Ugyldig forespørgsel"
1810
+
1811
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/showmeta.php:89
1812
+ msgid "IPTC Data"
1813
+ msgstr "IPTC Data"
1814
+
1815
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:83
1816
+ msgid "is not writeable !"
1817
+ msgstr "er ikke skrivbar!"
1818
+
1819
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:3057
1820
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:468
1821
+ msgid "ISO"
1822
+ msgstr "ISO"
1823
+
1824
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:148
1825
+ msgid "It is recommended that your images be resized to be web friendly"
1826
+ msgstr "Det anbefales, at dine billeder skal ændres for at være webvenlige"
1827
+
1828
+ #: products/photocrati_nextgen/modules/nextgen_basic_album/package.module.nextgen_basic_album.php:851
1829
+ msgid "Items per page"
1830
+ msgstr "Elementer pr. Side"
1831
+
1832
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:219
1833
+ msgid ""
1834
+ "Jared is a professional wedding and lifestyle photographer. He also travels "
1835
+ "the world giving lectures and workshops on photography, lighting, and post-"
1836
+ "production efficiency and workflow. His interactive style, and attention to "
1837
+ "detail and craft make him an entertaining and demanding photography "
1838
+ "instructor."
1839
+ msgstr ""
1840
+ "Jared er en professionel bryllups- og livsstilsfotograf. Han rejser også "
1841
+ "verden og giver foredrag og workshops om fotografering, belysning og "
1842
+ "efterproduktion effektivitet og arbejdsgang. Hans interaktive stil og "
1843
+ "opmærksomhed på detaljer og håndværk gør ham til en underholdende og "
1844
+ "krævende fotografinstruktør."
1845
+
1846
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:42
1847
+ msgid "Javascript URL"
1848
+ msgstr "Javascript URL"
1849
+
1850
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:201
1851
+ msgid ""
1852
+ "Jeff and Erin are a luxury husband and wife photography team who deeply love "
1853
+ "each other and their photography clients. They shoot weddings and "
1854
+ "engagements all over the U.S. and beyond. With three photography businesses "
1855
+ "that serve different clientele, they have unique insights into business "
1856
+ "strategies and are passionate about improving the day to day lives of other "
1857
+ "photographers."
1858
+ msgstr ""
1859
+ "Jeff og Erin er en luksus mand og kone fotograferings team, der dybt elsker "
1860
+ "hinanden og deres fotografering klienter. De skyder bryllupper og "
1861
+ "engagementer overalt i USA og hinsides. Med tre fotograferingsvirksomheder, "
1862
+ "der tjener forskellige kunder, har de enestående indsigt i "
1863
+ "forretningsstrategier og er lidenskabelige med at forbedre de daglige liv "
1864
+ "hos andre fotografer."
1865
+
1866
+ #: products/photocrati_nextgen/modules/nextgen_xmlrpc/package.module.nextgen_xmlrpc.php:164
1867
+ msgid "Job could not be added."
1868
+ msgstr "Job kunne ikke tilføjes."
1869
+
1870
+ #: products/photocrati_nextgen/modules/nextgen_xmlrpc/package.module.nextgen_xmlrpc.php:209
1871
+ msgid "Job execution is locked."
1872
+ msgstr "Jobudførelse er låst."
1873
+
1874
+ #: products/photocrati_nextgen/modules/nextgen_xmlrpc/package.module.nextgen_xmlrpc.php:245
1875
+ msgid "Job list is empty."
1876
+ msgstr "Jobliste er tom."
1877
+
1878
+ #: products/photocrati_nextgen/modules/nextgen_xmlrpc/package.module.nextgen_xmlrpc.php:235
1879
+ msgid "Job list is finished."
1880
+ msgstr "Jobliste er færdig."
1881
+
1882
+ #: products/photocrati_nextgen/modules/nextgen_xmlrpc/package.module.nextgen_xmlrpc.php:238
1883
+ msgid "Job list is unfinished."
1884
+ msgstr "Joblisten er ufærdig."
1885
+
1886
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/import_folder.php:11
1887
+ msgid "Keep images in original location."
1888
+ msgstr "Gem billeder på originalpladsen."
1889
+
1890
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:3057
1891
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:477
1892
+ msgid "Keywords"
1893
+ msgstr "Nøgleord"
1894
+
1895
+ #: products/photocrati_nextgen/modules/lightbox/package.module.lightbox.php:65
1896
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:298
1897
+ msgid "L O A D I N G"
1898
+ msgstr "INDLÆSER"
1899
+
1900
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:3057
1901
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:491
1902
+ msgid "Last modified"
1903
+ msgstr "Sidst ændret"
1904
+
1905
+ #: products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php:425
1906
+ msgid "Launch the Gallery Wizard"
1907
+ msgstr "Start Galleri Wizard"
1908
+
1909
+ #: products/photocrati_nextgen/modules/nextgen_pro_upgrade/package.module.nextgen_pro_upgrade.php:57
1910
+ msgid "Learn More"
1911
+ msgstr "Lær mere"
1912
+
1913
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:43
1914
+ msgid "Least used"
1915
+ msgstr "Mindst anvendte"
1916
+
1917
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/import_folder.php:7
1918
+ msgid "Leave blank for folder name"
1919
+ msgstr "Efterlad blank for mappenavn"
1920
+
1921
+ #: products/photocrati_nextgen/modules/nextgen_basic_singlepic/package.module.nextgen_basic_singlepic.php:207
1922
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/publish.php:49
1923
+ msgid "Left"
1924
+ msgstr "Venstre"
1925
+
1926
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:244
1927
+ msgid "Lightbox Effects"
1928
+ msgstr "Lightbox effekter"
1929
+
1930
+ #: products/photocrati_nextgen/modules/widget/templates/form_slideshow.php:40
1931
+ msgid "Limit"
1932
+ msgstr "Begrænsning"
1933
+
1934
+ #: products/photocrati_nextgen/modules/nextgen_basic_singlepic/package.module.nextgen_basic_singlepic.php:187
1935
+ msgid "Link target"
1936
+ msgstr "Link mål"
1937
+
1938
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:421
1939
+ msgid "Link to page:"
1940
+ msgstr "Link til side:"
1941
+
1942
+ #: products/photocrati_nextgen/modules/widget/package.module.widget.php:177
1943
+ msgid "Link to the main image feed"
1944
+ msgstr "Link til hovedbilledet feed"
1945
+
1946
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:555
1947
+ msgid "List of default sizes used for thumbnails and images"
1948
+ msgstr ""
1949
+ "Liste over standardstørrelser, der bruges til miniaturebilleder og billeder"
1950
+
1951
+ #: products/photocrati_nextgen/modules/lightbox/package.module.lightbox.php:73
1952
+ msgid "Loading..."
1953
+ msgstr "Indlæser..."
1954
+
1955
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:3057
1956
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:482
1957
+ msgid "Location"
1958
+ msgstr "Placering"
1959
+
1960
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/roles.php:32
1961
+ msgid "Main NextGEN Gallery overview"
1962
+ msgstr "Hovedoversigt over NextGEN Gallery"
1963
+
1964
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/templates/manage_gallery/gallery_create_page_field.php:3
1965
+ msgid "Main Page (no parent)"
1966
+ msgstr "Hovedside (ingen forælder)"
1967
+
1968
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:3057
1969
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:474
1970
+ msgid "Make"
1971
+ msgstr "Lav"
1972
+
1973
+ #: products/photocrati_nextgen/modules/attach_to_post/package.module.attach_to_post.php:505
1974
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:440
1975
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:158
1976
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:158
1977
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:193
1978
+ msgid "Manage Albums"
1979
+ msgstr "Administrer album"
1980
+
1981
+ #: products/photocrati_nextgen/modules/attach_to_post/package.module.attach_to_post.php:502
1982
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:157
1983
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:157
1984
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:191
1985
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:173
1986
+ msgid "Manage Galleries"
1987
+ msgstr "Administrer gallerier"
1988
+
1989
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/roles.php:44
1990
+ msgid "Manage gallery"
1991
+ msgstr "Administrer galleri"
1992
+
1993
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/package.module.nextgen_addgallery_page.php:388
1994
+ msgid "Manage gallery {name}"
1995
+ msgstr "Administrer galleri {name}"
1996
+
1997
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:99
1998
+ msgid "Manage image tags"
1999
+ msgstr "Administrer billede tags"
2000
+
2001
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/roles.php:48
2002
+ msgid "Manage others gallery"
2003
+ msgstr "Administrer andre galleri"
2004
+
2005
+ #: products/photocrati_nextgen/modules/attach_to_post/package.module.attach_to_post.php:508
2006
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:159
2007
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:159
2008
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:195
2009
+ msgid "Manage Tags"
2010
+ msgstr "Administrer Tags"
2011
+
2012
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/roles.php:52
2013
+ msgid "Manage tags"
2014
+ msgstr "Administrer tags"
2015
+
2016
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:482
2017
+ msgid "Maximize the widget content"
2018
+ msgstr "Maksimér widgetindholdet"
2019
+
2020
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:148
2021
+ #, fuzzy
2022
+ msgid "Maximum # of related images to display"
2023
+ msgstr "Maksimal antal relaterede billeder, der skal vises"
2024
+
2025
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/package.module.nextgen_basic_gallery.php:317
2026
+ msgid "Maximum dimensions"
2027
+ msgstr "Maksimale dimensioner"
2028
+
2029
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:309
2030
+ msgid "Maximum image count"
2031
+ msgstr "Maksimal billedantal"
2032
+
2033
+ #: products/photocrati_nextgen/modules/nextgen_basic_album/package.module.nextgen_basic_album.php:851
2034
+ msgid "Maximum number of galleries or sub-albums to appear on a single page"
2035
+ msgstr "Maksimalt antal gallerier eller underalbummer vises på en enkelt side"
2036
+
2037
+ #: products/photocrati_nextgen/modules/nextgen_basic_tagcloud/package.module.nextgen_basic_tagcloud.php:96
2038
+ msgid "Maximum number of tags"
2039
+ msgstr "Maksimalt antal tags"
2040
+
2041
+ #: products/photocrati_nextgen/modules/widget/package.module.widget.php:177
2042
+ msgid "Media RSS"
2043
+ msgstr "Media RSS"
2044
+
2045
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:195
2046
+ msgid "Meet the Imagely Product Ambassadors"
2047
+ msgstr "Mød Imagely`s Produkt ambassadører"
2048
+
2049
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:302
2050
+ msgid ""
2051
+ "Meet the new series of Genesis child themes by Imagely: gorgeous, responsive "
2052
+ "image-centric themes for photographers or anyone with visually rich websites."
2053
+ msgstr ""
2054
+ "Mød den nye serie af Genesis børne temaer af Imagely: smukke, responsive "
2055
+ "billede-centreret temaer for fotografer eller nogen med visuelt rige "
2056
+ "hjemmesider."
2057
+
2058
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:75
2059
+ msgid "Memory usage"
2060
+ msgstr "Hukommelsesforbrug"
2061
+
2062
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/tags.php:143
2063
+ #, php-format
2064
+ msgid ""
2065
+ "Merge tag(s) &laquo;%1$s&raquo; to &laquo;%2$s&raquo;. %3$s objects edited."
2066
+ msgstr ""
2067
+ "Flet tag(s) & laquo;&laquo;%1$s&raquo; to &laquo;%2$s&raquo;. %3$s objekter "
2068
+ "redigeret."
2069
+
2070
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:312
2071
+ msgid "Meta"
2072
+ msgstr "Meta"
2073
+
2074
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/showmeta.php:29
2075
+ msgid "Meta Data"
2076
+ msgstr "Meta Data"
2077
+
2078
+ #: products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser-exif.php:38
2079
+ msgid "Meta data"
2080
+ msgstr "Meta data"
2081
+
2082
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:483
2083
+ msgid "Minimize the widget content"
2084
+ msgstr "Minimér widgetindholdet"
2085
+
2086
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:305
2087
+ msgid "Miscellaneous"
2088
+ msgstr "Diverse"
2089
+
2090
+ #: products/photocrati_nextgen/modules/attach_to_post/package.module.attach_to_post.php:153
2091
+ msgid "Missing parameters"
2092
+ msgstr "Manglende parametre"
2093
+
2094
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:390
2095
+ msgid "More Help & Info"
2096
+ msgstr "Mere hjælp og info"
2097
+
2098
+ #: products/photocrati_nextgen/modules/imagify/package.module.imagify.php:41
2099
+ msgid "More on Imagify:"
2100
+ msgstr "Mere om Imagify:"
2101
+
2102
+ #: products/photocrati_nextgen/modules/imagify/package.module.imagify.php:42
2103
+ msgid "More on why we recommend Imagify:"
2104
+ msgstr "Mere om hvorfor vi anbefaler Imagify:"
2105
+
2106
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:42
2107
+ msgid "Most popular"
2108
+ msgstr "Mest populære"
2109
+
2110
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:253
2111
+ msgid "Move image to..."
2112
+ msgstr "Flyt billede til ..."
2113
+
2114
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:401
2115
+ msgid "Move to..."
2116
+ msgstr "Flyt til ..."
2117
+
2118
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:76
2119
+ msgid "MYSQL Version"
2120
+ msgstr "MYSQL Version"
2121
+
2122
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:38
2123
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:42
2124
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:46
2125
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:50
2126
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:54
2127
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:58
2128
+ msgid "N/A"
2129
+ msgstr "N/A"
2130
+
2131
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:720
2132
+ msgid "Name"
2133
+ msgstr "Navn"
2134
+
2135
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:237
2136
+ msgid ""
2137
+ "Named one of the Top 10 Wedding Photographers in the World by American Photo "
2138
+ "magazine, David is a celebrated photographer and educator. He is also a "
2139
+ "mountain man with a enviable lifestyle: from his base in rural Washington, "
2140
+ "he travels all over the world teaching workshops, while sharing lessons with "
2141
+ "16,000 photographers in the Abstract Canvas Facebook group."
2142
+ msgstr ""
2143
+ "David er en berømt fotograf og pædagog, der blev navngivet som en af de 10 "
2144
+ "bedste bryllupsfotografer i verden af det amerikanske fotomagasin. Han er "
2145
+ "også en bjergmand med en misundelsesværdig livsstil: Fra sin base i "
2146
+ "landdistrikterne Washington rejser han over hele verden undervisningsmøder, "
2147
+ "mens han deler lektioner med 16.000 fotografer i gruppen Abstract Canvas "
2148
+ "Facebook."
2149
+
2150
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:172
2151
+ msgid "Need help setting up a gallery? Launch the "
2152
+ msgstr "Har du brug for hjælp til at oprette et galleri? Start"
2153
+
2154
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/wpmu.php:59
2155
+ msgid "Network Options"
2156
+ msgstr "Netværksindstillinger"
2157
+
2158
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:169
2159
+ msgid "Network settings"
2160
+ msgstr "Netværks indstillinger"
2161
+
2162
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:332
2163
+ msgid "New Gallery"
2164
+ msgstr "Nyt Galleri"
2165
+
2166
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:891
2167
+ msgid "New gallery page ID"
2168
+ msgstr "Nyt galleri side id"
2169
+
2170
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:201
2171
+ msgid "New tag name(s):"
2172
+ msgstr "Nyt tag navn (e):"
2173
+
2174
+ #: products/photocrati_nextgen/modules/lightbox/package.module.lightbox.php:73
2175
+ #: products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser-caption.php:29
2176
+ #: products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser.php:29
2177
+ #: products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser-exif.php:33
2178
+ #: products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/templates/nextgen_basic_imagebrowser.php:49
2179
+ msgid "Next"
2180
+ msgstr "Næste"
2181
+
2182
+ #: products/photocrati_nextgen/modules/lightbox/package.module.lightbox.php:81
2183
+ msgid "Next &gt;"
2184
+ msgstr "Næste &gt;"
2185
+
2186
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:172
2187
+ msgid "Next tags"
2188
+ msgstr "Næste tags"
2189
+
2190
+ # You can not translate it directly into Danish, it will sound completely wrong.
2191
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/roles.php:68
2192
+ msgid "NextGEN Attach Interface"
2193
+ msgstr "NextGEN Vedhæft interface"
2194
+
2195
+ # You can not translate it directly into Danish, it will sound completely wrong.
2196
+ #: products/photocrati_nextgen/modules/nextgen_basic_album/module.nextgen_basic_album.php:198
2197
+ msgid "NextGEN Basic Compact Album"
2198
+ msgstr "NextGEN Basic Kompakt album"
2199
+
2200
+ # You can not translate it directly into Danish, it will sound completely wrong.
2201
+ #: products/photocrati_nextgen/modules/nextgen_basic_album/module.nextgen_basic_album.php:213
2202
+ msgid "NextGEN Basic Extended Album"
2203
+ msgstr "NextGEN Basic Udvidet album"
2204
+
2205
+ # You can not translate it directly into Danish, it will sound completely wrong.
2206
+ #: products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/module.nextgen_basic_imagebrowser.php:185
2207
+ msgid "NextGEN Basic ImageBrowser"
2208
+ msgstr "NextGEN Basic Billede Browser"
2209
+
2210
+ # You can not translate it directly into Danish, it will sound completely wrong.
2211
+ #: products/photocrati_nextgen/modules/nextgen_basic_singlepic/module.nextgen_basic_singlepic.php:152
2212
+ msgid "NextGEN Basic SinglePic"
2213
+ msgstr "NextGEN Basic Enklet Billede"
2214
+
2215
+ # You can not translate it directly into Danish, it will sound completely wrong.
2216
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/module.nextgen_basic_gallery.php:363
2217
+ msgid "NextGEN Basic Slideshow"
2218
+ msgstr "NextGEN Basic Diasshow"
2219
+
2220
+ # You can not translate it directly into Danish, it will sound completely wrong.
2221
+ #: products/photocrati_nextgen/modules/nextgen_basic_tagcloud/module.nextgen_basic_tagcloud.php:175
2222
+ msgid "NextGEN Basic TagCloud"
2223
+ msgstr "NextGEN Basic TagSky"
2224
+
2225
+ # You can not translate it directly into Danish, it will sound completely wrong.
2226
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/module.nextgen_basic_gallery.php:348
2227
+ msgid "NextGEN Basic Thumbnails"
2228
+ msgstr "NextGEN Basic Miniaturer"
2229
+
2230
+ #. Name of the plugin
2231
+ #: nggallery.php:935
2232
+ #: products/photocrati_nextgen/modules/attach_to_post/module.attach_to_post.php:391
2233
+ #:
2234
+ #: products/photocrati_nextgen/modules/attach_to_post/package.module.attach_to_post.php:464
2235
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/media-upload.php:11
2236
+ msgid "NextGEN Gallery"
2237
+ msgstr "NextGEN Gallery"
2238
+
2239
+ #: nggallery.php:386
2240
+ #, php-format
2241
+ msgid ""
2242
+ "NextGEN Gallery %s is incompatible with this version of NextGEN Pro. Please "
2243
+ "update NextGEN Pro to version %s or higher to restore NextGEN Pro "
2244
+ "functionality."
2245
+ msgstr ""
2246
+ "NextGEN Gallery %s er uforenelig med denne version af NextGEN Pro. Opdater "
2247
+ "NextGEN Pro til version %s eller højere for at gendanne NextGEN Pro-"
2248
+ "funktionaliteten."
2249
+
2250
+ #: products/photocrati_nextgen/modules/nextgen_gallery_display/module.nextgen_gallery_display.php:446
2251
+ msgid "NextGEN Gallery & Album Settings"
2252
+ msgstr "NextGEN Galleri og albumindstillinger"
2253
+
2254
+ #: products/photocrati_nextgen/modules/attach_to_post/package.module.attach_to_post.php:484
2255
+ msgid "NextGEN Gallery - Attach To Post"
2256
+ msgstr "NextGEN Gallery - Vedhæft til post"
2257
+
2258
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/install.php:92
2259
+ msgid ""
2260
+ "NextGEN Gallery : Tables could not created, please check your database "
2261
+ "settings"
2262
+ msgstr ""
2263
+ "NextGEN Gallery: Tabeller kunne ikke oprettes. Kontroller venligst dine "
2264
+ "databaseindstillinger"
2265
+
2266
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:196
2267
+ msgid ""
2268
+ "NextGEN Gallery and other Imagely products are used by some of the best "
2269
+ "photographers in the world. Meet some of the Imagely Ambassadors who are "
2270
+ "putting Imagely and NextGEN Gallery to work professionally."
2271
+ msgstr ""
2272
+ "NextGEN Gallery og andre Imagely produkter bruges af nogle af de bedste "
2273
+ "fotografer i verden. Mød nogle af de Imagely Ambassadører, der sætter "
2274
+ "Imagely og NextGEN Gallery i gang med at arbejde professionelt."
2275
+
2276
+ #: products/photocrati_nextgen/modules/imagify/package.module.imagify.php:36
2277
+ msgid ""
2278
+ "NextGEN Gallery partners with Imagify for best-in-class image optimization. "
2279
+ "Compress images to make galleries faster, all while maintaining image "
2280
+ "quality."
2281
+ msgstr ""
2282
+ "NextGEN Gallery partners med Imagify for optimal billedoptimering. Komprimer "
2283
+ "billeder for at gøre gallerier hurtigere, samtidig med at billedkvaliteten "
2284
+ "opretholdes."
2285
+
2286
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:309
2287
+ msgid ""
2288
+ "NextGEN hides its gallery displays in feeds other than MediaRSS. This "
2289
+ "enables image galleries in feeds."
2290
+ msgstr ""
2291
+ "NextGEN gemmer sine gallerivisninger i andre feeds end MediaRSS. Dette "
2292
+ "muliggør billedgallerier i feeds."
2293
+
2294
+ #: products/photocrati_nextgen/modules/widget/package.module.widget.php:170
2295
+ msgid "NextGEN Media RSS"
2296
+ msgstr "NextGEN Media RSS"
2297
+
2298
+ #: products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php:425
2299
+ msgid "NextGEN Overview page"
2300
+ msgstr "NextGEN Oversigt side"
2301
+
2302
+ #: products/photocrati_nextgen/modules/widget/package.module.widget.php:226
2303
+ msgid "NextGEN Slideshow"
2304
+ msgstr "NextGEN Diasshow"
2305
+
2306
+ #: products/photocrati_nextgen/modules/widget/package.module.widget.php:70
2307
+ msgid "NextGEN Widget"
2308
+ msgstr "NextGEN Widget"
2309
+
2310
+ #: products/photocrati_nextgen/modules/nextgen_other_options/templates/styling_tab.php:13
2311
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:62
2312
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:66
2313
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:70
2314
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:105
2315
+ msgid "No"
2316
+ msgstr "Nej"
2317
+
2318
+ #: products/photocrati_nextgen/modules/ngglegacy/xml/media-rss.php:105
2319
+ msgid "No album ID has been provided as parameter"
2320
+ msgstr "Intet album-id er blevet leveret som parameter"
2321
+
2322
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:448
2323
+ msgid "No album selected"
2324
+ msgstr "Intet album valgt"
2325
+
2326
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:549
2327
+ msgid "No album selected!"
2328
+ msgstr "Intet album valgt!"
2329
+
2330
+ #: products/photocrati_nextgen/modules/nextgen_xmlrpc/package.module.nextgen_xmlrpc.php:853
2331
+ msgid "No album was specified to edit."
2332
+ msgstr "Intet album blev specificeret for at redigere."
2333
+
2334
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/package.module.nextgen_addgallery_page.php:213
2335
+ msgid "No directory specified."
2336
+ msgstr "Ingen mappe angivet."
2337
+
2338
+ #: products/photocrati_nextgen/modules/attach_to_post/package.module.attach_to_post.php:702
2339
+ msgid "No display type selected"
2340
+ msgstr "Ingen skærmtype valgt"
2341
+
2342
+ #: products/photocrati_nextgen/modules/attach_to_post/package.module.attach_to_post.php:363
2343
+ msgid "No entities to display for this source"
2344
+ msgstr "Ingen enheder at vise for denne kilde"
2345
+
2346
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:454
2347
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:314
2348
+ msgid "No entries found"
2349
+ msgstr "Ingen indlæg fundet"
2350
+
2351
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/showmeta.php:82
2352
+ msgid "No exif data"
2353
+ msgstr "Ingen exif data"
2354
+
2355
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/package.module.nextgen_addgallery_page.php:250
2356
+ msgid "No folder specified"
2357
+ msgstr "Ingen mappe angivet"
2358
+
2359
+ #: products/photocrati_nextgen/modules/ngglegacy/xml/media-rss.php:50
2360
+ msgid "No galleries have been yet created."
2361
+ msgstr "Der er endnu ikke oprettet gallerier."
2362
+
2363
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/media-upload.php:194
2364
+ msgid "No gallery"
2365
+ msgstr "Intet galleri"
2366
+
2367
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/package.module.nextgen_addgallery_page.php:111
2368
+ #:
2369
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/package.module.nextgen_addgallery_page.php:280
2370
+ msgid "No gallery name specified"
2371
+ msgstr "Intet galleri navn angivet"
2372
+
2373
+ #: products/photocrati_nextgen/modules/nextgen_xmlrpc/package.module.nextgen_xmlrpc.php:756
2374
+ msgid "No gallery was specified to edit."
2375
+ msgstr "Intet galleri blev specificeret for at redigere."
2376
+
2377
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:111
2378
+ msgid "No GD support"
2379
+ msgstr "Ingen GD support"
2380
+
2381
+ #: products/photocrati_nextgen/modules/nextgen_admin/package.module.nextgen_admin.php:305
2382
+ msgid "No handler defined for this notice"
2383
+ msgstr "Ingen handler defineret for denne meddelelse"
2384
+
2385
+ #: products/photocrati_nextgen/modules/nextgen_xmlrpc/package.module.nextgen_xmlrpc.php:686
2386
+ #, php-format
2387
+ msgid "No image library present, image uploads will fail (%1$s)."
2388
+ msgstr ""
2389
+ "Intet billede bibliotek til stede, billede uploads vil mislykkes (%1$s)."
2390
+
2391
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:241
2392
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:106
2393
+ msgid "No images selected"
2394
+ msgstr "Ingen billeder valgt"
2395
+
2396
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/package.module.nextgen_addgallery_page.php:388
2397
+ msgid "No images were uploaded successfully."
2398
+ msgstr "Ingen billeder blev uploadet korrekt."
2399
+
2400
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/showmeta.php:52
2401
+ msgid "No meta data saved"
2402
+ msgstr "Ingen metadata gemt"
2403
+
2404
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/tags.php:208
2405
+ msgid "No new slug(s) specified!"
2406
+ msgstr "Ingen nye slug(er) specificeret!"
2407
+
2408
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/tags.php:35
2409
+ msgid "No new tag specified!"
2410
+ msgstr "Intet nyt tag er angivet!"
2411
+
2412
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/tags.php:50
2413
+ msgid "No new/old valid tag specified!"
2414
+ msgstr "Intet nyt/gammelt gyldigt tag er angivet!"
2415
+
2416
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/tags.php:112
2417
+ msgid "No objects (post/page) found for specified old tags."
2418
+ msgstr "Ingen objekter (indlæg / side) fundet for angivne gamle tags."
2419
+
2420
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/package.module.nextgen_addgallery_page.php:210
2421
+ #:
2422
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/package.module.nextgen_addgallery_page.php:216
2423
+ msgid ""
2424
+ "No permissions to browse folders. Try refreshing the page or ensuring that "
2425
+ "your user account has sufficient roles/privileges."
2426
+ msgstr ""
2427
+ "Ingen tilladelser til at gennemse mapper. Prøv at opdatere siden eller sikre,"
2428
+ " at din brugerkonto har tilstrækkelige roller/privilegier."
2429
+
2430
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/package.module.nextgen_addgallery_page.php:241
2431
+ #:
2432
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/package.module.nextgen_addgallery_page.php:253
2433
+ msgid ""
2434
+ "No permissions to import folders. Try refreshing the page or ensuring that "
2435
+ "your user account has sufficient roles/privileges."
2436
+ msgstr ""
2437
+ "Ingen tilladelser til at importere mapper. Prøv at opdatere siden eller "
2438
+ "sikre, at din brugerkonto har tilstrækkelige roller/privilegier."
2439
+
2440
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/package.module.nextgen_addgallery_page.php:160
2441
+ #:
2442
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/package.module.nextgen_addgallery_page.php:325
2443
+ msgid ""
2444
+ "No permissions to upload images. Try refreshing the page or ensuring that "
2445
+ "your user account has sufficient roles/privileges."
2446
+ msgstr ""
2447
+ "Ingen tilladelser til at uploade billeder. Prøv at opdatere siden eller "
2448
+ "sikre, at din brugerkonto har tilstrækkelige roller/privilegier."
2449
+
2450
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/templates/manage_gallery/gallery_preview_image_field.php:3
2451
+ msgid "No picture"
2452
+ msgstr "Intet billede"
2453
+
2454
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/tags.php:247
2455
+ msgid "No slug edited."
2456
+ msgstr "Ingen slug redigeret."
2457
+
2458
+ #: products/photocrati_nextgen/modules/nextgen_xmlrpc/package.module.nextgen_xmlrpc.php:682
2459
+ #, php-format
2460
+ msgid "No space available for image (%1$s)."
2461
+ msgstr "Ingen plads til billede (%1$s)."
2462
+
2463
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/tags.php:188
2464
+ msgid "No tag deleted."
2465
+ msgstr "Ingen tag slettet."
2466
+
2467
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/tags.php:141
2468
+ msgid "No tag merged."
2469
+ msgstr "Ingen tag fusioneret."
2470
+
2471
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/tags.php:86
2472
+ msgid "No tag renamed."
2473
+ msgstr "Ingen tag omdøbt."
2474
+
2475
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/tags.php:165
2476
+ msgid "No tag specified!"
2477
+ msgstr "Ingen tag angivet!"
2478
+
2479
+ #: products/photocrati_nextgen/modules/nextgen_xmlrpc/package.module.nextgen_xmlrpc.php:172
2480
+ msgid "No task list was specified."
2481
+ msgstr "Ingen opgaveliste var angivet."
2482
+
2483
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:44
2484
+ msgid "No valid gallery name!"
2485
+ msgstr "Intet gyldigt galleri navn!"
2486
+
2487
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/tags.php:95
2488
+ msgid "No valid new tag."
2489
+ msgstr "Intet gyldigt nyt mærke."
2490
+
2491
+ #: products/photocrati_nextgen/modules/nextgen_basic_singlepic/package.module.nextgen_basic_singlepic.php:207
2492
+ #:
2493
+ #: products/photocrati_nextgen/modules/lightbox/package.module.lightbox.php:50
2494
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/publish.php:47
2495
+ msgid "None"
2496
+ msgstr "Ingen"
2497
+
2498
+ #: products/photocrati_nextgen/modules/nextgen_admin/package.module.nextgen_admin.php:346
2499
+ msgid "Not a valid notice name"
2500
+ msgstr "Ikke et gyldigt varselsnavn"
2501
+
2502
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:605
2503
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/templates/manage_gallery/gallery_link_to_page_field.php:3
2504
+ msgid "Not linked"
2505
+ msgstr "Ikke forbundet"
2506
+
2507
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:25
2508
+ msgid "Not set"
2509
+ msgstr "Ikke indstillet"
2510
+
2511
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/core.php:214
2512
+ #, php-format
2513
+ msgid ""
2514
+ "Note : Based on your server memory limit you should not upload larger images "
2515
+ "then <strong>%d x %d</strong> pixel"
2516
+ msgstr ""
2517
+ "Bemærk: Baseret på din serverhukommelsesgrænse skal du ikke uploade større "
2518
+ "billeder end <strong>%d x %d</strong> pixel"
2519
+
2520
+ #: products/photocrati_nextgen/modules/imagify/package.module.imagify.php:39
2521
+ msgid ""
2522
+ "Note: Imagify is a third party plugin. It is not built or supported by "
2523
+ "NextGEN Gallery."
2524
+ msgstr ""
2525
+ "Bemærk: Imagify er et tredjeparts plugin. Det er ikke bygget eller "
2526
+ "understøttet af NextGEN Gallery."
2527
+
2528
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:309
2529
+ msgid ""
2530
+ "Note: This limit will not apply to slideshow widgets or random galleries "
2531
+ "if/when those galleries specify their own image limits"
2532
+ msgstr ""
2533
+ "Bemærk: Denne grænse gælder ikke for diasshow widgets eller tilfældige "
2534
+ "gallerier, hvis/når disse gallerier angiver deres egne billedgrænser"
2535
+
2536
+ #: products/photocrati_nextgen/modules/nextgen_admin/package.module.nextgen_admin.php:302
2537
+ msgid "Notice is not dismissible"
2538
+ msgstr "Meddelelsen kan ikke afvises"
2539
+
2540
+ #: products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php:391
2541
+ msgid "Now click inside the \"Galleries\" field and select your gallery."
2542
+ msgstr "Klik nu inde i \"Gallerier\" feltet og vælg dit galleri."
2543
+
2544
+ #: products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php:397
2545
+ msgid ""
2546
+ "Now click on the \"Insert Displayed Gallery\" button to insert the gallery "
2547
+ "in your page."
2548
+ msgstr ""
2549
+ "Klik nu på knappen \"Indsæt visning af galleri\" for at indsætte galleriet "
2550
+ "på din side."
2551
+
2552
+ #: products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php:384
2553
+ msgid ""
2554
+ "Now click on the \"What would you like to display?\" section's header to "
2555
+ "expand it."
2556
+ msgstr ""
2557
+ "Klik nu på \"Hvad vil du gerne vise?\" sektionens overskrift for at udvide "
2558
+ "den."
2559
+
2560
+ #: products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php:306
2561
+ #:
2562
+ #: products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php:351
2563
+ msgid ""
2564
+ "Now click the \"Add Files\" button and select some images to add to the "
2565
+ "gallery."
2566
+ msgstr ""
2567
+ "Klik nu på knappen \"Tilføj filer\" og vælg nogle billeder, der skal "
2568
+ "tilføjes til galleriet."
2569
+
2570
+ #: products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php:338
2571
+ msgid "Now click the \"Add Gallery / Images\" tab to add a new gallery."
2572
+ msgstr ""
2573
+ "Klik nu på fanen \"Tilføj galleri / billeder\" for at tilføje et nyt galleri."
2574
+
2575
+ #: products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php:334
2576
+ msgid ""
2577
+ "Now click the \"Add Gallery\" button to open NextGEN's Insert Gallery Window "
2578
+ "(IGW)."
2579
+ msgstr ""
2580
+ "Klik nu på knappen \"Tilføj galleri\" for at åbne NextGEN's Indsæt Galleri "
2581
+ "Vindue (IGW)."
2582
+
2583
+ #: products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php:311
2584
+ #:
2585
+ #: products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php:357
2586
+ msgid "Now click the \"Start Upload\" button to begin the upload process."
2587
+ msgstr "Klik nu på knappen \"Start upload\" for at starte uploadprocessen."
2588
+
2589
+ #: products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php:377
2590
+ msgid ""
2591
+ "Now let's specify which gallery to display. Start by clicking on the "
2592
+ "\"Select a display type\" section header to collapse it."
2593
+ msgstr ""
2594
+ "Lad os nu angive hvilket galleri der skal vises. Start med at klikke på "
2595
+ "afsnittet \"Vælg en skærmtype\" sektion for at kollapse den."
2596
+
2597
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/package.module.nextgen_basic_gallery.php:384
2598
+ msgid "Number of columns to display"
2599
+ msgstr "Antal kolonner, der skal vises"
2600
+
2601
+ #: products/photocrati_nextgen/modules/lightbox/package.module.lightbox.php:73
2602
+ #: products/photocrati_nextgen/modules/lightbox/package.module.lightbox.php:81
2603
+ #: products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser-caption.php:31
2604
+ #: products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser.php:31
2605
+ #: products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser-exif.php:35
2606
+ #: products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/templates/nextgen_basic_imagebrowser.php:55
2607
+ #:
2608
+ #: products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/templates/imagebrowser-simple-template.php:54
2609
+ msgid "of"
2610
+ msgstr "af"
2611
+
2612
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:29
2613
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:33
2614
+ msgid "Off"
2615
+ msgstr "Slukket"
2616
+
2617
+ # Hard to translate
2618
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:697
2619
+ msgid "Offset:"
2620
+ msgstr "Offset:"
2621
+
2622
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:624
2623
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:481
2624
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:517
2625
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:546
2626
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:577
2627
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:342
2628
+ #:
2629
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:371
2630
+ #:
2631
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:402
2632
+ msgid "OK"
2633
+ msgstr "OK"
2634
+
2635
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:28
2636
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:32
2637
+ msgid "On"
2638
+ msgstr "Tændt"
2639
+
2640
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:592
2641
+ #, php-format
2642
+ msgid ""
2643
+ "One or more \"../\" in Gallery paths could be unsafe and NextGen Gallery "
2644
+ "will not delete gallery %s automatically"
2645
+ msgstr ""
2646
+ "En eller flere \"../\" i Galleri-stier kan være usikre, og NextGen Gallery "
2647
+ "vil ikke slette galleri %s"
2648
+
2649
+ #: products/photocrati_nextgen/modules/nextgen_other_options/templates/lightbox_library_tab.php:36
2650
+ msgid "Only apply to NextGEN and WordPress images"
2651
+ msgstr "Anvend kun på NextGEN og WordPress-billeder"
2652
+
2653
+ #: products/photocrati_nextgen/modules/nextgen_other_options/templates/lightbox_library_tab.php:35
2654
+ msgid "Only apply to NextGEN images"
2655
+ msgstr "Anvend kun på NextGEN-billeder"
2656
+
2657
+ #: products/photocrati_nextgen/modules/widget/templates/form_gallery.php:98
2658
+ msgid "Only which are listed"
2659
+ msgstr "Kun som er angivet"
2660
+
2661
+ #: products/photocrati_nextgen/modules/widget/templates/form_gallery.php:95
2662
+ msgid "Only which are not listed"
2663
+ msgstr "Kun som ikke er angivet"
2664
+
2665
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:680
2666
+ msgid "Opacity:"
2667
+ msgstr "Gennemsigtighed:"
2668
+
2669
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:73
2670
+ msgid "Operating System"
2671
+ msgstr "Operativ system"
2672
+
2673
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:106
2674
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:115
2675
+ msgid "Operation successful. Please clear your browser cache."
2676
+ msgstr "Operation succesfuld. Ryd venligst din browsers cache."
2677
+
2678
+ #: products/photocrati_nextgen/modules/widget/templates/form_gallery.php:29
2679
+ msgid "Original images"
2680
+ msgstr "Originale billeder"
2681
+
2682
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:357
2683
+ #:
2684
+ #: products/photocrati_nextgen/modules/nextgen_other_options/module.nextgen_other_options.php:76
2685
+ msgid "Other Options"
2686
+ msgstr "Andre muligheder"
2687
+
2688
+ #: products/photocrati_nextgen/modules/imagify/package.module.imagify.php:45
2689
+ msgid "Our Review of Image Compression Plugins"
2690
+ msgstr "Vores gennemgang af Image Compression Plugins"
2691
+
2692
+ #: products/photocrati_nextgen/modules/nextgen_gallery_display/package.module.nextgen_gallery_display.php:2437
2693
+ msgid "Override image settings"
2694
+ msgstr "Overstyr billedindstillingerne"
2695
+
2696
+ #: products/photocrati_nextgen/modules/nextgen_gallery_display/package.module.nextgen_gallery_display.php:2399
2697
+ msgid "Override thumbnail settings"
2698
+ msgstr "Overstyr miniatureindstillingerne"
2699
+
2700
+ #: products/photocrati_nextgen/modules/nextgen_gallery_display/package.module.nextgen_gallery_display.php:2437
2701
+ msgid "Overriding the image settings will create an additional set of images"
2702
+ msgstr ""
2703
+ "Hvis du overstyrer billedindstillingerne, oprettes et ekstra sæt billeder"
2704
+
2705
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:156
2706
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:187
2707
+ msgid "Overview"
2708
+ msgid_plural "Manage Albums"
2709
+ msgstr[0] "Oversigt"
2710
+ msgstr[1] "Administrer album"
2711
+
2712
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:265
2713
+ msgid "Overwrite"
2714
+ msgstr "Overskriv"
2715
+
2716
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:404
2717
+ msgid "Overwrite tags"
2718
+ msgstr "Overskriv tags"
2719
+
2720
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:722
2721
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/rewrite.php:229
2722
+ msgid "Page"
2723
+ msgstr "Side"
2724
+
2725
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:466
2726
+ msgid "Page ID"
2727
+ msgid_plural "Images"
2728
+ msgstr[0] "Side ID"
2729
+ msgstr[1] "Billeder"
2730
+
2731
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:595
2732
+ msgid "Page Link to"
2733
+ msgstr "Side Link til"
2734
+
2735
+ #: products/photocrati_nextgen/modules/nextgen_basic_singlepic/package.module.nextgen_basic_singlepic.php:187
2736
+ msgid "Parent"
2737
+ msgstr "Forældre"
2738
+
2739
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:84
2740
+ msgid "PCRE Backtracking Limit"
2741
+ msgstr "PCRE Backtracking Begrænsning"
2742
+
2743
+ #: products/photocrati_nextgen/modules/nextgen_admin/package.module.nextgen_admin.php:500
2744
+ msgid "Percent"
2745
+ msgstr "Procent"
2746
+
2747
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:309
2748
+ msgid "Permalink slug"
2749
+ msgstr "Permalink slug"
2750
+
2751
+ #: products/photocrati_nextgen/modules/ngglegacy/view/album-compact.php:63
2752
+ #: products/photocrati_nextgen/modules/ngglegacy/view/album-extend.php:31
2753
+ #: products/photocrati_nextgen/modules/nextgen_basic_album/templates/extended.php:31
2754
+ #:
2755
+ #: products/photocrati_nextgen/modules/nextgen_basic_album/templates/compact.php:41
2756
+ msgid "Photos"
2757
+ msgstr "Billeder"
2758
+
2759
+ #: products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php:130
2760
+ msgid ""
2761
+ "PHP 5.2 will be deprecated in a future version of NextGEN. Please upgrade "
2762
+ "your PHP installation to 5.3 or above."
2763
+ msgstr ""
2764
+ "PHP 5.2 bliver udskrevet i en fremtidig version af NextGEN. Opgrader "
2765
+ "venligst din PHP-installation til 5.3 eller derover."
2766
+
2767
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:80
2768
+ msgid "PHP Allow URL fopen"
2769
+ msgstr "PHP Allow URL fopen"
2770
+
2771
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:86
2772
+ msgid "PHP Exif support"
2773
+ msgstr "PHP Exif support"
2774
+
2775
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:87
2776
+ msgid "PHP IPTC support"
2777
+ msgstr "PHP IPTC support"
2778
+
2779
+ # Hard to translate right
2780
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:83
2781
+ msgid "PHP Max Post Size"
2782
+ msgstr "PHP Max indlægs størrelse"
2783
+
2784
+ # Hard to translate right
2785
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:85
2786
+ msgid "PHP Max Script Execute Time"
2787
+ msgstr "PHP Max Script Execute Time"
2788
+
2789
+ # Hard to translate right
2790
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:82
2791
+ msgid "PHP Max Upload Size"
2792
+ msgstr "PHP Max Upload Størrelse"
2793
+
2794
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:81
2795
+ msgid "PHP Memory Limit"
2796
+ msgstr "PHP Hukommelsesgrænse"
2797
+
2798
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:79
2799
+ msgid "PHP Safe Mode"
2800
+ msgstr "PHP Safe Mode"
2801
+
2802
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:78
2803
+ msgid "PHP Version"
2804
+ msgstr "PHP Version"
2805
+
2806
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:88
2807
+ msgid "PHP XML support"
2808
+ msgstr "PHP XML support"
2809
+
2810
+ #: products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser-caption.php:31
2811
+ #: products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser.php:31
2812
+ #: products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser-exif.php:35
2813
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:91
2814
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/rewrite.php:220
2815
+ #: products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/templates/nextgen_basic_imagebrowser.php:55
2816
+ msgid "Picture"
2817
+ msgstr "Billede"
2818
+
2819
+ #: products/photocrati_nextgen/modules/ngglegacy/nggallery.php:162
2820
+ msgid "Picture tag"
2821
+ msgstr "Billede tag"
2822
+
2823
+ #: products/photocrati_nextgen/modules/ngglegacy/nggallery.php:163
2824
+ msgid "Picture tag: %2$l."
2825
+ msgstr "Billede tag: %2$l."
2826
+
2827
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:699
2828
+ msgid "Pictures deleted successfully "
2829
+ msgstr "Billeder slettet korrekt"
2830
+
2831
+ #: products/photocrati_nextgen/modules/nextgen_admin/package.module.nextgen_admin.php:500
2832
+ msgid "Pixels"
2833
+ msgstr "Pixels"
2834
+
2835
+ #: products/photocrati_nextgen/modules/nextgen_other_options/templates/styling_tab.php:35
2836
+ msgid "Place any custom stylesheets in <strong>wp-content/ngg_styles</strong>"
2837
+ msgstr ""
2838
+ "Placer eventuelle brugerdefinerede stylesheets i <strong>wp-"
2839
+ "content/ngg_styles</strong>"
2840
+
2841
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/package.module.nextgen_addgallery_page.php:50
2842
+ msgid "Please make a selection to continue"
2843
+ msgstr "Foretag et valg for at fortsætte"
2844
+
2845
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:697
2846
+ msgid ""
2847
+ "Please note: You can only activate the watermark under Manage Gallery. This "
2848
+ "action cannot be undone."
2849
+ msgstr ""
2850
+ "Bemærk: Du kan kun aktivere vandmærket under Administrer Galleri. Denne "
2851
+ "handling kan ikke fortrydes."
2852
+
2853
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:697
2854
+ msgid "Position:"
2855
+ msgstr "Position:"
2856
+
2857
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/publish.php:35
2858
+ msgid "Post title"
2859
+ msgstr "Indlæg titel"
2860
+
2861
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-sort.php:103
2862
+ msgid "Presort"
2863
+ msgstr "Forsorter"
2864
+
2865
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:427
2866
+ msgid "Preview image:"
2867
+ msgstr "Forhåndsvis billede:"
2868
+
2869
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:697
2870
+ msgid "Preview of saved settings:"
2871
+ msgstr "Forhåndsvisning af gemte indstillinger:"
2872
+
2873
+ #: products/photocrati_nextgen/modules/lightbox/package.module.lightbox.php:73
2874
+ msgid "Previous"
2875
+ msgstr "Forrige"
2876
+
2877
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:159
2878
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:163
2879
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:176
2880
+ msgid "Previous tags"
2881
+ msgstr "Tidligere tags"
2882
+
2883
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:3057
2884
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:492
2885
+ msgid "Program tool"
2886
+ msgstr "Programværktøj"
2887
+
2888
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:3057
2889
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:483
2890
+ msgid "Province/State"
2891
+ msgstr "Provins/Stat"
2892
+
2893
+ #: products/photocrati_nextgen/modules/nextgen_pro_upgrade/package.module.nextgen_pro_upgrade.php:55
2894
+ msgid "Psst...watch the video ->"
2895
+ msgstr "Psst ... se videoen ->"
2896
+
2897
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/publish.php:58
2898
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:341
2899
+ msgid "Publish"
2900
+ msgstr "Udgiv"
2901
+
2902
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:340
2903
+ msgid "Publish this image"
2904
+ msgstr "Udgiv dette billede"
2905
+
2906
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:929
2907
+ msgid "Published a new post"
2908
+ msgstr "Udgivet et nyt indlæg"
2909
+
2910
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:148
2911
+ msgid "Quality:"
2912
+ msgstr "Kvalitet:"
2913
+
2914
+ #: products/photocrati_nextgen/modules/widget/templates/form_gallery.php:42
2915
+ msgid "random"
2916
+ msgstr "tilfældig"
2917
+
2918
+ #: products/photocrati_nextgen/modules/nextgen_gallery_display/package.module.nextgen_gallery_display.php:1893
2919
+ msgid "Random Images"
2920
+ msgstr "Tilfældige billeder"
2921
+
2922
+ #: products/photocrati_nextgen/modules/nextgen_gallery_display/package.module.nextgen_gallery_display.php:1901
2923
+ msgid "Recent Images"
2924
+ msgstr "Seneste billeder"
2925
+
2926
+ #: products/photocrati_nextgen/modules/widget/templates/form_gallery.php:50
2927
+ msgid "recently added"
2928
+ msgstr "nylig tilføjet"
2929
+
2930
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:352
2931
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:354
2932
+ msgid "Recover"
2933
+ msgstr "Gendan"
2934
+
2935
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:395
2936
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:197
2937
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:569
2938
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:680
2939
+ msgid "Recover from backup"
2940
+ msgstr "Gendan fra backup"
2941
+
2942
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:351
2943
+ msgid "Recover image from backup"
2944
+ msgstr "Gendan billede fra backup"
2945
+
2946
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:697
2947
+ msgid "Refresh preview image"
2948
+ msgstr "Opdater preview billede"
2949
+
2950
+ #: products/photocrati_nextgen/modules/nextgen_settings/module.nextgen_settings.php:77
2951
+ msgid "Related Images"
2952
+ msgstr "Relaterede billeder"
2953
+
2954
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:204
2955
+ msgid "Rename"
2956
+ msgstr "Omdøb"
2957
+
2958
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:184
2959
+ msgid "Rename Tag"
2960
+ msgstr "Omdøb Tag"
2961
+
2962
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/tags.php:88
2963
+ #, php-format
2964
+ msgid "Renamed tag(s) &laquo;%1$s&raquo; to &laquo;%2$s&raquo;"
2965
+ msgstr "Omdøbt tag(s) &laquo;%1$s&raquo; to &laquo;%2$s&raquo;"
2966
+
2967
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:390
2968
+ msgid ""
2969
+ "Replace all existing options and gallery options with their default settings"
2970
+ msgstr ""
2971
+ "Erstat alle eksisterende indstillinger og galleri muligheder med deres "
2972
+ "standardindstillinger"
2973
+
2974
+ #: products/photocrati_nextgen/modules/nextgen_xmlrpc/package.module.nextgen_xmlrpc.php:691
2975
+ #, php-format
2976
+ msgid "Requested image with id (%2$s) doesn't exist (%1$s)."
2977
+ msgstr "Det ønskede billede med id (%2$s) eksisterer ikke (%1$s)."
2978
+
2979
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:390
2980
+ msgid "Reset all options to default settings"
2981
+ msgstr "Nulstil alle indstillinger til standardindstillinger"
2982
+
2983
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:390
2984
+ msgid ""
2985
+ "Reset all options to default settings?\n"
2986
+ "\n"
2987
+ "Choose [Cancel] to Stop, [OK] to proceed."
2988
+ msgstr ""
2989
+ "Nulstil alle indstillinger til standardindstillinger?\n"
2990
+ "\n"
2991
+ "Vælg [Annuller] for Stop, [OK] for at fortsætte."
2992
+
2993
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:386
2994
+ msgid "Reset Options"
2995
+ msgstr "Nulstil indstillinger"
2996
+
2997
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:390
2998
+ msgid "Reset settings"
2999
+ msgstr "Nulstil indstillingerne"
3000
+
3001
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:269
3002
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:394
3003
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:114
3004
+ #:
3005
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:195
3006
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:638
3007
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:719
3008
+ msgid "Resize images"
3009
+ msgstr "Ændre størrelse på billeder"
3010
+
3011
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:537
3012
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:362
3013
+ msgid "Resize Images to"
3014
+ msgstr "Ændre størrelsen på billeder til"
3015
+
3016
+ #: products/photocrati_nextgen/modules/nextgen_basic_singlepic/package.module.nextgen_basic_singlepic.php:207
3017
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/publish.php:53
3018
+ msgid "Right"
3019
+ msgstr "Højre"
3020
+
3021
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:437
3022
+ msgid "Roles & Capabilities"
3023
+ msgstr "Roller og evner"
3024
+
3025
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:329
3026
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:330
3027
+ msgid "Rotate"
3028
+ msgstr "Rotere"
3029
+
3030
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:674
3031
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:677
3032
+ msgid "Rotate images"
3033
+ msgstr "Roter billeder"
3034
+
3035
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:398
3036
+ msgid "Rotate images clockwise"
3037
+ msgstr "Rotér billeder med uret"
3038
+
3039
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:399
3040
+ msgid "Rotate images counter-clockwise"
3041
+ msgstr "Rotér billeder mod uret"
3042
+
3043
+ #: products/photocrati_nextgen/modules/nextgen_admin/templates/nextgen_admin_page.php:25
3044
+ msgid "Save"
3045
+ msgstr "Gem"
3046
+
3047
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/media-upload.php:304
3048
+ msgid "Save all changes"
3049
+ msgstr "Gem alle ændringer"
3050
+
3051
+ #: products/photocrati_nextgen/modules/attach_to_post/templates/display_tab.php:10
3052
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:347
3053
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:412
3054
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:461
3055
+ msgid "Save Changes"
3056
+ msgstr "Gem ændringer"
3057
+
3058
+ #: products/photocrati_nextgen/modules/nextgen_admin/package.module.nextgen_admin.php:807
3059
+ msgid "Saved successfully"
3060
+ msgstr "Gemt med succes"
3061
+
3062
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:345
3063
+ msgid "Scan Folder for new images"
3064
+ msgstr "Scan mappe for nye billeder"
3065
+
3066
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:308
3067
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:311
3068
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:176
3069
+ #:
3070
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:179
3071
+ msgid "Search Images"
3072
+ msgid_plural "Galleries"
3073
+ msgstr[0] "Søg billeder"
3074
+ msgstr[1] "Gallerier"
3075
+
3076
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:305
3077
+ #, php-format
3078
+ msgid "Search results for &#8220;%s&#8221;"
3079
+ msgstr "Søgeresultater for &#8220;%s&#8221;"
3080
+
3081
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:115
3082
+ msgid "Search tags"
3083
+ msgstr "Søg tags"
3084
+
3085
+ #: products/photocrati_nextgen/modules/widget/templates/form_gallery.php:87
3086
+ msgid "Select"
3087
+ msgstr "Vælg"
3088
+
3089
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/media-upload.php:206
3090
+ msgid "Select &#187;"
3091
+ msgstr "Vælg &#187;"
3092
+
3093
+ #: products/photocrati_nextgen/modules/attach_to_post/package.module.attach_to_post.php:626
3094
+ msgid "Select a display type"
3095
+ msgstr "Vælg en skærmtype"
3096
+
3097
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/import_folder.php:1
3098
+ msgid "Select a folder to import."
3099
+ msgstr "Vælg en mappe, der skal importeres."
3100
+
3101
+ #: products/photocrati_nextgen/modules/attach_to_post/package.module.attach_to_post.php:363
3102
+ msgid "Select a gallery"
3103
+ msgstr "Vælg et galleri"
3104
+
3105
+ #: products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php:301
3106
+ #:
3107
+ #: products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php:345
3108
+ msgid "Select a name for your gallery."
3109
+ msgstr "Vælg et navn til dit galleri."
3110
+
3111
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:582
3112
+ msgid "Select a preview image:"
3113
+ msgstr "Vælg et eksempelbillede:"
3114
+
3115
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:446
3116
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:495
3117
+ msgid "Select album"
3118
+ msgstr "Vælg album"
3119
+
3120
+ #: products/photocrati_nextgen/modules/nextgen_admin/package.module.nextgen_admin.php:769
3121
+ msgid "Select Color"
3122
+ msgstr "Vælg Farve"
3123
+
3124
+ #: products/photocrati_nextgen/modules/widget/templates/form_slideshow.php:15
3125
+ msgid "Select Gallery"
3126
+ msgstr "Vælg Galleri"
3127
+
3128
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:511
3129
+ msgid "Select gallery"
3130
+ msgstr "Vælg galleri"
3131
+
3132
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/package.module.nextgen_addgallery_page.php:50
3133
+ msgid "Select images"
3134
+ msgstr "Vælg billeder"
3135
+
3136
+ #: products/photocrati_nextgen/modules/nextgen_gallery_display/package.module.nextgen_gallery_display.php:2457
3137
+ msgid "Select Template"
3138
+ msgstr "Vælg skabelon"
3139
+
3140
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/edit-thumbnail.php:162
3141
+ msgid "Select the area for the thumbnail from the picture on the left."
3142
+ msgstr "Vælg området for miniaturebilledet fra billedet til venstre."
3143
+
3144
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:501
3145
+ msgid "Select the destination gallery:"
3146
+ msgstr "Vælg destinationsgalleri:"
3147
+
3148
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/roles.php:27
3149
+ msgid ""
3150
+ "Select the lowest role which should be able to access the following "
3151
+ "capabilities. NextGEN Gallery supports the standard roles from WordPress."
3152
+ msgstr ""
3153
+ "Vælg den laveste rolle, som skal kunne få adgang til følgende funktioner. "
3154
+ "NextGEN Gallery understøtter standardroller fra WordPress."
3155
+
3156
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/edit-thumbnail.php:127
3157
+ msgid "Select with the mouse the area for the new thumbnail"
3158
+ msgstr "Vælg med musen området for den nye miniature"
3159
+
3160
+ #: products/photocrati_nextgen/modules/nextgen_basic_singlepic/package.module.nextgen_basic_singlepic.php:187
3161
+ msgid "Self"
3162
+ msgstr "Selv"
3163
+
3164
+ #: products/photocrati_nextgen/modules/nextgen_pro_upgrade/package.module.nextgen_pro_upgrade.php:52
3165
+ msgid "Sell Photos + Adobe Lightroom"
3166
+ msgstr "Sælg fotos + Adobe Lightroom"
3167
+
3168
+ #: products/photocrati_nextgen/modules/ngglegacy/nggallery.php:164
3169
+ msgid "Separate picture tags with commas."
3170
+ msgstr "Separat billede tags med kommaer."
3171
+
3172
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:74
3173
+ msgid "Server"
3174
+ msgstr "Server"
3175
+
3176
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:365
3177
+ msgid "Server Settings"
3178
+ msgstr "Serverindstillinger"
3179
+
3180
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/post-thumbnail.php:192
3181
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/post-thumbnail.php:193
3182
+ msgid "Set featured image"
3183
+ msgstr "Indstil udvalgt billede"
3184
+
3185
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:571
3186
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:396
3187
+ msgid "Set fix dimension"
3188
+ msgstr "Indstil fikseringsdimension"
3189
+
3190
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:555
3191
+ msgid "Set fix dimension?"
3192
+ msgstr "Indstil fikseringsdimension?"
3193
+
3194
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/post-thumbnail.php:60
3195
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/post-thumbnail.php:61
3196
+ msgid "Set NextGEN featured image"
3197
+ msgstr "Indstil NextGEN Udvalgte billede"
3198
+
3199
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:392
3200
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:193
3201
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:574
3202
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:683
3203
+ msgid "Set watermark"
3204
+ msgstr "Indstil vandmærke"
3205
+
3206
+ #: products/photocrati_nextgen/modules/attach_to_post/package.module.attach_to_post.php:363
3207
+ msgid ""
3208
+ "Sets an SEO-friendly name to this gallery for URLs. Currently only in use by "
3209
+ "the Pro Lightbox"
3210
+ msgstr ""
3211
+ "Sætter et SEO-venligt navn for dette galleri i webadresser. I øjeblikket kun "
3212
+ "i brug af Pro Lightbox"
3213
+
3214
+ #: products/photocrati_nextgen/modules/nextgen_pro_upgrade/package.module.nextgen_pro_upgrade.php:51
3215
+ msgid "Setting a New Standard for WordPress Galleries"
3216
+ msgstr "Indstilling af en ny standard til WordPress Gallerier"
3217
+
3218
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/wpmu.php:74
3219
+ msgid "Should work if the gallery is bellow the blog.dir"
3220
+ msgstr "Skal fungere, hvis galleriet er under blog.dir"
3221
+
3222
+ #: products/photocrati_nextgen/modules/widget/templates/form_gallery.php:15
3223
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/media-upload.php:237
3224
+ msgid "Show"
3225
+ msgstr "Vis"
3226
+
3227
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:481
3228
+ msgid "Show / hide used galleries"
3229
+ msgstr "Vis/skjul brugte gallerier"
3230
+
3231
+ #: products/photocrati_nextgen/modules/widget/package.module.widget.php:225
3232
+ msgid "Show a NextGEN Gallery Slideshow"
3233
+ msgstr "Vis en NextGEN Gallery Diasshow"
3234
+
3235
+ #: products/photocrati_nextgen/modules/widget/templates/form_mediarss.php:19
3236
+ msgid "Show Media RSS icon"
3237
+ msgstr "Vis Media RSS-ikon"
3238
+
3239
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:311
3240
+ msgid "Show meta data"
3241
+ msgstr "Vis metadata"
3242
+
3243
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:148
3244
+ msgid "Show Related Images on Posts?"
3245
+ msgstr "Vis relaterede billeder på indlæg?"
3246
+
3247
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/package.module.nextgen_basic_gallery.php:408
3248
+ msgid "Show slideshow link"
3249
+ msgstr "Vis diasshow link"
3250
+
3251
+ #: products/photocrati_nextgen/modules/widget/templates/form_mediarss.php:30
3252
+ msgid "Show the Media RSS link"
3253
+ msgstr "Vis Media RSS linket"
3254
+
3255
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/package.module.nextgen_basic_gallery.php:327
3256
+ msgid "Show thumbnail link"
3257
+ msgstr "Vis miniature link"
3258
+
3259
+ #: products/photocrati_nextgen/modules/lightbox/package.module.lightbox.php:61
3260
+ #, fuzzy
3261
+ msgid "Shutter"
3262
+ msgstr "Shutter"
3263
+
3264
+ #: products/photocrati_nextgen/modules/lightbox/package.module.lightbox.php:69
3265
+ #, fuzzy
3266
+ msgid "Shutter Reloaded"
3267
+ msgstr "Shutter Reloaded"
3268
+
3269
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:3057
3270
+ #:
3271
+ #: products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser-exif.php:54
3272
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:469
3273
+ msgid "Shutter speed"
3274
+ msgstr "Shutter tid"
3275
+
3276
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/media-upload.php:278
3277
+ msgid "Singlepic"
3278
+ msgstr "Enkelt billede"
3279
+
3280
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/media-upload.php:270
3281
+ msgid "Size"
3282
+ msgstr "Størrelse"
3283
+
3284
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:555
3285
+ msgid "Size List"
3286
+ msgstr "Størrelsesliste"
3287
+
3288
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/publish.php:42
3289
+ msgid "Size of the image"
3290
+ msgstr "Størrelsen af billedet"
3291
+
3292
+ #: products/photocrati_nextgen/modules/widget/package.module.widget.php:271
3293
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/rewrite.php:215
3294
+ msgid "Slideshow"
3295
+ msgstr "Diasshow"
3296
+
3297
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/package.module.nextgen_basic_gallery.php:418
3298
+ msgid "Slideshow link text"
3299
+ msgstr "Diasshow-linktekst"
3300
+
3301
+ #: products/photocrati_nextgen/modules/attach_to_post/package.module.attach_to_post.php:363
3302
+ msgid "Slug"
3303
+ msgstr "Slug"
3304
+
3305
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:249
3306
+ msgid "Slug(s) to set:"
3307
+ msgstr "Slug(s) at indstille:"
3308
+
3309
+ #: products/photocrati_nextgen/modules/ngglegacy/nggallery.php:108
3310
+ #, php-format
3311
+ msgid "Sorry, NextGEN Gallery works only under WordPress %s or higher."
3312
+ msgstr ""
3313
+ "Beklager, NextGEN Gallery fungerer kun under WordPress %s eller højere."
3314
+
3315
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/install.php:20
3316
+ msgid "Sorry, NextGEN Gallery works only with a role called administrator"
3317
+ msgstr "Beklager, NextGEN Gallery fungerer kun med en rolle som administrator"
3318
+
3319
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:47
3320
+ msgid "Sorry, you have no access here"
3321
+ msgstr "Beklager, du har ikke adgang her"
3322
+
3323
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:1167
3324
+ #:
3325
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:3805
3326
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/multisite.php:23
3327
+ msgid ""
3328
+ "Sorry, you have used your space allocation. Please delete some files to "
3329
+ "upload more files."
3330
+ msgstr ""
3331
+ "Beklager, du har brugt din pladsfordeling. Slet venligst nogle filer for at "
3332
+ "uploade flere filer."
3333
+
3334
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-sort.php:91
3335
+ msgid "Sort Gallery"
3336
+ msgstr "Sorter Galleri"
3337
+
3338
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:409
3339
+ msgid "Sort gallery"
3340
+ msgstr "Sorter galleri"
3341
+
3342
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:148
3343
+ msgid "Sort in what direction?"
3344
+ msgstr "Sorter i hvilken retning?"
3345
+
3346
+ #: products/photocrati_nextgen/modules/attach_to_post/package.module.attach_to_post.php:712
3347
+ msgid "Sort or Exclude Images"
3348
+ msgstr "Sorter eller ekskluder billeder"
3349
+
3350
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-sort.php:33
3351
+ msgid "Sort order changed"
3352
+ msgstr "Sorterings rækkefølge ændret"
3353
+
3354
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:124
3355
+ msgid "Sort Order:"
3356
+ msgstr "Sorterings rækkefølge:"
3357
+
3358
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:3057
3359
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:488
3360
+ msgid "Source"
3361
+ msgstr "Kilde"
3362
+
3363
+ #: products/photocrati_nextgen/modules/nextgen_gallery_display/package.module.nextgen_gallery_display.php:756
3364
+ msgid "Source not compatible with selected display type"
3365
+ msgstr "Kilde er ikke kompatibel med den valgte skærmtype"
3366
+
3367
+ #: products/photocrati_nextgen/modules/attach_to_post/package.module.attach_to_post.php:363
3368
+ msgid "Sources"
3369
+ msgstr "Kilder"
3370
+
3371
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:77
3372
+ msgid "SQL Mode"
3373
+ msgstr "SQL-tilstand"
3374
+
3375
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:463
3376
+ msgid "Styles"
3377
+ msgstr "Stilarter"
3378
+
3379
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:34
3380
+ msgid "Stylesheet URL"
3381
+ msgstr "Stylesheet URL"
3382
+
3383
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:3057
3384
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:473
3385
+ msgid "Subject"
3386
+ msgstr "Emne"
3387
+
3388
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:4121
3389
+ msgid "Support for GIF format is missing."
3390
+ msgstr "Understøttelse af GIF-format mangler."
3391
+
3392
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:4128
3393
+ msgid "Support for JPEG format is missing."
3394
+ msgstr "Understøttelse af JPEG-format mangler."
3395
+
3396
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:4135
3397
+ msgid "Support for PNG format is missing."
3398
+ msgstr "Understøttelse af PNG-format mangler."
3399
+
3400
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/showmeta.php:34
3401
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/showmeta.php:63
3402
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/showmeta.php:93
3403
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/showmeta.php:120
3404
+ msgid "Tag"
3405
+ msgstr "Tag"
3406
+
3407
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:223
3408
+ msgid "Tag(s) to delete:"
3409
+ msgstr "Tag(s), der skal slettes:"
3410
+
3411
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:245
3412
+ msgid "Tag(s) to match:"
3413
+ msgstr "Tag(s) der matcher:"
3414
+
3415
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:197
3416
+ msgid "Tag(s) to rename:"
3417
+ msgstr "Tag(s) der omdøbes:"
3418
+
3419
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:3057
3420
+ #:
3421
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:118
3422
+ #:
3423
+ #: products/photocrati_nextgen/modules/nextgen_gallery_display/package.module.nextgen_gallery_display.php:1886
3424
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:176
3425
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:472
3426
+ msgid "Tags"
3427
+ msgstr "Tags"
3428
+
3429
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:648
3430
+ msgid "Tags (comma separated list)"
3431
+ msgstr "Tags (kommasepareret liste)"
3432
+
3433
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:795
3434
+ msgid "Tags changed"
3435
+ msgstr "Tags ændret"
3436
+
3437
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/tags.php:220
3438
+ msgid "Tags number and slugs number isn't the same!"
3439
+ msgstr "Tags nummer og slugs nummer er ikke det samme!"
3440
+
3441
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:206
3442
+ msgid ""
3443
+ "Tamara Lackey is a renowned professional photographer, speaker, and author. "
3444
+ "Her authentic lifestyle photography, from children’s portraits to celebrity "
3445
+ "portraits, is praised within her industry and published internationally. She "
3446
+ "is a Nikon USA Ambassador, the host of The reDefine Show web series, and the "
3447
+ "co-founder of the non-profit charitable organization, Beautiful Together, in "
3448
+ "support of children waiting for families."
3449
+ msgstr ""
3450
+ "Tamara Lackey er en berømt professionel fotograf, højttaler og forfatter. "
3451
+ "Hendes autentiske livsstilsfotografering, fra børns portrætter til "
3452
+ "berømthedsportrætter, er rost inden for sin branche og udgivet "
3453
+ "internationalt. Hun er en Nikon USA-ambassadør, vært for The ReDefine Show-"
3454
+ "webserien og medstifteren af den non-profit velgørende organisation, "
3455
+ "Beautiful Together, til støtte for børn, der venter på familier."
3456
+
3457
+ #: products/photocrati_nextgen/modules/nextgen_basic_templates/package.module.nextgen_basic_templates.php:47
3458
+ msgid "Template"
3459
+ msgstr "Skabelon"
3460
+
3461
+ #: products/photocrati_nextgen/modules/widget/templates/form_mediarss.php:36
3462
+ msgid "Text for Media RSS link"
3463
+ msgstr "Tekst til Media RSS link"
3464
+
3465
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:680
3466
+ msgid "Text:"
3467
+ msgstr "Tekst:"
3468
+
3469
+ #: products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php:425
3470
+ msgid ""
3471
+ "Thanks for installing NextGEN Gallery! Want help creating your first gallery?"
3472
+ msgstr ""
3473
+ "Tak for at installere NextGEN Gallery! Vil du have hjælp til at oprette dit "
3474
+ "første galleri?"
3475
+
3476
+ #: products/photocrati_nextgen/modules/ngglegacy/xml/media-rss.php:113
3477
+ #, php-format
3478
+ msgid "The album ID=%s does not exist."
3479
+ msgstr "Albumet ID= %s findes ikke."
3480
+
3481
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/wpmu.php:68
3482
+ #, php-format
3483
+ msgid "The default setting should be %s"
3484
+ msgstr "Standardindstillingen skal være %s"
3485
+
3486
+ #: products/photocrati_nextgen/modules/nextgen_basic_tagcloud/package.module.nextgen_basic_tagcloud.php:117
3487
+ msgid "The display type that the tagcloud will point its results to"
3488
+ msgstr "Displayet type, den tagcloud vil pege sine resultater til"
3489
+
3490
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/package.module.nextgen_addgallery_page.php:388
3491
+ msgid "The following errors occured:"
3492
+ msgstr "Følgende fejl opstod:"
3493
+
3494
+ #: products/photocrati_nextgen/modules/ngglegacy/xml/media-rss.php:74
3495
+ #, php-format
3496
+ msgid "The gallery ID=%s does not exist."
3497
+ msgstr "Galleriet ID =%s findes ikke."
3498
+
3499
+ #. Description of the plugin
3500
+ msgid ""
3501
+ "The most popular gallery plugin for WordPress and one of the most popular "
3502
+ "plugins of all time with over 30 million downloads."
3503
+ msgstr ""
3504
+ "Den mest populære galleri plugin til WordPress og et af de mest populære "
3505
+ "plugins igennem tiden med over 30 millioner downloads."
3506
+
3507
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:290
3508
+ msgid "The most powerful gallery system ever built for WordPress. "
3509
+ msgstr ""
3510
+ "Den mest kraftfulde galleri-system nogensinde der er bygget til WordPress."
3511
+
3512
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:92
3513
+ msgid "The server setting Safe-Mode is on !"
3514
+ msgstr "Serveren indstilling Safe-Mode er tændt!"
3515
+
3516
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:614
3517
+ msgid "There are no pages to link to"
3518
+ msgstr "Der er ingen sider at linke til"
3519
+
3520
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/thumbnails-template.php:103
3521
+ msgid "These are maximum values"
3522
+ msgstr "Disse er maksimumsværdier"
3523
+
3524
+ #: products/photocrati_nextgen/modules/lightbox/package.module.lightbox.php:77
3525
+ msgid "Thickbox"
3526
+ msgstr "Thickbox"
3527
+
3528
+ #: products/photocrati_nextgen/modules/nextgen_gallery_display/package.module.nextgen_gallery_display.php:2399
3529
+ msgid ""
3530
+ "This does not affect existing thumbnails; overriding the thumbnail settings "
3531
+ "will create an additional set of thumbnails. To change the size of existing "
3532
+ "thumbnails please visit 'Manage Galleries' and choose 'Create new "
3533
+ "thumbnails' for all images in the gallery."
3534
+ msgstr ""
3535
+ "Dette påvirker ikke eksisterende miniaturebilleder; Hvis du overstyrer "
3536
+ "miniatureindstillingerne, oprettes et ekstra sæt miniaturer. For at ændre "
3537
+ "størrelsen på eksisterende miniaturebilleder, besøg venligst 'Administrer "
3538
+ "gallerier' og vælg 'Opret nye miniaturebilleder' for alle billeder i "
3539
+ "galleriet."
3540
+
3541
+ #: products/photocrati_nextgen/modules/lightbox/package.module.lightbox.php:81
3542
+ msgid ""
3543
+ "This feature requires inline frames. You have iframes disabled or your "
3544
+ "browser does not support them."
3545
+ msgstr ""
3546
+ "Denne funktion kræver inline-rammer. Du har iframes deaktiveret, eller din "
3547
+ "browser understøtter dem ikke."
3548
+
3549
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/wpmu.php:67
3550
+ msgid ""
3551
+ "This is the default path for all blogs. With the placeholder %BLOG_ID% you "
3552
+ "can organize the folder structure better."
3553
+ msgstr ""
3554
+ "Dette er standard stien for alle blogs. Med pladsholderen %BLOG_ID% kan du "
3555
+ "organisere mappestrukturen bedre."
3556
+
3557
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:309
3558
+ msgid ""
3559
+ "This is the maximum limit of images that NextGEN will restrict itself to "
3560
+ "querying"
3561
+ msgstr ""
3562
+ "Dette er den maksimale grænse for billeder, som NextGEN vil begrænse sig til "
3563
+ "at forespørge"
3564
+
3565
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/media-upload.php:274
3566
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:645
3567
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:161
3568
+ msgid "Thumbnail"
3569
+ msgstr "Miniature"
3570
+
3571
+ # Hard to translate so that sounds right
3572
+ #: products/photocrati_nextgen/modules/nextgen_gallery_display/package.module.nextgen_gallery_display.php:2414
3573
+ msgid "Thumbnail crop"
3574
+ msgstr "Miniature crop"
3575
+
3576
+ #: products/photocrati_nextgen/modules/nextgen_basic_singlepic/package.module.nextgen_basic_singlepic.php:179
3577
+ #:
3578
+ #: products/photocrati_nextgen/modules/nextgen_gallery_display/package.module.nextgen_gallery_display.php:2400
3579
+ msgid "Thumbnail dimensions"
3580
+ msgstr "Miniature dimension"
3581
+
3582
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/package.module.nextgen_addgallery_page.php:141
3583
+ msgid "Thumbnail generation failed."
3584
+ msgstr "Miniaturgenerering mislykkedes."
3585
+
3586
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/package.module.nextgen_basic_gallery.php:337
3587
+ msgid "Thumbnail link text"
3588
+ msgstr "Miniature-linktekst"
3589
+
3590
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:550
3591
+ msgid "Thumbnail Options"
3592
+ msgstr "Miniature instillinger"
3593
+
3594
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/edit-thumbnail.php:141
3595
+ msgid "Thumbnail updated"
3596
+ msgstr "Miniature opdateret"
3597
+
3598
+ #: products/photocrati_nextgen/modules/widget/templates/form_gallery.php:26
3599
+ msgid "Thumbnails"
3600
+ msgstr "Miniaturer"
3601
+
3602
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:3057
3603
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:479
3604
+ msgid "Time Created"
3605
+ msgstr "Tid Oprettet"
3606
+
3607
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:3057
3608
+ #: products/photocrati_nextgen/modules/widget/templates/form_gallery.php:4
3609
+ #: products/photocrati_nextgen/modules/widget/templates/form_slideshow.php:3
3610
+ #: products/photocrati_nextgen/modules/widget/templates/form_mediarss.php:3
3611
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:721
3612
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:470
3613
+ msgid "Title"
3614
+ msgstr "Titel"
3615
+
3616
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:394
3617
+ msgid "Title:"
3618
+ msgstr "Titel:"
3619
+
3620
+ #: products/photocrati_nextgen/modules/widget/templates/form_mediarss.php:47
3621
+ msgid "Tooltip text for Media RSS link"
3622
+ msgstr "Værktøjstip tekst til Media RSS link"
3623
+
3624
+ #: products/photocrati_nextgen/modules/nextgen_basic_singlepic/package.module.nextgen_basic_singlepic.php:187
3625
+ msgid "Top"
3626
+ msgstr "Top"
3627
+
3628
+ #: products/photocrati_nextgen/modules/nextgen_other_options/templates/lightbox_library_tab.php:37
3629
+ msgid "Try to apply to all images"
3630
+ msgstr "Prøv at anvende på alle billeder"
3631
+
3632
+ #: products/photocrati_nextgen/modules/nextgen_other_options/templates/lightbox_library_tab.php:38
3633
+ msgid "Try to apply to all images that link to image files"
3634
+ msgstr "Prøv at anvende på alle billeder, der linker til billedfiler"
3635
+
3636
+ #: products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php:330
3637
+ msgid "Type in a title for your page."
3638
+ msgstr "Indtast en titel til din side."
3639
+
3640
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:79
3641
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:88
3642
+ msgid "Unable to create directory "
3643
+ msgstr "Kan ikke oprette mappe"
3644
+
3645
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:3794
3646
+ #, php-format
3647
+ msgid "Unable to create directory %s."
3648
+ msgstr "Kan ikke oprette mappe %s."
3649
+
3650
+ #: products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php:3798
3651
+ #, php-format
3652
+ msgid ""
3653
+ "Unable to write to directory %s. Is this directory writable by the server?"
3654
+ msgstr "Kan ikke skrive til mappen %s. Er denne mappe skrivbare på serveren?"
3655
+
3656
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:277
3657
+ msgid "Unexpected Error"
3658
+ msgstr "Uforventet fejl"
3659
+
3660
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-sort.php:104
3661
+ msgid "Unsorted"
3662
+ msgstr "Usorteret"
3663
+
3664
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:459
3665
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/edit-thumbnail.php:177
3666
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/rotate.php:102
3667
+ msgid "Update"
3668
+ msgstr "Opdater"
3669
+
3670
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-sort.php:95
3671
+ msgid "Update Sort Order"
3672
+ msgstr "Opdater sorteringsordre"
3673
+
3674
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:179
3675
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:208
3676
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:252
3677
+ msgid "Updated Successfully"
3678
+ msgstr "Opdateret med succes"
3679
+
3680
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:852
3681
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/wpmu.php:42
3682
+ msgid "Updated successfully"
3683
+ msgstr "Opdateret med succes"
3684
+
3685
+ #: products/photocrati_nextgen/modules/nextgen_pro_upgrade/package.module.nextgen_pro_upgrade.php:42
3686
+ msgid "Upgrade to Pro"
3687
+ msgstr "Opgrader til Pro"
3688
+
3689
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/package.module.nextgen_addgallery_page.php:42
3690
+ #:
3691
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/upload_images.php:213
3692
+ #:
3693
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/import_folder.php:74
3694
+ msgid "Upload complete"
3695
+ msgstr "Upload fuldført"
3696
+
3697
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/package.module.nextgen_addgallery_page.php:384
3698
+ msgid "Upload Images"
3699
+ msgstr "Upload billeder"
3700
+
3701
+ #: products/photocrati_nextgen/modules/nextgen_basic_templates/package.module.nextgen_basic_templates.php:47
3702
+ msgid "Use a legacy template when rendering (not recommended)."
3703
+ msgstr "Brug en arv skabelon, når du gengiver (anbefales ikke)."
3704
+
3705
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/package.module.nextgen_basic_gallery.php:398
3706
+ msgid "Use imagebrowser effect"
3707
+ msgstr "Brug billed browser effekt"
3708
+
3709
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/roles.php:36
3710
+ msgid "Use TinyMCE Button / Upload tab"
3711
+ msgstr "Brug TinyMCE Button/Upload-fanen"
3712
+
3713
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:642
3714
+ msgid "Using an Image"
3715
+ msgstr "Brug af et billede"
3716
+
3717
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:642
3718
+ msgid "Using Text"
3719
+ msgstr "Brug af tekst"
3720
+
3721
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/showmeta.php:35
3722
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/showmeta.php:64
3723
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/showmeta.php:94
3724
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/showmeta.php:121
3725
+ msgid "Value"
3726
+ msgstr "Værdi"
3727
+
3728
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:301
3729
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:303
3730
+ msgid "View"
3731
+ msgstr "Vis"
3732
+
3733
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:282
3734
+ #, php-format
3735
+ msgid ""
3736
+ "Want more? Head over to <a href=\"%s\" target=\"_blank\">NextGEN Gallery "
3737
+ "University on YouTube</a>."
3738
+ msgstr ""
3739
+ "Ønsker du mere? Gå videre til <a href=\"%s\" target=\"_blank\"> NextGEN "
3740
+ "Gallery University på YouTube </a>."
3741
+
3742
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:616
3743
+ msgid "Watermarks"
3744
+ msgstr "Vandmærker"
3745
+
3746
+ #: products/photocrati_nextgen/modules/nextgen_gallery_display/package.module.nextgen_gallery_display.php:1716
3747
+ #:
3748
+ #: products/photocrati_nextgen/modules/nextgen_gallery_display/package.module.nextgen_gallery_display.php:1718
3749
+ #:
3750
+ #: products/photocrati_nextgen/modules/nextgen_gallery_display/package.module.nextgen_gallery_display.php:1722
3751
+ msgid "We cannot display this gallery"
3752
+ msgstr "Vi kan ikke vise dette galleri"
3753
+
3754
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:246
3755
+ #, php-format
3756
+ msgid ""
3757
+ "We have a growing list of video tutorials to get you started. Watch some "
3758
+ "below or head over to <a href=\"%s\" target=\"_blank\">NextGEN Gallery "
3759
+ "University on YouTube</a> to see all available vidoes."
3760
+ msgstr ""
3761
+ "Vi har en voksende liste over video tutorials for at komme i gang. Se nogle "
3762
+ "nedenfor eller gå til <a href=\"%s\" target=\"_blank\"> NextGEN Gallery "
3763
+ "University på YouTube </a> for at se alle tilgængelige videoer."
3764
+
3765
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:176
3766
+ msgid "Welcome"
3767
+ msgstr "Velkommen"
3768
+
3769
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:169
3770
+ msgid "Welcome to NextGEN Gallery"
3771
+ msgstr "Velkommen til NextGEN Gallery"
3772
+
3773
+ #: nggallery.php:155
3774
+ msgid ""
3775
+ "We’ve detected you are running PHP versions 7.0.26 or 7.1.12. These versions "
3776
+ "of PHP have a bug that breaks NextGEN Gallery and causes server crashes in "
3777
+ "certain conditions. To protect your site, NextGEN Gallery will not load. We "
3778
+ "recommend asking your host to roll back to an earlier version of PHP. For "
3779
+ "details on the PHP bug, see: <a target=\"_blank\" href=\"https://bugs.php."
3780
+ "net/bug.php?id=75573\">bugs.php.net/bug.php?id=75573</a>"
3781
+ msgstr ""
3782
+ "Vi har registreret, at du kører PHP-versioner 7.0.26 eller 7.1.12. Disse "
3783
+ "versioner af PHP har en fejl, der bryder NextGEN Gallery og forårsager, at "
3784
+ "serveren går i stykker under visse forhold. For at beskytte dit websted, vil "
3785
+ "NextGEN Gallery ikke blive indlæst. Vi anbefaler at bede din vært om at "
3786
+ "vende tilbage til en tidligere version af PHP. For detaljer om PHP-fejlen, "
3787
+ "se: <a target=\"_blank\" href=\"https://bugs.php.net/bug.php?id=75573\"> "
3788
+ "bugs.php.net/bug.php?id= 75573 </a>"
3789
+
3790
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:263
3791
+ msgid "What effect would you like to use?"
3792
+ msgstr "Hvilken effekt vil du gerne bruge?"
3793
+
3794
+ #: products/photocrati_nextgen/modules/nextgen_other_options/templates/lightbox_library_tab.php:31
3795
+ msgid "What must the lightbox be applied to?"
3796
+ msgstr "Hvad skal lightbox anvendes på?"
3797
+
3798
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:148
3799
+ msgid "What should images be resized to?"
3800
+ msgstr "Hvad skal billeder ændres til?"
3801
+
3802
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:467
3803
+ msgid "What stylesheet would you like to use?"
3804
+ msgstr "Hvilket stylesheet vil du gerne bruge?"
3805
+
3806
+ #: products/photocrati_nextgen/modules/attach_to_post/package.module.attach_to_post.php:610
3807
+ msgid "What would you like to display?"
3808
+ msgstr "Hvad vil du gerne vise?"
3809
+
3810
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:148
3811
+ msgid "What's the default sorting method?"
3812
+ msgstr "Hvad er standard sorteringsmetode?"
3813
+
3814
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/package.module.nextgen_basic_gallery.php:398
3815
+ msgid ""
3816
+ "When active each image in the gallery will link to an imagebrowser display "
3817
+ "and lightbox effects will not be applied."
3818
+ msgstr ""
3819
+ "Når det er aktivt, vil hvert billede i galleriet linke til et billed browser-"
3820
+ "display, og lightbox vil ikke blive anvendt."
3821
+
3822
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:358
3823
+ msgid ""
3824
+ "When contacting support, consider copying and pasting this information in "
3825
+ "your support request. It helps us troubleshoot more quickly."
3826
+ msgstr ""
3827
+ "Når du kontakter support, skal du overveje at kopiere og indsætte disse "
3828
+ "oplysninger i din supportanmodning. Det hjælper os med at fejle hurtigere."
3829
+
3830
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:309
3831
+ msgid ""
3832
+ "When enabled, adds a MediaRSS link to your header. Third-party web services "
3833
+ "can use this to publish your galleries"
3834
+ msgstr ""
3835
+ "Når aktiveret, tilføjes et MediaRSS-link til dit overskrift. Tredjeparts "
3836
+ "webtjenester kan bruge dette til at offentliggøre dine gallerier"
3837
+
3838
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:148
3839
+ msgid ""
3840
+ "When enabled, image files will be removed after a Gallery has been deleted"
3841
+ msgstr ""
3842
+ "Når aktiveret, vil billedfiler blive fjernet, når et Galleri er blevet "
3843
+ "slettet"
3844
+
3845
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:148
3846
+ msgid ""
3847
+ "When enabled, related images will be appended to each post by matching the "
3848
+ "posts tags/categories to image tags"
3849
+ msgstr ""
3850
+ "Når aktiveret, vil relaterede billeder blive tilføjet til hvert indlæg ved "
3851
+ "at matche indlægets tags / kategorier til billedkoder"
3852
+
3853
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:555
3854
+ msgid "When generating thumbnails, what image dimensions do you desire?"
3855
+ msgstr "Når du producerer miniaturebilleder, hvilke billedmål ønsker du?"
3856
+
3857
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:555
3858
+ msgid "When generating thumbnails, what image quality do you desire?"
3859
+ msgstr "Når der genereres miniaturer, hvad billedkvalitet ønsker du?"
3860
+
3861
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:148
3862
+ msgid "Where galleries and their images are stored"
3863
+ msgstr "Hvor gallerier og deres billeder gemmes"
3864
+
3865
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:148
3866
+ msgid "Where would you like galleries stored?"
3867
+ msgstr "Hvor vil du gerne gallerier opbevares?"
3868
+
3869
+ #: products/photocrati_nextgen/modules/widget/package.module.widget.php:169
3870
+ msgid "Widget that displays Media RSS links for NextGEN Gallery."
3871
+ msgstr "Widget, der viser Media RSS links til NextGEN Gallery."
3872
+
3873
+ #: products/photocrati_nextgen/modules/widget/templates/form_slideshow.php:65
3874
+ msgid "Width"
3875
+ msgstr "Bredde"
3876
+
3877
+ #: products/photocrati_nextgen/modules/widget/templates/form_gallery.php:68
3878
+ msgid "Width x Height"
3879
+ msgstr "Bredde x Højde"
3880
+
3881
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:565
3882
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/publish.php:40
3883
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:390
3884
+ msgid "Width x height (in pixel)"
3885
+ msgstr "Bredde x højde (i pixel)"
3886
+
3887
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:541
3888
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:366
3889
+ msgid "Width x height (in pixel). NextGEN Gallery will keep ratio size"
3890
+ msgstr ""
3891
+ "Bredde x højde (i pixel). NextGEN Gallery vil beholde størrelsesstørrelsen"
3892
+
3893
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:148
3894
+ msgid "Width:"
3895
+ msgstr "Bredde:"
3896
+
3897
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:94
3898
+ msgid "with permission 777 manually !"
3899
+ msgstr "med tilladelse 777 manuelt!"
3900
+
3901
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/showmeta.php:116
3902
+ msgid "XMP Data"
3903
+ msgstr "XMP Data"
3904
+
3905
+ #: products/photocrati_nextgen/modules/nextgen_other_options/templates/styling_tab.php:10
3906
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:61
3907
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:65
3908
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:69
3909
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:105
3910
+ msgid "Yes"
3911
+ msgstr "Ja"
3912
+
3913
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:123
3914
+ #, php-format
3915
+ msgid ""
3916
+ "You are about to start the bulk edit for %s galleries \n"
3917
+ " \n"
3918
+ " 'Cancel' to stop, 'OK' to proceed."
3919
+ msgstr ""
3920
+ "Du er ved at starte bulkredigeringen for %s gallerier\n"
3921
+ " \n"
3922
+ "  'Annuller' for at stoppe, 'OK' for at fortsætte."
3923
+
3924
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:278
3925
+ #, php-format
3926
+ msgid ""
3927
+ "You are about to start the bulk edit for %s images \n"
3928
+ " \n"
3929
+ " 'Cancel' to stop, 'OK' to proceed."
3930
+ msgstr ""
3931
+ "Du er ved at starte bulkredigeringen for %s billeder\n"
3932
+ " \n"
3933
+ "  'Annuller' for at stoppe, 'OK' for at fortsætte."
3934
+
3935
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:219
3936
+ msgid "You can specify multiple tags to delete by separating them with commas"
3937
+ msgstr ""
3938
+ "Du kan angive flere tags, der skal slettes, ved at adskille dem med kommaer"
3939
+
3940
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:193
3941
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:241
3942
+ msgid "You can specify multiple tags to rename by separating them with commas."
3943
+ msgstr ""
3944
+ "Du kan angive flere tags til at omdøbe ved at adskille dem med kommaer."
3945
+
3946
+ #: products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php:467
3947
+ msgid "You could edit this file if it were writable"
3948
+ msgstr "Du kan redigere denne fil, hvis den var skrivbar"
3949
+
3950
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:276
3951
+ msgid "You do not have the correct permission"
3952
+ msgstr "Du har ikke den rigtige tilladelse"
3953
+
3954
+ #: products/photocrati_nextgen/modules/nextgen_pro_upgrade/package.module.nextgen_pro_upgrade.php:54
3955
+ msgid ""
3956
+ "You're awesome! You've already got NextGEN Plus. But why not go all the way? "
3957
+ "With NextGEN Pro, you can sell print and digital downloads, provide proofing "
3958
+ "galleries for clients, manage galleries directly from Adobe Lightroom, and "
3959
+ "more."
3960
+ msgstr ""
3961
+ "Du er fantastisk! Du har allerede fået NextGEN Plus. Men hvorfor ikke gå "
3962
+ "hele vejen? Med NextGEN Pro kan du sælge trykte og digitale downloads, give "
3963
+ "proofing gallerier til kunder, administrere gallerier direkte fra Adobe "
3964
+ "Lightroom og meget mere."
3965
+
3966
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/upload_images.php:13
3967
+ msgid "Your browser doesn't have Silverlight, HTML5, or HTML4 support."
3968
+ msgstr "Din browser har ikke Silverlight, HTML5 eller HTML4 support."
3969
+
3970
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/package.module.nextgen_addgallery_page.php:388
3971
+ msgid "{count} images were uploaded successfully."
3972
+ msgstr "{count} billeder blev uploadet korrekt."
3973
+
3974
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/package.module.nextgen_addgallery_page.php:42
3975
+ #, php-format
3976
+ msgid ""
3977
+ "{count} images were uploaded successfully. <a href=\"%s\" target=\"_blank\">"
3978
+ "Manage gallery</a>"
3979
+ msgstr ""
3980
+ "{count} billeder blev uploadet korrekt. <a href=\"%s\" target=\"_blank\">"
3981
+ "Administrer galleri</a>"
nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery-de_DE.mo ADDED
Binary file
nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery-el.mo ADDED
Binary file
nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery-es_ES.mo ADDED
Binary file
nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery-fi.mo ADDED
Binary file
nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery-fil.mo ADDED
Binary file
nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery-fr_FR.mo ADDED
Binary file
nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery-hu_HU.mo ADDED
Binary file
nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery-it_IT.mo ADDED
Binary file
nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery-nl_NL.mo ADDED
Binary file
nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery-pl_PL.mo ADDED
Binary file
nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery-ru_RU.mo ADDED
Binary file
nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery-sk_SK.mo ADDED
Binary file
nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery-sv_SE.mo ADDED
Binary file
nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery-sv_SE.po ADDED
@@ -0,0 +1,3234 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # NextGEN Gallery base (English) .po source
2
+ # Copyright (C) 2015 Photocrati Media
3
+ # This file is distributed under the same license as the NextGEN Gallery package.
4
+ #
5
+ msgid ""
6
+ msgstr ""
7
+ "Project-Id-Version: NextGEN Gallery\n"
8
+ "Report-Msgid-Bugs-To: http://wordpress.org/support/plugin/nextgen-gallery\n"
9
+ "POT-Creation-Date: 2014-02-20 19:45-0800\n"
10
+ "PO-Revision-Date: 2015-07-28 21:02+0200\n"
11
+ "Last-Translator: Anders O Johansson\n"
12
+ "Language-Team: Anders O Johansson\n"
13
+ "MIME-Version: 1.0\n"
14
+ "Content-Type: text/plain; charset=UTF-8\n"
15
+ "Content-Transfer-Encoding: 8bit\n"
16
+ "Plural-Forms: nplurals=2; plural=(n != 1);\n"
17
+ "Language: sv_SE\n"
18
+ "X-Generator: Poedit 1.8.3\n"
19
+
20
+ #: nggallery.php:289
21
+ #, php-format
22
+ msgid "NextGEN Gallery %s is incompatible with this version of NextGEN Pro. Please update NextGEN Pro to version %s or higher to restore NextGEN Gallery functionality."
23
+ msgstr "NextGEN Gallery %s är oförenlig med den här versionen av NextGEN Pro. Uppdatera NextGEN Pro till version %s eller högre för att återställa NextGEN Gallerys funktionalitet."
24
+
25
+ #: nggallery.php:372
26
+ #, php-format
27
+ msgid "Every %d seconds"
28
+ msgstr "Var %d:e sekund"
29
+
30
+ #: products/photocrati_nextgen/modules/attach_to_post/adapter.attach_to_post_ajax.php:160
31
+ #, php-format
32
+ msgid "Album: %s"
33
+ msgstr "Album: %s"
34
+
35
+ #: products/photocrati_nextgen/modules/attach_to_post/adapter.attach_to_post_ajax.php:162
36
+ #, php-format
37
+ msgid "Gallery: %s"
38
+ msgstr "Galleri: %s"
39
+
40
+ #: products/photocrati_nextgen/modules/attach_to_post/adapter.attach_to_post_ajax.php:180
41
+ msgid "Missing parameters"
42
+ msgstr "Saknade parametrar"
43
+
44
+ #: products/photocrati_nextgen/modules/attach_to_post/adapter.attach_to_post_ajax.php:216
45
+ msgid "Displayed gallery does not exist"
46
+ msgstr "Visat galleri existerar inte"
47
+
48
+ #: products/photocrati_nextgen/modules/attach_to_post/adapter.attach_to_post_ajax.php:219
49
+ msgid "Invalid request"
50
+ msgstr "Ogiltig begäran"
51
+
52
+ #: products/photocrati_nextgen/modules/attach_to_post/class.attach_controller.php:263
53
+ msgid "NextGEN Gallery - Attach To Post"
54
+ msgstr "NextGEN Gallery - Bifoga till inlägg"
55
+
56
+ #: products/photocrati_nextgen/modules/attach_to_post/class.attach_controller.php:281
57
+ msgid "Display Galleries"
58
+ msgstr "Visa gallerier"
59
+
60
+ #: products/photocrati_nextgen/modules/attach_to_post/class.attach_controller.php:288
61
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.nextgen_addgallery_controller.php:7
62
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:188
63
+ msgid "Add Gallery / Images"
64
+ msgstr "Lägg till Galleri / Bilder"
65
+
66
+ #: products/photocrati_nextgen/modules/attach_to_post/class.attach_controller.php:295
67
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:156
68
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:190
69
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:167
70
+ msgid "Manage Galleries"
71
+ msgid_plural "Manage Galleries"
72
+ msgstr[0] "Hantera Galleri"
73
+ msgstr[1] "Hantera Gallerier"
74
+
75
+ #: products/photocrati_nextgen/modules/attach_to_post/class.attach_controller.php:302
76
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:157
77
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:192
78
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:437
79
+ msgid "Manage Albums"
80
+ msgid_plural "Manage Albums"
81
+ msgstr[0] "Hantera Album"
82
+ msgstr[1] "Hantera Album"
83
+
84
+ #: products/photocrati_nextgen/modules/attach_to_post/class.attach_controller.php:309
85
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:158
86
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:194
87
+ msgid "Manage Tags"
88
+ msgstr "Hantera Etiketter"
89
+
90
+ #: products/photocrati_nextgen/modules/attach_to_post/mixin.attach_to_post_display_tab.php:119
91
+ msgid "What would you like to display?"
92
+ msgstr "Vad vill du visa?"
93
+
94
+ #: products/photocrati_nextgen/modules/attach_to_post/mixin.attach_to_post_display_tab.php:143
95
+ msgid "Select a display type"
96
+ msgstr "Välj en visningstyp"
97
+
98
+ #: products/photocrati_nextgen/modules/attach_to_post/mixin.attach_to_post_display_tab.php:166
99
+ msgid "Customize the display settings"
100
+ msgstr "Anpassa inställningarna för visning"
101
+
102
+ #: products/photocrati_nextgen/modules/attach_to_post/mixin.attach_to_post_display_tab.php:257
103
+ msgid "No display type selected"
104
+ msgstr "Ingen vald visningstyp"
105
+
106
+ #: products/photocrati_nextgen/modules/attach_to_post/mixin.attach_to_post_display_tab.php:275
107
+ msgid "Sort or Exclude Images"
108
+ msgstr "Sortera eller uteslut bilder"
109
+
110
+ #: products/photocrati_nextgen/modules/attach_to_post/module.attach_to_post.php:232
111
+ msgid "Invalid Displayed Gallery"
112
+ msgstr "Ogiltigt visat galleri"
113
+
114
+ #: products/photocrati_nextgen/modules/attach_to_post/module.attach_to_post.php:347
115
+ msgid "Attach NextGEN Gallery to Post"
116
+ msgstr "Bifoga NextGEN Gallery till inlägg"
117
+
118
+ #: products/photocrati_nextgen/modules/attach_to_post/templates/attach_to_post.php:12
119
+ msgid "NextGEN"
120
+ msgstr "NextGEN"
121
+
122
+ #: products/photocrati_nextgen/modules/attach_to_post/templates/display_tab.php:10
123
+ #: products/photocrati_nextgen/modules/nextgen_admin/templates/nextgen_admin_page.php:25
124
+ msgid "Save"
125
+ msgstr "Spara"
126
+
127
+ #: products/photocrati_nextgen/modules/attach_to_post/templates/display_tab_js.php:615
128
+ msgid "Sources"
129
+ msgstr "Källor"
130
+
131
+ #: products/photocrati_nextgen/modules/attach_to_post/templates/display_tab_js.php:649
132
+ #: products/photocrati_nextgen/modules/nextgen_admin/class.form.php:366
133
+ msgid "(optional)"
134
+ msgstr "(valfritt)"
135
+
136
+ #: products/photocrati_nextgen/modules/attach_to_post/templates/display_tab_js.php:657
137
+ msgid "Sets an SEO-friendly name to this gallery for URLs. Currently only in use by the Pro Lightbox."
138
+ msgstr "Ställer in ett SEO-vänligt namn på detta galleri för URL:er. Används för närvarande bara av Pro Lightbox."
139
+
140
+ #: products/photocrati_nextgen/modules/attach_to_post/templates/display_tab_js.php:658
141
+ msgid "Slug"
142
+ msgstr "Permalänk-smula"
143
+
144
+ #: products/photocrati_nextgen/modules/attach_to_post/templates/display_tab_js.php:878
145
+ msgid "No entities to display for this source."
146
+ msgstr "Inga objekt att visa för den här källan."
147
+
148
+ #: products/photocrati_nextgen/modules/attach_to_post/templates/display_tab_js.php:1289
149
+ msgid "Select a gallery"
150
+ msgstr "Välj ett galleri"
151
+
152
+ #: products/photocrati_nextgen/modules/attach_to_post/templates/display_tab_js.php:1293
153
+ #: products/photocrati_nextgen/modules/nextgen_gallery_display/class.displayed_gallery_source_manager.php:31
154
+ msgid "Galleries"
155
+ msgstr "Gallerier"
156
+
157
+ #: products/photocrati_nextgen/modules/attach_to_post/templates/display_tab_js.php:1317
158
+ #: products/photocrati_nextgen/modules/nextgen_gallery_display/class.displayed_gallery_source_manager.php:39
159
+ msgid "Albums"
160
+ msgstr "Album"
161
+
162
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.custom_lightbox_form.php:31
163
+ msgid "Code"
164
+ msgstr "Kod"
165
+
166
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.custom_lightbox_form.php:45
167
+ msgid "Stylesheet URL"
168
+ msgstr "URL till CSS-mall"
169
+
170
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.custom_lightbox_form.php:59
171
+ msgid "Javascript URL"
172
+ msgstr "URL till Javascript"
173
+
174
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:29
175
+ #: products/photocrati_nextgen/modules/nextgen_basic_singlepic/adapter.nextgen_basic_singlepic_form.php:127
176
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/media-upload.php:252
177
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/publish.php:47
178
+ msgid "None"
179
+ msgstr "Ingen"
180
+
181
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:34
182
+ msgid "jQuery Lightbox"
183
+ msgstr "jQuery Lightbox"
184
+
185
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:81
186
+ msgid "ltr"
187
+ msgstr "ltr"
188
+
189
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:82
190
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:147
191
+ msgid "Loading..."
192
+ msgstr "Laddar..."
193
+
194
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:83
195
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:140
196
+ msgid "Previous"
197
+ msgstr "Föregående"
198
+
199
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:84
200
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:141
201
+ #: products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/templates/nextgen_basic_imagebrowser.php:49
202
+ #: products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser-caption.php:29
203
+ #: products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser-exif.php:33
204
+ #: products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser.php:29
205
+ msgid "Next"
206
+ msgstr "Nästa"
207
+
208
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:85
209
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:90
210
+ msgid "Move"
211
+ msgstr "Flytta"
212
+
213
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:86
214
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:142
215
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:169
216
+ msgid "Close"
217
+ msgstr "Stäng"
218
+
219
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:87
220
+ msgid "Resize"
221
+ msgstr "Ändra storlek"
222
+
223
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:88
224
+ msgid "Play"
225
+ msgstr "Spela upp"
226
+
227
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:89
228
+ msgid "Pause"
229
+ msgstr "Pausa"
230
+
231
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:91
232
+ msgid "1:1"
233
+ msgstr "1:1"
234
+
235
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:92
236
+ msgid "Close (esc)"
237
+ msgstr "Stäng (esc)"
238
+
239
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:93
240
+ msgid "Pause slideshow (spacebar)"
241
+ msgstr "Pausa bildspel (mellanslag)"
242
+
243
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:94
244
+ msgid "Click to cancel"
245
+ msgstr "Klicka för att avbryta"
246
+
247
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:95
248
+ msgid "Click to bring to front"
249
+ msgstr "Klicka för att ta fram"
250
+
251
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:96
252
+ msgid "Expand to actual size (f)"
253
+ msgstr "Expandera till faktisk storlek (f)"
254
+
255
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:97
256
+ msgid "Powered by Highslide JS"
257
+ msgstr "Drivs av Highslide JS"
258
+
259
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:98
260
+ msgid "Play slideshow (spacebar)"
261
+ msgstr "Spela upp bildspel (mellanslag)"
262
+
263
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:99
264
+ msgid "Previous (arrow left)"
265
+ msgstr "Föregående (vänsterpil)"
266
+
267
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:100
268
+ msgid "Next (arrow right)"
269
+ msgstr "Nästa (högerpil)"
270
+
271
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:101
272
+ msgid "Image %1 of %2"
273
+ msgstr "Bild %1 av %2"
274
+
275
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:102
276
+ msgid "Go to the Highslide JS homepage"
277
+ msgstr "Gå till Highslide JS:s hemsida"
278
+
279
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:103
280
+ msgid "Click to close image, click and drag to move. Use arrow keys for next and previous."
281
+ msgstr "Klicka för att stänga bilden, klicka och dra för att flytta. Använd piltangenterna för nästa och föregående."
282
+
283
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:55
284
+ msgid "Fancybox"
285
+ msgstr "FancyBox"
286
+
287
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:69
288
+ msgid "Highslide"
289
+ msgstr "Highslide"
290
+
291
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:110
292
+ msgid "Shutter"
293
+ msgstr "Shutter"
294
+
295
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:121
296
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:299
297
+ msgid "L O A D I N G"
298
+ msgstr "L A D D A R"
299
+
300
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:122
301
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:300
302
+ msgid "Click to Close"
303
+ msgstr "Klicka för att stänga"
304
+
305
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:129
306
+ msgid "Shutter Reloaded"
307
+ msgstr "Shutter Reloaded"
308
+
309
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:143
310
+ msgid "Full Size"
311
+ msgstr "Full storlek"
312
+
313
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:144
314
+ msgid "Fit to Screen"
315
+ msgstr "Anpassa till skärm"
316
+
317
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:145
318
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:167
319
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:460
320
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:308
321
+ msgid "Image"
322
+ msgstr "Bild"
323
+
324
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:146
325
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:168
326
+ #: products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/templates/nextgen_basic_imagebrowser.php:55
327
+ #: products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser-caption.php:31
328
+ #: products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser-exif.php:35
329
+ #: products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser.php:31
330
+ msgid "of"
331
+ msgstr "av"
332
+
333
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:165
334
+ msgid "Next &gt;"
335
+ msgstr "Nästa &gt;"
336
+
337
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:166
338
+ msgid "&lt; Prev"
339
+ msgstr "&lt; Föregående"
340
+
341
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:170
342
+ msgid "This feature requires inline frames. You have iframes disabled or your browser does not support them."
343
+ msgstr "Den här funktionen kräver iframe. Du har avaktiverat iframe eller så stöds de inte av din webbläsare."
344
+
345
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:110
346
+ msgid "Thickbox"
347
+ msgstr "Thickbox"
348
+
349
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:180
350
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.image_options_form.php:22
351
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/thumbnails-template.php:76
352
+ msgid "Custom"
353
+ msgstr "Anpassad"
354
+
355
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.import_folder_form.php:7
356
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/import_folder.php:6
357
+ msgid "Import Folder"
358
+ msgstr "Importera mapp"
359
+
360
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.nextgen_addgallery_ajax.php:43
361
+ msgid "No gallery name specified"
362
+ msgstr "Gallerinamn saknas"
363
+
364
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.nextgen_addgallery_ajax.php:57
365
+ msgid "Failed to extract images from ZIP"
366
+ msgstr "Det gick inte att extrahera bilder från ZIP"
367
+
368
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.nextgen_addgallery_ajax.php:63
369
+ msgid "Image generation failed"
370
+ msgstr "Bildgenerering misslyckades"
371
+
372
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.nextgen_addgallery_ajax.php:73
373
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.nextgen_addgallery_ajax.php:159
374
+ msgid "An unexpected error occured."
375
+ msgstr "Ett oväntat fel uppstod."
376
+
377
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.nextgen_addgallery_ajax.php:80
378
+ msgid "No permissions to upload images. Try refreshing the page or ensuring that your user account has sufficient roles/privileges."
379
+ msgstr "Behörighet saknas för att ladda upp bilder. Försök att uppdatera sidan eller se till att ditt användarkonto har tillräckliga roller/behörigheter."
380
+
381
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.nextgen_addgallery_ajax.php:123
382
+ msgid "Directory does not exist."
383
+ msgstr "Katalogen finns inte."
384
+
385
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.nextgen_addgallery_ajax.php:127
386
+ msgid "No directory specified."
387
+ msgstr "Ingen katalog vald."
388
+
389
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.nextgen_addgallery_ajax.php:131
390
+ msgid "No permissions to browse folders. Try refreshing the page or ensuring that your user account has sufficient roles/privileges."
391
+ msgstr "Behörighet saknas för att bläddra i mappar. Försök att uppdatera sidan eller se till att ditt användarkonto har tillräckliga roller/behörigheter."
392
+
393
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.nextgen_addgallery_ajax.php:163
394
+ msgid "No folder specified"
395
+ msgstr "Ingen mapp vald"
396
+
397
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.nextgen_addgallery_ajax.php:166
398
+ msgid "No permissions to import folders. Try refreshing the page or ensuring that your user account has sufficient roles/privileges."
399
+ msgstr "Behörighet saknas för att importera mappar. Försök att uppdatera sidan eller se till att ditt användarkonto har tillräckliga roller/behörigheter."
400
+
401
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.upload_images_form.php:7
402
+ msgid "Upload Images"
403
+ msgstr "Ladda upp bilder"
404
+
405
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/import_folder.php:1
406
+ msgid "Select a folder to import. The folder name will be used as the title of the gallery."
407
+ msgstr "Välj en mapp du vill importera. Mappnamnet kommer att användas som titel på galleriet."
408
+
409
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/import_folder.php:5
410
+ msgid "Keep images in original location."
411
+ msgstr "Förvara bilderna på sina ursprungliga platser."
412
+
413
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/import_folder.php:5
414
+ msgid "Caution: If you keep images in the original folder and later delete the gallery, the images in that folder might be deleted depending on your settings."
415
+ msgstr "Varning: Om du förvarar bilderna i originalmappen och senare tar bort galleriet, kan bilderna i den mappen raderas (väljs i inställningarna)."
416
+
417
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/import_folder.php:39
418
+ msgid "Importing gallery"
419
+ msgstr "Importerar galleri"
420
+
421
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/import_folder.php:41
422
+ msgid "In Progress..."
423
+ msgstr "Pågår..."
424
+
425
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/import_folder.php:56
426
+ #, php-format
427
+ msgid "Done! Successfully imported %s images"
428
+ msgstr "Klart! Importerade %s bilder"
429
+
430
+ #: products/photocrati_nextgen/modules/attach_to_post/templates/attach_to_post.php:12
431
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/upload_images.php:2
432
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:154
433
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:167
434
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:185
435
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:375
436
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:432
437
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:456
438
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:285
439
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:314
440
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/rewrite.php:217
441
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/rewrite.php:226
442
+ #, php-format
443
+ msgid "Gallery"
444
+ msgid_plural "Galleries"
445
+ msgstr[0] "Galleri"
446
+ msgstr[1] "Gallerier"
447
+
448
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/upload_images.php:4
449
+ msgid "Create a new gallery"
450
+ msgstr "Skapa ett nytt galleri"
451
+
452
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/upload_images.php:13
453
+ msgid "Your browser doesn't have Flash, Silverlight, HTML5, or HTML4 support."
454
+ msgstr "Din webbläsare saknar stöd för Flash, Silverlight, HTML5, eller HTML4."
455
+
456
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/upload_images.php:114
457
+ msgid "Drag image and ZIP files here or click <strong>Add Files</strong>"
458
+ msgstr "Släpp bild- och zip-filer här eller klicka på <strong>Lägg till filer</strong>"
459
+
460
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/upload_images.php:164
461
+ #, php-format
462
+ msgid "%s images were uploaded successfully"
463
+ msgstr "%s bilder laddades upp"
464
+
465
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/upload_images.php:167
466
+ msgid "1 image was uploaded successfully"
467
+ msgstr "1 bild laddades upp"
468
+
469
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/upload_images.php:170
470
+ msgid "0 images were uploaded"
471
+ msgstr "0 bilder laddades upp"
472
+
473
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/upload_images.php:184
474
+ msgid "Upload complete"
475
+ msgstr "Uppladdning klar"
476
+
477
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/upload_images.php:206
478
+ msgid "An unexpected error occured. This is most likely due to a server misconfiguration. Check your PHP error log or ask your hosting provider for assistance."
479
+ msgstr "Ett oväntat fel uppstod. Detta är troligast på grund av en felaktig konfiguration av servern. Kontrollera din PHP-fellogg eller be ditt webbhotell om hjälp."
480
+
481
+ #: products/photocrati_nextgen/modules/nextgen_admin/class.admin_notification_manager.php:121
482
+ msgid "Not a valid notice name"
483
+ msgstr "Inte ett giltigt meddelandenamn"
484
+
485
+ #: products/photocrati_nextgen/modules/nextgen_admin/class.form.php:226
486
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_thumbnail_form.php:131
487
+ msgid "Enable AJAX pagination"
488
+ msgstr "Aktivera AJAX-sidbrytning"
489
+
490
+ #: products/photocrati_nextgen/modules/nextgen_admin/class.form.php:238
491
+ msgid "Override thumbnail settings"
492
+ msgstr "Anpassade miniatyrer"
493
+
494
+ #: products/photocrati_nextgen/modules/nextgen_admin/class.form.php:240
495
+ msgid "This does not affect existing thumbnails; overriding the thumbnail settings will create an additional set of thumbnails. To change the size of existing thumbnails please visit 'Manage Galleries' and choose 'Create new thumbnails' for all images in the gallery."
496
+ msgstr "Detta påverkar inte befintliga miniatyrer. Anpassade miniatyrer kommer att skapas i en egen uppsättning. Om du vill ändra storlek på befintliga miniatyrer, gå till \"Hantera Gallerier\" och välj \"Skapa nya miniatyrer\" för alla bilder i galleriet."
497
+
498
+ #: products/photocrati_nextgen/modules/nextgen_admin/class.form.php:248
499
+ #: products/photocrati_nextgen/modules/nextgen_basic_singlepic/adapter.nextgen_basic_singlepic_form.php:38
500
+ msgid "Thumbnail dimensions"
501
+ msgstr "Dimensioner för miniatyr"
502
+
503
+ #: products/photocrati_nextgen/modules/nextgen_admin/class.form.php:274
504
+ msgid "Thumbnail crop"
505
+ msgstr "Miniatyr-beskärning"
506
+
507
+ #: products/photocrati_nextgen/modules/nextgen_admin/class.form.php:310
508
+ msgid "Override image settings"
509
+ msgstr "Anpassade bilder"
510
+
511
+ #: products/photocrati_nextgen/modules/nextgen_admin/class.form.php:312
512
+ msgid "Overriding the image settings will create an additional set of images"
513
+ msgstr "Anpassade bilder kommer att skapas i en egen uppsättning"
514
+
515
+ #: products/photocrati_nextgen/modules/nextgen_admin/class.form.php:320
516
+ #: products/photocrati_nextgen/modules/nextgen_basic_singlepic/adapter.nextgen_basic_singlepic_form.php:83
517
+ msgid "Image quality"
518
+ msgstr "Bildkvalitet"
519
+
520
+ #: products/photocrati_nextgen/modules/nextgen_admin/class.form.php:330
521
+ msgid "Image crop"
522
+ msgstr "Bildbeskärning"
523
+
524
+ #: products/photocrati_nextgen/modules/nextgen_admin/class.form.php:339
525
+ msgid "Image watermark"
526
+ msgstr "Bild-vattenstämpel"
527
+
528
+ #: products/photocrati_nextgen/modules/nextgen_admin/class.form.php:363
529
+ msgid "Gallery width"
530
+ msgstr "Galleri-bredd"
531
+
532
+ #: products/photocrati_nextgen/modules/nextgen_admin/class.form.php:365
533
+ msgid "An empty or 0 setting will make the gallery full width"
534
+ msgstr "Lämna tomt eller ge värdet 0 för att ge galleriet fullbredd"
535
+
536
+ #: products/photocrati_nextgen/modules/nextgen_admin/class.form.php:369
537
+ msgid "Pixels"
538
+ msgstr "Pixlar"
539
+
540
+ #: products/photocrati_nextgen/modules/nextgen_admin/class.form.php:369
541
+ msgid "Percent"
542
+ msgstr "Procent"
543
+
544
+ #: products/photocrati_nextgen/modules/nextgen_admin/class.form.php:378
545
+ msgid "First Image"
546
+ msgstr "Första bilden"
547
+
548
+ #: products/photocrati_nextgen/modules/nextgen_admin/class.form.php:379
549
+ msgid "Average"
550
+ msgstr "Average"
551
+
552
+ #: products/photocrati_nextgen/modules/nextgen_admin/class.nextgen_admin_page_controller.php:79
553
+ msgid "Clear"
554
+ msgstr "Rensa"
555
+
556
+ #: products/photocrati_nextgen/modules/nextgen_admin/class.nextgen_admin_page_controller.php:80
557
+ msgid "Default"
558
+ msgstr "Förvalt"
559
+
560
+ #: products/photocrati_nextgen/modules/nextgen_admin/class.nextgen_admin_page_controller.php:81
561
+ msgid "Select Color"
562
+ msgstr "Välj färg"
563
+
564
+ #: products/photocrati_nextgen/modules/nextgen_admin/class.nextgen_admin_page_controller.php:82
565
+ msgid "Current Color"
566
+ msgstr "Nuvarande färg"
567
+
568
+ #: products/photocrati_nextgen/modules/nextgen_admin/class.nextgen_admin_page_controller.php:144
569
+ msgid "Saved successfully"
570
+ msgstr "Sparades"
571
+
572
+ #: products/photocrati_nextgen/modules/nextgen_admin/templates/field_generator/nextgen_settings_field_radio.php:16
573
+ #: products/photocrati_nextgen/modules/nextgen_basic_singlepic/templates/nextgen_basic_singlepic_settings_radio.php:16
574
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.image_options_form.php:122
575
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.miscellaneous_form.php:24
576
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.miscellaneous_form.php:29
577
+ #: products/photocrati_nextgen/modules/nextgen_other_options/templates/image_options_tab.php:40
578
+ #: products/photocrati_nextgen/modules/nextgen_other_options/templates/image_options_tab.php:65
579
+ #: products/photocrati_nextgen/modules/nextgen_other_options/templates/image_options_tab.php:191
580
+ #: products/photocrati_nextgen/modules/nextgen_other_options/templates/styling_tab.php:10
581
+ #: products/photocrati_nextgen/modules/nextgen_other_options/templates/thumbnail_options_tab.php:37
582
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:411
583
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:458
584
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:461
585
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:464
586
+ msgid "Yes"
587
+ msgstr "Ja"
588
+
589
+ #: products/photocrati_nextgen/modules/nextgen_admin/templates/field_generator/nextgen_settings_field_radio.php:24
590
+ #: products/photocrati_nextgen/modules/nextgen_basic_singlepic/templates/nextgen_basic_singlepic_settings_radio.php:24
591
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.image_options_form.php:123
592
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.miscellaneous_form.php:23
593
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.miscellaneous_form.php:28
594
+ #: products/photocrati_nextgen/modules/nextgen_other_options/templates/image_options_tab.php:47
595
+ #: products/photocrati_nextgen/modules/nextgen_other_options/templates/image_options_tab.php:72
596
+ #: products/photocrati_nextgen/modules/nextgen_other_options/templates/image_options_tab.php:198
597
+ #: products/photocrati_nextgen/modules/nextgen_other_options/templates/styling_tab.php:13
598
+ #: products/photocrati_nextgen/modules/nextgen_other_options/templates/thumbnail_options_tab.php:44
599
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:413
600
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:459
601
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:462
602
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:465
603
+ msgid "No"
604
+ msgstr "Nej"
605
+
606
+ #: products/photocrati_nextgen/modules/nextgen_basic_album/module.nextgen_basic_album.php:168
607
+ msgid "NextGEN Basic Compact Album"
608
+ msgstr "NextGEN Basic - Kompakt Album"
609
+
610
+ #: products/photocrati_nextgen/modules/nextgen_basic_album/module.nextgen_basic_album.php:177
611
+ msgid "NextGEN Basic Extended Album"
612
+ msgstr "NextGEN Basic - Expanderat Album"
613
+
614
+ #: products/photocrati_nextgen/modules/nextgen_basic_album/mixin.nextgen_basic_album_form.php:25
615
+ msgid "Display galleries as"
616
+ msgstr "Visa gallerier som"
617
+
618
+ #: products/photocrati_nextgen/modules/nextgen_basic_album/mixin.nextgen_basic_album_form.php:26
619
+ msgid "How would you like galleries to be displayed?"
620
+ msgstr "Vilken visningstyp vill du använda för gallerier?"
621
+
622
+ #: products/photocrati_nextgen/modules/nextgen_basic_album/mixin.nextgen_basic_album_form.php:28
623
+ msgid "Galleries per page"
624
+ msgstr "Gallerier per sida"
625
+
626
+ #: products/photocrati_nextgen/modules/nextgen_basic_album/mixin.nextgen_basic_album_form.php:47
627
+ msgid "Items per page"
628
+ msgstr "Objekt per sida"
629
+
630
+ #: products/photocrati_nextgen/modules/nextgen_basic_album/mixin.nextgen_basic_album_form.php:48
631
+ msgid "Maximum number of galleries or sub-albums to appear on a single page"
632
+ msgstr "Maximalt antal gallerier eller album som ska visas på samma sida. Ange 0 för att visa alla."
633
+
634
+ #: products/photocrati_nextgen/modules/nextgen_basic_album/templates/compact.php:29
635
+ #: products/photocrati_nextgen/modules/nextgen_basic_album/templates/extended.php:15
636
+ #: products/photocrati_nextgen/modules/ngglegacy/view/album-compact.php:45
637
+ #: products/photocrati_nextgen/modules/ngglegacy/view/album-extend.php:31
638
+ msgid "Photos"
639
+ msgstr "Foton"
640
+
641
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_slideshow_form.php:47
642
+ msgid "Interval"
643
+ msgstr "Intervall"
644
+
645
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_slideshow_form.php:51
646
+ msgid "# of seconds"
647
+ msgstr "antal sekunder"
648
+
649
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_slideshow_form.php:82
650
+ msgid "Maximum dimensions"
651
+ msgstr "Maximala dimensioner"
652
+
653
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_slideshow_form.php:83
654
+ msgid "Certain themes may allow images to flow over their container if this setting is too large"
655
+ msgstr "Vissa teman kan tillåta bilder att flöda utanför sin behållare om denna inställning är för stor"
656
+
657
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_slideshow_form.php:100
658
+ msgid "Show thumbnail link"
659
+ msgstr "Visa miniatyrsideslänk"
660
+
661
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_slideshow_form.php:116
662
+ msgid "Thumbnail link text"
663
+ msgstr "Miniatyrsideslänkens text"
664
+
665
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_thumbnail_form.php:63
666
+ msgid "Images per page"
667
+ msgstr "Bilder per sida"
668
+
669
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_thumbnail_form.php:65
670
+ msgid "0 will display all images at once"
671
+ msgstr "Ange 0 för visa alla bilder på en sida"
672
+
673
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_thumbnail_form.php:83
674
+ msgid "Number of columns to display"
675
+ msgstr "Antal kolumner för visning"
676
+
677
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_thumbnail_form.php:87
678
+ msgid "# of columns"
679
+ msgstr "antal kolumner"
680
+
681
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_thumbnail_form.php:103
682
+ msgid "Add Hidden Images"
683
+ msgstr "Lägg till dolda bilder"
684
+
685
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_thumbnail_form.php:105
686
+ msgid "If pagination is used this option will show all images in the modal window (Thickbox, Lightbox etc.) This increases page load."
687
+ msgstr "Om sidbrytning används, kommer detta alternativ att visa alla bilder som finns i det modala fönstret (Thickbox, Lightbox etc.) Detta ökar sidans tyngd."
688
+
689
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_thumbnail_form.php:114
690
+ msgid "Use imagebrowser effect"
691
+ msgstr "Koppla till bildbläddring"
692
+
693
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_thumbnail_form.php:116
694
+ msgid "When active each image in the gallery will link to an imagebrowser display and lightbox effects will not be applied."
695
+ msgstr "Varje bild i galleriet länkas till bildbläddring utan Lightbox-effekter."
696
+
697
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_thumbnail_form.php:133
698
+ msgid "Browse images without reloading the page."
699
+ msgstr "Bläddra bland bilder utan att ladda om sidan."
700
+
701
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_thumbnail_form.php:148
702
+ msgid "Show slideshow link"
703
+ msgstr "Visa bildspelslänk"
704
+
705
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_thumbnail_form.php:164
706
+ msgid "Slideshow link text"
707
+ msgstr "Bildspelslänkens text"
708
+
709
+ # Missed by NextGEN, translated string is not displayed in dropdown list for tag cloud.
710
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/module.nextgen_basic_gallery.php:325
711
+ msgid "NextGEN Basic Thumbnails"
712
+ msgstr "NextGEN Basic - Miniatyrer"
713
+
714
+ # Missed by NextGEN, translated string is not displayed in dropdown list for tag cloud.
715
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/module.nextgen_basic_gallery.php:335
716
+ msgid "NextGEN Basic Slideshow"
717
+ msgstr "NextGEN Basic - Bildspel"
718
+
719
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/module.nextgen_basic_gallery.php:366
720
+ #, php-format
721
+ msgid "Flash slideshow support has been removed from NextGEN Gallery. Please see <a href='%s'>this blog post</a> for more information."
722
+ msgstr "Stöd för Flash-bildspel har tagits bort från NextGEN Gallery. Se <a href='%s'>detta blogginlägg</a> för mer information."
723
+
724
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/templates/slideshow/nextgen_basic_slideshow_settings_gallery_dimensions.php:15
725
+ #: products/photocrati_nextgen/modules/nextgen_basic_singlepic/adapter.nextgen_basic_singlepic_form.php:39
726
+ #: products/photocrati_nextgen/modules/nextgen_basic_singlepic/templates/nextgen_basic_singlepic_settings_dimensions.php:13
727
+ #: products/photocrati_nextgen/modules/widget/templates/form_slideshow.php:65
728
+ msgid "Width"
729
+ msgstr "Bredd"
730
+
731
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/templates/slideshow/nextgen_basic_slideshow_settings_gallery_dimensions.php:23
732
+ #: products/photocrati_nextgen/modules/nextgen_basic_singlepic/adapter.nextgen_basic_singlepic_form.php:41
733
+ #: products/photocrati_nextgen/modules/nextgen_basic_singlepic/templates/nextgen_basic_singlepic_settings_dimensions.php:20
734
+ #: products/photocrati_nextgen/modules/widget/templates/form_slideshow.php:53
735
+ msgid "Height"
736
+ msgstr "Höjd"
737
+
738
+ # Missed by NextGEN, translated string is not displayed in dropdown list for tag cloud.
739
+ #: products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/module.nextgen_basic_imagebrowser.php:174
740
+ msgid "NextGEN Basic ImageBrowser"
741
+ msgstr "NextGEN Basic - Bildbläddring"
742
+
743
+ #: products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/templates/nextgen_basic_imagebrowser.php:41
744
+ #: products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser-caption.php:26
745
+ #: products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser-exif.php:30
746
+ #: products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser.php:26
747
+ msgid "Back"
748
+ msgstr "Tillbaka"
749
+
750
+ #: products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/templates/nextgen_basic_imagebrowser.php:55
751
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:89
752
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/rewrite.php:220
753
+ #: products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser-caption.php:31
754
+ #: products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser-exif.php:35
755
+ #: products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser.php:31
756
+ msgid "Picture"
757
+ msgstr "Bild"
758
+
759
+ # Missed by NextGEN, translated string is not displayed.
760
+ #: products/photocrati_nextgen/modules/nextgen_basic_singlepic/adapter.nextgen_basic_singlepic_form.php:54
761
+ msgid "Link"
762
+ msgstr "Länk"
763
+
764
+ #: products/photocrati_nextgen/modules/nextgen_basic_singlepic/adapter.nextgen_basic_singlepic_form.php:66
765
+ msgid "Link target"
766
+ msgstr "Länkmål"
767
+
768
+ #: products/photocrati_nextgen/modules/nextgen_basic_singlepic/adapter.nextgen_basic_singlepic_form.php:68
769
+ msgid "Self"
770
+ msgstr "Samma ram"
771
+
772
+ #: products/photocrati_nextgen/modules/nextgen_basic_singlepic/adapter.nextgen_basic_singlepic_form.php:69
773
+ msgid "Blank"
774
+ msgstr "Nytt fönster"
775
+
776
+ #: products/photocrati_nextgen/modules/nextgen_basic_singlepic/adapter.nextgen_basic_singlepic_form.php:70
777
+ msgid "Parent"
778
+ msgstr "Omgivande ram"
779
+
780
+ #: products/photocrati_nextgen/modules/nextgen_basic_singlepic/adapter.nextgen_basic_singlepic_form.php:71
781
+ msgid "Top"
782
+ msgstr "Samma fönster"
783
+
784
+ #: products/photocrati_nextgen/modules/nextgen_basic_singlepic/adapter.nextgen_basic_singlepic_form.php:95
785
+ msgid "Display watermark"
786
+ msgstr "Visa vattenstämpel"
787
+
788
+ #: products/photocrati_nextgen/modules/nextgen_basic_singlepic/adapter.nextgen_basic_singlepic_form.php:105
789
+ msgid "Display reflection"
790
+ msgstr "Visa reflektion"
791
+
792
+ #: products/photocrati_nextgen/modules/nextgen_basic_singlepic/adapter.nextgen_basic_singlepic_form.php:115
793
+ msgid "Crop thumbnail"
794
+ msgstr "Beskär miniatyr"
795
+
796
+ #: products/photocrati_nextgen/modules/nextgen_basic_singlepic/adapter.nextgen_basic_singlepic_form.php:125
797
+ msgid "Float"
798
+ msgstr "Flytande"
799
+
800
+ #: products/photocrati_nextgen/modules/nextgen_basic_singlepic/adapter.nextgen_basic_singlepic_form.php:128
801
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/media-upload.php:254
802
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/publish.php:49
803
+ msgid "Left"
804
+ msgstr "Vänster"
805
+
806
+ #: products/photocrati_nextgen/modules/nextgen_basic_singlepic/adapter.nextgen_basic_singlepic_form.php:129
807
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/media-upload.php:258
808
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/publish.php:53
809
+ msgid "Right"
810
+ msgstr "Höger"
811
+
812
+ #: products/photocrati_nextgen/modules/nextgen_basic_singlepic/module.nextgen_basic_singlepic.php:140
813
+ msgid "NextGEN Basic SinglePic"
814
+ msgstr "NextGEN Basic - Enkelbild"
815
+
816
+ #: products/photocrati_nextgen/modules/nextgen_basic_tagcloud/adapter.nextgen_basic_tagcloud_form.php:24
817
+ msgid "Maximum number of tags"
818
+ msgstr "Maximalt antal etiketter"
819
+
820
+ #: products/photocrati_nextgen/modules/nextgen_basic_tagcloud/adapter.nextgen_basic_tagcloud_form.php:46
821
+ msgid "Display type"
822
+ msgstr "Visningstyp"
823
+
824
+ #: products/photocrati_nextgen/modules/nextgen_basic_tagcloud/adapter.nextgen_basic_tagcloud_form.php:49
825
+ msgid "The display type that the tagcloud will point its results to"
826
+ msgstr "Den visningstyp som etikettmolnet länkar resultaten till"
827
+
828
+ #: products/photocrati_nextgen/modules/nextgen_basic_tagcloud/class.taxonomy_controller.php:114
829
+ msgid "Images tagged &quot;%s&quot;"
830
+ msgstr "Bilder etiketterade \"%s\""
831
+
832
+ #: products/photocrati_nextgen/modules/nextgen_basic_tagcloud/module.nextgen_basic_tagcloud.php:163
833
+ msgid "NextGEN Basic TagCloud"
834
+ msgstr "NextGEN Basic - Etikettmoln"
835
+
836
+ #: products/photocrati_nextgen/modules/nextgen_basic_templates/adapter.nextgen_basic_template_form.php:46
837
+ msgid "Template"
838
+ msgstr "Mall"
839
+
840
+ #: products/photocrati_nextgen/modules/nextgen_basic_templates/adapter.nextgen_basic_template_form.php:47
841
+ msgid "Use a legacy template when rendering (not recommended)."
842
+ msgstr "Använd en mall vid rendering (historiskt, rekommenderas inte)."
843
+
844
+ # Missed by NextGEN, translated string is displayed.
845
+ #: products/photocrati_nextgen/modules/nextgen_basic_templates/adapter.nextgen_basic_template_form.php:210
846
+ msgid "No template selected"
847
+ msgstr "Ingen mall vald"
848
+
849
+ #: products/photocrati_nextgen/modules/nextgen_data/class.gallerystorage_driver_base.php:648
850
+ #: products/photocrati_nextgen/modules/nextgen_data/class.ngglegacy_gallerystorage_driver.php:706
851
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/multisite.php:23
852
+ msgid "Sorry, you have used your space allocation. Please delete some files to upload more files."
853
+ msgstr "Tyvärr har du använt ditt tilldelade utrymme. Ta bort några filer för att ladda upp flera filer."
854
+
855
+ #: products/photocrati_nextgen/modules/nextgen_data/class.gallerystorage_driver_base.php:1092
856
+ msgid "Could not calculate resized image dimensions"
857
+ msgstr "Kunde inte beräkna den ändrade bildens dimensioner"
858
+
859
+ #: products/photocrati_nextgen/modules/nextgen_data/class.nextgen_metadata.php:154
860
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:135
861
+ msgid " mm"
862
+ msgstr "mm"
863
+
864
+ #: products/photocrati_nextgen/modules/nextgen_data/class.nextgen_metadata.php:163
865
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:141
866
+ msgid " sec"
867
+ msgstr "sek"
868
+
869
+ #: products/photocrati_nextgen/modules/nextgen_data/class.nextgen_metadata.php:168
870
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:145
871
+ msgid "Fired"
872
+ msgstr "Fired"
873
+
874
+ #: products/photocrati_nextgen/modules/nextgen_data/class.nextgen_metadata.php:168
875
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:145
876
+ msgid "Not fired"
877
+ msgstr "Not fired"
878
+
879
+ #: products/photocrati_nextgen/modules/nextgen_data/class.nextgen_metadata.php:539
880
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:452
881
+ #: products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser-exif.php:46
882
+ msgid "Aperture"
883
+ msgstr "Bländare"
884
+
885
+ #: products/photocrati_nextgen/modules/nextgen_data/class.nextgen_metadata.php:540
886
+ #: products/photocrati_nextgen/modules/nextgen_data/class.nextgen_metadata.php:565
887
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:453
888
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:478
889
+ msgid "Credit"
890
+ msgstr "Erkännande"
891
+
892
+ #: products/photocrati_nextgen/modules/nextgen_data/class.nextgen_metadata.php:541
893
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:454
894
+ msgid "Camera"
895
+ msgstr "Kamera"
896
+
897
+ #: products/photocrati_nextgen/modules/nextgen_data/class.nextgen_metadata.php:542
898
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:455
899
+ msgid "Caption"
900
+ msgstr "Bildtext"
901
+
902
+ #: products/photocrati_nextgen/modules/nextgen_data/class.nextgen_metadata.php:543
903
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.image_options_form.php:26
904
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-sort.php:109
905
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:456
906
+ msgid "Date/Time"
907
+ msgstr "Datum/tid"
908
+
909
+ #: products/photocrati_nextgen/modules/nextgen_data/class.nextgen_metadata.php:544
910
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:457
911
+ msgid "Copyright"
912
+ msgstr "Copyright"
913
+
914
+ #: products/photocrati_nextgen/modules/nextgen_data/class.nextgen_metadata.php:545
915
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:458
916
+ msgid "Focal length"
917
+ msgstr "Brännvidd"
918
+
919
+ #: products/photocrati_nextgen/modules/nextgen_data/class.nextgen_metadata.php:546
920
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:459
921
+ msgid "ISO"
922
+ msgstr "ISO"
923
+
924
+ #: products/photocrati_nextgen/modules/nextgen_data/class.nextgen_metadata.php:547
925
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:460
926
+ #: products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser-exif.php:54
927
+ msgid "Shutter speed"
928
+ msgstr "Slutartid"
929
+
930
+ #: products/photocrati_nextgen/modules/nextgen_data/class.nextgen_metadata.php:548
931
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:707
932
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:461
933
+ #: products/photocrati_nextgen/modules/widget/templates/form_gallery.php:4
934
+ #: products/photocrati_nextgen/modules/widget/templates/form_mediarss.php:3
935
+ #: products/photocrati_nextgen/modules/widget/templates/form_slideshow.php:3
936
+ msgid "Title"
937
+ msgstr "Titel"
938
+
939
+ #: products/photocrati_nextgen/modules/nextgen_data/class.nextgen_metadata.php:549
940
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:458
941
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:409
942
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:462
943
+ msgid "Author"
944
+ msgstr "Upphovsman"
945
+
946
+ #: products/photocrati_nextgen/modules/nextgen_data/class.nextgen_metadata.php:550
947
+ #: products/photocrati_nextgen/modules/nextgen_gallery_display/class.displayed_gallery_source_manager.php:47
948
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.image_options_form.php:51
949
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:175
950
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:463
951
+ msgid "Tags"
952
+ msgstr "Etiketter"
953
+
954
+ #: products/photocrati_nextgen/modules/nextgen_data/class.nextgen_metadata.php:551
955
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:464
956
+ msgid "Subject"
957
+ msgstr "Ämne"
958
+
959
+ #: products/photocrati_nextgen/modules/nextgen_data/class.nextgen_metadata.php:552
960
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:465
961
+ msgid "Make"
962
+ msgstr "Fabrikat"
963
+
964
+ #: products/photocrati_nextgen/modules/nextgen_data/class.nextgen_metadata.php:553
965
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:466
966
+ msgid "Edit Status"
967
+ msgstr "Ändra status"
968
+
969
+ #: products/photocrati_nextgen/modules/nextgen_data/class.nextgen_metadata.php:554
970
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:467
971
+ msgid "Category"
972
+ msgstr "Kategori"
973
+
974
+ #: products/photocrati_nextgen/modules/nextgen_data/class.nextgen_metadata.php:555
975
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:468
976
+ msgid "Keywords"
977
+ msgstr "Nyckelord"
978
+
979
+ #: products/photocrati_nextgen/modules/nextgen_data/class.nextgen_metadata.php:556
980
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:469
981
+ msgid "Date Created"
982
+ msgstr "Datum skapad"
983
+
984
+ #: products/photocrati_nextgen/modules/nextgen_data/class.nextgen_metadata.php:557
985
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:470
986
+ msgid "Time Created"
987
+ msgstr "Tid skapad"
988
+
989
+ #: products/photocrati_nextgen/modules/nextgen_data/class.nextgen_metadata.php:558
990
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:471
991
+ msgid "Author Position"
992
+ msgstr "Upphovsmans befattning"
993
+
994
+ #: products/photocrati_nextgen/modules/nextgen_data/class.nextgen_metadata.php:559
995
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:472
996
+ msgid "City"
997
+ msgstr "Ort"
998
+
999
+ #: products/photocrati_nextgen/modules/nextgen_data/class.nextgen_metadata.php:560
1000
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:473
1001
+ msgid "Location"
1002
+ msgstr "Plats"
1003
+
1004
+ #: products/photocrati_nextgen/modules/nextgen_data/class.nextgen_metadata.php:561
1005
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:474
1006
+ msgid "Province/State"
1007
+ msgstr "Region/Stat"
1008
+
1009
+ #: products/photocrati_nextgen/modules/nextgen_data/class.nextgen_metadata.php:562
1010
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:475
1011
+ msgid "Country code"
1012
+ msgstr "Landskod"
1013
+
1014
+ #: products/photocrati_nextgen/modules/nextgen_data/class.nextgen_metadata.php:563
1015
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:476
1016
+ msgid "Country"
1017
+ msgstr "Land"
1018
+
1019
+ #: products/photocrati_nextgen/modules/nextgen_data/class.nextgen_metadata.php:564
1020
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:477
1021
+ msgid "Headline"
1022
+ msgstr "Rubrik"
1023
+
1024
+ #: products/photocrati_nextgen/modules/nextgen_data/class.nextgen_metadata.php:566
1025
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:479
1026
+ msgid "Source"
1027
+ msgstr "Källa"
1028
+
1029
+ #: products/photocrati_nextgen/modules/nextgen_data/class.nextgen_metadata.php:567
1030
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:480
1031
+ msgid "Copyright Notice"
1032
+ msgstr "Copyrightmeddelande"
1033
+
1034
+ #: products/photocrati_nextgen/modules/nextgen_data/class.nextgen_metadata.php:568
1035
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:481
1036
+ msgid "Contact"
1037
+ msgstr "Kontakt"
1038
+
1039
+ #: products/photocrati_nextgen/modules/nextgen_data/class.nextgen_metadata.php:569
1040
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:482
1041
+ msgid "Last modified"
1042
+ msgstr "Senast ändrad"
1043
+
1044
+ #: products/photocrati_nextgen/modules/nextgen_data/class.nextgen_metadata.php:570
1045
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:483
1046
+ msgid "Program tool"
1047
+ msgstr "Program tool"
1048
+
1049
+ #: products/photocrati_nextgen/modules/nextgen_data/class.nextgen_metadata.php:571
1050
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:484
1051
+ msgid "Format"
1052
+ msgstr "Format"
1053
+
1054
+ #: products/photocrati_nextgen/modules/nextgen_data/class.nextgen_metadata.php:572
1055
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:485
1056
+ msgid "Image Width"
1057
+ msgstr "Bildbredd"
1058
+
1059
+ #: products/photocrati_nextgen/modules/nextgen_data/class.nextgen_metadata.php:573
1060
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:486
1061
+ msgid "Image Height"
1062
+ msgstr "Bildhöjd"
1063
+
1064
+ #: products/photocrati_nextgen/modules/nextgen_data/class.nextgen_metadata.php:574
1065
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:487
1066
+ msgid "Flash"
1067
+ msgstr "Fotoblixt"
1068
+
1069
+ #: products/photocrati_nextgen/modules/nextgen_data/class.ngglegacy_gallerystorage_driver.php:261
1070
+ msgid "Invalid image file. Acceptable formats: JPG, GIF, and PNG."
1071
+ msgstr "Ogiltig bildfil. Giltiga format: JPG, GIF och PNG."
1072
+
1073
+ #: products/photocrati_nextgen/modules/nextgen_data/class.ngglegacy_gallerystorage_driver.php:693
1074
+ #, php-format
1075
+ msgid "Unable to create directory %s."
1076
+ msgstr "Kunde inte skapa katalog%s."
1077
+
1078
+ #: products/photocrati_nextgen/modules/nextgen_data/class.ngglegacy_gallerystorage_driver.php:698
1079
+ #, php-format
1080
+ msgid "Unable to write to directory %s. Is this directory writable by the server?"
1081
+ msgstr "Kunde inte skapa katalogen %s. Har servern skrivrättigheter på katalogen?"
1082
+
1083
+ #: products/photocrati_nextgen/modules/nextgen_data/class.ngglegacy_gallerystorage_driver.php:732
1084
+ #, php-format
1085
+ msgid "Failed to copy database row for picture %s"
1086
+ msgstr "Det gick inte att kopiera databasrad för bilden %s"
1087
+
1088
+ #: products/photocrati_nextgen/modules/nextgen_data/class.ngglegacy_gallerystorage_driver.php:746
1089
+ #, php-format
1090
+ msgid "Failed to get image path for %s"
1091
+ msgstr "Kunde inte hitta sökväg till bild %s"
1092
+
1093
+ #: products/photocrati_nextgen/modules/nextgen_data/class.ngglegacy_gallerystorage_driver.php:779
1094
+ #, php-format
1095
+ msgid "Failed to copy image %1$s to %2$s"
1096
+ msgstr "Det gick inte att kopiera bilden %1$s till %2$s"
1097
+
1098
+ #: products/photocrati_nextgen/modules/nextgen_data/class.ngglegacy_gallerystorage_driver.php:803
1099
+ #, php-format
1100
+ msgid "Copied %1$s picture(s) to gallery %2$s ."
1101
+ msgstr "Kopierade %1$s bild(er) till galleri %2$s."
1102
+
1103
+ #: products/photocrati_nextgen/modules/nextgen_data/class.ngglegacy_gallerystorage_driver.php:830
1104
+ msgid "Could not find image"
1105
+ msgstr "Kunde inte hitta bild"
1106
+
1107
+ #: products/photocrati_nextgen/modules/nextgen_data/class.ngglegacy_gallerystorage_driver.php:835
1108
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:385
1109
+ msgid " is not writeable"
1110
+ msgstr "är inte skrivbar"
1111
+
1112
+ #: products/photocrati_nextgen/modules/nextgen_data/class.ngglegacy_gallerystorage_driver.php:840
1113
+ msgid "Backup file does not exist"
1114
+ msgstr "Återställningsfil saknas"
1115
+
1116
+ #: products/photocrati_nextgen/modules/nextgen_data/class.ngglegacy_gallerystorage_driver.php:845
1117
+ msgid "Could not restore original image"
1118
+ msgstr "Kunde inte återställa ursprungliga bilden"
1119
+
1120
+ #: products/photocrati_nextgen/modules/nextgen_gallery_display/adapter.display_settings_controller.php:17
1121
+ #: products/photocrati_nextgen/modules/nextgen_gallery_display/module.nextgen_gallery_display.php:310
1122
+ #: products/photocrati_nextgen/modules/nextgen_gallery_display/module.nextgen_gallery_display.php:366
1123
+ msgid "Gallery Settings"
1124
+ msgstr "Galleri-inställningar"
1125
+
1126
+ #: products/photocrati_nextgen/modules/nextgen_gallery_display/class.displayed_gallery.php:74
1127
+ msgid "Source not compatible with selected display type"
1128
+ msgstr "Källan är inte förenlig med vald visningstyp"
1129
+
1130
+ #: products/photocrati_nextgen/modules/nextgen_gallery_display/class.displayed_gallery_renderer.php:206
1131
+ #: products/photocrati_nextgen/modules/nextgen_gallery_display/class.displayed_gallery_renderer.php:208
1132
+ #: products/photocrati_nextgen/modules/nextgen_gallery_display/class.displayed_gallery_renderer.php:212
1133
+ msgid "We cannot display this gallery"
1134
+ msgstr "Vi kan inte visa detta galleri"
1135
+
1136
+ #: products/photocrati_nextgen/modules/nextgen_gallery_display/class.displayed_gallery_source_manager.php:55
1137
+ msgid "Random Images"
1138
+ msgstr "Slumpblandade bilder"
1139
+
1140
+ #: products/photocrati_nextgen/modules/nextgen_gallery_display/class.displayed_gallery_source_manager.php:64
1141
+ msgid "Recent Images"
1142
+ msgstr "Senaste bilder"
1143
+
1144
+ #: products/photocrati_nextgen/modules/nextgen_gallery_display/module.nextgen_gallery_display.php:365
1145
+ msgid "NextGEN Gallery & Album Settings"
1146
+ msgstr "NextGEN Gallery & Album inställningar"
1147
+
1148
+ #: products/photocrati_nextgen/modules/nextgen_gallery_display/templates/alt_view_link_text.php:15
1149
+ #: products/photocrati_nextgen/modules/nextgen_gallery_display/templates/return_link_text.php:15
1150
+ msgid "link text"
1151
+ msgstr "länktext"
1152
+
1153
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.image_options_form.php:12
1154
+ msgid "Image Options"
1155
+ msgstr "Bildalternativ"
1156
+
1157
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.image_options_form.php:23
1158
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-sort.php:106
1159
+ msgid "Image ID"
1160
+ msgstr "Bild-id"
1161
+
1162
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.image_options_form.php:24
1163
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:574
1164
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-sort.php:107
1165
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:165
1166
+ msgid "Filename"
1167
+ msgstr "Filnamn"
1168
+
1169
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.image_options_form.php:25
1170
+ msgid "Alt/Title Text"
1171
+ msgstr "Alt/Title"
1172
+
1173
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.image_options_form.php:38
1174
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-sort.php:110
1175
+ msgid "Ascending"
1176
+ msgstr "Stigande"
1177
+
1178
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.image_options_form.php:39
1179
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-sort.php:111
1180
+ msgid "Descending"
1181
+ msgstr "Fallande"
1182
+
1183
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.image_options_form.php:50
1184
+ msgid "Categories"
1185
+ msgstr "Kategorier"
1186
+
1187
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.image_options_form.php:81
1188
+ msgid "Gallery path does not exist and could not be created"
1189
+ msgstr "Galleriets sökväg saknas och kunde inte skapas"
1190
+
1191
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.image_options_form.php:86
1192
+ msgid "Where would you like galleries stored?"
1193
+ msgstr "Var ska gallerier sparas?"
1194
+
1195
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.image_options_form.php:87
1196
+ msgid "Where galleries and their images are stored"
1197
+ msgstr "Sökväg för att spara gallerier"
1198
+
1199
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.image_options_form.php:89
1200
+ msgid "Delete Image Files?"
1201
+ msgstr "Radera bilder från borttagna gallerier?"
1202
+
1203
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.image_options_form.php:90
1204
+ msgid "When enabled, image files will be removed after a Gallery has been deleted"
1205
+ msgstr "När ett galleri tas bort, kommer även dess bildfiler tas bort"
1206
+
1207
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.image_options_form.php:92
1208
+ msgid "Show Related Images on Posts?"
1209
+ msgstr "Visa relaterade bilder i inlägg?"
1210
+
1211
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.image_options_form.php:93
1212
+ msgid "When enabled, related images will be appended to each post by matching the posts tags/categories to image tags"
1213
+ msgstr "Bilder kommer bifogas varje inlägg med etiketter eller kategorier som matchar bildens etiketter"
1214
+
1215
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.image_options_form.php:95
1216
+ msgid "(Show Customization Settings)"
1217
+ msgstr "(Visa anpassade inställningar)"
1218
+
1219
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.image_options_form.php:96
1220
+ msgid "(Hide Customization Settings)"
1221
+ msgstr "(Dölj anpassade inställningar)"
1222
+
1223
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.image_options_form.php:97
1224
+ msgid "How should related images be matched?"
1225
+ msgstr "Hur ska relaterade bilder matchas?"
1226
+
1227
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.image_options_form.php:100
1228
+ msgid "Maximum # of related images to display"
1229
+ msgstr "Maximalt antal relaterade bilder att visa"
1230
+
1231
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.image_options_form.php:102
1232
+ msgid "Heading for related images"
1233
+ msgstr "Rubrik för relaterade bilder"
1234
+
1235
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.image_options_form.php:104
1236
+ msgid "What's the default sorting method?"
1237
+ msgstr "Vilken sortering ska vara förvald?"
1238
+
1239
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.image_options_form.php:107
1240
+ msgid "Sort in what direction?"
1241
+ msgstr "Sorteringsordning?"
1242
+
1243
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.image_options_form.php:110
1244
+ msgid "Automatically resize images after upload"
1245
+ msgstr "Ändra storlek på uppladdade bilder automatiskt"
1246
+
1247
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.image_options_form.php:111
1248
+ msgid "It is recommended that your images be resized to be web friendly"
1249
+ msgstr "Det är rekommenderat att bilder ändras till webblämplig storlek"
1250
+
1251
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.image_options_form.php:113
1252
+ msgid "What should images be resized to?"
1253
+ msgstr "Vad ska bildstorleken ändras till?"
1254
+
1255
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.image_options_form.php:114
1256
+ msgid "After images are uploaded, they will be resized to the above dimensions and quality"
1257
+ msgstr "När bilder laddas upp, kommer de ändras till ovanstående dimensioner och kvalitet"
1258
+
1259
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.image_options_form.php:115
1260
+ msgid "Width:"
1261
+ msgstr "Bredd:"
1262
+
1263
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.image_options_form.php:116
1264
+ msgid "Height:"
1265
+ msgstr "Höjd:"
1266
+
1267
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.image_options_form.php:117
1268
+ msgid "Quality:"
1269
+ msgstr "Kvalitet:"
1270
+
1271
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.image_options_form.php:121
1272
+ msgid "Backup the original images?"
1273
+ msgstr "Säkerhetskopiera originalbilderna?"
1274
+
1275
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.lightbox_manager_form.php:12
1276
+ msgid "Lightbox Effects"
1277
+ msgstr "Lightbox-effekter"
1278
+
1279
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.lightbox_manager_form.php:32
1280
+ msgid "What effect would you like to use?"
1281
+ msgstr "Vilken effekt vill du använda?"
1282
+
1283
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.miscellaneous_form.php:12
1284
+ msgid "Miscellaneous"
1285
+ msgstr "Övrigt"
1286
+
1287
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.miscellaneous_form.php:21
1288
+ msgid "Add MediaRSS link?"
1289
+ msgstr "MediaRSS-länk?"
1290
+
1291
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.miscellaneous_form.php:22
1292
+ msgid "When enabled, adds a MediaRSS link to your header. Third-party web services can use this to publish your galleries"
1293
+ msgstr "Vid aktivering, läggs en MediaRSS-länk i din header. Tredjepart-webbtjänster kan använda detta för att publicera dina gallerier"
1294
+
1295
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.miscellaneous_form.php:26
1296
+ msgid "Display galleries in feeds"
1297
+ msgstr "Visa gallerier i flöden"
1298
+
1299
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.miscellaneous_form.php:27
1300
+ msgid "NextGEN hides its gallery displays in feeds other than MediaRSS. This enables image galleries in feeds."
1301
+ msgstr "NextGEN döljer sin gallerivisning i alla flöden utom MediaRSS. Detta aktiverar bildgallerier i flöden."
1302
+
1303
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.miscellaneous_form.php:30
1304
+ msgid "Clear image cache"
1305
+ msgstr "Rensa bild-cache"
1306
+
1307
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.miscellaneous_form.php:31
1308
+ msgid ""
1309
+ "Completely clear the NextGEN cache of all image modifications?\n"
1310
+ "\n"
1311
+ "Choose [Cancel] to Stop, [OK] to proceed."
1312
+ msgstr ""
1313
+ "Rensa alla bildändringar i NextGEN-cachen?\n"
1314
+ "\n"
1315
+ "Välj [Avbryt] för att avbryta, [OK] för att fortsätta."
1316
+
1317
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.miscellaneous_form.php:36
1318
+ msgid "Permalink slug"
1319
+ msgstr "Permalänk-smula"
1320
+
1321
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.miscellaneous_form.php:43
1322
+ msgid "Maximum image count"
1323
+ msgstr "Maximalt bildantal"
1324
+
1325
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.miscellaneous_form.php:45
1326
+ msgid "This is the maximum limit of images that NextGEN will restrict itself to querying"
1327
+ msgstr "Detta är den maximala antalet bilder som NextGEN kommer att söka efter"
1328
+
1329
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.miscellaneous_form.php:47
1330
+ msgid "Note: This limit will not apply to slideshow widgets or random galleries if/when those galleries specify their own image limits"
1331
+ msgstr "Obs: Denna gräns gäller inte bildspel eller slumpblandade gallerier om dessa gallerier har egna gräns-inställningar"
1332
+
1333
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.other_options_controller.php:22
1334
+ #: products/photocrati_nextgen/modules/nextgen_other_options/module.nextgen_other_options.php:69
1335
+ msgid "Other Options"
1336
+ msgstr "Andra alternativ"
1337
+
1338
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.reset_form.php:7
1339
+ msgid "Reset Options"
1340
+ msgstr "Återställ alternativ"
1341
+
1342
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.reset_form.php:15
1343
+ msgid "Reset all options to default settings"
1344
+ msgstr "Återställ alla alternativ till förvalda inställningar"
1345
+
1346
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.reset_form.php:16
1347
+ msgid "Replace all existing options and gallery options with their default settings"
1348
+ msgstr "Ersätt alla befintliga alternativ och galleri-alternativ med förvalda inställningar"
1349
+
1350
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.reset_form.php:17
1351
+ msgid "Reset settings"
1352
+ msgstr "Återställ inställningar"
1353
+
1354
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.reset_form.php:18
1355
+ msgid ""
1356
+ "Reset all options to default settings?\n"
1357
+ "\n"
1358
+ "Choose [Cancel] to Stop, [OK] to proceed."
1359
+ msgstr ""
1360
+ "Återställ alla alternativ till förvalda inställningar?\n"
1361
+ "\n"
1362
+ "Välj [Avbryt] för att avbryta, [OK] för att fortsätta."
1363
+
1364
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.roles_form.php:7
1365
+ msgid "Roles & Capabilities"
1366
+ msgstr "Roller och befogenheter"
1367
+
1368
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.styles_form.php:12
1369
+ msgid "Styles"
1370
+ msgstr "Stilar"
1371
+
1372
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.styles_form.php:18
1373
+ msgid "Enable custom CSS"
1374
+ msgstr "Aktivera anpassad CSS"
1375
+
1376
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.styles_form.php:20
1377
+ msgid "What stylesheet would you like to use?"
1378
+ msgstr "Vilken stilmall vill du använda?"
1379
+
1380
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.styles_form.php:23
1381
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.watermarks_form.php:136
1382
+ msgid "(Show Customization Options)"
1383
+ msgstr "(Visa anpassade alternativ)"
1384
+
1385
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.styles_form.php:24
1386
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.watermarks_form.php:137
1387
+ msgid "(Hide Customization Options)"
1388
+ msgstr "(Dölj anpassade alternativ)"
1389
+
1390
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.styles_form.php:25
1391
+ msgid "File Content:"
1392
+ msgstr "Filinnehåll:"
1393
+
1394
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.styles_form.php:26
1395
+ msgid "Changes you make to the contents will be saved to"
1396
+ msgstr "Dina innehållsändringar kommer att sparas till"
1397
+
1398
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.styles_form.php:27
1399
+ msgid "You could edit this file if it were writable"
1400
+ msgstr "Du kunde redigera den här filen om den var skrivbar"
1401
+
1402
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.thumbnail_options_form.php:12
1403
+ msgid "Thumbnail Options"
1404
+ msgstr "Miniatyr-alternativ"
1405
+
1406
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.thumbnail_options_form.php:20
1407
+ msgid "Default thumbnail dimensions:"
1408
+ msgstr "Förvald miniatyrstorlek"
1409
+
1410
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.thumbnail_options_form.php:21
1411
+ msgid "When generating thumbnails, what image dimensions do you desire?"
1412
+ msgstr "Dimensioner för genererade miniatyrer"
1413
+
1414
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.thumbnail_options_form.php:24
1415
+ msgid "Set fix dimension?"
1416
+ msgstr "Ställ in fast storlek?"
1417
+
1418
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.thumbnail_options_form.php:25
1419
+ msgid "Ignore the aspect ratio, no portrait thumbnails?"
1420
+ msgstr "Ignorera proportionerna. (inga porträttorienterade miniatyrer)"
1421
+
1422
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.thumbnail_options_form.php:27
1423
+ msgid "Adjust Thumbnail Quality?"
1424
+ msgstr "Justera miniatyrens kvalitet?"
1425
+
1426
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.thumbnail_options_form.php:28
1427
+ msgid "When generating thumbnails, what image quality do you desire?"
1428
+ msgstr "Vilken bildkvalitet vill du använda, när miniatyrer genereras?"
1429
+
1430
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.thumbnail_options_form.php:30
1431
+ msgid "Size List"
1432
+ msgstr "Storlekslista"
1433
+
1434
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.thumbnail_options_form.php:31
1435
+ msgid "List of default sizes used for thumbnails and images"
1436
+ msgstr "Lista över förvalda storlekar som används för miniatyrer och bilder"
1437
+
1438
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.watermarks_form.php:12
1439
+ msgid "Watermarks"
1440
+ msgstr "Vattenstämplar"
1441
+
1442
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.watermarks_form.php:41
1443
+ msgid "Using an Image"
1444
+ msgstr "Använd en bild"
1445
+
1446
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.watermarks_form.php:42
1447
+ msgid "Using Text"
1448
+ msgstr "Använd text"
1449
+
1450
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.watermarks_form.php:69
1451
+ msgid "An absolute or relative (to the site document root) file system path"
1452
+ msgstr "En filsökväg (antingen absolut eller relativt dokumentroten)"
1453
+
1454
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.watermarks_form.php:71
1455
+ msgid "An absolute or relative (to the site document root) file system path or an HTTP url"
1456
+ msgstr "En filsökväg (antingen absolut eller relativt dokumentroten), eller en http-url"
1457
+
1458
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.watermarks_form.php:74
1459
+ msgid "Image URL:"
1460
+ msgstr "Bild-URL:"
1461
+
1462
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.watermarks_form.php:90
1463
+ msgid "Font Family:"
1464
+ msgstr "Teckensnitt:"
1465
+
1466
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.watermarks_form.php:92
1467
+ msgid "Font Size:"
1468
+ msgstr "Teckenstorlek:"
1469
+
1470
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.watermarks_form.php:94
1471
+ msgid "Font Color:"
1472
+ msgstr "Teckenfärg:"
1473
+
1474
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.watermarks_form.php:97
1475
+ msgid "Text:"
1476
+ msgstr "Text:"
1477
+
1478
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.watermarks_form.php:99
1479
+ msgid "Opacity:"
1480
+ msgstr "Ogenomskinlighet:"
1481
+
1482
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.watermarks_form.php:126
1483
+ msgid "Please note: You can only activate the watermark under Manage Gallery. This action cannot be undone."
1484
+ msgstr "Observera: Vattenstämpeln kan bara aktiveras under \"Hantera Galleri\". Denna åtgärd kan inte ångras."
1485
+
1486
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.watermarks_form.php:127
1487
+ msgid "How will you generate a watermark?"
1488
+ msgstr "Hur ska du vattenstämpeln genereras?"
1489
+
1490
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.watermarks_form.php:131
1491
+ msgid "Position:"
1492
+ msgstr "Position:"
1493
+
1494
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.watermarks_form.php:133
1495
+ msgid "Offset:"
1496
+ msgstr "Förskjutning:"
1497
+
1498
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.watermarks_form.php:139
1499
+ msgid "Preview of saved settings:"
1500
+ msgstr "Förhandsgranska sparade inställningar:"
1501
+
1502
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.watermarks_form.php:140
1503
+ msgid "Refresh preview image"
1504
+ msgstr "Uppdatera förhandsvisningsbild"
1505
+
1506
+ #: products/photocrati_nextgen/modules/nextgen_other_options/templates/lightbox_library_tab.php:31
1507
+ msgid "What must the lightbox be applied to?"
1508
+ msgstr "Vad ska effekten tillämpas på?"
1509
+
1510
+ #: products/photocrati_nextgen/modules/nextgen_other_options/templates/lightbox_library_tab.php:35
1511
+ msgid "Only apply to NextGEN images"
1512
+ msgstr "Tillämpa endast på NextGEN-bilder"
1513
+
1514
+ #: products/photocrati_nextgen/modules/nextgen_other_options/templates/lightbox_library_tab.php:36
1515
+ msgid "Only apply to NextGEN and WordPress images"
1516
+ msgstr "Tillämpa endast på NextGEN- och WordPress-bilder"
1517
+
1518
+ #: products/photocrati_nextgen/modules/nextgen_other_options/templates/lightbox_library_tab.php:37
1519
+ msgid "Try to apply to all images"
1520
+ msgstr "Tillämpa på alla bilder, om det går"
1521
+
1522
+ #: products/photocrati_nextgen/modules/nextgen_other_options/templates/lightbox_library_tab.php:38
1523
+ msgid "Try to apply to all images that link to image files"
1524
+ msgstr "Tillämpa på alla länkade bilder, om det går"
1525
+
1526
+ #: products/photocrati_nextgen/modules/nextgen_other_options/templates/styling_tab.php:35
1527
+ msgid "Place any custom stylesheets in <strong>wp-content/ngg_styles</strong>"
1528
+ msgstr "Spara anpassade stilmallar i <strong>wp-content/ngg_styles</strong>"
1529
+
1530
+ # Bug in NextGEN: Both translated string and original string is displayed.
1531
+ #: products/photocrati_nextgen/modules/nextgen_other_options/templates/styling_tab.php:38
1532
+ #, php-format
1533
+ msgid "All stylesheets must contain a <a href='#' onclick='%s'>file header</a>"
1534
+ msgstr "Alla stilmallar måste innehålla ett <a href='#' onclick='%s'>filhuvud</a>"
1535
+
1536
+ #: products/photocrati_nextgen/modules/nextgen_settings/module.nextgen_settings.php:76
1537
+ msgid "Related Images"
1538
+ msgstr "Relaterade bilder"
1539
+
1540
+ # Missed by NextGEN, translated string is not displayed.
1541
+ #: products/photocrati_nextgen/modules/nextgen_settings/module.nextgen_settings.php:96
1542
+ msgid "[Show slideshow]"
1543
+ msgstr "[Visa bildspel]"
1544
+
1545
+ #: products/photocrati_nextgen/modules/nextgen_settings/module.nextgen_settings.php:97
1546
+ msgid "[Show thumbnails]"
1547
+ msgstr "[Visa miniatyrer]"
1548
+
1549
+ #: products/photocrati_nextgen/modules/nextgen_xmlrpc/module.nextgen_xmlrpc.php:428
1550
+ msgid "Sorry, you must be able to manage galleries"
1551
+ msgstr "Tyvärr måste du kunna hantera gallerier"
1552
+
1553
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:155
1554
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:186
1555
+ msgid "Overview"
1556
+ msgstr "Översikt"
1557
+
1558
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:168
1559
+ msgid "Network settings"
1560
+ msgstr "Nätverksinställningar"
1561
+
1562
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:276
1563
+ msgid "You do not have the correct permission"
1564
+ msgstr "Du har inte rätt behörighet"
1565
+
1566
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:277
1567
+ msgid "Unexpected Error"
1568
+ msgstr "Oväntat fel"
1569
+
1570
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:278
1571
+ msgid "A failure occurred"
1572
+ msgstr "Ett fel inträffade"
1573
+
1574
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:379
1575
+ msgid "<a href=\"https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/\" target=\"_blank\">Introduction</a>"
1576
+ msgstr "<a href=\"https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/\" target=\"_blank\">Introduktion</a>"
1577
+
1578
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:382
1579
+ msgid "<a href=\"https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery//languages\" target=\"_blank\">Languages</a>"
1580
+ msgstr "<a href=\"https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery//languages\" target=\"_blank\">Språk</a>"
1581
+
1582
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:387
1583
+ msgid "Get help with NextGEN Gallery"
1584
+ msgstr "Få hjälp med NextGEN Gallery"
1585
+
1586
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:391
1587
+ msgid "More Help & Info"
1588
+ msgstr "Mer hjälp & information"
1589
+
1590
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:393
1591
+ msgid "<a href=\"http://wordpress.org/tags/nextgen-gallery?forum_id=10\" target=\"_blank\">Support Forums</a>"
1592
+ msgstr "<a href=\"http://wordpress.org/tags/nextgen-gallery?forum_id=10\" target=\"_blank\">Supportforum</a>"
1593
+
1594
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:394
1595
+ msgid "FAQ"
1596
+ msgstr "Frågor och svar"
1597
+
1598
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:395
1599
+ msgid "Feature request"
1600
+ msgstr "Begäran om funktion"
1601
+
1602
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:396
1603
+ msgid "Get your language pack"
1604
+ msgstr "Hämta ditt språkpaket"
1605
+
1606
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:397
1607
+ msgid "Contribute development"
1608
+ msgstr "Bidra med utvecklingsarbete"
1609
+
1610
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:398
1611
+ msgid "Download latest version"
1612
+ msgstr "Ladda ner senaste versionen"
1613
+
1614
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/ajax.php:288
1615
+ #, php-format
1616
+ msgid "Could create image with %s x %s pixel"
1617
+ msgstr "Kunde skapa bild med %s x %s pxl"
1618
+
1619
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:172
1620
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:216
1621
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:239
1622
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/edit-thumbnail.php:19
1623
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/edit-thumbnail.php:22
1624
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:598
1625
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/publish.php:7
1626
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/publish.php:10
1627
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/publish.php:13
1628
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/rotate.php:17
1629
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/rotate.php:20
1630
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/showmeta.php:10
1631
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/showmeta.php:13
1632
+ msgid "Cheatin&#8217; uh?"
1633
+ msgstr "Fuskar du?"
1634
+
1635
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:180
1636
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:209
1637
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:253
1638
+ msgid "Updated Successfully"
1639
+ msgstr "Uppdatering klar"
1640
+
1641
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:227
1642
+ msgid "Album deleted"
1643
+ msgstr "Album borttaget"
1644
+
1645
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:423
1646
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/roles.php:55
1647
+ msgid "Edit Album"
1648
+ msgstr "Redigera album"
1649
+
1650
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:443
1651
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:492
1652
+ msgid "Select album"
1653
+ msgstr "Välj album"
1654
+
1655
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:445
1656
+ msgid "No album selected"
1657
+ msgstr "Inget album valt"
1658
+
1659
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:456
1660
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/edit-thumbnail.php:177
1661
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/rotate.php:102
1662
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/wpmu.php:112
1663
+ msgid "Update"
1664
+ msgstr "Uppdatera"
1665
+
1666
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:458
1667
+ msgid "Edit album"
1668
+ msgstr "Redigera album"
1669
+
1670
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:461
1671
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:186
1672
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:361
1673
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:363
1674
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:226
1675
+ msgid "Delete"
1676
+ msgstr "Ta bort"
1677
+
1678
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:465
1679
+ msgid "Add new album"
1680
+ msgstr "Lägg till nytt album"
1681
+
1682
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:467
1683
+ msgid "Add"
1684
+ msgstr "Lägg till"
1685
+
1686
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:478
1687
+ msgid "Show / hide used galleries"
1688
+ msgstr "Visa/dölj gallerier som används"
1689
+
1690
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:478
1691
+ msgid "[Show all]"
1692
+ msgstr "Visa allt"
1693
+
1694
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:479
1695
+ msgid "Maximize the widget content"
1696
+ msgstr "Maximera widget-innehållen"
1697
+
1698
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:479
1699
+ msgid "[Maximize]"
1700
+ msgstr "[Maximera]"
1701
+
1702
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:480
1703
+ msgid "Minimize the widget content"
1704
+ msgstr "Minimera widget-innehållen"
1705
+
1706
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:480
1707
+ msgid "[Minimize]"
1708
+ msgstr "[Minimera]"
1709
+
1710
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:482
1711
+ msgid "After you create and select an album, you can drag and drop a gallery or another album into your new album below"
1712
+ msgstr "När du skapar eller väljer ett album, kan du lägga till gallerier eller andra album genom att dra och släppa dem nedan"
1713
+
1714
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:508
1715
+ msgid "Select gallery"
1716
+ msgstr "Välj galleri"
1717
+
1718
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:533
1719
+ msgid "Album ID"
1720
+ msgstr "Album-id"
1721
+
1722
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:546
1723
+ msgid "No album selected!"
1724
+ msgstr "Inget album valt!"
1725
+
1726
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:567
1727
+ msgid "Album name:"
1728
+ msgstr "Album - namn:"
1729
+
1730
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:573
1731
+ msgid "Album description:"
1732
+ msgstr "Album - beskrivning:"
1733
+
1734
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:579
1735
+ msgid "Select a preview image:"
1736
+ msgstr "Välj en förhandsvisningsbild:"
1737
+
1738
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:592
1739
+ msgid "Page Link to"
1740
+ msgstr "Sidlänk till"
1741
+
1742
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:616
1743
+ msgid "There are no pages to link to"
1744
+ msgstr "Det finns inga sidor att länka till"
1745
+
1746
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:611
1747
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:336
1748
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:365
1749
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:396
1750
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:410
1751
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:446
1752
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:475
1753
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:506
1754
+ msgid "OK"
1755
+ msgstr "OK"
1756
+
1757
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:613
1758
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:338
1759
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:367
1760
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:398
1761
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:412
1762
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:448
1763
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:477
1764
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:508
1765
+ msgid "Cancel"
1766
+ msgstr "Avbryt"
1767
+
1768
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:706
1769
+ msgid "Name"
1770
+ msgstr "Namn"
1771
+
1772
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:708
1773
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/rewrite.php:229
1774
+ msgid "Page"
1775
+ msgstr "Sida"
1776
+
1777
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/edit-thumbnail.php:127
1778
+ msgid "Select with the mouse the area for the new thumbnail"
1779
+ msgstr "Välj med musen, ytan för den nya miniatyren"
1780
+
1781
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/edit-thumbnail.php:141
1782
+ msgid "Thumbnail updated"
1783
+ msgstr "Miniatyr uppdaterad"
1784
+
1785
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/edit-thumbnail.php:146
1786
+ msgid "Error updating thumbnail"
1787
+ msgstr "Fel vid uppdatering av miniatyr"
1788
+
1789
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/edit-thumbnail.php:162
1790
+ msgid "Select the area for the thumbnail from the picture on the left."
1791
+ msgstr "Välj yta för miniatyr, från bilden till vänster."
1792
+
1793
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:44
1794
+ msgid "No valid gallery name!"
1795
+ msgstr "Inget giltigt gallerinamn!"
1796
+
1797
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:55
1798
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:83
1799
+ msgid "Directory"
1800
+ msgstr "Katalog"
1801
+
1802
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:55
1803
+ msgid "didn't exist. Please create first the main gallery folder "
1804
+ msgstr "fanns inte. Skapa först galleriets huvudmapp"
1805
+
1806
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:56
1807
+ msgid "Check this link, if you didn't know how to set the permission :"
1808
+ msgstr "Kolla denna länk, om du inte vet hur du anger behörigheten:"
1809
+
1810
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:79
1811
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:88
1812
+ msgid "Unable to create directory "
1813
+ msgstr "Kunde inte skapa katalog"
1814
+
1815
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:83
1816
+ msgid "is not writeable !"
1817
+ msgstr "är inte skrivbar!"
1818
+
1819
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:92
1820
+ msgid "The server setting Safe-Mode is on !"
1821
+ msgstr "Serverinställningen Safe-Mode är på!"
1822
+
1823
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:93
1824
+ msgid "If you have problems, please create directory"
1825
+ msgstr "Om du har problem, vänligen skapa katalog"
1826
+
1827
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:94
1828
+ msgid "and the thumbnails directory"
1829
+ msgstr "och katalogen med miniatyrer"
1830
+
1831
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:94
1832
+ msgid "with permission 777 manually !"
1833
+ msgstr "med rättigheterna 777 manuellt!"
1834
+
1835
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:121
1836
+ #, php-format
1837
+ msgid "Gallery successfully created. <a href=\"%s\" target=\"_blank\">Manage gallery</a>"
1838
+ msgstr ""
1839
+
1840
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:122
1841
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:692
1842
+ msgid "Edit gallery"
1843
+ msgstr "Redigera galleri"
1844
+
1845
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:189
1846
+ msgid "Error while creating thumbnail."
1847
+ msgstr "Fel uppstod vid skapande av miniatyr."
1848
+
1849
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:242
1850
+ msgid "Error while resizing image."
1851
+ msgstr "Fel uppstod vid ändring av bildens storlek."
1852
+
1853
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:324
1854
+ msgid "Error while rotating image."
1855
+ msgstr "Fel uppstod vid rotation av bilden."
1856
+
1857
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:358
1858
+ msgid "Error while applying watermark to image."
1859
+ msgstr "Fel uppstod vid tillämpning av vattenstämpel på bilden."
1860
+
1861
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:382
1862
+ msgid "Object didn't contain correct data"
1863
+ msgstr "Objektet innehöll inte rätt data"
1864
+
1865
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:388
1866
+ msgid "File do not exists"
1867
+ msgstr "Filen saknas"
1868
+
1869
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:392
1870
+ msgid "Couldn't restore original image"
1871
+ msgstr "Kunde inte återställa ursprungliga bilden"
1872
+
1873
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:514
1874
+ msgid "(Error : Couldn't not update data base)"
1875
+ msgstr "(Fel: Kunde inte uppdatera databas)"
1876
+
1877
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:521
1878
+ msgid "(Error : Couldn't not update meta data)"
1879
+ msgstr "(Fel: Kunde inte uppdatera meta-data)"
1880
+
1881
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:530
1882
+ msgid "(Error : Couldn't not find image)"
1883
+ msgstr "(Fel: Kunde inte hitta bilden)"
1884
+
1885
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:620
1886
+ msgid "Directory <strong>%s</strong> doesn&#96;t exist!"
1887
+ msgstr "Katalogen <strong>%s</strong> finns inte!"
1888
+
1889
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:628
1890
+ msgid "Directory <strong>%s</strong> contains no pictures"
1891
+ msgstr "Katalogen <strong>%s</strong> innehåller inga bilder"
1892
+
1893
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:644
1894
+ msgid "Database error. Could not add gallery!"
1895
+ msgstr "Databasfel. Kunde inte lägga till galleriet!"
1896
+
1897
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:651
1898
+ msgid "Gallery <strong>%s</strong> successfully created!"
1899
+ msgid_plural "Galleries <strong>%s</strong> successfully created!"
1900
+ msgstr[0] "Galleri <strong>%s</strong> har skapats!"
1901
+ msgstr[1] "Gallerierna <strong>%s</strong> har skapats!"
1902
+
1903
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:687
1904
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:111
1905
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:188
1906
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:238
1907
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:322
1908
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:640
1909
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:718
1910
+ msgid "Create new thumbnails"
1911
+ msgstr "Skapa nya miniatyrer"
1912
+
1913
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/functions.php:690
1914
+ #, php-format
1915
+ msgid "One picture successfully added"
1916
+ msgid_plural "%s pictures successfully added"
1917
+ msgstr[0] "En bild har lagts till"
1918
+ msgstr[1] "%s bilder har lagts till"
1919
+
1920
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/install.php:20
1921
+ msgid "Sorry, NextGEN Gallery works only with a role called administrator"
1922
+ msgstr "Tyvärr, NextGEN Gallery kan bara hanteras av användare med rollen administratör"
1923
+
1924
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/install.php:92
1925
+ msgid "NextGEN Gallery : Tables could not created, please check your database settings"
1926
+ msgstr "NextGEN Gallery: Tabeller kunde inte skapas, kontrollera databasinställningarna"
1927
+
1928
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:99
1929
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:206
1930
+ msgid "No images selected"
1931
+ msgstr "Inga bilder valda"
1932
+
1933
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:107
1934
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:189
1935
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:234
1936
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:323
1937
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:621
1938
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:702
1939
+ msgid "Resize images"
1940
+ msgstr "Ändra storlek på bilder"
1941
+
1942
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:116
1943
+ #, php-format
1944
+ msgid ""
1945
+ "You are about to start the bulk edit for %s galleries \n"
1946
+ " \n"
1947
+ " 'Cancel' to stop, 'OK' to proceed."
1948
+ msgstr ""
1949
+ "Du håller på att starta gruppändring av %s gallerier\n"
1950
+ "\n"
1951
+ "'Avbryt' för att avbryta, 'OK' för att fortsätta."
1952
+
1953
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:154
1954
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:196
1955
+ msgid "Add new gallery"
1956
+ msgstr "Lägg till nytt galleri"
1957
+
1958
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:170
1959
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:173
1960
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:271
1961
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:274
1962
+ msgid "Search Images"
1963
+ msgstr "Sök bilder"
1964
+
1965
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:185
1966
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:320
1967
+ msgid "Bulk actions"
1968
+ msgstr "Gruppåtgärder"
1969
+
1970
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:187
1971
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:321
1972
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:571
1973
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:666
1974
+ msgid "Set watermark"
1975
+ msgstr "Ställ in vattenstämpel"
1976
+
1977
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:190
1978
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:326
1979
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:576
1980
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:686
1981
+ msgid "Import metadata"
1982
+ msgstr "Importera metadata"
1983
+
1984
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:191
1985
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:324
1986
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:566
1987
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:663
1988
+ msgid "Recover from backup"
1989
+ msgstr "Återställ från säkerhetskopia"
1990
+
1991
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:193
1992
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:335
1993
+ msgid "Apply"
1994
+ msgstr "Tillämpa"
1995
+
1996
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:261
1997
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:252
1998
+ msgid "Edit"
1999
+ msgstr "Redigera"
2000
+
2001
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:308
2002
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:383
2003
+ msgid "No entries found"
2004
+ msgstr "Inga träffar"
2005
+
2006
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:326
2007
+ msgid "New Gallery"
2008
+ msgstr "Nytt galleri"
2009
+
2010
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:328
2011
+ msgid "Create a new , empty gallery below the folder"
2012
+ msgstr "Skapa ett nytt, tomt galleri under mappen"
2013
+
2014
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:330
2015
+ msgid "Allowed characters for file and folder names are"
2016
+ msgstr "Tillåtna tecken för fil- och mappnamn är"
2017
+
2018
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:356
2019
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:466
2020
+ msgid "Resize Images to"
2021
+ msgstr "Ändra storlek på bilder till"
2022
+
2023
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:360
2024
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:470
2025
+ msgid "Width x height (in pixel). NextGEN Gallery will keep ratio size"
2026
+ msgstr "Bredd x höjd (i pixlar). NextGEN Gallery kommer att behålla proportionerna"
2027
+
2028
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:384
2029
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:494
2030
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/publish.php:40
2031
+ msgid "Width x height (in pixel)"
2032
+ msgstr "Bredd x höjd (i pixlar)"
2033
+
2034
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:390
2035
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:500
2036
+ msgid "Set fix dimension"
2037
+ msgstr "Ställ in fast dimension"
2038
+
2039
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:392
2040
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:502
2041
+ msgid "Ignore the aspect ratio, no portrait thumbnails"
2042
+ msgstr "Ignorera proportionerna (inga porträttorienterade miniatyrer)"
2043
+
2044
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:455
2045
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:572
2046
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:155
2047
+ msgid "ID"
2048
+ msgstr "ID"
2049
+
2050
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:457
2051
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:575
2052
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/media-upload.php:245
2053
+ msgid "Description"
2054
+ msgstr "Beskrivning"
2055
+
2056
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:459
2057
+ msgid "Page ID"
2058
+ msgstr "Sid-id"
2059
+
2060
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:35
2061
+ msgid "Gallery not found."
2062
+ msgstr "Galleri hittades inte."
2063
+
2064
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:41
2065
+ msgid "Sorry, you have no access here"
2066
+ msgstr "Tyvärr, har du inte åtkomst här"
2067
+
2068
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:214
2069
+ msgid "Copy image to..."
2070
+ msgstr "Kopiera bild till..."
2071
+
2072
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:218
2073
+ msgid "Move image to..."
2074
+ msgstr "Flytta bild till..."
2075
+
2076
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:222
2077
+ msgid "Add new tags"
2078
+ msgstr "Lägg till etiketter"
2079
+
2080
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:226
2081
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:332
2082
+ msgid "Delete tags"
2083
+ msgstr "Ta bort etiketter"
2084
+
2085
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:230
2086
+ msgid "Overwrite"
2087
+ msgstr "Skriv över"
2088
+
2089
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:243
2090
+ #, php-format
2091
+ msgid ""
2092
+ "You are about to start the bulk edit for %s images \n"
2093
+ " \n"
2094
+ " 'Cancel' to stop, 'OK' to proceed."
2095
+ msgstr ""
2096
+ "Du håller på att starta gruppändring av %s bilder\n"
2097
+ "\n"
2098
+ "'Avbryt' för att avbryta, 'OK' för att fortsätta."
2099
+
2100
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:268
2101
+ #, php-format
2102
+ msgid "Search results for &#8220;%s&#8221;"
2103
+ msgstr "Sökresultat för \"%s\""
2104
+
2105
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:297
2106
+ msgid "Click to toggle"
2107
+ msgstr "Klicka för att växla"
2108
+
2109
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:298
2110
+ msgid "Gallery settings"
2111
+ msgstr "Galleri-inställningar"
2112
+
2113
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:298
2114
+ msgid "Click here for more settings"
2115
+ msgstr "Klicka här för fler inställningar"
2116
+
2117
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:304
2118
+ msgid "Scan Folder for new images"
2119
+ msgstr "Skanna mapp efter nya bilder"
2120
+
2121
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:306
2122
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:341
2123
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:390
2124
+ msgid "Save Changes"
2125
+ msgstr "Spara ändringar"
2126
+
2127
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:325
2128
+ msgid "Delete images"
2129
+ msgstr "Ta bort bilder"
2130
+
2131
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:327
2132
+ msgid "Rotate images clockwise"
2133
+ msgstr "Rotera bilder medurs"
2134
+
2135
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:328
2136
+ msgid "Rotate images counter-clockwise"
2137
+ msgstr "Rotera bilder moturs"
2138
+
2139
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:329
2140
+ msgid "Copy to..."
2141
+ msgstr "Kopiera till..."
2142
+
2143
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:330
2144
+ msgid "Move to..."
2145
+ msgstr "Flytta till..."
2146
+
2147
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:331
2148
+ msgid "Add tags"
2149
+ msgstr "Lägg till etiketter..."
2150
+
2151
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:333
2152
+ msgid "Overwrite tags"
2153
+ msgstr "Skriv över etiketter"
2154
+
2155
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:338
2156
+ msgid "Sort gallery"
2157
+ msgstr "Sortera galleri"
2158
+
2159
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:406
2160
+ msgid "Enter the tags"
2161
+ msgstr "Ange etiketterna"
2162
+
2163
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:430
2164
+ msgid "Select the destination gallery:"
2165
+ msgstr "Välj mål-galleri:"
2166
+
2167
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:573
2168
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:160
2169
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/media-upload.php:266
2170
+ msgid "Thumbnail"
2171
+ msgstr "Miniatyr"
2172
+
2173
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:575
2174
+ msgid "Alt &amp; Title Text"
2175
+ msgstr "Alt och Title-text"
2176
+
2177
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:576
2178
+ msgid "Tags (comma separated list)"
2179
+ msgstr "Etiketter (kommaseparerade)"
2180
+
2181
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-sort.php:34
2182
+ msgid "Sort order changed"
2183
+ msgstr "Sorteringsordningen ändrad"
2184
+
2185
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-sort.php:92
2186
+ msgid "Sort Gallery"
2187
+ msgstr "Sortera galleri"
2188
+
2189
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-sort.php:96
2190
+ msgid "Update Sort Order"
2191
+ msgstr "Uppdatera sorteringsordning"
2192
+
2193
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-sort.php:99
2194
+ msgid "Back to gallery"
2195
+ msgstr "Tillbaka till galleri"
2196
+
2197
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-sort.php:104
2198
+ msgid "Presort"
2199
+ msgstr "Försortera"
2200
+
2201
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-sort.php:105
2202
+ msgid "Unsorted"
2203
+ msgstr "Osorterade"
2204
+
2205
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-sort.php:108
2206
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/media-upload.php:241
2207
+ msgid "Alt/Title text"
2208
+ msgstr "Alt/Title"
2209
+
2210
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:89
2211
+ msgid "deleted successfully"
2212
+ msgstr "har tagits bort"
2213
+
2214
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:105
2215
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:114
2216
+ msgid "Operation successful. Please clear your browser cache."
2217
+ msgstr "Åtgärden lyckades. Var vänlig och rensa webbläsarens cacheminne."
2218
+
2219
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:170
2220
+ msgid "Alt & Title Text / Description"
2221
+ msgstr "Alt- & Title-text / Beskrivning"
2222
+
2223
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:213
2224
+ msgid "Exclude ?"
2225
+ msgstr "Utesluta?"
2226
+
2227
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:298
2228
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:300
2229
+ msgid "View"
2230
+ msgstr "Visa"
2231
+
2232
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:308
2233
+ msgid "Show meta data"
2234
+ msgstr "Visa metadata"
2235
+
2236
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:309
2237
+ msgid "Meta"
2238
+ msgstr "Meta"
2239
+
2240
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:317
2241
+ msgid "Customize thumbnail"
2242
+ msgstr "Anpassa miniatyr"
2243
+
2244
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:318
2245
+ msgid "Edit thumb"
2246
+ msgstr "Redigera miniatyr"
2247
+
2248
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:326
2249
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:327
2250
+ msgid "Rotate"
2251
+ msgstr "Rotera"
2252
+
2253
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:337
2254
+ msgid "Publish this image"
2255
+ msgstr "Publicera den här bilden"
2256
+
2257
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:338
2258
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/publish.php:58
2259
+ msgid "Publish"
2260
+ msgstr "Publicera"
2261
+
2262
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:348
2263
+ msgid "Recover image from backup"
2264
+ msgstr "Återställ bilden från säkerhetskopia"
2265
+
2266
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:349
2267
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:351
2268
+ msgid "Recover"
2269
+ msgstr "Återställ"
2270
+
2271
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:360
2272
+ msgid "Delete image"
2273
+ msgstr "Ta bort bild"
2274
+
2275
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:391
2276
+ msgid "Title:"
2277
+ msgstr "Titel:"
2278
+
2279
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:397
2280
+ msgid "Description:"
2281
+ msgstr "Beskrivning:"
2282
+
2283
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:403
2284
+ msgid "Gallery path:"
2285
+ msgstr "Galleri-sökväg:"
2286
+
2287
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:418
2288
+ msgid "Link to page:"
2289
+ msgstr "Länk till sida:"
2290
+
2291
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:419
2292
+ msgid "Albums will link this gallery to the selected page"
2293
+ msgstr "Album kommer att länka detta galleri till den valda sidan"
2294
+
2295
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:424
2296
+ msgid "Preview image:"
2297
+ msgstr "Förhandsvisa bild:"
2298
+
2299
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:430
2300
+ msgid "Create new page:"
2301
+ msgstr "Skapa ny sida:"
2302
+
2303
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:586
2304
+ msgid "Gallery deleted successfully "
2305
+ msgstr "Galleri har tagits bort"
2306
+
2307
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:657
2308
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:660
2309
+ msgid "Rotate images"
2310
+ msgstr "Rotera bilder"
2311
+
2312
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:682
2313
+ msgid "Pictures deleted successfully "
2314
+ msgstr "Bilder har tagits bort"
2315
+
2316
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:778
2317
+ msgid "Tags changed"
2318
+ msgstr "Etiketter ändrade"
2319
+
2320
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:853
2321
+ msgid "New gallery page ID"
2322
+ msgstr "ID för ny gallerisida"
2323
+
2324
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:853
2325
+ msgid "created"
2326
+ msgstr "skapad"
2327
+
2328
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:891
2329
+ msgid "Published a new post"
2330
+ msgstr "Publicerade ett nytt inlägg"
2331
+
2332
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:1022
2333
+ msgid "1 item"
2334
+ msgid_plural "%s items"
2335
+ msgstr[0] "1 objekt"
2336
+ msgstr[1] "%s objekt"
2337
+
2338
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:1038
2339
+ msgid "Go to the first page"
2340
+ msgstr "Gå till första sidan"
2341
+
2342
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:1045
2343
+ msgid "Go to the previous page"
2344
+ msgstr "Gå till föregående sida"
2345
+
2346
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:1054
2347
+ msgid "Current page"
2348
+ msgstr "Aktuell sida"
2349
+
2350
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:1065
2351
+ msgid "Go to the next page"
2352
+ msgstr "Gå till nästa sida"
2353
+
2354
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:1072
2355
+ msgid "Go to the last page"
2356
+ msgstr "Gå till sista sidan"
2357
+
2358
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/media-upload.php:186
2359
+ msgid "No gallery"
2360
+ msgstr "Inget galleri"
2361
+
2362
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/media-upload.php:198
2363
+ msgid "Select &#187;"
2364
+ msgstr "Välj»"
2365
+
2366
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/media-upload.php:229
2367
+ #: products/photocrati_nextgen/modules/widget/templates/form_gallery.php:15
2368
+ msgid "Show"
2369
+ msgstr "Visa"
2370
+
2371
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/media-upload.php:230
2372
+ msgid "Hide"
2373
+ msgstr "Dölj"
2374
+
2375
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/media-upload.php:235
2376
+ msgid "Image ID:"
2377
+ msgstr "Bild-id"
2378
+
2379
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/media-upload.php:249
2380
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/publish.php:45
2381
+ msgid "Alignment"
2382
+ msgstr "Justering"
2383
+
2384
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/media-upload.php:256
2385
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/publish.php:51
2386
+ msgid "Center"
2387
+ msgstr "Centrera"
2388
+
2389
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/media-upload.php:262
2390
+ msgid "Size"
2391
+ msgstr "Storlek"
2392
+
2393
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/media-upload.php:268
2394
+ msgid "Full size"
2395
+ msgstr "Full storlek"
2396
+
2397
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/media-upload.php:270
2398
+ msgid "Singlepic"
2399
+ msgstr "Singlepic"
2400
+
2401
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/media-upload.php:282
2402
+ msgid "Use as featured image"
2403
+ msgstr "Använd som utvald bild"
2404
+
2405
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/media-upload.php:284
2406
+ msgid "Insert into Post"
2407
+ msgstr "Infoga i inlägg"
2408
+
2409
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/media-upload.php:295
2410
+ msgid "Save all changes"
2411
+ msgstr "Spara alla ändringar"
2412
+
2413
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:14
2414
+ msgid "NextGEN Gallery Overview"
2415
+ msgstr "NextGEN Gallery - Översikt"
2416
+
2417
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:84
2418
+ msgid "Welcome to NextGEN Gallery !"
2419
+ msgstr "Välkommen till NextGEN Gallery!"
2420
+
2421
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:85
2422
+ msgid "Do you like this Plugin?"
2423
+ msgstr "Tycker du om detta tillägg?"
2424
+
2425
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:87
2426
+ msgid "About"
2427
+ msgstr "Om"
2428
+
2429
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:90
2430
+ msgid "Server Settings"
2431
+ msgstr "Serverinställningar"
2432
+
2433
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:97
2434
+ msgid "NextGEN Gallery is one of the most popular WordPress plugins of all time with over 30 million downloads."
2435
+ msgstr "NextGEN Gallery är en av de mest populära WordPress-tilläggen genom tiderna med över 30 miljoner nedladdningar."
2436
+
2437
+ # Missed by NextGEN, translated string is displayed.
2438
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:97
2439
+ msgid "It is developed and supported by Imagely. We'd like to offer a special thanks to Alex Rabe, who first developed the plugin and maintained it through 2011."
2440
+ msgstr "Det utvecklas och stöds av Imagely. Vi vill framföra ett särskilt tack till Alex Rabe, som först utvecklade tillägget och underhöll det till och med 2011."
2441
+
2442
+ # Missed by NextGEN, translated string is displayed.
2443
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:98
2444
+ msgid "<strong>NEED HELP?</strong> If you need help or assistance please visit the <a href='http://wordpress.org/support/plugin/nextgen-gallery'>NextGEN Gallery forums on WordPress.org</a>. Please note that we actively monitor and participate in the forums, but given that NextGEN Gallery is a free product, we don't guarantee replies to support queries."
2445
+ msgstr "<strong>Behöver du hjälp?</strong> Behöver du hjälp eller assistans, besök <a href='http://wordpress.org/support/plugin/nextgen-gallery'>NextGEN Gallery-forum på WordPress.org</a>. Observera att vi aktivt övervakar och deltar i forumen, men eftersom NextGEN Gallery är en gratisprodukt, kan vi inte garantera svar på alla supportfrågor."
2446
+
2447
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:99
2448
+ msgid "<strong>EXTENDING NEXTGEN?</strong> There are many third party plugins that add displays and functionality for NextGEN Gallery. See our <a href='https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery//nextgen-gallery-extension-plugins/'>Complete List of NextGEN Extension Plugins</a>."
2449
+ msgstr "<strong>Utöka NextGEN?</strong> Det finns många tredjepart-tillägg som lägger till visningar och funktionalitet för NextGEN Gallery. Se <a href='https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery//nextgen-gallery-extension-plugins/'>komplett lista av utökningstillägg till NextGEN</a>."
2450
+
2451
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:107
2452
+ #, php-format
2453
+ msgid "This plugin is primarily developed, maintained, supported and documented by <a href=\"%s\" target=\"_blank\">Imagely</a> with a lot of love & effort. Any kind of contribution would be highly appreciated. Thanks!"
2454
+ msgstr "Detta tillägg utvecklas, underhålls, stöds och dokumenteras främst av <a href=\"%s\" target=\"_blank\">Imagely</a> med en massa kärlek och insats. Någon form av bidrag skulle verkligen uppskattas. Tack!"
2455
+
2456
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:112
2457
+ msgid "Please click \"Works\" on WordPress.org"
2458
+ msgstr "Klicka \"Works\" på WordPress.org"
2459
+
2460
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:117
2461
+ msgid "Give it a good rating on WordPress.org"
2462
+ msgstr "Ge det ett bra betyg på WordPress.org"
2463
+
2464
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:122
2465
+ msgid "Visit the plugin homepage"
2466
+ msgstr "Besök tilläggets hemsida"
2467
+
2468
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:127
2469
+ msgid "Help translating it"
2470
+ msgstr "Hjälp till att översätta det"
2471
+
2472
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:149
2473
+ msgid "Graphic Library"
2474
+ msgstr "Grafiskt bibliotek"
2475
+
2476
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:165
2477
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:214
2478
+ msgid "Loading&#8230;"
2479
+ msgstr "Laddar &#8230;"
2480
+
2481
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:165
2482
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:214
2483
+ msgid "This widget requires JavaScript."
2484
+ msgstr "Denna widget kräver JavaScript."
2485
+
2486
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:178
2487
+ msgid "Thanks to all donators..."
2488
+ msgstr "Tack vare alla donatorer..."
2489
+
2490
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:200
2491
+ msgid "View all"
2492
+ msgstr "Visa allt"
2493
+
2494
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:226
2495
+ #, php-format
2496
+ msgid "Newsfeed could not be loaded. Check the <a href=\"%s\">front page</a> to check for updates."
2497
+ msgstr "Nyhetsflöde kunde inte laddas. Kolla <a href=\"%s\">framsida</a> för att söka efter uppdateringar."
2498
+
2499
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:238
2500
+ msgid "Untitled"
2501
+ msgstr "Namnlöst"
2502
+
2503
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:303
2504
+ msgid "At a Glance"
2505
+ msgstr "I korthet"
2506
+
2507
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:320
2508
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/rewrite.php:223
2509
+ msgid "Album"
2510
+ msgid_plural "Albums"
2511
+ msgstr[0] "Album"
2512
+ msgstr[1] "Album"
2513
+
2514
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:360
2515
+ msgid "Storage Space"
2516
+ msgstr "Lagringsutrymme"
2517
+
2518
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:364
2519
+ #, php-format
2520
+ msgid "<a href=\"%1$s\" title=\"Manage Uploads\" class=\"musublink\">%2$sMB</a>"
2521
+ msgstr "<a href=\"%1$s\" title=\"Hantera uppladdningar\" class=\"musublink\">%2$sMB</a>"
2522
+
2523
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:365
2524
+ msgid "Space Allowed"
2525
+ msgstr "Tillåtet utrymme"
2526
+
2527
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:372
2528
+ #, php-format
2529
+ msgid "<a href=\"%1$s\" title=\"Manage Uploads\" class=\"musublink\">%2$sMB (%3$s%%)</a>"
2530
+ msgstr "<a href=\"%1$s\" title=\"Hantera uppladdningar\" class=\"musublink\">%2$sMB (%3$s%%)</a>"
2531
+
2532
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:373
2533
+ msgid "Space Used"
2534
+ msgstr "Använt utrymme"
2535
+
2536
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:399
2537
+ msgid "No GD support"
2538
+ msgstr "Inget stöd för GD"
2539
+
2540
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:431
2541
+ msgid "Not set"
2542
+ msgstr "Inte inställt"
2543
+
2544
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:433
2545
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:436
2546
+ msgid "On"
2547
+ msgstr "På"
2548
+
2549
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:434
2550
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:437
2551
+ msgid "Off"
2552
+ msgstr "Av"
2553
+
2554
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:441
2555
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:444
2556
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:447
2557
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:450
2558
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:453
2559
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:456
2560
+ msgid "N/A"
2561
+ msgstr "N/A"
2562
+
2563
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:455
2564
+ msgid " MByte"
2565
+ msgstr "MByte"
2566
+
2567
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:468
2568
+ msgid "Operating System"
2569
+ msgstr "Operativsystem"
2570
+
2571
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:469
2572
+ msgid "Server"
2573
+ msgstr "Server"
2574
+
2575
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:470
2576
+ msgid "Memory usage"
2577
+ msgstr "Minnesanvändning"
2578
+
2579
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:471
2580
+ msgid "MYSQL Version"
2581
+ msgstr "MYSQL Version"
2582
+
2583
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:472
2584
+ msgid "SQL Mode"
2585
+ msgstr "SQL Mode"
2586
+
2587
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:473
2588
+ msgid "PHP Version"
2589
+ msgstr "PHP Version"
2590
+
2591
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:474
2592
+ msgid "PHP Safe Mode"
2593
+ msgstr "PHP Safe Mode"
2594
+
2595
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:475
2596
+ msgid "PHP Allow URL fopen"
2597
+ msgstr "PHP Allow URL fopen"
2598
+
2599
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:476
2600
+ msgid "PHP Memory Limit"
2601
+ msgstr "PHP Memory Limit"
2602
+
2603
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:477
2604
+ msgid "PHP Max Upload Size"
2605
+ msgstr "PHP Max Upload Size"
2606
+
2607
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:478
2608
+ msgid "PHP Max Post Size"
2609
+ msgstr "PHP Max Post Size"
2610
+
2611
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:479
2612
+ msgid "PCRE Backtracking Limit"
2613
+ msgstr "PCRE Backtracking Limit"
2614
+
2615
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:480
2616
+ msgid "PHP Max Script Execute Time"
2617
+ msgstr "PHP Max Script Execute Time"
2618
+
2619
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:481
2620
+ msgid "PHP Exif support"
2621
+ msgstr "PHP Exif support"
2622
+
2623
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:482
2624
+ msgid "PHP IPTC support"
2625
+ msgstr "PHP IPTC support"
2626
+
2627
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:483
2628
+ msgid "PHP XML support"
2629
+ msgstr "PHP XML support"
2630
+
2631
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:495
2632
+ msgid "NextGEN Gallery contains some functions which are only available under PHP 5.2. You are using the old PHP 4 version, upgrade now! It's no longer supported by the PHP group. Many shared hosting providers offer both PHP 4 and PHP 5, running simultaneously. Ask your provider if they can do this."
2633
+ msgstr "NextGEN Gallery innehåller vissa funktioner som bara finns under PHP 5.2. Du använder den gamla versionen av PHP 4, uppgradera nu! Den stöds inte längre av PHP-gruppen. Många webbhotell erbjuder att både PHP 4 och PHP 5 körs samtidigt. Fråga din leverantör om de kan göra detta."
2634
+
2635
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/publish.php:35
2636
+ msgid "Post title"
2637
+ msgstr "Rubrik för inlägg"
2638
+
2639
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/publish.php:37
2640
+ msgid "Enter the post title "
2641
+ msgstr "Ange rubrik för inlägg"
2642
+
2643
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/publish.php:42
2644
+ msgid "Size of the image"
2645
+ msgstr "Storleken på bilden"
2646
+
2647
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/publish.php:60
2648
+ msgid "Draft"
2649
+ msgstr "Utkast"
2650
+
2651
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/roles.php:26
2652
+ msgid "Select the lowest role which should be able to access the following capabilities. NextGEN Gallery supports the standard roles from WordPress."
2653
+ msgstr "Välj den lägsta roll som ska ha åtkomst till följande funktioner. NextGEN Gallery stödjer standardroller från WordPress."
2654
+
2655
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/roles.php:27
2656
+ msgid "For a more flexible user management you can use the"
2657
+ msgstr "För att hantera användare mer flexibelt, kan du använda"
2658
+
2659
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/roles.php:31
2660
+ msgid "Main NextGEN Gallery overview"
2661
+ msgstr "NextGEN Gallery - Översikt"
2662
+
2663
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/roles.php:35
2664
+ msgid "Use TinyMCE Button / Upload tab"
2665
+ msgstr "TinyMCE-knapp / Uppladdningsflik"
2666
+
2667
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/roles.php:39
2668
+ msgid "Add gallery / Upload images"
2669
+ msgstr "Lägg till galleri / Ladda upp bilder"
2670
+
2671
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/roles.php:43
2672
+ msgid "Manage gallery"
2673
+ msgstr "Hantera galleri"
2674
+
2675
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/roles.php:47
2676
+ msgid "Manage others gallery"
2677
+ msgstr "Hantera andras galleri"
2678
+
2679
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/roles.php:51
2680
+ msgid "Manage tags"
2681
+ msgstr "Hantera etiketter"
2682
+
2683
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/roles.php:59
2684
+ msgid "Change style"
2685
+ msgstr "Ändra stil"
2686
+
2687
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/roles.php:63
2688
+ msgid "Change options"
2689
+ msgstr "Ändra alternativ"
2690
+
2691
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/roles.php:67
2692
+ msgid "NextGEN Attach Interface"
2693
+ msgstr "NextGEN Attach Interface"
2694
+
2695
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/rotate.php:68
2696
+ msgid "Image rotated"
2697
+ msgstr "Bild roterad"
2698
+
2699
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/rotate.php:70
2700
+ msgid "Error rotating thumbnail"
2701
+ msgstr "Fel uppstod vid rotation av miniatyr"
2702
+
2703
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/rotate.php:93
2704
+ msgid "90&deg; clockwise"
2705
+ msgstr "90° medurs"
2706
+
2707
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/rotate.php:94
2708
+ msgid "90&deg; counter-clockwise"
2709
+ msgstr "90° moturs"
2710
+
2711
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/rotate.php:95
2712
+ msgid "Flip vertically"
2713
+ msgstr "Vänd vertikalt"
2714
+
2715
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/rotate.php:96
2716
+ msgid "Flip horizontally"
2717
+ msgstr "Vänd horisontellt"
2718
+
2719
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/showmeta.php:29
2720
+ msgid "Meta Data"
2721
+ msgstr "Metadata"
2722
+
2723
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/showmeta.php:34
2724
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/showmeta.php:60
2725
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/showmeta.php:85
2726
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/showmeta.php:109
2727
+ msgid "Tag"
2728
+ msgstr "Etikett"
2729
+
2730
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/showmeta.php:35
2731
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/showmeta.php:61
2732
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/showmeta.php:86
2733
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/showmeta.php:110
2734
+ msgid "Value"
2735
+ msgstr "Värde"
2736
+
2737
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/showmeta.php:49
2738
+ msgid "No meta data saved"
2739
+ msgstr "Inga metadata sparade"
2740
+
2741
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/showmeta.php:55
2742
+ msgid "EXIF Data"
2743
+ msgstr "EXIF Data"
2744
+
2745
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/showmeta.php:74
2746
+ msgid "No exif data"
2747
+ msgstr "No exif data"
2748
+
2749
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/showmeta.php:81
2750
+ msgid "IPTC Data"
2751
+ msgstr "IPTC Data"
2752
+
2753
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/showmeta.php:105
2754
+ msgid "XMP Data"
2755
+ msgstr "XMP Data"
2756
+
2757
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:41
2758
+ msgid "Most popular"
2759
+ msgstr "Mest populära"
2760
+
2761
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:42
2762
+ msgid "Least used"
2763
+ msgstr "Minst använda"
2764
+
2765
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:43
2766
+ msgid "Alphabetical"
2767
+ msgstr "Alfabetisk ordning"
2768
+
2769
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:99
2770
+ msgid "Manage image tags"
2771
+ msgstr "Hantera bild-etiketter"
2772
+
2773
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:111
2774
+ msgid "Existing Tags"
2775
+ msgstr "Befintliga etiketter"
2776
+
2777
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:115
2778
+ msgid "Search tags"
2779
+ msgstr "Sök etiketter"
2780
+
2781
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:119
2782
+ msgid "Go"
2783
+ msgstr "Sök"
2784
+
2785
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:124
2786
+ msgid "Sort Order:"
2787
+ msgstr "Sorteringsordning:"
2788
+
2789
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:159
2790
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:163
2791
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:176
2792
+ msgid "Previous tags"
2793
+ msgstr "Föregående etiketter"
2794
+
2795
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:172
2796
+ msgid "Next tags"
2797
+ msgstr "Nästa etiketter"
2798
+
2799
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:184
2800
+ msgid "Rename Tag"
2801
+ msgstr "Byt namn på etikett"
2802
+
2803
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:192
2804
+ msgid "Enter the tag to rename and its new value. You can use this feature to merge tags too. Click \"Rename\" and all posts which use this tag will be updated."
2805
+ msgstr "Ange etikett och namnet den ska bytas till. Du kan använda denna funktion för att slå ihop etiketter också. Klicka på \"Byt namn\" och alla inlägg som använder den etiketten kommer att uppdateras."
2806
+
2807
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:193
2808
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:241
2809
+ msgid "You can specify multiple tags to rename by separating them with commas."
2810
+ msgstr "Du kan ange flera etiketter som ska byta namn genom att separera dem med kommatecken."
2811
+
2812
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:197
2813
+ msgid "Tag(s) to rename:"
2814
+ msgstr "Etikett att byta namn på:"
2815
+
2816
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:201
2817
+ msgid "New tag name(s):"
2818
+ msgstr "Nytt etikettnamn:"
2819
+
2820
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:204
2821
+ msgid "Rename"
2822
+ msgstr "Byt namn"
2823
+
2824
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:210
2825
+ msgid "Delete Tag"
2826
+ msgstr "Ta bort etikett"
2827
+
2828
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:218
2829
+ msgid "Enter the name of the tag to delete. This tag will be removed from all posts."
2830
+ msgstr "Ange namnet på etikett som ska tas bort. Etiketten kommer att tas bort från alla inlägg."
2831
+
2832
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:219
2833
+ msgid "You can specify multiple tags to delete by separating them with commas"
2834
+ msgstr "Du kan ange flera etiketter som ska tas bort genom att separera dem med kommatecken"
2835
+
2836
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:223
2837
+ msgid "Tag(s) to delete:"
2838
+ msgstr "Etikett att ta bort:"
2839
+
2840
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:232
2841
+ msgid "Edit Tag Slug"
2842
+ msgstr "Redigera etiketts permalänk-smula"
2843
+
2844
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:240
2845
+ msgid "Enter the tag name to edit and its new slug. This will be used in tagcloud links. <a href=\"http://codex.wordpress.org/Glossary#Slug\" target=\"_blank\">Slug definition</a>"
2846
+ msgstr "Ange etikett och dess nya permalänk-smula. Smulan kommer att användas i etikettmoln-länkar. <a href=\"http://codex.wordpress.org/Glossary#Slug\" target=\"_blank\">Smul-definition (en. Slug)</a>"
2847
+
2848
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:245
2849
+ msgid "Tag(s) to match:"
2850
+ msgstr "Etikett:"
2851
+
2852
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:249
2853
+ msgid "Slug(s) to set:"
2854
+ msgstr "Permalänk-smula:"
2855
+
2856
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/templates/manage_gallery/gallery_create_page_field.php:3
2857
+ msgid "Main Page (no parent)"
2858
+ msgstr "Huvudsida (ingen förälder)"
2859
+
2860
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/templates/manage_gallery/gallery_create_page_field.php:10
2861
+ msgid "Add page"
2862
+ msgstr "Lägg till sida"
2863
+
2864
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/templates/manage_gallery/gallery_link_to_page_field.php:3
2865
+ msgid "Not linked"
2866
+ msgstr "Inte länkad"
2867
+
2868
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/templates/manage_gallery/gallery_preview_image_field.php:3
2869
+ msgid "No picture"
2870
+ msgstr "Ingen bild"
2871
+
2872
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/thumbnails-template.php:103
2873
+ msgid "These are maximum values"
2874
+ msgstr "Dessa är maximivärden"
2875
+
2876
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/wpmu.php:33
2877
+ msgid "Updated successfully"
2878
+ msgstr "Uppdatering klar"
2879
+
2880
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/wpmu.php:48
2881
+ msgid "Network Options"
2882
+ msgstr "Nätverksalternativ"
2883
+
2884
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/wpmu.php:54
2885
+ msgid "Gallery path"
2886
+ msgstr "Galleri-sökväg"
2887
+
2888
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/wpmu.php:56
2889
+ msgid "This is the default path for all blogs. With the placeholder %BLOG_ID% you can organize the folder structure better."
2890
+ msgstr "Detta är förvald sökväg för alla bloggar. Med referensen %BLOG_ID% kan du ordna mappstrukturen bättre."
2891
+
2892
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/wpmu.php:57
2893
+ #, php-format
2894
+ msgid "The default setting should be %s"
2895
+ msgstr "Den förvalda inställningen ska vara %s"
2896
+
2897
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/wpmu.php:61
2898
+ msgid "Enable upload quota check"
2899
+ msgstr "Aktivera kontroll av uppladdningskvot"
2900
+
2901
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/wpmu.php:63
2902
+ msgid "Should work if the gallery is bellow the blog.dir"
2903
+ msgstr "Skulle fungera om galleriet är under blog.dir"
2904
+
2905
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/wpmu.php:67
2906
+ msgid "Enable zip upload option"
2907
+ msgstr "Aktivera alternativet zip-uppladdning"
2908
+
2909
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/wpmu.php:69
2910
+ msgid "Allow users to upload zip folders."
2911
+ msgstr "Låt användare ladda upp zip-mappar."
2912
+
2913
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/wpmu.php:73
2914
+ msgid "Enable import function"
2915
+ msgstr "Aktivera import-funktion"
2916
+
2917
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/wpmu.php:75
2918
+ msgid "Allow users to import images folders from the server."
2919
+ msgstr "Låt användare importera bilders mappar från servern."
2920
+
2921
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/wpmu.php:79
2922
+ msgid "Enable style selection"
2923
+ msgstr "Aktivera stilval"
2924
+
2925
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/wpmu.php:81
2926
+ msgid "Allow users to choose a style for the gallery."
2927
+ msgstr "Låt användare välja en stil för galleriet."
2928
+
2929
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/wpmu.php:85
2930
+ msgid "Enable roles/capabilities"
2931
+ msgstr "Aktivera roller/befogenheter"
2932
+
2933
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/wpmu.php:87
2934
+ msgid "Allow users to change the roles for other blog authors."
2935
+ msgstr "Tillåt användare att ändra roller för andra blogg författare."
2936
+
2937
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/wpmu.php:91
2938
+ msgid "Default style"
2939
+ msgstr "Förvald stil"
2940
+
2941
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/wpmu.php:108
2942
+ msgid "Choose the default style for the galleries."
2943
+ msgstr "Välj förvald stil för gallerier."
2944
+
2945
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/core.php:214
2946
+ #, php-format
2947
+ msgid "Note : Based on your server memory limit you should not upload larger images then <strong>%d x %d</strong> pixel"
2948
+ msgstr "Observera: Baserat på din servers minnesgräns bör du inte ladda upp bilder större än <strong>%d x %d</strong> pxl"
2949
+
2950
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/ngg-db.php:208
2951
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/ngg-db.php:209
2952
+ msgid "Album overview"
2953
+ msgstr "Album - översikt"
2954
+
2955
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/post-thumbnail.php:68
2956
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/post-thumbnail.php:69
2957
+ msgid "Set NextGEN featured image"
2958
+ msgstr "Ställ in NextGEN - utvald bild"
2959
+
2960
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/post-thumbnail.php:326
2961
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/post-thumbnail.php:327
2962
+ msgid "Set featured image"
2963
+ msgstr "Ställ in utvald bild"
2964
+
2965
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/post-thumbnail.php:354
2966
+ msgid "Remove featured image"
2967
+ msgstr "Ta bort utvald bild"
2968
+
2969
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/rewrite.php:215
2970
+ #: products/photocrati_nextgen/modules/widget/class.widget_slideshow.php:81
2971
+ msgid "Slideshow"
2972
+ msgstr "Bildspel"
2973
+
2974
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/tags.php:35
2975
+ msgid "No new tag specified!"
2976
+ msgstr "Ingen ny etikett angiven!"
2977
+
2978
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/tags.php:50
2979
+ msgid "No new/old valid tag specified!"
2980
+ msgstr "Ingen giltig ny/gammal etikett angiven!"
2981
+
2982
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/tags.php:86
2983
+ msgid "No tag renamed."
2984
+ msgstr "Ingen etikett omdöpt."
2985
+
2986
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/tags.php:88
2987
+ #, php-format
2988
+ msgid "Renamed tag(s) &laquo;%1$s&raquo; to &laquo;%2$s&raquo;"
2989
+ msgstr "Bytte namn på etiketter «%1$s» till «%2$s»"
2990
+
2991
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/tags.php:95
2992
+ msgid "No valid new tag."
2993
+ msgstr "Ingen giltig ny etikett."
2994
+
2995
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/tags.php:112
2996
+ msgid "No objects (post/page) found for specified old tags."
2997
+ msgstr "Inga objekt (inlägg/sidor) hittades med angivna gamla etiketter."
2998
+
2999
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/tags.php:141
3000
+ msgid "No tag merged."
3001
+ msgstr "Ingen etikett sammanfogad."
3002
+
3003
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/tags.php:143
3004
+ #, php-format
3005
+ msgid "Merge tag(s) &laquo;%1$s&raquo; to &laquo;%2$s&raquo;. %3$s objects edited."
3006
+ msgstr "Sammanfoga etiketter «%1$s» till «%2$s». %3$s objekt ändrade."
3007
+
3008
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/tags.php:146
3009
+ msgid "Error. Not enough tags provided to rename or merge."
3010
+ msgstr "Fel. Inte tillräckligt många etiketter att byta namn på eller slå samman."
3011
+
3012
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/tags.php:165
3013
+ msgid "No tag specified!"
3014
+ msgstr "Ingen etikett angiven!"
3015
+
3016
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/tags.php:188
3017
+ msgid "No tag deleted."
3018
+ msgstr "Ingen etikett borttagen."
3019
+
3020
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/tags.php:190
3021
+ #, php-format
3022
+ msgid "%1s tag(s) deleted."
3023
+ msgstr "%1s etiketter borttagna."
3024
+
3025
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/tags.php:208
3026
+ msgid "No new slug(s) specified!"
3027
+ msgstr "Inga nya permalänkar angivna!"
3028
+
3029
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/tags.php:220
3030
+ msgid "Tags number and slugs number isn't the same!"
3031
+ msgstr "Antal etiketter och permalänkar överensstämmer inte!"
3032
+
3033
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/tags.php:247
3034
+ msgid "No slug edited."
3035
+ msgstr "Ingen permalänk-smula ändrad."
3036
+
3037
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/tags.php:249
3038
+ #, php-format
3039
+ msgid "%s slug(s) edited."
3040
+ msgstr "%s permalänkar ändrade."
3041
+
3042
+ #: products/photocrati_nextgen/modules/ngglegacy/nggallery.php:60
3043
+ msgid "<strong>Translation by : </strong><a target=\"_blank\" href=\"https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery//languages/\">See here</a>"
3044
+ msgstr "<strong>Översättning av:</strong> <a target=\"_blank\" href=\"https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery//languages/\">Se här</a>"
3045
+
3046
+ #: products/photocrati_nextgen/modules/ngglegacy/nggallery.php:122
3047
+ msgid "Sorry, NextGEN Gallery works only with a Memory Limit of 16 MB or higher"
3048
+ msgstr "Tyvärr, NextGEN Gallery fungerar endast med en minnesgräns på 16 MB eller högre"
3049
+
3050
+ #: products/photocrati_nextgen/modules/ngglegacy/nggallery.php:148
3051
+ msgid "Picture tag"
3052
+ msgstr "Bildetikett"
3053
+
3054
+ #: products/photocrati_nextgen/modules/ngglegacy/nggallery.php:149
3055
+ msgid "Picture tag: %2$l."
3056
+ msgstr "Bildetikett: %2$l."
3057
+
3058
+ #: products/photocrati_nextgen/modules/ngglegacy/nggallery.php:150
3059
+ msgid "Separate picture tags with commas."
3060
+ msgstr "Separera bildetiketter med kommatecken."
3061
+
3062
+ #: products/photocrati_nextgen/modules/ngglegacy/nggallery.php:279
3063
+ msgid "Get help"
3064
+ msgstr "Få hjälp"
3065
+
3066
+ #: products/photocrati_nextgen/modules/ngglegacy/nggallery.php:280
3067
+ msgid "Contribute"
3068
+ msgstr "Bidra"
3069
+
3070
+ #: products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser-exif.php:38
3071
+ msgid "Meta data"
3072
+ msgstr "Metadata"
3073
+
3074
+ #: products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser-exif.php:42
3075
+ msgid "Camera / Type"
3076
+ msgstr "Kamera / typ"
3077
+
3078
+ #: products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser-exif.php:50
3079
+ msgid "Focal Length"
3080
+ msgstr "Brännvidd"
3081
+
3082
+ #: products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser-exif.php:58
3083
+ msgid "Date / Time"
3084
+ msgstr "Datum / tid"
3085
+
3086
+ #: products/photocrati_nextgen/modules/ngglegacy/xml/media-rss.php:50
3087
+ msgid "No galleries have been yet created."
3088
+ msgstr "Inga gallerier har skapats ännu."
3089
+
3090
+ #: products/photocrati_nextgen/modules/ngglegacy/xml/media-rss.php:69
3091
+ #, php-format
3092
+ msgid "The gallery ID=%s does not exist."
3093
+ msgstr "Galleri-id = %s finns inte."
3094
+
3095
+ #: products/photocrati_nextgen/modules/ngglegacy/xml/media-rss.php:100
3096
+ msgid "No album ID has been provided as parameter"
3097
+ msgstr "Inget album-id har angetts som parameter"
3098
+
3099
+ #: products/photocrati_nextgen/modules/ngglegacy/xml/media-rss.php:108
3100
+ #, php-format
3101
+ msgid "The album ID=%s does not exist."
3102
+ msgstr "Album-id = %s finns inte."
3103
+
3104
+ #: products/photocrati_nextgen/modules/ngglegacy/xml/media-rss.php:115
3105
+ msgid "Invalid MediaRSS command"
3106
+ msgstr "Ogiltigt MediaRSS-kommando"
3107
+
3108
+ #: products/photocrati_nextgen/modules/widget/class.widget_gallery.php:7
3109
+ msgid "Add recent or random images from the galleries"
3110
+ msgstr "Lägg till senaste eller slumpblandade bilder från gallerierna"
3111
+
3112
+ #: products/photocrati_nextgen/modules/widget/class.widget_gallery.php:8
3113
+ msgid "NextGEN Widget"
3114
+ msgstr "NextGEN Widget"
3115
+
3116
+ #: products/photocrati_nextgen/modules/widget/class.widget_mediarss.php:9
3117
+ msgid "Widget that displays Media RSS links for NextGEN Gallery."
3118
+ msgstr "Widget som visar Media RSS-länkar för NextGEN Gallery."
3119
+
3120
+ #: products/photocrati_nextgen/modules/widget/class.widget_mediarss.php:10
3121
+ msgid "NextGEN Media RSS"
3122
+ msgstr "NextGEN Media RSS"
3123
+
3124
+ #: products/photocrati_nextgen/modules/widget/class.widget_mediarss.php:22
3125
+ msgid "Media RSS"
3126
+ msgstr "Media RSS"
3127
+
3128
+ #: products/photocrati_nextgen/modules/widget/class.widget_mediarss.php:23
3129
+ msgid "Link to the main image feed"
3130
+ msgstr "Länk till huvudflöde för bilder"
3131
+
3132
+ #: products/photocrati_nextgen/modules/widget/class.widget_slideshow.php:7
3133
+ msgid "Show a NextGEN Gallery Slideshow"
3134
+ msgstr "Visa ett NextGEN Gallery-bildspel"
3135
+
3136
+ #: products/photocrati_nextgen/modules/widget/class.widget_slideshow.php:8
3137
+ msgid "NextGEN Slideshow"
3138
+ msgstr "NextGEN-bildspel"
3139
+
3140
+ #: products/photocrati_nextgen/modules/widget/templates/form_gallery.php:26
3141
+ msgid "Thumbnails"
3142
+ msgstr "Miniatyrer"
3143
+
3144
+ #: products/photocrati_nextgen/modules/widget/templates/form_gallery.php:29
3145
+ msgid "Original images"
3146
+ msgstr "Ursprungliga bilder"
3147
+
3148
+ #: products/photocrati_nextgen/modules/widget/templates/form_gallery.php:42
3149
+ msgid "random"
3150
+ msgstr "slumpblandning"
3151
+
3152
+ #: products/photocrati_nextgen/modules/widget/templates/form_gallery.php:50
3153
+ msgid "recently added"
3154
+ msgstr "nyligen tillagda"
3155
+
3156
+ #: products/photocrati_nextgen/modules/widget/templates/form_gallery.php:62
3157
+ msgid "Enable IE8 Web Slices"
3158
+ msgstr "Aktivera IE8 WebSlices"
3159
+
3160
+ #: products/photocrati_nextgen/modules/widget/templates/form_gallery.php:68
3161
+ msgid "Width x Height"
3162
+ msgstr "Bredd x höjd"
3163
+
3164
+ #: products/photocrati_nextgen/modules/widget/templates/form_gallery.php:87
3165
+ msgid "Select"
3166
+ msgstr "Välj"
3167
+
3168
+ #: products/photocrati_nextgen/modules/widget/templates/form_gallery.php:92
3169
+ msgid "All galleries"
3170
+ msgstr "Alla gallerier"
3171
+
3172
+ #: products/photocrati_nextgen/modules/widget/templates/form_gallery.php:95
3173
+ msgid "Only which are not listed"
3174
+ msgstr "Endast de som inte listats"
3175
+
3176
+ #: products/photocrati_nextgen/modules/widget/templates/form_gallery.php:98
3177
+ msgid "Only which are listed"
3178
+ msgstr "Endast de som listats"
3179
+
3180
+ #: products/photocrati_nextgen/modules/widget/templates/form_gallery.php:107
3181
+ msgid "Gallery ID"
3182
+ msgstr "Galleri-id"
3183
+
3184
+ #: products/photocrati_nextgen/modules/widget/templates/form_gallery.php:114
3185
+ msgid "Gallery IDs, separated by commas."
3186
+ msgstr "Galleri-id:er, separerade med kommatecken."
3187
+
3188
+ #: products/photocrati_nextgen/modules/widget/templates/form_mediarss.php:19
3189
+ msgid "Show Media RSS icon"
3190
+ msgstr "Visa Media RSS-ikon"
3191
+
3192
+ #: products/photocrati_nextgen/modules/widget/templates/form_mediarss.php:30
3193
+ msgid "Show the Media RSS link"
3194
+ msgstr "Visa Media RSS-länken"
3195
+
3196
+ #: products/photocrati_nextgen/modules/widget/templates/form_mediarss.php:36
3197
+ msgid "Text for Media RSS link"
3198
+ msgstr "Text för Media RSS-länken"
3199
+
3200
+ #: products/photocrati_nextgen/modules/widget/templates/form_mediarss.php:47
3201
+ msgid "Tooltip text for Media RSS link"
3202
+ msgstr "Tooltip-text för Media RSS-länken"
3203
+
3204
+ #: products/photocrati_nextgen/modules/widget/templates/form_slideshow.php:15
3205
+ msgid "Select Gallery"
3206
+ msgstr "Välj galleri"
3207
+
3208
+ #: products/photocrati_nextgen/modules/widget/templates/form_slideshow.php:23
3209
+ msgid "All images"
3210
+ msgstr "Alla bilder"
3211
+
3212
+ #: products/photocrati_nextgen/modules/widget/templates/form_slideshow.php:40
3213
+ msgid "Limit"
3214
+ msgstr "Gränsvärde"
3215
+
3216
+ #. Plugin Name of the plugin/theme
3217
+ msgid "NextGEN Gallery"
3218
+ msgstr "NextGEN Gallery"
3219
+
3220
+ #. Plugin URI of the plugin/theme
3221
+ msgid "https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/"
3222
+ msgstr "https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/"
3223
+
3224
+ #. Description of the plugin/theme
3225
+ msgid "The most popular gallery plugin for WordPress and one of the most popular plugins of all time with over 30 million downloads."
3226
+ msgstr "Det mest populära galleri-tillägget för WordPress och ett av de mest populära tillägg genom tiderna med över 30 miljoner nedladdningar."
3227
+
3228
+ #. Author of the plugin/theme
3229
+ msgid "Imagely"
3230
+ msgstr "Imagely"
3231
+
3232
+ #. Author URI of the plugin/theme
3233
+ msgid "https://www.imagely.com"
3234
+ msgstr "https://www.imagely.com"
nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery-uk.mo ADDED
Binary file
nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery-zh_CN.mo ADDED
Binary file
nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery.pot ADDED
@@ -0,0 +1,3854 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (C) 2020 Imagely
2
+ # NextGEN Gallery base (English) .po source
3
+ # This file is distributed under the same license as the NextGEN Gallery plugin.
4
+ msgid ""
5
+ msgstr ""
6
+ "Project-Id-Version: NextGEN Gallery\n"
7
+ "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/nextgen-gallery\n"
8
+ "Last-Translator: Imagely\n"
9
+ "Language-Team: Imagely\n"
10
+ "MIME-Version: 1.0\n"
11
+ "Content-Type: text/plain; charset=UTF-8\n"
12
+ "Content-Transfer-Encoding: 8bit\n"
13
+ "POT-Creation-Date: 2014-02-20 19:45-0800\n"
14
+ "PO-Revision-Date: 2020-11-10 13:01+08\n"
15
+ "X-Generator: WP-CLI 2.4.0\n"
16
+ "X-Domain: nggallery\n"
17
+
18
+ #. Plugin Name of the plugin
19
+ #: products/photocrati_nextgen/modules/attach_to_post/class.attach_controller.php:540
20
+ #: products/photocrati_nextgen/modules/attach_to_post/module.attach_to_post.php:379
21
+ #: products/photocrati_nextgen/modules/nextgen_block/module.nextgen_block.php:63
22
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:73
23
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:74
24
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/media-upload.php:11
25
+ msgid "NextGEN Gallery"
26
+ msgid_plural "NextGen Galleries"
27
+ msgstr[0] ""
28
+ msgstr[1] ""
29
+
30
+ #. Plugin URI of the plugin
31
+ msgid "https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/"
32
+ msgstr ""
33
+
34
+ #. Description of the plugin
35
+ msgid "The most popular gallery plugin for WordPress and one of the most popular plugins of all time with over 30 million downloads."
36
+ msgstr ""
37
+
38
+ #. Author of the plugin
39
+ msgid "Imagely"
40
+ msgstr ""
41
+
42
+ #. Author URI of the plugin
43
+ msgid "https://www.imagely.com"
44
+ msgstr ""
45
+
46
+ #: nggallery.php:156
47
+ msgid "We’ve detected you are running PHP versions 7.0.26 or 7.1.12. These versions of PHP have a bug that breaks NextGEN Gallery and causes server crashes in certain conditions. To protect your site, NextGEN Gallery will not load. We recommend asking your host to roll back to an earlier version of PHP. For details on the PHP bug, see: <a target=\"_blank\" href=\"https://bugs.php.net/bug.php?id=75573\">bugs.php.net/bug.php?id=75573</a>"
48
+ msgstr ""
49
+
50
+ #: nggallery.php:366
51
+ msgid "NextGEN Gallery %s is incompatible with this version of NextGEN Pro. Please update NextGEN Pro to version %s or higher to restore NextGEN Pro functionality."
52
+ msgstr ""
53
+
54
+ #: nggallery.php:507
55
+ msgid "Every %d seconds"
56
+ msgstr ""
57
+
58
+ #: nggallery.php:637
59
+ msgid "Sorry, NextGEN Gallery works only with a role called administrator"
60
+ msgstr ""
61
+
62
+ #: products/photocrati_nextgen/modules/attach_to_post/adapter.attach_to_post_ajax.php:168
63
+ msgid "Album: %s"
64
+ msgstr ""
65
+
66
+ #: products/photocrati_nextgen/modules/attach_to_post/adapter.attach_to_post_ajax.php:170
67
+ msgid "Gallery: %s"
68
+ msgstr ""
69
+
70
+ #: products/photocrati_nextgen/modules/attach_to_post/adapter.attach_to_post_ajax.php:186
71
+ msgid "Missing parameters"
72
+ msgstr ""
73
+
74
+ #: products/photocrati_nextgen/modules/attach_to_post/adapter.attach_to_post_ajax.php:222
75
+ msgid "Displayed gallery does not exist"
76
+ msgstr ""
77
+
78
+ #: products/photocrati_nextgen/modules/attach_to_post/adapter.attach_to_post_ajax.php:225
79
+ msgid "Invalid request"
80
+ msgstr ""
81
+
82
+ #: products/photocrati_nextgen/modules/attach_to_post/class.attach_controller.php:365
83
+ msgid "Are you inserting a Gallery (default), an Album, or images based on Tags?"
84
+ msgstr ""
85
+
86
+ #: products/photocrati_nextgen/modules/attach_to_post/class.attach_controller.php:366
87
+ #: products/photocrati_nextgen/modules/nextgen_admin/class.form.php:245
88
+ msgid "(optional)"
89
+ msgstr ""
90
+
91
+ #: products/photocrati_nextgen/modules/attach_to_post/class.attach_controller.php:367
92
+ msgid "Sets an SEO-friendly name to this gallery for URLs. Currently only in use by the Pro Lightbox"
93
+ msgstr ""
94
+
95
+ #: products/photocrati_nextgen/modules/attach_to_post/class.attach_controller.php:368
96
+ msgid "Slug"
97
+ msgstr ""
98
+
99
+ #: products/photocrati_nextgen/modules/attach_to_post/class.attach_controller.php:369
100
+ msgid "No entities to display for this source"
101
+ msgstr ""
102
+
103
+ #: products/photocrati_nextgen/modules/attach_to_post/class.attach_controller.php:370
104
+ msgid "Exclude?"
105
+ msgstr ""
106
+
107
+ #: products/photocrati_nextgen/modules/attach_to_post/class.attach_controller.php:371
108
+ msgid "Select a Gallery"
109
+ msgstr ""
110
+
111
+ #: products/photocrati_nextgen/modules/attach_to_post/class.attach_controller.php:372
112
+ msgid "Select one or more galleries (click in box to see available galleries)."
113
+ msgstr ""
114
+
115
+ #: products/photocrati_nextgen/modules/attach_to_post/class.attach_controller.php:373
116
+ msgid "Select one album (click in box to see available albums)."
117
+ msgstr ""
118
+
119
+ #: products/photocrati_nextgen/modules/attach_to_post/class.attach_controller.php:558
120
+ msgid "Click to edit"
121
+ msgstr ""
122
+
123
+ #: products/photocrati_nextgen/modules/attach_to_post/class.attach_controller.php:584
124
+ msgid "NextGEN Gallery - Attach To Post"
125
+ msgstr ""
126
+
127
+ #: products/photocrati_nextgen/modules/attach_to_post/class.attach_controller.php:599
128
+ msgid "Insert Into Page"
129
+ msgstr ""
130
+
131
+ #: products/photocrati_nextgen/modules/attach_to_post/class.attach_controller.php:606
132
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.upload_images_form.php:13
133
+ msgid "Upload Images"
134
+ msgstr ""
135
+
136
+ #: products/photocrati_nextgen/modules/attach_to_post/class.attach_controller.php:613
137
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:81
138
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:115
139
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:197
140
+ msgid "Manage Galleries"
141
+ msgid_plural "Manage Galleries"
142
+ msgstr[0] ""
143
+ msgstr[1] ""
144
+
145
+ #: products/photocrati_nextgen/modules/attach_to_post/class.attach_controller.php:620
146
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:82
147
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:117
148
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:474
149
+ msgid "Manage Albums"
150
+ msgid_plural "Albums"
151
+ msgstr[0] ""
152
+ msgstr[1] ""
153
+
154
+ #: products/photocrati_nextgen/modules/attach_to_post/mixin.attach_to_post_display_tab.php:59
155
+ msgid "Choose Display"
156
+ msgstr ""
157
+
158
+ #: products/photocrati_nextgen/modules/attach_to_post/mixin.attach_to_post_display_tab.php:94
159
+ msgid "Customize Display Settings"
160
+ msgstr ""
161
+
162
+ #: products/photocrati_nextgen/modules/attach_to_post/mixin.attach_to_post_display_tab.php:187
163
+ msgid "No display type selected"
164
+ msgstr ""
165
+
166
+ #: products/photocrati_nextgen/modules/attach_to_post/mixin.attach_to_post_display_tab.php:204
167
+ msgid "Sort or Exclude Images"
168
+ msgstr ""
169
+
170
+ #: products/photocrati_nextgen/modules/attach_to_post/module.attach_to_post.php:266
171
+ msgid "Add Gallery"
172
+ msgstr ""
173
+
174
+ #: products/photocrati_nextgen/modules/attach_to_post/module.attach_to_post.php:380
175
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:248
176
+ msgid "Edit"
177
+ msgstr ""
178
+
179
+ #: products/photocrati_nextgen/modules/attach_to_post/module.attach_to_post.php:381
180
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/album.php:512
181
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:263
182
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:357
183
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:358
184
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/tags.php:223
185
+ msgid "Delete"
186
+ msgstr ""
187
+
188
+ #: products/photocrati_nextgen/modules/attach_to_post/module.attach_to_post.php:500
189
+ msgid "Attach NextGEN Gallery to Post"
190
+ msgstr ""
191
+
192
+ #: products/photocrati_nextgen/modules/attach_to_post/templates/display_tab.php:24
193
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:437
194
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:521
195
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-images.php:573
196
+ msgid "Save Changes"
197
+ msgstr ""
198
+
199
+ #: products/photocrati_nextgen/modules/attach_to_post/templates/display_tab.php:24
200
+ msgid "Insert Gallery"
201
+ msgstr ""
202
+
203
+ #: products/photocrati_nextgen/modules/attach_to_post/templates/display_tab.php:27
204
+ msgid "Need a quick tutorial?"
205
+ msgstr ""
206
+
207
+ #: products/photocrati_nextgen/modules/attach_to_post/templates/display_tab.php:29
208
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:78
209
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:222
210
+ msgid "Click to Close"
211
+ msgstr ""
212
+
213
+ #: products/photocrati_nextgen/modules/imagify/adapter.imagify_admin_page_controller.php:18
214
+ msgid "Image Optimization"
215
+ msgstr ""
216
+
217
+ #: products/photocrati_nextgen/modules/imagify/adapter.imagify_admin_page_controller.php:31
218
+ msgid "NextGEN Gallery partners with Imagify for best-in-class image optimization. Compress images to make galleries faster, all while maintaining image quality."
219
+ msgstr ""
220
+
221
+ #: products/photocrati_nextgen/modules/imagify/adapter.imagify_admin_page_controller.php:34
222
+ msgid "Note: Imagify is a third party plugin. It is not built or supported by NextGEN Gallery."
223
+ msgstr ""
224
+
225
+ #: products/photocrati_nextgen/modules/imagify/adapter.imagify_admin_page_controller.php:36
226
+ msgid "More on Imagify:"
227
+ msgstr ""
228
+
229
+ #: products/photocrati_nextgen/modules/imagify/adapter.imagify_admin_page_controller.php:37
230
+ msgid "More on why we recommend Imagify:"
231
+ msgstr ""
232
+
233
+ #: products/photocrati_nextgen/modules/imagify/adapter.imagify_admin_page_controller.php:38
234
+ msgid "Imagify Plugin Page"
235
+ msgstr ""
236
+
237
+ #: products/photocrati_nextgen/modules/imagify/adapter.imagify_admin_page_controller.php:39
238
+ msgid "Imagify Website"
239
+ msgstr ""
240
+
241
+ #: products/photocrati_nextgen/modules/imagify/adapter.imagify_admin_page_controller.php:40
242
+ msgid "Our Review of Image Compression Plugins"
243
+ msgstr ""
244
+
245
+ #: products/photocrati_nextgen/modules/imagify/adapter.imagify_admin_page_controller.php:45
246
+ msgid "Imagify has been successfully activated"
247
+ msgstr ""
248
+
249
+ #: products/photocrati_nextgen/modules/imagify/adapter.imagify_admin_page_controller.php:47
250
+ msgid "Imagify is already activated"
251
+ msgstr ""
252
+
253
+ #: products/photocrati_nextgen/modules/imagify/adapter.imagify_admin_page_controller.php:51
254
+ msgid "Activate Imagify"
255
+ msgstr ""
256
+
257
+ #: products/photocrati_nextgen/modules/imagify/adapter.imagify_admin_page_controller.php:53
258
+ msgid "Install and activate Imagify"
259
+ msgstr ""
260
+
261
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:33
262
+ #: products/photocrati_nextgen/modules/nextgen_basic_singlepic/adapter.nextgen_basic_singlepic_form.php:132
263
+ msgid "None"
264
+ msgstr ""
265
+
266
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:38
267
+ msgid "Simplelightbox"
268
+ msgstr ""
269
+
270
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:51
271
+ msgid "Fancybox"
272
+ msgstr ""
273
+
274
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:66
275
+ msgid "Shutter"
276
+ msgstr ""
277
+
278
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:77
279
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:221
280
+ msgid "L O A D I N G"
281
+ msgstr ""
282
+
283
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:85
284
+ msgid "Shutter Reloaded"
285
+ msgstr ""
286
+
287
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:96
288
+ msgid "Previous"
289
+ msgstr ""
290
+
291
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:97
292
+ #: products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/templates/nextgen_basic_imagebrowser.php:59
293
+ #: products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser-caption.php:29
294
+ #: products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser-exif.php:33
295
+ #: products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser.php:29
296
+ msgid "Next"
297
+ msgstr ""
298
+
299
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:98
300
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:125
301
+ msgid "Close"
302
+ msgstr ""
303
+
304
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:99
305
+ msgid "Full Size"
306
+ msgstr ""
307
+
308
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:100
309
+ msgid "Fit to Screen"
310
+ msgstr ""
311
+
312
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:101
313
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:123
314
+ #: products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/templates/default-view.php:64
315
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:664
316
+ msgid "Image"
317
+ msgid_plural "Images"
318
+ msgstr[0] ""
319
+ msgstr[1] ""
320
+
321
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:102
322
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:124
323
+ #: products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/templates/default-view.php:66
324
+ #: products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/templates/nextgen_basic_imagebrowser.php:67
325
+ #: products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser-caption.php:31
326
+ #: products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser-exif.php:35
327
+ #: products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser.php:31
328
+ msgid "of"
329
+ msgstr ""
330
+
331
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:103
332
+ msgid "Loading..."
333
+ msgstr ""
334
+
335
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:110
336
+ msgid "Thickbox"
337
+ msgstr ""
338
+
339
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:121
340
+ msgid "Next &gt;"
341
+ msgstr ""
342
+
343
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:122
344
+ msgid "&lt; Prev"
345
+ msgstr ""
346
+
347
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:126
348
+ msgid "This feature requires inline frames. You have iframes disabled or your browser does not support them."
349
+ msgstr ""
350
+
351
+ #: products/photocrati_nextgen/modules/lightbox/class.lightbox_library_manager.php:136
352
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.image_options_form.php:27
353
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/thumbnails-template.php:76
354
+ msgid "Custom"
355
+ msgstr ""
356
+
357
+ #: products/photocrati_nextgen/modules/marketing/adapter.display_settings_form.php:19
358
+ msgid "Pro Tiled"
359
+ msgstr ""
360
+
361
+ #: products/photocrati_nextgen/modules/marketing/adapter.display_settings_form.php:21
362
+ #: products/photocrati_nextgen/modules/marketing/adapter.igw_display_type_upsells.php:36
363
+ msgid "Pro Mosaic"
364
+ msgstr ""
365
+
366
+ #: products/photocrati_nextgen/modules/marketing/adapter.display_settings_form.php:23
367
+ #: products/photocrati_nextgen/modules/marketing/adapter.igw_display_type_upsells.php:42
368
+ msgid "Pro Masonry"
369
+ msgstr ""
370
+
371
+ #: products/photocrati_nextgen/modules/marketing/adapter.display_settings_form.php:44
372
+ #: products/photocrati_nextgen/modules/marketing/adapter.other_options_form.php:19
373
+ #: products/photocrati_nextgen/modules/marketing/module.marketing.php:219
374
+ msgid "<strong>Bonus:</strong> NextGEN Gallery users get a discount of 20% off regular price."
375
+ msgstr ""
376
+
377
+ #: products/photocrati_nextgen/modules/marketing/adapter.display_settings_form.php:48
378
+ msgid "Use the Pro Tiled Gallery in NextGEN Pro"
379
+ msgstr ""
380
+
381
+ #: products/photocrati_nextgen/modules/marketing/adapter.display_settings_form.php:49
382
+ #: products/photocrati_nextgen/modules/nextgen_pro_upgrade/adapter.nextgen_pro_upgrade_controller.php:95
383
+ msgid "With this stunning display type, you can present your images large with no trouble. Choose the maximum width of the gallery, or let it automate. It will adjust incredibly on all devices."
384
+ msgstr ""
385
+
386
+ #: products/photocrati_nextgen/modules/marketing/adapter.display_settings_form.php:53
387
+ msgid "View the Pro Tiled Demo"
388
+ msgstr ""
389
+
390
+ #: products/photocrati_nextgen/modules/marketing/adapter.display_settings_form.php:60
391
+ msgid "Use the Mosaic Gallery in NextGEN Pro"
392
+ msgstr ""
393
+
394
+ #: products/photocrati_nextgen/modules/marketing/adapter.display_settings_form.php:61
395
+ #: products/photocrati_nextgen/modules/nextgen_pro_upgrade/adapter.nextgen_pro_upgrade_controller.php:102
396
+ #: products/photocrati_nextgen/modules/nextgen_pro_upgrade/adapter.nextgen_pro_upgrade_controller.php:116
397
+ msgid "With this stunning display type, you can present your images in a flexible grid. Choose the maximum height for your rows, and their margins, or use the default settings. It will adjust incredibly on all devices."
398
+ msgstr ""
399
+
400
+ #: products/photocrati_nextgen/modules/marketing/adapter.display_settings_form.php:65
401
+ msgid "View the Mosaic Demo"
402
+ msgstr ""
403
+
404
+ #: products/photocrati_nextgen/modules/marketing/adapter.display_settings_form.php:72
405
+ msgid "Use the Masonry Gallery in NextGEN Pro"
406
+ msgstr ""
407
+
408
+ #: products/photocrati_nextgen/modules/marketing/adapter.display_settings_form.php:73
409
+ #: products/photocrati_nextgen/modules/nextgen_pro_upgrade/adapter.nextgen_pro_upgrade_controller.php:109
410
+ msgid "With this stunning display type, you can present your images in a flexible grid. Choose the maximum width for your images, and their padding, or use the default settings. It will adjust incredibly on all devices."
411
+ msgstr ""
412
+
413
+ #: products/photocrati_nextgen/modules/marketing/adapter.display_settings_form.php:77
414
+ msgid "View the Masonry Demo"
415
+ msgstr ""
416
+
417
+ #: products/photocrati_nextgen/modules/marketing/adapter.display_type_settings_form.php:22
418
+ msgid "Ecommerce and Print Lab functionality"
419
+ msgstr ""
420
+
421
+ #: products/photocrati_nextgen/modules/marketing/adapter.display_type_settings_form.php:31
422
+ msgid "proofing"
423
+ msgstr ""
424
+
425
+ #: products/photocrati_nextgen/modules/marketing/adapter.display_type_settings_form.php:47
426
+ #: products/photocrati_nextgen/modules/marketing/adapter.igw_display_type_upsells.php:95
427
+ msgid "Requires NextGEN Pro"
428
+ msgstr ""
429
+
430
+ #: products/photocrati_nextgen/modules/marketing/adapter.display_type_settings_form.php:48
431
+ msgid "Enable Proofing?"
432
+ msgstr ""
433
+
434
+ #: products/photocrati_nextgen/modules/marketing/adapter.display_type_settings_form.php:49
435
+ msgid "Enable Ecommerce?"
436
+ msgstr ""
437
+
438
+ #: products/photocrati_nextgen/modules/marketing/adapter.display_type_settings_form.php:50
439
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.watermarks_form.php:153
440
+ #: products/photocrati_nextgen/modules/nextgen_other_options/templates/styling_tab.php:10
441
+ msgid "Yes"
442
+ msgstr ""
443
+
444
+ #: products/photocrati_nextgen/modules/marketing/adapter.display_type_settings_form.php:51
445
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.watermarks_form.php:154
446
+ #: products/photocrati_nextgen/modules/nextgen_other_options/templates/styling_tab.php:13
447
+ msgid "No"
448
+ msgstr ""
449
+
450
+ #: products/photocrati_nextgen/modules/marketing/adapter.igw_display_type_upsells.php:30
451
+ msgid "Pro Tile"
452
+ msgstr ""
453
+
454
+ #: products/photocrati_nextgen/modules/marketing/adapter.igw_display_type_upsells.php:55
455
+ msgid "Pro Tiled Gallery"
456
+ msgstr ""
457
+
458
+ #: products/photocrati_nextgen/modules/marketing/adapter.igw_display_type_upsells.php:56
459
+ msgid "the Pro Tiled Gallery"
460
+ msgstr ""
461
+
462
+ #: products/photocrati_nextgen/modules/marketing/adapter.igw_display_type_upsells.php:64
463
+ msgid "Pro Masonry Gallery"
464
+ msgstr ""
465
+
466
+ #: products/photocrati_nextgen/modules/marketing/adapter.igw_display_type_upsells.php:65
467
+ msgid "the Pro Masonry Gallery"
468
+ msgstr ""
469
+
470
+ #: products/photocrati_nextgen/modules/marketing/adapter.igw_display_type_upsells.php:73
471
+ msgid "Pro Mosaic Gallery"
472
+ msgstr ""
473
+
474
+ #: products/photocrati_nextgen/modules/marketing/adapter.igw_display_type_upsells.php:74
475
+ msgid "the Pro Mosaic Gallery"
476
+ msgstr ""
477
+
478
+ #: products/photocrati_nextgen/modules/marketing/adapter.lightbox_options_mvc.php:12
479
+ msgid "Go big with the Pro Lightbox"
480
+ msgstr ""
481
+
482
+ #: products/photocrati_nextgen/modules/marketing/adapter.lightbox_options_mvc.php:13
483
+ #: products/photocrati_nextgen/modules/nextgen_pro_upgrade/adapter.nextgen_pro_upgrade_controller.php:144
484
+ msgid "The Pro Lightbox allows you to display images at full scale when opened. Your visitors will enjoy breathtaking views of your photos on any device. It's customizable, from colors to padding and more. Offer social sharing, deep linking, and individual image commenting. Turn your gallery lightbox view into a slideshow for your visitors. You can customize settings such as auto-playing and slideshow speed."
485
+ msgstr ""
486
+
487
+ #: products/photocrati_nextgen/modules/marketing/adapter.lightbox_options_mvc.php:14
488
+ msgid "<strong>Bonus:</strong> NextGEN Gallery users get a discount of 20% off regular price"
489
+ msgstr ""
490
+
491
+ #: products/photocrati_nextgen/modules/marketing/adapter.lightbox_options_mvc.php:17
492
+ msgid "View the Pro Lightbox Demo"
493
+ msgstr ""
494
+
495
+ #: products/photocrati_nextgen/modules/marketing/adapter.other_options_form.php:11
496
+ #: products/photocrati_nextgen/modules/marketing/module.marketing.php:206
497
+ #: products/photocrati_nextgen/modules/nextgen_pro_upgrade/adapter.nextgen_pro_upgrade_controller.php:164
498
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:244
499
+ msgid "Image Protection"
500
+ msgstr ""
501
+
502
+ #: products/photocrati_nextgen/modules/marketing/adapter.other_options_form.php:17
503
+ msgid "Protect your images"
504
+ msgstr ""
505
+
506
+ #: products/photocrati_nextgen/modules/marketing/adapter.other_options_form.php:18
507
+ #: products/photocrati_nextgen/modules/nextgen_pro_upgrade/adapter.nextgen_pro_upgrade_controller.php:165
508
+ msgid "Image protection disables the ability for visitors to right-click or drag to download your images in both the gallery display and Pro Lightbox views. It gives you complete freedom to display your work without worry. You can also choose to protect all images sitewide, even outside of NextGEN Gallery."
509
+ msgstr ""
510
+
511
+ #: products/photocrati_nextgen/modules/marketing/adapter.other_options_form.php:22
512
+ msgid "Learn more"
513
+ msgstr ""
514
+
515
+ #: products/photocrati_nextgen/modules/marketing/class.block_base.php:24
516
+ msgid "Upgrade Now"
517
+ msgstr ""
518
+
519
+ #: products/photocrati_nextgen/modules/marketing/class.block_large.php:36
520
+ #: products/photocrati_nextgen/modules/marketing/class.block_popup.php:31
521
+ #: products/photocrati_nextgen/modules/marketing/templates/igw_promo.php:8
522
+ msgid "Upgrade to NextGEN Pro"
523
+ msgstr ""
524
+
525
+ #: products/photocrati_nextgen/modules/marketing/module.marketing.php:40
526
+ msgid "NextGEN Basic users get a discount of 20% off regular price"
527
+ msgstr ""
528
+
529
+ #: products/photocrati_nextgen/modules/marketing/module.marketing.php:41
530
+ msgid "Bonus"
531
+ msgstr ""
532
+
533
+ #: products/photocrati_nextgen/modules/marketing/module.marketing.php:42
534
+ msgid "We're sorry, but %s is not available in the lite version of NextGEN Gallery. Please upgrade to NextGEN Pro to unlock these awesome features."
535
+ msgstr ""
536
+
537
+ #: products/photocrati_nextgen/modules/marketing/module.marketing.php:99
538
+ #: products/photocrati_nextgen/modules/marketing/templates/display_type_settings.php:12
539
+ msgid "Want to sell your images online?"
540
+ msgstr ""
541
+
542
+ #: products/photocrati_nextgen/modules/marketing/module.marketing.php:199
543
+ #: products/photocrati_nextgen/modules/nextgen_pro_upgrade/adapter.nextgen_pro_upgrade_controller.php:45
544
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:225
545
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:226
546
+ msgid "Ecommerce"
547
+ msgstr ""
548
+
549
+ #: products/photocrati_nextgen/modules/marketing/module.marketing.php:200
550
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:231
551
+ msgid "Automated Print Fulfillment"
552
+ msgstr ""
553
+
554
+ #: products/photocrati_nextgen/modules/marketing/module.marketing.php:201
555
+ msgid "Automated Tax Calculation"
556
+ msgstr ""
557
+
558
+ #: products/photocrati_nextgen/modules/marketing/module.marketing.php:202
559
+ msgid "Additional Gallery Displays"
560
+ msgstr ""
561
+
562
+ #: products/photocrati_nextgen/modules/marketing/module.marketing.php:203
563
+ msgid "Additional Album Displays"
564
+ msgstr ""
565
+
566
+ #: products/photocrati_nextgen/modules/marketing/module.marketing.php:205
567
+ msgid "Image Proofing"
568
+ msgstr ""
569
+
570
+ #: products/photocrati_nextgen/modules/marketing/module.marketing.php:207
571
+ #: products/photocrati_nextgen/modules/nextgen_pro_upgrade/adapter.nextgen_pro_upgrade_controller.php:143
572
+ msgid "Pro Lightbox"
573
+ msgstr ""
574
+
575
+ #: products/photocrati_nextgen/modules/marketing/module.marketing.php:208
576
+ #: products/photocrati_nextgen/modules/nextgen_pro_upgrade/adapter.nextgen_pro_upgrade_controller.php:195
577
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:243
578
+ msgid "Digital Downloads"
579
+ msgstr ""
580
+
581
+ #: products/photocrati_nextgen/modules/marketing/module.marketing.php:209
582
+ msgid "Dedicated customer support and so much more!"
583
+ msgstr ""
584
+
585
+ #: products/photocrati_nextgen/modules/marketing/module.marketing.php:216
586
+ msgid "Want to make your gallery workflow and presentation even better?"
587
+ msgstr ""
588
+
589
+ #: products/photocrati_nextgen/modules/marketing/module.marketing.php:217
590
+ #: products/photocrati_nextgen/modules/marketing/module.marketing.php:257
591
+ msgid "By upgrading to NextGEN Pro, you can get access to numerous other features, including:"
592
+ msgstr ""
593
+
594
+ #: products/photocrati_nextgen/modules/marketing/module.marketing.php:229
595
+ msgid "Want to do even more with your albums?"
596
+ msgstr ""
597
+
598
+ #: products/photocrati_nextgen/modules/marketing/module.marketing.php:254
599
+ msgid "Want to do even more with your gallery display?"
600
+ msgstr ""
601
+
602
+ #: products/photocrati_nextgen/modules/marketing/module.marketing.php:256
603
+ msgid "We know that you will truly love NextGEN Pro. It has 2,600+ five star ratings and is active on over 900,000 websites."
604
+ msgstr ""
605
+
606
+ #: products/photocrati_nextgen/modules/marketing/templates/igw_promo.php:2
607
+ msgid "Want More Layouts?"
608
+ msgstr ""
609
+
610
+ #: products/photocrati_nextgen/modules/marketing/templates/igw_promo.php:12
611
+ msgid "Get 20% Off Now!"
612
+ msgstr ""
613
+
614
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.import_folder_form.php:12
615
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/import_folder.php:12
616
+ msgid "Import Folder"
617
+ msgstr ""
618
+
619
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.import_media_library_form.php:12
620
+ msgid "Import from Media Library"
621
+ msgstr ""
622
+
623
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.import_media_library_form.php:25
624
+ msgid "Import Images into NextGen Gallery"
625
+ msgstr ""
626
+
627
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.import_media_library_form.php:26
628
+ msgid "Import %s images"
629
+ msgstr ""
630
+
631
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.import_media_library_form.php:27
632
+ msgid "Import 1 image"
633
+ msgstr ""
634
+
635
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.import_media_library_form.php:28
636
+ msgid "{count} images were uploaded successfully. <a href=\"%s\" target=\"_blank\">Manage gallery</a>"
637
+ msgstr ""
638
+
639
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.import_media_library_form.php:29
640
+ msgid "1 image was uploaded successfully. <a href=\"%s\" target=\"_blank\">Manage gallery</a>"
641
+ msgstr ""
642
+
643
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.import_media_library_form.php:30
644
+ msgid "0 images were uploaded"
645
+ msgstr ""
646
+
647
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.import_media_library_form.php:31
648
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/import_folder.php:52
649
+ msgid "Importing gallery"
650
+ msgstr ""
651
+
652
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.import_media_library_form.php:32
653
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/import_folder.php:54
654
+ msgid "In Progress..."
655
+ msgstr ""
656
+
657
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.import_media_library_form.php:33
658
+ msgid "Upload complete. Great job!"
659
+ msgstr ""
660
+
661
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.import_media_library_form.php:34
662
+ msgid "Oops! Sorry, but an error occured. This may be due to a server misconfiguration. Check your PHP error log or ask your hosting provider for assistance."
663
+ msgstr ""
664
+
665
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.import_media_library_form.php:44
666
+ msgid "Please make a selection to continue"
667
+ msgstr ""
668
+
669
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.import_media_library_form.php:45
670
+ msgid "Select images"
671
+ msgstr ""
672
+
673
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.import_media_library_form.php:46
674
+ msgid "Import %d image(s)"
675
+ msgstr ""
676
+
677
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.nextgen_addgallery_ajax.php:34
678
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.nextgen_addgallery_ajax.php:142
679
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.nextgen_addgallery_ajax.php:345
680
+ msgid "No permissions to upload images. Try refreshing the page or ensuring that your user account has sufficient roles/privileges."
681
+ msgstr ""
682
+
683
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.nextgen_addgallery_ajax.php:47
684
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.nextgen_addgallery_ajax.php:86
685
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.nextgen_addgallery_ajax.php:291
686
+ msgid "No gallery name specified"
687
+ msgstr ""
688
+
689
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.nextgen_addgallery_ajax.php:67
690
+ msgid "Please ask your hosting provider or system administrator to enable the PHP XML module which is required for image uploads"
691
+ msgstr ""
692
+
693
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.nextgen_addgallery_ajax.php:103
694
+ msgid "Failed to extract images from ZIP"
695
+ msgstr ""
696
+
697
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.nextgen_addgallery_ajax.php:115
698
+ msgid "Automatic image resizing failed [%1$s]."
699
+ msgstr ""
700
+
701
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.nextgen_addgallery_ajax.php:121
702
+ msgid "Thumbnail generation failed."
703
+ msgstr ""
704
+
705
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.nextgen_addgallery_ajax.php:124
706
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.nextgen_addgallery_ajax.php:309
707
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.nextgen_addgallery_ajax.php:328
708
+ msgid "Image generation failed"
709
+ msgstr ""
710
+
711
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.nextgen_addgallery_ajax.php:133
712
+ msgid "An unexpected error occurred: %s"
713
+ msgstr ""
714
+
715
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.nextgen_addgallery_ajax.php:197
716
+ msgid "Directory does not exist."
717
+ msgstr ""
718
+
719
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.nextgen_addgallery_ajax.php:201
720
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.nextgen_addgallery_ajax.php:209
721
+ msgid "No permissions to browse folders. Try refreshing the page or ensuring that your user account has sufficient roles/privileges."
722
+ msgstr ""
723
+
724
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.nextgen_addgallery_ajax.php:205
725
+ msgid "No directory specified."
726
+ msgstr ""
727
+
728
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.nextgen_addgallery_ajax.php:241
729
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.nextgen_addgallery_ajax.php:253
730
+ msgid "No permissions to import folders. Try refreshing the page or ensuring that your user account has sufficient roles/privileges."
731
+ msgstr ""
732
+
733
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.nextgen_addgallery_ajax.php:246
734
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.nextgen_addgallery_ajax.php:273
735
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.nextgen_addgallery_ajax.php:338
736
+ msgid "An unexpected error occured."
737
+ msgstr ""
738
+
739
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.nextgen_addgallery_ajax.php:250
740
+ msgid "No folder specified"
741
+ msgstr ""
742
+
743
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.nextgen_addgallery_controller.php:12
744
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:113
745
+ msgid "Add Gallery / Images"
746
+ msgstr ""
747
+
748
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.upload_images_form.php:74
749
+ msgid "No images were uploaded successfully."
750
+ msgstr ""
751
+
752
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.upload_images_form.php:75
753
+ msgid "1 image was uploaded successfully."
754
+ msgstr ""
755
+
756
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.upload_images_form.php:76
757
+ msgid "{count} images were uploaded successfully."
758
+ msgstr ""
759
+
760
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/adapter.upload_images_form.php:77
761
+ msgid "Manage gallery > {name}"
762
+ msgstr ""
763
+
764
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/module.nextgen_addgallery_page.php:95
765
+ msgid "XML is strongly encouraged for safely uploading images"
766
+ msgstr ""
767
+
768
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/module.nextgen_addgallery_page.php:103
769
+ msgid "Cannot write to %s: new galleries cannot be created"
770
+ msgstr ""
771
+
772
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/import_folder.php:1
773
+ msgid "Select a folder to import."
774
+ msgstr ""
775
+
776
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/import_folder.php:7
777
+ msgid "Leave blank for folder name"
778
+ msgstr ""
779
+
780
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/import_folder.php:11
781
+ msgid "Keep images in original location. Caution: If you keep images in the original folder and later delete the gallery, the images in that folder might be deleted depending on your settings."
782
+ msgstr ""
783
+
784
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/import_folder.php:74
785
+ msgid "Done! Successfully imported {count} images. <a href=\"%s\" target=\"_blank\">Manage gallery</a>"
786
+ msgstr ""
787
+
788
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/import_folder.php:79
789
+ msgid "Upload complete"
790
+ msgstr ""
791
+
792
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/import_media_library.php:2
793
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/upload_images.php:12
794
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:92
795
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/admin.php:297
796
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage-galleries.php:660
797
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/rewrite.php:217
798
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/rewrite.php:226
799
+ msgid "Gallery"
800
+ msgid_plural "Galleries"
801
+ msgstr[0] ""
802
+ msgstr[1] ""
803
+
804
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/import_media_library.php:4
805
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/upload_images.php:18
806
+ msgid "Create a new gallery"
807
+ msgstr ""
808
+
809
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/import_media_library.php:9
810
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/upload_images.php:32
811
+ msgid "Gallery title"
812
+ msgstr ""
813
+
814
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/upload_images.php:37
815
+ msgid "Create &amp; select"
816
+ msgstr ""
817
+
818
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/upload_images.php:41
819
+ msgid "Creating..."
820
+ msgstr ""
821
+
822
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/upload_images.php:51
823
+ msgid "Drag image and ZIP files here or %{browse}"
824
+ msgstr ""
825
+
826
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/upload_images.php:53
827
+ msgid "Drag image files here or %{browse}"
828
+ msgstr ""
829
+
830
+ #: products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/upload_images.php:60
831
+ msgid "You may select files up to %dMB"
832
+ msgstr ""
833
+
834
+ #: products/photocrati_nextgen/modules/nextgen_admin/class.admin_notification_manager.php:278
835
+ msgid "Notice is not dismissible"
836
+ msgstr ""
837
+
838
+ #: products/photocrati_nextgen/modules/nextgen_admin/class.admin_notification_manager.php:280
839
+ msgid "No handler defined for this notice"
840
+ msgstr ""
841
+
842
+ #: products/photocrati_nextgen/modules/nextgen_admin/class.admin_notification_manager.php:337
843
+ msgid "Not a valid notice name"
844
+ msgstr ""
845
+
846
+ #: products/photocrati_nextgen/modules/nextgen_admin/class.admin_requirements_manager.php:17
847
+ msgid "NextGen Gallery requires the following PHP extensions to function correctly. Please contact your hosting provider or systems admin and ask them for assistance:"
848
+ msgstr ""
849
+
850
+ #: products/photocrati_nextgen/modules/nextgen_admin/class.admin_requirements_manager.php:18
851
+ msgid "NextGen Gallery has degraded functionality because of your PHP version. Please contact your hosting provider or systems admin and ask them for assistance:"
852
+ msgstr ""
853
+
854
+ #: products/photocrati_nextgen/modules/nextgen_admin/class.admin_requirements_manager.php:19
855
+ msgid "NextGen Gallery has found an issue trying to access the following files or directories. Please ensure the following locations have the correct permissions:"
856
+ msgstr ""
857
+
858
+ #: products/photocrati_nextgen/modules/nextgen_admin/class.form.php:242
859
+ msgid "Gallery width"
860
+ msgstr ""
861
+
862
+ #: products/photocrati_nextgen/modules/nextgen_admin/class.form.php:244
863
+ msgid "An empty or 0 setting will make the gallery full width"
864
+ msgstr ""
865
+
866
+ #: products/photocrati_nextgen/modules/nextgen_admin/class.form.php:248
867
+ msgid "Pixels"
868
+ msgstr ""
869
+
870
+ #: products/photocrati_nextgen/modules/nextgen_admin/class.form.php:248
871
+ msgid "Percent"
872
+ msgstr ""
873
+
874
+ #: products/photocrati_nextgen/modules/nextgen_admin/class.form.php:257
875
+ msgid "First Image"
876
+ msgstr ""
877
+
878
+ #: products/photocrati_nextgen/modules/nextgen_admin/class.form.php:258
879
+ msgid "Average"
880
+ msgstr ""
881
+
882
+ #: products/photocrati_nextgen/modules/nextgen_admin/class.mailchimp_optin_notice.php:91
883
+ msgid "Thank you for using NextGEN Gallery!"
884
+ msgstr ""
885
+
886
+ #: products/photocrati_nextgen/modules/nextgen_admin/class.mailchimp_optin_notice.php:92
887
+ msgid "Get NextGEN Gallery updates, photography tips, business tips, tutorials, and resources straight to your mailbox."
888
+ msgstr ""
889
+
890
+ #: products/photocrati_nextgen/modules/nextgen_admin/class.mailchimp_optin_notice.php:93
891
+ msgid "Yes, Please!"
892
+ msgstr ""
893
+
894
+ #: products/photocrati_nextgen/modules/nextgen_admin/class.mailchimp_optin_notice.php:94
895
+ msgid "Thank you for subscribing!"
896
+ msgstr ""
897
+
898
+ #: products/photocrati_nextgen/modules/nextgen_admin/class.mailchimp_optin_notice.php:95
899
+ msgid "Email Address"
900
+ msgstr ""
901
+
902
+ #: products/photocrati_nextgen/modules/nextgen_admin/class.mailchimp_optin_notice.php:96
903
+ msgid "First Name"
904
+ msgstr ""
905
+
906
+ #: products/photocrati_nextgen/modules/nextgen_admin/class.mailchimp_optin_notice.php:97
907
+ msgid "Cannot connect to the registration server right now. Please try again later."
908
+ msgstr ""
909
+
910
+ #: products/photocrati_nextgen/modules/nextgen_admin/class.nextgen_admin_page_controller.php:152
911
+ msgid "Good work. Keep making the web beautiful."
912
+ msgstr ""
913
+
914
+ #: products/photocrati_nextgen/modules/nextgen_admin/class.nextgen_admin_page_controller.php:170
915
+ msgid "Saved successfully"
916
+ msgstr ""
917
+
918
+ #: products/photocrati_nextgen/modules/nextgen_admin/class.nextgen_first_run_notification_wizard.php:37
919
+ msgid "Thanks for installing NextGEN Gallery! Want help creating your first gallery?"
920
+ msgstr ""
921
+
922
+ #: products/photocrati_nextgen/modules/nextgen_admin/class.nextgen_first_run_notification_wizard.php:38
923
+ msgid "Launch the Gallery Wizard"
924
+ msgstr ""
925
+
926
+ #: products/photocrati_nextgen/modules/nextgen_admin/class.nextgen_first_run_notification_wizard.php:39
927
+ msgid "If you close this message, you can also launch the Gallery Wizard at any time from the"
928
+ msgstr ""
929
+
930
+ #: products/photocrati_nextgen/modules/nextgen_admin/class.nextgen_first_run_notification_wizard.php:40
931
+ msgid "NextGEN Overview page"
932
+ msgstr ""
933
+
934
+ #: products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php:217
935
+ msgid "PHP 5.2 will be deprecated in a future version of NextGEN. Please upgrade your PHP installation to 5.3 or above."
936
+ msgstr ""
937
+
938
+ #: products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php:480
939
+ msgid "Do you need help with NextGEN?"
940
+ msgstr ""
941
+
942
+ #: products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php:489
943
+ msgid "Hello, this wizard will guide you through creating a NextGEN gallery and inserting it into a page. Click \"Next step\" to proceed."
944
+ msgstr ""
945
+
946
+ #: products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php:492
947
+ msgid "Click on \"Pages\" to access your WordPress pages."
948
+ msgstr ""
949
+
950
+ #: products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php:497
951
+ msgid "Click \"Add New\" to create a new page."
952
+ msgstr ""
953
+
954
+ #: products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php:512
955
+ #: products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php:615
956
+ msgid "Type in a title for your page."
957
+ msgstr ""
958
+
959
+ #: products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php:531
960
+ msgid "Now click the button to insert a block."
961
+ msgstr ""
962
+
963
+ #: products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php:551
964
+ msgid "Type \"nextgen\" to search for the NextGEN block."
965
+ msgstr ""
966
+
967
+ #: products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php:571
968
+ msgid "Click on the NextGEN block to add it."
969
+ msgstr ""
970
+
971
+ #: products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php:599
972
+ msgid "Now click the \"Add Gallery\" button to open NextGEN's Insert Gallery Window."
973
+ msgstr ""
974
+
975
+ #: products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php:622
976
+ msgid "Now click the \"Add Gallery\" button to open NextGEN's Insert Gallery Window (IGW)."
977
+ msgstr ""
978
+
979
+ #: products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php:633
980
+ msgid "Now click the \"Upload Images\" tab to add a new gallery."
981
+ msgstr ""
982
+
983
+ #: products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php:667
984
+ msgid "Select a name for your gallery."
985
+ msgstr ""
986
+
987
+ #: products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php:691
988
+ msgid "Now click the 'Create & Select' button to create your gallery and upload to it."
989
+ msgstr ""
990
+
991
+ #: products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php:715
992
+ msgid "Now click the \"Browse\" button and select some images to add to the gallery."
993
+ msgstr ""
994
+
995
+ #: products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php:739
996
+ msgid "Now click the \"Upload files\" button to begin the upload process."
997
+ msgstr ""
998
+
999
+ #: products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php:766
1000
+ msgid "Congratulations! You just created your first gallery. Now let's insert it into the page. Click the \"Insert into Page\" tab."
1001
+ msgstr ""
1002
+
1003
+ #: products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php:778
1004
+ msgid "Click on the \"NextGEN Basic Slideshow\" radio button to select the display type for the gallery."
1005
+ msgstr ""
1006
+
1007
+ #: products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php:801
1008
+ msgid "Now click inside the \"Galleries\" field and select your gallery."
1009
+ msgstr ""
1010
+
1011
+ #: products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php:822
1012
+ msgid "Now click on the \"Insert Gallery\" button to insert the gallery in your page."
1013
+ msgstr ""
1014
+
1015
+ #: products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php:830
1016
+ msgid "Congratulations! You just created your first gallery. You can now click the \"Publish\" button on the right to publish your page."
1017
+ msgstr ""
1018
+
1019
+ #: products/photocrati_nextgen/modules/nextgen_admin/templates/admin_notice.php:4
1020
+ #: products/photocrati_nextgen/modules/nextgen_admin/templates/requirement_notice.php:4
1021
+ msgid "Dismiss"
1022
+ msgstr ""
1023
+
1024
+ #: products/photocrati_nextgen/modules/nextgen_admin/templates/nextgen_admin_page.php:72
1025
+ msgid "Save Options"
1026
+ msgstr ""
1027
+
1028
+ #: products/photocrati_nextgen/modules/nextgen_admin/templates/review_notice.php:5
1029
+ msgid "Hey <strong>%s</strong>, you've created %d NextGEN galleries! Awesome! Could I ask you to give us a 5-star rating really quickly on <a %s>WordPress.org</a>? It helps other WordPress users and motivates us to keep improving. You can also just send us feedback <a %s>here</a>. Thanks! ~ Nathan Singh (founder of Imagely/NextGEN Gallery)"
1030
+ msgstr ""
1031
+
1032
+ #: products/photocrati_nextgen/modules/nextgen_admin/templates/review_notice.php:14
1033
+ msgid "Ok, you deserve it"
1034
+ msgstr ""
1035
+
1036
+ #: products/photocrati_nextgen/modules/nextgen_admin/templates/review_notice.php:15
1037
+ msgid "Nope, maybe later"
1038
+ msgstr ""
1039
+
1040
+ #: products/photocrati_nextgen/modules/nextgen_admin/templates/review_notice.php:16
1041
+ msgid "I already did"
1042
+ msgstr ""
1043
+
1044
+ #: products/photocrati_nextgen/modules/nextgen_basic_album/mixin.nextgen_basic_album_form.php:42
1045
+ msgid "Display galleries as"
1046
+ msgstr ""
1047
+
1048
+ #: products/photocrati_nextgen/modules/nextgen_basic_album/mixin.nextgen_basic_album_form.php:43
1049
+ msgid "How would you like galleries to be displayed?"
1050
+ msgstr ""
1051
+
1052
+ #: products/photocrati_nextgen/modules/nextgen_basic_album/mixin.nextgen_basic_album_form.php:45
1053
+ msgid "Galleries per page"
1054
+ msgstr ""
1055
+
1056
+ #: products/photocrati_nextgen/modules/nextgen_basic_album/mixin.nextgen_basic_album_form.php:64
1057
+ msgid "Items per page"
1058
+ msgstr ""
1059
+
1060
+ #: products/photocrati_nextgen/modules/nextgen_basic_album/mixin.nextgen_basic_album_form.php:66
1061
+ msgid "Maximum number of galleries or sub-albums to appear on a single page"
1062
+ msgstr ""
1063
+
1064
+ #: products/photocrati_nextgen/modules/nextgen_basic_album/mixin.nextgen_basic_album_form.php:78
1065
+ msgid "Enable breadcrumbs"
1066
+ msgstr ""
1067
+
1068
+ #: products/photocrati_nextgen/modules/nextgen_basic_album/mixin.nextgen_basic_album_form.php:88
1069
+ msgid "Display descriptions"
1070
+ msgstr ""
1071
+
1072
+ #: products/photocrati_nextgen/modules/nextgen_basic_album/module.nextgen_basic_album.php:216
1073
+ msgid "NextGEN Basic Compact Album"
1074
+ msgstr ""
1075
+
1076
+ #: products/photocrati_nextgen/modules/nextgen_basic_album/module.nextgen_basic_album.php:232
1077
+ msgid "NextGEN Basic Extended Album"
1078
+ msgstr ""
1079
+
1080
+ #: products/photocrati_nextgen/modules/nextgen_basic_album/templates/compact.php:41
1081
+ #: products/photocrati_nextgen/modules/nextgen_basic_album/templates/compact/default-view.php:41
1082
+ #: products/photocrati_nextgen/modules/nextgen_basic_album/templates/extended.php:31
1083
+ #: products/photocrati_nextgen/modules/nextgen_basic_album/templates/extended/default-view.php:31
1084
+ #: products/photocrati_nextgen/modules/ngglegacy/view/album-compact.php:63
1085
+ #: products/photocrati_nextgen/modules/ngglegacy/view/album-extend.php:31
1086
+ msgid "Photos"
1087
+ msgstr ""
1088
+
1089
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_slideshow_form.php:54
1090
+ msgid "Autoplay?"
1091
+ msgstr ""
1092
+
1093
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_slideshow_form.php:70
1094
+ msgid "Pause on Hover?"
1095
+ msgstr ""
1096
+
1097
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_slideshow_form.php:86
1098
+ msgid "Show Arrows?"
1099
+ msgstr ""
1100
+
1101
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_slideshow_form.php:102
1102
+ msgid "Transition Style"
1103
+ msgstr ""
1104
+
1105
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_slideshow_form.php:124
1106
+ msgid "Interval"
1107
+ msgstr ""
1108
+
1109
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_slideshow_form.php:128
1110
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_slideshow_form.php:148
1111
+ msgid "Milliseconds"
1112
+ msgstr ""
1113
+
1114
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_slideshow_form.php:144
1115
+ msgid "Transition Speed"
1116
+ msgstr ""
1117
+
1118
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_slideshow_form.php:157
1119
+ msgid "Maximum dimensions"
1120
+ msgstr ""
1121
+
1122
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_slideshow_form.php:158
1123
+ msgid "Certain themes may allow images to flow over their container if this setting is too large"
1124
+ msgstr ""
1125
+
1126
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_slideshow_form.php:175
1127
+ msgid "Show thumbnail link"
1128
+ msgstr ""
1129
+
1130
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_slideshow_form.php:191
1131
+ msgid "Thumbnail link text"
1132
+ msgstr ""
1133
+
1134
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_thumbnail_form.php:63
1135
+ msgid "Images per page"
1136
+ msgstr ""
1137
+
1138
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_thumbnail_form.php:65
1139
+ msgid "0 will display all images at once"
1140
+ msgstr ""
1141
+
1142
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_thumbnail_form.php:83
1143
+ msgid "Number of columns to display"
1144
+ msgstr ""
1145
+
1146
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_thumbnail_form.php:87
1147
+ msgid "# of columns"
1148
+ msgstr ""
1149
+
1150
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_thumbnail_form.php:103
1151
+ msgid "Add Hidden Images"
1152
+ msgstr ""
1153
+
1154
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_thumbnail_form.php:105
1155
+ msgid "If pagination is used this option will show all images in the modal window (Thickbox, Lightbox etc.) This increases page load."
1156
+ msgstr ""
1157
+
1158
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_thumbnail_form.php:114
1159
+ msgid "Use imagebrowser effect"
1160
+ msgstr ""
1161
+
1162
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_thumbnail_form.php:116
1163
+ msgid "When active each image in the gallery will link to an imagebrowser display and lightbox effects will not be applied."
1164
+ msgstr ""
1165
+
1166
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_thumbnail_form.php:131
1167
+ msgid "Show slideshow link"
1168
+ msgstr ""
1169
+
1170
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/adapter.nextgen_basic_thumbnail_form.php:147
1171
+ msgid "Slideshow link text"
1172
+ msgstr ""
1173
+
1174
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/module.nextgen_basic_gallery.php:370
1175
+ msgid "NextGEN Basic Thumbnails"
1176
+ msgstr ""
1177
+
1178
+ #: products/photocrati_nextgen/modules/nextgen_basic_gallery/module.nextgen_basic_gallery.php:386
1179
+ msgid "NextGEN Basic Slideshow"
1180
+ msgstr ""
1181
+
1182
+ #: products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/module.nextgen_basic_imagebrowser.php:158
1183
+ msgid "NextGEN Basic ImageBrowser"
1184
+ msgstr ""
1185
+
1186
+ #: products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/templates/nextgen_basic_imagebrowser.php:51
1187
+ #: products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser-caption.php:26
1188
+ #: products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser-exif.php:30
1189
+ #: products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser.php:26
1190
+ msgid "Back"
1191
+ msgstr ""
1192
+
1193
+ #: products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/templates/nextgen_basic_imagebrowser.php:65
1194
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/manage.php:88
1195
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/rewrite.php:220
1196
+ #: products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser-caption.php:31
1197
+ #: products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser-exif.php:35
1198
+ #: products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser.php:31
1199
+ msgid "Picture"
1200
+ msgstr ""
1201
+
1202
+ #: products/photocrati_nextgen/modules/nextgen_basic_singlepic/adapter.nextgen_basic_singlepic_form.php:43
1203
+ #: products/photocrati_nextgen/modules/nextgen_gallery_display/mixin.display_type_form.php:134
1204
+ msgid "Thumbnail dimensions"
1205
+ msgstr ""
1206
+
1207
+ #: products/photocrati_nextgen/modules/nextgen_basic_singlepic/adapter.nextgen_basic_singlepic_form.php:71
1208
+ msgid "Link target"
1209
+ msgstr ""
1210
+
1211
+ #: products/photocrati_nextgen/modules/nextgen_basic_singlepic/adapter.nextgen_basic_singlepic_form.php:73
1212
+ msgid "Self"
1213
+ msgstr ""
1214
+
1215
+ #: products/photocrati_nextgen/modules/nextgen_basic_singlepic/adapter.nextgen_basic_singlepic_form.php:74
1216
+ msgid "Blank"
1217
+ msgstr ""
1218
+
1219
+ #: products/photocrati_nextgen/modules/nextgen_basic_singlepic/adapter.nextgen_basic_singlepic_form.php:75
1220
+ msgid "Parent"
1221
+ msgstr ""
1222
+
1223
+ #: products/photocrati_nextgen/modules/nextgen_basic_singlepic/adapter.nextgen_basic_singlepic_form.php:76
1224
+ msgid "Top"
1225
+ msgstr ""
1226
+
1227
+ #: products/photocrati_nextgen/modules/nextgen_basic_singlepic/adapter.nextgen_basic_singlepic_form.php:88
1228
+ #: products/photocrati_nextgen/modules/nextgen_gallery_display/mixin.display_type_form.php:180
1229
+ msgid "Image quality"
1230
+ msgstr ""
1231
+
1232
+ #: products/photocrati_nextgen/modules/nextgen_basic_singlepic/adapter.nextgen_basic_singlepic_form.php:100
1233
+ msgid "Display watermark"
1234
+ msgstr ""
1235
+
1236
+ #: products/photocrati_nextgen/modules/nextgen_basic_singlepic/adapter.nextgen_basic_singlepic_form.php:110
1237
+ msgid "Display reflection"
1238
+ msgstr ""
1239
+
1240
+ #: products/photocrati_nextgen/modules/nextgen_basic_singlepic/adapter.nextgen_basic_singlepic_form.php:120
1241
+ msgid "Crop thumbnail"
1242
+ msgstr ""
1243
+
1244
+ #: products/photocrati_nextgen/modules/nextgen_basic_singlepic/adapter.nextgen_basic_singlepic_form.php:130
1245
+ msgid "Float"
1246
+ msgstr ""
1247
+
1248
+ #: products/photocrati_nextgen/modules/nextgen_basic_singlepic/adapter.nextgen_basic_singlepic_form.php:133
1249
+ msgid "Left"
1250
+ msgstr ""
1251
+
1252
+ #: products/photocrati_nextgen/modules/nextgen_basic_singlepic/adapter.nextgen_basic_singlepic_form.php:134
1253
+ msgid "Right"
1254
+ msgstr ""
1255
+
1256
+ #: products/photocrati_nextgen/modules/nextgen_basic_singlepic/module.nextgen_basic_singlepic.php:158
1257
+ msgid "NextGEN Basic SinglePic"
1258
+ msgstr ""
1259
+
1260
+ #: products/photocrati_nextgen/modules/nextgen_basic_tagcloud/adapter.nextgen_basic_tagcloud_form.php:36
1261
+ msgid "Maximum number of tags"
1262
+ msgstr ""
1263
+
1264
+ #: products/photocrati_nextgen/modules/nextgen_basic_tagcloud/adapter.nextgen_basic_tagcloud_form.php:72
1265
+ msgid "Display type"
1266
+ msgstr ""
1267
+
1268
+ #: products/photocrati_nextgen/modules/nextgen_basic_tagcloud/adapter.nextgen_basic_tagcloud_form.php:75
1269
+ msgid "The display type that the tagcloud will point its results to"
1270
+ msgstr ""
1271
+
1272
+ #: products/photocrati_nextgen/modules/nextgen_basic_tagcloud/class.taxonomy_controller.php:112
1273
+ msgid "Images tagged &quot;%s&quot;"
1274
+ msgstr ""
1275
+
1276
+ #: products/photocrati_nextgen/modules/nextgen_basic_tagcloud/module.nextgen_basic_tagcloud.php:176
1277
+ msgid "NextGEN Basic TagCloud"
1278
+ msgstr ""
1279
+
1280
+ #: products/photocrati_nextgen/modules/nextgen_basic_templates/adapter.nextgen_basic_template_form.php:48
1281
+ #: products/photocrati_nextgen/modules/nextgen_gallery_display/mixin.display_type_form.php:262
1282
+ msgid "Default"
1283
+ msgstr ""
1284
+
1285
+ #: products/photocrati_nextgen/modules/nextgen_basic_templates/adapter.nextgen_basic_template_form.php:54
1286
+ msgid "Legacy (Old) Templates"
1287
+ msgstr ""
1288
+
1289
+ #: products/photocrati_nextgen/modules/nextgen_basic_templates/adapter.nextgen_basic_template_form.php:55
1290
+ msgid "Use a legacy template when rendering (not recommended)."
1291
+ msgstr ""
1292
+
1293
+ #: products/photocrati_nextgen/modules/nextgen_block/module.nextgen_block.php:62
1294
+ msgid "Add NextGEN Gallery"
1295
+ msgstr ""
1296
+
1297
+ #: products/photocrati_nextgen/modules/nextgen_data/class.gallery.php:48
1298
+ #: products/photocrati_nextgen/modules/nextgen_other_options/adapter.image_options_form.php:147
1299
+ #: products/photocrati_nextgen/modules/ngglegacy/admin/wpmu.php:36
1300
+ msgid "Gallery path must be located in %s"
1301
+ msgstr ""
1302
+
1303
+ #: products/photocrati_nextgen/modules/nextgen_data/class.gallery.php:56
1304
+ msgid "Gallery paths may not use '..' to access parent directories)"
1305
+ msgstr ""
1306
+
1307
+ #: products/photocrati_nextgen/modules/nextgen_data/class.gallery.php:71
1308
+ msgid "Gallery path must be a sub-directory under the %s directory"
1309
+ msgstr ""
1310
+
1311
+ #: products/photocrati_nextgen/modules/nextgen_data/class.gallery.php:87
1312
+ msgid "Gallery path cannot be under %s directory"
1313
+ msgstr ""
1314
+
1315
+ #: products/photocrati_nextgen/modules/nextgen_data/class.gallery.php:99
1316
+ msgid "Gallery path cannot end with a directory named %s"
1317
+ msgstr ""
1318
+
1319
+ #: products/photocrati_nextgen/modules/nextgen_data/class.nextgen_metadata.php:142
1320
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:136
1321
+ msgid " mm"
1322
+ msgstr ""
1323
+
1324
+ #: products/photocrati_nextgen/modules/nextgen_data/class.nextgen_metadata.php:148
1325
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:142
1326
+ msgid " sec"
1327
+ msgstr ""
1328
+
1329
+ #: products/photocrati_nextgen/modules/nextgen_data/class.nextgen_metadata.php:152
1330
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:146
1331
+ msgid "Fired"
1332
+ msgstr ""
1333
+
1334
+ #: products/photocrati_nextgen/modules/nextgen_data/class.nextgen_metadata.php:468
1335
+ #: products/photocrati_nextgen/modules/ngglegacy/lib/meta.php:461
1336
+ #: products/photocrati_nextgen/modules/ngglegacy/view/imagebrowser-exif.php:46
1337
+ msgid "Aperture"
1338
+ msgstr ""
1339
+
1340
+ #: products/photocrati_nextgen/modules/nextgen_data/class.nextgen_metadata.php:469
1341
+ #: products/photocr