ShortPixel Image Optimizer - Version 4.16.1

Version Description

Release date: 14th February 2020 * Fix non-dismissable alerts. * Reference to the Website Speed Optimization service. * Fixed: deleteItemCache in wrong place ( before save ) thus resetting data * Fixed: NextGen integration * Language 3 new strings added, 0 updated, 0 fuzzied, and 0 obsoleted

Download this release

Release Info

Developer ShortPixel
Plugin Icon 128x128 ShortPixel Image Optimizer
Version 4.16.1
Comparing to
See all releases

Code changes from version 4.16.0 to 4.16.1

build/shortpixel/notices/src/NoticeController.php CHANGED
@@ -256,7 +256,6 @@ class NoticeController //extends ShortPixelController
256
  $noticeController = self::getInstance();
257
  $notice = $noticeController->addNotice($message, NoticeModel::NOTICE_WARNING, $unique);
258
  return $notice;
259
-
260
  }
261
 
262
  public static function addSuccess($message, $unique = false)
256
  $noticeController = self::getInstance();
257
  $notice = $noticeController->addNotice($message, NoticeModel::NOTICE_WARNING, $unique);
258
  return $notice;
 
259
  }
260
 
261
  public static function addSuccess($message, $unique = false)
build/shortpixel/notices/src/NoticeModel.php CHANGED
@@ -72,6 +72,17 @@ class NoticeModel //extends ShortPixelModel
72
  $this->suppress_until = time() + $this->suppress_period;
73
  }
74
 
 
 
 
 
 
 
 
 
 
 
 
75
  /** Set a notice persistent. Meaning it shows every page load until dismissed.
76
  * @param $key Unique Key of this message. Required
77
  * @param $suppress When dismissed do not show this message again for X amount of time. When -1 it will just be dropped from the Notices and not suppressed
72
  $this->suppress_until = time() + $this->suppress_period;
73
  }
74
 
75
+ public function unDismiss()
76
+ {
77
+ $this->is_dismissed = false;
78
+ }
79
+
80
+ public function setDismissedUntil($timestamp)
81
+ {
82
+ $this->suppress_until = $timestamp;
83
+ }
84
+
85
+
86
  /** Set a notice persistent. Meaning it shows every page load until dismissed.
87
  * @param $key Unique Key of this message. Required
88
  * @param $suppress When dismissed do not show this message again for X amount of time. When -1 it will just be dropped from the Notices and not suppressed
class/controller/adminnotices_controller.php CHANGED
@@ -18,6 +18,7 @@ class adminNoticesController extends ShortPixelController
18
  const MSG_UNLISTED_FOUND = 'Error102'; // SPIO found unlisted images, but this setting is not on
19
 
20
  //const MSG_NO_
 
21
  const MSG_UPGRADE_MONTH = 'UpgradeNotice200'; // When processing more than the subscription allows on average..
22
  const MSG_UPGRADE_BULK = 'UpgradeNotice201'; // when there is no enough for a bulk run.
23
 
@@ -55,6 +56,17 @@ class adminNoticesController extends ShortPixelController
55
  {
56
  Notices::removeNoticeByID(self::MSG_UPGRADE_MONTH);
57
  Notices::removeNoticeByID(self::MSG_UPGRADE_BULK);
 
 
 
 
 
 
 
 
 
 
 
58
  }
59
 
60
  /* General function to check on Hook for admin notices if there is something to show globally */
@@ -235,6 +247,7 @@ class adminNoticesController extends ShortPixelController
235
 
236
  $message = $this->getQuotaExceededMessage($quotaData);
237
  $notice = Notices::addError($message);
 
238
  }
239
 
240
  }
18
  const MSG_UNLISTED_FOUND = 'Error102'; // SPIO found unlisted images, but this setting is not on
19
 
20
  //const MSG_NO_
21
+ const MSG_QUOTA_REACHED = 'QuotaReached100';
22
  const MSG_UPGRADE_MONTH = 'UpgradeNotice200'; // When processing more than the subscription allows on average..
23
  const MSG_UPGRADE_BULK = 'UpgradeNotice201'; // when there is no enough for a bulk run.
24
 
56
  {
57
  Notices::removeNoticeByID(self::MSG_UPGRADE_MONTH);
58
  Notices::removeNoticeByID(self::MSG_UPGRADE_BULK);
59
+ Notices::removeNoticeBYID(self::MSG_QUOTA_REACHED);
60
+ }
61
+
62
+ /** ReInstates A Persistent Notice manually */
63
+ public static function reInstateQuotaExceeded()
64
+ {
65
+ $noticeControl = Notices::getInstance();
66
+ $notice = $noticeControl->getNoticeByID(self::MSG_QUOTA_REACHED);
67
+ $notice->unDismiss();
68
+
69
+ $noticeControl->update();
70
  }
71
 
72
  /* General function to check on Hook for admin notices if there is something to show globally */
247
 
248
  $message = $this->getQuotaExceededMessage($quotaData);
249
  $notice = Notices::addError($message);
250
+ Notices::makePersistent($notice, self::MSG_QUOTA_REACHED, WEEK_IN_SECONDS);
251
  }
252
 
253
  }
class/controller/settings.php CHANGED
@@ -90,16 +90,9 @@ class SettingsController extends shortPixelController
90
  $this->keyModel->resetTried();
91
  $this->keyModel->checkKey($this->postData['apiKey']);
92
  }
93
- /*if (isset($this->postData['verifiedKey']) && $this->postData['verifiedKey'])
94
- {
95
- $this->model->apiKey = $this->postData['apiKey'];
96
- $this->model->verifiedKey = $this->postData['verifiedKey'];
97
- } */
98
  }
99
 
100
  $this->doRedirect();
101
- //exit();
102
-
103
  }
104
 
105
  public function action_debug_medialibrary()
@@ -195,10 +188,8 @@ class SettingsController extends shortPixelController
195
  $this->has_nextgen = $env->has_nextgen;
196
 
197
  $this->display_part = isset($_GET['part']) ? sanitize_text_field($_GET['part']) : 'settings';
198
-
199
  }
200
 
201
-
202
  /* Temporary function to check if HTaccess is writable.
203
  * HTaccess is writable if it exists *and* is_writable, or can be written if directory is writable.
204
  * @todo Should be replaced when File / Folder model are complete. Function check should go there.
@@ -276,12 +267,21 @@ class SettingsController extends shortPixelController
276
 
277
  if ($this->has_nextgen)
278
  {
279
- $ngg = array_map(array('ShortPixelNextGenAdapter','pathToAbsolute'), \ShortPixelNextGenAdapter::getGalleries());
280
- for($i = 0; $i < count($customFolders); $i++) {
281
- if(in_array($customFolders[$i]->getPath(), $ngg )) {
282
- $customFolders[$i]->setType("NextGen");
283
- }
 
 
 
 
 
 
 
 
284
  }
 
285
  }
286
  return $customFolders;
287
  }
@@ -487,19 +487,5 @@ class SettingsController extends shortPixelController
487
  exit();
488
  }
489
 
490
- /*
491
- protected function NoticeApiKeyLength($key)
492
- {
493
- $KeyLength = strlen($key);
494
-
495
- $notice = sprintf(__("The key you provided has %s characters. The API key should have 20 characters, letters and numbers only.",'shortpixel-image-optimiser'), $KeyLength)
496
- . "<BR> <b>"
497
- . __('Please check that the API key is the same as the one you received in your confirmation email.','shortpixel-image-optimiser')
498
- . "</b><BR> "
499
- . __('If this problem persists, please contact us at ','shortpixel-image-optimiser')
500
- . "<a href='mailto:help@shortpixel.com?Subject=API Key issues' target='_top'>help@shortpixel.com</a>"
501
- . __(' or ','shortpixel-image-optimiser')
502
- . "<a href='https://shortpixel.com/contact' target='_blank'>" . __('here','shortpixel-image-optimiser') . "</a>.";
503
- Notice::addError($notice);
504
- } */
505
  }
90
  $this->keyModel->resetTried();
91
  $this->keyModel->checkKey($this->postData['apiKey']);
92
  }
 
 
 
 
 
93
  }
94
 
95
  $this->doRedirect();
 
 
96
  }
97
 
98
  public function action_debug_medialibrary()
188
  $this->has_nextgen = $env->has_nextgen;
189
 
190
  $this->display_part = isset($_GET['part']) ? sanitize_text_field($_GET['part']) : 'settings';
 
191
  }
192
 
 
193
  /* Temporary function to check if HTaccess is writable.
194
  * HTaccess is writable if it exists *and* is_writable, or can be written if directory is writable.
195
  * @todo Should be replaced when File / Folder model are complete. Function check should go there.
267
 
268
  if ($this->has_nextgen)
269
  {
270
+ // $ngg = array_map(array('ShortPixelNextGenAdapter','pathToAbsolute'), \ShortPixelNextGenAdapter::getGalleries());
271
+ $ng = NextGen::getInstance();
272
+ $folders = $ng->getGalleries();
273
+ $foldersArray = array();
274
+ foreach($folders as $dirObj)
275
+ {
276
+ $foldersArray[] = $dirObj->getPath();
277
+ }
278
+
279
+ foreach($customFolders as $id => $folder)
280
+ {
281
+ if(in_array($folder->getPath(), $foldersArray )) {
282
+ $folder->setType("nextgen");
283
  }
284
+ }
285
  }
286
  return $customFolders;
287
  }
487
  exit();
488
  }
489
 
490
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
491
  }
class/db/shortpixel-custom-meta-dao.php CHANGED
@@ -65,12 +65,12 @@ class ShortPixelCustomMetaDao {
65
  path_md5 char(32),
66
  compressed_size int(10) NOT NULL DEFAULT 0,
67
  compression_type tinyint,
68
- keep_exif tinyint,
69
- cmyk2rgb tinyint,
70
  resize tinyint,
71
  resize_width smallint,
72
  resize_height smallint,
73
- backup tinyint,
74
  status SMALLINT NOT NULL DEFAULT 0,
75
  retries tinyint NOT NULL DEFAULT 0,
76
  message varchar(255),
@@ -132,7 +132,7 @@ class ShortPixelCustomMetaDao {
132
  $rows = $this->db->query($sql);
133
  $folders = array();
134
  foreach($rows as $row) {
135
- $folders[] = new ShortPixelFolder($row, $this->excludePatterns);
136
  }
137
  return $folders;
138
  }
@@ -272,7 +272,7 @@ class ShortPixelCustomMetaDao {
272
  Log::addWarn('FolderObj from database is not there, while folder seems ok ' . $folder->getPath() );
273
  return false;
274
  }
275
-
276
  Log::addDebug('Doing Refresh Folder for (DirectoryModel / ShortpixelFolder) ', array($folder->getPath(), $folderObj->getPath()) );
277
 
278
  $fs = \wpSPIO()->fileSystem();
@@ -334,7 +334,6 @@ class ShortPixelCustomMetaDao {
334
  $folder->setId($fld->getId());
335
  }
336
  }
337
- //var_dump($allFolders);
338
  return sprintf(__('Folder already included in %s.','shortpixel-image-optimiser'),$parent);
339
  }
340
  } else {
@@ -376,24 +375,26 @@ class ShortPixelCustomMetaDao {
376
  $i = 0;
377
  $count = 0;
378
  $placeholders = array();
 
 
379
  foreach($files as $file) {
380
  $filepath = $file->getFullPath();
381
  $filename = $file->getFileName();
382
 
383
- array_push($values, $folderId, $filepath, $filename, md5($filepath), 0);
384
  $placeholders[] = $format;
385
 
386
-
387
  if($i % 500 == 499) {
388
  $query = $sql;
389
  $query .= implode(', ', $placeholders);
390
  $this->db->query( $this->db->prepare("$query ", $values));
391
 
392
  $values = array();
 
393
  }
394
  $i++;
395
  }
396
- if($values) {
397
  $query = $sql;
398
  $query .= implode(', ', $placeholders);
399
  $result = $wpdb->query( $wpdb->prepare("$query ", $values) );
65
  path_md5 char(32),
66
  compressed_size int(10) NOT NULL DEFAULT 0,
67
  compression_type tinyint,
68
+ keep_exif tinyint DEFAULT 0,
69
+ cmyk2rgb tinyint DEFAULT 0,
70
  resize tinyint,
71
  resize_width smallint,
72
  resize_height smallint,
73
+ backup tinyint DEFAULT 0,
74
  status SMALLINT NOT NULL DEFAULT 0,
75
  retries tinyint NOT NULL DEFAULT 0,
76
  message varchar(255),
132
  $rows = $this->db->query($sql);
133
  $folders = array();
134
  foreach($rows as $row) {
135
+ $folders[$row->id] = new ShortPixelFolder($row, $this->excludePatterns);
136
  }
137
  return $folders;
138
  }
272
  Log::addWarn('FolderObj from database is not there, while folder seems ok ' . $folder->getPath() );
273
  return false;
274
  }
275
+
276
  Log::addDebug('Doing Refresh Folder for (DirectoryModel / ShortpixelFolder) ', array($folder->getPath(), $folderObj->getPath()) );
277
 
278
  $fs = \wpSPIO()->fileSystem();
334
  $folder->setId($fld->getId());
335
  }
336
  }
 
337
  return sprintf(__('Folder already included in %s.','shortpixel-image-optimiser'),$parent);
338
  }
339
  } else {
375
  $i = 0;
376
  $count = 0;
377
  $placeholders = array();
378
+ $status = (\wpSPIO()->settings()->autoMediaLibrary == 1) ? ShortPixelMeta::FILE_STATUS_PENDING : ShortPixelMeta::FILE_STATUS_UNPROCESSED;
379
+
380
  foreach($files as $file) {
381
  $filepath = $file->getFullPath();
382
  $filename = $file->getFileName();
383
 
384
+ array_push($values, $folderId, $filepath, $filename, md5($filepath), $status);
385
  $placeholders[] = $format;
386
 
 
387
  if($i % 500 == 499) {
388
  $query = $sql;
389
  $query .= implode(', ', $placeholders);
390
  $this->db->query( $this->db->prepare("$query ", $values));
391
 
392
  $values = array();
393
+ $placeholders = array();
394
  }
395
  $i++;
396
  }
397
+ if(count($values) > 0) {
398
  $query = $sql;
399
  $query .= implode(', ', $placeholders);
400
  $result = $wpdb->query( $wpdb->prepare("$query ", $values) );
class/db/shortpixel-meta-facade.php CHANGED
@@ -109,15 +109,14 @@ class ShortPixelMetaFacade {
109
  // Update MetaData of Image.
110
  public function updateMeta($newMeta = null, $replaceThumbs = false) {
111
 
112
- $this->deleteItemCache();
113
-
114
  if($newMeta) {
115
  $this->meta = $newMeta;
116
  }
117
  if($this->type == self::CUSTOM_TYPE) {
118
  $this->spMetaDao->update($this->meta);
119
  if($this->meta->getExtMetaId()) {
120
- ShortPixelNextGenAdapter::updateImageSize($this->meta->getExtMetaId(), $this->meta->getPath());
 
121
  }
122
  }
123
  elseif($this->type == ShortPixelMetaFacade::MEDIA_LIBRARY_TYPE) {
@@ -223,6 +222,8 @@ class ShortPixelMetaFacade {
223
  }
224
  } // duplicates loop
225
  }
 
 
226
  }
227
 
228
 
@@ -896,6 +897,7 @@ class ShortPixelMetaFacade {
896
  return array_unique($duplicates);
897
  }
898
 
 
899
  public static function pathToWebPath($path) {
900
  //$upl = wp_upload_dir();
901
  //return str_replace($upl["basedir"], $upl["baseurl"], $path);
@@ -910,6 +912,7 @@ class ShortPixelMetaFacade {
910
  return self::filenameToRootRelative($path);
911
  }
912
 
 
913
  public static function filenameToRootRelative($path) {
914
  return self::replaceHomePath($path, "");
915
  }
109
  // Update MetaData of Image.
110
  public function updateMeta($newMeta = null, $replaceThumbs = false) {
111
 
 
 
112
  if($newMeta) {
113
  $this->meta = $newMeta;
114
  }
115
  if($this->type == self::CUSTOM_TYPE) {
116
  $this->spMetaDao->update($this->meta);
117
  if($this->meta->getExtMetaId()) {
118
+ $ng = \ShortPixel\NextGen::getInstance();
119
+ $ng->updateImageSize($this->meta->getExtMetaId(), $this->meta->getPath());
120
  }
121
  }
122
  elseif($this->type == ShortPixelMetaFacade::MEDIA_LIBRARY_TYPE) {
222
  }
223
  } // duplicates loop
224
  }
225
+
226
+ $this->deleteItemCache();
227
  }
228
 
229
 
897
  return array_unique($duplicates);
898
  }
899
 
900
+ /* @todo . Was only in use by now defunct shortpixel-list-table */
901
  public static function pathToWebPath($path) {
902
  //$upl = wp_upload_dir();
903
  //return str_replace($upl["basedir"], $upl["baseurl"], $path);
912
  return self::filenameToRootRelative($path);
913
  }
914
 
915
+
916
  public static function filenameToRootRelative($path) {
917
  return self::replaceHomePath($path, "");
918
  }
class/external/nextgen.php CHANGED
@@ -4,31 +4,66 @@ use ShortPixel\Notices\NoticeController as Notice;
4
 
5
  class NextGen
6
  {
7
- protected $instance;
 
 
 
8
 
9
  public function __construct()
10
  {
11
- add_action('ngg_added_new_image', array($this,'new_image'));
12
  add_filter('shortpixel/init/optimize_on_screens', array($this, 'add_screen_loads'));
 
 
 
 
13
  }
14
 
15
- public function add_screen_loads($use_screens)
16
  {
17
- $use_screens[] = 'toplevel_page_nextgen-gallery'; // toplevel
18
- $use_screens[] = 'gallery_page_ngg_addgallery'; // add gallery
19
- $use_screens[] = 'nggallery-manage-gallery'; // manage gallery
20
- $use_screens[] = 'gallery_page_nggallery-manage-album'; // manage album
 
21
 
22
- return $use_screens;
23
  }
24
 
 
25
  public static function getInstance()
26
  {
27
  if (is_null(self::$instance))
28
- self::$instance = new nextGen();
29
 
30
  return self::$instance;
31
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
32
  /** Enables nextGen, add galleries to custom folders
33
  * @param boolean $silent Throw a notice or not. This seems to be based if nextgen was already activated previously or not.
34
  */
@@ -40,24 +75,47 @@ class NextGen
40
 
41
  }
42
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
43
  /** Adds nextGen galleries to custom table
44
  * Note - this function does *Not* check if nextgen is enabled, not if checks custom Tables. Use nextgenEnabled for this.
45
  * Enabled checks are not an external class issue, so must be done before calling.
46
  */
47
  public function addNextGenGalleriesToCustom($silent = true) {
48
  $shortPixel = \wpSPIO()->getShortPixel();
49
-
 
50
  $folderMsg = "";
51
-
52
  //add the NextGen galleries to custom folders
53
- $ngGalleries = \ShortPixelNextGenAdapter::getGalleries();
 
 
54
  $meta = $shortPixel->getSpMetaDao();
55
  foreach($ngGalleries as $gallery) {
56
- $msg = $meta->newFolderFromPath($gallery, get_home_path(), \WPShortPixel::getCustomFolderBase());
57
- if($msg) { //try again with ABSPATH as maybe WP is in a subdir
58
- $msg = $meta->newFolderFromPath($gallery, ABSPATH, \WPShortPixel::getCustomFolderBase());
59
- }
60
- $folderMsg .= $msg;
 
61
  //$this->_settings->hasCustomFolders = time();
62
  }
63
 
@@ -68,20 +126,137 @@ class NextGen
68
  $settings->hasCustomFolders = time();
69
 
70
  }
71
- if (! $silent)
72
  {
73
  Notice::addNormal($folderMsg);
74
  }
75
 
76
  }
77
 
78
- /** @todo Move handling also to the integration */
79
- public function add_image($image)
80
  {
81
- wpSPIO()->getShortPixel()->handleNextGenImageUpload($image);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
82
  }
 
 
 
 
 
 
