NextGEN Gallery – WordPress Gallery Plugin - Version 2.2.8

Version Description

  • 06.13.2016 =
  • Changed: Removed custom Freeius opt-in message
  • Changed: New design and video for Upgrade to Pro page
  • Changed: Added namespacing to NGG-generated transients
  • Fixed: Better error reporting for the XML-RPC method, ngg.uploadImage
  • Fixed: Thumbnail editing links missing when locale uses RTL language such as Hebrew
  • Fixed: Roles and Capabilities discrepancy with displaying NextGEN Gallery UI elements
  • Fixed: Fancybox lightbox effect not compatible with Pro Mosaic galleries
  • Fixed: Basic Tagcloud does not honor display type setting when editing in IGW
  • Fixed: Basic Tagcloud allows selection of Pro display types when NGG Pro is disabled
  • Fixed: Limit display types available in "Display galleries as" setting for albums
  • Fixed: Special characters in show_slideshow_text parameter causing inserted display to not be editable.
  • Fixed: NGG Basic Slideshow not honoring transition effect setting
  • Fixed: Image tags that are no longer should be removed
  • Fixed: Spacing preserved when our shortcodes are placed with other content
  • Fixed: Breadcrumbs in albums when slug is shared between gallery and album
  • Fixed: get_unique_slug() creating invalid SQL query when gallery name contains quote characters
  • Fixed: /ngg_tags pages displaying comments from all posts
  • Fixed: PHP warning when saving image meta data
  • Fixed: Fix incompatibility with WPML pagination due to overriding $SERVER['REQUESTURI']
Download this release

Release Info

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

Code changes from version 2.2.3 to 2.2.8

Files changed (45) hide show
  1. changelog.txt +21 -0
  2. nggallery.php +2 -3
  3. non_pope/class.photocrati_transient_manager.php +2 -1
  4. products/photocrati_nextgen/modules/attach_to_post/module.attach_to_post.php +16 -3
  5. products/photocrati_nextgen/modules/attach_to_post/static/attach_to_post.js +2 -2
  6. products/photocrati_nextgen/modules/attach_to_post/static/attach_to_post.min.js +1 -1
  7. products/photocrati_nextgen/modules/attach_to_post/static/base64.js +205 -0
  8. products/photocrati_nextgen/modules/attach_to_post/static/base64.min.js +1 -0
  9. products/photocrati_nextgen/modules/attach_to_post/static/ngg_attach_to_post_tinymce_plugin.js +13 -14
  10. products/photocrati_nextgen/modules/attach_to_post/static/ngg_attach_to_post_tinymce_plugin.min.js +1 -1
  11. products/photocrati_nextgen/modules/i18n/module.i18n.php +21 -1
  12. products/photocrati_nextgen/modules/lightbox/static/fancybox/nextgen_fancybox_init.js +1 -1
  13. products/photocrati_nextgen/modules/lightbox/static/fancybox/nextgen_fancybox_init.min.js +1 -1
  14. products/photocrati_nextgen/modules/nextgen_basic_album/package.module.nextgen_basic_album.php +13 -1
  15. products/photocrati_nextgen/modules/nextgen_basic_album/templates/breadcrumbs.php +2 -2
  16. products/photocrati_nextgen/modules/nextgen_basic_album/templates/compact.php +1 -1
  17. products/photocrati_nextgen/modules/nextgen_basic_album/templates/descriptions.php +1 -1
  18. products/photocrati_nextgen/modules/nextgen_basic_album/templates/extended.php +2 -2
  19. products/photocrati_nextgen/modules/nextgen_basic_gallery/package.module.nextgen_basic_gallery.php +29 -14
  20. products/photocrati_nextgen/modules/nextgen_basic_gallery/static/thumbnails/nextgen_basic_thumbnails.js +9 -3
  21. products/photocrati_nextgen/modules/nextgen_basic_gallery/static/thumbnails/nextgen_basic_thumbnails.min.js +1 -1
  22. products/photocrati_nextgen/modules/nextgen_basic_gallery/templates/thumbnails/index.php +1 -0
  23. products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/templates/imagebrowser-simple-template.php +1 -1
  24. products/photocrati_nextgen/modules/nextgen_basic_tagcloud/module.nextgen_basic_tagcloud.php +2 -1
  25. products/photocrati_nextgen/modules/nextgen_basic_tagcloud/package.module.nextgen_basic_tagcloud.php +7 -2
  26. products/photocrati_nextgen/modules/nextgen_data/module.nextgen_data.php +1 -1
  27. products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php +16 -7
  28. products/photocrati_nextgen/modules/nextgen_pro_upgrade/module.nextgen_pro_upgrade.php +1 -1
  29. products/photocrati_nextgen/modules/nextgen_pro_upgrade/package.module.nextgen_pro_upgrade.php +7 -8
  30. products/photocrati_nextgen/modules/nextgen_pro_upgrade/static/style.css +81 -12
  31. products/photocrati_nextgen/modules/nextgen_pro_upgrade/static/style.min.css +1 -1
  32. products/photocrati_nextgen/modules/nextgen_pro_upgrade/templates/plus.php +9 -18
  33. products/photocrati_nextgen/modules/nextgen_pro_upgrade/templates/pro.php +11 -9
  34. products/photocrati_nextgen/modules/nextgen_xmlrpc/package.module.nextgen_xmlrpc.php +88 -27
  35. products/photocrati_nextgen/modules/ngglegacy/admin/css/nggadmin.css +26 -0
  36. products/photocrati_nextgen/modules/ngglegacy/admin/css/nggadmin.min.css +1 -1
  37. products/photocrati_nextgen/modules/ngglegacy/admin/manage.php +13 -0
  38. products/photocrati_nextgen/modules/ngglegacy/admin/overview.php +5 -9
  39. products/photocrati_nextgen/modules/ngglegacy/lib/meta.php +3 -5
  40. products/photocrati_nextgen/modules/ngglegacy/lib/ngg-db.php +2 -2
  41. products/photocrati_nextgen/modules/ngglegacy/module.ngglegacy.php +1 -1
  42. products/photocrati_nextgen/modules/router/package.module.router.php +2 -2
  43. products/photocrati_nextgen/modules/wordpress_routing/module.wordpress_routing.php +2 -2
  44. products/photocrati_nextgen/modules/wordpress_routing/package.module.wordpress_routing.php +1 -1
  45. readme.txt +199 -178
changelog.txt CHANGED
@@ -1,6 +1,27 @@
1
  NextGEN Gallery
2
  by Imagely
3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
  = V2.2.3 - 04.05.2017 =
5
  * Fixed: E_WARNING on Gallery Settings page due to improper use of array_combine() on PHP <= 5.3
6
 
1
  NextGEN Gallery
2
  by Imagely
3
 
4
+ = V2.2.8 - 06.13.2016 =
5
+ * Changed: Removed custom Freemius opt-in message
6
+ * Changed: New design and video for Upgrade to Pro page
7
+ * Changed: Added namespacing to NGG-generated transients
8
+ * Fixed: Better error reporting for the XML-RPC method, ngg.uploadImage
9
+ * Fixed: Thumbnail editing links missing when locale uses RTL language such as Hebrew
10
+ * Fixed: Roles and Capabilities discrepancy with displaying NextGEN Gallery UI elements
11
+ * Fixed: Fancybox lightbox effect not compatible with Pro Mosaic galleries
12
+ * Fixed: Basic Tagcloud does not honor display type setting when editing in IGW
13
+ * Fixed: Basic Tagcloud allows selection of Pro display types when NGG Pro is disabled
14
+ * Fixed: Limit display types available in "Display galleries as" setting for albums
15
+ * Fixed: Special characters in `show_slideshow_text` parameter causing inserted display to not be editable.
16
+ * Fixed: NGG Basic Slideshow not honoring transition effect setting
17
+ * Fixed: Image tags that are no longer should be removed
18
+ * Fixed: Spacing preserved when our shortcodes are placed with other content
19
+ * Fixed: Breadcrumbs in albums when slug is shared between gallery and album
20
+ * Fixed: get_unique_slug() creating invalid SQL query when gallery name contains quote characters
21
+ * Fixed: /ngg_tags pages displaying comments from all posts
22
+ * Fixed: PHP warning when saving image meta data
23
+ * Fixed: Fix incompatibility with WPML pagination due to overriding $_SERVER['REQUEST_URI']
24
+
25
  = V2.2.3 - 04.05.2017 =
26
  * Fixed: E_WARNING on Gallery Settings page due to improper use of array_combine() on PHP <= 5.3
27
 
nggallery.php CHANGED
@@ -4,7 +4,7 @@ if(preg_match('#' . basename(__FILE__) . '#', $_SERVER['PHP_SELF'])) { die('You
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 17 million downloads.
7
- * Version: 2.2.3
8
  * Author: Imagely
9
  * Plugin URI: https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/
10
  * Author URI: https://www.imagely.com
@@ -637,7 +637,7 @@ class C_NextGEN_Bootstrap
637
  define('NGG_PRODUCT_URL', path_join(str_replace("\\", '/', NGG_PLUGIN_URL), 'products'));
638
  define('NGG_MODULE_URL', path_join(str_replace("\\", '/', NGG_PRODUCT_URL), 'photocrati_nextgen/modules'));
639
  define('NGG_PLUGIN_STARTED_AT', microtime());
640
- define('NGG_PLUGIN_VERSION', '2.2.3');
641
 
642
  if (defined('SCRIPT_DEBUG') && SCRIPT_DEBUG)
643
  define('NGG_SCRIPT_VERSION', (string)mt_rand(0, mt_getrandmax()));
@@ -1009,7 +1009,6 @@ function ngg_fs( $activate_for_all = false ) {
1009
  */
1010
 
1011
  // Hook to the custom message filter.
1012
- $ngg_fs->add_filter( 'connect_message', 'ngg_fs_custom_connect_message', 10, 6 );
1013
  $ngg_fs->add_action( 'after_uninstall', 'ngg_fs_uninstall' );
1014
 
1015
  // Hook to new gallery creation event.
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 17 million downloads.
7
+ * Version: 2.2.8
8
  * Author: Imagely
9
  * Plugin URI: https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/
10
  * Author URI: https://www.imagely.com
637
  define('NGG_PRODUCT_URL', path_join(str_replace("\\", '/', NGG_PLUGIN_URL), 'products'));
638
  define('NGG_MODULE_URL', path_join(str_replace("\\", '/', NGG_PRODUCT_URL), 'photocrati_nextgen/modules'));
639
  define('NGG_PLUGIN_STARTED_AT', microtime());
640
+ define('NGG_PLUGIN_VERSION', '2.2.8');
641
 
642
  if (defined('SCRIPT_DEBUG') && SCRIPT_DEBUG)
643
  define('NGG_SCRIPT_VERSION', (string)mt_rand(0, mt_getrandmax()));
1009
  */
1010
 
1011
  // Hook to the custom message filter.
 
1012
  $ngg_fs->add_action( 'after_uninstall', 'ngg_fs_uninstall' );
1013
 
1014
  // Hook to new gallery creation event.
non_pope/class.photocrati_transient_manager.php CHANGED
@@ -139,7 +139,8 @@ class C_Photocrati_Transient_Manager
139
  if (is_string($group) && !empty($group))
140
  {
141
  global $wpdb;
142
- $query = "DELETE FROM {$wpdb->options} WHERE option_name LIKE '_transient%' AND option_name LIKE '%{$this->get_group_id($group)}__%'";
 
143
  $wpdb->query($query);
144
  $this->delete_tracked($group);
145
  }
139
  if (is_string($group) && !empty($group))
140
  {
141
  global $wpdb;
142
+ // Note: The wildcard % matches any number of characters, _ matches a single character and should be escaped
143
+ $query = "DELETE FROM {$wpdb->options} WHERE option_name LIKE '\_transient%' AND option_name LIKE '%{$this->get_group_id($group)}\_\_%'";
144
  $wpdb->query($query);
145
  $this->delete_tracked($group);
146
  }
products/photocrati_nextgen/modules/attach_to_post/module.attach_to_post.php CHANGED
@@ -138,7 +138,7 @@ class M_Attach_To_Post extends C_Base_Module
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_init', array($this, 'enqueue_tinymce_plugin_css'));
144
  add_action('admin_print_scripts', array(&$this, 'print_tinymce_placeholder_template'));
@@ -257,6 +257,13 @@ class M_Attach_To_Post extends C_Base_Module
257
 
258
  function add_media_button()
259
  {
 
 
 
 
 
 
 
260
  $router = C_Router::get_instance();
261
  $button_url = $router->get_static_url('photocrati-attach_to_post#atp_button.png');
262
  $label = __('Add Gallery', 'nggallery');
@@ -360,6 +367,13 @@ class M_Attach_To_Post extends C_Base_Module
360
 
361
  M_Gallery_Display::enqueue_fontawesome();
362
 
 
 
 
 
 
 
 
363
  wp_enqueue_style(
364
  'ngg_attach_to_post_dialog',
365
  $router->get_static_url('photocrati-attach_to_post#attach_to_post_dialog.css'),
@@ -370,7 +384,7 @@ class M_Attach_To_Post extends C_Base_Module
370
  wp_enqueue_script(
371
  'ngg-igw',
372
  $router->get_static_url('photocrati-attach_to_post#igw.js'),
373
- array('jquery'),
374
  NGG_PLUGIN_VERSION
375
  );
376
  wp_localize_script('ngg-igw', 'ngg_igw_i18n', array(
@@ -440,7 +454,6 @@ class M_Attach_To_Post extends C_Base_Module
440
  */
441
  function add_attach_to_post_tinymce_plugin($plugins)
442
  {
443
- global $wp_version;
444
  $router = C_Router::get_instance();
445
  wp_enqueue_script('photocrati_ajax');
446
  $plugins[$this->attach_to_post_tinymce_plugin] = $router->get_static_url('photocrati-attach_to_post#ngg_attach_to_post_tinymce_plugin.js');
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_init', array($this, 'enqueue_tinymce_plugin_css'));
144
  add_action('admin_print_scripts', array(&$this, 'print_tinymce_placeholder_template'));
257
 
258
  function add_media_button()
259
  {
260
+ $security = $this->get_registry()->get_utility('I_Security_Manager');
261
+ $sec_actor = $security->get_current_actor();
262
+ if (in_array(FALSE, array(
263
+ $sec_actor->is_allowed('NextGEN Attach Interface'),
264
+ $sec_actor->is_allowed('NextGEN Use TinyMCE'))))
265
+ return;
266
+
267
  $router = C_Router::get_instance();
268
  $button_url = $router->get_static_url('photocrati-attach_to_post#atp_button.png');
269
  $label = __('Add Gallery', 'nggallery');
367
 
368
  M_Gallery_Display::enqueue_fontawesome();
369
 
370
+ wp_register_script(
371
+ 'Base64',
372
+ $router->get_static_url('photocrati-attach_to_post#base64.js'),
373
+ array(),
374
+ NGG_PLUGIN_VERSION
375
+ );
376
+
377
  wp_enqueue_style(
378
  'ngg_attach_to_post_dialog',
379
  $router->get_static_url('photocrati-attach_to_post#attach_to_post_dialog.css'),
384
  wp_enqueue_script(
385
  'ngg-igw',
386
  $router->get_static_url('photocrati-attach_to_post#igw.js'),
387
+ array('jquery', 'Base64'),
388
  NGG_PLUGIN_VERSION
389
  );
390
  wp_localize_script('ngg-igw', 'ngg_igw_i18n', array(
454
  */
455
  function add_attach_to_post_tinymce_plugin($plugins)
456
  {
 
457
  $router = C_Router::get_instance();
458
  wp_enqueue_script('photocrati_ajax');
459
  $plugins[$this->attach_to_post_tinymce_plugin] = $router->get_static_url('photocrati-attach_to_post#ngg_attach_to_post_tinymce_plugin.js');
products/photocrati_nextgen/modules/attach_to_post/static/attach_to_post.js CHANGED
@@ -143,9 +143,9 @@ function insert_into_editor(snippet, ref_or_id)
143
  jQuery(editor.selection.getNode()).attr('data-shortcode', snippet.substring(1, snippet.length-1));
144
  }
145
  else {
146
- editor.insertContent(snippet);
147
  }
148
- editor.selection.collapse(true);
149
 
150
  }
151
  else {
143
  jQuery(editor.selection.getNode()).attr('data-shortcode', snippet.substring(1, snippet.length-1));
144
  }
145
  else {
146
+ editor.execCommand('mceInsertContent', false, snippet);
147
  }
148
+ editor.selection.collapse(false);
149
 
150
  }
151
  else {
products/photocrati_nextgen/modules/attach_to_post/static/attach_to_post.min.js CHANGED
@@ -1 +1 @@
1
- function close_attach_to_post_window(){var t=jQuery(top.document).find("#TB_window iframe").attr("src");t&&t.match("attach_to_post")?top.tb_remove():top.tinyMCE.activeEditor.windowManager.close(window)}function adjust_height_for_frame(t,e,i){var o=jQuery(e.frameElement),n=o.contents().height()/3,a=o.contents().find("#wpbody").height(),r=jQuery(t.document).height(),c=o.height();if(n<a&&(n=a),n<r&&(n=r),c<n){o.height(n);var s=o.attr("id");if(s&&0==s.indexOf("ngg-iframe-")){var l=s.substr(11);l&&jQuery("#"+l).height(n)}}return void 0==i||i(t,e,n)}function ngg_get_measures_for_frame(t){var e=jQuery(t),i=e.attr("id"),o={};if(i&&0==i.indexOf("ngg-iframe-")){var n=i.substr(11);if(n){var a=jQuery(document);if(o.scrollTop=a.scrollTop()-40,window.parent){var r=jQuery(window.parent.document);o.scrollHeight=r.find(".ngg_attach_to_post_window").height()-40}else o.scrollHeight=a.height();"undefined"!=typeof window.console&&console.log(o)}}return o}function is_visual_editor(){return 0==jQuery(top.document).find(".html-active:visible").length}function insert_into_editor(t,e){if(is_visual_editor()){var i=top.tinyMCE.activeEditor;i.selection.getNode().outerHTML.indexOf(e)>=0?jQuery(i.selection.getNode()).attr("data-shortcode",t.substring(1,t.length-1)):i.insertContent(t),i.selection.collapse(!0)}else if(myField=top.document.getElementById("content"),myValue=t,document.selection)myField.focus(),sel=document.selection.createRange(),sel.text=myValue;else if(myField.selectionStart||"0"==myField.selectionStart){var o=myField.selectionStart,n=myField.selectionEnd;myField.value=myField.value.substring(0,o)+myValue+myField.value.substring(n,myField.value.length)}else myField.value+=myValue}this.id="ngg-attach_to_post",jQuery(function(t){t("#attach_to_post_tabs").ngg_tabs(),t(".accordion h3").bind("click",function(e){"preview_tab"==t(this).attr("id")&&t("#preview_area").trigger("opened")}),t(".accordion").accordion({clearStyle:!0,autoHeight:!1,heightStyle:"content"}),t(".ui-tabs-nav a").click(function(e){var i=e.target?e.target:e.srcElement;if(t(i).parent().hasClass("ui-state-active")){var o=t(i.hash+" iframe");o.length>0&&o[0].contentDocument.location!=o.attr("src")&&(o[0].contentDocument.location=o.attr("src"))}}),t(this).keydown(function(t){27==t.keyCode&&close_attach_to_post_window()}),t("body").css({position:"static",visibility:"visible"}).animate({opacity:1})});
1
+ function close_attach_to_post_window(){var t=jQuery(top.document).find("#TB_window iframe").attr("src");t&&t.match("attach_to_post")?top.tb_remove():top.tinyMCE.activeEditor.windowManager.close(window)}function adjust_height_for_frame(t,e,i){var o=jQuery(e.frameElement),n=o.contents().height()/3,a=o.contents().find("#wpbody").height(),r=jQuery(t.document).height(),c=o.height();if(n<a&&(n=a),n<r&&(n=r),c<n){o.height(n);var s=o.attr("id");if(s&&0==s.indexOf("ngg-iframe-")){var l=s.substr(11);l&&jQuery("#"+l).height(n)}}return void 0==i||i(t,e,n)}function ngg_get_measures_for_frame(t){var e=jQuery(t),i=e.attr("id"),o={};if(i&&0==i.indexOf("ngg-iframe-")){var n=i.substr(11);if(n){var a=jQuery(document);if(o.scrollTop=a.scrollTop()-40,window.parent){var r=jQuery(window.parent.document);o.scrollHeight=r.find(".ngg_attach_to_post_window").height()-40}else o.scrollHeight=a.height();"undefined"!=typeof window.console&&console.log(o)}}return o}function is_visual_editor(){return 0==jQuery(top.document).find(".html-active:visible").length}function insert_into_editor(t,e){if(is_visual_editor()){var i=top.tinyMCE.activeEditor;i.selection.getNode().outerHTML.indexOf(e)>=0?jQuery(i.selection.getNode()).attr("data-shortcode",t.substring(1,t.length-1)):i.execCommand("mceInsertContent",!1,t),i.selection.collapse(!1)}else if(myField=top.document.getElementById("content"),myValue=t,document.selection)myField.focus(),sel=document.selection.createRange(),sel.text=myValue;else if(myField.selectionStart||"0"==myField.selectionStart){var o=myField.selectionStart,n=myField.selectionEnd;myField.value=myField.value.substring(0,o)+myValue+myField.value.substring(n,myField.value.length)}else myField.value+=myValue}this.id="ngg-attach_to_post",jQuery(function(t){t("#attach_to_post_tabs").ngg_tabs(),t(".accordion h3").bind("click",function(e){"preview_tab"==t(this).attr("id")&&t("#preview_area").trigger("opened")}),t(".accordion").accordion({clearStyle:!0,autoHeight:!1,heightStyle:"content"}),t(".ui-tabs-nav a").click(function(e){var i=e.target?e.target:e.srcElement;if(t(i).parent().hasClass("ui-state-active")){var o=t(i.hash+" iframe");o.length>0&&o[0].contentDocument.location!=o.attr("src")&&(o[0].contentDocument.location=o.attr("src"))}}),t(this).keydown(function(t){27==t.keyCode&&close_attach_to_post_window()}),t("body").css({position:"static",visibility:"visible"}).animate({opacity:1})});
products/photocrati_nextgen/modules/attach_to_post/static/base64.js ADDED
@@ -0,0 +1,205 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*
2
+ * $Id: base64.js,v 2.15 2014/04/05 12:58:57 dankogai Exp dankogai $
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
+
11
+ (function(global) {
12
+ 'use strict';
13
+ // existing version for noConflict()
14
+ var _Base64 = global.Base64;
15
+ var version = "2.1.9";
16
+ // if node.js, we use Buffer
17
+ var buffer;
18
+ if (typeof module !== 'undefined' && module.exports) {
19
+ try {
20
+ buffer = require('buffer').Buffer;
21
+ } catch (err) {}
22
+ }
23
+ // constants
24
+ var b64chars
25
+ = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
26
+ var b64tab = function(bin) {
27
+ var t = {};
28
+ for (var i = 0, l = bin.length; i < l; i++) t[bin.charAt(i)] = i;
29
+ return t;
30
+ }(b64chars);
31
+ var fromCharCode = String.fromCharCode;
32
+ // encoder stuff
33
+ var cb_utob = function(c) {
34
+ if (c.length < 2) {
35
+ var cc = c.charCodeAt(0);
36
+ return cc < 0x80 ? c
37
+ : cc < 0x800 ? (fromCharCode(0xc0 | (cc >>> 6))
38
+ + fromCharCode(0x80 | (cc & 0x3f)))
39
+ : (fromCharCode(0xe0 | ((cc >>> 12) & 0x0f))
40
+ + fromCharCode(0x80 | ((cc >>> 6) & 0x3f))
41
+ + fromCharCode(0x80 | ( cc & 0x3f)));
42
+ } else {
43
+ var cc = 0x10000
44
+ + (c.charCodeAt(0) - 0xD800) * 0x400
45
+ + (c.charCodeAt(1) - 0xDC00);
46
+ return (fromCharCode(0xf0 | ((cc >>> 18) & 0x07))
47
+ + fromCharCode(0x80 | ((cc >>> 12) & 0x3f))
48
+ + fromCharCode(0x80 | ((cc >>> 6) & 0x3f))
49
+ + fromCharCode(0x80 | ( cc & 0x3f)));
50
+ }
51
+ };
52
+ var re_utob = /[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g;
53
+ var utob = function(u) {
54
+ return u.replace(re_utob, cb_utob);
55
+ };
56
+ var cb_encode = function(ccc) {
57
+ var padlen = [0, 2, 1][ccc.length % 3],
58
+ ord = ccc.charCodeAt(0) << 16
59
+ | ((ccc.length > 1 ? ccc.charCodeAt(1) : 0) << 8)
60
+ | ((ccc.length > 2 ? ccc.charCodeAt(2) : 0)),
61
+ chars = [
62
+ b64chars.charAt( ord >>> 18),
63
+ b64chars.charAt((ord >>> 12) & 63),
64
+ padlen >= 2 ? '=' : b64chars.charAt((ord >>> 6) & 63),
65
+ padlen >= 1 ? '=' : b64chars.charAt(ord & 63)
66
+ ];
67
+ return chars.join('');
68
+ };
69
+ var btoa = global.btoa ? function(b) {
70
+ return global.btoa(b);
71
+ } : function(b) {
72
+ return b.replace(/[\s\S]{1,3}/g, cb_encode);
73
+ };
74
+ var _encode = buffer ? function (u) {
75
+ return (u.constructor === buffer.constructor ? u : new buffer(u))
76
+ .toString('base64')
77
+ }
78
+ : function (u) { return btoa(utob(u)) }
79
+ ;
80
+ var encode = function(u, urisafe) {
81
+ return !urisafe
82
+ ? _encode(String(u))
83
+ : _encode(String(u)).replace(/[+\/]/g, function(m0) {
84
+ return m0 == '+' ? '-' : '_';
85
+ }).replace(/=/g, '');
86
+ };
87
+ var encodeURI = function(u) { return encode(u, true) };
88
+ // decoder stuff
89
+ var re_btou = new RegExp([
90
+ '[\xC0-\xDF][\x80-\xBF]',
91
+ '[\xE0-\xEF][\x80-\xBF]{2}',
92
+ '[\xF0-\xF7][\x80-\xBF]{3}'
93
+ ].join('|'), 'g');
94
+ var cb_btou = function(cccc) {
95
+ switch(cccc.length) {
96
+ case 4:
97
+ var cp = ((0x07 & cccc.charCodeAt(0)) << 18)
98
+ | ((0x3f & cccc.charCodeAt(1)) << 12)
99
+ | ((0x3f & cccc.charCodeAt(2)) << 6)
100
+ | (0x3f & cccc.charCodeAt(3)),
101
+ offset = cp - 0x10000;
102
+ return (fromCharCode((offset >>> 10) + 0xD800)
103
+ + fromCharCode((offset & 0x3FF) + 0xDC00));
104
+ case 3:
105
+ return fromCharCode(
106
+ ((0x0f & cccc.charCodeAt(0)) << 12)
107
+ | ((0x3f & cccc.charCodeAt(1)) << 6)
108
+ | (0x3f & cccc.charCodeAt(2))
109
+ );
110
+ default:
111
+ return fromCharCode(
112
+ ((0x1f & cccc.charCodeAt(0)) << 6)
113
+ | (0x3f & cccc.charCodeAt(1))
114
+ );
115
+ }
116
+ };
117
+ var btou = function(b) {
118
+ return b.replace(re_btou, cb_btou);
119
+ };
120
+ var cb_decode = function(cccc) {
121
+ var len = cccc.length,
122
+ padlen = len % 4,
123
+ n = (len > 0 ? b64tab[cccc.charAt(0)] << 18 : 0)
124
+ | (len > 1 ? b64tab[cccc.charAt(1)] << 12 : 0)
125
+ | (len > 2 ? b64tab[cccc.charAt(2)] << 6 : 0)
126
+ | (len > 3 ? b64tab[cccc.charAt(3)] : 0),
127
+ chars = [
128
+ fromCharCode( n >>> 16),
129
+ fromCharCode((n >>> 8) & 0xff),
130
+ fromCharCode( n & 0xff)
131
+ ];
132
+ chars.length -= [0, 0, 2, 1][padlen];
133
+ return chars.join('');
134
+ };
135
+ var atob = global.atob ? function(a) {
136
+ return global.atob(a);
137
+ } : function(a){
138
+ return a.replace(/[\s\S]{1,4}/g, cb_decode);
139
+ };
140
+ var _decode = buffer ? function(a) {
141
+ return (a.constructor === buffer.constructor
142
+ ? a : new buffer(a, 'base64')).toString();
143
+ }
144
+ : function(a) { return btou(atob(a)) };
145
+ var decode = function(a){
146
+ return _decode(
147
+ String(a).replace(/[-_]/g, function(m0) { return m0 == '-' ? '+' : '/' })
148
+ .replace(/[^A-Za-z0-9\+\/]/g, '')
149
+ );
150
+ };
151
+ var noConflict = function() {
152
+ var Base64 = global.Base64;
153
+ global.Base64 = _Base64;
154
+ return Base64;
155
+ };
156
+ // export Base64
157
+ global.Base64 = {
158
+ VERSION: version,
159
+ atob: atob,
160
+ btoa: btoa,
161
+ fromBase64: decode,
162
+ toBase64: encode,
163
+ utob: utob,
164
+ encode: encode,
165
+ encodeURI: encodeURI,
166
+ btou: btou,
167
+ decode: decode,
168
+ noConflict: noConflict
169
+ };
170
+ // if ES5 is available, make Base64.extendString() available
171
+ if (typeof Object.defineProperty === 'function') {
172
+ var noEnum = function(v){
173
+ return {value:v,enumerable:false,writable:true,configurable:true};
174
+ };
175
+ global.Base64.extendString = function () {
176
+ Object.defineProperty(
177
+ String.prototype, 'fromBase64', noEnum(function () {
178
+ return decode(this)
179
+ }));
180
+ Object.defineProperty(
181
+ String.prototype, 'toBase64', noEnum(function (urisafe) {
182
+ return encode(this, urisafe)
183
+ }));
184
+ Object.defineProperty(
185
+ String.prototype, 'toBase64URI', noEnum(function () {
186
+ return encode(this, true)
187
+ }));
188
+ };
189
+ }
190
+ // that's it!
191
+ if (global['Meteor']) {
192
+ Base64 = global.Base64; // for normal export in Meteor.js
193
+ }
194
+ if (typeof module !== 'undefined' && module.exports) {
195
+ module.exports.Base64 = global.Base64;
196
+ }
197
+ if (typeof define === 'function' && define.amd) {
198
+ // AMD. Register as an anonymous module.
199
+ define([], function(){ return global.Base64 });
200
+ }
201
+ })(typeof self !== 'undefined' ? self
202
+ : typeof window !== 'undefined' ? window
203
+ : typeof global !== 'undefined' ? global
204
+ : this
205
+ );
products/photocrati_nextgen/modules/attach_to_post/static/base64.min.js ADDED
@@ -0,0 +1 @@
 
1
+ !function(e){"use strict";var t,r=e.Base64,n="2.1.9";if("undefined"!=typeof module&&module.exports)try{t=require("buffer").Buffer}catch(e){}var o="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",u=function(e){for(var t={},r=0,n=e.length;r<n;r++)t[e.charAt(r)]=r;return t}(o),c=String.fromCharCode,a=function(e){if(e.length<2){var t=e.charCodeAt(0);return t<128?e:t<2048?c(192|t>>>6)+c(128|63&t):c(224|t>>>12&15)+c(128|t>>>6&63)+c(128|63&t)}var t=65536+1024*(e.charCodeAt(0)-55296)+(e.charCodeAt(1)-56320);return c(240|t>>>18&7)+c(128|t>>>12&63)+c(128|t>>>6&63)+c(128|63&t)},i=/[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g,f=function(e){return e.replace(i,a)},d=function(e){var t=[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),n=[o.charAt(r>>>18),o.charAt(r>>>12&63),t>=2?"=":o.charAt(r>>>6&63),t>=1?"=":o.charAt(63&r)];return n.join("")},h=e.btoa?function(t){return e.btoa(t)}:function(e){return e.replace(/[\s\S]{1,3}/g,d)},s=t?function(e){return(e.constructor===t.constructor?e:new t(e)).toString("base64")}:function(e){return h(f(e))},l=function(e,t){return t?s(String(e)).replace(/[+\/]/g,function(e){return"+"==e?"-":"_"}).replace(/=/g,""):s(String(e))},g=function(e){return l(e,!0)},p=new RegExp(["[À-ß][€-¿]","[à-ï][€-¿]{2}","[ð-÷][€-¿]{3}"].join("|"),"g"),A=function(e){switch(e.length){case 4:var t=(7&e.charCodeAt(0))<<18|(63&e.charCodeAt(1))<<12|(63&e.charCodeAt(2))<<6|63&e.charCodeAt(3),r=t-65536;return c((r>>>10)+55296)+c((1023&r)+56320);case 3:return c((15&e.charCodeAt(0))<<12|(63&e.charCodeAt(1))<<6|63&e.charCodeAt(2));default:return c((31&e.charCodeAt(0))<<6|63&e.charCodeAt(1))}},b=function(e){return e.replace(p,A)},C=function(e){var t=e.length,r=t%4,n=(t>0?u[e.charAt(0)]<<18:0)|(t>1?u[e.charAt(1)]<<12:0)|(t>2?u[e.charAt(2)]<<6:0)|(t>3?u[e.charAt(3)]:0),o=[c(n>>>16),c(n>>>8&255),c(255&n)];return o.length-=[0,0,2,1][r],o.join("")},B=e.atob?function(t){return e.atob(t)}:function(e){return e.replace(/[\s\S]{1,4}/g,C)},y=t?function(e){return(e.constructor===t.constructor?e:new t(e,"base64")).toString()}:function(e){return b(B(e))},S=function(e){return y(String(e).replace(/[-_]/g,function(e){return"-"==e?"+":"/"}).replace(/[^A-Za-z0-9\+\/]/g,""))},v=function(){var t=e.Base64;return e.Base64=r,t};if(e.Base64={VERSION:n,atob:B,btoa:h,fromBase64:S,toBase64:l,utob:f,encode:l,encodeURI:g,btou:b,decode:S,noConflict:v},"function"==typeof Object.defineProperty){var m=function(e){return{value:e,enumerable:!1,writable:!0,configurable:!0}};e.Base64.extendString=function(){Object.defineProperty(String.prototype,"fromBase64",m(function(){return S(this)})),Object.defineProperty(String.prototype,"toBase64",m(function(e){return l(this,e)})),Object.defineProperty(String.prototype,"toBase64URI",m(function(){return l(this,!0)}))}}e.Meteor&&(Base64=e.Base64),"undefined"!=typeof module&&module.exports&&(module.exports.Base64=e.Base64),"function"==typeof define&&define.amd&&define([],function(){return e.Base64})}("undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:this);
products/photocrati_nextgen/modules/attach_to_post/static/ngg_attach_to_post_tinymce_plugin.js CHANGED
@@ -93,7 +93,7 @@
93
  window.igw_shortcode= $(e.target).parents('.nggPlaceholder').data('shortcode');
94
  self.render_attach_to_post_interface({
95
  key: 'shortcode',
96
- val: btoa(window.igw_shortcode),
97
  ref: $(e.target).parents('.nggPlaceholder').attr('id')
98
  });
99
  }
@@ -158,19 +158,18 @@
158
  }
159
  });
160
 
161
- /**
162
- * Whenever a request is made to fetch the content of the editor, substitute the IGW placeholders
163
- * with the corresponding shortcode
164
- */
165
- editor.on('GetContent', function(event){
166
- var $content = $('<div/>').append(event.content);
167
- $content.find('.nggPlaceholder').toArray().forEach(function(placeholder){
168
- var $placeholder = $(placeholder);
169
- var shortcode = $placeholder.data('shortcode');
170
- shortcode = '[' + _.unescape(shortcode) + ']';
171
- $placeholder.replaceWith(shortcode);
172
- });
173
- event.content = $content.html();
174
  });
175
  },
176
 
93
  window.igw_shortcode= $(e.target).parents('.nggPlaceholder').data('shortcode');
94
  self.render_attach_to_post_interface({
95
  key: 'shortcode',
96
+ val: Base64.encode(window.igw_shortcode),
97
  ref: $(e.target).parents('.nggPlaceholder').attr('id')
98
  });
99
  }
158
  }
159
  });
160
 
161
+ /**
162
+ * Substitutes the IGW placeholders with the corresponding shortcode
163
+ */
164
+ editor.on('PostProcess', function(event) {
165
+ var $content = $('<div/>').append(event.content);
166
+ $content.find('.nggPlaceholder').toArray().forEach(function(placeholder){
167
+ var $placeholder = $(placeholder);
168
+ var shortcode = $placeholder.data('shortcode');
169
+ shortcode = "<p>[" + _.unescape(shortcode) + "]</p>";
170
+ $placeholder.replaceWith(shortcode);
171
+ });
172
+ event.content = $content.html();
 
173
  });
174
  },
175
 
products/photocrati_nextgen/modules/attach_to_post/static/ngg_attach_to_post_tinymce_plugin.min.js CHANGED
@@ -1 +1 @@
1
- !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){var o=this;t.windowManager.nggOldOpen=t.windowManager.open,t.windowManager.open=function(e,n){var a=t.windowManager.nggOldOpen(e,n);return a.on("close",o.wm_close_event),a},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+"/atp_button.png"}),t.on("mouseup",function(n){if(tinymce.extend(o,{editor:t,plugin:t.plugins.NextGEN_AttachToPost}),"IMG"==n.target.tagName){if(o.get_class_name(n.target).indexOf("ngg_displayed_gallery")>=0){t.dom.events.cancel(n);var a=n.target.src.match(/\d+$/);a&&(a=a.pop()),o.render_attach_to_post_interface({key:"id",val:a})}}else{var r=e(n.target);r.parents(".nggPlaceholderButton")&&(r=r.parents(".nggPlaceholderButton")),r.hasClass("nggPlaceholderButton")&&(r.hasClass("nggIgwRemove")?r.parents(".nggPlaceholder").remove():(window.igw_shortcode=e(n.target).parents(".nggPlaceholder").data("shortcode"),o.render_attach_to_post_interface({key:"shortcode",val:btoa(window.igw_shortcode),ref:e(n.target).parents(".nggPlaceholder").attr("id")})))}}),t.on("BeforeSetContent",function(t){for(var n="[ngg_images ";t.content.indexOf(n)>=0;){for(var o=t.content.indexOf(n),a=o+n.length,r=!1,i=null,g=!1,l=t.content.length;;){var c=t.content[a];if('"'==c||"'"==c&&"="==g)r&&i==c?(r=!1,i=null):(r=!0,i=c);else if("]"==c&&!r)break;if(g=c,a==l)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()})))}}),t.on("GetContent",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.html()})},get_class_name:function(t){var e=t.getAttribute("class")?t.getAttribute("class"):t.className;return e?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=nextgen_gallery_attach_to_post_url;"undefined"!=typeof t&&(n+="&"+t.key+"="+encodeURIComponent(t.val),"undefined"!=typeof t.ref&&(n+="&ref="+encodeURIComponent(t.ref)));for(var o=window;null!=o.parent&&o.parent!=o;)o=o.parent;o=e(o);var a=o.width(),r=o.height(),i=1200,g=600,l=800,c=600,s=a-.05*a,d=r-.05*r;s<l&&(s=a-10),d<c&&(d=r-10),i>s&&(i=s),g>d&&(g=d),this.editor.windowManager.open({url:n,id:"ngg_attach_to_post_dialog",width:i,height:g,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);
1
+ !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){var o=this;t.windowManager.nggOldOpen=t.windowManager.open,t.windowManager.open=function(e,n){var a=t.windowManager.nggOldOpen(e,n);return a.on("close",o.wm_close_event),a},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+"/atp_button.png"}),t.on("mouseup",function(n){if(tinymce.extend(o,{editor:t,plugin:t.plugins.NextGEN_AttachToPost}),"IMG"==n.target.tagName){if(o.get_class_name(n.target).indexOf("ngg_displayed_gallery")>=0){t.dom.events.cancel(n);var a=n.target.src.match(/\d+$/);a&&(a=a.pop()),o.render_attach_to_post_interface({key:"id",val:a})}}else{var r=e(n.target);r.parents(".nggPlaceholderButton")&&(r=r.parents(".nggPlaceholderButton")),r.hasClass("nggPlaceholderButton")&&(r.hasClass("nggIgwRemove")?r.parents(".nggPlaceholder").remove():(window.igw_shortcode=e(n.target).parents(".nggPlaceholder").data("shortcode"),o.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){for(var n="[ngg_images ";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 p=_.template(e("#ngg-igw-placeholder").html());t.content=t.content.replace(s,p(e.extend(ngg_igw_i18n,{shortcode:d,ref:_.now()})))}}),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="<p>["+_.unescape(o)+"]</p>",n.replaceWith(o)}),t.content=n.html()})},get_class_name:function(t){var e=t.getAttribute("class")?t.getAttribute("class"):t.className;return e?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=nextgen_gallery_attach_to_post_url;"undefined"!=typeof t&&(n+="&"+t.key+"="+encodeURIComponent(t.val),"undefined"!=typeof t.ref&&(n+="&ref="+encodeURIComponent(t.ref)));for(var o=window;null!=o.parent&&o.parent!=o;)o=o.parent;o=e(o);var a=o.width(),r=o.height(),i=1200,c=600,g=800,l=600,s=a-.05*a,d=r-.05*r;s<g&&(s=a-10),d<l&&(d=r-10),i>s&&(i=s),c>d&&(c=d),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);
products/photocrati_nextgen/modules/i18n/module.i18n.php CHANGED
@@ -20,7 +20,7 @@ class M_I18N extends C_Base_Module
20
  'photocrati-i18n',
