Gallery – Flagallery Photo Portfolio - Version 5.3.0

Version Description

Download this release

Release Info

Developer pasyuk
Plugin Icon 128x128 Gallery – Flagallery Photo Portfolio
Version 5.3.0
Comparing to
See all releases

Code changes from version 5.2.6 to 5.3.0

admin/admin.php CHANGED
@@ -20,6 +20,8 @@ class flagAdminPanel {
20
  add_action( 'admin_print_scripts', array( &$this, 'load_scripts' ) );
21
  add_action( 'admin_print_styles', array( &$this, 'load_styles' ) );
22
 
 
 
23
  add_filter( 'contextual_help', array( &$this, 'show_help' ), 10, 2 );
24
  add_filter( 'screen_meta_screen', array( &$this, 'edit_screen_meta' ) );
25
 
@@ -195,6 +197,43 @@ class flagAdminPanel {
195
 
196
  }
197
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
198
  function load_scripts() {
199
 
200
  wp_register_script( 'flag-ajax', FLAG_URLPATH . 'admin/js/flag.ajax.js', array( 'jquery' ), '1.4.1' );
20
  add_action( 'admin_print_scripts', array( &$this, 'load_scripts' ) );
21
  add_action( 'admin_print_styles', array( &$this, 'load_styles' ) );
22
 
23
+ add_action( 'enqueue_block_editor_assets', array( &$this, 'gutenberg_assets' ) );
24
+
25
  add_filter( 'contextual_help', array( &$this, 'show_help' ), 10, 2 );
26
  add_filter( 'screen_meta_screen', array( &$this, 'edit_screen_meta' ) );
27
 
197
 
198
  }
199
 
200
+ /**
201
+ * Enqueue the block's assets for the gutenberg editor.
202
+ */
203
+ function gutenberg_assets() {
204
+ global $flagdb, $flag;
205
+ wp_enqueue_style( 'flagallery-block-editor', FLAG_URLPATH . 'admin/css/flagallery-block.css' );
206
+ wp_register_script(
207
+ 'flagallery-block-editor',
208
+ FLAG_URLPATH . 'admin/js/flagallery-block.js',
209
+ array( 'wp-blocks', 'wp-element' )
210
+ );
211
+
212
+ require_once ( dirname(__FILE__) . '/get_skin.php');
213
+ $flag_options = get_option('flag_options');
214
+ $all_skins = get_skins();
215
+ $skins = array();
216
+ foreach ($all_skins as $skin_file => $skin_data) {
217
+ $id = dirname($skin_file);
218
+ $is_default = ($id == $flag_options['flashSkin']);
219
+ $skins[$id] = array(
220
+ 'id' => $id,
221
+ 'name' => $skin_data['Name'],
222
+ 'is_default' => $is_default,
223
+ 'screenshot' => WP_PLUGIN_URL . '/flagallery-skins/' . $id . '/screenshot.png',
224
+ );
225
+ }
226
+ $data = array(
227
+ 'default_skin'=> $flag_options['flashSkin'],
228
+ 'skins' => $skins,
229
+ 'galleries' => $flagdb->find_all_galleries($flag->options['albSort'], $flag->options['albSortDir']),
230
+ 'albums' => $flagdb->find_all_albums('id', 'ASC'),
231
+ );
232
+
233
+ wp_localize_script( 'flagallery-block-editor', 'flagallery_data', $data );
234
+ wp_enqueue_script( 'flagallery-block-editor' );
235
+ }
236
+
237
  function load_scripts() {
238
 
239
  wp_register_script( 'flag-ajax', FLAG_URLPATH . 'admin/js/flag.ajax.js', array( 'jquery' ), '1.4.1' );
admin/css/flagallery-block.css ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ form.flagallery-preview {
2
+ position: relative;
3
+ padding-left: 270px;
4
+ padding-bottom: 30px;
5
+ overflow: hidden;
6
+ box-sizing: border-box;
7
+ height: auto;
8
+ width: 100%;
9
+ }
10
+
11
+ form.flagallery-preview input,
12
+ form.flagallery-preview select {
13
+ display: block;
14
+ width: 100%;
15
+ margin: 5px 0 10px;
16
+ box-sizing: border-box;
17
+ }
18
+
19
+ .flagallery-required {
20
+ border-color: red !important;
21
+ }
22
+
23
+ img.flagallery-skin-screenshot {
24
+ position: absolute;
25
+ left: 0;
26
+ top: 0;
27
+ width: 260px;
28
+ height: auto;
29
+ }
30
+
31
+ .flagallery-shortcode {
32
+ position: absolute;
33
+ left: 0;
34
+ bottom: 0;
35
+ font-size: 12px;
36
+ font-family: Courier, sans-serif;
37
+ padding: 4px 10px;
38
+ background-color: #fafafa;
39
+ width: 100%;
40
+ white-space: nowrap;
41
+ overflow: hidden;
42
+ text-overflow: ellipsis;
43
+ }
admin/functions.php CHANGED
@@ -635,11 +635,14 @@ class flagAdmin{
635
  if ( ! is_wp_error( $editor ) ) {
636
  $editor->set_quality( $imgquality );
637
  $editor->resize( $max_width, $max_height, 0 );
638
- $editor->save( $image->webimagePath );
 
 
 
639
  if(@filesize($image->webimagePath) > @filesize($image->imagePath)) {
640
  @copy($image->imagePath, $image->webimagePath);
641
  }
642
- $webviewsize = @getimagesize ( $image->webimagePath );
643
  flagdb::update_image_meta($image->pid, array( 'webview' => $webviewsize) );
644
 
645
  do_action('flag_image_optimized', $image);
@@ -917,7 +920,7 @@ class flagAdmin{
917
 
918
  //clean filename and extract extension
919
  $filepart = flagGallery::fileinfo( $imagefiles['name'][$key] );
920
- $filename = sanitize_title($filepart['filename']) . '.' . strtolower( $filepart['extension'] );
921
 
922
  // check for allowed extension and if it's an image file
923
  $ext = array('jpg', 'jpeg', 'png', 'gif');
@@ -1006,7 +1009,7 @@ class flagAdmin{
1006
  $temp_file = $_FILES["file"]['tmp_name'];
1007
 
1008
  $filepart = flagGallery::fileinfo( $_FILES['file']['name'] );
1009
- $filename = sanitize_title($filepart['filename']) . '.' . strtolower( $filepart['extension'] );
1010
 
1011
  // check for allowed extension
1012
  $ext = array('jpeg', 'jpg', 'png', 'gif');
635
  if ( ! is_wp_error( $editor ) ) {
636
  $editor->set_quality( $imgquality );
637
  $editor->resize( $max_width, $max_height, 0 );
638
+ $saved = $editor->save( $image->webimagePath );
639
+ if($saved['path'] !== $image->webimagePath) {
640
+ @rename($saved['path'], $image->webimagePath);
641
+ }
642
  if(@filesize($image->webimagePath) > @filesize($image->imagePath)) {
643
  @copy($image->imagePath, $image->webimagePath);
644
  }
645
+ $webviewsize = @getimagesize ( $image->webimagePath );
646
  flagdb::update_image_meta($image->pid, array( 'webview' => $webviewsize) );
647
 
648
  do_action('flag_image_optimized', $image);
920
 
921
  //clean filename and extract extension
922
  $filepart = flagGallery::fileinfo( $imagefiles['name'][$key] );
923
+ $filename = sanitize_title($filepart['filename']) . '.' . $filepart['extension'];
924
 
925
  // check for allowed extension and if it's an image file
926
  $ext = array('jpg', 'jpeg', 'png', 'gif');
1009
  $temp_file = $_FILES["file"]['tmp_name'];
1010
 
1011
  $filepart = flagGallery::fileinfo( $_FILES['file']['name'] );
1012
+ $filename = sanitize_title($filepart['filename']) . '.' . $filepart['extension'];
1013
 
1014
  // check for allowed extension
1015
  $ext = array('jpeg', 'jpg', 'png', 'gif');
admin/js/flagallery-block.js ADDED
@@ -0,0 +1,211 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ (function(blocks, element) {
2
+ var el = element.createElement,
3
+ source = blocks.source;
4
+
5
+ function Flagallery(atts) {
6
+ var tagtext;
7
+ var scid;
8
+ var id = atts.id;
9
+ var type = atts.type;
10
+ var galleryname = atts.galleryname || '';
11
+ var skin = atts.skin || '';
12
+ var skinalign = atts.align || '';
13
+ var gallerywidth = atts.width || '';
14
+
15
+ var skinname = '';
16
+ var gallerysize = '';
17
+ if('gallery' == type) {
18
+ scid = ' gid=' + id;
19
+ }
20
+ else {
21
+ scid = ' album=' + id;
22
+ }
23
+ if(galleryname && galleryname.indexOf(' ') >= 0) {
24
+ galleryname = '\'' + galleryname + '\'';
25
+ }
26
+ if(galleryname) {
27
+ galleryname = ' name=' + galleryname;
28
+ }
29
+ if(gallerywidth) {
30
+ gallerysize = ' w=' + gallerywidth;
31
+ }
32
+ else {
33
+ gallerysize = '';
34
+ }
35
+
36
+ if(skin) {
37
+ skinname = ' skin=' + skin;
38
+ }
39
+ else {
40
+ skinname = '';
41
+ skin = flagallery_data.default_skin;
42
+ }
43
+ if(skinalign) {
44
+ skinalign = ' align=' + skinalign;
45
+ }
46
+ else {
47
+ skinalign = '';
48
+ }
49
+
50
+ tagtext = '[flagallery' + scid + galleryname + gallerysize + skinname + skinalign + ']';
51
+
52
+ return el('div', {className: 'flagallery-shortcode'}, tagtext);
53
+ }
54
+
55
+ blocks.registerBlockType('flagallery/gallery', {
56
+ title: 'Flagallery Gallery',
57
+ icon: 'format-gallery',
58
+ category: 'common',
59
+ attributes: {
60
+ galleryname: {
61
+ type: 'string',
62
+ },
63
+ id: {
64
+ type: 'string',
65
+ },
66
+ type: {
67
+ type: 'string',
68
+ },
69
+ skin: {
70
+ type: 'string',
71
+ },
72
+ align: {
73
+ type: 'string',
74
+ },
75
+ width: {
76
+ type: 'string',
77
+ },
78
+ },
79
+
80
+ edit: function(props) {
81
+ console.log(flagallery_data);
82
+ console.log(props);
83
+ var galleryname = props.attributes.galleryname;
84
+ var id = props.attributes.id;
85
+ var skin = props.attributes.skin;
86
+ var align = props.attributes.align;
87
+ var width = props.attributes.width;
88
+ var elclass = '';
89
+ var children = [];
90
+ var options = [];
91
+ var galleries = [];
92
+ var albums = [];
93
+
94
+ function setGallery(event) {
95
+ var form = $(event.target).closest('form.flagallery-preview');
96
+ var id = form.find('.flagallery-id').val();
97
+ var type = form.find('.flagallery-id option:checked').closest('optgroup').attr('type');
98
+ var galleryname = form.find('.flagallery-name').val();
99
+ if('album' == type && !galleryname) {
100
+ var key = parseInt(id, 10);
101
+ galleryname = flagallery_data.albums[key].name;
102
+ }
103
+ props.setAttributes({
104
+ id: id,
105
+ type: type,
106
+ skin: form.find('.flagallery-skin').val(),
107
+ align: form.find('.flagallery-align').val(),
108
+ galleryname: galleryname,
109
+ width: form.find('.flagallery-width').val(),
110
+ });
111
+ event.preventDefault();
112
+ }
113
+
114
+ // Choose galleries
115
+ options.push(
116
+ el('option', {value: ''}, '- Select your album / gallery -'),
117
+ );
118
+ Object.keys(flagallery_data.albums).forEach(function(key) {
119
+ albums.push(
120
+ el('option', {value: flagallery_data.albums[key].id}, flagallery_data.albums[key].name),
121
+ );
122
+ });
123
+ galleries.push(
124
+ el('option', {value: 'all'}, 'Show All Galleries'),
125
+ );
126
+ Object.keys(flagallery_data.galleries).forEach(function(key) {
127
+ galleries.push(
128
+ el('option', {value: flagallery_data.galleries[key].gid}, flagallery_data.galleries[key].name),
129
+ );
130
+ });
131
+ options.push(
132
+ el('optgroup', {label: 'Albums', type: 'album'}, null, albums),
133
+ );
134
+ options.push(
135
+ el('optgroup', {label: 'Galleries', type: 'gallery'}, null, galleries),
136
+ );
137
+ if(id) {
138
+ elclass = 'flagallery-id';
139
+ }
140
+ else {
141
+ elclass = 'flagallery-id flagallery-required';
142
+ }
143
+ children.push(
144
+ el('select', {className: elclass, value: id, onChange: setGallery}, options),
145
+ );
146
+
147
+ // skin
148
+ options = [];
149
+ options.push(
150
+ el('option', {value: ''}, 'Skin active by default'),
151
+ );
152
+ Object.keys(flagallery_data.skins).forEach(function(key) {
153
+ options.push(
154
+ el('option', {value: flagallery_data.skins[key].id}, flagallery_data.skins[key].name),
155
+ );
156
+ });
157
+ children.push(
158
+ el('select', {className: 'flagallery-skin', value: skin, onChange: setGallery}, options),
159
+ );
160
+
161
+ // skin align
162
+ options = [];
163
+ var skin_align = [
164
+ {'value': '', 'name': 'align none'},
165
+ {'value': 'left', 'name': 'align left'},
166
+ {'value': 'center', 'name': 'align center'},
167
+ {'value': 'right', 'name': 'align right'},
168
+ ];
169
+ skin_align.forEach(function(data) {
170
+ options.push(
171
+ el('option', {value: data.value}, data.name),
172
+ );
173
+ });
174
+ children.push(
175
+ el('select', {className: 'flagallery-align', value: align, onChange: setGallery}, options),
176
+ );
177
+
178
+ children.push(
179
+ el('input', {className: 'flagallery-name', value: galleryname, placeholder: 'Gallery Title (optional)', type: 'text', onChange: setGallery}),
180
+ );
181
+
182
+ children.push(
183
+ el('input', {className: 'flagallery-width', value: width, placeholder: 'Gallery Width (optional)', type: 'text', onChange: setGallery}),
184
+ );
185
+
186
+ if(!skin) {
187
+ skin = flagallery_data.default_skin;
188
+ }
189
+ children.push(
190
+ el('img', {className: 'flagallery-skin-screenshot', src: flagallery_data.skins[skin].screenshot}),
191
+ );
192
+
193
+ if(id) {
194
+ children.push(Flagallery(props.attributes));
195
+ }
196
+
197
+ return el('form', {className: 'flagallery-preview', onSubmit: setGallery}, children);
198
+ },
199
+
200
+ save: function(props) {
201
+ if(typeof props.attributes.id == 'undefined') {
202
+ return;
203
+ }
204
+ return Flagallery(props.attributes);
205
+ }
206
+ ,
207
+ });
208
+ })(
209
+ window.wp.blocks,
210
+ window.wp.element,
211
+ );
flag.php CHANGED
@@ -3,7 +3,7 @@
3
  Plugin Name: GRAND FlaGallery
4
  Plugin URI: https://mypgc.co/
5
  Description: The Grand Flagallery plugin - provides a comprehensive interface for managing photos and images through a set of admin pages, and it displays photos in a way that makes your web site look very professional.
6
- Version: 5.2.6
7
  Author: Rattus
8
  Author URI: https://codeasily.com/
9
  Text Domain: flash-album-gallery
@@ -24,7 +24,7 @@ if(preg_match('#' . basename(__FILE__) . '#', $_SERVER['PHP_SELF'])) { die('You
24
  if (!class_exists('flagLoad')) {
25
  class flagLoad {
26
 
27
- var $version = '5.2.6';
28
  var $dbversion = '5.0';
29
  var $minium_WP = '3.7';
30
  var $minium_WPMU = '3.7';
3
  Plugin Name: GRAND FlaGallery
4
  Plugin URI: https://mypgc.co/
5
  Description: The Grand Flagallery plugin - provides a comprehensive interface for managing photos and images through a set of admin pages, and it displays photos in a way that makes your web site look very professional.
6
+ Version: 5.3.0
7
  Author: Rattus
8
  Author URI: https://codeasily.com/
9
  Text Domain: flash-album-gallery
24
  if (!class_exists('flagLoad')) {
25
  class flagLoad {
26
 
27
+ var $version = '5.3.0';
28
  var $dbversion = '5.0';
29
  var $minium_WP = '3.7';
30
  var $minium_WPMU = '3.7';
full_window_template.php CHANGED
@@ -3,12 +3,13 @@ require_once( dirname(__FILE__) . '/flag-config.php');
3
  global $post;
4
  $flag_custom = get_post_custom($post->ID);
5
  $scode = $flag_custom["mb_scode"][0];
6
- ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
7
- <html xmlns="http://www.w3.org/1999/xhtml" <?php language_attributes(); ?>>
8
- <head profile="http://gmpg.org/xfn/11">
9
- <meta http-equiv="Content-Type" content="<?php bloginfo('html_type'); ?>; charset=<?php bloginfo('charset'); ?>" />
10
- <title><?php $title = wp_title('', false, 'left');
11
- echo strip_tags($title); echo ' - ' . get_bloginfo('name') ?></title>
 
12
  <style type="text/css">
13
  html, body { margin: 0; padding: 0; height:100%; }
14
  <?php if(isset($flag_custom['mb_bg_link'][0]) && !empty($flag_custom['mb_bg_link'][0])) {
3
  global $post;
4
  $flag_custom = get_post_custom($post->ID);
5
  $scode = $flag_custom["mb_scode"][0];
6
+ ?><!DOCTYPE html>
7
+ <html <?php language_attributes(); ?>>
8
+ <head>
9
+ <meta charset="<?php bloginfo( 'charset' ); ?>">
10
+ <meta name="viewport" content="width=device-width, initial-scale=1">
11
+ <link rel="profile" href="http://gmpg.org/xfn/11">
12
+ <title><?php $title = wp_title('', false, 'left'); echo strip_tags($title); echo ' - ' . get_bloginfo('name') ?></title>
13
  <style type="text/css">
14
  html, body { margin: 0; padding: 0; height:100%; }
15
  <?php if(isset($flag_custom['mb_bg_link'][0]) && !empty($flag_custom['mb_bg_link'][0])) {
lib/core.php CHANGED
@@ -256,7 +256,7 @@ class flagGallery {
256
  $name = sanitize_flagname($name);
257
 
258
  //get the parts of the name
259
- $filepart = pathinfo ( strtolower($name) );
260
 
261
  if ( empty($filepart) )
262
  return false;
@@ -271,7 +271,7 @@ class flagGallery {
271
  $filepart['filename'] = str_replace(array(' ',':'), array('_',''), current_time('mysql'));
272
 
273
  //extension jpeg will not be recognized by the slideshow, so we rename it
274
- $filepart['extension'] = (empty($filepart['extension']) || $filepart['extension'] == 'jpeg') ? 'jpg' : strtolower($filepart['extension']);
275
 
276
  //combine the new file name
277
  $filepart['basename'] = $filepart['filename'] . '.' . $filepart['extension'];
256
  $name = sanitize_flagname($name);
257
 
258
  //get the parts of the name
259
+ $filepart = pathinfo ($name);
260
 
261
  if ( empty($filepart) )
262
  return false;
271
  $filepart['filename'] = str_replace(array(' ',':'), array('_',''), current_time('mysql'));
272
 
273
  //extension jpeg will not be recognized by the slideshow, so we rename it
274
+ $filepart['extension'] = (empty($filepart['extension']) || $filepart['extension'] == 'jpeg') ? 'jpg' : $filepart['extension'];
275
 
276
  //combine the new file name
277
  $filepart['basename'] = $filepart['filename'] . '.' . $filepart['extension'];
lib/skinobject.php CHANGED
@@ -85,16 +85,23 @@ function flagShowFlashAlbum($galleryID, $name='', $width='', $skin='', $linkto='
85
  $gallery['galdesc'] = htmlspecialchars_decode($gallery['galdesc']);
86
  $gallery['path'] = site_url($gallery['path']);
87
 
 
88
  foreach($pictures as $i => $pic){
89
  $pictures[$i]['alttext'] = stripslashes($pic['alttext']);
90
  $pictures[$i]['description'] = stripslashes($pic['description']);
91
  $pictures[$i]['meta_data'] = (array) maybe_unserialize($pic['meta_data']);
92
  unset($pictures[$i]['meta_data']['0']);
93
- if(!isset($pictures[$i]['meta_data']['webview'])){
94
- $pictures[$i]['meta_data']['webview'] = flagAdmin::webview_image($pic['pid'], true);
 
 
95
  }
96
  }
97
 
 
 
 
 
98
  $data[] = array(
99
  'gallery' => $gallery,
100
  'data' => $pictures
85
  $gallery['galdesc'] = htmlspecialchars_decode($gallery['galdesc']);
86
  $gallery['path'] = site_url($gallery['path']);
87
 
88
+ $broken_images = false;
89
  foreach($pictures as $i => $pic){
90
  $pictures[$i]['alttext'] = stripslashes($pic['alttext']);
91
  $pictures[$i]['description'] = stripslashes($pic['description']);
92
  $pictures[$i]['meta_data'] = (array) maybe_unserialize($pic['meta_data']);
93
  unset($pictures[$i]['meta_data']['0']);
94
+ if(empty($pictures[$i]['meta_data']['webview'])){
95
+ //$pictures[$i]['meta_data']['webview'] = flagAdmin::webview_image($pic['pid'], true);
96
+ unset($pictures[$i]);
97
+ $broken_images = true;
98
  }
99
  }
100
 
101
+ if($broken_images){
102
+ $pictures = array_values($pictures);
103
+ }
104
+
105
  $data[] = array(
106
  'gallery' => $gallery,
107
  'data' => $pictures
readme.txt CHANGED
@@ -56,10 +56,22 @@ See "Views" of each photo in the gallery and allow visitors to "Like" photos.
56
  * iPhone, iPad, Android and Desktop friendly photo gallery, SEO optimized.
57
  * Full-screen mobile friendly gallery slideshow with touch controls.
58
  * Widgets, Music, Video
 
59
 
 
60
 
61
  == Changelog ==
62
 
 
 
 
 
 
 
 
 
 
 
63
  = v5.2.6 - 03.09.2018 =
64
  * Fixed GRANDPage Back button
65
 
56
  * iPhone, iPad, Android and Desktop friendly photo gallery, SEO optimized.
57
  * Full-screen mobile friendly gallery slideshow with touch controls.
58
  * Widgets, Music, Video
59
+ * **Gutenberg ready!**
60
 
61
+ Designed to work for WordPress 5 (Gutenberg Block) and also the standard Gallery Shortcode.
62
 
63
  == Changelog ==
64
 
65
+ = v5.3.0 - 20.11.2018 =
66
+ * Added Flagallery Gutenberg block (Gutenberg ready)
67
+
68
+ = v5.2.8 - 22.10.2018 =
69
+ * Fixed GRAND Page mobile friendly
70
+ * Fixed Gallery not show if there was not web optimized images
71
+
72
+ = v5.2.7 - 07.09.2018 =
73
+ * Fixed issue with uppercase file extention
74
+
75
  = v5.2.6 - 03.09.2018 =
76
  * Fixed GRANDPage Back button
77