83
  } // class .
84
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
85
 
86
 
87
- $ng = new nextGen();
4
 
5
  class NextGen
6
  {
7
+ protected static $instance;
8
+ protected $view;
9
+
10
+ // ngg_created_new_gallery
11
 
12
  public function __construct()
13
  {
 
14
  add_filter('shortpixel/init/optimize_on_screens', array($this, 'add_screen_loads'));
15
+ $this->view = new nextGenView();
16
+
17
+
18
+ add_action('plugins_loaded', array($this, 'hooks'));
19
  }
20
 
21
+ public function hooks()
22
  {
23
+ if ($this->optimizeNextGen()) // if optimization is on, hook.
24
+ {
25
+ add_action('ngg_update_addgallery_page', array( &$this, 'addNextGenGalleriesToCustom'));
26
+ add_action('ngg_added_new_image', array($this,'handleImageUpload'));
27
+ }
28
 
 
29
  }
30
 
31
+ // Use GetInstance, don't use the construct.
32
  public static function getInstance()
33
  {
34
  if (is_null(self::$instance))
35
+ self::$instance = new NextGen();
36
 
37
  return self::$instance;
38
  }
39
+
40
+ public function has_nextgen()
41
+ {
42
+ if (defined('NGG_PLUGIN'))
43
+ return true;
44
+ else
45
+ return false;
46
+ }
47
+
48
+ public function optimizeNextGen()
49
+ {
50
+ if (\wpSPIO()->settings()->includeNextGen == 1)
51
+ return true;
52
+ else
53
+ return false;
54
+ }
55
+
56
+
57
+ public function add_screen_loads($use_screens)
58
+ {
59
+
60
+ $use_screens[] = 'toplevel_page_nextgen-gallery'; // toplevel
61
+ $use_screens[] = 'gallery_page_ngg_addgallery'; // add gallery
62
+ $use_screens[] = 'nggallery-manage-gallery'; // manage gallery
63
+ $use_screens[] = 'gallery_page_nggallery-manage-album'; // manage album
64
+
65
+ return $use_screens;
66
+ }
67
  /** Enables nextGen, add galleries to custom folders
68
  * @param boolean $silent Throw a notice or not. This seems to be based if nextgen was already activated previously or not.
69
  */
75
 
76
  }
77
 
78
+ /* @return DirectoryModel */
79
+ public function getGalleries()
80
+ {
81
+ global $wpdb;
82
+ $fs = \wpSPIO()->filesystem();
83
+ $homepath = $fs->getWPFileBase();
84
+ $result = $wpdb->get_results("SELECT path FROM {$wpdb->prefix}ngg_gallery");
85
+
86
+ $galleries = array();
87
+
88
+ foreach($result as $row)
89
+ {
90
+ $directory = $fs->getDirectory($homepath->getPath() . $row->path);
91
+ if ($directory->exists())
92
+ $galleries[] = $directory;
93
+ }
94
+
95
+ return $galleries;
96
+ }
97
+
98
  /** Adds nextGen galleries to custom table
99
  * Note - this function does *Not* check if nextgen is enabled, not if checks custom Tables. Use nextgenEnabled for this.
100
  * Enabled checks are not an external class issue, so must be done before calling.
101
  */
102
  public function addNextGenGalleriesToCustom($silent = true) {
103
  $shortPixel = \wpSPIO()->getShortPixel();
104
+ $fs = \wpSPIO()->filesystem();
105
+ $homepath = $fs->getWPFileBase();
106
  $folderMsg = "";
 
107
  //add the NextGen galleries to custom folders
108
+ $ngGalleries = $this->getGalleries();
109
+
110
+
111
  $meta = $shortPixel->getSpMetaDao();
112
  foreach($ngGalleries as $gallery) {
113
+ $msg = $meta->newFolderFromPath($gallery, $homepath->getPath(), \WPShortPixel::getCustomFolderBase());
114
+ // if($msg) { //try again with ABSPATH as maybe WP is in a subdir
115
+ // $msg = $meta->newFolderFromPath($gallery, ABSPATH, \WPShortPixel::getCustomFolderBase());
116
+ // }
117
+ if ($msg)
118
+ $folderMsg .= $msg . '(' . $gallery . ') <br>';
119
  //$this->_settings->hasCustomFolders = time();
120
  }
121
 
126
  $settings->hasCustomFolders = time();
127
 
128
  }
129
+ if (! $silent && (strlen(trim($folderMsg)) > 0 && $folderMsg !== false))
130
  {
131
  Notice::addNormal($folderMsg);
132
  }
133
 
134
  }
135
 
136
+ public function handleImageUpload($image)
 
137
  {
138
+ $shortPixel = \wpSPIO()->getShortPixel();
139
+ $metadao = $shortPixel->getSpMetaDao();
140
+
141
+ if (\wpSPIO()->settings()->includeNextGen == 1) {
142
+ $imageFsPath = $this->getImageAbspath($image);
143
+ $customFolders = $metadao->getFolders();
144
+
145
+ $folderId = -1;
146
+ foreach ($customFolders as $folder) {
147
+ if (strpos($imageFsPath, $folder->getPath()) === 0) {
148
+ $folderId = $folder->getId();
149
+ break;
150
+ }
151
+ }
152
+ if ($folderId == -1) { //if not found, create
153
+ $galleryPath = dirname($imageFsPath);
154
+ $folder = new \ShortPixelFolder(array("path" => $galleryPath), $this->_settings->excludePatterns);
155
+ $folderMsg = $metadao->saveFolder($folder);
156
+ $folderId = $folder->getId();
157
+ //self::log("NG Image Upload: created folder from path $galleryPath : Folder info: " . json_encode($folder));
158
+ }
159
+
160
+ return $shortPixel->addPathToCustomFolder($imageFsPath, $folderId, $image->pid);
161
+ }
162
+ }
163
+
164
+ public function updateImageSize($nggId, $path) {
165
+
166
+ $mapper = \C_Image_Mapper::get_instance();
167
+ $image = $mapper->find($nggId);
168
+
169
+ $dimensions = getimagesize($this->getImageAbspath($image));
170
+ $size_meta = array('width' => $dimensions[0], 'height' => $dimensions[1]);
171
+ $image->meta_data = array_merge($image->meta_data, $size_meta);
172
+ $image->meta_data['full'] = $size_meta;
173
+ $mapper->save($image);
174
  }
175
+
176
+ public function getImageAbspath($image) {
177
+ $storage = \C_Gallery_Storage::get_instance();
178
+ return $storage->get_image_abspath($image);
179
+ }
180
+
181
  } // class .
182
 
183
+ class nextGenView
184
+ {
185
+ protected $nggColumnIndex = 0;
186
+
187
+ public function __construct()
188
+ {
189
+ $this->hooks();
190
+ }
191
+
192
+ protected function hooks()
193
+ {
194
+ add_filter( 'ngg_manage_images_columns', array( $this, 'nggColumns' ) );
195
+ add_filter( 'ngg_manage_images_number_of_columns', array( $this, 'nggCountColumns' ) );
196
+ add_filter( 'ngg_manage_images_column_7_header', array( $this, 'nggColumnHeader' ) );
197
+ add_filter( 'ngg_manage_images_column_7_content', array( $this, 'nggColumnContent' ) );
198
+ }
199
+
200
+ // @todo move NGG specific function to own integration
201
+ public function nggColumns( $defaults ) {
202
+ $this->nggColumnIndex = count($defaults) + 1;
203
+ add_filter( 'ngg_manage_images_column_' . $this->nggColumnIndex . '_header', array( &$this, 'nggColumnHeader' ) );
204
+ add_filter( 'ngg_manage_images_column_' . $this->nggColumnIndex . '_content', array( &$this, 'nggColumnContent' ), 10, 2 );
205
+ $defaults['wp-shortPixelNgg'] = 'ShortPixel Compression';
206
+ return $defaults;
207
+ }
208
+
209
+ public function nggCountColumns( $count ) {
210
+ return $count + 1;
211
+ }
212
+
213
+ public function nggColumnHeader( $default ) {
214
+ return __('ShortPixel Compression','shortpixel-image-optimiser');
215
+ }
216
+
217
+ public function nggColumnContent( $unknown, $picture ) {
218
+ $shortPixel = \wpSPIO()->getShortPixel();
219
+ $metadao = $shortPixel->getSpMetaDao();
220
+ $view = new \ShortPixelView($shortPixel);
221
+
222
+ $meta = $metadao->getMetaForPath($picture->imagePath);
223
+ if($meta) {
224
+ switch($meta->getStatus()) {
225
+ case "0": echo("<div id='sp-msg-C-{$meta->getId()}' class='column-wp-shortPixel' style='color: #000'>Waiting</div>"); break;
226
+ case "1": echo("<div id='sp-msg-C-{$meta->getId()}' class='column-wp-shortPixel' style='color: #000'>Pending</div>"); break;
227
+ case "2": $view->renderCustomColumn("C-" . $meta->getId(), array(
228
+ 'showActions' => false && current_user_can( 'manage_options' ),
229
+ 'status' => 'imgOptimized',
230
+ 'type' => \ShortPixelAPI::getCompressionTypeName($meta->getCompressionType()),
231
+ 'percent' => $meta->getImprovementPercent(),
232
+ 'bonus' => $meta->getImprovementPercent() < 5,
233
+ 'thumbsOpt' => 0,
234
+ 'thumbsOptList' => array(),
235
+ 'thumbsTotal' => 0,
236
+ 'retinasOpt' => 0,
237
+ 'backup' => true,
238
+ 'excludeSizes' => \wpSPIO()->settings()->excludeSizes,
239
+ 'thumbsToOptimize' => array(),
240
+ 'invType' => array(),
241
+
242
+ ));
243
+ break;
244
+ }
245
+ } else {
246
+ $view->renderCustomColumn($meta ? "C-" . $meta->getId() : "N-" . $picture->pid, array(
247
+ 'showActions' => false && current_user_can( 'manage_options' ),
248
+ 'status' => 'optimizeNow',
249
+ 'thumbsOpt' => 0,
250
+ 'thumbsOptList' => array(),
251
+ 'thumbsTotal' => 0,
252
+ 'retinasOpt' => 0,
253
+ 'message' => "Not optimized"
254
+ ));
255
+ }
256
+ // return var_dump($meta);
257
+ }
258
+
259
+ } // class
260
 
261
 
262
+ $ng = NextGen::getInstance();
class/model/environment_model.php CHANGED
@@ -41,8 +41,8 @@ class EnvironmentModel extends ShortPixelModel
41
  {
42
  $this->setServer();
43
  $this->setWordPress();
44
- $this->setIntegrations();
45
- $this->setScreen(); // This might not be set on construct time!
46
  }
47
 
48
  public static function getInstance()
@@ -50,8 +50,8 @@ class EnvironmentModel extends ShortPixelModel
50
  if (is_null(self::$instance))
51
  self::$instance = new EnvironmentModel();
52
 
53
- if (! self::$instance->screen_is_set)
54
- self::$instance->setScreen();
55
 
56
  return self::$instance;
57
  }
@@ -92,15 +92,16 @@ class EnvironmentModel extends ShortPixelModel
92
 
93
  }
94
 
95
- public function setScreen()
96
  {
97
- if (! function_exists('get_current_screen')) // way too early.
98
  return false;
99
 
100
  $screen = get_current_screen();
 
101
 
102
- if (is_null($screen)) // too early
103
- return false;
104
 
105
  // WordPress pages where we'll be active on.
106
  // https://codex.wordpress.org/Plugin_API/Admin_Screen_Reference
@@ -142,14 +143,13 @@ class EnvironmentModel extends ShortPixelModel
142
  $this->is_bulk_page = true;
143
  }
144
 
145
-
146
-
147
  $this->screen_is_set = true;
148
  }
149
 
150
- private function setIntegrations()
151
  {
152
- $this->has_nextgen = \ShortPixelNextGenAdapter::hasNextGen();
 
153
 
154
  }
155
  }
41
  {
42
  $this->setServer();
43
  $this->setWordPress();
44
+ add_action('plugins_loaded', array($this, 'setIntegrations') ); // not set on construct.
45
+ add_action('current_screen', array($this, 'setScreen') ); // Not set on construct
46
  }
47
 
48
  public static function getInstance()
50
  if (is_null(self::$instance))
51
  self::$instance = new EnvironmentModel();
52
 
53
+ /*if (! self::$instance->screen_is_set)
54
+ self::$instance->setScreen(); */
55
 
56
  return self::$instance;
57
  }
92
 
93
  }
94
 
95
+ public function setScreen($screen)
96
  {
97
+ /*if (! function_exists('get_current_screen')) // way too early.
98
  return false;
99
 
100
  $screen = get_current_screen();
101
+ */
102
 
103
+ /*if (is_null($screen)) //
104
+ return false; */
105
 
106
  // WordPress pages where we'll be active on.
107
  // https://codex.wordpress.org/Plugin_API/Admin_Screen_Reference
143
  $this->is_bulk_page = true;
144
  }
145
 
 
 
146
  $this->screen_is_set = true;
147
  }
148
 
149
+ public function setIntegrations()
150
  {
151
+ $ng = NextGen::getInstance();
152
+ $this->has_nextgen = $ng->has_nextgen();
153
 
154
  }
155
  }