21
  'Internationalization',
22
  "Adds I18N resources and methods",
23
- '0.3',
24
  'https://www.imagely.com/languages/',
25
  'Imagely',
26
  'https://www.imagely.com'
@@ -335,6 +335,26 @@ class M_I18N extends C_Base_Module
335
  return str_replace($separator, "", $base);
336
  }
337
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
338
  function get_type_list()
339
  {
340
  return array(
20
  'photocrati-i18n',
21
  'Internationalization',
22
  "Adds I18N resources and methods",
23
+ '0.4',
24
  'https://www.imagely.com/languages/',
25
  'Imagely',
26
  'https://www.imagely.com'
335
  return str_replace($separator, "", $base);
336
  }
337
 
338
+ static public function get_kses_allowed_html()
339
+ {
340
+ global $allowedtags;
341
+
342
+ $our_keys = array(
343
+ 'a' => array('href' => array(),
344
+ 'class' => array(),
345
+ 'title' => array()),
346
+ 'br' => array(),
347
+ 'em' => array(),
348
+ 'strong' => array(),
349
+ 'u' => array(),
350
+ 'p' => array('class' => array()),
351
+ 'div' => array('class' => array(), 'id' => array()),
352
+ 'span' => array('class' => array(), 'id' => array())
353
+ );
354
+
355
+ return array_merge_recursive($allowedtags, $our_keys);
356
+ }
357
+
358
  function get_type_list()
359
  {
360
  return array(
products/photocrati_nextgen/modules/lightbox/static/fancybox/nextgen_fancybox_init.js CHANGED
@@ -10,6 +10,6 @@ jQuery(function($) {
10
  }
11
  });
12
  };
13
- $(this).bind('refreshed', nextgen_fancybox_init);
14
  nextgen_fancybox_init();
15
  });
10
  }
11
  });
12
  };
13
+ $(window).bind('refreshed', nextgen_fancybox_init);
14
  nextgen_fancybox_init();
15
  });
products/photocrati_nextgen/modules/lightbox/static/fancybox/nextgen_fancybox_init.min.js CHANGED
@@ -1 +1 @@
1
- jQuery(function(n){var e=function(){var e=nextgen_lightbox_filter_selector(n,n(".ngg-fancybox"));e.fancybox({titlePosition:"inside",onComplete:function(){n("#fancybox-wrap").css("z-index",1e4)}})};n(this).bind("refreshed",e),e()});
1
+ jQuery(function(n){var e=function(){var e=nextgen_lightbox_filter_selector(n,n(".ngg-fancybox"));e.fancybox({titlePosition:"inside",onComplete:function(){n("#fancybox-wrap").css("z-index",1e4)}})};n(window).bind("refreshed",e),e()});
products/photocrati_nextgen/modules/nextgen_basic_album/package.module.nextgen_basic_album.php CHANGED
@@ -62,6 +62,11 @@ class A_NextGen_Album_Breadcrumbs extends Mixin
62
  } else {
63
  $ids = $displayed_gallery->container_ids;
64
  }
 
 
 
 
 
65
  if (!empty($ds['original_album_entities'])) {
66
  $breadcrumb_entities = $ds['original_album_entities'];
67
  } else {
@@ -827,7 +832,14 @@ class Mixin_NextGen_Basic_Album_Form extends Mixin_Display_Type_Form
827
  function _render_nextgen_basic_album_gallery_display_type_field($display_type)
828
  {
829
  $mapper = C_Display_Type_Mapper::get_instance();
830
- return $this->render_partial('photocrati-nextgen_basic_album#nextgen_basic_album_gallery_display_type', array('display_type_name' => $display_type->name, 'gallery_display_type_label' => __('Display galleries as', 'nggallery'), 'gallery_display_type_help' => __('How would you like galleries to be displayed?', 'nggallery'), 'gallery_display_type' => $display_type->settings['gallery_display_type'], 'galleries_per_page_label' => __('Galleries per page', 'nggallery'), 'galleries_per_page' => $display_type->settings['galleries_per_page'], 'display_types' => $mapper->find_by_entity_type('image')), TRUE);
 
 
 
 
 
 
 
831
  }
832
  /**
833
  * Renders the Galleries Per Page field
62
  } else {
63
  $ids = $displayed_gallery->container_ids;
64
  }
65
+ // Prevent galleries with the same ID as the parent album being displayed as the root
66
+ // breadcrumb when viewing the album page
67
+ if (count($ids) == 1 && strpos($ids[0], 'a') !== 0) {
68
+ $ids = array();
69
+ }
70
  if (!empty($ds['original_album_entities'])) {
71
  $breadcrumb_entities = $ds['original_album_entities'];
72
  } else {
832
  function _render_nextgen_basic_album_gallery_display_type_field($display_type)
833
  {
834
  $mapper = C_Display_Type_Mapper::get_instance();
835
+ // Disallow hidden or inactive display types
836
+ $types = $mapper->find_by_entity_type('image');
837
+ foreach ($types as $ndx => $type) {
838
+ if (!empty($type->hidden_from_ui) && $type->hidden_from_ui) {
839
+ unset($types[$ndx]);
840
+ }
841
+ }
842
+ return $this->render_partial('photocrati-nextgen_basic_album#nextgen_basic_album_gallery_display_type', array('display_type_name' => $display_type->name, 'gallery_display_type_label' => __('Display galleries as', 'nggallery'), 'gallery_display_type_help' => __('How would you like galleries to be displayed?', 'nggallery'), 'gallery_display_type' => $display_type->settings['gallery_display_type'], 'galleries_per_page_label' => __('Galleries per page', 'nggallery'), 'galleries_per_page' => $display_type->settings['galleries_per_page'], 'display_types' => $types), TRUE);
843
  }
844
  /**
845
  * Renders the Galleries Per Page field
products/photocrati_nextgen/modules/nextgen_basic_album/templates/breadcrumbs.php CHANGED
@@ -5,9 +5,9 @@
5
  foreach ($breadcrumbs as $crumb) { ?>
6
  <li class="ngg-breadcrumb">
7
  <?php if (!is_null($crumb['url'])) { ?>
8
- <a href="<?php echo $crumb['url']; ?>"><?php esc_html_e($crumb['name']); ?></a>
9
  <?php } else { ?>
10
- <?php esc_html_e($crumb['name']); ?>
11
  <?php } ?>
12
  <?php if ($crumb !== $end) { ?>
13
  <span class="ngg-breadcrumb-divisor"><?php echo $divisor; ?></span>
5
  foreach ($breadcrumbs as $crumb) { ?>
6
  <li class="ngg-breadcrumb">
7
  <?php if (!is_null($crumb['url'])) { ?>
8
+ <a href="<?php echo $crumb['url']; ?>"><?php print wp_kses($crumb['name'], M_I18N::get_kses_allowed_html()); ?></a>
9
  <?php } else { ?>
10
+ <?php print wp_kses($crumb['name'], M_I18N::get_kses_allowed_html()); ?>
11
  <?php } ?>
12
  <?php if ($crumb !== $end) { ?>
13
  <span class="ngg-breadcrumb-divisor"><?php echo $divisor; ?></span>
products/photocrati_nextgen/modules/nextgen_basic_album/templates/compact.php CHANGED
@@ -34,7 +34,7 @@
34
  $max_width = '';
35
  } ?>
36
  <h4>
37
- <a class='ngg-album-desc' <?php echo $anchor; echo $max_width; ?>><?php echo_safe_html($gallery->title); ?></a>
38
  </h4>
39
  <p class="ngg-album-gallery-image-counter">
40
  <?php if (isset($gallery->counter) && $gallery->counter > 0) { ?>
34
  $max_width = '';
35
  } ?>
36
  <h4>
37
+ <a class='ngg-album-desc' <?php echo $anchor; echo $max_width; ?>><?php print wp_kses($gallery->title, M_I18N::get_kses_allowed_html()); ?></a>
38
  </h4>
39
  <p class="ngg-album-gallery-image-counter">
40
  <?php if (isset($gallery->counter) && $gallery->counter > 0) { ?>
products/photocrati_nextgen/modules/nextgen_basic_album/templates/descriptions.php CHANGED
@@ -1,3 +1,3 @@
1
  <?php if (!empty($description)) { ?>
2
- <p><?php echo $description; ?></p>
3
  <?php } ?>
1
  <?php if (!empty($description)) { ?>
2
+ <p><?php print wp_kses($description, M_I18N::get_kses_allowed_html()); ?></p>
3
  <?php } ?>
products/photocrati_nextgen/modules/nextgen_basic_album/templates/extended.php CHANGED
@@ -15,7 +15,7 @@
15
  } ?>
16
  <div class="ngg-album">
17
  <div class="ngg-albumtitle">
18
- <a <?php echo $anchor; ?>><?php echo_safe_html($gallery->title); ?></a>
19
  </div>
20
  <div class="ngg-albumcontent">
21
  <div class="ngg-thumbnail">
@@ -26,7 +26,7 @@
26
  </a>
27
  </div>
28
  <div class="ngg-description">
29
- <p><?php echo_safe_html($gallery->galdesc); ?></p>
30
  <?php if (isset($gallery->counter) && $gallery->counter > 0) { ?>
31
  <p class="ngg-album-gallery-image-counter"><strong><?php echo $gallery->counter; ?></strong>&nbsp;<?php _e('Photos', 'nggallery'); ?></p>
32
  <?php } ?>
15
  } ?>
16
  <div class="ngg-album">
17
  <div class="ngg-albumtitle">
18
+ <a <?php echo $anchor; ?>><?php print wp_kses($gallery->title, M_I18N::get_kses_allowed_html()); ?></a>
19
  </div>
20
  <div class="ngg-albumcontent">
21
  <div class="ngg-thumbnail">
26
  </a>
27
  </div>
28
  <div class="ngg-description">
29
+ <p><?php print wp_kses($gallery->galdesc, M_I18N::get_kses_allowed_html()); ?></p>
30
  <?php if (isset($gallery->counter) && $gallery->counter > 0) { ?>
31
  <p class="ngg-album-gallery-image-counter"><strong><?php echo $gallery->counter; ?></strong>&nbsp;<?php _e('Photos', 'nggallery'); ?></p>
32
  <?php } ?>
products/photocrati_nextgen/modules/nextgen_basic_gallery/package.module.nextgen_basic_gallery.php CHANGED
@@ -42,8 +42,8 @@ class A_NextGen_Basic_Gallery_Controller extends Mixin
42
  */
43
  function get_url_for_alternate_display_type($displayed_gallery, $display_type, $origin_url = FALSE)
44
  {
45
- if (!$origin_url && !empty($displayed_gallery->display_settings['original_display_type']) && !empty($_SERVER['ORIG_REQUEST_URI'])) {
46
- $origin_url = $_SERVER['ORIG_REQUEST_URI'];
47
  }
48
  $url = $origin_url ? $origin_url : $this->object->get_routed_url(TRUE);
49
  $url = $this->object->remove_param_for($url, 'show', $displayed_gallery->id());
@@ -244,9 +244,8 @@ class A_NextGen_Basic_Slideshow_Controller extends Mixin
244
  $gallery_height = $displayed_gallery->display_settings['gallery_height'];
245
  $params['aspect_ratio'] = $gallery_width / $gallery_height;
246
  $params['placeholder'] = $this->object->get_static_url('photocrati-nextgen_basic_gallery#slideshow/placeholder.gif');
247
- // There was a problem with the slideFX/cycle_effect parameter not getting set
248
- // correctly in previous versions
249
- if (!isset($params['display_settings']['cycle_effect']) or !$params['cycle_effect']) {
250
  $params['cycle_effect'] = 'fade';
251
  }
252
  // Are we to generate a thumbnail link?
@@ -516,15 +515,13 @@ class A_NextGen_Basic_Thumbnails_Controller extends Mixin
516
  }
517
  // This setting 1) points all images to an imagebrowser display & 2) disables the lightbox effect
518
  if ($display_settings['use_imagebrowser_effect']) {
519
- // // this hook *MUST* be removed later; it should not apply to galleries that may come after this one!
520
- // $storage->add_post_hook(
521
- // 'get_image_url',
522
- // 'imagebrowser alternate url replacer',
523
- // 'Hook_NextGen_Basic_Imagebrowser_Alt_URLs',
524
- // 'get_image_url'
525
- // );
526
- // $effect_code = '';
527
- $effect_code = "class='use_imagebrowser_effect'";
528
  } else {
529
  $effect_code = $this->object->get_effect_code($displayed_gallery);
530
  }
@@ -577,4 +574,22 @@ class A_NextGen_Basic_Thumbnails_Controller extends Mixin
577
  {
578
  return $this->object->get_static_url('photocrati-nextgen_basic_gallery#thumbnails/nextgen_basic_thumbnails.js');
579
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
580
  }
42
  */
43
  function get_url_for_alternate_display_type($displayed_gallery, $display_type, $origin_url = FALSE)
44
  {
45
+ if (!$origin_url && !empty($displayed_gallery->display_settings['original_display_type']) && !empty($_SERVER['NGG_ORIG_REQUEST_URI'])) {
46
+ $origin_url = $_SERVER['NGG_ORIG_REQUEST_URI'];
47
  }
48
  $url = $origin_url ? $origin_url : $this->object->get_routed_url(TRUE);
49
  $url = $this->object->remove_param_for($url, 'show', $displayed_gallery->id());
244
  $gallery_height = $displayed_gallery->display_settings['gallery_height'];
245
  $params['aspect_ratio'] = $gallery_width / $gallery_height;
246
  $params['placeholder'] = $this->object->get_static_url('photocrati-nextgen_basic_gallery#slideshow/placeholder.gif');
247
+ // This was not set correctly in previous versions
248
+ if (empty($params['cycle_effect'])) {
 
249
  $params['cycle_effect'] = 'fade';
250
  }
251
  // Are we to generate a thumbnail link?
515
  }
516
  // This setting 1) points all images to an imagebrowser display & 2) disables the lightbox effect
517
  if ($display_settings['use_imagebrowser_effect']) {
518
+ if (!empty($displayed_gallery->display_settings['original_display_type']) && !empty($_SERVER['NGG_ORIG_REQUEST_URI'])) {
519
+ $origin_url = $_SERVER['NGG_ORIG_REQUEST_URI'];
520
+ }
521
+ $url = !empty($origin_url) ? $origin_url : $this->object->get_routed_url(TRUE);
522
+ $url = $this->object->remove_param_for($url, 'image');
523
+ $url = $this->object->set_param_for($url, 'image', '%STUB%', NULL, FALSE);
524
+ $effect_code = "class='use_imagebrowser_effect' data-imagebrowser-url='{$url}'";
 
 
525
  } else {
526
  $effect_code = $this->object->get_effect_code($displayed_gallery);
527
  }
574
  {
575
  return $this->object->get_static_url('photocrati-nextgen_basic_gallery#thumbnails/nextgen_basic_thumbnails.js');
576
  }
577
+ /**
578
+ * Override to the MVC method, allows the above imagebrowser-url to return as image/23 instead of image--23
579
+ *
580
+ * @param $url
581
+ * @param $key
582
+ * @param $value
583
+ * @param null $id
584
+ * @param bool $use_prefix
585
+ * @return string
586
+ */
587
+ function set_param_for($url, $key, $value, $id = NULL, $use_prefix = FALSE)
588
+ {
589
+ $retval = $this->call_parent('set_param_for', $url, $key, $value, $id, $use_prefix);
590
+ while (preg_match("#(image)--([^/]+)#", $retval, $matches)) {
591
+ $retval = str_replace($matches[0], $matches[1] . '/' . $matches[2], $retval);
592
+ }
593
+ return $retval;
594
+ }
595
  }
products/photocrati_nextgen/modules/nextgen_basic_gallery/static/thumbnails/nextgen_basic_thumbnails.js CHANGED
@@ -7,10 +7,11 @@ jQuery(function($) {
7
  var $this = $(this);
8
  var image_id = $this.attr('data-image-id');
9
  var image_slug = $this.attr('data-image-slug');
 
10
 
11
  var url = window.location.toString();
12
  url = url.split('/' + photocrati_ajax.ngg_param_slug + '/').shift();
13
- if (url.substr(-1) == '/')
14
  url = url.substr(0, url.length - 1);
15
 
16
  image_id = image_slug ? image_slug : image_id;
@@ -22,6 +23,10 @@ jQuery(function($) {
22
  }
23
 
24
  if (success) {
 
 
 
 
25
  // Custom permalinks are disabled. So we have to redirect to /index.php/nggallery/image/n?qs=1
26
  if (photocrati_ajax.wp_root_url.indexOf('index.php') >= 0) {
27
  url = photocrati_ajax.wp_root_url + "/" + photocrati_ajax.ngg_param_slug + "/image/" + image_id;
@@ -29,8 +34,9 @@ jQuery(function($) {
29
  url += '?'+window.location.toString().split('?').pop();
30
  } else {
31
  // Just append the slug
32
- url += "/"+photocrati_ajax.ngg_param_slug+"/image/"+image_id;
33
- }
 
34
  window.location = url;
35
  }
36
  });
7
  var $this = $(this);
8
  var image_id = $this.attr('data-image-id');
9
  var image_slug = $this.attr('data-image-slug');
10
+ var image_url = $this.attr('data-imagebrowser-url');
11
 
12
  var url = window.location.toString();
13
  url = url.split('/' + photocrati_ajax.ngg_param_slug + '/').shift();
14
+ if (url.substr(-1) === '/')
15
  url = url.substr(0, url.length - 1);
16
 
17
  image_id = image_slug ? image_slug : image_id;
23
  }
24
 
25
  if (success) {
26
+
27
+ url = image_url.replace('%STUB%', image_id);
28
+
29
+ /* TODO: Remove this entire chunk. It should be unecessary.
30
  // Custom permalinks are disabled. So we have to redirect to /index.php/nggallery/image/n?qs=1
31
  if (photocrati_ajax.wp_root_url.indexOf('index.php') >= 0) {
32
  url = photocrati_ajax.wp_root_url + "/" + photocrati_ajax.ngg_param_slug + "/image/" + image_id;
34
  url += '?'+window.location.toString().split('?').pop();
35
  } else {
36
  // Just append the slug
37
+ url += "/" + photocrati_ajax.ngg_param_slug + "/image/" + image_id;
38
+ } */
39
+
40
  window.location = url;
41
  }
42
  });
products/photocrati_nextgen/modules/nextgen_basic_gallery/static/thumbnails/nextgen_basic_thumbnails.min.js CHANGED
@@ -1 +1 @@
1
- jQuery(function(t){var a=function(){var a=t("a.use_imagebrowser_effect");a.click(function(a){a.preventDefault();var i=!0,o=t(this),n=o.attr("data-image-id"),r=o.attr("data-image-slug"),e=window.location.toString();e=e.split("/"+photocrati_ajax.ngg_param_slug+"/").shift(),"/"==e.substr(-1)&&(e=e.substr(0,e.length-1)),n=r?r:n;try{n||(n=parseInt(o.parents(".ngg-gallery-thumbnail-box").attr("id").match(/\d+/).join("")))}catch(t){i=!1}i&&(photocrati_ajax.wp_root_url.indexOf("index.php")>=0?(e=photocrati_ajax.wp_root_url+"/"+photocrati_ajax.ngg_param_slug+"/image/"+n,window.location.toString().indexOf("?")>=0&&(e+="?"+window.location.toString().split("?").pop())):e+="/"+photocrati_ajax.ngg_param_slug+"/image/"+n,window.location=e)}),a.length>0&&setTimeout(function(){a.each(function(){this.onclick=null})},200)};t(this).bind("refreshed",a),a()});
1
+ jQuery(function(t){var a=function(){var a=t("a.use_imagebrowser_effect");a.click(function(a){a.preventDefault();var i=!0,n=t(this),e=n.attr("data-image-id"),r=n.attr("data-image-slug"),o=n.attr("data-imagebrowser-url"),c=window.location.toString();c=c.split("/"+photocrati_ajax.ngg_param_slug+"/").shift(),"/"===c.substr(-1)&&(c=c.substr(0,c.length-1)),e=r?r:e;try{e||(e=parseInt(n.parents(".ngg-gallery-thumbnail-box").attr("id").match(/\d+/).join("")))}catch(t){i=!1}i&&(c=o.replace("%STUB%",e),window.location=c)}),a.length>0&&setTimeout(function(){a.each(function(){this.onclick=null})},200)};t(this).bind("refreshed",a),a()});
products/photocrati_nextgen/modules/nextgen_basic_gallery/templates/thumbnails/index.php CHANGED
@@ -48,6 +48,7 @@ $this->start_element('nextgen_gallery.gallery_container', 'container', $displaye
48
  data-image-id="<?php echo esc_attr($image->{$image->id_field}); ?>"
49
  data-title="<?php echo esc_attr($image->alttext); ?>"
50
  data-description="<?php echo esc_attr(stripslashes($image->description)); ?>"
 
51
  <?php echo $effect_code ?>>
52
  <img
53
  title="<?php echo esc_attr($image->alttext)?>"
48
  data-image-id="<?php echo esc_attr($image->{$image->id_field}); ?>"
49
  data-title="<?php echo esc_attr($image->alttext); ?>"
50
  data-description="<?php echo esc_attr(stripslashes($image->description)); ?>"
51
+ data-image-slug="<?php echo esc_attr($image->image_slug); ?>"
52
  <?php echo $effect_code ?>>
53
  <img
54
  title="<?php echo esc_attr($image->alttext)?>"
products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/templates/imagebrowser-simple-template.php CHANGED
@@ -56,7 +56,7 @@
56
 
57
  <div class='ngg-imagebrowser-desc'>
58
  <p>
59
- <?php echo $image->description; ?>
60
  </p>
61
  </div>
62
 
56
 
57
  <div class='ngg-imagebrowser-desc'>
58
  <p>
59
+ <?php print wp_kses($image->description, M_I18N::get_kses_allowed_html()); ?>
60
  </p>
61
  </div>
62
 
products/photocrati_nextgen/modules/nextgen_basic_tagcloud/module.nextgen_basic_tagcloud.php CHANGED
@@ -104,7 +104,8 @@ class M_NextGen_Basic_Tagcloud extends C_Base_Module
104
  'the_posts',
105
  array(
106
  C_Taxonomy_Controller::get_instance(),
107
- 'detect_ngg_tag'),
 
108
  -10,
109
  2
110
  );
104
  'the_posts',
105
  array(
106
  C_Taxonomy_Controller::get_instance(),
107
+ 'detect_ngg_tag'
108
+ ),
109
  -10,
110
  2
111
  );
products/photocrati_nextgen/modules/nextgen_basic_tagcloud/package.module.nextgen_basic_tagcloud.php CHANGED
@@ -104,8 +104,8 @@ class A_NextGen_Basic_Tagcloud_Form extends Mixin_Display_Type_Form
104
  {
105
  $types = array();
106
  $skip_types = array(NGG_BASIC_TAGCLOUD, NGG_BASIC_SINGLEPIC, NGG_BASIC_COMPACT_ALBUM, NGG_BASIC_EXTENDED_ALBUM);
107
- if (!isset($display_type->settings['gallery_type'])) {
108
- $display_type->settings['gallery_display_type'] = isset($display_type->settings['display_type']) ? $display_type->settings['display_type'] : '';
109
  }
110
  $skip_types = apply_filters('ngg_basic_tagcloud_excluded_display_types', $skip_types);
111
  $mapper = C_Display_Type_Mapper::get_instance();
@@ -114,6 +114,9 @@ class A_NextGen_Basic_Tagcloud_Form extends Mixin_Display_Type_Form
114
  if (in_array($dt->name, $skip_types)) {
115
  continue;
116
  }
 
 
 
117
  $types[$dt->name] = $dt->title;
118
  }
119
  return $this->_render_select_field($display_type, 'gallery_display_type', __('Display type', 'nggallery'), $types, $display_type->settings['gallery_display_type'], __('The display type that the tagcloud will point its results to', 'nggallery'));
@@ -267,6 +270,8 @@ class C_Taxonomy_Controller extends C_MVC_Controller
267
  }
268
  if ($wp_query_orig !== false) {
269
  $wp_query = $wp_query_orig;
 
 
270
  }
271
  return $posts;
272
  }
104
  {
105
  $types = array();
106
  $skip_types = array(NGG_BASIC_TAGCLOUD, NGG_BASIC_SINGLEPIC, NGG_BASIC_COMPACT_ALBUM, NGG_BASIC_EXTENDED_ALBUM);
107
+ if (empty($display_type->settings['gallery_display_type']) && !empty($display_type->settings['gallery_type'])) {
108
+ $display_type->settings['gallery_display_type'] = $display_type->settings['display_type'];
109
  }
110
  $skip_types = apply_filters('ngg_basic_tagcloud_excluded_display_types', $skip_types);
111
  $mapper = C_Display_Type_Mapper::get_instance();
114
  if (in_array($dt->name, $skip_types)) {
115
  continue;
116
  }
117
+ if (!empty($dt->hidden_from_ui)) {
118
+ continue;
119
+ }
120
  $types[$dt->name] = $dt->title;
121
  }
122
  return $this->_render_select_field($display_type, 'gallery_display_type', __('Display type', 'nggallery'), $types, $display_type->settings['gallery_display_type'], __('The display type that the tagcloud will point its results to', 'nggallery'));
270
  }
271
  if ($wp_query_orig !== false) {
272
  $wp_query = $wp_query_orig;
273
+ $wp_query->is_page = FALSE;
274
+ // Prevents comments from displaying on our taxonomy 'page'
275
  }
276
  return $posts;
277
  }
products/photocrati_nextgen/modules/nextgen_data/module.nextgen_data.php CHANGED
@@ -22,7 +22,7 @@ class M_NextGen_Data extends C_Base_Module
22
  'photocrati-nextgen-data',
23
  'NextGEN Data Tier',
24
  "Provides a data tier for NextGEN gallery based on the DataMapper module",
25
- '0.14',
26
  'https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/',
27
  'Imagely',
28
  'https://www.imagely.com'
22
  'photocrati-nextgen-data',
23
  'NextGEN Data Tier',
24
  "Provides a data tier for NextGEN gallery based on the DataMapper module",
25
+ '0.15',
26
  'https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/',
27
  'Imagely',
28
  'https://www.imagely.com'
products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php CHANGED
@@ -1210,8 +1210,8 @@ class Mixin_GalleryStorage_Driver_Base extends Mixin
1210
  if ($image_id = $this->object->_image_mapper->save($image)) {
1211
  try {
1212
  // Try writing the image
1213
- $fp = fopen($abs_filename, 'w');
1214
- fwrite($fp, $data);
1215
  fclose($fp);
1216
  if ($settings->imgBackup) {
1217
  $this->object->backup_image($image);
@@ -1255,6 +1255,18 @@ class Mixin_GalleryStorage_Driver_Base extends Mixin
1255
  }
1256
  return $retval;
1257
  }
 
 
 
 
 
 
 
 
 
 
 
 
1258
  function import_gallery_from_fs($abspath, $gallery_id = FALSE, $create_new_gallerypath = TRUE, $gallery_title = NULL, $filenames = array())
1259
  {
1260
  $retval = FALSE;
@@ -2611,11 +2623,8 @@ class C_NextGen_Metadata extends C_Component
2611
  function get_saved_meta($object = false)
2612
  {
2613
  $meta = $this->image->meta_data;
2614
- if (!isset($meta['saved'])) {
2615
- $meta['saved'] = FALSE;
2616
- }
2617
- //check if we already import the meta data to the database
2618
- if (!is_array($meta) || $meta['saved'] != true) {
2619
  return false;
2620
  }
2621
  // return one element if requested
1210
  if ($image_id = $this->object->_image_mapper->save($image)) {
1211
  try {
1212
  // Try writing the image
1213
+ $fp = fopen($abs_filename, 'wb');
1214
+ fwrite($fp, $this->maybe_base64_decode($data));
1215
  fclose($fp);
1216
  if ($settings->imgBackup) {
1217
  $this->object->backup_image($image);
1255
  }
1256
  return $retval;
1257
  }
1258
+ function maybe_base64_decode($data)
1259
+ {
1260
+ $decoded = base64_decode($data);
1261
+ if ($decoded === FALSE) {
1262
+ return $data;
1263
+ } else {
1264
+ if (base64_encode($decoded) == $data) {
1265
+ return base64_decode($data);
1266
+ }
1267
+ }
1268
+ return $data;
1269
+ }
1270
  function import_gallery_from_fs($abspath, $gallery_id = FALSE, $create_new_gallerypath = TRUE, $gallery_title = NULL, $filenames = array())
1271
  {
1272
  $retval = FALSE;
2623
  function get_saved_meta($object = false)
2624
  {
2625
  $meta = $this->image->meta_data;
2626
+ // Check if we already import the meta data to the database
2627
+ if (!is_array($meta) || !isset($meta['saved']) || $meta['saved'] !== TRUE) {
 
 
 
2628
  return false;
2629
  }
2630
  // return one element if requested
products/photocrati_nextgen/modules/nextgen_pro_upgrade/module.nextgen_pro_upgrade.php CHANGED
@@ -21,7 +21,7 @@ class M_NextGen_Pro_Upgrade extends C_Base_Module
21
  'photocrati-nextgen_pro_upgrade',
22
  'NextGEN Pro Page',
23
  'NextGEN Gallery Pro Upgrade Page',
24
- '0.6',
25
  'https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/',
26
  'Imagely',
27
  'https://www.imagely.com'
21
  'photocrati-nextgen_pro_upgrade',
22
  'NextGEN Pro Page',
23
  'NextGEN Gallery Pro Upgrade Page',
24
+ '0.8',
25
  'https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/',
26
  'Imagely',
27
  'https://www.imagely.com'
products/photocrati_nextgen/modules/nextgen_pro_upgrade/package.module.nextgen_pro_upgrade.php CHANGED
@@ -48,14 +48,13 @@ class A_NextGen_Pro_Upgrade_Controller extends Mixin
48
  function get_i18n_strings()
49
  {
50
  $i18n = new stdClass();
51
- $i18n->plus_title = __('Upgrade to NextGEN Plus or Pro!', 'nggallery');
52
- $i18n->pro_title = __('Upgrade to NextGEN Pro!', 'nggallery');
53
- $i18n->plus_desc_first = __('Introducing the most powerful gallery system ever made for WordPress.', 'nggallery');
54
- $i18n->plus_desc_second = __('Take your galleries to the next level with the Plus and Pro extensions for NextGEN Gallery. ', 'nggallery');
55
- $i18n->pro_desc = __('NextGEN Pro now offers proofing and ecommerce! Extend NextGEN Gallery and NextGEN Plus with a complete solution for providing client galleries and for selling prints and digital downloads. Includes unlimited pricelists, PayPal and Stripe integration, and more.', 'nggallery');
56
- $i18n->plus_button = __('Learn More About NextGEN Plus', 'nggallery');
57
- $i18n->pro_button = __('Learn More About NextGEN Pro', 'nggallery');
58
- $i18n->click = __('CLICK TO LEARN MORE:', 'nggallery');
59
  return $i18n;
60
  }
61
  function index_action()
48
  function get_i18n_strings()
49
  {
50
  $i18n = new stdClass();
51
+ $i18n->plus_title = __('Setting a New Standard for WordPress Galleries', 'nggallery');
52
+ $i18n->pro_title = __('Sell Photos + Adobe Lightroom', 'nggallery');
53
+ $i18n->plus_desc_first = __('Introducing the most powerful gallery system ever made for WordPress. Watch our 30 second video, or click below to learn more about NextGEN premium extensions and support.', 'nggallery');
54
+ $i18n->pro_desc = __('You\'re awesome! You\'ve already got NextGEN Plus. But why not go all the way? With NextGEN Pro, you can sell print and digital downloads, provide proofing galleries for clients, manage galleries directly from Adobe Lightroom, and more.', 'nggallery');
55
+ $i18n->video = __('Psst...watch the video ->', 'nggallery');
56
+ $i18n->plus_button = __('Get Premium Extensions', 'nggallery');
57
+ $i18n->pro_button = __('Learn More', 'nggallery');
 
58
  return $i18n;
59
  }
60
  function index_action()
products/photocrati_nextgen/modules/nextgen_pro_upgrade/static/style.css CHANGED
@@ -1,20 +1,89 @@
1
- #nextgen_pro_upgrade_page.wrap.about-wrap {
2
- margin: 60px auto;
 
3
  }
4
 
5
- #nextgen_pro_upgrade_page .centered {
6
- text-align: center;
7
- margin: 1em;
8
  }
9
 
10
- #nextgen_pro_upgrade_page img {
11
- width: 600px;
12
- max-width: 100%;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13
  }
14
 
15
  #nextgen_pro_upgrade_page a.button-primary {
16
- font-size: .8em;
17
- height: 2.8em;
18
- line-height: 1.6em;
19
- padding: .5em 1em .5em 1em;
 
 
 
 
 
 
 
 
 
20
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .gallery_page_ngg_pro_upgrade #update-nag,
2
+ .gallery_page_ngg_pro_upgrade .update-nag {
3
+ display:none;
4
  }
5
 
6
+ #nextgen_pro_upgrade_page {
7
+ max-width: none;
 
8
  }
9
 
10
+ #nextgen_pro_upgrade_page h1 {
11
+ margin: 40px 0 20px;
12
+ }
13
+
14
+ #nextgen_pro_upgrade_page p {
15
+ min-height: auto;
16
+ margin: 30px 0;
17
+ max-width: none;
18
+ color: #999;
19
+ width: 35%;
20
+ float: left;
21
+ max-width: 400px;
22
+ box-sizing: border-box;
23
+ font-size: 22px;
24
+ }
25
+
26
+ #nextgen_pro_upgrade_page p span {
27
+ font-family: Brush Script MT;
28
+ color: #d5d5d5;
29
+ font-size: 34px;
30
+ text-align: right;
31
+ width: 100%;
32
+ display: block;
33
+ margin-top: 60px;
34
+ }
35
+
36
+ #nextgen_pro_upgrade_page.nextgen_plus p span {
37
+ margin-top: 30px;
38
+ }
39
+
40
+ #nextgen_pro_upgrade_page .feature-section {
41
+ float: left;
42
+ width: 60%;
43
+ margin-top: 15px;
44
+ box-sizing: border-box;
45
+ margin-left: 30px;
46
+ padding: 0;
47
+ border: 1px solid #eee;
48
+ }
49
+
50
+ #nextgen_pro_upgrade_page iframe {
51
+ height: 450px;
52
+ width: 800px;
53
+ max-width: 100%;
54
  }
55
 
56
  #nextgen_pro_upgrade_page a.button-primary {
57
+ font-size: 14px;
58
+ background-color: #76a934;
59
+ border: none;
60
+ box-shadow: none;
61
+ text-transform: uppercase;
62
+ height: 50px;
63
+ width: 300px;
64
+ max-width: 100%;
65
+ padding: 12px 22px;
66
+ text-shadow: none;
67
+ text-align: center;
68
+ margin: 40px 0 60px;
69
+ font-weight: bold;
70
  }
71
+
72
+ @media (max-width: 1150px) {
73
+ #nextgen_pro_upgrade_page p span {
74
+ display: none;
75
+ }
76
+ #nextgen_pro_upgrade_page p {
77
+ width: 100%;
78
+ max-width: 100%;
79
+ float: none;
80
+ }
81
+ #nextgen_pro_upgrade_page .feature-section {
82
+ float: none;
83
+ width: 100%;
84
+ margin-left: 0;
85
+ }
86
+ #nextgen_pro_upgrade_page a.button-primary {
87
+ margin: 40px 0;
88
+ }
89
+ }
products/photocrati_nextgen/modules/nextgen_pro_upgrade/static/style.min.css CHANGED
@@ -1 +1 @@
1
- #nextgen_pro_upgrade_page.wrap.about-wrap{margin:60px auto}#nextgen_pro_upgrade_page .centered{text-align:center;margin:1em}#nextgen_pro_upgrade_page img{width:600px;max-width:100%}#nextgen_pro_upgrade_page a.button-primary{font-size:.8em;height:2.8em;line-height:1.6em;padding:.5em 1em}
1
+ .gallery_page_ngg_pro_upgrade #update-nag,.gallery_page_ngg_pro_upgrade .update-nag{display:none}#nextgen_pro_upgrade_page{max-width:none}#nextgen_pro_upgrade_page h1{margin:40px 0 20px}#nextgen_pro_upgrade_page p{min-height:auto;margin:30px 0;color:#999;width:35%;float:left;max-width:400px;box-sizing:border-box;font-size:22px}#nextgen_pro_upgrade_page p span{font-family:Brush Script MT;color:#d5d5d5;font-size:34px;text-align:right;width:100%;display:block;margin-top:60px}#nextgen_pro_upgrade_page.nextgen_plus p span{margin-top:30px}#nextgen_pro_upgrade_page .feature-section{float:left;width:60%;margin-top:15px;box-sizing:border-box;margin-left:30px;padding:0;border:1px solid #eee}#nextgen_pro_upgrade_page iframe{height:450px;width:800px;max-width:100%}#nextgen_pro_upgrade_page a.button-primary{font-size:14px;background-color:#76a934;border:none;box-shadow:none;text-transform:uppercase;height:50px;width:300px;max-width:100%;padding:12px 22px;text-shadow:none;text-align:center;margin:40px 0 60px;font-weight:700}@media (max-width:1150px){#nextgen_pro_upgrade_page p span{display:none}#nextgen_pro_upgrade_page p{width:100%;max-width:100%;float:none}#nextgen_pro_upgrade_page .feature-section{float:none;width:100%;margin-left:0}#nextgen_pro_upgrade_page a.button-primary{margin:40px 0}}
products/photocrati_nextgen/modules/nextgen_pro_upgrade/templates/plus.php CHANGED
@@ -1,21 +1,12 @@
1
  <div id='nextgen_pro_upgrade_page' class="wrap about-wrap">
2
- <h1 class="centered"><?php esc_html_e($i18n->plus_title); ?></h1>
3
- <p class="about-text centered"><?php esc_html_e($i18n->plus_desc_first); ?><br>
4
- <?php esc_html_e($i18n->plus_desc_second); ?>
5
- </p>
6
- <h3 class="about-text centered"><?php esc_html_e($i18n->click); ?></h3>
7
- <div class="feature-section two-col">
8
- <div class="col">
9
- <a href="https://www.imagely.com/wordpress-gallery-plugin/nextgen-plus/" target="_blank"><img src="https://f001.backblaze.com/file/nextgen-gallery/nextgen-plus-ngg.jpg"></a>
10
- <p class="about-text centered">
11
- <a href='https://www.imagely.com/wordpress-gallery-plugin/nextgen-plus/' target='_blank' class="button-primary"><?php esc_html_e($i18n->plus_button); ?></a>
12
- </p>
13
- </div>
14
- <div class="col">
15
- <a href="https://www.imagely.com/wordpress-gallery-plugin/nextgen-pro/" target="_blank"><img src="https://f001.backblaze.com/file/nextgen-gallery/nextgen-pro-ngg.jpg"></a>
16
- <p class="about-text centered">
17
- <a href='https://www.imagely.com/wordpress-gallery-plugin/nextgen-pro/' target='_blank' class="button-primary"><?php esc_html_e($i18n->pro_button); ?></a>
18
- </p>
19
- </div>
20
  </div>
21
  </div>
1
  <div id='nextgen_pro_upgrade_page' class="wrap about-wrap">
2
+ <h1><?php esc_html_e($i18n->plus_title); ?></h1>
3
+ <p class="about-text">
4
+ <?php esc_html_e($i18n->plus_desc_first); ?><br>
5
+ <a href='https://www.imagely.com/wordpress-gallery-plugin/nextgen-pro/?utm_source=ngg&utm_medium=ngguser&utm_campaign=ngpro' target='_blank' class="button-primary"><?php esc_html_e($i18n->plus_button); ?></a><br>
6
+ <span><?php esc_html_e($i18n->video); ?></span>
7
+ </p>
8
+
9
+ <div class="feature-section">
10
+ <iframe src="https://www.youtube.com/embed/zmA-b_jiXN0" frameborder="0" allowfullscreen></iframe>
 
 
 
 
 
 
 
 
 
11
  </div>
12
  </div>
products/photocrati_nextgen/modules/nextgen_pro_upgrade/templates/pro.php CHANGED
@@ -1,12 +1,14 @@
1
- <div id='nextgen_pro_upgrade_page' class="wrap about-wrap">
2
- <h1 class="centered"><?php esc_html_e($i18n->pro_title); ?></h1>
3
- <p class="about-text centered"><?php esc_html_e($i18n->pro_desc); ?></p>
4
- <h3 class="about-text centered"><?php esc_html_e($i18n->click); ?></h3>
5
- <p class="about-text centered">
6
- <a href="https://www.imagely.com/wordpress-gallery-plugin/nextgen-pro/" target="_blank"><img src="https://f001.backblaze.com/file/nextgen-gallery/nextgen-pro-ngg.jpg"></a>
7
- </p>
8
- <p class="about-text centered">
9
- <a href='https://www.imagely.com/wordpress-gallery-plugin/nextgen-pro/' target='_blank' class="button-primary"><?php esc_html_e($i18n->pro_button); ?></a>
10
  </p>
 
 
 
11
  </div>
12
 
 
1
+
2
+ <div id='nextgen_pro_upgrade_page' class="wrap about-wrap nextgen_plus">
3
+ <h1><?php esc_html_e($i18n->pro_title); ?></h1>
4
+ <p class="about-text">
5
+ <?php esc_html_e($i18n->pro_desc); ?><br>
6
+ <a href='https://www.imagely.com/wordpress-gallery-plugin/nextgen-pro/' target='_blank' class="button-primary"><?php esc_html_e($i18n->pro_button); ?></a><br>
7
+ <span><?php esc_html_e($i18n->video); ?></span>
 
 
8
  </p>
9
+ <div class="feature-section">
10
+ <iframe src="https://www.youtube.com/embed/zmA-b_jiXN0" frameborder="0" allowfullscreen></iframe>
11
+ </div>
12
  </div>
13
 
14
+
products/photocrati_nextgen/modules/nextgen_xmlrpc/package.module.nextgen_xmlrpc.php CHANGED
@@ -7,6 +7,8 @@
7
  class A_NextGen_API_Ajax extends Mixin