class/view/settings/part-advanced.php CHANGED
@@ -53,17 +53,19 @@ namespace ShortPixel;
53
  <?php if($view->customFolders) { ?>
54
  <table class="shortpixel-folders-list">
55
  <tr style="font-weight: bold;">
56
- <td><?php _e('Folder name','shortpixel-image-optimiser');?></td>
57
- <td><?php _e('Type &amp;<br>Status','shortpixel-image-optimiser');?></td>
58
- <td><?php _e('Files','shortpixel-image-optimiser');?></td>
59
- <td><?php _e('Last change','shortpixel-image-optimiser');?></td>
60
- <td></td>
61
  </tr>
62
- <?php foreach($view->customFolders as $folder) {
63
- $typ = $folder->getType();
64
- $typ = $typ ? $typ . "<br>" : "";
 
65
  $stat = $this->shortPixel->getSpMetaDao()->getFolderOptimizationStatus($folder->getId());
66
  $cnt = $folder->getFileCount();
 
67
  $st = ($cnt == 0
68
  ? __("Empty",'shortpixel-image-optimiser')
69
  : ($stat->Total == $stat->Optimized
@@ -74,19 +76,22 @@ namespace ShortPixel;
74
 
75
  $action = ($st == __("Optimized",'shortpixel-image-optimiser') || $st == __("Empty",'shortpixel-image-optimiser') ? __("Stop monitoring",'shortpixel-image-optimiser') : __("Stop optimizing",'shortpixel-image-optimiser'));
76
 
 
 
 
77
  $fullStat = $st == __("Empty",'shortpixel-image-optimiser') ? "" : __("Optimized",'shortpixel-image-optimiser') . ": " . $stat->Optimized . ", "
78
  . __("Pending",'shortpixel-image-optimiser') . ": " . $stat->Pending . ", " . __("Waiting",'shortpixel-image-optimiser') . ": " . $stat->Waiting . ", "
79
  . __("Failed",'shortpixel-image-optimiser') . ": " . $stat->Failed;
80
  ?>
81
  <tr>
82
- <td>
83
  <?php echo($folder->getPath()); ?>
84
  </td>
85
  <td>
86
  <?php if(!($st == "Empty")) { ?>
87
  <a href="javascript:none();" title="<?php echo $fullStat; ?>" style="text-decoration: none;">
88
  <img alt='Info icon' src='<?php echo( wpSPIO()->plugin_url('res/img/info-icon.png' ));?>' style="margin-bottom: -2px;"/>
89
- </a>&nbsp;<?php } echo($typ.$st.$err); ?>
90
 
91
  </td>
92
  <td>
@@ -96,7 +101,9 @@ namespace ShortPixel;
96
  <?php echo($folder->getTsUpdated()); ?>
97
  </td>
98
  <td>
 
99
  <input type="button" class="button remove-folder-button" data-value="<?php echo($folder->getPath()); ?>" title="<?php echo($action . " " . $folder->getPath()); ?>" value="<?php echo $action;?>">
 
100
  <input type="button" style="display:none;" class="button button-alert recheck-folder-button" data-value="<?php echo($folder->getPath()); ?>"
101
  title="<?php _e('Full folder refresh, check each file of the folder if it changed since it was optimized. Might take up to 1 min. for big folders.','shortpixel-image-optimiser');?>"
102
  value="<?php _e('Refresh','shortpixel-image-optimiser');?>">
53
  <?php if($view->customFolders) { ?>
54
  <table class="shortpixel-folders-list">
55
  <tr style="font-weight: bold;">
56
+ <th><?php _e('Folder name','shortpixel-image-optimiser');?></th>
57
+ <th><?php _e('Type &amp; Status','shortpixel-image-optimiser');?></th>
58
+ <th><?php _e('Files','shortpixel-image-optimiser');?></th>
59
+ <th><?php _e('Last change','shortpixel-image-optimiser');?></th>
60
+ <td>&nbsp;</td>
61
  </tr>
62
+ <?php foreach($view->customFolders as $folder_id => $folder) {
63
+ $folder_type = $folder->getType();
64
+
65
+ $type_display = ($folder_type) ? ucfirst($folder_type) . "<br>" : "";
66
  $stat = $this->shortPixel->getSpMetaDao()->getFolderOptimizationStatus($folder->getId());
67
  $cnt = $folder->getFileCount();
68
+
69
  $st = ($cnt == 0
70
  ? __("Empty",'shortpixel-image-optimiser')
71
  : ($stat->Total == $stat->Optimized
76
 
77
  $action = ($st == __("Optimized",'shortpixel-image-optimiser') || $st == __("Empty",'shortpixel-image-optimiser') ? __("Stop monitoring",'shortpixel-image-optimiser') : __("Stop optimizing",'shortpixel-image-optimiser'));
78
 
79
+ if ($folder_type == 'nextgen' && $view->data->includeNextGen == 1)
80
+ $action = false;
81
+
82
  $fullStat = $st == __("Empty",'shortpixel-image-optimiser') ? "" : __("Optimized",'shortpixel-image-optimiser') . ": " . $stat->Optimized . ", "
83
  . __("Pending",'shortpixel-image-optimiser') . ": " . $stat->Pending . ", " . __("Waiting",'shortpixel-image-optimiser') . ": " . $stat->Waiting . ", "
84
  . __("Failed",'shortpixel-image-optimiser') . ": " . $stat->Failed;
85
  ?>
86
  <tr>
87
+ <td class='folder folder-<?php echo $folder_id ?>'>
88
  <?php echo($folder->getPath()); ?>
89
  </td>
90
  <td>
91
  <?php if(!($st == "Empty")) { ?>
92
  <a href="javascript:none();" title="<?php echo $fullStat; ?>" style="text-decoration: none;">
93
  <img alt='Info icon' src='<?php echo( wpSPIO()->plugin_url('res/img/info-icon.png' ));?>' style="margin-bottom: -2px;"/>
94
+ </a>&nbsp;<?php } echo($type_display.$st.$err); ?>
95
 
96
  </td>
97
  <td>
101
  <?php echo($folder->getTsUpdated()); ?>
102
  </td>
103
  <td>
104
+ <?php if ($action): ?>
105
  <input type="button" class="button remove-folder-button" data-value="<?php echo($folder->getPath()); ?>" title="<?php echo($action . " " . $folder->getPath()); ?>" value="<?php echo $action;?>">
106
+ <?php endif; ?>
107
  <input type="button" style="display:none;" class="button button-alert recheck-folder-button" data-value="<?php echo($folder->getPath()); ?>"
108
  title="<?php _e('Full folder refresh, check each file of the folder if it changed since it was optimized. Might take up to 1 min. for big folders.','shortpixel-image-optimiser');?>"
109
  value="<?php _e('Refresh','shortpixel-image-optimiser');?>">
class/view/shortpixel-list-table.php CHANGED
@@ -176,7 +176,7 @@ class ShortPixelListTable extends WP_List_Table {
176
 
177
  return __($item->compression_type == 2 ? 'Glossy' : ($item->compression_type == 1 ? 'Lossy' : 'Lossless'),'shortpixel-image-optimiser')
178
  . ($item->keep_exif == 0 ? "": ", " . __('Keep EXIF','shortpixel-image-optimiser'))
179
- . ($item->cmyk2rgb == 1 ? "": ", " . __('Preserve CMYK','shortpixel-image-optimiser'));
180
  case 'media_type':
181
  return $item->$column_name;
182
  case 'date':
@@ -199,7 +199,7 @@ class ShortPixelListTable extends WP_List_Table {
199
  }
200
 
201
  public function no_items() {
202
- echo(__('No images avaliable. Go to <a href="options-general.php?page=wp-shortpixel-settings&part=adv-settings">Advanced Settings</a> to configure additional folders to be optimized.','shortpixel-image-optimiser'));
203
  }
204
 
205
  /**
@@ -282,7 +282,7 @@ class ShortPixelListTable extends WP_List_Table {
282
  switch($this->current_action()) {
283
  case 'optimize':
284
  if (!wp_verify_nonce($nonce, 'sp_optimize_image')) {
285
- die('Error.');
286
  } else {
287
  $this->action_optimize_image(absint($_GET['image']));
288
  wp_redirect($redirect_url);
@@ -291,7 +291,7 @@ class ShortPixelListTable extends WP_List_Table {
291
  break;
292
  case 'restore':
293
  if (!wp_verify_nonce($nonce, 'sp_restore_image')) {
294
- die('Error.');
295
  } else {
296
  if($this->action_restore_image(absint($_GET['image'])))
297
  {
@@ -303,7 +303,7 @@ class ShortPixelListTable extends WP_List_Table {
303
  break;
304
  case 'redo':
305
  if (!wp_verify_nonce($nonce, 'sp_redo_image')) {
306
- die('Error.');
307
  } else {
308
  $this->action_redo_image(absint($_GET['image']), sanitize_text_field($_GET['type']));
309
  wp_redirect($redirect_url);
@@ -328,6 +328,11 @@ class ShortPixelListTable extends WP_List_Table {
328
  }
329
  }
330
 
 
 
 
 
 
331
  protected function row_actions($actions, $always_visible = false, $id = false, $actionsEnabled = false ) {
332
  if($id === false) {
333
  return parent::row_actions($actions, $always_visible);
176
 
177
  return __($item->compression_type == 2 ? 'Glossy' : ($item->compression_type == 1 ? 'Lossy' : 'Lossless'),'shortpixel-image-optimiser')
178
  . ($item->keep_exif == 0 ? "": ", " . __('Keep EXIF','shortpixel-image-optimiser'))
179
+ . ($item->cmyk2rgb == 1 || is_null($item->cmyk2rgb) ? "": ", " . __('Preserve CMYK','shortpixel-image-optimiser'));
180
  case 'media_type':
181
  return $item->$column_name;
182
  case 'date':
199
  }
200
 
201
  public function no_items() {
202
+ echo(__('No images available. Go to <a href="options-general.php?page=wp-shortpixel-settings&part=adv-settings">Advanced Settings</a> to configure additional folders to be optimized.','shortpixel-image-optimiser'));
203
  }
204
 
205
  /**
282
  switch($this->current_action()) {
283
  case 'optimize':
284
  if (!wp_verify_nonce($nonce, 'sp_optimize_image')) {
285
+ $this->badNonceDie();
286
  } else {
287
  $this->action_optimize_image(absint($_GET['image']));
288
  wp_redirect($redirect_url);
291
  break;
292
  case 'restore':
293
  if (!wp_verify_nonce($nonce, 'sp_restore_image')) {
294
+ $this->badNonceDie();
295
  } else {
296
  if($this->action_restore_image(absint($_GET['image'])))
297
  {
303
  break;
304
  case 'redo':
305
  if (!wp_verify_nonce($nonce, 'sp_redo_image')) {
306
+ $this->badNonceDie();
307
  } else {
308
  $this->action_redo_image(absint($_GET['image']), sanitize_text_field($_GET['type']));
309
  wp_redirect($redirect_url);
328
  }
329
  }
330
 
331
+ protected function badNonceDie()
332
+ {
333
+ die('Error. Nonce not verified. Do not call this function directly');
334
+ }
335
+
336
  protected function row_actions($actions, $always_visible = false, $id = false, $actionsEnabled = false ) {
337
  if($id === false) {
338
  return parent::row_actions($actions, $always_visible);
class/view/shortpixel_view.php CHANGED
@@ -607,16 +607,34 @@ class ShortPixelView {
607
  <h1><?php _e('Bulk Image Optimization by ShortPixel','shortpixel-image-optimiser');?></h1>
608
  <?php $this->displayBulkProgressBar(true, $percent, $message, $remainingQuota, $averageCompression, $type);?>
609
 
610
- <!-- Partners: SQUIRLY -->
611
- <?php if(!isset($dismissed['squirrly']) && $quotaData['APICallsQuotaOneTimeNumeric']<10000 && $quotaData['APICallsQuotaNumeric']<5000) { ?>
 
 
 
612
  <div id="short-pixel-notice-squirrly" class="sp-notice sp-notice-info bulk-progress bulk-progress-partners sp-floating-block sp-full-width">
613
- <div style="float:right"><a href="javascript:dismissShortPixelNotice('squirrly')"><?php _e('Dismiss','shortpixel-image-optimiser');?></a></div>
614
- <a href="https://my.squirrly.co/go120073/squirrly.co/short-pixel-seo" target="_blank">
615
- <img src="<?php echo(wpSPIO()->plugin_url('res/img/squirrly.png' ));?>" height="50">
616
- <div><?php _e('While you wait for your images to optimize, check out Squirrly, a great plugin for further boosting your SEO.','shortpixel-image-optimiser');?></div>
617
- </a>
 
 
 
618
  </div>
619
  <?php } ?>
 
 
 
 
 
 
 
 
 
 
 
 
620
 
621
  <div class="sp-floating-block sp-notice bulk-notices-parent">
622
  <div class="bulk-notice-container">
607
  <h1><?php _e('Bulk Image Optimization by ShortPixel','shortpixel-image-optimiser');?></h1>
608
  <?php $this->displayBulkProgressBar(true, $percent, $message, $remainingQuota, $averageCompression, $type);?>
609
 
610
+ <!-- Partners: WSO Website Speed Optimization -->
611
+ <?php
612
+ if(!isset($dismissed['squirrly'])) // keep the same dismiss option
613
+ {
614
+ ?>
615
  <div id="short-pixel-notice-squirrly" class="sp-notice sp-notice-info bulk-progress bulk-progress-partners sp-floating-block sp-full-width">
616
+ <div style="float:right"><a href="javascript:dismissShortPixelNotice('squirrly')"><?php _e('Dismiss','shortpixel-image-optimiser'); ?></a></div>
617
+ <div style="display: flex; align-items: center;">
618
+ <span class='icon' style="margin-right: 25px;"><img src="<?php echo(wpSPIO()->plugin_url('res/img/robo-winky.png' ));?>" ></span>
619
+ <span class='content'>
620
+ <p><?php _e('After you optimized all your images your site speed might still be improved. Allow ShortPixel Specialists to tell you how.', 'shortpixel-image-optimiser'); ?><p>
621
+ <p style='font-size: 16px;'><a href="https://shortpixel.com/lp/wso/" target="_blank" style='font-weight: 700;'><?php _e('Get Your Site Assessment','shortpixel-image-optimiser'); ?></a></p>
622
+ </span>
623
+ </div>
624
  </div>
625
  <?php } ?>
626
+ <?php
627
+ // deactivated for the moment, because of the WSO notice above
628
+ if(false && !isset($dismissed['squirrly']) && $quotaData['APICallsQuotaOneTimeNumeric']<10000 && $quotaData['APICallsQuotaNumeric']<5000) { ?>
629
+ <!-- Partners: SQUIRLY -->
630
+ <div id="short-pixel-notice-squirrly" class="sp-notice sp-notice-info bulk-progress bulk-progress-partners sp-floating-block sp-full-width">
631
+ <div style="float:right"><a href="javascript:dismissShortPixelNotice('squirrly')"><?php _e('Dismiss','shortpixel-image-optimiser');?></a></div>
632
+ <a href="https://my.squirrly.co/go120073/squirrly.co/short-pixel-seo" target="_blank">
633
+ <img src="<?php echo(wpSPIO()->plugin_url('res/img/squirrly.png' ));?>" height="50">
634
+ <div><?php _e('While you wait for your images to optimize, check out Squirrly, a great plugin for further boosting your SEO.','shortpixel-image-optimiser');?></div>
635
+ </a>
636
+ </div>
637
+ <?php } ?>
638
 
639
  <div class="sp-floating-block sp-notice bulk-notices-parent">
640
  <div class="bulk-notice-container">
class/wp-short-pixel.php CHANGED
@@ -16,7 +16,7 @@ class WPShortPixel {
16
  private $view = null;
17
  private $thumbnailsRegenerating = array();
18
 
19
- private $hasNextGen = false;
20
  private $spMetaDao = null;
21
 
22
  private $jsSuffix = '.min.js';
@@ -42,7 +42,7 @@ class WPShortPixel {
42
  $this->_settings = new WPShortPixelSettings();
43
  $this->_apiInterface = new ShortPixelAPI($this->_settings);
44
  // $this->cloudflareApi = new ShortPixelCloudFlareApi($this->_settings->cloudflareEmail, $this->_settings->cloudflareAuthKey, $this->_settings->cloudflareZoneID);
45
- $this->hasNextGen = wpSPIO()->env()->has_nextgen; //ShortPixelNextGenAdapter::hasNextGen();
46
  $this->spMetaDao = new ShortPixelCustomMetaDao(new WpShortPixelDb(), $this->_settings->excludePatterns);
47
  $this->prioQ = (! defined('SHORTPIXEL_NOFLOCK')) ? new ShortPixelQueue($this, $this->_settings) : new ShortPixelQueueDB($this, $this->_settings);
48
  $this->view = new ShortPixelView($this);
@@ -103,16 +103,6 @@ class WPShortPixel {
103
 
104
  add_action('mime_types', array($this, 'addWebpMime'));
105
 
106
- //for NextGen
107
- if($this->_settings->hasCustomFolders) {
108
- add_filter( 'ngg_manage_images_columns', array( &$this, 'nggColumns' ) );
109
- add_filter( 'ngg_manage_images_number_of_columns', array( &$this, 'nggCountColumns' ) );
110
- add_filter( 'ngg_manage_images_column_7_header', array( &$this, 'nggColumnHeader' ) );
111
- add_filter( 'ngg_manage_images_column_7_content', array( &$this, 'nggColumnContent' ) );
112
- // hook on the NextGen gallery list update
113
- add_action('ngg_update_addgallery_page', array( &$this, 'addNextGenGalleriesToCustom'));
114
- }
115
-
116
  // integration with WP/LR Sync plugin
117
  add_action( 'wplr_update_media', array( &$this, 'onWpLrUpdateMedia' ), 10, 2);
118
 
@@ -168,7 +158,7 @@ class WPShortPixel {
168
  //dismiss notices
169
 
170
  // deprecated - dismissAdminNotice should not be called no longer.
171
- // add_action( 'wp_ajax_shortpixel_dismiss_notice', array(&$this, 'dismissAdminNotice'));
172
  add_action( 'wp_ajax_shortpixel_dismiss_media_alert', array($this, 'dismissMediaAlert'));
173
  add_action( 'wp_ajax_shortpixel_dismissFileError', array($this, 'dismissFileError'));
174
 
@@ -311,7 +301,7 @@ class WPShortPixel {
311
  } */
312
  }
313
 
314
- /* Deprecated in favor of NoticeController.
315
  public function dismissAdminNotice() {
316
  $noticeId = preg_replace('|[^a-z0-9]|i', '', $_GET['notice_id']);
317
  $dismissed = $this->_settings->dismissedNotices ? $this->_settings->dismissedNotices : array();
@@ -323,9 +313,6 @@ class WPShortPixel {
323
  die(json_encode(array("Status" => 'success', "Message" => 'Notice ID: ' . $noticeId . ' dismissed')));
324
  }
325
 
326
-
327
- */
328
-
329
  // This probably displays an alert when requesting the user to switch from grid to list in media library
330
  public function dismissMediaAlert() {
331
  $this->_settings->mediaAlert = 1;
@@ -829,7 +816,7 @@ class WPShortPixel {
829
  * this is hooked onto the NextGen upload
830
  * @param type $image
831
  */
832
- public function handleNextGenImageUpload($image)
833
  {
834
  if ($this->_settings->includeNextGen == 1) {
835
  $imageFsPath = ShortPixelNextGenAdapter::getImageAbspath($image);
@@ -853,9 +840,9 @@ class WPShortPixel {
853
 
854
  return $this->addPathToCustomFolder($imageFsPath, $folderId, $image->pid);
855
  }
856
- }
857
 
858
- protected function addPathToCustomFolder($imageFsPath, $folderId, $pid) {
859
  //prevent adding it multiple times if the action is called repeatedly (Gravity Forms does that)
860
  $existing = $this->spMetaDao->getMetaForPath($imageFsPath);
861
  if($existing) {
@@ -1280,14 +1267,12 @@ class WPShortPixel {
1280
  }
1281
 
1282
  $customIds = $this->spMetaDao->getPendingMetas( SHORTPIXEL_PRESEND_ITEMS - count($ids));
 
1283
  if(is_array($customIds)) {
1284
  $ids = array_merge($ids, array_map(array('ShortPixelMetaFacade', 'getNewFromRow'), $customIds));
1285
  }
1286
  }
1287
- //var_dump($ids);
1288
- //die("za stop 2");
1289
 
1290
- //self::log("HIP: 1 Ids: ".json_encode($ids));
1291
  if(count($ids)) {$idl='';foreach($ids as $i){$idl.=$i->getId().' ';}
1292
  Log::addInfo("HIP: 1 Selected IDs: $idl");}
1293
 
@@ -1306,6 +1291,7 @@ class WPShortPixel {
1306
  $itemHandler = $ids[$i];
1307
  $firstUrlAndPaths = $URLsAndPATHs;
1308
  }
 
1309
  } catch(Exception $e) { // Exception("Post metadata is corrupt (No attachment URL)") or Exception("Image files are missing.")
1310
  if($tmpMeta->getStatus() != 2) {
1311
  $crtItemHandler->incrementRetries(1, ($e->getCode() < 0 ? $e->getCode() : ShortPixelAPI::ERR_FILE_NOT_FOUND), $e->getMessage());
@@ -1493,6 +1479,13 @@ class WPShortPixel {
1493
  //put this one in the failed images list - to show the user at the end
1494
  $prio = $this->prioQ->addToFailed($itemHandler->getQueuedId());
1495
  }
 
 
 
 
 
 
 
1496
  self::log("HIP RES: skipping $itemId");
1497
  $this->advanceBulk($meta->getId());
1498
  if($itemHandler->getType() == ShortPixelMetaFacade::CUSTOM_TYPE) {
@@ -1901,13 +1894,14 @@ class WPShortPixel {
1901
  * @param int $ID image_id
1902
  * @param string $result - Error String
1903
  */
 
1904
  public function handleError($ID, $result)
1905
  {
1906
  $meta = wp_get_attachment_metadata($ID);
1907
  $meta['ShortPixelImprovement'] = $result;
1908
  //wp_update_attachment_metadata($ID, $meta);
1909
  update_post_meta($ID, '_wp_attachment_metadata', $meta);
1910
- }
1911
 
1912
  /* Gets backup folder of file. This backup must exist already, or false is given.
1913
  * @param string $file Filepath - probably ( or directory )
@@ -2762,6 +2756,7 @@ class WPShortPixel {
2762
  /** View for Custom media
2763
  * @todo Move this to own view.
2764
  */
 
2765
  public function listCustomMedia() {
2766
  if( ! class_exists( 'ShortPixelListTable' ) ) {
2767
  require_once('view/shortpixel-list-table.php');
@@ -2775,7 +2770,7 @@ class WPShortPixel {
2775
  $this->prioQ->push(ShortPixelMetaFacade::queuedId(ShortPixelMetaFacade::CUSTOM_TYPE, $_REQUEST['image']));
2776
  }
2777
 
2778
- $customMediaListTable = new ShortPixelListTable($this, $this->spMetaDao, $this->hasNextGen);
2779
  $items = $customMediaListTable->prepare_items();
2780
  if ( isset($_GET['noheader']) ) {
2781
  require_once(ABSPATH . 'wp-admin/admin-header.php');
@@ -2821,25 +2816,26 @@ class WPShortPixel {
2821
  </div> <?php
2822
  }
2823
 
 
2824
  /** Front End function that controls bulk processes.
2825
  * TODO This is a Bulk controller
2826
  */
2827
  public function bulkProcess() {
2828
  global $wpdb;
2829
 
2830
-
2831
  if( $this->_settings->verifiedKey == false ) {//invalid API Key
2832
  //ShortPixelView::displayActivationNotice();
2833
  return;
2834
  }
2835
 
2836
  $quotaData = $this->checkQuotaAndAlert(null, isset($_GET['checkquota']), 0);
2837
- //if($this->_settings->quotaExceeded != 0) {
 
 
2838
  //return;
2839
  //}
2840
 
2841
 
2842
-
2843
  if(isset($_POST['bulkProcessPause']))
2844
  {//pause an ongoing bulk processing, it might be needed sometimes
2845
  $this->prioQ->pauseBulk();
@@ -3191,6 +3187,8 @@ class WPShortPixel {
3191
  if($validityData['APIKeyValid']) {
3192
  $this->_settings->apiKey = $key;
3193
  $this->_settings->verifiedKey = true;
 
 
3194
  }
3195
  }
3196
  die(json_encode($body));
@@ -3394,32 +3392,6 @@ class WPShortPixel {
3394
  }
3395
  }
3396
 
3397
-
3398
-
3399
- /** Adds NextGenGalleries to Custom Images Library
3400
- * @param boolean $silent Will not return messages if silent
3401
- * @return array Array for information
3402
- * @todo Move to a integration class || This can be removed after nextgen.php in externals is released.
3403
- */
3404
- public function addNextGenGalleriesToCustom($silent) {
3405
- $customFolders = array();
3406
- $folderMsg = "";
3407
- if($this->_settings->includeNextGen) {
3408
- //add the NextGen galleries to custom folders
3409
- $ngGalleries = ShortPixelNextGenAdapter::getGalleries();
3410
- foreach($ngGalleries as $gallery) {
3411
- $msg = $this->spMetaDao->newFolderFromPath($gallery, get_home_path(), self::getCustomFolderBase());
3412
- if($msg) { //try again with ABSPATH as maybe WP is in a subdir
3413
- $msg = $this->spMetaDao->newFolderFromPath($gallery, ABSPATH, self::getCustomFolderBase());
3414
- }
3415
- $folderMsg .= $msg;
3416
- $this->_settings->hasCustomFolders = time();
3417
- }
3418
- $customFolders = $this->spMetaDao->getFolders();
3419
- }
3420
- return array("message" => $silent? "" : $folderMsg, "customFolders" => $customFolders);
3421
- }
3422
-
3423
  /** Gets the average compression
3424
  * @return int Average compressions percentage
3425
  * @todo Move to utility (?)
@@ -3986,57 +3958,8 @@ class WPShortPixel {
3986
  return $defaults;
3987
  }
3988
 
3989
- // @todo move NGG specific function to own integration
3990
- public function nggColumns( $defaults ) {
3991
- $this->nggColumnIndex = count($defaults) + 1;
3992
- add_filter( 'ngg_manage_images_column_' . $this->nggColumnIndex . '_header', array( &$this, 'nggColumnHeader' ) );
3993
- add_filter( 'ngg_manage_images_column_' . $this->nggColumnIndex . '_content', array( &$this, 'nggColumnContent' ), 10, 2 );
3994
- $defaults['wp-shortPixelNgg'] = 'ShortPixel Compression';
3995
- return $defaults;
3996
- }
3997
-
3998
- public function nggCountColumns( $count ) {
3999
- return $count + 1;
4000
- }
4001
 
4002
- public function nggColumnHeader( $default ) {
4003
- return __('ShortPixel Compression','shortpixel-image-optimiser');
4004
- }
4005
 
4006
- public function nggColumnContent( $unknown, $picture ) {
4007
-
4008
- $meta = $this->spMetaDao->getMetaForPath($picture->imagePath);
4009
- if($meta) {
4010
- switch($meta->getStatus()) {
4011
- case "0": echo("<div id='sp-msg-C-{$meta->getId()}' class='column-wp-shortPixel' style='color: #928B1E'>Waiting</div>"); break;
4012
- case "1": echo("<div id='sp-msg-C-{$meta->getId()}' class='column-wp-shortPixel' style='color: #1919E2'>Pending</div>"); break;
4013
- case "2": $this->view->renderCustomColumn("C-" . $meta->getId(), array(
4014
- 'showActions' => false && current_user_can( 'manage_options' ),
4015
- 'status' => 'imgOptimized',
4016
- 'type' => ShortPixelAPI::getCompressionTypeName($meta->getCompressionType()),
4017
- 'percent' => $meta->getImprovementPercent(),
4018
- 'bonus' => $meta->getImprovementPercent() < 5,
4019
- 'thumbsOpt' => 0,
4020
- 'thumbsOptList' => array(),
4021
- 'thumbsTotal' => 0,
4022
- 'retinasOpt' => 0,
4023
- 'backup' => true
4024
- ));
4025
- break;
4026
- }
4027
- } else {
4028
- $this->view->renderCustomColumn($meta ? "C-" . $meta->getId() : "N-" . $picture->pid, array(
4029
- 'showActions' => false && current_user_can( 'manage_options' ),
4030
- 'status' => 'optimizeNow',
4031
- 'thumbsOpt' => 0,
4032
- 'thumbsOptList' => array(),
4033
- 'thumbsTotal' => 0,
4034
- 'retinasOpt' => 0,
4035
- 'message' => "Not optimized"
4036
- ));
4037
- }
4038
- // return var_dump($meta);
4039
- }
4040
 
4041
  public function generatePluginLinks($links) {
4042
  $in = '<a href="options-general.php?page=wp-shortpixel-settings">Settings</a>';
@@ -4548,15 +4471,15 @@ class WPShortPixel {
4548
  // : (defined("SHORTPIXEL_AFFILIATE_CODE") && strlen(SHORTPIXEL_AFFILIATE_CODE) ? "/affiliate/" . SHORTPIXEL_AFFILIATE_CODE : "");
4549
  return "";
4550
  }
 
 
4551
  public function getVerifiedKey() {
4552
  return $this->_settings->verifiedKey;
4553
  }
4554
  public function getCompressionType() {
4555
  return $this->_settings->compressionType;
4556
  }
4557
- public function hasNextGen() {
4558
- return $this->hasNextGen;
4559
- }
4560
 
4561
  public function getSpMetaDao() {
4562
  return $this->spMetaDao;
16
  private $view = null;
17
  private $thumbnailsRegenerating = array();
18
 
19
+ // private $hasNextGen = false;
20
  private $spMetaDao = null;
21
 
22
  private $jsSuffix = '.min.js';
42
  $this->_settings = new WPShortPixelSettings();
43
  $this->_apiInterface = new ShortPixelAPI($this->_settings);
44
  // $this->cloudflareApi = new ShortPixelCloudFlareApi($this->_settings->cloudflareEmail, $this->_settings->cloudflareAuthKey, $this->_settings->cloudflareZoneID);
45
+ // $this->hasNextGen = wpSPIO()->env()->has_nextgen; //ShortPixelNextGenAdapter::hasNextGen();
46
  $this->spMetaDao = new ShortPixelCustomMetaDao(new WpShortPixelDb(), $this->_settings->excludePatterns);
47
  $this->prioQ = (! defined('SHORTPIXEL_NOFLOCK')) ? new ShortPixelQueue($this, $this->_settings) : new ShortPixelQueueDB($this, $this->_settings);
48
  $this->view = new ShortPixelView($this);
103
 
104
  add_action('mime_types', array($this, 'addWebpMime'));
105
 
 
 
 
 
 
 
 
 
 
 
106
  // integration with WP/LR Sync plugin
107
  add_action( 'wplr_update_media', array( &$this, 'onWpLrUpdateMedia' ), 10, 2);
108
 
158
  //dismiss notices
159
 
160
  // deprecated - dismissAdminNotice should not be called no longer.
161
+ add_action( 'wp_ajax_shortpixel_dismiss_notice', array(&$this, 'dismissAdminNotice'));
162
  add_action( 'wp_ajax_shortpixel_dismiss_media_alert', array($this, 'dismissMediaAlert'));
163
  add_action( 'wp_ajax_shortpixel_dismissFileError', array($this, 'dismissFileError'));
164
 
301
  } */
302
  }
303
 
304
+ /* Deprecated in favor of NoticeController. @todo Must go, sadly still in use. */
305
  public function dismissAdminNotice() {
306
  $noticeId = preg_replace('|[^a-z0-9]|i', '', $_GET['notice_id']);
307
  $dismissed = $this->_settings->dismissedNotices ? $this->_settings->dismissedNotices : array();
313
  die(json_encode(array("Status" => 'success', "Message" => 'Notice ID: ' . $noticeId . ' dismissed')));
314
  }
315
 
 
 
 
316
  // This probably displays an alert when requesting the user to switch from grid to list in media library
317
  public function dismissMediaAlert() {
318
  $this->_settings->mediaAlert = 1;
816
  * this is hooked onto the NextGen upload
817
  * @param type $image
818
  */
819
+ /* public function handleNextGenImageUpload($image)
820
  {
821
  if ($this->_settings->includeNextGen == 1) {
822
  $imageFsPath = ShortPixelNextGenAdapter::getImageAbspath($image);
840
 
841
  return $this->addPathToCustomFolder($imageFsPath, $folderId, $image->pid);
842
  }
843
+ } */
844
 
845
+ public function addPathToCustomFolder($imageFsPath, $folderId, $pid) {
846
  //prevent adding it multiple times if the action is called repeatedly (Gravity Forms does that)
847
  $existing = $this->spMetaDao->getMetaForPath($imageFsPath);
848
  if($existing) {
1267
  }
1268
 
1269
  $customIds = $this->spMetaDao->getPendingMetas( SHORTPIXEL_PRESEND_ITEMS - count($ids));
1270
+
1271
  if(is_array($customIds)) {
1272
  $ids = array_merge($ids, array_map(array('ShortPixelMetaFacade', 'getNewFromRow'), $customIds));
1273
  }
1274
  }
 
 
1275
 
 
1276
  if(count($ids)) {$idl='';foreach($ids as $i){$idl.=$i->getId().' ';}
1277
  Log::addInfo("HIP: 1 Selected IDs: $idl");}
1278
 
1291
  $itemHandler = $ids[$i];
1292
  $firstUrlAndPaths = $URLsAndPATHs;
1293
  }
1294
+ /* @todo This catch will never hit. See sendToProcessing. Any ApiRequest is caught this. This was added because in other places errors would occur */
1295
  } catch(Exception $e) { // Exception("Post metadata is corrupt (No attachment URL)") or Exception("Image files are missing.")
1296
  if($tmpMeta->getStatus() != 2) {
1297
  $crtItemHandler->incrementRetries(1, ($e->getCode() < 0 ? $e->getCode() : ShortPixelAPI::ERR_FILE_NOT_FOUND), $e->getMessage());
1479
  //put this one in the failed images list - to show the user at the end
1480
  $prio = $this->prioQ->addToFailed($itemHandler->getQueuedId());
1481
  }
1482
+ //** @todo Provisory code, testing */
1483
+ if(isset($result['Code'])) {
1484
+ $itemHandler->incrementRetries(1, $result['Code'], $result["Message"]);
1485
+ } else {
1486
+ $itemHandler->incrementRetries(1, ShortPixelAPI::ERR_UNKNOWN, "Connection error (" . $result["Message"] . ")" );
1487
+ }
1488
+
1489
  self::log("HIP RES: skipping $itemId");
1490
  $this->advanceBulk($meta->getId());
1491
  if($itemHandler->getType() == ShortPixelMetaFacade::CUSTOM_TYPE) {
1894
  * @param int $ID image_id
1895
  * @param string $result - Error String
1896
  */
1897
+ /* Seems not in use
1898
  public function handleError($ID, $result)
1899
  {
1900
  $meta = wp_get_attachment_metadata($ID);
1901
  $meta['ShortPixelImprovement'] = $result;
1902
  //wp_update_attachment_metadata($ID, $meta);
1903
  update_post_meta($ID, '_wp_attachment_metadata', $meta);
1904
+ } */
1905
 
1906
  /* Gets backup folder of file. This backup must exist already, or false is given.
1907
  * @param string $file Filepath - probably ( or directory )
2756
  /** View for Custom media
2757
  * @todo Move this to own view.
2758
  */
2759
+ /* Gone! @todo Must go when new ListCMedia is done */
2760
  public function listCustomMedia() {
2761
  if( ! class_exists( 'ShortPixelListTable' ) ) {
2762
  require_once('view/shortpixel-list-table.php');
2770
  $this->prioQ->push(ShortPixelMetaFacade::queuedId(ShortPixelMetaFacade::CUSTOM_TYPE, $_REQUEST['image']));
2771
  }
2772
 
2773
+ $customMediaListTable = new ShortPixelListTable($this, $this->spMetaDao, \wpSPIO()->env()->has_nextgen);
2774
  $items = $customMediaListTable->prepare_items();
2775
  if ( isset($_GET['noheader']) ) {
2776
  require_once(ABSPATH . 'wp-admin/admin-header.php');
2816
  </div> <?php
2817
  }
2818
 
2819
+
2820
  /** Front End function that controls bulk processes.
2821
  * TODO This is a Bulk controller
2822
  */
2823
  public function bulkProcess() {
2824
  global $wpdb;
2825
 
 
2826
  if( $this->_settings->verifiedKey == false ) {//invalid API Key
2827
  //ShortPixelView::displayActivationNotice();
2828
  return;
2829
  }
2830
 
2831
  $quotaData = $this->checkQuotaAndAlert(null, isset($_GET['checkquota']), 0);
2832
+ if($this->_settings->quotaExceeded == 1) {
2833
+ \ShortPixel\adminNoticesController::reInstateQuotaExceeded();
2834
+ }
2835
  //return;
2836
  //}
2837
 
2838
 
 
2839
  if(isset($_POST['bulkProcessPause']))
2840
  {//pause an ongoing bulk processing, it might be needed sometimes
2841
  $this->prioQ->pauseBulk();
3187
  if($validityData['APIKeyValid']) {
3188
  $this->_settings->apiKey = $key;
3189
  $this->_settings->verifiedKey = true;
3190
+ \ShortPixel\adminNoticesController::resetAPINotices();
3191
+ Notices::addSuccess(__('Great, you successfully claimed your API Key! Please take a few moments to review the plugin settings below before starting to optimize your images.','shortpixel-image-optimiser'));
3192
  }
3193
  }
3194
  die(json_encode($body));
3392
  }
3393
  }
3394
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3395
  /** Gets the average compression
3396
  * @return int Average compressions percentage
3397
  * @todo Move to utility (?)
3958
  return $defaults;
3959
  }
3960
 
 
 
 
 
 
 
 
 
 
 
 
 
3961
 
 
 
 
3962
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3963
 
3964
  public function generatePluginLinks($links) {
3965
  $in = '<a href="options-general.php?page=wp-shortpixel-settings">Settings</a>';
4471
  // : (defined("SHORTPIXEL_AFFILIATE_CODE") && strlen(SHORTPIXEL_AFFILIATE_CODE) ? "/affiliate/" . SHORTPIXEL_AFFILIATE_CODE : "");
4472
  return "";
4473
  }
4474
+
4475
+ /** @todo Deprecate in favor of apikeyModel */
4476
  public function getVerifiedKey() {
4477
  return $this->_settings->verifiedKey;
4478
  }
4479
  public function getCompressionType() {
4480
  return $this->_settings->compressionType;
4481
  }
4482
+
 
 
4483
 
4484
  public function getSpMetaDao() {
4485
  return $this->spMetaDao;
readme.txt CHANGED
@@ -4,7 +4,7 @@ Tags: compressor, image, compression, optimize, image optimizer, image optimiser
4
  Requires at least: 3.2.0
5
  Tested up to: 5.3
6
  Requires PHP: 5.3
7
- Stable tag: 4.16.0
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
@@ -264,9 +264,18 @@ define('SHORTPIXEL_CFZONE', 'The Zone ID from the domain settings in Cloudflare'
264
 
265
  == Changelog ==
266
 
 
 
 
 
 
 
 
 
267
 
268
  = 4.16.0 =
269
 
 
270
  * New - Token support for Cloudflare via config constant or settings.
271
  * Backup setting - add orange warning when backups are off.
272
  * Button to dismiss the top bar notification of missing files.
4
  Requires at least: 3.2.0
5
  Tested up to: 5.3
6
  Requires PHP: 5.3
7
+ Stable tag: 4.16.1
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
264
 
265
  == Changelog ==
266
 
267
+ = 4.16.1 =
268
+
269
+ Release date: 14th February 2020
270
+ * Fix non-dismissable alerts.
271
+ * Reference to the Website Speed Optimization service.
272
+ * Fixed: deleteItemCache in wrong place ( before save ) thus resetting data
273
+ * Fixed: NextGen integration
274
+ * Language – 3 new strings added, 0 updated, 0 fuzzied, and 0 obsoleted
275
 
276
  = 4.16.0 =
277
 
278
+ Release date: 4th February 2020
279
  * New - Token support for Cloudflare via config constant or settings.
280
  * Backup setting - add orange warning when backups are off.
281
  * Button to dismiss the top bar notification of missing files.
res/css/shortpixel-admin.css CHANGED
@@ -36,6 +36,9 @@
36
  max-width: 70%; }
37
  #shortpixel-settings-tabs #tab-adv-settings .addCustomFolder input[name="saveAdv"] {
38
  margin-left: 8px; }
 
 
 
39
 
40
  .cf_switch label {
41
  width: 100%;
36
  max-width: 70%; }
37
  #shortpixel-settings-tabs #tab-adv-settings .addCustomFolder input[name="saveAdv"] {
38
  margin-left: 8px; }
39
+ #shortpixel-settings-tabs #tab-adv-settings .shortpixel-folders-list th {
40
+ width: auto;
41
+ padding: 12px 16px 12px 12px; }
42
 
43
  .cf_switch label {
44
  width: 100%;
res/img/robo-winky.png ADDED
Binary file
res/img/robo-winky@2x.png ADDED
Binary file
res/js/shortpixel.js CHANGED
@@ -680,6 +680,7 @@ var ShortPixel = function() {
680
 
681
  function recheckQuota() {
682
  var parts = window.location.href.split('#');
 
683
  window.location.href=parts[0]+(parts[0].indexOf('?')>0?'&':'?')+'checkquota=1' + (typeof parts[1] === 'undefined' ? '' : '#' + parts[1]);
684
  }
685
 
@@ -876,7 +877,7 @@ function showToolBarAlert($status, $message, id) {
876
  case ShortPixel.STATUS_QUOTA_EXCEEDED:
877
  if( window.location.href.search("wp-short-pixel-bulk") > 0
878
  && jQuery(".sp-quota-exceeded-alert").length == 0) { //if we're in bulk and the alert is not displayed reload to see all options
879
- location.reload();
880
  return;
881
  }
882
  robo.addClass("shortpixel-alert");
@@ -1074,6 +1075,7 @@ function checkBulkProcessingCallApi(){
1074
  jQuery("a.bulk-cancel").attr("disabled", "disabled");
1075
  hideSlider();
1076
  //showStats();
 
1077
  setTimeout(function(){
1078
  window.location.reload();
1079
  }, 3000);
@@ -1297,7 +1299,7 @@ function dismissShortPixelNoticeExceed(e) {
1297
  e.preventDefault();
1298
  } */
1299
 
1300
- /*
1301
  function dismissShortPixelNotice(id) {
1302
  jQuery("#short-pixel-notice-" + id).hide();
1303
  var data = { action : 'shortpixel_dismiss_notice',
@@ -1308,7 +1310,7 @@ function dismissShortPixelNotice(id) {
1308
  console.log("dismissed");
1309
  }
1310
  });
1311
- } */
1312
 
1313
  function dismissFileError() {
1314
  jQuery('.shortpixel-alert').hide();
680
 
681
  function recheckQuota() {
682
  var parts = window.location.href.split('#');
683
+
684
  window.location.href=parts[0]+(parts[0].indexOf('?')>0?'&':'?')+'checkquota=1' + (typeof parts[1] === 'undefined' ? '' : '#' + parts[1]);
685
  }
686
 
877
  case ShortPixel.STATUS_QUOTA_EXCEEDED:
878
  if( window.location.href.search("wp-short-pixel-bulk") > 0
879
  && jQuery(".sp-quota-exceeded-alert").length == 0) { //if we're in bulk and the alert is not displayed reload to see all options
880
+ // location.reload();
881
  return;
882
  }
883
  robo.addClass("shortpixel-alert");
1075
  jQuery("a.bulk-cancel").attr("disabled", "disabled");
1076
  hideSlider();
1077
  //showStats();
1078
+
1079
  setTimeout(function(){
1080
  window.location.reload();
1081
  }, 3000);
1299
  e.preventDefault();
1300
  } */
1301
 
1302
+ /* @todo Must go, still in use in some parts */
1303
  function dismissShortPixelNotice(id) {
1304
  jQuery("#short-pixel-notice-" + id).hide();
1305
  var data = { action : 'shortpixel_dismiss_notice',
1310
  console.log("dismissed");
1311
  }
1312
  });
1313
+ }
1314
 
1315
  function dismissFileError() {
1316
  jQuery('.shortpixel-alert').hide();
res/js/shortpixel.min.js CHANGED
@@ -1 +1 @@
1
- function showToolBarAlert(e,r,t){var s=jQuery("li.shortpixel-toolbar-processing");switch(e){case ShortPixel.STATUS_QUOTA_EXCEEDED:if(window.location.href.search("wp-short-pixel-bulk")>0&&0==jQuery(".sp-quota-exceeded-alert").length)return void location.reload();s.addClass("shortpixel-alert"),s.addClass("shortpixel-quota-exceeded"),jQuery("a",s).attr("href","options-general.php?page=wp-shortpixel-settings"),jQuery("a div",s).attr("title","ShortPixel quota exceeded. Click for details.");break;case ShortPixel.STATUS_SKIP:case ShortPixel.STATUS_FAIL:s.addClass("shortpixel-alert shortpixel-processing"),jQuery("a div",s).attr("title",r),void 0!==t&&jQuery("a",s).attr("href","post.php?post="+t+"&action=edit");break;case ShortPixel.STATUS_NO_KEY:s.addClass("shortpixel-alert"),s.addClass("shortpixel-quota-exceeded"),jQuery("a",s).attr("href","options-general.php?page=wp-shortpixel-settings"),jQuery("a div",s).attr("title","Get API Key");break;case ShortPixel.STATUS_SUCCESS:case ShortPixel.STATUS_RETRY:s.addClass("shortpixel-processing"),s.removeClass("shortpixel-alert"),jQuery("a",s).removeAttr("target"),jQuery("a",s).attr("href",jQuery("a img",s).attr("success-url"))}s.removeClass("shortpixel-hide")}function hideToolBarAlert(e){var r=jQuery("li.shortpixel-toolbar-processing.shortpixel-processing");ShortPixel.STATUS_EMPTY_QUEUE==e&&(r.hasClass("shortpixel-alert")||r.hasClass("shortpixel-quota-exceeded"))||r.addClass("shortpixel-hide")}function hideQuotaExceededToolBarAlert(){jQuery("li.shortpixel-toolbar-processing.shortpixel-quota-exceeded").addClass("shortpixel-hide")}function checkQuotaExceededAlert(){"undefined"!=typeof shortPixelQuotaExceeded&&(1==shortPixelQuotaExceeded?showToolBarAlert(ShortPixel.STATUS_QUOTA_EXCEEDED):hideQuotaExceededToolBarAlert())}function checkBulkProgress(){var e=function(e){return r?"/":(r=!0,e)},r=!1,t=window.location.href.toLowerCase().replace(/\/\//g,e);r=!1;var s=ShortPixel.WP_ADMIN_URL.toLowerCase().replace(/\/\//g,e);t.search(s)<0&&(t=ShortPixel.convertPunycode(t),s=ShortPixel.convertPunycode(s)),1==ShortPixel.bulkProcessor&&window.location.href.search("wp-short-pixel-bulk")<0&&void 0!==localStorage.bulkPage&&localStorage.bulkPage>0&&(ShortPixel.bulkProcessor=!1),window.location.href.search("wp-short-pixel-bulk")>=0&&(ShortPixel.bulkProcessor=!0,localStorage.bulkTime=Math.floor(Date.now()/1e3),localStorage.bulkPage=1),1==ShortPixel.bulkProcessor||void 0===localStorage.bulkTime||Math.floor(Date.now()/1e3)-localStorage.bulkTime>90?(ShortPixel.bulkProcessor=!0,localStorage.bulkPage=window.location.href.search("wp-short-pixel-bulk")>=0?1:0,localStorage.bulkTime=Math.floor(Date.now()/1e3),console.log(localStorage.bulkTime),checkBulkProcessingCallApi()):setTimeout(checkBulkProgress,5e3)}function checkBulkProcessingCallApi(){jQuery.ajax({type:"POST",url:ShortPixel.AJAX_URL,data:{action:"shortpixel_image_processing"},success:function(e){if(e.length>0){r=null;try{var r=JSON.parse(e)}catch(e){return void ShortPixel.retry(e.message)}ShortPixel.retries=0;var t=r.ImageID,s=jQuery("div.short-pixel-bulk-page").length>0;switch(r.Status&&r.Status!=ShortPixel.STATUS_SEARCHING&&(ShortPixel.returnedStatusSearching>=2&&jQuery(".bulk-notice-msg.bulk-searching").hide(),ShortPixel.returnedStatusSearching=0),r.Status){case ShortPixel.STATUS_NO_KEY:setCellMessage(t,r.Message,"<a class='button button-smaller button-primary' href=\"https://shortpixel.com/wp-apikey"+ShortPixel.AFFILIATE+'" target="_blank">'+_spTr.getApiKey+"</a>"),showToolBarAlert(ShortPixel.STATUS_NO_KEY);break;case ShortPixel.STATUS_QUOTA_EXCEEDED:setCellMessage(t,r.Message,"<a class='button button-smaller button-primary' href=\"https://shortpixel.com/login/"+ShortPixel.API_KEY+'" target="_blank">'+_spTr.extendQuota+"</a><a class='button button-smaller' href='admin.php?action=shortpixel_check_quota'>"+_spTr.check__Quota+"</a>"),showToolBarAlert(ShortPixel.STATUS_QUOTA_EXCEEDED),0==r.Stop&&setTimeout(checkBulkProgress,5e3),ShortPixel.otherMediaUpdateActions(t,["quota","view"]);break;case ShortPixel.STATUS_FAIL:setCellMessage(t,r.Message,"<a class='button button-smaller button-primary' href=\"javascript:manualOptimization('"+t+"', true)\">"+_spTr.retry+"</a>"),showToolBarAlert(ShortPixel.STATUS_FAIL,r.Message,t),s&&(ShortPixel.bulkShowError(t,r.Message,r.Filename,r.CustomImageLink),r.BulkPercent&&progressUpdate(r.BulkPercent,r.BulkMsg),ShortPixel.otherMediaUpdateActions(t,["retry","view"])),console.log(r.Message),setTimeout(checkBulkProgress,5e3);break;case ShortPixel.STATUS_EMPTY_QUEUE:console.log(r.Message),clearBulkProcessor(),hideToolBarAlert(r.Status);var o=jQuery("#bulk-progress");s&&o.length&&"2"!=r.BulkStatus&&(progressUpdate(100,"Bulk finished!"),jQuery("a.bulk-cancel").attr("disabled","disabled"),hideSlider(),setTimeout(function(){window.location.reload()},3e3));break;case ShortPixel.STATUS_SUCCESS:s&&(ShortPixel.bulkHideLengthyMsg(),ShortPixel.bulkHideMaintenanceMsg());var i=r.PercentImprovement;showToolBarAlert(ShortPixel.STATUS_SUCCESS,"");var a=ShortPixel.isCustomImageId(t)?"":ShortPixel.successActions(t,r.Type,r.ThumbsCount,r.ThumbsTotal,r.BackupEnabled,r.Filename);setCellMessage(t,ShortPixel.successMsg(t,i,r.Type,r.ThumbsCount,r.RetinasCount),a),jQuery("#post-"+t).length>0&&jQuery("#post-"+t).find(".filename").text(r.Filename),jQuery(".misc-pub-filename strong").length>0&&jQuery(".misc-pub-filename strong").text(r.Filename),ShortPixel.isCustomImageId(t)&&r.TsOptimized&&r.TsOptimized.length>0&&(console.log(t),jQuery(".date-"+t).text(r.TsOptimized));var l=jQuery(["restore","view","redolossy","redoglossy","redolossless"]).not(["redo"+r.Type]).get();ShortPixel.otherMediaUpdateActions(t,l);new PercentageAnimator("#sp-msg-"+t+" span.percent",i).animate(i),s&&void 0!==r.Thumb&&(r.BulkPercent&&progressUpdate(r.BulkPercent,r.BulkMsg),r.Thumb.length>0&&(sliderUpdate(t,r.Thumb,r.BkThumb,r.PercentImprovement,r.Filename),void 0!==r.AverageCompression&&0+r.AverageCompression>0&&(jQuery("#sp-avg-optimization").html('<input type="text" class="dial" value="'+Math.round(r.AverageCompression)+'"/>'),ShortPixel.percentDial("#sp-avg-optimization .dial",60)))),console.log("Server response: "+e),s&&void 0!==r.BulkPercent&&progressUpdate(r.BulkPercent,r.BulkMsg),setTimeout(checkBulkProgress,5e3);break;case ShortPixel.STATUS_SKIP:1!==r.Silent&&ShortPixel.bulkShowError(t,r.Message,r.Filename,r.CustomImageLink);case ShortPixel.STATUS_ERROR:void 0!==r.Message&&(showToolBarAlert(ShortPixel.STATUS_SKIP,r.Message+" Image ID: "+t),setCellMessage(t,r.Message,"")),ShortPixel.otherMediaUpdateActions(t,["retry","view"]);case ShortPixel.STATUS_RETRY:console.log("Server response: "+e),showToolBarAlert(ShortPixel.STATUS_RETRY,""),s&&void 0!==r.BulkPercent&&progressUpdate(r.BulkPercent,r.BulkMsg),s&&r.Count>3&&ShortPixel.bulkShowLengthyMsg(t,r.Filename,r.CustomImageLink),setTimeout(checkBulkProgress,5e3);break;case ShortPixel.STATUS_SEARCHING:console.log("Server response: "+e),ShortPixel.returnedStatusSearching++,ShortPixel.returnedStatusSearching>=2&&jQuery(".bulk-notice-msg.bulk-searching").show(),setTimeout(checkBulkProgress,2500);break;case ShortPixel.STATUS_MAINTENANCE:ShortPixel.bulkShowMaintenanceMsg("maintenance"),setTimeout(checkBulkProgress,6e4);break;case ShortPixel.STATUS_QUEUE_FULL:ShortPixel.bulkShowMaintenanceMsg("queue-full"),setTimeout(checkBulkProgress,6e4);break;default:ShortPixel.retry("Unknown status "+r.Status+". Retrying...")}}},error:function(e){ShortPixel.retry(e.statusText)}})}function clearBulkProcessor(){ShortPixel.bulkProcessor=!1,localStorage.bulkTime=0,window.location.href.search("wp-short-pixel-bulk")>=0&&(localStorage.bulkPage=0)}function setCellMessage(e,r,t){var s=jQuery("#sp-msg-"+e);s.length>0&&(s.html("<div class='sp-column-actions'>"+t+"</div><div class='sp-column-info'>"+r+"</div>"),s.css("color","")),(s=jQuery("#sp-cust-msg-"+e)).length>0&&s.html("<div class='sp-column-info'>"+r+"</div>")}function manualOptimization(e,r){setCellMessage(e,"<img src='"+ShortPixel.WP_PLUGIN_URL+"/res/img/loading.gif' alt='"+_spTr.loading+"' class='sp-loading-small'>Image waiting to be processed",""),jQuery("li.shortpixel-toolbar-processing").removeClass("shortpixel-hide"),jQuery("li.shortpixel-toolbar-processing").removeClass("shortpixel-alert"),jQuery("li.shortpixel-toolbar-processing").addClass("shortpixel-processing");var t={action:"shortpixel_manual_optimization",image_id:e,cleanup:r};jQuery.ajax({type:"GET",url:ShortPixel.AJAX_URL,data:t,success:function(r){var t=JSON.parse(r);t.Status==ShortPixel.STATUS_SUCCESS?setTimeout(checkBulkProgress,2e3):setCellMessage(e,void 0!==t.Message?t.Message:_spTr.thisContentNotProcessable,"")},error:function(r){t.action="shortpixel_check_status",jQuery.ajax({type:"GET",url:ShortPixel.AJAX_URL,data:t,success:function(r){var t=JSON.parse(r);t.Status!==ShortPixel.STATUS_SUCCESS&&setCellMessage(e,void 0!==t.Message?t.Message:_spTr.thisContentNotProcessable,"")}})}})}function reoptimize(e,r){setCellMessage(e,"<img src='"+ShortPixel.WP_PLUGIN_URL+"/res/img/loading.gif' alt='"+_spTr.loading+"' class='sp-loading-small'>Image waiting to be reprocessed",""),jQuery("li.shortpixel-toolbar-processing").removeClass("shortpixel-hide"),jQuery("li.shortpixel-toolbar-processing").addClass("shortpixel-processing");var t={action:"shortpixel_redo",attachment_ID:e,type:r};jQuery.get(ShortPixel.AJAX_URL,t,function(r){(t=JSON.parse(r)).Status==ShortPixel.STATUS_SUCCESS?setTimeout(checkBulkProgress,2e3):($msg=void 0!==t.Message?t.Message:_spTr.thisContentNotProcessable,setCellMessage(e,$msg,""),showToolBarAlert(ShortPixel.STATUS_FAIL,$msg))})}function optimizeThumbs(e){setCellMessage(e,"<img src='"+ShortPixel.WP_PLUGIN_URL+"/res/img/loading.gif' alt='"+_spTr.loading+"' class='sp-loading-small'>"+_spTr.imageWaitOptThumbs,""),jQuery("li.shortpixel-toolbar-processing").removeClass("shortpixel-hide"),jQuery("li.shortpixel-toolbar-processing").addClass("shortpixel-processing");var r={action:"shortpixel_optimize_thumbs",attachment_ID:e};jQuery.get(ShortPixel.AJAX_URL,r,function(t){(r=JSON.parse(t)).Status==ShortPixel.STATUS_SUCCESS?setTimeout(checkBulkProgress,2e3):setCellMessage(e,void 0!==r.Message?r.Message:_spTr.thisContentNotProcessable,"")})}function dismissFileError(){jQuery(".shortpixel-alert").hide();var e={action:"shortpixel_dismissFileError"};jQuery.get(ShortPixel.AJAX_URL,e,function(r){(e=JSON.parse(r)).Status==ShortPixel.STATUS_SUCCESS&&console.log("dismissed")})}function PercentageAnimator(e,r){this.animationSpeed=10,this.increment=2,this.curPercentage=0,this.targetPercentage=r,this.outputSelector=e,this.animate=function(e){this.targetPercentage=e,setTimeout(PercentageTimer.bind(null,this),this.animationSpeed)}}function PercentageTimer(e){e.curPercentage-e.targetPercentage<-e.increment?e.curPercentage+=e.increment:e.curPercentage-e.targetPercentage>e.increment?e.curPercentage-=e.increment:e.curPercentage=e.targetPercentage,jQuery(e.outputSelector).text(e.curPercentage+"%"),e.curPercentage!=e.targetPercentage&&setTimeout(PercentageTimer.bind(null,e),e.animationSpeed)}function progressUpdate(e,r){var t=jQuery("#bulk-progress");t.length&&(jQuery(".progress-left",t).css("width",e+"%"),jQuery(".progress-img",t).css("left",e+"%"),e>24?(jQuery(".progress-img span",t).html(""),jQuery(".progress-left",t).html(e+"%")):(jQuery(".progress-img span",t).html(e+"%"),jQuery(".progress-left",t).html("")),jQuery(".bulk-estimate").html(r))}function sliderUpdate(e,r,t,s,o){var i=jQuery(".bulk-slider div.bulk-slide:first-child");if(0!==i.length){"empty-slide"!=i.attr("id")&&i.hide(),i.css("z-index",1e3),jQuery(".bulk-img-opt",i).attr("src",""),void 0===t&&(t=""),t.length>0&&jQuery(".bulk-img-orig",i).attr("src","");var a=i.clone();a.attr("id","slide-"+e),jQuery(".bulk-img-opt",a).attr("src",r),t.length>0?(jQuery(".img-original",a).css("display","inline-block"),jQuery(".bulk-img-orig",a).attr("src",t)):jQuery(".img-original",a).css("display","none"),jQuery(".bulk-opt-percent",a).html('<input type="text" class="dial" value="'+s+'"/>'),jQuery(".bulk-slider").append(a),ShortPixel.percentDial("#"+a.attr("id")+" .dial",100),jQuery(".bulk-slider-container span.filename").html("&nbsp;&nbsp;"+o),"empty-slide"==i.attr("id")?(i.remove(),jQuery(".bulk-slider-container").css("display","block")):i.animate({left:i.width()+i.position().left},"slow","swing",function(){i.remove(),a.fadeIn("slow")})}}function hideSlider(){jQuery(".bulk-slider-container").css("display","none")}function showStats(){jQuery(".bulk-stats").length}function SPstringFormat(){var e=Array.prototype.slice.call(arguments);if(0!==e.length){var r=e.shift();for(i=0;i<e.length;i++)r=r.replace(new RegExp("\\{"+i+"\\}","gm"),e[i]);return r}}jQuery(document).ready(function(){ShortPixel.init()});var ShortPixel=function(){function e(e){jQuery(e).is(":checked")?jQuery("#width,#height").removeAttr("disabled"):jQuery("#width,#height").attr("disabled","disabled")}function r(){jQuery("#shortpixel-hs-button-blind").remove(),jQuery("#shortpixel-hs-tools").remove(),jQuery("#hs-beacon").remove(),jQuery("#botbutton").remove(),jQuery("#shortpixel-hs-blind").remove()}return jQuery("#key").keypress(function(e){13==e.which&&jQuery("#valid").val("validate")}),{init:function(){void 0===ShortPixel.API_KEY&&(jQuery("table.wp-list-table.media").length>0&&jQuery('select[name^="action"] option:last-child').before('<option value="short-pixel-bulk">'+_spTr.optimizeWithSP+'</option><option value="short-pixel-bulk-lossy"> → '+_spTr.redoLossy+'</option><option value="short-pixel-bulk-glossy"> → '+_spTr.redoGlossy+'</option><option value="short-pixel-bulk-lossless"> → '+_spTr.redoLossless+'</option><option value="short-pixel-bulk-restore"> → '+_spTr.restoreOriginal+"</option>"),ShortPixel.setOptions(ShortPixelConstants[0]),jQuery("#backup-folder-size").length&&jQuery("#backup-folder-size").html(ShortPixel.getBackupSize()),"todo"==ShortPixel.MEDIA_ALERT&&jQuery("div.media-frame.mode-grid").length>0&&jQuery("div.media-frame.mode-grid").before('<div id="short-pixel-media-alert" class="notice notice-warning"><p>'+SPstringFormat(_spTr.changeMLToListMode,'<a href="upload.php?mode=list" class="view-list"><span class="screen-reader-text">'," </span>",'</a><a class="alignright" href="javascript:ShortPixel.dismissMediaAlert();">',"</a>")+"</p></div>"),jQuery(window).on("beforeunload",function(){1==ShortPixel.bulkProcessor&&clearBulkProcessor()}),checkQuotaExceededAlert(),checkBulkProgress())},setOptions:function(e){for(var r in e)ShortPixel[r]=e[r]},isEmailValid:function(e){return/^\w+([\.+-]?\w+)*@\w+([\.-]?\w+)*(\.\w{1,63})+$/.test(e)},updateSignupEmail:function(){var e=jQuery("#pluginemail").val();ShortPixel.isEmailValid(e)&&jQuery("#request_key").removeClass("disabled"),jQuery("#request_key").attr("href",jQuery("#request_key").attr("href").split("?")[0]+"?pluginemail="+e)},validateKey:function(e){jQuery("#valid").val("validate"),jQuery(e).parents("form").submit()},enableResize:e,setupGeneralTab:function(){var r=0;void 0!==document.wp_shortpixel_options&&(r=document.wp_shortpixel_options.compressionType);for(var t=0,s=null;t<r.length;t++)r[t].onclick=function(){this!==s&&(s=this),void 0===ShortPixel.setupGeneralTabAlert&&(alert(_spTr.alertOnlyAppliesToNewImages),ShortPixel.setupGeneralTabAlert=1)};ShortPixel.enableResize("#resize"),jQuery("#resize").change(function(){e(this)}),jQuery(".resize-sizes").blur(function(e){var r=jQuery(e.target);if(ShortPixel.resizeSizesAlert!=r.val()){ShortPixel.resizeSizesAlert=r.val();var t=jQuery("#min-"+r.attr("name")).val(),s=jQuery("#min-"+r.attr("name")).data("nicename");r.val()<Math.min(t,1024)?(t>1024?alert(SPstringFormat(_spTr.pleaseDoNotSetLesser1024,s)):alert(SPstringFormat(_spTr.pleaseDoNotSetLesserSize,s,s,t)),e.preventDefault(),r.focus()):this.defaultValue=r.val()}}),jQuery(".shortpixel-confirm").click(function(e){return!!confirm(e.target.getAttribute("data-confirm"))||(e.preventDefault(),!1)}),jQuery('input[name="removeExif"], input[name="png2jpg"]').on("change",function(){ShortPixel.checkExifWarning()}),ShortPixel.checkExifWarning(),jQuery('input[name="backupImages"]').on("change",function(){ShortPixel.checkBackUpWarning()}),ShortPixel.checkBackUpWarning()},apiKeyChanged:function(){jQuery(".wp-shortpixel-options .shortpixel-key-valid").css("display","none"),jQuery(".wp-shortpixel-options button#validate").css("display","inline-block")},setupAdvancedTab:function(){jQuery("input.remove-folder-button").click(function(){var e=jQuery(this).data("value");1==confirm(SPstringFormat(_spTr.areYouSureStopOptimizing,e))&&(jQuery("#removeFolder").val(e),jQuery("#wp_shortpixel_options").submit())}),jQuery("input.recheck-folder-button").click(function(){var e=jQuery(this).data("value");1==confirm(SPstringFormat(_spTr.areYouSureStopOptimizing,e))&&(jQuery("#recheckFolder").val(e),jQuery("#wp_shortpixel_options").submit())})},checkThumbsUpdTotal:function(e){var r=jQuery("#"+(e.checked?"total":"main")+"ToProcess").val();jQuery("div.bulk-play span.total").text(r),jQuery("#displayTotal").text(r)},initSettings:function(){ShortPixel.adjustSettingsTabs(),ShortPixel.setupGeneralTab(),jQuery(window).resize(function(){ShortPixel.adjustSettingsTabs()}),jQuery("article.sp-tabs a.tab-link").click(function(e){var r=jQuery(e.target).data("id");ShortPixel.switchSettingsTab(r)}),jQuery("input[type=radio][name=deliverWebpType]").change(function(){"deliverWebpAltered"==this.value?window.confirm(_spTr.alertDeliverWebPAltered)?0==jQuery("input[type=radio][name=deliverWebpAlteringType]:checked").length&&jQuery("#deliverWebpAlteredWP").prop("checked",!0):jQuery(this).prop("checked",!1):"deliverWebpUnaltered"==this.value&&window.alert(_spTr.alertDeliverWebPUnaltered)})},switchSettingsTab:function(e){var r=e.replace("tab-",""),t="",s=jQuery("section#"+e);jQuery('input[name="display_part"]').val(r);var o=window.location.href.toString();if(o.indexOf("?")>0){var i=o.substring(0,o.indexOf("?"));i+="?"+jQuery.param({page:"wp-shortpixel-settings",part:r}),window.history.replaceState({},document.title,i)}if(s.length>0&&(jQuery("section").removeClass("sel-tab"),jQuery("section .wp-shortpixel-tab-content").fadeOut(50),jQuery(s).addClass("sel-tab"),ShortPixel.adjustSettingsTabs(),jQuery(s).find(".wp-shortpixel-tab-content").fadeIn(50)),"undefined"!=typeof HS&&void 0!==HS.beacon.suggest){switch(r){case"settings":t=shortpixel_suggestions_settings;break;case"adv-settings":t=shortpixel_suggestions_adv_settings;break;case"cloudflare":case"stats":t=shortpixel_suggestions_cloudflare}HS.beacon.suggest(t)}},adjustSettingsTabs:function(){var e=jQuery("section.sel-tab").height()+90;jQuery(".section-wrapper").css("height",e)},onBulkThumbsCheck:function(e){e.checked?(jQuery("#with-thumbs").css("display","inherit"),jQuery("#without-thumbs").css("display","none")):(jQuery("#without-thumbs").css("display","inherit"),jQuery("#with-thumbs").css("display","none"))},dismissMediaAlert:function(){var e={action:"shortpixel_dismiss_media_alert"};jQuery.get(ShortPixel.AJAX_URL,e,function(r){"success"==(e=JSON.parse(r)).Status&&jQuery("#short-pixel-media-alert").hide()})},closeHelpPane:r,dismissHelpPane:function(){r(),dismissShortPixelNotice("help")},checkQuota:function(){jQuery.get(ShortPixel.AJAX_URL,{action:"shortpixel_check_quota"},function(){console.log("quota refreshed")})},percentDial:function(e,r){jQuery(e).knob({readOnly:!0,width:r,height:r,fgColor:"#1CAECB",format:function(e){return e+"%"}})},successMsg:function(e,r,t,s,o){return(r>0?"<div class='sp-column-info'>"+_spTr.reducedBy+" <strong><span class='percent'>"+r+"%</span></strong> ":"")+(r>0&&r<5?"<br>":"")+(r<5?_spTr.bonusProcessing:"")+(t.length>0?" ("+t+")":"")+(0+s>0?"<br>"+SPstringFormat(_spTr.plusXthumbsOpt,s):"")+(0+o>0?"<br>"+SPstringFormat(_spTr.plusXretinasOpt,o):"")+"</div>"},successActions:function(e,r,t,s,o,i){if(1==o){var a=jQuery(".sp-column-actions-template").clone();if(!a.length)return!1;var l;return l=0==r.length?["lossy","lossless"]:["lossy","glossy","lossless"].filter(function(e){return!(e==r)}),a.html(a.html().replace(/__SP_ID__/g,e)),"pdf"==i.substr(i.lastIndexOf(".")+1).toLowerCase()&&jQuery(".sp-action-compare",a).remove(),0==t&&s>0?a.html(a.html().replace("__SP_THUMBS_TOTAL__",s)):(jQuery(".sp-action-optimize-thumbs",a).remove(),jQuery(".sp-dropbtn",a).removeClass("button-primary")),a.html(a.html().replace(/__SP_FIRST_TYPE__/g,l[0])),a.html(a.html().replace(/__SP_SECOND_TYPE__/g,l[1])),a.html()}return""},otherMediaUpdateActions:function(e,r){if(e=e.substring(2),jQuery(".shortpixel-other-media").length){for(var t=["optimize","retry","restore","redo","quota","view"],s=0,o=t.length;s<o;s++)jQuery("#"+t[s]+"_"+e).css("display","none");for(var s=0,o=r.length;s<o;s++)jQuery("#"+r[s]+"_"+e).css("display","")}},retry:function(e){ShortPixel.retries++,isNaN(ShortPixel.retries)&&(ShortPixel.retries=1),ShortPixel.retries<6?(console.log("Invalid response from server (Error: "+e+"). Retrying pass "+(ShortPixel.retries+1)+"..."),setTimeout(checkBulkProgress,5e3)):(ShortPixel.bulkShowError(-1,"Invalid response from server received 6 times. Please retry later by reloading this page, or <a href='https://shortpixel.com/contact' target='_blank'>contact support</a>. (Error: "+e+")",""),console.log("Invalid response from server 6 times. Giving up."))},initFolderSelector:function(){jQuery(".select-folder-button").click(function(){jQuery(".sp-folder-picker-shade").fadeIn(100),jQuery(".shortpixel-modal.modal-folder-picker").show();var e=jQuery(".sp-folder-picker");e.parent().css("margin-left",-e.width()/2),e.fileTree({script:ShortPixel.browseContent,multiFolder:!1})}),jQuery(".shortpixel-modal input.select-folder-cancel, .sp-folder-picker-shade").click(function(){jQuery(".sp-folder-picker-shade").fadeOut(100),jQuery(".shortpixel-modal.modal-folder-picker").hide()}),jQuery(".shortpixel-modal input.select-folder").click(function(e){if(r=jQuery("UL.jqueryFileTree LI.directory.selected"),0==jQuery(r).length)var r=jQuery("UL.jqueryFileTree LI.selected").parents(".directory");var t=jQuery(r).children("a").attr("rel");if(void 0!==t)if(t=t.trim()){var s=jQuery("#customFolderBase").val()+t;"/"==s.slice(-1)&&(s=s.slice(0,-1)),jQuery("#addCustomFolder").val(s),jQuery("#addCustomFolderView").val(s),jQuery(".sp-folder-picker-shade").fadeOut(100),jQuery(".shortpixel-modal.modal-folder-picker").css("display","none"),jQuery("#saveAdvAddFolder").removeClass("hidden")}else alert("Please select a folder from the list.")})},browseContent:function(e){e.action="shortpixel_browse_content";var r="";return jQuery.ajax({type:"POST",url:ShortPixel.AJAX_URL,data:e,success:function(e){r=e},async:!1}),r},getBackupSize:function(){var e="";return jQuery.ajax({type:"POST",url:ShortPixel.AJAX_URL,data:{action:"shortpixel_get_backup_size"},success:function(r){e=r},async:!1}),e},newApiKey:function(e){if(!jQuery("#tos").is(":checked"))return e.preventDefault(),jQuery("#tos-robo").fadeIn(400,function(){jQuery("#tos-hand").fadeIn()}),void jQuery("#tos").click(function(){jQuery("#tos-robo").css("display","none"),jQuery("#tos-hand").css("display","none")});if(jQuery("#request_key").addClass("disabled"),jQuery("#pluginemail_spinner").addClass("is-active"),ShortPixel.updateSignupEmail(),ShortPixel.isEmailValid(jQuery("#pluginemail").val())){jQuery("#pluginemail-error").css("display","none");var r={action:"shortpixel_new_api_key",email:jQuery("#pluginemail").val()};jQuery.ajax({type:"POST",async:!1,url:ShortPixel.AJAX_URL,data:r,success:function(r){data=JSON.parse(r),"success"==data.Status?(e.preventDefault(),window.location.reload()):"invalid"==data.Status&&(jQuery("#pluginemail-error").html("<b>"+data.Details+"</b>"),jQuery("#pluginemail-error").css("display",""),jQuery("#pluginemail-info").css("display","none"),e.preventDefault())}}),jQuery("#request_key").removeAttr("onclick")}else jQuery("#pluginemail-error").css("display",""),jQuery("#pluginemail-info").css("display","none"),e.preventDefault();jQuery("#request_key").removeClass("disabled"),jQuery("#pluginemail_spinner").removeClass("is-active")},proposeUpgrade:function(){jQuery("#shortPixelProposeUpgrade .sp-modal-body").addClass("sptw-modal-spinner"),jQuery("#shortPixelProposeUpgrade .sp-modal-body").html(""),jQuery("#shortPixelProposeUpgradeShade").css("display","block"),jQuery("#shortPixelProposeUpgrade").removeClass("shortpixel-hide"),jQuery.ajax({type:"POST",url:ShortPixel.AJAX_URL,data:{action:"shortpixel_propose_upgrade"},success:function(e){jQuery("#shortPixelProposeUpgrade .sp-modal-body").removeClass("sptw-modal-spinner"),jQuery("#shortPixelProposeUpgrade .sp-modal-body").html(e)}})},closeProposeUpgrade:function(){jQuery("#shortPixelProposeUpgradeShade").css("display","none"),jQuery("#shortPixelProposeUpgrade").addClass("shortpixel-hide"),ShortPixel.toRefresh&&ShortPixel.recheckQuota()},bulkShowLengthyMsg:function(e,r,t){var s=jQuery(".bulk-notice-msg.bulk-lengthy");if(0!=s.length){var o=jQuery("a",s);o.text(r),t?o.attr("href",t):o.attr("href",o.data("href").replace("__ID__",e)),s.css("display","block")}},bulkHideLengthyMsg:function(){jQuery(".bulk-notice-msg.bulk-lengthy").css("display","none")},bulkShowMaintenanceMsg:function(e){var r=jQuery(".bulk-notice-msg.bulk-"+e);0!=r.length&&r.css("display","block")},bulkHideMaintenanceMsg:function(e){jQuery(".bulk-notice-msg.bulk-"+e).css("display","none")},bulkShowError:function(e,r,t,s){var o=jQuery("#bulk-error-template");if(0!=o.length){var i=o.clone();i.attr("id","bulk-error-"+e),-1==e?(jQuery("span.sp-err-title",i).remove(),i.addClass("bulk-error-fatal")):(jQuery("img",i).remove(),jQuery("#bulk-error-".id).remove()),jQuery("span.sp-err-content",i).html(r);var a=jQuery("a.sp-post-link",i);s?a.attr("href",s):a.attr("href",a.attr("href").replace("__ID__",e)),a.text(t),o.after(i),i.css("display","block")}},confirmBulkAction:function(e,r){return!!confirm(_spTr["confirmBulk"+e])||(r.stopPropagation(),r.preventDefault(),!1)},checkRandomAnswer:function(e){var r=jQuery(e.target).val(),t=jQuery('input[name="random_answer"]').val(),s=jQuery('input[name="random_answer"]').data("target");r==t?(jQuery(s).removeClass("disabled").prop("disabled",!1),jQuery(s).removeAttr("aria-disabled")):jQuery(s).addClass("disabled").prop("disabled",!0)},removeBulkMsg:function(e){jQuery(e).parent().parent().remove()},isCustomImageId:function(e){return"C-"==e.substring(0,2)},recheckQuota:function(){var e=window.location.href.split("#");window.location.href=e[0]+(e[0].indexOf("?")>0?"&":"?")+"checkquota=1"+(void 0===e[1]?"":"#"+e[1])},openImageMenu:function(e){e.preventDefault(),this.menuCloseEvent||(jQuery(window).click(function(e){e.target.matches(".sp-dropbtn")||jQuery(".sp-dropdown.sp-show").removeClass("sp-show")}),this.menuCloseEvent=!0);var r=e.target.parentElement.classList.contains("sp-show");jQuery(".sp-dropdown.sp-show").removeClass("sp-show"),r||e.target.parentElement.classList.add("sp-show")},menuCloseEvent:!1,loadComparer:function(e){this.comparerData.origUrl=!1,!1===this.comparerData.cssLoaded&&(jQuery("<link>").appendTo("head").attr({type:"text/css",rel:"stylesheet",href:this.WP_PLUGIN_URL+"/res/css/twentytwenty.min.css"}),this.comparerData.cssLoaded=2),!1===this.comparerData.jsLoaded&&(jQuery.getScript(this.WP_PLUGIN_URL+"/res/js/jquery.twentytwenty.min.js",function(){ShortPixel.comparerData.jsLoaded=2,ShortPixel.comparerData.origUrl.length>0&&ShortPixel.displayComparerPopup(ShortPixel.comparerData.width,ShortPixel.comparerData.height,ShortPixel.comparerData.origUrl,ShortPixel.comparerData.optUrl)}),this.comparerData.jsLoaded=1),!1===this.comparerData.origUrl&&(jQuery.ajax({type:"POST",url:ShortPixel.AJAX_URL,data:{action:"shortpixel_get_comparer_data",id:e},success:function(e){data=JSON.parse(e),jQuery.extend(ShortPixel.comparerData,data),2==ShortPixel.comparerData.jsLoaded&&ShortPixel.displayComparerPopup(ShortPixel.comparerData.width,ShortPixel.comparerData.height,ShortPixel.comparerData.origUrl,ShortPixel.comparerData.optUrl)}}),this.comparerData.origUrl="")},displayComparerPopup:function(e,r,t,s){var o=e,i=r<150||e<350,a=jQuery(i?"#spUploadCompareSideBySide":"#spUploadCompare"),l=jQuery(".sp-modal-shade");i||jQuery("#spCompareSlider").html('<img alt="'+_spTr.originalImage+'" class="spUploadCompareOriginal"/><img alt="'+_spTr.optimizedImage+'" class="spUploadCompareOptimized"/>'),e=Math.max(350,Math.min(800,e<350?2*(e+25):r<150?e+25:e)),r=Math.max(150,i?o>350?2*(r+45):r+45:r*e/o);var n="-"+Math.round(e/2);jQuery(".sp-modal-body",a).css("width",e),jQuery(".shortpixel-slider",a).css("width",e),a.css("width",e),a.css("marginLeft",n+"px"),jQuery(".sp-modal-body",a).css("height",r),a.show(),l.show(),i||jQuery("#spCompareSlider").twentytwenty({slider_move:"mousemove"}),jQuery(".sp-close-button").on("click",ShortPixel.closeComparerPopup),jQuery(document).on("keyup.sp_modal_active",ShortPixel.closeComparerPopup),jQuery(".sp-modal-shade").on("click",ShortPixel.closeComparerPopup);var u=jQuery(".spUploadCompareOptimized",a);jQuery(".spUploadCompareOriginal",a).attr("src",t),setTimeout(function(){jQuery(window).trigger("resize")},1e3),u.load(function(){jQuery(window).trigger("resize")}),u.attr("src",s)},closeComparerPopup:function(e){jQuery("#spUploadCompareSideBySide").hide(),jQuery("#spUploadCompare").hide(),jQuery(".sp-modal-shade").hide(),jQuery(document).unbind("keyup.sp_modal_active"),jQuery(".sp-modal-shade").off("click"),jQuery(".sp-close-button").off("click")},convertPunycode:function(e){var r=document.createElement("a");return r.href=e,e.indexOf(r.protocol+"//"+r.hostname)<0?r.href:e.replace(r.protocol+"//"+r.hostname,r.protocol+"//"+r.hostname.split(".").map(function(e){return sp_punycode.toASCII(e)}).join("."))},checkExifWarning:function(){!jQuery('input[name="removeExif"]').is(":checked")&&jQuery('input[name="png2jpg"]').is(":checked")?jQuery(".exif_warning").fadeIn():jQuery(".exif_warning").fadeOut()},checkBackUpWarning:function(){jQuery('input[name="backupImages"]').is(":checked")?jQuery(".backup_warning").fadeOut():jQuery(".backup_warning").fadeIn()},comparerData:{cssLoaded:!1,jsLoaded:!1,origUrl:!1,optUrl:!1,width:0,height:0},toRefresh:!1,resizeSizesAlert:!1,returnedStatusSearching:0}}();
1
+ function showToolBarAlert(e,r,t){var s=jQuery("li.shortpixel-toolbar-processing");switch(e){case ShortPixel.STATUS_QUOTA_EXCEEDED:if(window.location.href.search("wp-short-pixel-bulk")>0&&0==jQuery(".sp-quota-exceeded-alert").length)return;s.addClass("shortpixel-alert"),s.addClass("shortpixel-quota-exceeded"),jQuery("a",s).attr("href","options-general.php?page=wp-shortpixel-settings"),jQuery("a div",s).attr("title","ShortPixel quota exceeded. Click for details.");break;case ShortPixel.STATUS_SKIP:case ShortPixel.STATUS_FAIL:s.addClass("shortpixel-alert shortpixel-processing"),jQuery("a div",s).attr("title",r),void 0!==t&&jQuery("a",s).attr("href","post.php?post="+t+"&action=edit");break;case ShortPixel.STATUS_NO_KEY:s.addClass("shortpixel-alert"),s.addClass("shortpixel-quota-exceeded"),jQuery("a",s).attr("href","options-general.php?page=wp-shortpixel-settings"),jQuery("a div",s).attr("title","Get API Key");break;case ShortPixel.STATUS_SUCCESS:case ShortPixel.STATUS_RETRY:s.addClass("shortpixel-processing"),s.removeClass("shortpixel-alert"),jQuery("a",s).removeAttr("target"),jQuery("a",s).attr("href",jQuery("a img",s).attr("success-url"))}s.removeClass("shortpixel-hide")}function hideToolBarAlert(e){var r=jQuery("li.shortpixel-toolbar-processing.shortpixel-processing");ShortPixel.STATUS_EMPTY_QUEUE==e&&(r.hasClass("shortpixel-alert")||r.hasClass("shortpixel-quota-exceeded"))||r.addClass("shortpixel-hide")}function hideQuotaExceededToolBarAlert(){jQuery("li.shortpixel-toolbar-processing.shortpixel-quota-exceeded").addClass("shortpixel-hide")}function checkQuotaExceededAlert(){"undefined"!=typeof shortPixelQuotaExceeded&&(1==shortPixelQuotaExceeded?showToolBarAlert(ShortPixel.STATUS_QUOTA_EXCEEDED):hideQuotaExceededToolBarAlert())}function checkBulkProgress(){var e=function(e){return r?"/":(r=!0,e)},r=!1,t=window.location.href.toLowerCase().replace(/\/\//g,e);r=!1;var s=ShortPixel.WP_ADMIN_URL.toLowerCase().replace(/\/\//g,e);t.search(s)<0&&(t=ShortPixel.convertPunycode(t),s=ShortPixel.convertPunycode(s)),1==ShortPixel.bulkProcessor&&window.location.href.search("wp-short-pixel-bulk")<0&&void 0!==localStorage.bulkPage&&localStorage.bulkPage>0&&(ShortPixel.bulkProcessor=!1),window.location.href.search("wp-short-pixel-bulk")>=0&&(ShortPixel.bulkProcessor=!0,localStorage.bulkTime=Math.floor(Date.now()/1e3),localStorage.bulkPage=1),1==ShortPixel.bulkProcessor||void 0===localStorage.bulkTime||Math.floor(Date.now()/1e3)-localStorage.bulkTime>90?(ShortPixel.bulkProcessor=!0,localStorage.bulkPage=window.location.href.search("wp-short-pixel-bulk")>=0?1:0,localStorage.bulkTime=Math.floor(Date.now()/1e3),console.log(localStorage.bulkTime),checkBulkProcessingCallApi()):setTimeout(checkBulkProgress,5e3)}function checkBulkProcessingCallApi(){jQuery.ajax({type:"POST",url:ShortPixel.AJAX_URL,data:{action:"shortpixel_image_processing"},success:function(e){if(e.length>0){r=null;try{var r=JSON.parse(e)}catch(e){return void ShortPixel.retry(e.message)}ShortPixel.retries=0;var t=r.ImageID,s=jQuery("div.short-pixel-bulk-page").length>0;switch(r.Status&&r.Status!=ShortPixel.STATUS_SEARCHING&&(ShortPixel.returnedStatusSearching>=2&&jQuery(".bulk-notice-msg.bulk-searching").hide(),ShortPixel.returnedStatusSearching=0),r.Status){case ShortPixel.STATUS_NO_KEY:setCellMessage(t,r.Message,"<a class='button button-smaller button-primary' href=\"https://shortpixel.com/wp-apikey"+ShortPixel.AFFILIATE+'" target="_blank">'+_spTr.getApiKey+"</a>"),showToolBarAlert(ShortPixel.STATUS_NO_KEY);break;case ShortPixel.STATUS_QUOTA_EXCEEDED:setCellMessage(t,r.Message,"<a class='button button-smaller button-primary' href=\"https://shortpixel.com/login/"+ShortPixel.API_KEY+'" target="_blank">'+_spTr.extendQuota+"</a><a class='button button-smaller' href='admin.php?action=shortpixel_check_quota'>"+_spTr.check__Quota+"</a>"),showToolBarAlert(ShortPixel.STATUS_QUOTA_EXCEEDED),0==r.Stop&&setTimeout(checkBulkProgress,5e3),ShortPixel.otherMediaUpdateActions(t,["quota","view"]);break;case ShortPixel.STATUS_FAIL:setCellMessage(t,r.Message,"<a class='button button-smaller button-primary' href=\"javascript:manualOptimization('"+t+"', true)\">"+_spTr.retry+"</a>"),showToolBarAlert(ShortPixel.STATUS_FAIL,r.Message,t),s&&(ShortPixel.bulkShowError(t,r.Message,r.Filename,r.CustomImageLink),r.BulkPercent&&progressUpdate(r.BulkPercent,r.BulkMsg),ShortPixel.otherMediaUpdateActions(t,["retry","view"])),console.log(r.Message),setTimeout(checkBulkProgress,5e3);break;case ShortPixel.STATUS_EMPTY_QUEUE:console.log(r.Message),clearBulkProcessor(),hideToolBarAlert(r.Status);var o=jQuery("#bulk-progress");s&&o.length&&"2"!=r.BulkStatus&&(progressUpdate(100,"Bulk finished!"),jQuery("a.bulk-cancel").attr("disabled","disabled"),hideSlider(),setTimeout(function(){window.location.reload()},3e3));break;case ShortPixel.STATUS_SUCCESS:s&&(ShortPixel.bulkHideLengthyMsg(),ShortPixel.bulkHideMaintenanceMsg());var i=r.PercentImprovement;showToolBarAlert(ShortPixel.STATUS_SUCCESS,"");var a=ShortPixel.isCustomImageId(t)?"":ShortPixel.successActions(t,r.Type,r.ThumbsCount,r.ThumbsTotal,r.BackupEnabled,r.Filename);setCellMessage(t,ShortPixel.successMsg(t,i,r.Type,r.ThumbsCount,r.RetinasCount),a),jQuery("#post-"+t).length>0&&jQuery("#post-"+t).find(".filename").text(r.Filename),jQuery(".misc-pub-filename strong").length>0&&jQuery(".misc-pub-filename strong").text(r.Filename),ShortPixel.isCustomImageId(t)&&r.TsOptimized&&r.TsOptimized.length>0&&(console.log(t),jQuery(".date-"+t).text(r.TsOptimized));var l=jQuery(["restore","view","redolossy","redoglossy","redolossless"]).not(["redo"+r.Type]).get();ShortPixel.otherMediaUpdateActions(t,l);new PercentageAnimator("#sp-msg-"+t+" span.percent",i).animate(i),s&&void 0!==r.Thumb&&(r.BulkPercent&&progressUpdate(r.BulkPercent,r.BulkMsg),r.Thumb.length>0&&(sliderUpdate(t,r.Thumb,r.BkThumb,r.PercentImprovement,r.Filename),void 0!==r.AverageCompression&&0+r.AverageCompression>0&&(jQuery("#sp-avg-optimization").html('<input type="text" class="dial" value="'+Math.round(r.AverageCompression)+'"/>'),ShortPixel.percentDial("#sp-avg-optimization .dial",60)))),console.log("Server response: "+e),s&&void 0!==r.BulkPercent&&progressUpdate(r.BulkPercent,r.BulkMsg),setTimeout(checkBulkProgress,5e3);break;case ShortPixel.STATUS_SKIP:1!==r.Silent&&ShortPixel.bulkShowError(t,r.Message,r.Filename,r.CustomImageLink);case ShortPixel.STATUS_ERROR:void 0!==r.Message&&(showToolBarAlert(ShortPixel.STATUS_SKIP,r.Message+" Image ID: "+t),setCellMessage(t,r.Message,"")),ShortPixel.otherMediaUpdateActions(t,["retry","view"]);case ShortPixel.STATUS_RETRY:console.log("Server response: "+e),showToolBarAlert(ShortPixel.STATUS_RETRY,""),s&&void 0!==r.BulkPercent&&progressUpdate(r.BulkPercent,r.BulkMsg),s&&r.Count>3&&ShortPixel.bulkShowLengthyMsg(t,r.Filename,r.CustomImageLink),setTimeout(checkBulkProgress,5e3);break;case ShortPixel.STATUS_SEARCHING:console.log("Server response: "+e),ShortPixel.returnedStatusSearching++,ShortPixel.returnedStatusSearching>=2&&jQuery(".bulk-notice-msg.bulk-searching").show(),setTimeout(checkBulkProgress,2500);break;case ShortPixel.STATUS_MAINTENANCE:ShortPixel.bulkShowMaintenanceMsg("maintenance"),setTimeout(checkBulkProgress,6e4);break;case ShortPixel.STATUS_QUEUE_FULL:ShortPixel.bulkShowMaintenanceMsg("queue-full"),setTimeout(checkBulkProgress,6e4);break;default:ShortPixel.retry("Unknown status "+r.Status+". Retrying...")}}},error:function(e){ShortPixel.retry(e.statusText)}})}function clearBulkProcessor(){ShortPixel.bulkProcessor=!1,localStorage.bulkTime=0,window.location.href.search("wp-short-pixel-bulk")>=0&&(localStorage.bulkPage=0)}function setCellMessage(e,r,t){var s=jQuery("#sp-msg-"+e);s.length>0&&(s.html("<div class='sp-column-actions'>"+t+"</div><div class='sp-column-info'>"+r+"</div>"),s.css("color","")),(s=jQuery("#sp-cust-msg-"+e)).length>0&&s.html("<div class='sp-column-info'>"+r+"</div>")}function manualOptimization(e,r){setCellMessage(e,"<img src='"+ShortPixel.WP_PLUGIN_URL+"/res/img/loading.gif' alt='"+_spTr.loading+"' class='sp-loading-small'>Image waiting to be processed",""),jQuery("li.shortpixel-toolbar-processing").removeClass("shortpixel-hide"),jQuery("li.shortpixel-toolbar-processing").removeClass("shortpixel-alert"),jQuery("li.shortpixel-toolbar-processing").addClass("shortpixel-processing");var t={action:"shortpixel_manual_optimization",image_id:e,cleanup:r};jQuery.ajax({type:"GET",url:ShortPixel.AJAX_URL,data:t,success:function(r){var t=JSON.parse(r);t.Status==ShortPixel.STATUS_SUCCESS?setTimeout(checkBulkProgress,2e3):setCellMessage(e,void 0!==t.Message?t.Message:_spTr.thisContentNotProcessable,"")},error:function(r){t.action="shortpixel_check_status",jQuery.ajax({type:"GET",url:ShortPixel.AJAX_URL,data:t,success:function(r){var t=JSON.parse(r);t.Status!==ShortPixel.STATUS_SUCCESS&&setCellMessage(e,void 0!==t.Message?t.Message:_spTr.thisContentNotProcessable,"")}})}})}function reoptimize(e,r){setCellMessage(e,"<img src='"+ShortPixel.WP_PLUGIN_URL+"/res/img/loading.gif' alt='"+_spTr.loading+"' class='sp-loading-small'>Image waiting to be reprocessed",""),jQuery("li.shortpixel-toolbar-processing").removeClass("shortpixel-hide"),jQuery("li.shortpixel-toolbar-processing").addClass("shortpixel-processing");var t={action:"shortpixel_redo",attachment_ID:e,type:r};jQuery.get(ShortPixel.AJAX_URL,t,function(r){(t=JSON.parse(r)).Status==ShortPixel.STATUS_SUCCESS?setTimeout(checkBulkProgress,2e3):($msg=void 0!==t.Message?t.Message:_spTr.thisContentNotProcessable,setCellMessage(e,$msg,""),showToolBarAlert(ShortPixel.STATUS_FAIL,$msg))})}function optimizeThumbs(e){setCellMessage(e,"<img src='"+ShortPixel.WP_PLUGIN_URL+"/res/img/loading.gif' alt='"+_spTr.loading+"' class='sp-loading-small'>"+_spTr.imageWaitOptThumbs,""),jQuery("li.shortpixel-toolbar-processing").removeClass("shortpixel-hide"),jQuery("li.shortpixel-toolbar-processing").addClass("shortpixel-processing");var r={action:"shortpixel_optimize_thumbs",attachment_ID:e};jQuery.get(ShortPixel.AJAX_URL,r,function(t){(r=JSON.parse(t)).Status==ShortPixel.STATUS_SUCCESS?setTimeout(checkBulkProgress,2e3):setCellMessage(e,void 0!==r.Message?r.Message:_spTr.thisContentNotProcessable,"")})}function dismissShortPixelNotice(e){jQuery("#short-pixel-notice-"+e).hide();var r={action:"shortpixel_dismiss_notice",notice_id:e};jQuery.get(ShortPixel.AJAX_URL,r,function(e){(r=JSON.parse(e)).Status==ShortPixel.STATUS_SUCCESS&&console.log("dismissed")})}function dismissFileError(){jQuery(".shortpixel-alert").hide();var e={action:"shortpixel_dismissFileError"};jQuery.get(ShortPixel.AJAX_URL,e,function(r){(e=JSON.parse(r)).Status==ShortPixel.STATUS_SUCCESS&&console.log("dismissed")})}function PercentageAnimator(e,r){this.animationSpeed=10,this.increment=2,this.curPercentage=0,this.targetPercentage=r,this.outputSelector=e,this.animate=function(e){this.targetPercentage=e,setTimeout(PercentageTimer.bind(null,this),this.animationSpeed)}}function PercentageTimer(e){e.curPercentage-e.targetPercentage<-e.increment?e.curPercentage+=e.increment:e.curPercentage-e.targetPercentage>e.increment?e.curPercentage-=e.increment:e.curPercentage=e.targetPercentage,jQuery(e.outputSelector).text(e.curPercentage+"%"),e.curPercentage!=e.targetPercentage&&setTimeout(PercentageTimer.bind(null,e),e.animationSpeed)}function progressUpdate(e,r){var t=jQuery("#bulk-progress");t.length&&(jQuery(".progress-left",t).css("width",e+"%"),jQuery(".progress-img",t).css("left",e+"%"),e>24?(jQuery(".progress-img span",t).html(""),jQuery(".progress-left",t).html(e+"%")):(jQuery(".progress-img span",t).html(e+"%"),jQuery(".progress-left",t).html("")),jQuery(".bulk-estimate").html(r))}function sliderUpdate(e,r,t,s,o){var i=jQuery(".bulk-slider div.bulk-slide:first-child");if(0!==i.length){"empty-slide"!=i.attr("id")&&i.hide(),i.css("z-index",1e3),jQuery(".bulk-img-opt",i).attr("src",""),void 0===t&&(t=""),t.length>0&&jQuery(".bulk-img-orig",i).attr("src","");var a=i.clone();a.attr("id","slide-"+e),jQuery(".bulk-img-opt",a).attr("src",r),t.length>0?(jQuery(".img-original",a).css("display","inline-block"),jQuery(".bulk-img-orig",a).attr("src",t)):jQuery(".img-original",a).css("display","none"),jQuery(".bulk-opt-percent",a).html('<input type="text" class="dial" value="'+s+'"/>'),jQuery(".bulk-slider").append(a),ShortPixel.percentDial("#"+a.attr("id")+" .dial",100),jQuery(".bulk-slider-container span.filename").html("&nbsp;&nbsp;"+o),"empty-slide"==i.attr("id")?(i.remove(),jQuery(".bulk-slider-container").css("display","block")):i.animate({left:i.width()+i.position().left},"slow","swing",function(){i.remove(),a.fadeIn("slow")})}}function hideSlider(){jQuery(".bulk-slider-container").css("display","none")}function showStats(){jQuery(".bulk-stats").length}function SPstringFormat(){var e=Array.prototype.slice.call(arguments);if(0!==e.length){var r=e.shift();for(i=0;i<e.length;i++)r=r.replace(new RegExp("\\{"+i+"\\}","gm"),e[i]);return r}}jQuery(document).ready(function(){ShortPixel.init()});var ShortPixel=function(){function e(e){jQuery(e).is(":checked")?jQuery("#width,#height").removeAttr("disabled"):jQuery("#width,#height").attr("disabled","disabled")}function r(){jQuery("#shortpixel-hs-button-blind").remove(),jQuery("#shortpixel-hs-tools").remove(),jQuery("#hs-beacon").remove(),jQuery("#botbutton").remove(),jQuery("#shortpixel-hs-blind").remove()}return jQuery("#key").keypress(function(e){13==e.which&&jQuery("#valid").val("validate")}),{init:function(){void 0===ShortPixel.API_KEY&&(jQuery("table.wp-list-table.media").length>0&&jQuery('select[name^="action"] option:last-child').before('<option value="short-pixel-bulk">'+_spTr.optimizeWithSP+'</option><option value="short-pixel-bulk-lossy"> → '+_spTr.redoLossy+'</option><option value="short-pixel-bulk-glossy"> → '+_spTr.redoGlossy+'</option><option value="short-pixel-bulk-lossless"> → '+_spTr.redoLossless+'</option><option value="short-pixel-bulk-restore"> → '+_spTr.restoreOriginal+"</option>"),ShortPixel.setOptions(ShortPixelConstants[0]),jQuery("#backup-folder-size").length&&jQuery("#backup-folder-size").html(ShortPixel.getBackupSize()),"todo"==ShortPixel.MEDIA_ALERT&&jQuery("div.media-frame.mode-grid").length>0&&jQuery("div.media-frame.mode-grid").before('<div id="short-pixel-media-alert" class="notice notice-warning"><p>'+SPstringFormat(_spTr.changeMLToListMode,'<a href="upload.php?mode=list" class="view-list"><span class="screen-reader-text">'," </span>",'</a><a class="alignright" href="javascript:ShortPixel.dismissMediaAlert();">',"</a>")+"</p></div>"),jQuery(window).on("beforeunload",function(){1==ShortPixel.bulkProcessor&&clearBulkProcessor()}),checkQuotaExceededAlert(),checkBulkProgress())},setOptions:function(e){for(var r in e)ShortPixel[r]=e[r]},isEmailValid:function(e){return/^\w+([\.+-]?\w+)*@\w+([\.-]?\w+)*(\.\w{1,63})+$/.test(e)},updateSignupEmail:function(){var e=jQuery("#pluginemail").val();ShortPixel.isEmailValid(e)&&jQuery("#request_key").removeClass("disabled"),jQuery("#request_key").attr("href",jQuery("#request_key").attr("href").split("?")[0]+"?pluginemail="+e)},validateKey:function(e){jQuery("#valid").val("validate"),jQuery(e).parents("form").submit()},enableResize:e,setupGeneralTab:function(){var r=0;void 0!==document.wp_shortpixel_options&&(r=document.wp_shortpixel_options.compressionType);for(var t=0,s=null;t<r.length;t++)r[t].onclick=function(){this!==s&&(s=this),void 0===ShortPixel.setupGeneralTabAlert&&(alert(_spTr.alertOnlyAppliesToNewImages),ShortPixel.setupGeneralTabAlert=1)};ShortPixel.enableResize("#resize"),jQuery("#resize").change(function(){e(this)}),jQuery(".resize-sizes").blur(function(e){var r=jQuery(e.target);if(ShortPixel.resizeSizesAlert!=r.val()){ShortPixel.resizeSizesAlert=r.val();var t=jQuery("#min-"+r.attr("name")).val(),s=jQuery("#min-"+r.attr("name")).data("nicename");r.val()<Math.min(t,1024)?(t>1024?alert(SPstringFormat(_spTr.pleaseDoNotSetLesser1024,s)):alert(SPstringFormat(_spTr.pleaseDoNotSetLesserSize,s,s,t)),e.preventDefault(),r.focus()):this.defaultValue=r.val()}}),jQuery(".shortpixel-confirm").click(function(e){return!!confirm(e.target.getAttribute("data-confirm"))||(e.preventDefault(),!1)}),jQuery('input[name="removeExif"], input[name="png2jpg"]').on("change",function(){ShortPixel.checkExifWarning()}),ShortPixel.checkExifWarning(),jQuery('input[name="backupImages"]').on("change",function(){ShortPixel.checkBackUpWarning()}),ShortPixel.checkBackUpWarning()},apiKeyChanged:function(){jQuery(".wp-shortpixel-options .shortpixel-key-valid").css("display","none"),jQuery(".wp-shortpixel-options button#validate").css("display","inline-block")},setupAdvancedTab:function(){jQuery("input.remove-folder-button").click(function(){var e=jQuery(this).data("value");1==confirm(SPstringFormat(_spTr.areYouSureStopOptimizing,e))&&(jQuery("#removeFolder").val(e),jQuery("#wp_shortpixel_options").submit())}),jQuery("input.recheck-folder-button").click(function(){var e=jQuery(this).data("value");1==confirm(SPstringFormat(_spTr.areYouSureStopOptimizing,e))&&(jQuery("#recheckFolder").val(e),jQuery("#wp_shortpixel_options").submit())})},checkThumbsUpdTotal:function(e){var r=jQuery("#"+(e.checked?"total":"main")+"ToProcess").val();jQuery("div.bulk-play span.total").text(r),jQuery("#displayTotal").text(r)},initSettings:function(){ShortPixel.adjustSettingsTabs(),ShortPixel.setupGeneralTab(),jQuery(window).resize(function(){ShortPixel.adjustSettingsTabs()}),jQuery("article.sp-tabs a.tab-link").click(function(e){var r=jQuery(e.target).data("id");ShortPixel.switchSettingsTab(r)}),jQuery("input[type=radio][name=deliverWebpType]").change(function(){"deliverWebpAltered"==this.value?window.confirm(_spTr.alertDeliverWebPAltered)?0==jQuery("input[type=radio][name=deliverWebpAlteringType]:checked").length&&jQuery("#deliverWebpAlteredWP").prop("checked",!0):jQuery(this).prop("checked",!1):"deliverWebpUnaltered"==this.value&&window.alert(_spTr.alertDeliverWebPUnaltered)})},switchSettingsTab:function(e){var r=e.replace("tab-",""),t="",s=jQuery("section#"+e);jQuery('input[name="display_part"]').val(r);var o=window.location.href.toString();if(o.indexOf("?")>0){var i=o.substring(0,o.indexOf("?"));i+="?"+jQuery.param({page:"wp-shortpixel-settings",part:r}),window.history.replaceState({},document.title,i)}if(s.length>0&&(jQuery("section").removeClass("sel-tab"),jQuery("section .wp-shortpixel-tab-content").fadeOut(50),jQuery(s).addClass("sel-tab"),ShortPixel.adjustSettingsTabs(),jQuery(s).find(".wp-shortpixel-tab-content").fadeIn(50)),"undefined"!=typeof HS&&void 0!==HS.beacon.suggest){switch(r){case"settings":t=shortpixel_suggestions_settings;break;case"adv-settings":t=shortpixel_suggestions_adv_settings;break;case"cloudflare":case"stats":t=shortpixel_suggestions_cloudflare}HS.beacon.suggest(t)}},adjustSettingsTabs:function(){var e=jQuery("section.sel-tab").height()+90;jQuery(".section-wrapper").css("height",e)},onBulkThumbsCheck:function(e){e.checked?(jQuery("#with-thumbs").css("display","inherit"),jQuery("#without-thumbs").css("display","none")):(jQuery("#without-thumbs").css("display","inherit"),jQuery("#with-thumbs").css("display","none"))},dismissMediaAlert:function(){var e={action:"shortpixel_dismiss_media_alert"};jQuery.get(ShortPixel.AJAX_URL,e,function(r){"success"==(e=JSON.parse(r)).Status&&jQuery("#short-pixel-media-alert").hide()})},closeHelpPane:r,dismissHelpPane:function(){r(),dismissShortPixelNotice("help")},checkQuota:function(){jQuery.get(ShortPixel.AJAX_URL,{action:"shortpixel_check_quota"},function(){console.log("quota refreshed")})},percentDial:function(e,r){jQuery(e).knob({readOnly:!0,width:r,height:r,fgColor:"#1CAECB",format:function(e){return e+"%"}})},successMsg:function(e,r,t,s,o){return(r>0?"<div class='sp-column-info'>"+_spTr.reducedBy+" <strong><span class='percent'>"+r+"%</span></strong> ":"")+(r>0&&r<5?"<br>":"")+(r<5?_spTr.bonusProcessing:"")+(t.length>0?" ("+t+")":"")+(0+s>0?"<br>"+SPstringFormat(_spTr.plusXthumbsOpt,s):"")+(0+o>0?"<br>"+SPstringFormat(_spTr.plusXretinasOpt,o):"")+"</div>"},successActions:function(e,r,t,s,o,i){if(1==o){var a=jQuery(".sp-column-actions-template").clone();if(!a.length)return!1;var l;return l=0==r.length?["lossy","lossless"]:["lossy","glossy","lossless"].filter(function(e){return!(e==r)}),a.html(a.html().replace(/__SP_ID__/g,e)),"pdf"==i.substr(i.lastIndexOf(".")+1).toLowerCase()&&jQuery(".sp-action-compare",a).remove(),0==t&&s>0?a.html(a.html().replace("__SP_THUMBS_TOTAL__",s)):(jQuery(".sp-action-optimize-thumbs",a).remove(),jQuery(".sp-dropbtn",a).removeClass("button-primary")),a.html(a.html().replace(/__SP_FIRST_TYPE__/g,l[0])),a.html(a.html().replace(/__SP_SECOND_TYPE__/g,l[1])),a.html()}return""},otherMediaUpdateActions:function(e,r){if(e=e.substring(2),jQuery(".shortpixel-other-media").length){for(var t=["optimize","retry","restore","redo","quota","view"],s=0,o=t.length;s<o;s++)jQuery("#"+t[s]+"_"+e).css("display","none");for(var s=0,o=r.length;s<o;s++)jQuery("#"+r[s]+"_"+e).css("display","")}},retry:function(e){ShortPixel.retries++,isNaN(ShortPixel.retries)&&(ShortPixel.retries=1),ShortPixel.retries<6?(console.log("Invalid response from server (Error: "+e+"). Retrying pass "+(ShortPixel.retries+1)+"..."),setTimeout(checkBulkProgress,5e3)):(ShortPixel.bulkShowError(-1,"Invalid response from server received 6 times. Please retry later by reloading this page, or <a href='https://shortpixel.com/contact' target='_blank'>contact support</a>. (Error: "+e+")",""),console.log("Invalid response from server 6 times. Giving up."))},initFolderSelector:function(){jQuery(".select-folder-button").click(function(){jQuery(".sp-folder-picker-shade").fadeIn(100),jQuery(".shortpixel-modal.modal-folder-picker").show();var e=jQuery(".sp-folder-picker");e.parent().css("margin-left",-e.width()/2),e.fileTree({script:ShortPixel.browseContent,multiFolder:!1})}),jQuery(".shortpixel-modal input.select-folder-cancel, .sp-folder-picker-shade").click(function(){jQuery(".sp-folder-picker-shade").fadeOut(100),jQuery(".shortpixel-modal.modal-folder-picker").hide()}),jQuery(".shortpixel-modal input.select-folder").click(function(e){if(r=jQuery("UL.jqueryFileTree LI.directory.selected"),0==jQuery(r).length)var r=jQuery("UL.jqueryFileTree LI.selected").parents(".directory");var t=jQuery(r).children("a").attr("rel");if(void 0!==t)if(t=t.trim()){var s=jQuery("#customFolderBase").val()+t;"/"==s.slice(-1)&&(s=s.slice(0,-1)),jQuery("#addCustomFolder").val(s),jQuery("#addCustomFolderView").val(s),jQuery(".sp-folder-picker-shade").fadeOut(100),jQuery(".shortpixel-modal.modal-folder-picker").css("display","none"),jQuery("#saveAdvAddFolder").removeClass("hidden")}else alert("Please select a folder from the list.")})},browseContent:function(e){e.action="shortpixel_browse_content";var r="";return jQuery.ajax({type:"POST",url:ShortPixel.AJAX_URL,data:e,success:function(e){r=e},async:!1}),r},getBackupSize:function(){var e="";return jQuery.ajax({type:"POST",url:ShortPixel.AJAX_URL,data:{action:"shortpixel_get_backup_size"},success:function(r){e=r},async:!1}),e},newApiKey:function(e){if(!jQuery("#tos").is(":checked"))return e.preventDefault(),jQuery("#tos-robo").fadeIn(400,function(){jQuery("#tos-hand").fadeIn()}),void jQuery("#tos").click(function(){jQuery("#tos-robo").css("display","none"),jQuery("#tos-hand").css("display","none")});if(jQuery("#request_key").addClass("disabled"),jQuery("#pluginemail_spinner").addClass("is-active"),ShortPixel.updateSignupEmail(),ShortPixel.isEmailValid(jQuery("#pluginemail").val())){jQuery("#pluginemail-error").css("display","none");var r={action:"shortpixel_new_api_key",email:jQuery("#pluginemail").val()};jQuery.ajax({type:"POST",async:!1,url:ShortPixel.AJAX_URL,data:r,success:function(r){data=JSON.parse(r),"success"==data.Status?(e.preventDefault(),window.location.reload()):"invalid"==data.Status&&(jQuery("#pluginemail-error").html("<b>"+data.Details+"</b>"),jQuery("#pluginemail-error").css("display",""),jQuery("#pluginemail-info").css("display","none"),e.preventDefault())}}),jQuery("#request_key").removeAttr("onclick")}else jQuery("#pluginemail-error").css("display",""),jQuery("#pluginemail-info").css("display","none"),e.preventDefault();jQuery("#request_key").removeClass("disabled"),jQuery("#pluginemail_spinner").removeClass("is-active")},proposeUpgrade:function(){jQuery("#shortPixelProposeUpgrade .sp-modal-body").addClass("sptw-modal-spinner"),jQuery("#shortPixelProposeUpgrade .sp-modal-body").html(""),jQuery("#shortPixelProposeUpgradeShade").css("display","block"),jQuery("#shortPixelProposeUpgrade").removeClass("shortpixel-hide"),jQuery.ajax({type:"POST",url:ShortPixel.AJAX_URL,data:{action:"shortpixel_propose_upgrade"},success:function(e){jQuery("#shortPixelProposeUpgrade .sp-modal-body").removeClass("sptw-modal-spinner"),jQuery("#shortPixelProposeUpgrade .sp-modal-body").html(e)}})},closeProposeUpgrade:function(){jQuery("#shortPixelProposeUpgradeShade").css("display","none"),jQuery("#shortPixelProposeUpgrade").addClass("shortpixel-hide"),ShortPixel.toRefresh&&ShortPixel.recheckQuota()},bulkShowLengthyMsg:function(e,r,t){var s=jQuery(".bulk-notice-msg.bulk-lengthy");if(0!=s.length){var o=jQuery("a",s);o.text(r),t?o.attr("href",t):o.attr("href",o.data("href").replace("__ID__",e)),s.css("display","block")}},bulkHideLengthyMsg:function(){jQuery(".bulk-notice-msg.bulk-lengthy").css("display","none")},bulkShowMaintenanceMsg:function(e){var r=jQuery(".bulk-notice-msg.bulk-"+e);0!=r.length&&r.css("display","block")},bulkHideMaintenanceMsg:function(e){jQuery(".bulk-notice-msg.bulk-"+e).css("display","none")},bulkShowError:function(e,r,t,s){var o=jQuery("#bulk-error-template");if(0!=o.length){var i=o.clone();i.attr("id","bulk-error-"+e),-1==e?(jQuery("span.sp-err-title",i).remove(),i.addClass("bulk-error-fatal")):(jQuery("img",i).remove(),jQuery("#bulk-error-".id).remove()),jQuery("span.sp-err-content",i).html(r);var a=jQuery("a.sp-post-link",i);s?a.attr("href",s):a.attr("href",a.attr("href").replace("__ID__",e)),a.text(t),o.after(i),i.css("display","block")}},confirmBulkAction:function(e,r){return!!confirm(_spTr["confirmBulk"+e])||(r.stopPropagation(),r.preventDefault(),!1)},checkRandomAnswer:function(e){var r=jQuery(e.target).val(),t=jQuery('input[name="random_answer"]').val(),s=jQuery('input[name="random_answer"]').data("target");r==t?(jQuery(s).removeClass("disabled").prop("disabled",!1),jQuery(s).removeAttr("aria-disabled")):jQuery(s).addClass("disabled").prop("disabled",!0)},removeBulkMsg:function(e){jQuery(e).parent().parent().remove()},isCustomImageId:function(e){return"C-"==e.substring(0,2)},recheckQuota:function(){var e=window.location.href.split("#");window.location.href=e[0]+(e[0].indexOf("?")>0?"&":"?")+"checkquota=1"+(void 0===e[1]?"":"#"+e[1])},openImageMenu:function(e){e.preventDefault(),this.menuCloseEvent||(jQuery(window).click(function(e){e.target.matches(".sp-dropbtn")||jQuery(".sp-dropdown.sp-show").removeClass("sp-show")}),this.menuCloseEvent=!0);var r=e.target.parentElement.classList.contains("sp-show");jQuery(".sp-dropdown.sp-show").removeClass("sp-show"),r||e.target.parentElement.classList.add("sp-show")},menuCloseEvent:!1,loadComparer:function(e){this.comparerData.origUrl=!1,!1===this.comparerData.cssLoaded&&(jQuery("<link>").appendTo("head").attr({type:"text/css",rel:"stylesheet",href:this.WP_PLUGIN_URL+"/res/css/twentytwenty.min.css"}),this.comparerData.cssLoaded=2),!1===this.comparerData.jsLoaded&&(jQuery.getScript(this.WP_PLUGIN_URL+"/res/js/jquery.twentytwenty.min.js",function(){ShortPixel.comparerData.jsLoaded=2,ShortPixel.comparerData.origUrl.length>0&&ShortPixel.displayComparerPopup(ShortPixel.comparerData.width,ShortPixel.comparerData.height,ShortPixel.comparerData.origUrl,ShortPixel.comparerData.optUrl)}),this.comparerData.jsLoaded=1),!1===this.comparerData.origUrl&&(jQuery.ajax({type:"POST",url:ShortPixel.AJAX_URL,data:{action:"shortpixel_get_comparer_data",id:e},success:function(e){data=JSON.parse(e),jQuery.extend(ShortPixel.comparerData,data),2==ShortPixel.comparerData.jsLoaded&&ShortPixel.displayComparerPopup(ShortPixel.comparerData.width,ShortPixel.comparerData.height,ShortPixel.comparerData.origUrl,ShortPixel.comparerData.optUrl)}}),this.comparerData.origUrl="")},displayComparerPopup:function(e,r,t,s){var o=e,i=r<150||e<350,a=jQuery(i?"#spUploadCompareSideBySide":"#spUploadCompare"),l=jQuery(".sp-modal-shade");i||jQuery("#spCompareSlider").html('<img alt="'+_spTr.originalImage+'" class="spUploadCompareOriginal"/><img alt="'+_spTr.optimizedImage+'" class="spUploadCompareOptimized"/>'),e=Math.max(350,Math.min(800,e<350?2*(e+25):r<150?e+25:e)),r=Math.max(150,i?o>350?2*(r+45):r+45:r*e/o);var n="-"+Math.round(e/2);jQuery(".sp-modal-body",a).css("width",e),jQuery(".shortpixel-slider",a).css("width",e),a.css("width",e),a.css("marginLeft",n+"px"),jQuery(".sp-modal-body",a).css("height",r),a.show(),l.show(),i||jQuery("#spCompareSlider").twentytwenty({slider_move:"mousemove"}),jQuery(".sp-close-button").on("click",ShortPixel.closeComparerPopup),jQuery(document).on("keyup.sp_modal_active",ShortPixel.closeComparerPopup),jQuery(".sp-modal-shade").on("click",ShortPixel.closeComparerPopup);var u=jQuery(".spUploadCompareOptimized",a);jQuery(".spUploadCompareOriginal",a).attr("src",t),setTimeout(function(){jQuery(window).trigger("resize")},1e3),u.load(function(){jQuery(window).trigger("resize")}),u.attr("src",s)},closeComparerPopup:function(e){jQuery("#spUploadCompareSideBySide").hide(),jQuery("#spUploadCompare").hide(),jQuery(".sp-modal-shade").hide(),jQuery(document).unbind("keyup.sp_modal_active"),jQuery(".sp-modal-shade").off("click"),jQuery(".sp-close-button").off("click")},convertPunycode:function(e){var r=document.createElement("a");return r.href=e,e.indexOf(r.protocol+"//"+r.hostname)<0?r.href:e.replace(r.protocol+"//"+r.hostname,r.protocol+"//"+r.hostname.split(".").map(function(e){return sp_punycode.toASCII(e)}).join("."))},checkExifWarning:function(){!jQuery('input[name="removeExif"]').is(":checked")&&jQuery('input[name="png2jpg"]').is(":checked")?jQuery(".exif_warning").fadeIn():jQuery(".exif_warning").fadeOut()},checkBackUpWarning:function(){jQuery('input[name="backupImages"]').is(":checked")?jQuery(".backup_warning").fadeOut():jQuery(".backup_warning").fadeIn()},comparerData:{cssLoaded:!1,jsLoaded:!1,origUrl:!1,optUrl:!1,width:0,height:0},toRefresh:!1,resizeSizesAlert:!1,returnedStatusSearching:0}}();
res/scss/view/_settings-advanced.scss CHANGED
@@ -21,6 +21,16 @@
21
  }
22
  }
23
 
 
 
 
 
 
 
 
 
 
 
24
 
25
 
26
  }
21
  }
22
  }
23
 
24
+ // additional media table
25
+ .shortpixel-folders-list
26
+ {
27
+ th {
28
+ width: auto;
29
+ padding: 12px 16px 12px 12px;
30
+
31
+ }
32
+ }
33
+
34
 
35
 
36
  }
shortpixel-plugin.php CHANGED
@@ -32,7 +32,6 @@ class ShortPixelPlugin
32
 
33
  $this->initRuntime(); // require controllers, and other needed classes
34
  $this->initHooks();
35
-
36
  add_action('plugins_loaded', array($this, 'init'), 5); // early as possible init.
37
  }
38
 
@@ -47,7 +46,6 @@ class ShortPixelPlugin
47
  $this->is_noheaders = true;
48
  }
49
 
50
-
51
  // @todo Transitionary init for the time being, since plugin init functionality is still split between.
52
  global $shortPixelPluginInstance;
53
  $shortPixelPluginInstance = new \wpShortPixel();
32
 
33
  $this->initRuntime(); // require controllers, and other needed classes
34
  $this->initHooks();
 
35
  add_action('plugins_loaded', array($this, 'init'), 5); // early as possible init.
36
  }
37
 
46
  $this->is_noheaders = true;
47
  }
48
 
 
49
  // @todo Transitionary init for the time being, since plugin init functionality is still split between.
50
  global $shortPixelPluginInstance;
51
  $shortPixelPluginInstance = new \wpShortPixel();
shortpixel_api.php CHANGED
@@ -809,6 +809,7 @@ class ShortPixelAPI {
809
  $meta->setCompressionType($compressionType);
810
  $meta->setCompressedSize(@filesize($meta->getPath()));
811
  $meta->setKeepExif($this->_settings->keepExif);
 
812
  $meta->setTsOptimized(date("Y-m-d H:i:s"));
813
  $meta->setThumbsOptList(is_array($meta->getThumbsOptList()) ? array_unique(array_merge($meta->getThumbsOptList(), $thumbsOptList)) : $thumbsOptList);
814
  $meta->setThumbsOpt(($meta->getThumbsTodo() || $this->_settings->processThumbnails) ? count($meta->getThumbsOptList()) : 0);
809
  $meta->setCompressionType($compressionType);
810
  $meta->setCompressedSize(@filesize($meta->getPath()));
811
  $meta->setKeepExif($this->_settings->keepExif);
812
+ $meta->setCmyk2rgb($this->_settings->CMYKtoRGBconversion);
813
  $meta->setTsOptimized(date("Y-m-d H:i:s"));
814
  $meta->setThumbsOptList(is_array($meta->getThumbsOptList()) ? array_unique(array_merge($meta->getThumbsOptList(), $thumbsOptList)) : $thumbsOptList);
815
  $meta->setThumbsOpt(($meta->getThumbsTodo() || $this->_settings->processThumbnails) ? count($meta->getThumbsOptList()) : 0);
wp-shortpixel-req.php CHANGED
@@ -54,7 +54,7 @@ require_once('class/model/sp-file-rights-exception.php');
54
  require_once('class/db/shortpixel-db.php');
55
  require_once('class/db/wp-shortpixel-db.php');
56
  require_once('class/db/shortpixel-custom-meta-dao.php');
57
- require_once('class/db/shortpixel-nextgen-adapter.php');
58
  require_once('class/db/wp-shortpixel-media-library-adapter.php');
59
  require_once('class/db/shortpixel-meta-facade.php');
60
  //view
54
  require_once('class/db/shortpixel-db.php');
55
  require_once('class/db/wp-shortpixel-db.php');
56
  require_once('class/db/shortpixel-custom-meta-dao.php');
57
+
58
  require_once('class/db/wp-shortpixel-media-library-adapter.php');
59
  require_once('class/db/shortpixel-meta-facade.php');
60
  //view
wp-shortpixel.php CHANGED
@@ -3,7 +3,7 @@
3
  * Plugin Name: ShortPixel Image Optimizer
4
  * Plugin URI: https://shortpixel.com/
5
  * Description: ShortPixel optimizes images automatically, while guarding the quality of your images. Check your <a href="options-general.php?page=wp-shortpixel-settings" target="_blank">Settings &gt; ShortPixel</a> page on how to start optimizing your image library and make your website load faster.
6
- * Version: 4.16.0
7
  * Author: ShortPixel
8
  * Author URI: https://shortpixel.com
9
  * Text Domain: shortpixel-image-optimiser
@@ -19,7 +19,7 @@ define('SHORTPIXEL_PLUGIN_DIR', __DIR__);
19
 
20
  //define('SHORTPIXEL_AFFILIATE_CODE', '');
21
 
22
- define('SHORTPIXEL_IMAGE_OPTIMISER_VERSION', "4.16.0");
23
  define('SHORTPIXEL_MAX_TIMEOUT', 10);
24
  define('SHORTPIXEL_VALIDATE_MAX_TIMEOUT', 15);
25
  define('SHORTPIXEL_BACKUP', 'ShortpixelBackups');
3
  * Plugin Name: ShortPixel Image Optimizer
4
  * Plugin URI: https://shortpixel.com/
5
  * Description: ShortPixel optimizes images automatically, while guarding the quality of your images. Check your <a href="options-general.php?page=wp-shortpixel-settings" target="_blank">Settings &gt; ShortPixel</a> page on how to start optimizing your image library and make your website load faster.
6
+ * Version: 4.16.1
7
  * Author: ShortPixel
8
  * Author URI: https://shortpixel.com
9
  * Text Domain: shortpixel-image-optimiser
19
 
20
  //define('SHORTPIXEL_AFFILIATE_CODE', '');
21
 
22
+ define('SHORTPIXEL_IMAGE_OPTIMISER_VERSION', "4.16.1");
23
  define('SHORTPIXEL_MAX_TIMEOUT', 10);
24
  define('SHORTPIXEL_VALIDATE_MAX_TIMEOUT', 15);
25
  define('SHORTPIXEL_BACKUP', 'ShortpixelBackups');