8
  {
9
  var $nextgen_api = NULL;
 
 
10
  function get_nextgen_api()
11
  {
12
  if (is_null($this->nextgen_api)) {
@@ -105,7 +107,7 @@ class A_NextGen_API_Ajax extends Mixin
105
  break;
106
  case 'gallery_remove':
107
  case 'gallery_edit':
108
- $query_id = $api->get_query_id($task_query['id']);
109
  $gallery = null;
110
  // The old NextGEN XMLRPC API had this logic so replicating it here for safety
111
  if ($query_id) {
@@ -137,13 +139,26 @@ class A_NextGen_API_Ajax extends Mixin
137
  $task_item['auth'] = $task_auth ? 'allow' : 'forbid';
138
  }
139
  if ($task_count == $auth_count) {
140
- $job_id = $api->add_job(array('user' => $user_obj->ID), $app_config, $task_list);
141
  if ($job_id != null) {
 
142
  $handler_delay = defined('NGG_API_JOB_HANDLER_DELAY') ? intval(NGG_API_JOB_HANDLER_DELAY) : 0;
143
  $handler_delay = $handler_delay > 0 ? $handler_delay : 30;
144
  /* in seconds */
145
  $response['result'] = 'ok';
146
- $response['result_object'] = array('job_id' => $job_id, 'job_handler_url' => home_url('/photocrati_ajax?action=execute_nextgen_api_task_list'), 'job_handler_delay' => $handler_delay);
 
 
 
 
 
 
 
 
 
 
 
 
147
  } else {
148
  $response['result'] = 'error';
149
  $response['error'] = array('code' => C_NextGen_API::ERR_JOB_NOT_ADDED, 'message' => __('Job could not be added.', 'nggallery'));
@@ -162,6 +177,28 @@ class A_NextGen_API_Ajax extends Mixin
162
  }
163
  return $response;
164
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
165
  function execute_nextgen_api_task_list_action()
166
  {
167
  $api = $this->get_nextgen_api();
@@ -172,19 +209,27 @@ class A_NextGen_API_Ajax extends Mixin
172
  $response['info'] = array('code' => C_NextGen_API::INFO_EXECUTION_LOCKED, 'message' => __('Job execution is locked.', 'nggallery'));
173
  } else {
174
  if ($job_list != null) {
175
- $api->set_execution_locked(true);
176
  $job_count = count($job_list);
177
  $done_count = 0;
 
178
  foreach ($job_list as $job) {
179
- $result = $api->handle_job($job['id'], $job['data'], $job['app_config'], $job['task_list']);
 
 
180
  if ($result) {
181
  $done_count++;
 
 
 
 
 
182
  }
183
  if ($api->should_stop_execution()) {
184
  break;
185
  }
186
  }
187
- $api->set_execution_locked(false);
188
  if ($done_count == $job_count) {
189
  $response['result'] = 'ok';
190
  $response['info'] = array('code' => C_NextGen_API::INFO_JOB_LIST_FINISHED, 'message' => __('Job list is finished.', 'nggallery'));
@@ -192,6 +237,9 @@ class A_NextGen_API_Ajax extends Mixin
192
  $response['result'] = 'ok';
193
  $response['info'] = array('code' => C_NextGen_API::INFO_JOB_LIST_UNFINISHED, 'message' => __('Job list is unfinished.', 'nggallery'));
194
  }
 
 
 
195
  } else {
196
  $response['result'] = 'ok';
197
  $response['info'] = array('code' => C_NextGen_API::INFO_NO_JOB_LIST, 'message' => __('Job list is empty.', 'nggallery'));
@@ -207,7 +255,7 @@ class A_NextGen_API_Ajax extends Mixin
207
  class C_NextGen_API extends C_Component
208
  {
209
  const CRON_KEY = 'nextgen.api.task_list';
210
- /* NOTE: these constants' numeric values are used elsewhere, don't change the values */
211
  const ERR_NO_TASK_LIST = 1001;
212
  const ERR_NOT_AUTHENTICATED = 1002;
213
  const ERR_NOT_AUTHORIZED = 1003;
@@ -275,7 +323,7 @@ class C_NextGen_API extends C_Component
275
  while (isset($job_list[$job_id])) {
276
  $job_id = uniqid();
277
  }
278
- $job = array('id' => $job_id, 'data' => $job_data, 'app_config' => $app_config, 'task_list' => $task_list);
279
  $job_list[$job_id] = $job;
280
  update_option('ngg_api_job_list', $job_list);
281
  return $job_id;
@@ -330,11 +378,11 @@ class C_NextGen_API extends C_Component
330
  }
331
  return false;
332
  }
333
- function get_job_status_file($job_id)
334
  {
335
  $job = $this->get_job($job_id);
336
  if ($job != null) {
337
- return $job['task_list'];
338
  }
339
  return null;
340
  }
@@ -407,7 +455,7 @@ class C_NextGen_API extends C_Component
407
  $task_id = $id;
408
  if (is_object($task_id) || is_array($task_id)) {
409
  $id = null;
410
- // it was specified that the query ID is referencing the result from another task
411
  if (isset($task_id['target']) && $task_id['target'] == 'task') {
412
  if (isset($task_id['id']) && isset($task_list[$task_id['id']])) {
413
  $target_task = $task_list[$task_id['id']];
@@ -437,6 +485,7 @@ class C_NextGen_API extends C_Component
437
  }
438
  return $id;
439
  }
 
440
  function handle_job($job_id, $job_data, $app_config, $task_list)
441
  {
442
  $job_user = $job_data['user'];
@@ -468,7 +517,12 @@ class C_NextGen_API extends C_Component
468
  $wp_fs = $GLOBALS['wp_filesystem'];
469
  $path_prefix = $full_path;
470
  if ($wp_fs->method === 'direct') {
471
- $path_prefix = str_replace($ftp_path, $root_path, $full_path);
 
 
 
 
 
472
  }
473
  }
474
  foreach ($task_list as &$task_item) {
@@ -830,8 +884,7 @@ class C_NextGen_API extends C_Component
830
  // unfinished tasks, return false
831
  return false;
832
  } else {
833
- // everything was finished, remove job and write status file
834
- $this->remove_job($job_id);
835
  $status_file = '_ngg_job_status_' . strval($job_id) . '.txt';
836
  $status_content = json_encode($task_list);
837
  if ($wp_fs != null) {
@@ -1012,7 +1065,7 @@ class C_NextGen_API_XMLRPC extends C_Component
1012
  *
1013
  * Data is an assoc array:
1014
  * o string name
1015
- * o string type (optional)
1016
  * o base64 bits
1017
  * o bool overwrite (optional)
1018
  * o int gallery
@@ -1033,6 +1086,9 @@ class C_NextGen_API_XMLRPC extends C_Component
1033
  if (!isset($data['overwrite'])) {
1034
  $data['overwrite'] = FALSE;
1035
  }
 
 
 
1036
  $data['override'] = $data['overwrite'];
1037
  // Authenticate the user
1038
  if ($this->_login($username, $password, $blog_id)) {
@@ -1043,22 +1099,27 @@ class C_NextGen_API_XMLRPC extends C_Component
1043
  if ($this->_can_manage_gallery($gallery, TRUE)) {
1044
  // Upload the image
1045
  $storage = C_Gallery_Storage::get_instance();
1046
- $image = $storage->upload_base64_image($gallery, $data['bits'], $data['name'], $data['image_id'], $data['override']);
1047
- if ($image) {
1048
- $storage = C_Gallery_Storage::get_instance();
1049
- $image->imageURL = $storage->get_image_url($image);
1050
- $image->thumbURL = $storage->get_thumb_url($image);
1051
- $image->imagePath = $storage->get_image_abspath($image);
1052
- $image->thumbPath = $storage->get_thumb_abspath($image);
1053
- $retval = $image->get_entity();
1054
- } else {
1055
- $retval = new IXR_Error(500, "Could not upload image");
 
 
 
 
1056
  }
1057
  } else {
1058
- $retval = new IXR_Error(403, "You don't have permission to upload to gallery #{$image->galleryid}");
1059
  }
1060
  } else {
1061
- $retval = new IXR_Error(404, "Gallery not found (with id #{$image->gallerid}");
 
1062
  }
1063
  }
1064
  return $retval;
7
  class A_NextGen_API_Ajax extends Mixin
8
  {
9
  var $nextgen_api = NULL;
10
+ var $_nextgen_api_locked = false;
11
+ var $_shutdown_registered = false;
12
  function get_nextgen_api()
13
  {
14
  if (is_null($this->nextgen_api)) {
107
  break;
108
  case 'gallery_remove':
109
  case 'gallery_edit':
110
+ $query_id = $api->get_query_id($task_query['id'], $task_list);
111
  $gallery = null;
112
  // The old NextGEN XMLRPC API had this logic so replicating it here for safety
113
  if ($query_id) {
139
  $task_item['auth'] = $task_auth ? 'allow' : 'forbid';
140
  }
141
  if ($task_count == $auth_count) {
142
+ $job_id = $api->add_job(array('user' => $user_obj->ID, 'clientid' => $this->object->param('clientid')), $app_config, $task_list);
143
  if ($job_id != null) {
144
+ $post_back = $api->get_job_post_back($job_id);
145
  $handler_delay = defined('NGG_API_JOB_HANDLER_DELAY') ? intval(NGG_API_JOB_HANDLER_DELAY) : 0;
146
  $handler_delay = $handler_delay > 0 ? $handler_delay : 30;
147
  /* in seconds */
148
  $response['result'] = 'ok';
149
+ $response['result_object'] = array('job_id' => $job_id, 'job_post_back' => $post_back, 'job_handler_url' => home_url('?photocrati_ajax=1&action=execute_nextgen_api_task_list'), 'job_handler_delay' => $handler_delay);
150
+ if (!defined('NGG_API_SUPPRESS_QUICK_EXECUTE') || NGG_API_SUPPRESS_QUICK_EXECUTE == false) {
151
+ if (!$api->is_execution_locked()) {
152
+ $this->_start_locked_execute();
153
+ $result = $api->handle_job($job_id, $api->get_job_data($job_id), $app_config, $api->get_job_task_list($job_id));
154
+ if ($result) {
155
+ $response['result_object']['job_result'] = $api->get_job_task_list($job_id);
156
+ // everything was finished, remove job
157
+ $api->remove_job($job_id);
158
+ }
159
+ $this->_stop_locked_execute();
160
+ }
161
+ }
162
  } else {
163
  $response['result'] = 'error';
164
  $response['error'] = array('code' => C_NextGen_API::ERR_JOB_NOT_ADDED, 'message' => __('Job could not be added.', 'nggallery'));
177
  }
178
  return $response;
179
  }
180
+ function _do_shutdown()
181
+ {
182
+ if ($this->_nextgen_api_locked) {
183
+ $this->get_nextgen_api()->set_execution_locked(false);
184
+ }
185
+ }
186
+ function _start_locked_execute()
187
+ {
188
+ $api = $this->get_nextgen_api();
189
+ if (!$this->_shutdown_registered) {
190
+ register_shutdown_function(array($this, '_do_shutdown'));
191
+ $this->_shutdown_registered = true;
192
+ }
193
+ $api->set_execution_locked(true);
194
+ $this->_nextgen_api_locked = true;
195
+ }
196
+ function _stop_locked_execute()
197
+ {
198
+ $api = $this->get_nextgen_api();
199
+ $api->set_execution_locked(false);
200
+ $this->_nextgen_api_locked = false;
201
+ }
202
  function execute_nextgen_api_task_list_action()
203
  {
204
  $api = $this->get_nextgen_api();
209
  $response['info'] = array('code' => C_NextGen_API::INFO_EXECUTION_LOCKED, 'message' => __('Job execution is locked.', 'nggallery'));
210
  } else {
211
  if ($job_list != null) {
212
+ $this->_start_locked_execute();
213
  $job_count = count($job_list);
214
  $done_count = 0;
215
+ $client_result = array();
216
  foreach ($job_list as $job) {
217
+ $job_id = $job['id'];
218
+ $job_data = $job['data'];
219
+ $result = $api->handle_job($job_id, $job_data, $job['app_config'], $job['task_list']);
220
  if ($result) {
221
  $done_count++;
222
+ if (isset($job_data['clientid']) && $job_data['clientid'] == $this->object->param('clientid')) {
223
+ $client_result[$job_id] = $api->get_job_task_list($job_id);
224
+ }
225
+ // everything was finished, remove job
226
+ $api->remove_job($job_id);
227
  }
228
  if ($api->should_stop_execution()) {
229
  break;
230
  }
231
  }
232
+ $this->_stop_locked_execute();
233
  if ($done_count == $job_count) {
234
  $response['result'] = 'ok';
235
  $response['info'] = array('code' => C_NextGen_API::INFO_JOB_LIST_FINISHED, 'message' => __('Job list is finished.', 'nggallery'));
237
  $response['result'] = 'ok';
238
  $response['info'] = array('code' => C_NextGen_API::INFO_JOB_LIST_UNFINISHED, 'message' => __('Job list is unfinished.', 'nggallery'));
239
  }
240
+ if (!defined('NGG_API_SUPPRESS_QUICK_SUMMARY') || NGG_API_SUPPRESS_QUICK_SUMMARY == false) {
241
+ $response['result_object'] = $client_result;
242
+ }
243
  } else {
244
  $response['result'] = 'ok';
245
  $response['info'] = array('code' => C_NextGen_API::INFO_NO_JOB_LIST, 'message' => __('Job list is empty.', 'nggallery'));
255
  class C_NextGen_API extends C_Component
256
  {
257
  const CRON_KEY = 'nextgen.api.task_list';
258
+ /* NOTE: these constants' numeric values MUST remain the same, do NOT change the values */
259
  const ERR_NO_TASK_LIST = 1001;
260
  const ERR_NOT_AUTHENTICATED = 1002;
261
  const ERR_NOT_AUTHORIZED = 1003;
323
  while (isset($job_list[$job_id])) {
324
  $job_id = uniqid();
325
  }
326
+ $job = array('id' => $job_id, 'post_back' => array('token' => md5($job_id)), 'data' => $job_data, 'app_config' => $app_config, 'task_list' => $task_list);
327
  $job_list[$job_id] = $job;
328
  update_option('ngg_api_job_list', $job_list);
329
  return $job_id;
378
  }
379
  return false;
380
  }
381
+ function get_job_post_back($job_id)
382
  {
383
  $job = $this->get_job($job_id);
384
  if ($job != null) {
385
+ return $job['post_back'];
386
  }
387
  return null;
388
  }
455
  $task_id = $id;
456
  if (is_object($task_id) || is_array($task_id)) {
457
  $id = null;
458
+ // it was specified that the query ID is referencing the query ID from another task
459
  if (isset($task_id['target']) && $task_id['target'] == 'task') {
460
  if (isset($task_id['id']) && isset($task_list[$task_id['id']])) {
461
  $target_task = $task_list[$task_id['id']];
485
  }
486
  return $id;
487
  }
488
+ // Note: handle_job only worries about processing the job, it does NOT remove finished jobs anymore, the responsibility is on the caller to remove the job when handle_job returns true, this is to allow calling get_job_*() methods after handle_job has been called
489
  function handle_job($job_id, $job_data, $app_config, $task_list)
490
  {
491
  $job_user = $job_data['user'];
517
  $wp_fs = $GLOBALS['wp_filesystem'];
518
  $path_prefix = $full_path;
519
  if ($wp_fs->method === 'direct') {
520
+ if (trim($ftp_path, " \t\n\r \v\\/") == '') {
521
+ // Note: if ftp_path is empty, we assume the FTP account home dir is on wp-content
522
+ $path_prefix = $root_path . $full_path;
523
+ } else {
524
+ $path_prefix = str_replace($ftp_path, $root_path, $full_path);
525
+ }
526
  }
527
  }
528
  foreach ($task_list as &$task_item) {
884
  // unfinished tasks, return false
885
  return false;
886
  } else {
887
+ // everything was finished, write status file
 
888
  $status_file = '_ngg_job_status_' . strval($job_id) . '.txt';
889
  $status_content = json_encode($task_list);
890
  if ($wp_fs != null) {
1065
  *
1066
  * Data is an assoc array:
1067
  * o string name
1068
+ * o string type (optional)
1069
  * o base64 bits
1070
  * o bool overwrite (optional)
1071
  * o int gallery
1086
  if (!isset($data['overwrite'])) {
1087
  $data['overwrite'] = FALSE;
1088
  }
1089
+ if (!isset($data['image_id'])) {
1090
+ $data['image_id'] = FALSE;
1091
+ }
1092
  $data['override'] = $data['overwrite'];
1093
  // Authenticate the user
1094
  if ($this->_login($username, $password, $blog_id)) {
1099
  if ($this->_can_manage_gallery($gallery, TRUE)) {
1100
  // Upload the image
1101
  $storage = C_Gallery_Storage::get_instance();
1102
+ try {
1103
+ $image = $storage->upload_base64_image($gallery, $data['bits'], $data['name'], $data['image_id'], $data['override']);
1104
+ if ($image) {
1105
+ $storage = C_Gallery_Storage::get_instance();
1106
+ $image->imageURL = $storage->get_image_url($image);
1107
+ $image->thumbURL = $storage->get_thumb_url($image);
1108
+ $image->imagePath = $storage->get_image_abspath($image);
1109
+ $image->thumbPath = $storage->get_thumb_abspath($image);
1110
+ $retval = $image->get_entity();
1111
+ } else {
1112
+ $retval = new IXR_Error(500, "Could not upload image");
1113
+ }
1114
+ } catch (Exception $exception) {
1115
+ $retval = new IXR_Error(500, 'Could not upload image: ' . $exception->getMessage());
1116
  }
1117
  } else {
1118
+ $retval = new IXR_Error(403, "You don't have permission to upload to gallery #{$gallery_id}");
1119
  }
1120
  } else {
1121
+ // No gallery found
1122
+ $retval = new IXR_Error(404, "Gallery not found (with id #{$gallery_id}");
1123
  }
1124
  }
1125
  return $retval;
products/photocrati_nextgen/modules/ngglegacy/admin/css/nggadmin.css CHANGED
@@ -92,6 +92,31 @@
92
  font-size: 90%;
93
  color: #666;
94
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
95
  /* SETTING FOR FLASH UPLOAD BUTTON */
96
  .swfupload {
97
  position:absolute;
@@ -202,6 +227,7 @@ p#ngg-inlinebutton {
202
  margin-bottom: -2px;
203
  position: relative;
204
  bottom: 4px;
 
205
  }
206
 
207
  #ngg-listimages .iedit,
92
  font-size: 90%;
93
  color: #666;
94
  }
95
+
96
+ #pro.ngg-tab .button-primary {
97
+ background-color: #669933;
98
+ border: none;
99
+ box-shadow: none;
100
+ text-shadow: none;
101
+ padding: 12px 40px;
102
+ height: 50px;
103
+ font-size: 16px;
104
+ text-transform: uppercase;
105
+ }
106
+
107
+ #pro.ngg-tab .feature-section {
108
+ text-align: center;
109
+ margin-top: 50px;
110
+ }
111
+
112
+ #pro.ngg-tab .feature-section iframe {
113
+ width: 800px;
114
+ height: 450px;
115
+ max-width: 100%;
116
+ }
117
+
118
+
119
+
120
  /* SETTING FOR FLASH UPLOAD BUTTON */
121
  .swfupload {
122
  position:absolute;
227
  margin-bottom: -2px;
228
  position: relative;
229
  bottom: 4px;
230
+ right: 0; /* Necessary for RTL languages */
231
  }
232
 
233
  #ngg-listimages .iedit,
products/photocrati_nextgen/modules/ngglegacy/admin/css/nggadmin.min.css CHANGED
@@ -1 +1 @@
1
- #gallerydiv span.toggle-indicator:hover,.show_details,div#poststuff #gallerydiv{cursor:pointer}#iframely h2.title{display:none}#newversion{border-color:#CCC;border-style:solid;border-width:1px;margin-right:7px;margin-top:10px;padding:2px}.ngg-dashboard-widget ul.settings span{padding-left:10px;color:#2583AD;font-weight:700}.ngg-overview .postbox .handlediv{float:right;height:24px;width:24px}#ngg-gallery-wizard{min-height:auto}#ngg-gallery-wizard a{font-weight:700}#gallerydiv h3{margin-left:10px}#gallerydiv span.toggle-indicator{font-size:2em;line-height:2em}.warning{color:#9F6000;background-color:#FEEFB3;border:1px solid;margin:5px 0;padding:5px}#donator_message,#wm-preview{border-style:solid;border-width:1px}#donator_message{background-color:#BDE5F8;border-color:#00529B;-moz-border-radius-bottomleft:3px;-moz-border-radius-bottomright:3px;-moz-border-radius-topleft:3px;-moz-border-radius-topright:3px;margin:5px 15px 2px;padding:0 .6em}#wm-preview h3,.wm-table tr{background:0 #F9F9F9}#donator_message p{line-height:1;margin:.5em 0;padding:2px 2px 10px}#donator_message span{padding-top:10px;float:right}#plugin_check img{float:right}#plugin_check p.message{font-size:90%;color:#666}.swfupload{position:absolute;z-index:1;vertical-align:top}.ngg-options th{width:22%}a.switch-expert{text-decoration:none}#wm-preview{float:right;font-size:90%;width:35%;border-color:#EBEBEB #ccc #ccc #ebebeb;margin-bottom:10px;margin-left:10px;margin-right:8px;padding:2px}#wm-preview h3{font-size:14px;font-weight:700;margin:0 0 10px;padding:8px 5px}.wm-table td,.wm-table th{border-bottom:8px solid #FFF;padding:10px}#wm-position{width:100%;margin-left:40px}.wm-table{border-collapse:collapse;margin-top:1em;width:60%;clear:none}.wm-table td{line-height:20px;margin-bottom:9px}.wm-table th{text-align:left}p#ngg-inlinebutton{float:right;margin:0;position:relative;top:-25pt}#gallery_fields{width:100%}#gallery_fields td{padding:5px;min-width:105px}#gallery_fields input[type=text],#gallery_fields select,#gallery_fields textarea{min-width:220px;width:99%}#ngg-listimages .row_actions,#ngg-listimages .row_actions td{border-top:none;padding-top:0;padding-bottom:0}#ngg-listimages .row-actions{padding-left:0;margin-bottom:-2px;position:relative;bottom:4px}#ngg-listimages .iedit,#ngg-listimages .iedit td,#ngg-listimages .iedit th{border:none}#ngg-listimages .iedit td{padding-top:8px}#ngg-listimages .column select{width:100%}#ngg-listimages .column-1 input{margin:0 0 0 8px}#ngg-listimages .column-1,#ngg-listimages .column-2{width:4%;min-width:33px}#ngg-listimages .column-3{min-width:80px;width:10%}#ngg-listimages .column-3 .thumb{max-height:80px;max-width:80px}#ngg-listimages .column-4{width:22%;max-width:220px}#ngg-listimages .column-4 .meta{font-size:11px}#ngg-listimages .column-4 label input[type=checkbox]{position:relative;top:-2px}#ngg-listimages .column-5 input[type=text],#ngg-listimages .column-5 textarea,#ngg-listimages .column-6 textarea{width:100%}#ngg-listimages .column-5 textarea{height:57px}#ngg-listimages .column-6 textarea{height:80px}div .progressborder{border:1px solid #DDD;display:block;height:30px;background-color:#464646;width:100%;margin-top:15px;margin-bottom:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}div .progressbar{border:none;display:block;height:30px;background-color:#D54E21;width:0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}div .progressbar span{display:inline;position:absolute;color:#fff;font-weight:700;padding:5px 0 0 5px}.show_details{height:16px;line-height:20px;overflow:hidden;min-width:8em;padding:3px}.show_details span{border-bottom:1px solid #999;white-space:pre}.show_details:hover{height:auto;overflow:visible;border:1px solid #999}.albumnav select[name=act_album]{width:150px}.albumnav span{padding-left:50px}#editalbum select[name=pageid]{width:95%}div .groupItem{cursor:move;width:295px;padding:5px;line-height:1.5}div .innerhandle{background-color:#FBFBFB}.groupItem .item_top{background-color:#2683AE;color:#FFF;font-weight:700;line-height:28px;height:28px;padding:0 5px;-moz-border-radius:3px;-khtml-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.groupItem .album_obj{background-color:#D54E21}.groupItem .item_top a{color:#FFF;float:right;text-decoration:none}.groupItem .item_top a:hover{color:#FFF}.itemContent{border-color:#DFDFDF;border-style:none solid solid;border-width:0 1px 1px;padding:2px 0 20px 2px}.itemContent p{border:0;margin:0;padding:0}.inlinepicture{float:left;display:inline;margin:0;padding:0 3px 1px}.inlinepicture img{margin:3px;max-height:60px}.sort_placeholder{border:1px dashed #bba!important;margin:5px;background:#F9F9F9}.container{margin-top:10px}.target-album{margin:10px 685px 10px 10px}.widget-right{float:right;margin:0 10px;width:315px}.widget-holder{min-height:400px;padding-top:1px}.target{background-color:#F1F1F1}div.widget-top h3{text-align:center;line-height:25px;margin:0;padding:5px 12px;font-size:13px}div.widget-top{text-shadow:0 1px 0 #FFF;background-repeat:repeat-x;background-position:0 0;font-size:13px}.ui-autocomplete-start{background-position:99% center}#sortGallery{position:relative}p#sortButton{margin:0;position:absolute;right:0;top:0}.imageBox,.imageBoxHighlighted{width:130px;height:160px;float:left;overflow:hidden;text-overflow:ellipsis;padding:5px}.imageBox_theImage{width:110px;height:125px;background-position:center;background-repeat:no-repeat;margin:0 auto 2px}.imageBox_label{text-align:center;font-family:arial;font-size:11px;padding-top:2px;margin:0 auto}#insertionMarker{height:150px;width:6px;position:absolute}#insertionMarkerLine{width:6px;height:145px}#insertionMarker img{float:left}#dragDropContent{opacity:.4;filter:alpha(opacity=40);position:absolute;z-index:10;display:none}.error_inline{background:0 #FFEBE8;border:1px solid #C00;margin:5px auto;padding:10px}.ngg-list{font-size:11px;margin-left:15px;list-style-position:inside;list-style-type:disc}#ngg-manage-images-items-per-page-label{float:right;line-height:30px;margin-right:5px}#ngg-manage-images-items-per-page{float:right;margin-right:5px}#adminmenu .wp-submenu a[href*=ngg_pro_upgrade]{color:#76a934}
1
+ #gallerydiv span.toggle-indicator:hover,.show_details,div#poststuff #gallerydiv{cursor:pointer}#iframely h2.title{display:none}#newversion{border-color:#CCC;border-style:solid;border-width:1px;margin-right:7px;margin-top:10px;padding:2px}.ngg-dashboard-widget ul.settings span{padding-left:10px;color:#2583AD;font-weight:700}.ngg-overview .postbox .handlediv{float:right;height:24px;width:24px}#ngg-gallery-wizard{min-height:auto}#ngg-gallery-wizard a{font-weight:700}#gallerydiv h3{margin-left:10px}#gallerydiv span.toggle-indicator{font-size:2em;line-height:2em}.warning{color:#9F6000;background-color:#FEEFB3;border:1px solid;margin:5px 0;padding:5px}#donator_message{background-color:#BDE5F8;border-color:#00529B;-moz-border-radius-bottomleft:3px;-moz-border-radius-bottomright:3px;-moz-border-radius-topleft:3px;-moz-border-radius-topright:3px;border-style:solid;border-width:1px;margin:5px 15px 2px;padding:0 .6em}#donator_message p{line-height:1;margin:.5em 0;padding:2px 2px 10px}#donator_message span{padding-top:10px;float:right}#plugin_check img{float:right}#plugin_check p.message{font-size:90%;color:#666}#pro.ngg-tab .button-primary{background-color:#693;border:none;box-shadow:none;text-shadow:none;padding:12px 40px;height:50px;font-size:16px;text-transform:uppercase}#wm-preview h3,.wm-table tr{background:0 #F9F9F9}#pro.ngg-tab .feature-section{text-align:center;margin-top:50px}#pro.ngg-tab .feature-section iframe{width:800px;height:450px;max-width:100%}.swfupload{position:absolute;z-index:1;vertical-align:top}.ngg-options th{width:22%}a.switch-expert{text-decoration:none}#wm-preview{float:right;font-size:90%;width:35%;border-color:#EBEBEB #ccc #ccc #ebebeb;border-style:solid;border-width:1px;margin-bottom:10px;margin-left:10px;margin-right:8px;padding:2px}#wm-preview h3{font-size:14px;font-weight:700;margin:0 0 10px;padding:8px 5px}.wm-table td,.wm-table th{border-bottom:8px solid #FFF;padding:10px}#wm-position{width:100%;margin-left:40px}.wm-table{border-collapse:collapse;margin-top:1em;width:60%;clear:none}.wm-table td{line-height:20px;margin-bottom:9px}.wm-table th{text-align:left}p#ngg-inlinebutton{float:right;margin:0;position:relative;top:-25pt}#gallery_fields{width:100%}#gallery_fields td{padding:5px;min-width:105px}#gallery_fields input[type=text],#gallery_fields select,#gallery_fields textarea{min-width:220px;width:99%}#ngg-listimages .row_actions,#ngg-listimages .row_actions td{border-top:none;padding-top:0;padding-bottom:0}#ngg-listimages .row-actions{padding-left:0;margin-bottom:-2px;position:relative;bottom:4px;right:0}#ngg-listimages .iedit,#ngg-listimages .iedit td,#ngg-listimages .iedit th{border:none}#ngg-listimages .iedit td{padding-top:8px}#ngg-listimages .column select{width:100%}#ngg-listimages .column-1 input{margin:0 0 0 8px}#ngg-listimages .column-1,#ngg-listimages .column-2{width:4%;min-width:33px}#ngg-listimages .column-3{min-width:80px;width:10%}#ngg-listimages .column-3 .thumb{max-height:80px;max-width:80px}#ngg-listimages .column-4{width:22%;max-width:220px}#ngg-listimages .column-4 .meta{font-size:11px}#ngg-listimages .column-4 label input[type=checkbox]{position:relative;top:-2px}#ngg-listimages .column-5 input[type=text],#ngg-listimages .column-5 textarea,#ngg-listimages .column-6 textarea{width:100%}#ngg-listimages .column-5 textarea{height:57px}#ngg-listimages .column-6 textarea{height:80px}div .progressborder{border:1px solid #DDD;display:block;height:30px;background-color:#464646;width:100%;margin-top:15px;margin-bottom:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}div .progressbar{border:none;display:block;height:30px;background-color:#D54E21;width:0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}div .progressbar span{display:inline;position:absolute;color:#fff;font-weight:700;padding:5px 0 0 5px}.show_details{height:16px;line-height:20px;overflow:hidden;min-width:8em;padding:3px}.show_details span{border-bottom:1px solid #999;white-space:pre}.show_details:hover{height:auto;overflow:visible;border:1px solid #999}.albumnav select[name=act_album]{width:150px}.albumnav span{padding-left:50px}#editalbum select[name=pageid]{width:95%}div .groupItem{cursor:move;width:295px;padding:5px;line-height:1.5}div .innerhandle{background-color:#FBFBFB}.groupItem .item_top{background-color:#2683AE;color:#FFF;font-weight:700;line-height:28px;height:28px;padding:0 5px;-moz-border-radius:3px;-khtml-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.groupItem .album_obj{background-color:#D54E21}.groupItem .item_top a{color:#FFF;float:right;text-decoration:none}.groupItem .item_top a:hover{color:#FFF}.itemContent{border-color:#DFDFDF;border-style:none solid solid;border-width:0 1px 1px;padding:2px 0 20px 2px}.itemContent p{border:0;margin:0;padding:0}.inlinepicture{float:left;display:inline;margin:0;padding:0 3px 1px}.inlinepicture img{margin:3px;max-height:60px}.sort_placeholder{border:1px dashed #bba!important;margin:5px;background:#F9F9F9}.container{margin-top:10px}.target-album{margin:10px 685px 10px 10px}.widget-right{float:right;margin:0 10px;width:315px}.widget-holder{min-height:400px;padding-top:1px}.target{background-color:#F1F1F1}div.widget-top h3{text-align:center;line-height:25px;margin:0;padding:5px 12px;font-size:13px}div.widget-top{text-shadow:0 1px 0 #FFF;background-repeat:repeat-x;background-position:0 0;font-size:13px}.ui-autocomplete-start{background-position:99% center}#sortGallery{position:relative}p#sortButton{margin:0;position:absolute;right:0;top:0}.imageBox,.imageBoxHighlighted{width:130px;height:160px;float:left;overflow:hidden;text-overflow:ellipsis;padding:5px}.imageBox_theImage{width:110px;height:125px;background-position:center;background-repeat:no-repeat;margin:0 auto 2px}.imageBox_label{text-align:center;font-family:arial;font-size:11px;padding-top:2px;margin:0 auto}#insertionMarker{height:150px;width:6px;position:absolute}#insertionMarkerLine{width:6px;height:145px}#insertionMarker img{float:left}#dragDropContent{opacity:.4;filter:alpha(opacity=40);position:absolute;z-index:10;display:none}.error_inline{background:0 #FFEBE8;border:1px solid #C00;margin:5px auto;padding:10px}.ngg-list{font-size:11px;margin-left:15px;list-style-position:inside;list-style-type:disc}#ngg-manage-images-items-per-page-label{float:right;line-height:30px;margin-right:5px}#ngg-manage-images-items-per-page{float:right;margin-right:5px}#adminmenu .wp-submenu a[href*=ngg_pro_upgrade]{color:#76a934}
products/photocrati_nextgen/modules/ngglegacy/admin/manage.php CHANGED
@@ -979,7 +979,20 @@ class nggManageGallery {
979
  }
980
  }
981
  }
 
 
 
 
 
 
 
 
 
 
 
 
982
  }
 
983
  return $updated;
984
  }
985
 
979
  }
980
  }
981
  }
982
+
983
+ // Determine if any WP terms have been orphaned and clean them up
984
+ global $wpdb;
985
+ $results = $wpdb->get_col("SELECT t.`term_id` FROM `{$wpdb->term_taxonomy}` tt
986
+ LEFT JOIN `{$wpdb->terms}` t ON tt.`term_id` = t.`term_id`
987
+ WHERE tt.`taxonomy` = 'ngg_tag' AND tt.`count` <= 0");
988
+ if (!empty($results))
989
+ {
990
+ foreach ($results as $term_id) {
991
+ wp_delete_term($term_id, 'ngg_tag');
992
+ }
993
+ }
994
  }
995
+
996
  return $updated;
997
  }
998
 
products/photocrati_nextgen/modules/ngglegacy/admin/overview.php CHANGED
@@ -287,17 +287,13 @@ function nggallery_admin_overview()
287
  <div id="pro" class="ngg-tab">
288
 
289
  <h2><?php _e( 'Upgrade to NextGEN Pro!' ); ?></h2>
290
- <p class="about-text centered"><?php _e( 'Gorgeous new gallery displays, image protection, full screen lightbox, commenting and social sharing for individual images, proofing, ecommerce, digital downloads, and more. Take your galleries to the next level with the Plus and Pro extensions for NextGEN Gallery. ', 'nggallery' ); ?></p>
291
- <h3 class="about-text centered"><?php _e( 'CLICK TO LEARN MORE:', 'nggallery' ); ?></h3>
292
- <div class="feature-section two-col">
293
- <div class="col">
294
- <a href="https://www.imagely.com/wordpress-gallery-plugin/nextgen-plus/" target="_blank"><img src="https://f001.backblaze.com/file/nextgen-gallery/nextgen-plus-ngg.jpg"></a>
295
- </div>
296
- <div class="col">
297
- <a href="https://www.imagely.com/wordpress-gallery-plugin/nextgen-pro/" target="_blank"><img src="https://f001.backblaze.com/file/nextgen-gallery/nextgen-pro-ngg.jpg"></a>
298
- </div>
299
  </div>
300
 
 
301
  </div>
302
 
303
  <div id="genesis" class="ngg-tab">
287
  <div id="pro" class="ngg-tab">
288
 
289
  <h2><?php _e( 'Upgrade to NextGEN Pro!' ); ?></h2>
290
+ <p class="about-text centered"><span style="font-weight: bold;"><?php _e( 'The most powerful gallery system ever built for WordPress. ', 'nggallery' ); ?></span><br><?php _e( 'Gorgeous new gallery displays, image protection, full screen lightbox, commenting and social sharing for individual images, proofing, ecommerce, digital downloads, and more.', 'nggallery' ); ?></p>
291
+ <p class="about-text centered"><a href='https://www.imagely.com/wordpress-gallery-plugin/nextgen-pro/?utm_source=ngg&utm_medium=ngguser&utm_campaign=ngpro' target='_blank' class="button-primary"><?php _e( 'Get NextGEN Pro Now', 'nggallery' ); ?></a></p>
292
+ <div class="feature-section">
293
+ <iframe src="https://www.youtube.com/embed/zmA-b_jiXN0" frameborder="0" allowfullscreen></iframe>
 
 
 
 
 
294
  </div>
295
 
296
+
297
  </div>
298
 
299
  <div id="genesis" class="ngg-tab">
products/photocrati_nextgen/modules/ngglegacy/lib/meta.php CHANGED
@@ -80,11 +80,9 @@ class nggMeta{
80
 
81
  $meta = $this->image->meta_data;
82
 
83
- if (!isset($meta['saved'])) $meta['saved'] = FALSE;
84
-
85
- //check if we already import the meta data to the database
86
- if (!is_array($meta) || ($meta['saved'] != true))
87
- return false;
88
 
89
  // return one element if requested
90
  if ($object)
80
 
81
  $meta = $this->image->meta_data;
82
 
83
+ // Check if we already import the meta data to the database
84
+ if (!is_array($meta) || !isset($meta['saved']) || ($meta['saved'] !== TRUE))
85
+ return false;
 
 
86
 
87
  // return one element if requested
88
  if ($object)
products/photocrati_nextgen/modules/ngglegacy/lib/ngg-db.php CHANGED
@@ -950,9 +950,9 @@ class nggdb
950
  // Generate SQL query
951
  $query = array();
952
  $query[] = "SELECT {$field}, SUBSTR({$field}, %d) AS 'i' FROM {$table}";
953
- $query[] = "WHERE ({$field} LIKE '{$slug}-%%' AND CONVERT(SUBSTR({$field}, %d), SIGNED) BETWEEN 1 AND %d) OR {$field} = %s";
954
  $query[] = "ORDER BY CAST(i AS SIGNED INTEGER) DESC LIMIT 1";
955
- $query = $wpdb->prepare(implode(" ", $query), strlen("{$slug}-")+1, strlen("{$slug}-")+1, PHP_INT_MAX, $slug);
956
 
957
  // If the above query returns a result, it means that the slug is already taken
958
  if (($last_slug = $wpdb->get_var($query))) {
950
  // Generate SQL query
951
  $query = array();
952
  $query[] = "SELECT {$field}, SUBSTR({$field}, %d) AS 'i' FROM {$table}";
953
+ $query[] = "WHERE ({$field} LIKE %s AND CONVERT(SUBSTR({$field}, %d), SIGNED) BETWEEN 1 AND %d) OR {$field} = %s";
954
  $query[] = "ORDER BY CAST(i AS SIGNED INTEGER) DESC LIMIT 1";
955
+ $query = $wpdb->prepare(implode(" ", $query), strlen("{$slug}-")+1, $wpdb->esc_like("{$slug}-") . '%', strlen("{$slug}-")+1, PHP_INT_MAX, $slug);
956
 
957
  // If the above query returns a result, it means that the slug is already taken
958
  if (($last_slug = $wpdb->get_var($query))) {
products/photocrati_nextgen/modules/ngglegacy/module.ngglegacy.php CHANGED
@@ -23,7 +23,7 @@ class M_NggLegacy extends C_Base_Module
23
  'photocrati-nextgen-legacy',
24
  'NextGEN Legacy',
25
  'Embeds the original version of NextGEN 1.9.3 by Alex Rabe',
26
- '0.20',
27
  'https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/',
28
  'Imagely',
29
  'https://www.imagely.com'
23
  'photocrati-nextgen-legacy',
24
  'NextGEN Legacy',
25
  'Embeds the original version of NextGEN 1.9.3 by Alex Rabe',
26
+ '0.21',
27
  'https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/',
28
  'Imagely',
29
  'https://www.imagely.com'
products/photocrati_nextgen/modules/router/package.module.router.php CHANGED
@@ -215,8 +215,8 @@ class Mixin_Router extends Mixin
215
  */
216
  function get_request_uri($with_params = TRUE)
217
  {
218
- if (!empty($_SERVER['ORIG_REQUEST_URI'])) {
219
- $retval = $_SERVER['ORIG_REQUEST_URI'];
220
  } elseif (!empty($_SERVER['PATH_INFO'])) {
221
  $retval = $_SERVER['PATH_INFO'];
222
  } else {
215
  */
216
  function get_request_uri($with_params = TRUE)
217
  {
218
+ if (!empty($_SERVER['NGG_ORIG_REQUEST_URI'])) {
219
+ $retval = $_SERVER['NGG_ORIG_REQUEST_URI'];
220
  } elseif (!empty($_SERVER['PATH_INFO'])) {
221
  $retval = $_SERVER['PATH_INFO'];
222
  } else {
products/photocrati_nextgen/modules/wordpress_routing/module.wordpress_routing.php CHANGED
@@ -54,9 +54,9 @@ class M_WordPress_Routing extends C_Base_Module
54
  */
55
  function restore_request_uri()
56
  {
57
- if (isset($_SERVER['ORIG_REQUEST_URI']))
58
  {
59
- $request_uri = $_SERVER['ORIG_REQUEST_URI'];
60
  $_SERVER['UNENCODED_URL'] = $_SERVER['HTTP_X_ORIGINAL_URL'] = $_SERVER['REQUEST_URI'] = $request_uri;
61
 
62
  if (isset($_SERVER['ORIG_PATH_INFO'])) {
54
  */
55
  function restore_request_uri()
56
  {
57
+ if (isset($_SERVER['NGG_ORIG_REQUEST_URI']))
58
  {
59
+ $request_uri = $_SERVER['NGG_ORIG_REQUEST_URI'];
60
  $_SERVER['UNENCODED_URL'] = $_SERVER['HTTP_X_ORIGINAL_URL'] = $_SERVER['REQUEST_URI'] = $request_uri;
61
 
62
  if (isset($_SERVER['ORIG_PATH_INFO'])) {
products/photocrati_nextgen/modules/wordpress_routing/package.module.wordpress_routing.php CHANGED
@@ -202,7 +202,7 @@ class A_WordPress_Routing_App extends Mixin
202
  function passthru()
203
  {
204
  $router = C_Router::get_instance();
205
- $_SERVER['ORIG_REQUEST_URI'] = $_SERVER['REQUEST_URI'];
206
  $base_parts = parse_url($router->get_base_url('root'));
207
  $new_request_uri = $router->join_paths(!empty($base_parts['path']) ? $base_parts['path'] : '', $this->object->strip_param_segments($router->get_request_uri()));
208
  $new_request_uri = str_replace('index.php/index.php', 'index.php', $new_request_uri);
202
  function passthru()
203
  {
204
  $router = C_Router::get_instance();
205
+ $_SERVER['NGG_ORIG_REQUEST_URI'] = $_SERVER['REQUEST_URI'];
206
  $base_parts = parse_url($router->get_base_url('root'));
207
  $new_request_uri = $router->join_paths(!empty($base_parts['path']) ? $base_parts['path'] : '', $this->object->strip_param_segments($router->get_request_uri()));
208
  $new_request_uri = str_replace('index.php/index.php', 'index.php', $new_request_uri);
readme.txt CHANGED
@@ -2,7 +2,7 @@
2
  Contributors: photocrati, imagely
3
  Tags: wordpress gallery plugin, gallery, nextgen, nextgen gallery, photo gallery, image gallery, photography, slideshow, images, photo, photo album, watermark
4
  Requires at least: 4.0.0
5
- Stable tag: 2.2.3
6
  Tested up to: 4.7.3
7
  License: GPLv2
8
 
@@ -12,21 +12,21 @@ The most popular WordPress gallery plugin and one of the most popular plugins of
12
 
13
  = WordPress Gallery Plugin =
14
 
15
- NextGEN Gallery has been the industry's standard **WordPress gallery plugin** since 2007 and continues to receive over 1.5 million new downloads per year. It's great for general use, but powerful enough for the most demanding photographers, visual artists, and imaging professionals.
16
 
17
- On the back end, NextGEN offers a complete WordPress gallery management system with the ability to batch upload, import meta data, add/delete/rearrange/sort images, edit thumbnails, group galleries into albums, and more.
18
 
19
- On the front end, the free version of NextGEN provides two main display styles (slideshows and thumbnail galleries) and two album styles (compact and extended), all of which come with a wide array of options for controlling size, style, timing, transitions, controls, lightbox effects, and more.
20
 
21
  Learn more about <a href="https://www.imagely.com/wordpress-gallery-plugin/" target="_blank">NextGEN WordPress Gallery Plugin features.</a>
22
 
23
  **Demos**<br>
24
  *<a href="https://www.imagely.com/wordpress-gallery-plugin/basic-thumbnail-gallery/" target="_blank">Basic Thumbnail Gallery Demo</a><br>
25
- *<a href="https://www.imagely.com/wordpress-gallery-plugin/basic-slideshow-gallery/" target="_blank">Basic Slideshow Demo</a><br>
26
  *<a href="https://www.imagely.com/wordpress-gallery-plugin/basic-compact-album/" target="_blank">Basic Compact Album</a><br>
27
  *<a href="https://www.imagely.com/wordpress-gallery-plugin/basic-extended-album/" target="_blank">Basic List Album</a><br>
28
 
29
- **INTRODUCING NEXTGEN GALLERY PRO.** NextGEN Plus and NextGEN Pro are premium WordPress gallery plugin extensions for NextGEN Gallery that add new gallery displays, lightboxes, ecommerce, proofing, and pro support. Learn more about <a href="https://www.imagely.com/wordpress-gallery-plugin/" target="_blank">NextGEN Plus and NextGEN Pro plugin features.</a>
30
 
31
  **Demos**<br>
32
  *<a href="https://www.imagely.com/wordpress-gallery-plugin/pro-mosaic-gallery/" target="_blank">Pro Mosaic Gallery</a><br>
@@ -63,7 +63,7 @@ Imagely 2016
63
  Photocrati Media 2012-2016<br>
64
  Alex Rabe 2007-2011
65
 
66
- This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
67
 
68
  This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
69
 
@@ -71,9 +71,9 @@ You should have received a copy of the GNU General Public License along with thi
71
 
72
  == Installation ==
73
 
74
- INSTALLATION: The easiest way to enjoy NextGEN Gallery is to login to you WordPress dashboard, go to Plugins >> Add New, search for NextGEN Gallery, and click to install. You can also download the zip file from this page and upload it from the Plugins >> Add New > Upload page.
75
 
76
- HOW TO USE: Just go to a page or post and click the NextGEN Gallery icon. From our Attach to Post interface, you can create, manage, customize, and display your galleries. You can also manage your galleries and gallery settings from the central options area under the "Gallery" tab on your dashboard menu.
77
 
78
  DOCUMENTATION: See <a href="https://www.imagely.com/docs/nextgen-gallery/" target="_blank">NextGEN Gallery Documentation</a>.
79
 
@@ -95,7 +95,7 @@ https://www.youtube.com/watch?v=qwNr5ZNGavo
95
 
96
  == Shortcode ==
97
 
98
- NextGEN Gallery 2.x introduces our new Attach to Post interface, which means you never need to work with shortcodes again if you would prefer not too.
99
 
100
  If you do want to work with shortcodes, we've also introduce a new, more powerful, and more flexible shortcode system with NextGEN Gallery 2.0.
101
 
@@ -106,7 +106,7 @@ For more information, feel free to visit the official website for the NextGEN Ga
106
  == Frequently Asked Questions ==
107
 
108
 
109
- = Why are my galleries not opening up in a lightbox after I move my site? =
110
 
111
  This is often due to the URL paths to the CSS and JavaScript files used by the Lightbox Effects not being changed to relevant addresses based on the new site. This article will help sort out this issue if that is the case: <a href="https://www.imagely.com/docs/galleries-opening-lightbox/" target="_blank">Why are my galleries not opening up in a lightbox?</a>.
112
 
@@ -120,32 +120,32 @@ Yes. See <a href="https://www.imagely.com/docs/nextgen-gallery/" target="_blank"
120
  Part of what makes the NextGEN Gallery WordPress gallery plugin so popular is its flexibility - it works with the vast majority of premium and free themes, without requiring any coding.
121
 
122
 
123
- = Are the galleries flash based? =
124
 
125
- No, NextGEN Gallery uses Javascript (J-Query) based displays to ensure compatibility across the widest range of displays possible.
126
 
127
 
128
  = Are the galleries mobile friendly? =
129
 
130
- Yes, since we use Javascript rather than flash, NextGEN Gallery is compatible with Android, iOS, and Blackberry. As of July 2013, all galleries are responsive. NextGEN Pro also includes a full screen, responsive Pro Lightbox with mobile gesture support.
131
 
132
 
133
  = What is the difference between a gallery and an album? =
134
 
135
- In the simplest of terms, Galleries contain your images and Albums contain your Galleries. Albums act as links and placeholders to quickly and easily navigate your galleries - Galleries will actually display your images.
136
 
137
 
138
  = Can I upload multiple images at once? =
139
 
140
- Yes, you can batch upload entire galleries at a time.
141
 
142
 
143
  = Can I password protect galleries? =
144
 
145
- Yes, WordPress allows you to password protect pages by default - which includes all galleries and content for the entire page. Password protection of pages can be turned on and off at any time, with just a few clicks.
146
 
147
 
148
- = Can I add a watermark to the images/slideshows? =
149
 
150
  Yes, you can add text or image watermarks to your gallery images.
151
 
@@ -155,7 +155,7 @@ Yes, you can add text or image watermarks to your gallery images.
155
  Yes, each thumbnail image can be individually adjusted to suit your needs.
156
 
157
 
158
- = Is there pagination for galleries? =
159
 
160
  Yes, and you can adjust the amount of images to be shown on a page at any time.
161
 
@@ -187,37 +187,58 @@ For more information, feel free to visit the official website for the NextGEN Ga
187
 
188
  == Changelog ==
189
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
190
  = V2.2.3 - 04.05.2017 =
191
  * Fixed: E_WARNING on Gallery Settings page due to improper use of array_combine() on PHP <= 5.3
192
 
193
  = V2.2.2 - 04.04.2017 =
194
- * Fixed: Hyperlinks in image descriptions
195
  * Fixed: WordPress SEO sitemap image count
196
  * Fixed: Removed id parameter in shortcodes
197
  * Fixed: Fatal error in Freemius code
198
 
199
  = V2.2.1 - 03.13.2017 =
200
- * NEW: Template mechanism for all display types
201
  * NEW: Review notices
202
- * Changed: Updated branding to Imagely
203
  * Changed: Added the ability to click on a gallery title and have it open direct to Pro Lightbox
204
  * Fixed: Problems with activation after initial installation
205
  * Fixed: Don't display legacy shortcodes after creating new galleries
206
- * Fixed: false positive malware detection notices against 'eval'
207
  * Fixed: Various PHP notices and warnings
208
- * Fixed: Issue with dynamic container height for Imagebrowser display types
209
 
210
  = V2.1.79 - 02.23.2017 =
211
- * Secured: Resolved vulnerability with tag cloud displays
212
 
213
  = V2.1.77 - 01.31.2017 =
214
  * Changed: Corrected Facebook link
215
  * Changed: Tags in readme.txt
216
- * Fixed: Problem with deactivating other plugin
217
 
218
  = V2.1.69 - 01.18.2017 =
219
  * Fixed: Ensured compatibility with WordPress 4.7.1
220
- * Fixed: Missing option names on setting pages when Wizard active
221
  * Fixed: Ensure that NextGEN Gallery is always loaded after it's extension plugins in WP 4.7
222
  * Fixed: Pope product uninstaller not running during activation
223
 
@@ -226,7 +247,7 @@ For more information, feel free to visit the official website for the NextGEN Ga
226
  * Fixed: The ability to dismiss the gallery wizard notice
227
 
228
  = V2.1.61 - 12.14.2016 =
229
- * NEW: Gallery creation wizard for new users
230
  * Fixed: Shortcodes in widgets not getting substituted in Divi
231
  * Fixed: Ensure that NGG placeholder text doesn't get styled incorrectly by other themes
232
  * Fixed: Various thickbox issues on custom post type pages
@@ -239,12 +260,12 @@ For more information, feel free to visit the official website for the NextGEN Ga
239
  * Secured: Ability to customize CSS Styles
240
  * Changed: readme.txt improvements
241
  * Fixed: Compatibility with WordPress 4.7.0
242
- * Fixed: IGW-inserted tagclouds are incorrect
243
 
244
  = V2.1.57 - 11.14.2016 =
245
  * Secured: Custom Styles may only be written to specific directories
246
  * Secured: SQL injection vulnerability for gallery names
247
- * Changed: Display type icons are now clickable in the Insert Gallery Window
248
  * Changed: Include backup image files when coping/moving a gallery
249
  * Changed: Show gallery name in upload notification
250
  * Changed: Added placeholder text to gallery name field on Add Gallery / Upload Images page
@@ -255,7 +276,7 @@ For more information, feel free to visit the official website for the NextGEN Ga
255
  * Fixed: Conflict with Easy Digital Downloads
256
  * Fixed: Misc invalid HTML tags in admin pages (thanks to kniebremser)
257
  * Fixed: Change display:hidden to visibility:hidden in various places
258
- * Fixed: Escaping of quotes in gallery titles and urls
259
  * Fixed: Untranslatable strings
260
 
261
 
@@ -264,12 +285,12 @@ For more information, feel free to visit the official website for the NextGEN Ga
264
 
265
  = V2.1.54 - 10.25.2016 =
266
  * NEW: Added php docblock directives for code hinting/completion
267
- * NEW: Display types can have aliases
268
  * NEW: Visual Shortcodes
269
  * Changed: Now uses gulp for package compilation & JS/CSS minification
270
  * Changed: Updated Freemius SDK to 1.2.1
271
  * Fixed: Extraneous backslashes being added to gallery titles & descriptions
272
- * Fixed: Import folder 'gallery title' field wasn't being used for new gallery titles
273
  * Fixed: Settings reset will now redirect to /wp-admin/ to avoid potential activation-related errors
274
  * Fixed: Table columns cache becomes out of date between versions
275
  * Fixed: Various issues with shortcodes when used in widgets
@@ -280,7 +301,7 @@ For more information, feel free to visit the official website for the NextGEN Ga
280
  * NEW: Added the ability to open galleries within albums using a lightbox
281
  * Changed: Increased freemius opt-in to 100%
282
  * Changed: Tamara Lackey's biography on the overview page
283
- * Fixed: Images not responsive for all display types
284
  * Fixed: Compatibility with the Imagely Lightroom plugin
285
  * Fixed: Removed Pope tests folder
286
  * Fixed: Maximum function nesting level fatal error when displaying two or more albums
@@ -293,13 +314,13 @@ For more information, feel free to visit the official website for the NextGEN Ga
293
  * NEW: Added notice for deprecating PHP 5.2
294
  * NEW: Option to display child gallery and album descriptions when viewing albums
295
  * Changed: ATP preview images are smaller with tighter margins to show more images
296
- * Changed: Content of Upgrade to Pro page
297
  * Changed: New NextGEN Overview page
298
  * Changed: Replicate gallery name sanitation of NG legacy for gallery paths
299
  * Fixed: Resolved all found PHP warnings/notices/deprecations and strict errors
300
  * Fixed: Compatibility on Windows servers with network mounted document roots
301
  * Fixed: Ensure EXIF meta data is loaded from the appropriate exif_data array instead of exif_array
302
- * Fixed: Gallery Settings toggle not functioning
303
  * Fixed: Uploading breaking when thumbnail or image resizing fails due to lack of specific format support for image libraries
304
  * Fixed: Warning generated in nggallery.php checking useMediaRSS option
305
 
@@ -316,8 +337,8 @@ For more information, feel free to visit the official website for the NextGEN Ga
316
  * NEW: Gulp build system
317
  * NEW: Added "ngg_igw_placeholder_line_2_settings" and "ngg_igw_placeholder_line_1_settings" filters
318
  * NEW: Added "ngg_settings_during_image_generation" filter to adjust image generation
319
- * NEW: Added "ngg_before_save_thumbnail" filter for image manipulation abilities
320
- * NEW: Added the ability to apply GD filters during image generation
321
  * NEW: Integrated with WordPress SEO sitemaps to show include NGG images in image counts
322
  * Changed: Links to manage a gallery after it's been created don't appear in the IGW
323
  * Fixed: Freemius code shouldn't be minified
@@ -341,7 +362,7 @@ For more information, feel free to visit the official website for the NextGEN Ga
341
 
342
  = V2.1.33 - 04.25.2016 =
343
  * Fixed: Compatibility with themes and plugins which enqueue underscore.js in the head of the document
344
- * Fixed: Ensure that shutter reloaded can find it's image assets
345
 
346
  = V2.1.31 - 04.05.2016 =
347
  * NEW: Added constant NGG_SCRIPT_VERSION that is either the plugin version or rand() should SCRIPT_DEBUG be on
@@ -352,7 +373,7 @@ For more information, feel free to visit the official website for the NextGEN Ga
352
  * Fixed: Compatibility with WPML String Translation when uploading images without title or description
353
  * Fixed: Made get_image_url() encode gallery directory names 'because%this%is' a valid directory
354
  * Fixed: Manage Galleries > Search results not saving when edited
355
- * Fixed: Provided imagebrowser legacy templates not using AJAX pagination when enabled
356
  * Fixed: Resource manager breaking the layout of the Multisite Plugin Activation page
357
  * Fixed: Static url generation when the nextgen-gallery directory is a symlink outside of the WordPress roots
358
 
@@ -395,17 +416,17 @@ For more information, feel free to visit the official website for the NextGEN Ga
395
  * Fixed: Problem deleting interframe communication cookies
396
 
397
  = V2.1.15 - 09.09.2015 =
398
- * Secured: Image uploads
399
  * Fixed: Don't use esc_attr_e() to prevent translation issues
400
  * Fixed: Ensure that deleting a gallery doesn't delete anything it shouldn't
401
  * Fixed: get_gallery_abspath() should return NULL if the path doesn't exist
402
 
403
  = V2.1.13 - 09.09.2015 =
404
- * Secured: Image uploads
405
  * Fixed: Don't use esc_attr_e() to present translation issues
406
 
407
  = V2.1.10 - 09.01.2015 =
408
- * Secured: Escape output of parameters in templates to avoid XSS
409
 
410
  = V2.1.9 - 08.25.2015 =
411
  * NEW: Added ngg_manage_galleries_items_per_page filter
@@ -423,10 +444,10 @@ For more information, feel free to visit the official website for the NextGEN Ga
423
  * Fixed: Cornerstone/X compatibility
424
  * Fixed: Recovering images was 'generating' from backup instead of copying
425
  * Fixed: Setting post thumbnail more than once on a page/post
426
- * Fixed: Permanently hide display types from ATP without an active POPE module
427
 
428
  = V2.1.2 - 07.20.2015 =
429
- * NEW: Ability to import from Media Library
430
  * NEW: Added filter 'ngg_datamapper_table_name'
431
  * NEW: Added filter `ngg_legacy_template_directories` for legacy template locator (thanks Ross McKay)
432
  * NEW: Pagination available onManage Images page
@@ -438,7 +459,7 @@ For more information, feel free to visit the official website for the NextGEN Ga
438
  * Fixed: Ability to set NextGEN Image as Featured Image
439
  * Fixed: Don't use resource manager in download requests for WP Photo Shelter
440
  * Fixed: Updated custom jQuery-UI styling to resemble WordPress postbox styling
441
- * Fixed: Styled plupload buttons to resemble WordPress buttons
442
  * Fixed: Removed 'fixed' class from manage galleries table. Allows columns to adjust to content
443
  * Fixed: Removed note about flash support and fixed typoe (thanks Rene Wolf)
444
  * Fixed: Fixed typo in nggallery.po
@@ -448,7 +469,7 @@ For more information, feel free to visit the official website for the NextGEN Ga
448
  * Fixed: Adjusted album-compact template to always include p.ngg-album-gallery-image-counter
449
  * Fixed: Replaced empty gallery rendering in is_feed() with a link
450
  * Fixed: Removed default settings for imagerotator, which is no longer supported
451
- * Fixed: Optimizated scanning of images when importing a gallery
452
  * Fixed: When a gallery is deleted, ensure that DB and filesystem are purged
453
  * Fixed: Removed Insert Gallery Window box shadow
454
  * Fixed: Ensure that file_exists() calls are prefixed with @
@@ -463,7 +484,7 @@ For more information, feel free to visit the official website for the NextGEN Ga
463
  * NEW: Added ngg_manage_images_items_per_page filter
464
  * NEW: Added "ngg_get_image_url" filter
465
  * NEW: Including Ukranian and Polish translations
466
- * NEW: The ability to set template in widgets
467
  * Changed: Default thumbnail dimensions set to 240x160
468
  * Changed: Product now adheres to Pope 0.12 and provides get_modules_to_load()
469
  * Changed: Updated translations
@@ -500,7 +521,7 @@ For more information, feel free to visit the official website for the NextGEN Ga
500
  * Fixed: Use of C_Gallery_Mapper in C_Image_Wrapper
501
  * Fixed: Properly handle themes that don't call wp_footer() or wp_print_footer_scripts()
502
  * Fixed: Warning about missing style.php file on Network Admin -> Gallery page
503
- * Fixed: Warning about getimagesize() failure when backing up an image
504
 
505
  = v2.0.79 - 03.20.2015 =
506
  * Secured: Sanitized C_Displayed_Gallery->_add_find_in_set_column() third parameter
@@ -511,15 +532,15 @@ For more information, feel free to visit the official website for the NextGEN Ga
511
  * Fixed: Use of C_Gallery_Mapper in C_Image_Wrapper
512
  * Fixed: Properly handle themes that don't call wp_footer() or wp_print_footer_scripts()
513
  * Fixed: Warning about missing style.php file on Network Admin -> Gallery page
514
- * Fixed: Warning about getimagesize() failure when backing up an image
515
 
516
  = V2.0.78 - 03.12.2015 =
517
- * Secured: AJAX actions for uploading images and importing folders now uses nonce checks
518
 
519
  = V2.0.77 - 03.05.2015 =
520
  * NEW: Added "ngg_get_image_url" filter
521
  * Changed: Use a more reliable means of excluding Pro/Plus modules from using minified static resources
522
- * Fixed: Imagebrowser pagination with custom templates
523
  * Fixed: Custom CSS is enqueued late to ensure it's one of the last stylesheets loaded
524
  * Fixed: Fixed watermarking PNG images
525
  * Fixed: Using the "Import Metadata" bulk action overwrites existing data
@@ -529,7 +550,7 @@ For more information, feel free to visit the official website for the NextGEN Ga
529
  * Fixed: Restored nggdb->get_random_images(), nggdb->search_for_file, and nggdb->find_all_albums()
530
  * Fixed: Allow gallery slug as parameter to nggdb::get_gallery()
531
  * Fixed: Don't minify Plupload's i18n JavaScript
532
- * Fixed: Custom template images not being given their full effect code attributes
533
 
534
  = V2.0.76 - 02.24.2015 =
535
  * Fixed: Compatibility checks for very old versions of NextGEN Pro
@@ -547,13 +568,13 @@ For more information, feel free to visit the official website for the NextGEN Ga
547
  = V2.0.71 - 02.19.2015 =
548
  * NEW: Module files are compiled into a single package file to reduce disk I/O
549
  * NEW: All CSS stylesheets and Javascript source files are minified to reduce latency
550
- * NEW: All lightboxes are configured using an in-memory management class.
551
  * NEW: Uses Pope 2.0, benefiting from the new caching capabilities
552
  * NEW: NextGEN Gallery's functionality is disabled if NextGEN Pro is incompatible
553
  * NEW: Added ngg_effect_code filter
554
  * Changed: Updated FontAwesome to 4.3.0
555
  * Changed: Updated select2 to 3.5.2
556
- * Changed: Removed PicLens / CoolIris integration
557
  * Changed: Removed JSON API. Please use XML-RPC API instead
558
  * Changed: For performance reasons, we cache FS & url lookups/calculations
559
  * Changed: Greatly reduced the # of sql queries, and eliminated anything redundant
@@ -564,25 +585,25 @@ For more information, feel free to visit the official website for the NextGEN Ga
564
  * Changed: Insert Gallery Window is routed using wp-admin/admin_init
565
  * Changed: Removed unused code from ngglegacy module. Created wrappers for commonly-used functions
566
  * Changed: LZW module removed
567
- * Changed: Legacy template drop-down selection now using select2
568
  * Secured: Restrict folder browsing to NGG_IMPORT_ROOT constant
569
  * Fixed: Compatibility issue with PHP's transparent ZLIB compression
570
  * Fixed: Imagebrowser as lightbox effect not working when non-default permalink slug used
571
  * Fixed: Angled quotations marks used in shortcode parameters
572
- * Fixed: Compatibility between ImageBrowser display type and TwentyFifteen theme
573
  * Fixed: Allow pagination to retain query string url parameters when linking to other pages
574
  * Fixed: Fixed pagination issues with slideshow galleries displayed as thumbnails
575
  * Fixed: Fix C_GalleryStorage_Driver_Base->import_gallery_from_fs() not checking imgBackup
576
  * Fixed: Fixed problem with default settings being applied multiple times
577
- * Fixed: Fallback to "full" image sizes if "backup" images aren't available
578
  * Fixed: Use M_DataMapper's serialization methods throughout the codebase
579
  * Fixed: Conflict with WordPress SEO and get_the_excerpt() call
580
  * Fixed: Don't run Resource Manager on wp-login.php or wp-sign.php
581
- * Fixed: TinyMCE Image Editor conflict with Insert Gallery Window placeholder images
582
  * Fixed: Fix Shutter positioning when admin bar is displayed
583
- * Fixed: Allow deselection of a legacy template
584
- * Fixed: Prevent conflicts when using imagebrowser as a lightbox effect
585
- * Fixed: Pagination not working for slideshows using thumbnail integration
586
 
587
  = V2.0.66.33 - 11.24.2014 =
588
  * Fixed: Broken NextGEN Pro ecommerce-related shortcodes
@@ -593,11 +614,11 @@ For more information, feel free to visit the official website for the NextGEN Ga
593
 
594
  = V2.0.66.29 - 09.17.2014 =
595
  * NEW: Added skip_excluding_globally_excluded_images property to displayed gallery objects
596
- * Fixed: SQL generation for random image selection
597
  * Fixed: Adjust regex for replacing displayed gallery placeholder images
598
  * Fixed: Removed filters to home_url needed previously for WMPL compatibility
599
  * Fixed: Use canonical redirects when appropriate
600
- * Fixed: Ability to override image files using XML-RPC
601
 
602
  = V2.0.66.27 - 08.18.2014 =
603
  * Fixed: Missing class.frame_communication_option_handler.php error
@@ -618,7 +639,7 @@ For more information, feel free to visit the official website for the NextGEN Ga
618
  * Secured: XSS vulnerability on Manage Albums page
619
 
620
  = V2.0.66.16 - 07.30.2014 =
621
- * NEW: Added new "limit" setting to Slideshow widgets
622
  * NEW: Added a "ngg_routes" action for other plugins to hook into to provide new routes
623
  * NEW: Added NGG_SKIP_LOAD_SCRIPTS constant, which existed in 1.9.x
624
  * NEW: Added NGG_GALLERY_ROOT_TYPE constant. Set to 'content' to load galleries from the content_dir / content_url
@@ -632,7 +653,7 @@ For more information, feel free to visit the official website for the NextGEN Ga
632
  * NEW: Russian (ru_RU) language thanks to SnakeD3
633
  * NEW: Spanish (es_ES) language thanks to Andrew Kurtis at WebHostingHub
634
  * Changed: Updated Czech language thanks to Separatista; additional thanks to Martin Krizek for the original translation who was mistakenly unaccredited
635
- * Changed: "Upgrade to Pro" page has new design, advertises for NextGEN Plus
636
  * Changed: Basic Albums templates now given the image counter P element the class 'ngg-album-gallery-image-counter' (by user request)
637
  * Changed: Gallery widgets now apply height:auto to their element; fixes compatibility with some themes
638
  * Changed: Random galleries should be substantially faster now (1000% or more for large image tables)
@@ -648,14 +669,14 @@ For more information, feel free to visit the official website for the NextGEN Ga
648
  * Fixed: Flush 'all' caches when pope_module_list setting changes
649
  * Fixed: Don't enqueue related images css in the admin
650
  * Fixed: Basic Slideshows fixes WP creating extraneous P element above the slideshow display
651
- * Fixed: Basic Singlepic will now display images marked 'excluded' in the admin
652
  * Fixed: Admin pages can now update when the "Save" button text has been translated
653
 
654
  = V2.0.66 - 05.20.2014 =
655
- * Secured: Check mime type of image files using a variety of mechanisms
656
 
657
  = V2.0.65 - 05.04.2014 =
658
- * Secured: Limit uploads to images and zips
659
 
660
  = V2.0.63 - 04.29.2014 =
661
  * NEW: Translation ready
@@ -666,16 +687,16 @@ For more information, feel free to visit the official website for the NextGEN Ga
666
  * NEW: Bundled Browser+ JavaScript library
667
  * NEW: Added NGG_DISABLE_FILTER_THE_CONTENT constant to manage conflicts
668
  * Changed: Moved jquery.nextgen_radio_toggle.js to NextGEN Admin Module
669
- * Changed: Original display settings are passed to secondary display types
670
- * Fixed: Thumbnail dimension calculations are inaccurate by 1px when maintaining aspect ratio
671
  * Fixed: Copy IPTC data from original to new image when creating new sizes / thumbnails
672
- * Fixed: Use correct absolute path when importing images in a multisite environment
673
  * Fixed: Incorrect display of disk space quotas in multisite environments
674
  * Fixed: Removed redundant roles form in multisite environments
675
  * Fixed: Insert Gallery Window support for multisite environments
676
- * Fixed: Incorrect handling of NextGEN Styles in multisite environments
677
  * Fixed: Not honouring NGG_IMPORT_ROOT constant
678
- * Fixed: Fixed inability to edit gallery properties using XMLRPC's edit_gallery method
679
  * Fixed: Alignment issues in Basic Compact Albums caused by subalbums not displaying image 'counter'
680
  * Fixed: Display setting forms compatibility issue with WordPress 3.9
681
  * Fixed; Compability with jQuery Dialogs in WordPress 3.9
@@ -691,8 +712,8 @@ For more information, feel free to visit the official website for the NextGEN Ga
691
  * Fixed: Resource manager is manipulating feeds
692
  * Fixed: Convert absolute urls to relative urls for lightboxes
693
  * Fixed: Start the resource manager as early as we can within the init action
694
- * Fixed: Routing problem for galleries with images named 1.jpg, 2.jpg, 3.jpg, etc.
695
- * Fixed: Added tooltips to basic slideshow settings
696
  * Fixed: Remove CKEditor's NextGEN button, which is incompatible with NextGEN Gallery 2.x
697
 
698
  = V2.0.61 - 04.01.2014 =
@@ -726,10 +747,10 @@ For more information, feel free to visit the official website for the NextGEN Ga
726
  * Changed: Transients are removed every 30 minutes instead of 60 minutes
727
  * Changed: Admin Page & Form components refactored to allow custom POST processing
728
  * Changed: Default path for NEW multisite installations to wp-content/uploads/sites/%BLOG_ID%/nggallery/
729
- * Fixed: Ability to upload ZIP files on Windows hosts
730
  * Fixed: Support for filenames with non-ASCII characters
731
- * Fixed: Dynamic updates in the Attach to Post interface (interframe communication)
732
- * Fixed: Attach to Post interface freezing in IE11
733
  * Fixed: Path issues on Windows Servers
734
  * Fixed: Module installer integrity
735
  * Fixed: Database query performance. No more joins to the WP options table
@@ -740,18 +761,18 @@ For more information, feel free to visit the official website for the NextGEN Ga
740
  * Fixed: Corrupted MediaRSS feeds
741
  * Fixed: Padding on Gallery Settings and Other Options pages
742
  * Fixed: Routing issues on subdirectory installs
743
- * Fixed: Importing galleries using the Attach to Post Interface
744
  * Fixed: Gallery path calculations on Windows web servers
745
  * Fixed: Sub-album urls not processed correctly
746
  * Fixed: Apply maximum entity count to existing displayed galleries
747
- * Fixed: NextGEN Gallery Thumbnail Widget shouldn't use ImageBrowser effect
748
- * Fixed: Ability to set shuffle parameter for ImageRotator slideshows
749
- * Fixed: PHP warning about HTMLDocument when displaying a SinglePic
750
- * Fixed: Sanitization of gallery title
751
  * Fixed: Home URL now used instead of Site URL in MediaRSS feed
752
- * Fixed: Attach to Post interface broken when WPML is installed
753
- * Fixed: Attach to Post interface instructing browser to cache the page
754
- * Fixed: Watermarking not working in low-memory environments
755
  * Fixed: Maximum images limit not being applied for galleries already created.
756
  * Fixed: Double forward slashes in static urls
757
  * Fixed: Don't sleep when checking if the installer is running
@@ -774,28 +795,28 @@ For more information, feel free to visit the official website for the NextGEN Ga
774
  * NEW: Added NGG_IMPORT_ROOT constant. Define and set to TRUE to browse from a custom directory
775
  * NEW: Added NGG_DEBUG constant. Define and set to TRUE to display helpful messages for debugging
776
  * NEW: Each custom table record will have an associated custom post record for expansion
777
- * NEW: Display helpful error messages when there's a problem uploading images
778
  * NEW: Add data-(src|thumbnail|image-id|title|description) attribute to gallery image anchors
779
- * NEW: Variant support for displayed gallery sources. Random images is limited to 5 variations
780
  * Fixed: Excessive creation of transients for random galleries
781
- * Fixed: Many issues prohibiting the ability to upload images
782
  * Fixed: Compatibility with NextGEN Gallery Export Plugin for Adobe Lightroom (thanks Vladimir!)
783
- * Fixed: Sorting in the Attach to Post interface
784
  * Fixed: HTML allowed in gallery/album descriptions
785
- * Fixed: Requests for galleries within albums that have numeric names are broken
786
  * Fixed: Call to a non-member function get() on WP_Query
787
- * Fixed: Ability to sort by Image ID in the Attach to Post interface
788
- * Fixed: Isolate the Attach to Post from implicit third-party script inclusion
789
  * Fixed: Check for the existance of thumbnails when generating urls, and if missing, generate new ones
790
  * Fixed: Compatibility with NextGEN Facebook OpenGraph+ plugin
791
  * Fixed: Various XML-RPC issues
792
- * Fixed: Widgets stylesheet not included
793
  * Fixed: Issue with color not being pre-selected when previewing Watermark
794
  * Fixed: E_NOTICE emitted when cleaning up cached image files
795
- * Fixed: E_NOTICE emitted when viewing display type settings
796
  * Fixed: Typo adjusting pcre.backtrack_limit for shortcodes
797
- * Fixed: Content within the tabs of the Attach to Post interface cut-off
798
- * Fixed: Routing problem which would cause conflicts with different display types on the same page
799
  * Fixed: Broken Dynamic CSS links on GoDaddy
800
  * Fixed: Ability to use HTML in gallery/album descriptions
801
  * Fixed: Sub-album requests conflicting with paginated galleries on the same page
@@ -803,90 +824,90 @@ For more information, feel free to visit the official website for the NextGEN Ga
803
 
804
  = V2.0.33 - 10.21.2013 =
805
  * NEW: Requests /ngg_tag/[tagname] will create a displayed gallery
806
- * NEW: Option added to "Import Gallery" tab to use original images
807
  * Fixed: Links are broken on the ngg_tags-sitemap.xml file by WordPress SEO
808
  * Fixed: PHP notice: Attempt to assign property of non-object
809
- * Fixed: Undefined property warnings when using NextGEN Basic Thumbnails
810
  * Fixed: Detect if an applying a transient to a displayed gallery was successful
811
  * Fixed: Compatibility issues with BJ-Lazy-Load and Colorbox
812
- * Fixed: Pagination conflicts for multiple Imagebrowsers on the same page
813
  * Fixed: Ability to display previous exception with debug mode
814
- * Fixed: Tagclouds not working in multisite instances
815
- * Fixed: Load widgets.css when a widget is being used
816
  * Fixed: Installer should remove all instances of the component factory
817
- * Fixed: Widget settings interface not intuitive
818
  * Fixed: Inability to upload images in some Windows host environments
819
- * Fixed: Sorting images/galleries using the Attach To Post interface
820
  * Fixed: Fix detection of HTTPS (pull request by Leonhardt Wille)
821
  * Fixed: Compilation errors of regular expressions
822
  * Fixed: Pro galleries wouldn't display in environments using PHP 5.3.3 or less
823
  * Fixed: Scanning of router slug is now limited to the uri, not the url
824
  * Fixed: Show slideshow link isn't required for thumbnail/imagebrowser integration
825
- * Fixed: WordPress media-upload with 'singlepic' image size
826
  * Fixed: Use target=_blank when the link setting is provided for NextGEN Basic Singlepic
827
  * Fixed: Only display rendering errors if WP_DEBUG is enabled
828
 
829
  = V2.0.31 - 10.03.2013 =
830
- * NEW: Restored AJAX pagination for NextGEN Basic ImageBrowser display type
831
  * Fixed: Compatibility with WordPress Local SEO by Yoast
832
- * Fixed: Inability to upload images if image_slug field was missing in database
833
  * Fixed: Integration of NextGEN Basic Thumbnail and NextGEN Basic Slideshow display types
834
  * Fixed: Photocrati Resource Manager further adjusted to be third-party friendly
835
  * Fixed: Added the ability to find legacy templates in both the child/parent theme directories
836
- * Fixed: JavaScript errors in Attach to Post interface
837
  * Fixed: Router can handle port numbers in urls
838
  * Fixed: Carousel template was linking to NextGEN Basic ImageBrowser view
839
- * Fixed: SQL query generated for displayed galleries using tags as source
840
  * Fixed: 3rd party compat: raise & never lower pcre.backtrack_limit
841
 
842
  = V2.0.30 - 09.25.2013 =
843
- * NEW: Restored the ability to use imagebrowser display type instead of a lightbox effect
844
- * Changed: Displayed galleries are no longer rendered in RSS feeds
845
  * Changed: Removed "Plugin Check" widget from overview page
846
  * Fixed: Silence PHP warnings/errors in an output buffer for AJAX actions
847
  * Fixed: Compatibility issue with WordPress SEO and broken site maps (and large error_logs)
848
  * Fixed: Compatibility issue with AJAX Event Calendar (and possibly others)
849
  * Fixed: Adjusted Photocrati Resource Manager to be third-party friendly
850
  * Fixed: Fixed empty result set for displayed galleries selecting 'All' tags
851
- * Fixed: URL generation for imagebrowser pagination links
852
- * Fixed: Ensure that image meta is imported on creation
853
  * Fixed: Ensure that transients are removed when an external object cache is used
854
- * Fixed: Don't load pluggable.php. This will fix plugin conflicts
855
- * Fixed: In Attach to Post interface, galleries created in one tab weren't showing in another
856
  * Fixed: Don't output frame events cookie for XML-RPC requests
857
 
858
  = V2.0.27 - 09.18.2013 =
859
  * Fixed: Reduce performance impact of purging displayed gallery transients
860
 
861
  = V2.0.25 - 09.18.2013 =
862
- * Reverting to the 2.0.21 codebase, due to major performance issues in 2.0.23 and 2.0.24
863
 
864
  = V2.0.23 - 09.16.2013 =
865
  * NEW: WP-Cron job to periodically clean-up displayed gallery transients
866
  * NEW: Added "excluded_container_ids" as parameter for ngg_images shortcode
867
- * Fixed: Lightbox effect is honoured by all display types
868
- * Fixed: Highslide displays images from the correct displayed galleries
869
  * Fixed: Ensure that sub-albums display correctly when the word "album" is part of a slug
870
  * Fixed: Ensure that sub-albums display correctly when numerical slugs are used
871
  * Fixed: Related images heading only added when Related Images functionality is enabled
872
  * Fixed: PHP Warning about undefined index when viewing basic albums
873
  * Fixed: AJAX handling is third-party compatible
874
- * Fixed: Image date is no longer overwritten when an image is modified
875
  * Fixed: Fixed issue with displayed galleries using source='tags'
876
  * Fixed: Problem with transient cache not getting flushed properly from Other Options page
877
  * Fixed: Use correct gallery/transient ID when ajax pagination is used
878
 
879
  = V2.0.21 - 09.09.2013 =
880
  * NEW: Multisite support
881
- * Changed: Default image quality set to 100 for generated images
882
  * Changed: Removed dependence on simplehtmldom library
883
  * Fixed: Related images functionality works as it did in 1.9.x
884
  * Fixed: Don't compress inline JavaScript in post/page content
885
- * Fixed: Click-to-advance slideshow behavior for slideshows
886
  * Fixed: Security warnings from VaultPress
887
- * Fixed: View as Slideshow link works with AJAX pagination
888
- * Fixed: Broken links on Overview page
889
- * Fixed: Backup images option
890
  * Fixed: Stylesheet url generated correctly for Windows hosts
891
  * Fixed: Compatibility with NextGen Custom Fields plugin
892
  * Fixed: Compatibility with Adsense Explosion plugin
@@ -896,11 +917,11 @@ For more information, feel free to visit the official website for the NextGEN Ga
896
  Fixed: Match legacy behaviour when changing gallery path, i.e. don't move files
897
 
898
  = V2.0.14 - 08.27.2013 =
899
- * NEW: Added the ability to override thumbnail settings for NextGEN Basic Albums
900
  * NEW: Shortcode Manager API, which ensures that shortcodes are outputted as intended
901
  * Changed: Re-added the ability to select the original image size for widgets
902
  * Fixed: Ensure that stylesheet url returned is correct for Windows hosts
903
- * Fixed: Broken links and lightbox effects with AJAX pagination
904
  * Fixed: Try to ensure that third party plugins don't add content to our dynamic JS
905
  * Fixed: Improved reliability of iframely.js
906
  * Fixed: Ensure that urls are generated correctly in HTTPs environments
@@ -911,8 +932,8 @@ Fixed: Match legacy behaviour when changing gallery path, i.e. don't move fi
911
  * NEW: Added "run_ngg_resource_manager" hook to by-pass our resource manager
912
  * Changed: Removed "Reset & Uninstall" tab, for now
913
  * Fixed: Compatibility with W3 Total Cache. Please flush cache after updating.
914
- * Fixed: Conflicts with Photocrati Theme Galleries
915
- * Fixed: Blank Attach to Post interface window
916
  * Fixed: Fixed ability to change Lightbox Effect settings
917
  * Fixed: Implemented techniques to ensure WP_Query variables aren't overwritten
918
  * Fixed: Enqueuing AJAX JS libraries twice in wp-admin
@@ -921,25 +942,25 @@ Fixed: Match legacy behaviour when changing gallery path, i.e. don't move fi
921
  * Fixed: Fixed installer issues
922
 
923
  = V2.0.7 - 08.09.2013 =
924
- * NEW: New resource manager that fixes many plugin and theme incompatibilities
925
  * NEW: Styles (custom stylesheets) should reside in wp-content/ngg_styles
926
  * NEW: Added option to "Other Options -> Misc" to control maximum images returned
927
  * Secured: Removed default connector for jQuery FileTree library
928
  * Changed: Updated the simplehtmldom library to version 1.5
929
  * Changed: jQuery is now enqueued at the beginning of every request
930
  * Fixed: Incompatibilities with BuddyPress
931
- * Fixed: Incompatibilities with Events+, bbPress, Custom Permalinks, and many other plugins
932
  * Fixed: Incompcatibilities with Member Access, AMember, Magic Fields, and More Fields
933
- * Fixed: Incompatibilities with Elegant Themes, Oxygen, Responsive, and many other themes
934
- * Fixed: Ensure that gallery images don't have a border by default
935
- * Fixed: Conflict between imagebrowser and album urls
936
  * Fixed: Reverted default gallerypath to wp-content/gallery/
937
  * Fixed: Upgrade-safe way of overriding Styles
938
  * Fixed: Generation of AJAX url is now based on slug
939
  * Fixed: Restore nggShowGallery and nggShowSlideshow as wrappers to new API
940
  * Fixed: Always use domain as specified by WordPress Site URL
941
  * Fixed: Use WordPress Home URL over Site URL when appropriate
942
- * Fixed: Numerous pagination issues
943
  * Fixed: Adjusted our forms to comply with WordPress Firewalls
944
  * Fixed: Correct use of select2 DOM selector for maximum compatibility
945
  * Fixed: Path and URL calculations for Windows and UNIX environments
@@ -953,10 +974,10 @@ Fixed: Match legacy behaviour when changing gallery path, i.e. don't move fi
953
 
954
  = V2.0 - 07.30.2013 =
955
  * NEW: Improved user experience throughout the plugin, settings and usage.
956
- * NEW: Plupload queue uploader that allows for bulk and zip uploads within the same interface.
957
- * NEW: Complete redesign of the NextGEN options panel
958
- * NEW: Added new interface for adding galleries from pages and posts.
959
- * NEW: Galleries are now mobile friendly and responsive, which is most noticeable with a responsive theme.
960
  * NEW: Streamlined functionality for displaying galleries based on tags.
961
  * NEW: Architecture based on Pope Framework (http://bitbucket.org/photocrati/pope-framework)
962
  * NEW: New shortcode, “ngg_images”, and corresponding Attach to Post interface
@@ -968,12 +989,12 @@ Fixed: Match legacy behaviour when changing gallery path, i.e. don't move fi
968
  * Changed: NextGEN styles now override vs replace default styles
969
  * Changed: NextGEN legacy templates have been deprecated (but still function)
970
  * FIXED: The ability to use NextGEN image as a Featured Image.
971
- * FIXED: Many bugs and annoyances, such as PHP warnings, errors, etc.
972
 
973
  = V1.9.13 - 06.11.2013 =
974
- * NEW: Slideshows are now centered to their content area
975
- * Secured: Ensure that only logged in users can upload images
976
- * Fixed: Import date is presered are no longer Jan 1 1970
977
  * Fixed: Removed mention of upgrade.php, which no longer exists
978
 
979
  = V1.9.12 - 02.15.2013 =
@@ -986,7 +1007,7 @@ Fixed: Match legacy behaviour when changing gallery path, i.e. don't move fi
986
  * Changed: Database schema is automatically updated when out-of-date
987
  * Fixed: Fixed several incompatibility issues with Jetpack
988
  * Fixed: Empty drop-down for "Page Link To"
989
- * Fixed: Alphabetical image sorting
990
  * Fixed: Compatibility with Arjuna X theme
991
  * Fixed: “Creating default object from empty value” on album page
992
  * Fixed: Compatibility issues with PHP 5.4 on album page
@@ -1002,10 +1023,10 @@ Fixed: Match legacy behaviour when changing gallery path, i.e. don't move fi
1002
  * Fixed: Correct use of register_uninstall_hook
1003
  * Fixed: CSS and usability issues with the TinyMCE window used to display galleries
1004
 
1005
- * NEW: JW ImageRotator v3.17 is now bundled with the plugin and used by default.
1006
  * Changed: Removed database upgrade code for versions of NextGEN Gallery earlier than 1.9.3
1007
  * Fixed: Compatibility with WordPress v3.5 ( wpdb->prepare() warnings )
1008
- * Fixed: Sorting by filename now produces expected results using a natural sorting algorithm
1009
 
1010
  = V1.9.8 - 12.05.2012 =
1011
  * Secured: Removed bundled version of swfupload. See fix below for SCM information.
@@ -1015,8 +1036,8 @@ Fixed: Match legacy behaviour when changing gallery path, i.e. don't move fi
1015
 
1016
  = V1.9.7 - 11.13.2012 =
1017
  * Secured: Removed bundled version of swfupload; using WordPress-bundled version instead for WordPress 3.2 instances
1018
- * Changed: Using JQuery UI for the image sorting interface (thanks Tomás Soler)
1019
- * Bugfix: Image uploads work in WP 3.2 when using Safari
1020
  * Bugfix: Adjusted TinyMCE window to use built-in JavaScript libraries
1021
  * Bugfix: Removed Photocrati acquisition announcement
1022
  * Bugfix: Fixed incorrect usage of ImageJpeg() function
@@ -1033,7 +1054,7 @@ Fixed: Match legacy behaviour when changing gallery path, i.e. don't move fi
1033
  * Changed: Branding changes following Photocrati acquisition (removed donation messages and updated links)
1034
  * Secured: Use WordPress-bundled JavaScript libraries for swfobject and swfupload instead of bundling our own
1035
  * Bugfix: Adjusted thickbox effect styling to ensure that the lightbox is always displayed in the foreground
1036
- * Bugfix: Fixed compatibility issues with Contact Form 7 and other plugins by following WordPress Plugin conventions
1037
  * Bugfix: Fixed network-wide activation in WordPress 3.4
1038
  * Bugfix: Plugin is no longer dependent on it's folder name
1039
 
@@ -1041,15 +1062,15 @@ Fixed: Match legacy behaviour when changing gallery path, i.e. don't move fi
1041
  * Bugfix : Ensure to set the slug for "all" albums
1042
  * Bugfix : Updated german translation ( THX to Roger Hunziker )
1043
  * Bugfix : Ensure error checking on IPTC array (THX to Kristian Edlund)
1044
- * Bugfix : Handle IE8 cached images better in slideshow
1045
- * Bugfix : Show album preview image if selected (THX to Kristian Edlund)
1046
 
1047
  = V1.9.2 - 17.01.2012 =
1048
  * NEW : Added more XMLRPC commands (THX to Vladimir Vinogradsky)
1049
  * Changed : Rework Post-thumbnail function (THX to Kristian Edlund)
1050
- * Bugfix : Check first for valid images on unzip (only Mac OS zip-files)
1051
  * Bugfix : Increase z-index for twenty eleven theme
1052
- * Bugfix : Support non latin chars in tagcloud
1053
  * Bugfix : Allow other tinymce intance
1054
  * Bugfix : Better support for WPML translation
1055
 
@@ -1061,16 +1082,16 @@ Fixed: Match legacy behaviour when changing gallery path, i.e. don't move fi
1061
  * Bugfix : IE7/IE8 width set correctly for edit album autocomplete field
1062
 
1063
  = V1.9.0 - 27.11.2011 =
1064
- * NEW : Keep images transparency for PNG and GIF format
1065
  * NEW : Switch to Plupload, support now HTML5 Upload (only with WordPress 3.3)
1066
- * NEW : Added client side resize feature (only with WordPress 3.3)
1067
  * NEW : Support for gallery templates in album shortcodes [ album id=x template="name" gallery="templatename" ]
1068
  * NEW : Added new hook ngg_delete_picture
1069
  * Changed : Updated to jQuery Cycle Version 2.9995
1070
  * Changed : Always cache the single pictures, remove option
1071
  * Bugfix : Couldn't use bulk operation for search results
1072
  * Bugfix : Bugfix for Edit thumbnails under IE 8 + 9
1073
- * Bugfix : Allow empty altext in ngg.editImage
1074
  * Bugfix : Various PHP notice fixes
1075
  * Bugfix : Resize fix for Shutter effect and mobile Browser
1076
  * Bugfix : FTP Import missing slug field into database
@@ -1084,10 +1105,10 @@ Fixed: Match legacy behaviour when changing gallery path, i.e. don't move fi
1084
  * Bugfix : Sub-Albums in Albums didn't create the correct link
1085
  * Bugfix : AJAX Pagination didn't work anymore
1086
  * Bugfix : Adding index.php to home_url()
1087
- * Bugfix : Preview picture lost on backend gallery page 2 or higher
1088
 
1089
  = V1.8.2 - 12.07.2011 =
1090
- * Bugfix : Set pagination variables for search result, otherwise update failed
1091
  * Bugfix : Update failed for paged galleries since WordPress 3.2
1092
 
1093
  = V1.8.1 - 18.06.2011 =
@@ -1098,21 +1119,21 @@ Fixed: Match legacy behaviour when changing gallery path, i.e. don't move fi
1098
 
1099
  = V1.8.0 - 12.06.2011 =
1100
  * NEW : Full rework of permalink url structure
1101
- * NEW : Adding Google Sitemaps for Images (require WordPress SEO plugin by YOAST )
1102
  * NEW : Support for WPML ( WordPress Multilingual Plugin )
1103
  * NEW : Adding support for arrow key in shutter effect (THX to Flyvans)
1104
- * NEW : Adding sort operation for galleries overview page
1105
  * Changed : Updated pagination to new WP3.1 style
1106
  * Bugfix : Create unique slug in a better way
1107
  * Bugfix : Rework screen options filter for gallery and image table
1108
  * Bugfix : Empty values in XMLRPC update calls are ignored
1109
  * Bugfix : Create gallery failed when safe-mode on
1110
- * Bugfix : Permalink didn't work in combination with album & imagebrowser
1111
 
1112
  = V1.7.4 - 15.02.2011 =
1113
  * Bugfix : Disallow direct call of ajax file to avoid path disclosure (THX to High-Tech Bridge SA)
1114
  * Bugfix : Rework jQuery Cycle slideshow for IE compat reason (THX to Justin Dickenson)
1115
- * Bugfix : Resize only larger images in slideshow
1116
  * Bugfix : Improved image format detection in gd.thumbnail class (THX to Kupar.b)
1117
 
1118
  = V1.7.3 - 20.01.2011 =
@@ -1124,7 +1145,7 @@ Fixed: Match legacy behaviour when changing gallery path, i.e. don't move fi
1124
  * Bugfix : WP3.1 compat issue, show site admin page only on Multisite installation
1125
 
1126
  = V1.7.2 - 13.12.2010 =
1127
- * Bugfix : Adding images to database require slug (NOT NULL)
1128
 
1129
  = V1.7.1 - 13.12.2010 =
1130
  * Changed : Disable upgrade for PHP4 user
@@ -1143,35 +1164,35 @@ Fixed: Match legacy behaviour when changing gallery path, i.e. don't move fi
1143
  * Bugfix : Install/Upgrade failed when table prefix contain captial letters
1144
  * Bugfix : Fix validation issues in Media-RSS
1145
  * Bugfix : Empty tags in XMP Meta causes PHP error
1146
- * Bugfix : Rework load mechanism for slideshow
1147
- * Bugfix : Copy meta data when image is copied
1148
  * Bugfix : Icon Support for Ozh' Admin Drop Down Menu
1149
- * Bugfix : Use correct sort order in slideshow
1150
 
1151
  = V1.6.2 - 19.09.2010 =
1152
  * NEW : Added constant NGG_SKIP_LOAD_SCRIPTS to avoid script load
1153
  * Bugfix : Load Tags library with core files
1154
- * Bugfix : Slideshow script failed in IE7, load script now in header
1155
- * Bugfix : Load slideshow widget always
1156
  * Changed : New admin notice for database upgrade
1157
- * Changed : Rework crop feature for featured images
1158
  * Changed : Use site_url() instead get_option ('siteurl'), required for SSL support
1159
 
1160
  = V1.6.1 - 08.09.2010 =
1161
  * Bugfix : Script load of swfobject.js failed
1162
- * Bugfix : Show sideshow also with 1 or 2 images
1163
  * Bugfix : Rework null byte check in zip upload
1164
 
1165
  = V1.6.0 - 07.09.2010 =
1166
  * NEW : Wordpress 3.0 Network (Multi-Site) support
1167
- * NEW : Integrate jQuery Cycle as NON-Flash slideshow
1168
  * NEW : Adding jQuery File Tree for import folder (THX to Sergey Pasyuk )
1169
  * NEW : Added action hook 'ngg_show_imagebrowser_first' on custom request
1170
  * NEW : Added filter hook 'ngg_slideshow_size' to resize sildeshow for mobile browser plugins
1171
  * Changed : Reorder tabs for upload
1172
  * Changed : New menu icon and screen icon (THX to Ben Dunkle)
1173
  * Changed : Load frontend libs always
1174
- * Changed : Rework of overview page
1175
  * Bugfix : Security bugfix for Zip-Upload (THX to Dominic Szablewski)
1176
  * Bugfix : Allow JPG, PNG, GIF extension
1177
  * Bugfix : New German translation (THX to Martin Kramarz)
@@ -1188,12 +1209,12 @@ Fixed: Match legacy behaviour when changing gallery path, i.e. don't move fi
1188
  * Bugfix : Esc_URL in Media RSS
1189
 
1190
  = V1.5.3 - 11.04.2010 =
1191
- * New : Adding pagination to footer
1192
- * Changed : Perpare new filter to replace slideshow
1193
  * Bugfix : Remove non-breaking space from navigation
1194
  * Bugfix : Pagination of galleries
1195
  * Bugfix : Fixed brackets position for old shortcode query
1196
- * Bugfix : Slideshow option 'Show next image on click" has wrong default value
1197
 
1198
  = V1.5.2 - 25.03.2010 =
1199
  * Bugfix : XSS security vulnerability (THX to Core Security Advisories Team , Pedro Varangot)
@@ -1201,13 +1222,13 @@ Fixed: Match legacy behaviour when changing gallery path, i.e. don't move fi
1201
 
1202
  = V1.5.1 - 23.03.2010 =
1203
  * Bugfix : PHP4 compat issue for Add gallery & options page
1204
- * Bugfix : Gallery widget can now have a empty title
1205
  * Bugfix : Adding correct stripslash for gallery title
1206
 
1207
  = V1.5.0 - 18.03.2010 =
1208
  * NEW : Support for Post thumbnail feature
1209
- * NEW : Backup and Recover function for images (THX to Simone Fumagalli)
1210
- * NEW : Resize images after upload (THX to Simone Fumagalli)
1211
  * NEW : Added a JSON class for fetching galleries in a RESTful way (see xml/json.php)
1212
  * NEW : Adding various new capabilities for user roles
1213
  * NEW : Auto downloader for translation file
2
  Contributors: photocrati, imagely
3
  Tags: wordpress gallery plugin, gallery, nextgen, nextgen gallery, photo gallery, image gallery, photography, slideshow, images, photo, photo album, watermark
4
  Requires at least: 4.0.0
5
+ Stable tag: 2.2.8
6
  Tested up to: 4.7.3
7
  License: GPLv2
8
 
12
 
13
  = WordPress Gallery Plugin =
14
 
15
+ NextGEN Gallery has been the industry's standard **WordPress gallery plugin** since 2007 and continues to receive over 1.5 million new downloads per year. It's easy for simple photo galleries, but powerful enough for the most demanding photographers, visual artists, and imaging professionals.
16
 
17
+ On the back end, NextGEN offers a complete WordPress gallery management system with the ability to batch upload photos, import meta data, add/delete/rearrange/sort photos, edit thumbnails, group galleries into albums, and more.
18
 
19
+ On the front end, the free version of NextGEN provides two main gallery display styles (slideshows and thumbnail galleries) and two album styles (compact and extended), all of which come with a wide array of options for controlling size, style, timing, transitions, controls, lightbox effects, and more.
20
 
21
  Learn more about <a href="https://www.imagely.com/wordpress-gallery-plugin/" target="_blank">NextGEN WordPress Gallery Plugin features.</a>
22
 
23
  **Demos**<br>
24
  *<a href="https://www.imagely.com/wordpress-gallery-plugin/basic-thumbnail-gallery/" target="_blank">Basic Thumbnail Gallery Demo</a><br>
25
+ *<a href="https://www.imagely.com/wordpress-gallery-plugin/basic-slideshow-gallery/" target="_blank">Basic Slideshow Gallery Demo</a><br>
26
  *<a href="https://www.imagely.com/wordpress-gallery-plugin/basic-compact-album/" target="_blank">Basic Compact Album</a><br>
27
  *<a href="https://www.imagely.com/wordpress-gallery-plugin/basic-extended-album/" target="_blank">Basic List Album</a><br>
28
 
29
+ **INTRODUCING NEXTGEN GALLERY PRO.** NextGEN Plus and NextGEN Pro are premium WordPress gallery plugin extensions for NextGEN Gallery that add new photo gallery displays, lightboxes, ecommerce, proofing, and pro support. Learn more about <a href="https://www.imagely.com/wordpress-gallery-plugin/" target="_blank">NextGEN Plus and NextGEN Pro photo plugin features.</a>
30
 
31
  **Demos**<br>
32
  *<a href="https://www.imagely.com/wordpress-gallery-plugin/pro-mosaic-gallery/" target="_blank">Pro Mosaic Gallery</a><br>
63
  Photocrati Media 2012-2016<br>
64
  Alex Rabe 2007-2011
65
 
66
+ This program is free software. You can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
67
 
68
  This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
69
 
71
 
72
  == Installation ==
73
 
74
+ INSTALLATION: The easiest way to start uploading your photos is to login to you WordPress dashboard, go to Plugins >> Add New, search for NextGEN Gallery, and click to install. You can also download the zip file from this page and upload it from the Plugins >> Add New > Upload page.
75
 
76
+ HOW TO USE: Just go to a page or post and click the NextGEN Gallery icon. From our Insert Gallery Window, you can create, manage, customize, and display your photo galleries. You can also manage your photo galleries and gallery settings from the central options area under the "Gallery" tab on your dashboard menu.
77
 
78
  DOCUMENTATION: See <a href="https://www.imagely.com/docs/nextgen-gallery/" target="_blank">NextGEN Gallery Documentation</a>.
79
 
95
 
96
  == Shortcode ==
97
 
98
+ NextGEN Gallery 2.x introduces our new Insert Gallery Window, which means you never need to work with shortcodes again if you would prefer not too.
99
 
100
  If you do want to work with shortcodes, we've also introduce a new, more powerful, and more flexible shortcode system with NextGEN Gallery 2.0.
101
 
106
  == Frequently Asked Questions ==
107
 
108
 
109
+ = Why are my photo galleries not opening up in a lightbox after I move my site? =
110
 
111
  This is often due to the URL paths to the CSS and JavaScript files used by the Lightbox Effects not being changed to relevant addresses based on the new site. This article will help sort out this issue if that is the case: <a href="https://www.imagely.com/docs/galleries-opening-lightbox/" target="_blank">Why are my galleries not opening up in a lightbox?</a>.
112
 
120
  Part of what makes the NextGEN Gallery WordPress gallery plugin so popular is its flexibility - it works with the vast majority of premium and free themes, without requiring any coding.
121
 
122
 
123
+ = Are the photo galleries flash based? =
124
 
125
+ No, NextGEN Gallery uses Javascript and jQuery based displays to ensure compatibility across the widest range of displays possible.
126
 
127
 
128
  = Are the galleries mobile friendly? =
129
 
130
+ Yes, since we use Javascript rather than flash, NextGEN Gallery is compatible with Android, iOS, and Blackberry. As of July 2013, all photo galleries are responsive. NextGEN Pro also includes a full screen, responsive Pro Lightbox with mobile gesture support.
131
 
132
 
133
  = What is the difference between a gallery and an album? =
134
 
135
+ In the simplest of terms, Galleries contain your photos and Albums contain your Galleries. Albums act as links and placeholders to quickly and easily navigate your galleries - Galleries will actually display your images.
136
 
137
 
138
  = Can I upload multiple images at once? =
139
 
140
+ Yes, you can batch upload entire photo galleries at one time.
141
 
142
 
143
  = Can I password protect galleries? =
144
 
145
+ Yes, WordPress allows you to password protect pages by default - which includes all photo galleries and content for the entire page. Password protection of pages can be turned on and off at any time, with just a few clicks.
146
 
147
 
148
+ = Can I add a watermark to the photos/slideshows? =
149
 
150
  Yes, you can add text or image watermarks to your gallery images.
151
 
155
  Yes, each thumbnail image can be individually adjusted to suit your needs.
156
 
157
 
158
+ = Is there pagination for photo galleries? =
159
 
160
  Yes, and you can adjust the amount of images to be shown on a page at any time.
161
 
187
 
188
  == Changelog ==
189
 
190
+ = V2.2.8 - 06.13.2016 =
191
+ * Changed: Removed custom Freeius opt-in message
192
+ * Changed: New design and video for Upgrade to Pro page
193
+ * Changed: Added namespacing to NGG-generated transients
194
+ * Fixed: Better error reporting for the XML-RPC method, ngg.uploadImage
195
+ * Fixed: Thumbnail editing links missing when locale uses RTL language such as Hebrew
196
+ * Fixed: Roles and Capabilities discrepancy with displaying NextGEN Gallery UI elements
197
+ * Fixed: Fancybox lightbox effect not compatible with Pro Mosaic galleries
198
+ * Fixed: Basic Tagcloud does not honor display type setting when editing in IGW
199
+ * Fixed: Basic Tagcloud allows selection of Pro display types when NGG Pro is disabled
200
+ * Fixed: Limit display types available in "Display galleries as" setting for albums
201
+ * Fixed: Special characters in `show_slideshow_text` parameter causing inserted display to not be editable.
202
+ * Fixed: NGG Basic Slideshow not honoring transition effect setting
203
+ * Fixed: Image tags that are no longer should be removed
204
+ * Fixed: Spacing preserved when our shortcodes are placed with other content
205
+ * Fixed: Breadcrumbs in albums when slug is shared between gallery and album
206
+ * Fixed: get_unique_slug() creating invalid SQL query when gallery name contains quote characters
207
+ * Fixed: /ngg_tags pages displaying comments from all posts
208
+ * Fixed: PHP warning when saving image meta data
209
+ * Fixed: Fix incompatibility with WPML pagination due to overriding $_SERVER['REQUEST_URI']
210
+
211
  = V2.2.3 - 04.05.2017 =
212
  * Fixed: E_WARNING on Gallery Settings page due to improper use of array_combine() on PHP <= 5.3
213
 
214
  = V2.2.2 - 04.04.2017 =
215
+ * Fixed: Hyperlinks in image or photo descriptions
216
  * Fixed: WordPress SEO sitemap image count
217
  * Fixed: Removed id parameter in shortcodes
218
  * Fixed: Fatal error in Freemius code
219
 
220
  = V2.2.1 - 03.13.2017 =
221
+ * NEW: Template mechanism for all gallery types
222
  * NEW: Review notices
223
+ * Changed: Updated gallery plugin branding to Imagely
224
  * Changed: Added the ability to click on a gallery title and have it open direct to Pro Lightbox
225
  * Fixed: Problems with activation after initial installation
226
  * Fixed: Don't display legacy shortcodes after creating new galleries
227
+ * Fixed: False positive malware detection notices against 'eval'
228
  * Fixed: Various PHP notices and warnings
229
+ * Fixed: Issue with dynamic container height for Imagebrowser photo galleries
230
 
231
  = V2.1.79 - 02.23.2017 =
232
+ * Secured: Resolved vulnerability with tag cloud galleries
233
 
234
  = V2.1.77 - 01.31.2017 =
235
  * Changed: Corrected Facebook link
236
  * Changed: Tags in readme.txt
237
+ * Fixed: Problem deactivating other plugins
238
 
239
  = V2.1.69 - 01.18.2017 =
240
  * Fixed: Ensured compatibility with WordPress 4.7.1
241
+ * Fixed: Missing option names on setting pages when Gallery Wizard active
242
  * Fixed: Ensure that NextGEN Gallery is always loaded after it's extension plugins in WP 4.7
243
  * Fixed: Pope product uninstaller not running during activation
244
 
247
  * Fixed: The ability to dismiss the gallery wizard notice
248
 
249
  = V2.1.61 - 12.14.2016 =
250
+ * NEW: Photo gallery creation wizard for new users
251
  * Fixed: Shortcodes in widgets not getting substituted in Divi
252
  * Fixed: Ensure that NGG placeholder text doesn't get styled incorrectly by other themes
253
  * Fixed: Various thickbox issues on custom post type pages
260
  * Secured: Ability to customize CSS Styles
261
  * Changed: readme.txt improvements
262
  * Fixed: Compatibility with WordPress 4.7.0
263
+ * Fixed: IGW-inserted tagcloud galleries are incorrect in some cases
264
 
265
  = V2.1.57 - 11.14.2016 =
266
  * Secured: Custom Styles may only be written to specific directories
267
  * Secured: SQL injection vulnerability for gallery names
268
+ * Changed: Gallery type icons are now clickable in the Insert Gallery Window
269
  * Changed: Include backup image files when coping/moving a gallery
270
  * Changed: Show gallery name in upload notification
271
  * Changed: Added placeholder text to gallery name field on Add Gallery / Upload Images page
276
  * Fixed: Conflict with Easy Digital Downloads
277
  * Fixed: Misc invalid HTML tags in admin pages (thanks to kniebremser)
278
  * Fixed: Change display:hidden to visibility:hidden in various places
279
+ * Fixed: Escaping of quotes in photo gallery titles and urls
280
  * Fixed: Untranslatable strings
281
 
282
 
285
 
286
  = V2.1.54 - 10.25.2016 =
287
  * NEW: Added php docblock directives for code hinting/completion
288
+ * NEW: Gallery display types can have aliases
289
  * NEW: Visual Shortcodes
290
  * Changed: Now uses gulp for package compilation & JS/CSS minification
291
  * Changed: Updated Freemius SDK to 1.2.1
292
  * Fixed: Extraneous backslashes being added to gallery titles & descriptions
293
+ * Fixed: Import folder 'gallery title' field wasn't being used for new photo gallery titles
294
  * Fixed: Settings reset will now redirect to /wp-admin/ to avoid potential activation-related errors
295
  * Fixed: Table columns cache becomes out of date between versions
296
  * Fixed: Various issues with shortcodes when used in widgets
301
  * NEW: Added the ability to open galleries within albums using a lightbox
302
  * Changed: Increased freemius opt-in to 100%
303
  * Changed: Tamara Lackey's biography on the overview page
304
+ * Fixed: Images and photos not responsive for all gallery types
305
  * Fixed: Compatibility with the Imagely Lightroom plugin
306
  * Fixed: Removed Pope tests folder
307
  * Fixed: Maximum function nesting level fatal error when displaying two or more albums
314
  * NEW: Added notice for deprecating PHP 5.2
315
  * NEW: Option to display child gallery and album descriptions when viewing albums
316
  * Changed: ATP preview images are smaller with tighter margins to show more images
317
+ * Changed: Content of Upgrade to Pro WordPress gallery plugin page
318
  * Changed: New NextGEN Overview page
319
  * Changed: Replicate gallery name sanitation of NG legacy for gallery paths
320
  * Fixed: Resolved all found PHP warnings/notices/deprecations and strict errors
321
  * Fixed: Compatibility on Windows servers with network mounted document roots
322
  * Fixed: Ensure EXIF meta data is loaded from the appropriate exif_data array instead of exif_array
323
+ * Fixed: Gallery Settings toggle not functioning in all cases
324
  * Fixed: Uploading breaking when thumbnail or image resizing fails due to lack of specific format support for image libraries
325
  * Fixed: Warning generated in nggallery.php checking useMediaRSS option
326
 
337
  * NEW: Gulp build system
338
  * NEW: Added "ngg_igw_placeholder_line_2_settings" and "ngg_igw_placeholder_line_1_settings" filters
339
  * NEW: Added "ngg_settings_during_image_generation" filter to adjust image generation
340
+ * NEW: Added "ngg_before_save_thumbnail" filter for image and photo manipulation abilities
341
+ * NEW: Added the ability to apply GD filters during image and photo generation
342
  * NEW: Integrated with WordPress SEO sitemaps to show include NGG images in image counts
343
  * Changed: Links to manage a gallery after it's been created don't appear in the IGW
344
  * Fixed: Freemius code shouldn't be minified
362
 
363
  = V2.1.33 - 04.25.2016 =
364
  * Fixed: Compatibility with themes and plugins which enqueue underscore.js in the head of the document
365
+ * Fixed: Ensure that shutter reloaded can find its image assets
366
 
367
  = V2.1.31 - 04.05.2016 =
368
  * NEW: Added constant NGG_SCRIPT_VERSION that is either the plugin version or rand() should SCRIPT_DEBUG be on
373
  * Fixed: Compatibility with WPML String Translation when uploading images without title or description
374
  * Fixed: Made get_image_url() encode gallery directory names 'because%this%is' a valid directory
375
  * Fixed: Manage Galleries > Search results not saving when edited
376
+ * Fixed: Imagebrowser gallery templates not using AJAX pagination when enabled
377
  * Fixed: Resource manager breaking the layout of the Multisite Plugin Activation page
378
  * Fixed: Static url generation when the nextgen-gallery directory is a symlink outside of the WordPress roots
379
 
416
  * Fixed: Problem deleting interframe communication cookies
417
 
418
  = V2.1.15 - 09.09.2015 =
419
+ * Secured: Image, photo, and gallery uploadsuploads
420
  * Fixed: Don't use esc_attr_e() to prevent translation issues
421
  * Fixed: Ensure that deleting a gallery doesn't delete anything it shouldn't
422
  * Fixed: get_gallery_abspath() should return NULL if the path doesn't exist
423
 
424
  = V2.1.13 - 09.09.2015 =
425
+ * Secured: Image, photo, and gallery uploads
426
  * Fixed: Don't use esc_attr_e() to present translation issues
427
 
428
  = V2.1.10 - 09.01.2015 =
429
+ * Secured: Escape output of parameters in gallery templates to avoid XSS
430
 
431
  = V2.1.9 - 08.25.2015 =
432
  * NEW: Added ngg_manage_galleries_items_per_page filter
444
  * Fixed: Cornerstone/X compatibility
445
  * Fixed: Recovering images was 'generating' from backup instead of copying
446
  * Fixed: Setting post thumbnail more than once on a page/post
447
+ * Fixed: Permanently hide gallery types from ATP without an active POPE module
448
 
449
  = V2.1.2 - 07.20.2015 =
450
+ * NEW: Ability to import photos from Media Library
451
  * NEW: Added filter 'ngg_datamapper_table_name'
452
  * NEW: Added filter `ngg_legacy_template_directories` for legacy template locator (thanks Ross McKay)
453
  * NEW: Pagination available onManage Images page
459
  * Fixed: Ability to set NextGEN Image as Featured Image
460
  * Fixed: Don't use resource manager in download requests for WP Photo Shelter
461
  * Fixed: Updated custom jQuery-UI styling to resemble WordPress postbox styling
462
+ * Fixed: Styled plupload photo upload buttons to resemble WordPress buttons
463
  * Fixed: Removed 'fixed' class from manage galleries table. Allows columns to adjust to content
464
  * Fixed: Removed note about flash support and fixed typoe (thanks Rene Wolf)
465
  * Fixed: Fixed typo in nggallery.po
469
  * Fixed: Adjusted album-compact template to always include p.ngg-album-gallery-image-counter
470
  * Fixed: Replaced empty gallery rendering in is_feed() with a link
471
  * Fixed: Removed default settings for imagerotator, which is no longer supported
472
+ * Fixed: Optimizated scanning of images and photos when importing a gallery
473
  * Fixed: When a gallery is deleted, ensure that DB and filesystem are purged
474
  * Fixed: Removed Insert Gallery Window box shadow
475
  * Fixed: Ensure that file_exists() calls are prefixed with @
484
  * NEW: Added ngg_manage_images_items_per_page filter
485
  * NEW: Added "ngg_get_image_url" filter
486
  * NEW: Including Ukranian and Polish translations
487
+ * NEW: The ability to set template in gallery widgets
488
  * Changed: Default thumbnail dimensions set to 240x160
489
  * Changed: Product now adheres to Pope 0.12 and provides get_modules_to_load()
490
  * Changed: Updated translations
521
  * Fixed: Use of C_Gallery_Mapper in C_Image_Wrapper
522
  * Fixed: Properly handle themes that don't call wp_footer() or wp_print_footer_scripts()
523
  * Fixed: Warning about missing style.php file on Network Admin -> Gallery page
524
+ * Fixed: Warning about getimagesize() failure when backing up an image or photo
525
 
526
  = v2.0.79 - 03.20.2015 =
527
  * Secured: Sanitized C_Displayed_Gallery->_add_find_in_set_column() third parameter
532
  * Fixed: Use of C_Gallery_Mapper in C_Image_Wrapper
533
  * Fixed: Properly handle themes that don't call wp_footer() or wp_print_footer_scripts()
534
  * Fixed: Warning about missing style.php file on Network Admin -> Gallery page
535
+ * Fixed: Warning about getimagesize() failure when backing up an image or photo
536
 
537
  = V2.0.78 - 03.12.2015 =
538
+ * Secured: AJAX actions for uploading photos and importing folders now uses nonce checks
539
 
540
  = V2.0.77 - 03.05.2015 =
541
  * NEW: Added "ngg_get_image_url" filter
542
  * Changed: Use a more reliable means of excluding Pro/Plus modules from using minified static resources
543
+ * Fixed: Imagebrowser gallery pagination with custom templates
544
  * Fixed: Custom CSS is enqueued late to ensure it's one of the last stylesheets loaded
545
  * Fixed: Fixed watermarking PNG images
546
  * Fixed: Using the "Import Metadata" bulk action overwrites existing data
550
  * Fixed: Restored nggdb->get_random_images(), nggdb->search_for_file, and nggdb->find_all_albums()
551
  * Fixed: Allow gallery slug as parameter to nggdb::get_gallery()
552
  * Fixed: Don't minify Plupload's i18n JavaScript
553
+ * Fixed: Custom template images and photos not being given their full effect code attributes
554
 
555
  = V2.0.76 - 02.24.2015 =
556
  * Fixed: Compatibility checks for very old versions of NextGEN Pro
568
  = V2.0.71 - 02.19.2015 =
569
  * NEW: Module files are compiled into a single package file to reduce disk I/O
570
  * NEW: All CSS stylesheets and Javascript source files are minified to reduce latency
571
+ * NEW: All photo lightboxes are configured using an in-memory management class.
572
  * NEW: Uses Pope 2.0, benefiting from the new caching capabilities
573
  * NEW: NextGEN Gallery's functionality is disabled if NextGEN Pro is incompatible
574
  * NEW: Added ngg_effect_code filter
575
  * Changed: Updated FontAwesome to 4.3.0
576
  * Changed: Updated select2 to 3.5.2
577
+ * Changed: Removed PicLens / CoolIris gallery integration
578
  * Changed: Removed JSON API. Please use XML-RPC API instead
579
  * Changed: For performance reasons, we cache FS & url lookups/calculations
580
  * Changed: Greatly reduced the # of sql queries, and eliminated anything redundant
585
  * Changed: Insert Gallery Window is routed using wp-admin/admin_init
586
  * Changed: Removed unused code from ngglegacy module. Created wrappers for commonly-used functions
587
  * Changed: LZW module removed
588
+ * Changed: Legacy gallery template drop-down selection now using select2
589
  * Secured: Restrict folder browsing to NGG_IMPORT_ROOT constant
590
  * Fixed: Compatibility issue with PHP's transparent ZLIB compression
591
  * Fixed: Imagebrowser as lightbox effect not working when non-default permalink slug used
592
  * Fixed: Angled quotations marks used in shortcode parameters
593
+ * Fixed: Compatibility between ImageBrowser gallery and TwentyFifteen theme
594
  * Fixed: Allow pagination to retain query string url parameters when linking to other pages
595
  * Fixed: Fixed pagination issues with slideshow galleries displayed as thumbnails
596
  * Fixed: Fix C_GalleryStorage_Driver_Base->import_gallery_from_fs() not checking imgBackup
597
  * Fixed: Fixed problem with default settings being applied multiple times
598
+ * Fixed: Fallback to "full" image / photo sizes if "backup" images aren't available
599
  * Fixed: Use M_DataMapper's serialization methods throughout the codebase
600
  * Fixed: Conflict with WordPress SEO and get_the_excerpt() call
601
  * Fixed: Don't run Resource Manager on wp-login.php or wp-sign.php
602
+ * Fixed: TinyMCE Image Editor conflict with Insert Gallery Window placeholder images/photos
603
  * Fixed: Fix Shutter positioning when admin bar is displayed
604
+ * Fixed: Allow deselection of a legacy gallery template
605
+ * Fixed: Prevent conflicts when using imagebrowser gallery as a lightbox effect
606
+ * Fixed: Pagination not working for slideshow galleries using thumbnail integration
607
 
608
  = V2.0.66.33 - 11.24.2014 =
609
  * Fixed: Broken NextGEN Pro ecommerce-related shortcodes
614
 
615
  = V2.0.66.29 - 09.17.2014 =
616
  * NEW: Added skip_excluding_globally_excluded_images property to displayed gallery objects
617
+ * Fixed: SQL generation for random photo/image selection
618
  * Fixed: Adjust regex for replacing displayed gallery placeholder images
619
  * Fixed: Removed filters to home_url needed previously for WMPL compatibility
620
  * Fixed: Use canonical redirects when appropriate
621
+ * Fixed: Ability to override image/photo files using XML-RPC
622
 
623
  = V2.0.66.27 - 08.18.2014 =
624
  * Fixed: Missing class.frame_communication_option_handler.php error
639
  * Secured: XSS vulnerability on Manage Albums page
640
 
641
  = V2.0.66.16 - 07.30.2014 =
642
+ * NEW: Added new "limit" setting to Slideshow gallery widgets
643
  * NEW: Added a "ngg_routes" action for other plugins to hook into to provide new routes
644
  * NEW: Added NGG_SKIP_LOAD_SCRIPTS constant, which existed in 1.9.x
645
  * NEW: Added NGG_GALLERY_ROOT_TYPE constant. Set to 'content' to load galleries from the content_dir / content_url
653
  * NEW: Russian (ru_RU) language thanks to SnakeD3
654
  * NEW: Spanish (es_ES) language thanks to Andrew Kurtis at WebHostingHub
655
  * Changed: Updated Czech language thanks to Separatista; additional thanks to Martin Krizek for the original translation who was mistakenly unaccredited
656
+ * Changed: "Upgrade to Pro" WordPress gallery plugin page has new design, includes NextGEN Plus
657
  * Changed: Basic Albums templates now given the image counter P element the class 'ngg-album-gallery-image-counter' (by user request)
658
  * Changed: Gallery widgets now apply height:auto to their element; fixes compatibility with some themes
659
  * Changed: Random galleries should be substantially faster now (1000% or more for large image tables)
669
  * Fixed: Flush 'all' caches when pope_module_list setting changes
670
  * Fixed: Don't enqueue related images css in the admin
671
  * Fixed: Basic Slideshows fixes WP creating extraneous P element above the slideshow display
672
+ * Fixed: Basic Singlepic will now display images/photos marked 'excluded' in the admin
673
  * Fixed: Admin pages can now update when the "Save" button text has been translated
674
 
675
  = V2.0.66 - 05.20.2014 =
676
+ * Secured: Check mime type of image/photo files using a variety of mechanisms
677
 
678
  = V2.0.65 - 05.04.2014 =
679
+ * Secured: Limit uploads to images/photos and zips
680
 
681
  = V2.0.63 - 04.29.2014 =
682
  * NEW: Translation ready
687
  * NEW: Bundled Browser+ JavaScript library
688
  * NEW: Added NGG_DISABLE_FILTER_THE_CONTENT constant to manage conflicts
689
  * Changed: Moved jquery.nextgen_radio_toggle.js to NextGEN Admin Module
690
+ * Changed: Original display settings are passed to secondary gallery types
691
+ * Fixed: Photo thumbnail dimension calculations are inaccurate by 1px when maintaining aspect ratio
692
  * Fixed: Copy IPTC data from original to new image when creating new sizes / thumbnails
693
+ * Fixed: Use correct absolute path when importing images or photos in a multisite environment
694
  * Fixed: Incorrect display of disk space quotas in multisite environments
695
  * Fixed: Removed redundant roles form in multisite environments
696
  * Fixed: Insert Gallery Window support for multisite environments
697
+ * Fixed: Incorrect handling of NextGEN Gallery Styles in multisite environments
698
  * Fixed: Not honouring NGG_IMPORT_ROOT constant
699
+ * Fixed: Fixed inability to edit photo gallery properties using XMLRPC's edit_gallery method
700
  * Fixed: Alignment issues in Basic Compact Albums caused by subalbums not displaying image 'counter'
701
  * Fixed: Display setting forms compatibility issue with WordPress 3.9
702
  * Fixed; Compability with jQuery Dialogs in WordPress 3.9
712
  * Fixed: Resource manager is manipulating feeds
713
  * Fixed: Convert absolute urls to relative urls for lightboxes
714
  * Fixed: Start the resource manager as early as we can within the init action
715
+ * Fixed: Routing problem for photo galleries with images named 1.jpg, 2.jpg, 3.jpg, etc.
716
+ * Fixed: Added tooltips to basic slideshow gallery settings
717
  * Fixed: Remove CKEditor's NextGEN button, which is incompatible with NextGEN Gallery 2.x
718
 
719
  = V2.0.61 - 04.01.2014 =
747
  * Changed: Transients are removed every 30 minutes instead of 60 minutes
748
  * Changed: Admin Page & Form components refactored to allow custom POST processing
749
  * Changed: Default path for NEW multisite installations to wp-content/uploads/sites/%BLOG_ID%/nggallery/
750
+ * Fixed: Ability to upload ZIP files for photos and galleries on Windows hosts
751
  * Fixed: Support for filenames with non-ASCII characters
752
+ * Fixed: Dynamic updates in the Insert Gallery Window (interframe communication)
753
+ * Fixed: Insert Gallery Window freezing in IE11
754
  * Fixed: Path issues on Windows Servers
755
  * Fixed: Module installer integrity
756
  * Fixed: Database query performance. No more joins to the WP options table
761
  * Fixed: Corrupted MediaRSS feeds
762
  * Fixed: Padding on Gallery Settings and Other Options pages
763
  * Fixed: Routing issues on subdirectory installs
764
+ * Fixed: Importing photo galleries using the Insert Gallery Window
765
  * Fixed: Gallery path calculations on Windows web servers
766
  * Fixed: Sub-album urls not processed correctly
767
  * Fixed: Apply maximum entity count to existing displayed galleries
768
+ * Fixed: NextGEN Gallery Thumbnail Widget shouldn't use ImageBrowser gallery effect
769
+ * Fixed: Ability to set shuffle parameter for ImageRotator slideshow galleries
770
+ * Fixed: PHP warning about HTMLDocument when displaying a SinglePic photo
771
+ * Fixed: Sanitization of photo gallery title
772
  * Fixed: Home URL now used instead of Site URL in MediaRSS feed
773
+ * Fixed: Insert Gallery Window broken when WPML is installed
774
+ * Fixed: Insert Gallery Window instructing browser to cache the page
775
+ * Fixed: Photo watermarking not working in low-memory environments
776
  * Fixed: Maximum images limit not being applied for galleries already created.
777
  * Fixed: Double forward slashes in static urls
778
  * Fixed: Don't sleep when checking if the installer is running
795
  * NEW: Added NGG_IMPORT_ROOT constant. Define and set to TRUE to browse from a custom directory
796
  * NEW: Added NGG_DEBUG constant. Define and set to TRUE to display helpful messages for debugging
797
  * NEW: Each custom table record will have an associated custom post record for expansion
798
+ * NEW: Display helpful error messages for image and photo upload issues
799
  * NEW: Add data-(src|thumbnail|image-id|title|description) attribute to gallery image anchors
800
+ * NEW: Variant support for photo gallery sources. Random images is limited to 5 variations
801
  * Fixed: Excessive creation of transients for random galleries
802
+ * Fixed: Some issues interfering with photo and gallery uploads
803
  * Fixed: Compatibility with NextGEN Gallery Export Plugin for Adobe Lightroom (thanks Vladimir!)
804
+ * Fixed: Sorting photos in the Insert Gallery Window interface
805
  * Fixed: HTML allowed in gallery/album descriptions
806
+ * Fixed: Requests for photo galleries within albums that have numeric names are broken
807
  * Fixed: Call to a non-member function get() on WP_Query
808
+ * Fixed: Ability to sort by Image ID in the Insert Gallery Window
809
+ * Fixed: Isolate the Insert Gallery Window from implicit third-party script inclusion
810
  * Fixed: Check for the existance of thumbnails when generating urls, and if missing, generate new ones
811
  * Fixed: Compatibility with NextGEN Facebook OpenGraph+ plugin
812
  * Fixed: Various XML-RPC issues
813
+ * Fixed: Gallery widget stylesheet not included
814
  * Fixed: Issue with color not being pre-selected when previewing Watermark
815
  * Fixed: E_NOTICE emitted when cleaning up cached image files
816
+ * Fixed: E_NOTICE emitted when viewing gallery type settings
817
  * Fixed: Typo adjusting pcre.backtrack_limit for shortcodes
818
+ * Fixed: Content within the tabs of the Insert Gallery Window cut-off
819
+ * Fixed: Routing problem which would cause conflicts with different gallery types on the same page
820
  * Fixed: Broken Dynamic CSS links on GoDaddy
821
  * Fixed: Ability to use HTML in gallery/album descriptions
822
  * Fixed: Sub-album requests conflicting with paginated galleries on the same page
824
 
825
  = V2.0.33 - 10.21.2013 =
826
  * NEW: Requests /ngg_tag/[tagname] will create a displayed gallery
827
+ * NEW: Option added to "Import Gallery" tab to use original images and photos
828
  * Fixed: Links are broken on the ngg_tags-sitemap.xml file by WordPress SEO
829
  * Fixed: PHP notice: Attempt to assign property of non-object
830
+ * Fixed: Undefined property warnings when using NextGEN Basic Thumbnail gallery
831
  * Fixed: Detect if an applying a transient to a displayed gallery was successful
832
  * Fixed: Compatibility issues with BJ-Lazy-Load and Colorbox
833
+ * Fixed: Pagination conflicts for multiple Imagebrowser galleries on the same page
834
  * Fixed: Ability to display previous exception with debug mode
835
+ * Fixed: Tagcloud galleries not working in multisite instances
836
+ * Fixed: Load widgets.css when a gallery widget is being used
837
  * Fixed: Installer should remove all instances of the component factory
838
+ * Fixed: Gallery widget settings interface not intuitive
839
  * Fixed: Inability to upload images in some Windows host environments
840
+ * Fixed: Sorting images/galleries using the Insert Gallery Windwo
841
  * Fixed: Fix detection of HTTPS (pull request by Leonhardt Wille)
842
  * Fixed: Compilation errors of regular expressions
843
  * Fixed: Pro galleries wouldn't display in environments using PHP 5.3.3 or less
844
  * Fixed: Scanning of router slug is now limited to the uri, not the url
845
  * Fixed: Show slideshow link isn't required for thumbnail/imagebrowser integration
846
+ * Fixed: WordPress media-upload with 'singlepic' image and photo sizes
847
  * Fixed: Use target=_blank when the link setting is provided for NextGEN Basic Singlepic
848
  * Fixed: Only display rendering errors if WP_DEBUG is enabled
849
 
850
  = V2.0.31 - 10.03.2013 =
851
+ * NEW: Restored AJAX gallery pagination for NextGEN Basic ImageBrowser gallery
852
  * Fixed: Compatibility with WordPress Local SEO by Yoast
853
+ * Fixed: Inability to upload images and photos if image_slug field was missing in database
854
  * Fixed: Integration of NextGEN Basic Thumbnail and NextGEN Basic Slideshow display types
855
  * Fixed: Photocrati Resource Manager further adjusted to be third-party friendly
856
  * Fixed: Added the ability to find legacy templates in both the child/parent theme directories
857
+ * Fixed: JavaScript errors in Insert Gallery Window
858
  * Fixed: Router can handle port numbers in urls
859
  * Fixed: Carousel template was linking to NextGEN Basic ImageBrowser view
860
+ * Fixed: SQL query generated for displayed photo galleries using tags as source
861
  * Fixed: 3rd party compat: raise & never lower pcre.backtrack_limit
862
 
863
  = V2.0.30 - 09.25.2013 =
864
+ * NEW: Restored the ability to use imagebrowser gallery type instead of a lightbox effect
865
+ * Changed: Displayed photo galleries are no longer rendered in RSS feeds
866
  * Changed: Removed "Plugin Check" widget from overview page
867
  * Fixed: Silence PHP warnings/errors in an output buffer for AJAX actions
868
  * Fixed: Compatibility issue with WordPress SEO and broken site maps (and large error_logs)
869
  * Fixed: Compatibility issue with AJAX Event Calendar (and possibly others)
870
  * Fixed: Adjusted Photocrati Resource Manager to be third-party friendly
871
  * Fixed: Fixed empty result set for displayed galleries selecting 'All' tags
872
+ * Fixed: URL generation for imagebrowser gallery pagination links
873
+ * Fixed: Ensure that photo and image meta is imported on creation
874
  * Fixed: Ensure that transients are removed when an external object cache is used
875
+ * Fixed: Don't load pluggable.php. This will fix some plugin conflicts
876
+ * Fixed: In Insert Gallery Window, galleries created in one tab weren't showing in another
877
  * Fixed: Don't output frame events cookie for XML-RPC requests
878
 
879
  = V2.0.27 - 09.18.2013 =
880
  * Fixed: Reduce performance impact of purging displayed gallery transients
881
 
882
  = V2.0.25 - 09.18.2013 =
883
+ * Reverting to the 2.0.21 codebase, due to performance issues in 2.0.23 and 2.0.24
884
 
885
  = V2.0.23 - 09.16.2013 =
886
  * NEW: WP-Cron job to periodically clean-up displayed gallery transients
887
  * NEW: Added "excluded_container_ids" as parameter for ngg_images shortcode
888
+ * Fixed: Lightbox effect is honoured by all gallery display types
889
+ * Fixed: Highslide displays photos from the correct displayed galleries
890
  * Fixed: Ensure that sub-albums display correctly when the word "album" is part of a slug
891
  * Fixed: Ensure that sub-albums display correctly when numerical slugs are used
892
  * Fixed: Related images heading only added when Related Images functionality is enabled
893
  * Fixed: PHP Warning about undefined index when viewing basic albums
894
  * Fixed: AJAX handling is third-party compatible
895
+ * Fixed: Image date is no longer overwritten when a photo is modified
896
  * Fixed: Fixed issue with displayed galleries using source='tags'
897
  * Fixed: Problem with transient cache not getting flushed properly from Other Options page
898
  * Fixed: Use correct gallery/transient ID when ajax pagination is used
899
 
900
  = V2.0.21 - 09.09.2013 =
901
  * NEW: Multisite support
902
+ * Changed: Default image quality set to 100 for generated images and photos
903
  * Changed: Removed dependence on simplehtmldom library
904
  * Fixed: Related images functionality works as it did in 1.9.x
905
  * Fixed: Don't compress inline JavaScript in post/page content
906
+ * Fixed: Click-to-advance photo slideshow behavior for slideshows
907
  * Fixed: Security warnings from VaultPress
908
+ * Fixed: View as Slideshow link works with AJAX paginated galleries
909
+ * Fixed: Broken links on WordPress gallery plugin Overview page
910
+ * Fixed: Backup images option not working in some cases
911
  * Fixed: Stylesheet url generated correctly for Windows hosts
912
  * Fixed: Compatibility with NextGen Custom Fields plugin
913
  * Fixed: Compatibility with Adsense Explosion plugin
917
  Fixed: Match legacy behaviour when changing gallery path, i.e. don't move files
918
 
919
  = V2.0.14 - 08.27.2013 =
920
+ * NEW: Added the ability to override photo thumbnail settings for NextGEN Basic Albums
921
  * NEW: Shortcode Manager API, which ensures that shortcodes are outputted as intended
922
  * Changed: Re-added the ability to select the original image size for widgets
923
  * Fixed: Ensure that stylesheet url returned is correct for Windows hosts
924
+ * Fixed: Broken links and lightbox effects with AJAX gallery pagination
925
  * Fixed: Try to ensure that third party plugins don't add content to our dynamic JS
926
  * Fixed: Improved reliability of iframely.js
927
  * Fixed: Ensure that urls are generated correctly in HTTPs environments
932
  * NEW: Added "run_ngg_resource_manager" hook to by-pass our resource manager
933
  * Changed: Removed "Reset & Uninstall" tab, for now
934
  * Fixed: Compatibility with W3 Total Cache. Please flush cache after updating.
935
+ * Fixed: Conflicts with Photocrati Theme galleries
936
+ * Fixed: Blank Insert Gallery Window occuring in some cases
937
  * Fixed: Fixed ability to change Lightbox Effect settings
938
  * Fixed: Implemented techniques to ensure WP_Query variables aren't overwritten
939
  * Fixed: Enqueuing AJAX JS libraries twice in wp-admin
942
  * Fixed: Fixed installer issues
943
 
944
  = V2.0.7 - 08.09.2013 =
945
+ * NEW: New resource manager that fixes some plugin and theme incompatibilities
946
  * NEW: Styles (custom stylesheets) should reside in wp-content/ngg_styles
947
  * NEW: Added option to "Other Options -> Misc" to control maximum images returned
948
  * Secured: Removed default connector for jQuery FileTree library
949
  * Changed: Updated the simplehtmldom library to version 1.5
950
  * Changed: jQuery is now enqueued at the beginning of every request
951
  * Fixed: Incompatibilities with BuddyPress
952
+ * Fixed: Incompatibilities with Events+, bbPress, Custom Permalinks, and other plugins
953
  * Fixed: Incompcatibilities with Member Access, AMember, Magic Fields, and More Fields
954
+ * Fixed: Incompatibilities with Elegant Themes, Oxygen, Responsive, and some other themes
955
+ * Fixed: Ensure that gallery images and photos don't have a border by default
956
+ * Fixed: Conflict between imagebrowser gallery and album urls
957
  * Fixed: Reverted default gallerypath to wp-content/gallery/
958
  * Fixed: Upgrade-safe way of overriding Styles
959
  * Fixed: Generation of AJAX url is now based on slug
960
  * Fixed: Restore nggShowGallery and nggShowSlideshow as wrappers to new API
961
  * Fixed: Always use domain as specified by WordPress Site URL
962
  * Fixed: Use WordPress Home URL over Site URL when appropriate
963
+ * Fixed: Numerous gallery pagination issues
964
  * Fixed: Adjusted our forms to comply with WordPress Firewalls
965
  * Fixed: Correct use of select2 DOM selector for maximum compatibility
966
  * Fixed: Path and URL calculations for Windows and UNIX environments
974
 
975
  = V2.0 - 07.30.2013 =
976
  * NEW: Improved user experience throughout the plugin, settings and usage.
977
+ * NEW: Plupload queue photo uploader that allows for bulk and zip uploads within the same interface.
978
+ * NEW: Complete redesign of the NextGEN Gallery options panel
979
+ * NEW: Added new Insert Gallery Window for adding galleries from pages and posts.
980
+ * NEW: Galleries are now mobile friendly and responsive (may need a responsive theme).
981
  * NEW: Streamlined functionality for displaying galleries based on tags.
982
  * NEW: Architecture based on Pope Framework (http://bitbucket.org/photocrati/pope-framework)
983
  * NEW: New shortcode, “ngg_images”, and corresponding Attach to Post interface
989
  * Changed: NextGEN styles now override vs replace default styles
990
  * Changed: NextGEN legacy templates have been deprecated (but still function)
991
  * FIXED: The ability to use NextGEN image as a Featured Image.
992
+ * FIXED: Misc bugs and annoyances, such as PHP warnings, errors, etc.
993
 
994
  = V1.9.13 - 06.11.2013 =
995
+ * NEW: Slideshow galleries are now centered to their content area
996
+ * Secured: Ensure that only logged in users can upload images and photos
997
+ * Fixed: Photo import date is presered are no longer Jan 1 1970
998
  * Fixed: Removed mention of upgrade.php, which no longer exists
999
 
1000
  = V1.9.12 - 02.15.2013 =
1007
  * Changed: Database schema is automatically updated when out-of-date
1008
  * Fixed: Fixed several incompatibility issues with Jetpack
1009
  * Fixed: Empty drop-down for "Page Link To"
1010
+ * Fixed: Alphabetical image and photo gallery sorting
1011
  * Fixed: Compatibility with Arjuna X theme
1012
  * Fixed: “Creating default object from empty value” on album page
1013
  * Fixed: Compatibility issues with PHP 5.4 on album page
1023
  * Fixed: Correct use of register_uninstall_hook
1024
  * Fixed: CSS and usability issues with the TinyMCE window used to display galleries
1025
 
1026
+ * NEW: JW ImageRotator v3.17 is now bundled with the photo plugin and used by default.
1027
  * Changed: Removed database upgrade code for versions of NextGEN Gallery earlier than 1.9.3
1028
  * Fixed: Compatibility with WordPress v3.5 ( wpdb->prepare() warnings )
1029
+ * Fixed: Sorting by photo filename now produces expected results using a natural sorting algorithm
1030
 
1031
  = V1.9.8 - 12.05.2012 =
1032
  * Secured: Removed bundled version of swfupload. See fix below for SCM information.
1036
 
1037
  = V1.9.7 - 11.13.2012 =
1038
  * Secured: Removed bundled version of swfupload; using WordPress-bundled version instead for WordPress 3.2 instances
1039
+ * Changed: Using JQuery UI for the image gallery sorting interface (thanks Tomás Soler)
1040
+ * Bugfix: Image and photo uploads work in WP 3.2 when using Safari
1041
  * Bugfix: Adjusted TinyMCE window to use built-in JavaScript libraries
1042
  * Bugfix: Removed Photocrati acquisition announcement
1043
  * Bugfix: Fixed incorrect usage of ImageJpeg() function
1054
  * Changed: Branding changes following Photocrati acquisition (removed donation messages and updated links)
1055
  * Secured: Use WordPress-bundled JavaScript libraries for swfobject and swfupload instead of bundling our own
1056
  * Bugfix: Adjusted thickbox effect styling to ensure that the lightbox is always displayed in the foreground
1057
+ * Bugfix: Fixed compat issues with Contact Form 7 and other plugins by following WordPress Plugin conventions
1058
  * Bugfix: Fixed network-wide activation in WordPress 3.4
1059
  * Bugfix: Plugin is no longer dependent on it's folder name
1060
 
1062
  * Bugfix : Ensure to set the slug for "all" albums
1063
  * Bugfix : Updated german translation ( THX to Roger Hunziker )
1064
  * Bugfix : Ensure error checking on IPTC array (THX to Kristian Edlund)
1065
+ * Bugfix : Handle IE8 cached images better in gallery slideshow
1066
+ * Bugfix : Show album preview image or photo if selected (THX to Kristian Edlund)
1067
 
1068
  = V1.9.2 - 17.01.2012 =
1069
  * NEW : Added more XMLRPC commands (THX to Vladimir Vinogradsky)
1070
  * Changed : Rework Post-thumbnail function (THX to Kristian Edlund)
1071
+ * Bugfix : Check first for valid images or photos on unzip (only Mac OS zip-files)
1072
  * Bugfix : Increase z-index for twenty eleven theme
1073
+ * Bugfix : Support non latin chars in tagcloud gallery
1074
  * Bugfix : Allow other tinymce intance
1075
  * Bugfix : Better support for WPML translation
1076
 
1082
  * Bugfix : IE7/IE8 width set correctly for edit album autocomplete field
1083
 
1084
  = V1.9.0 - 27.11.2011 =
1085
+ * NEW : Keep image transparency for PNG and GIF format
1086
  * NEW : Switch to Plupload, support now HTML5 Upload (only with WordPress 3.3)
1087
+ * NEW : Added client side photo resize feature (only with WordPress 3.3)
1088
  * NEW : Support for gallery templates in album shortcodes [ album id=x template="name" gallery="templatename" ]
1089
  * NEW : Added new hook ngg_delete_picture
1090
  * Changed : Updated to jQuery Cycle Version 2.9995
1091
  * Changed : Always cache the single pictures, remove option
1092
  * Bugfix : Couldn't use bulk operation for search results
1093
  * Bugfix : Bugfix for Edit thumbnails under IE 8 + 9
1094
+ * Bugfix : Allow empty photo altext in ngg.editImage
1095
  * Bugfix : Various PHP notice fixes
1096
  * Bugfix : Resize fix for Shutter effect and mobile Browser
1097
  * Bugfix : FTP Import missing slug field into database
1105
  * Bugfix : Sub-Albums in Albums didn't create the correct link
1106
  * Bugfix : AJAX Pagination didn't work anymore
1107
  * Bugfix : Adding index.php to home_url()
1108
+ * Bugfix : Preview photo lost on backend gallery page 2 or higher
1109
 
1110
  = V1.8.2 - 12.07.2011 =
1111
+ * Bugfix : Set gallery pagination variables for search result, otherwise update failed
1112
  * Bugfix : Update failed for paged galleries since WordPress 3.2
1113
 
1114
  = V1.8.1 - 18.06.2011 =
1119
 
1120
  = V1.8.0 - 12.06.2011 =
1121
  * NEW : Full rework of permalink url structure
1122
+ * NEW : Adding Google Sitemaps for images and photos(require WordPress SEO plugin by YOAST )
1123
  * NEW : Support for WPML ( WordPress Multilingual Plugin )
1124
  * NEW : Adding support for arrow key in shutter effect (THX to Flyvans)
1125
+ * NEW : Adding sort operation for WordPress gallery plugin overview page
1126
  * Changed : Updated pagination to new WP3.1 style
1127
  * Bugfix : Create unique slug in a better way
1128
  * Bugfix : Rework screen options filter for gallery and image table
1129
  * Bugfix : Empty values in XMLRPC update calls are ignored
1130
  * Bugfix : Create gallery failed when safe-mode on
1131
+ * Bugfix : Permalink didn't work in combination with album & imagebrowser gallery
1132
 
1133
  = V1.7.4 - 15.02.2011 =
1134
  * Bugfix : Disallow direct call of ajax file to avoid path disclosure (THX to High-Tech Bridge SA)
1135
  * Bugfix : Rework jQuery Cycle slideshow for IE compat reason (THX to Justin Dickenson)
1136
+ * Bugfix : Resize only larger images or photos in slideshow
1137
  * Bugfix : Improved image format detection in gd.thumbnail class (THX to Kupar.b)
1138
 
1139
  = V1.7.3 - 20.01.2011 =
1145
  * Bugfix : WP3.1 compat issue, show site admin page only on Multisite installation
1146
 
1147
  = V1.7.2 - 13.12.2010 =
1148
+ * Bugfix : Adding images or photos to database require slug (NOT NULL)
1149
 
1150
  = V1.7.1 - 13.12.2010 =
1151
  * Changed : Disable upgrade for PHP4 user
1164
  * Bugfix : Install/Upgrade failed when table prefix contain captial letters
1165
  * Bugfix : Fix validation issues in Media-RSS
1166
  * Bugfix : Empty tags in XMP Meta causes PHP error
1167
+ * Bugfix : Rework load mechanism for gallery slideshow
1168
+ * Bugfix : Copy meta data when image or photo is copied
1169
  * Bugfix : Icon Support for Ozh' Admin Drop Down Menu
1170
+ * Bugfix : Use correct sort order in gallery slideshow
1171
 
1172
  = V1.6.2 - 19.09.2010 =
1173
  * NEW : Added constant NGG_SKIP_LOAD_SCRIPTS to avoid script load
1174
  * Bugfix : Load Tags library with core files
1175
+ * Bugfix : Photo slideshow script failed in IE7, load script now in header
1176
+ * Bugfix : Load gallery slideshow widget always
1177
  * Changed : New admin notice for database upgrade
1178
+ * Changed : Rework crop feature for featured images and photos
1179
  * Changed : Use site_url() instead get_option ('siteurl'), required for SSL support
1180
 
1181
  = V1.6.1 - 08.09.2010 =
1182
  * Bugfix : Script load of swfobject.js failed
1183
+ * Bugfix : Show gallery sideshow also with 1 or 2 images
1184
  * Bugfix : Rework null byte check in zip upload
1185
 
1186
  = V1.6.0 - 07.09.2010 =
1187
  * NEW : Wordpress 3.0 Network (Multi-Site) support
1188
+ * NEW : Integrate jQuery Cycle as NON-Flash photo slideshow
1189
  * NEW : Adding jQuery File Tree for import folder (THX to Sergey Pasyuk )
1190
  * NEW : Added action hook 'ngg_show_imagebrowser_first' on custom request
1191
  * NEW : Added filter hook 'ngg_slideshow_size' to resize sildeshow for mobile browser plugins
1192
  * Changed : Reorder tabs for upload
1193
  * Changed : New menu icon and screen icon (THX to Ben Dunkle)
1194
  * Changed : Load frontend libs always
1195
+ * Changed : Rework of WordPress gallery plugin overview page
1196
  * Bugfix : Security bugfix for Zip-Upload (THX to Dominic Szablewski)
1197
  * Bugfix : Allow JPG, PNG, GIF extension
1198
  * Bugfix : New German translation (THX to Martin Kramarz)
1209
  * Bugfix : Esc_URL in Media RSS
1210
 
1211
  = V1.5.3 - 11.04.2010 =
1212
+ * New : Adding gallery pagination to footer
1213
+ * Changed : Perpare new filter to replace photo slideshow
1214
  * Bugfix : Remove non-breaking space from navigation
1215
  * Bugfix : Pagination of galleries
1216
  * Bugfix : Fixed brackets position for old shortcode query
1217
+ * Bugfix : Slideshow option 'Show next image on click' has wrong default value
1218
 
1219
  = V1.5.2 - 25.03.2010 =
1220
  * Bugfix : XSS security vulnerability (THX to Core Security Advisories Team , Pedro Varangot)
1222
 
1223
  = V1.5.1 - 23.03.2010 =
1224
  * Bugfix : PHP4 compat issue for Add gallery & options page
1225
+ * Bugfix : WordPress gallery plugin widget can now have a empty title
1226
  * Bugfix : Adding correct stripslash for gallery title
1227
 
1228
  = V1.5.0 - 18.03.2010 =
1229
  * NEW : Support for Post thumbnail feature
1230
+ * NEW : Backup and Recover function for photos (THX to Simone Fumagalli)
1231
+ * NEW : Resize photos after upload (THX to Simone Fumagalli)
1232
  * NEW : Added a JSON class for fetching galleries in a RESTful way (see xml/json.php)
1233
  * NEW : Adding various new capabilities for user roles
1234
  * NEW : Auto downloader for translation file